
ستون حاوية على خادم واحد
صندوق معادن عارية واحد يشغل عشرات إلى مئات حاويات Hoody. يجعل KSM و BTRFS dedup التكلفة الإضافية قريبة من الصفر.
معظم خطوط أنابيب CI تحرق المال على حركة مرور الذاكرة المؤقتة — تدفع المخرجات إلى S3، تسحبها مرة أخرى للمهمة التالية، تدفع مقابل التخزين، تدفع مقابل الخروج، تدفع مرة أخرى عند تبديل العمّال للمنطقة. على Hoody، الذاكرة المؤقتة هي مجلد على نفس الخادم الفعلي الذي يشغّل حاوية البناء. ادفع ملف tar بـ curl. اسحبه بـ curl. البايتات لا تغادر الجهاز.
نفس 47.2 GB من الذاكرة المؤقتة · فاتورتان مختلفتان
ذاكرة CI المؤقتة كاملة هي ثلاثة أوامر ووظيفة تنظيف واحدة. PUT لكتابة ملف tar. GET لقراءته. find -atime للتشذيب. لا توجد قطعة رابعة — لا سياسة IAM، ولا دورة حياة حاوية، ولا طقوس URL موقّع.
بعد التثبيت، يبثّ المُشغّل node_modules عبر tar | zstd إلى PUT واحد على /files/cache. Hoody يكتب الجسم إلى القرص ككتلة ثنائية واحدة. لا multipart، ولا رافع أجزاء، ولا SDK.
أول خطوة في المهمة التالية هي curl واحد. الجسم يخرج من NVMe بسرعة الخط لأن الذاكرة المؤقتة تعيش على نفس الجهاز الفعلي مثل المُشغّل — لا قفزة خروج، ولا سحب عبر AZ، ولا حافة CloudFront.
Hoody Cron ينطلق مرة في الليلة. find /files/cache -atime +30 -delete يطرح أي شيء لم تقرأه أي مهمة في شهر. لا سياسة احتفاظ، ولا طبقة Glacier، ولا JSON دورة حياة لصيانته.
PUT يكتب. GET يقرأ. find يشذّب. واجهة Hoody Files هي خادم الذاكرة المؤقتة، ومحرك التنظيف، وسجل التدقيق — كلها خلف نفس عنوان /files/[path].
دفع الذاكرة المؤقتة إلى مزوّد منفصل كان منطقيًا حين كان التخزين شحيحًا. على حاوية فعلية، يضيف فقط مزوّدًا.
S3 يفرض ثلاثة عدّادات: التخزين، الخروج، والطلب. Hoody Files مضمّن مع الحاوية — القرص الذي تدفع ثمنه أصلًا هو القرص الذي تجلس عليه الذاكرة المؤقتة. البايتات لا تعبر حدود الفوترة.
القراءات تخرج من نفس الجهاز الفعلي الذي يشغّل البناء. لا نقطة S3 لحلّها، ولا مصافحة TLS لمنطقة، ولا حد معدل على إنتاجية البادئة. هدف Rust بحجم 1.4 GB يُفك في ثوانٍ.
المُشغّل لديك والذاكرة المؤقتة يعيشان على نفس النسخة، يُحاسبان على نفس الفاتورة، يُصحَّحان بنفس جلسة SSH. حين توقف الحاوية، الذاكرة المؤقتة هي صورة القرص — تعود مباشرة لحظة إقلاعها.
بصمة CI متوسطة الحجم نموذجية تنقل حوالي 1.4 TB من حركة الذاكرة المؤقتة شهريًا. هنا البند الذي تبنيه على AWS، والبند الذي تبنيه على Hoody.
حين تعيش الذاكرة المؤقتة على الجهاز الذي يشغّل البناء، فإن العدّاد الذي كان S3 يديره ليس لديه ما يقرأه. البند لا يتحرك لأنه لا توجد معاملة لمحاسبتها.
Hoody Files ليس غلافًا رفيعًا — هو خلفية ثابتة حقيقية مع تجزئة، تاريخ، قراءات نطاقية، وسجل تدقيق. ذاكرة CI المؤقتة تستخدم شريحة رفيعة مما هو مكشوف فعليًا.
PUT للكتابة، GET للقراءة، HEAD لـ ETag و Content-Length، ?hash لـ SHA256، ?stat للبيانات الوصفية. الذاكرة المؤقتة هي نفس عائلة النقاط التي تشغّل السجلات والبناءات والمخرَجات المشتركة.
كل كتابة تمر عبر سجل الملفات. اسحب ذاكرة الأمس المؤقتة بالطابع الزمني أو برقم المراجعة لكل مسار — تصحيح اختبار متقطع يتوقف عن المتطلب أداة لقطة منفصلة.
إذا احتاجت الذاكرة المؤقتة فعلًا أن تعيش في S3 أو B2 أو مجلد Drive، ركّبها كخلفية وأبقِ نفس عنوان /files/[path]. شيفرة المُشغّل لا تتغير أبدًا — الذاكرة المؤقتة ببساطة تنتقل.
الأرقام تعكس سطح واجهة Hoody Files المنشورة — `GET/PUT/HEAD/PATCH /api/v1/files/[path]`، معاملات الاستعلام `?hash`/`?stat`/`?at`/`?revision`/`?history`، ونقاط سجل الملفات تحت `/api/v1/journal`.
ذاكرة CI المؤقتة لديك تتوقف عن أن تكون مزوّدًا منفصلًا. هي مجلد على الجهاز الذي تستأجره أصلًا.
خلفيات الذاكرة المؤقتة القياسية التي تلجأ إليها كل واحدة تفرض عليك علاقة مزوّد، أو فاتورة خروج، أو رسومًا لكل بناء. /files لا يفرض أيًا منها.
توقّف عن استئجار ذاكرة مؤقتة من سحابة ثانية. اكتب ملف tar إلى القرص الذي تدفع ثمنه أصلًا، واسحبه بـ curl.