انتقل إلى المحتوى
use-cases / ci-cache-without-s3 / hero
ملفات · ذاكرة تخزين · تحسين التكلفة

ذاكرة تخزين CI ليست بندًا في فاتورة S3

معظم خطوط أنابيب CI تحرق المال على حركة مرور الذاكرة المؤقتة — تدفع المخرجات إلى S3، تسحبها مرة أخرى للمهمة التالية، تدفع مقابل التخزين، تدفع مقابل الخروج، تدفع مرة أخرى عند تبديل العمّال للمنطقة. على Hoody، الذاكرة المؤقتة هي مجلد على نفس الخادم الفعلي الذي يشغّل حاوية البناء. ادفع ملف tar بـ curl. اسحبه بـ curl. البايتات لا تغادر الجهاز.

اقرأ واجهة الملفات
use-cases / ci-cache-without-s3 / mechanism

ثلاث curl ووظيفة cron

ذاكرة CI المؤقتة كاملة هي ثلاثة أوامر ووظيفة تنظيف واحدة. PUT لكتابة ملف tar. GET لقراءته. find -atime للتشذيب. لا توجد قطعة رابعة — لا سياسة IAM، ولا دورة حياة حاوية، ولا طقوس URL موقّع.

كتابة

اضغط و PUT

بعد التثبيت، يبثّ المُشغّل node_modules عبر tar | zstd إلى PUT واحد على /files/cache. Hoody يكتب الجسم إلى القرص ككتلة ثنائية واحدة. لا multipart، ولا رافع أجزاء، ولا SDK.

# بعد yarn install، ادفع المخرَجtar c node_modules | zstd -T0 | curl -T - https://files.containers.hoody.com/cache/$KEY.tar.zst
قراءة

GET وفك tar

أول خطوة في المهمة التالية هي curl واحد. الجسم يخرج من NVMe بسرعة الخط لأن الذاكرة المؤقتة تعيش على نفس الجهاز الفعلي مثل المُشغّل — لا قفزة خروج، ولا سحب عبر AZ، ولا حافة CloudFront.

# المهمة التالية: اسحب وفك tar في سطر واحدcurl -fsS https://files.containers.hoody.com/cache/$KEY.tar.zst | tar x -I zstd
تشذيب

find -atime · ليلي

Hoody Cron ينطلق مرة في الليلة. find /files/cache -atime +30 -delete يطرح أي شيء لم تقرأه أي مهمة في شهر. لا سياسة احتفاظ، ولا طبقة Glacier، ولا JSON دورة حياة لصيانته.

# cron ليلي — أي شيء غير مقروء في 30 يومًا يذهبfind /files/cache -atime +30 -delete

PUT يكتب. GET يقرأ. find يشذّب. واجهة Hoody Files هي خادم الذاكرة المؤقتة، ومحرك التنظيف، وسجل التدقيق — كلها خلف نفس عنوان /files/[path].

use-cases / ci-cache-without-s3 / powers

ثلاث قدرات للذاكرة المؤقتة كمجلد

دفع الذاكرة المؤقتة إلى مزوّد منفصل كان منطقيًا حين كان التخزين شحيحًا. على حاوية فعلية، يضيف فقط مزوّدًا.

الاقتصاد

لا GB-month، لا خروج، لا طلبات

S3 يفرض ثلاثة عدّادات: التخزين، الخروج، والطلب. Hoody Files مضمّن مع الحاوية — القرص الذي تدفع ثمنه أصلًا هو القرص الذي تجلس عليه الذاكرة المؤقتة. البايتات لا تعبر حدود الفوترة.

زمن الاستجابة

NVMe بدلًا من عبور المناطق

القراءات تخرج من نفس الجهاز الفعلي الذي يشغّل البناء. لا نقطة S3 لحلّها، ولا مصافحة TLS لمنطقة، ولا حد معدل على إنتاجية البادئة. هدف Rust بحجم 1.4 GB يُفك في ثوانٍ.

الملكية

علاقة مزوّد واحدة، لا اثنتان

المُشغّل لديك والذاكرة المؤقتة يعيشان على نفس النسخة، يُحاسبان على نفس الفاتورة، يُصحَّحان بنفس جلسة SSH. حين توقف الحاوية، الذاكرة المؤقتة هي صورة القرص — تعود مباشرة لحظة إقلاعها.

use-cases / ci-cache-without-s3 / invoice

ما يتبخّر من الفاتورة

بصمة CI متوسطة الحجم نموذجية تنقل حوالي 1.4 TB من حركة الذاكرة المؤقتة شهريًا. هنا البند الذي تبنيه على AWS، والبند الذي تبنيه على Hoody.

قبل · فاتورة S3هذا الشهر، على AWS
  • تخزين · GB-شهر$1.0947.2 GB × 0.023$
  • خروج · GB خارج$127.801.42 TB × 0.090$
  • طلبات PUT$2.06412k × 5$/M
  • طلبات GET$4.5611.4M × 0.40$/M
  • CloudFront / NAT−$57.71سحب عبر AZ
الإجمالي الشهري$78
خمسة بنود · خمسة أسعار · حاوية واحدة
بعد · HOODY FILESهذا الشهر، على Hoody
  • قرص على الحاويةno extra chargeمدفوع أصلًا في خطة الحاوية
  • الخروج بين المهامno extra chargeحلقة محلية · يبقى على الجهاز
  • طلبات PUT / GETno per-request or per-GB meterلا عدّاد لكل طلب
  • علاقة المزوّدno extra chargeالمُشغّل والذاكرة المؤقتة فاتورة واحدة
  • 47.2 GB مستخدمةمن الخطةمساحة من نفس القرص الذي يشغّل الحاوية
الإجمالي الشهريincluded in server price
قرص واحد · فاتورة واحدة · صفر مزوّد جديد

حين تعيش الذاكرة المؤقتة على الجهاز الذي يشغّل البناء، فإن العدّاد الذي كان S3 يديره ليس لديه ما يقرأه. البند لا يتحرك لأنه لا توجد معاملة لمحاسبتها.

use-cases / ci-cache-without-s3 / capacity

ما تضمنه نقطة Files

Hoody Files ليس غلافًا رفيعًا — هو خلفية ثابتة حقيقية مع تجزئة، تاريخ، قراءات نطاقية، وسجل تدقيق. ذاكرة CI المؤقتة تستخدم شريحة رفيعة مما هو مكشوف فعليًا.

  1. عنوان واحد · أي مخرَج/files/[path]

    PUT للكتابة، GET للقراءة، HEAD لـ ETag و Content-Length، ?hash لـ SHA256، ?stat للبيانات الوصفية. الذاكرة المؤقتة هي نفس عائلة النقاط التي تشغّل السجلات والبناءات والمخرَجات المشتركة.

  2. قراءات السفر عبر الزمن?at · ?revision

    كل كتابة تمر عبر سجل الملفات. اسحب ذاكرة الأمس المؤقتة بالطابع الزمني أو برقم المراجعة لكل مسار — تصحيح اختبار متقطع يتوقف عن المتطلب أداة لقطة منفصلة.

  3. ركّب حين تتجاوزه60+ خلفيات

    إذا احتاجت الذاكرة المؤقتة فعلًا أن تعيش في S3 أو B2 أو مجلد Drive، ركّبها كخلفية وأبقِ نفس عنوان /files/[path]. شيفرة المُشغّل لا تتغير أبدًا — الذاكرة المؤقتة ببساطة تنتقل.

الأرقام تعكس سطح واجهة Hoody Files المنشورة — `GET/PUT/HEAD/PATCH /api/v1/files/[path]`، معاملات الاستعلام `?hash`/`?stat`/`?at`/`?revision`/`?history`، ونقاط سجل الملفات تحت `/api/v1/journal`.

use-cases / ci-cache-without-s3 / punchline

ذاكرة CI المؤقتة لديك تتوقف عن أن تكون مزوّدًا منفصلًا. هي مجلد على الجهاز الذي تستأجره أصلًا.

الأمس · خمسة أسعاراليوم · قرص واحد
ما كان في الفاتورة القديمةحاوية S3 + خروج + طلبات + دورة حياةخمسة بنود · IAM منفصل · مزوّد منفصل
ما هو الآنPUT /files/cache/$KEY · GET /files/cache/$KEYاثنان من curl — والذاكرة المؤقتة هي قرص المُشغّل نفسه
اقرأ مواصفة الملفات
use-cases / ci-cache-without-s3 / replaces

ما يحلّ هذا محلّه

خلفيات الذاكرة المؤقتة القياسية التي تلجأ إليها كل واحدة تفرض عليك علاقة مزوّد، أو فاتورة خروج، أو رسومًا لكل بناء. /files لا يفرض أيًا منها.

  • AWS S3 حاوية كذاكرة مؤقتةتخزين، خروج، طلبات — ثلاثة عدّادات لملف tar تحتفظ به يومين
  • ذاكرة GitHub Actions المؤقتة10 GB مجانية، ثم رسوم لكل GB وإخلاء 7 أيام لا يمكنك ضبطه
  • ذاكرة BuildJet المؤقتةتسعير لكل مُشغّل لتخزين يعيش خارج المُشغّل على أي حال
  • خدمات ذاكرة Bazel البعيدةخفي ثانٍ كامل وبروتوكول ذاكرة مؤقتة لرعايتها
  • Turborepo Remote Cacheتسعير لكل بناء لملف tar أنتجه monorepo لديك أصلًا
  • Earthly Cloud cacheخلفية بعيدة مُدارة لما هو مجرد curl + tar
use-cases / ci-cache-without-s3 / cta

توقّف عن استئجار ذاكرة مؤقتة من سحابة ثانية. اكتب ملف tar إلى القرص الذي تدفع ثمنه أصلًا، واسحبه بـ curl.

اقرأ واجهة الملفات
use-cases / ci-cache-without-s3 / related

اقرأ الآخرين