
ستون حاوية على خادم واحد
صندوق معادن عارية واحد يشغل عشرات إلى مئات حاويات Hoody. يجعل KSM و BTRFS dedup التكلفة الإضافية قريبة من الصفر.
وجِّه webhook الإنتاج الحقيقيّ لـ Stripe إلى رابط hoody-files لمدّة ثلاثين دقيقة. المجلّد الآن يحوي أربعة عشر ملفّ JSON — كلّ حمولة وصلت إلى الإنتاج، بايت بايت. مدخل cron واحد يشغّل سكربت exec يُرسل POST بهذه الحمولات إلى staging في الساعة 9 صباحاً، من الإثنين إلى الجمعة. الجدول ينتهي يوم السبت القادم ويحذف نفسه.
{ "id": "evt_3OHk8ZJs2k9aXq1vQ", "type": "payment_intent.succeeded", "created": 1714723522, "data": { "object": { "id": "pi_3OHk8ZJs2k9aXq1v0K7rT4mB", "amount": 4900, "currency": "usd", "status": "succeeded" } } }
ملتقَطة بـ webhook الحقيقيّ · مُعاد تشغيلها بمدخل cron واحد
التدفّق كلّه ثلاثة روابط. حركة الإنتاج تصل على رابط الالتقاط. الملفّات تهبط في hoody-files. cron يمرّ على المجلّد ويُرسل POST بالحمولات إلى staging. لا وسيط، لا قائمة انتظار، لا خدمة إعادة تشغيل — مجرّد مجلّد وجدول.
اضبط رابط webhook الخاصّ بـ Stripe / Intercom / GitHub على مسار hoody-files. كل حدث يصل كـ PUT ويهبط كملفّ JSON مُسمّى بطابعه الزمنيّ. المجلّد هو التسجيل.
الملفّات تبقى على القرص؛ كل ملفّ له رابطه الخاصّ. تصفّح المجلّد في متصفّح، اعرضه عبر الـ API، أو ادخل إليه بـ curl. التسجيل حقيقة يمكنك cat أو scp أو وضعها في إصدار.
أرسل POST بمدخل cron مُدار بجدول 0 9 * * 1-5 وأمر bash /scripts/replay.sh /webhooks/2026-05-03. السكربت يُعدّد المجلّد ويُرسل POST بكل ملفّ إلى staging بترتيب الطوابع الزمنيّة.
الالتقاط والإعادة هما البروتوكول نفسه في يومين مختلفين. الشيء الذي سجّل البايتات هو الشيء الذي يُعيد تشغيلها. لا محلّل JSONL، لا sidecar، لا صيغة تسجيل عليك تعلّمها — ملفّات في مجلّد بترتيب زمنيّ.
الالتقاط هو PUT واحد لكل حدث webhook. الإعادة هي POST واحد إلى Cron API. Hoody Files تحفظ التسجيل؛ Hoody Cron يمرّ عليه وفق الجدول؛ hoody-exec يشغّل سكربت bash الذي يُجري POSTات. ثلاث خدمات بلا غراء بينها.
# point your real webhook at hoody-files curl -X PUT \ https://files.containers.hoody.com/webhooks/2026-05-03/stripe-08-15-22.json \ --data-binary @- # 30 minutes later, the directory holds 14 files HTTP/1.1 201 Created webhooks/2026-05-03/stripe-08-15-22.json
# one cron entry replays the morning at 9am, mon-fri curl -X POST \ https://cron.containers.hoody.com/api/v1/cron/users/me/entries \ -d '["schedule":"0 9 * * 1-5","command":"bash /scripts/replay.sh /webhooks/2026-05-03","expires_at":"2026-05-10T09:00:00Z"]' HTTP/1.1 201 Created { "id":"f0a8", "schedule":"0 9 * * 1-5", "expires_at":"2026-05-10T09:00:00Z" }
جانب الالتقاط يعمل مرّة واحدة صباح الجمعة. جانب الإعادة يعمل كل يوم من أيام الأسبوع حتى السبت القادم، حين يحذف حقل expires_at الجدول. كتبتَ رابط PUT واحداً في إعدادات webhook، وPOST واحداً في Cron API — هذا هو اختبار الحمل بأكمله.
الحركة الاصطناعيّة هي ما تخيّلتَ أن الطلب يبدو كذلك. الحركة الملتقطة هي ما وصل فعلاً. أسماء الحقول نفسها، الحالات الحدّيّة نفسها، المفاجآت نفسها.
التسجيل يلتقط JSON الذي أرسله Stripe بدقّة — بما في ذلك كل حقل قابل للقيمة الفارغة، وكل نوع حدث غير متوقَّع، وكل تنسيق customer_id نسيتَه. مُعالِجك يلتقي بالحمولات نفسها التي فشل عليها بالأمس.
تعبير cron 0 9 * * 1-5 يُنزل الإعادة في الساعة التي يستخدم فيها مستخدموك الحقيقيّون النظام فعلاً. المُعالِج تحت الاختبار يرى ازدحام الصباح أمام ذاكرات التخزين المؤقّت ذاتها وجيران cron ذاتهم وقاعدة البيانات الصاخبة ذاتها.
المجلّد غير قابل للتغيير؛ cron يعمل كل يوم من أيام الأسبوع حتى expires_at. إن ظلّ المُعالِج يكسر في تشغيل الثلاثاء، تُصلحه وتدع تشغيل الأربعاء يُثبت ذلك. المدخل ذاته في كل مرّة — المُعالِج هو الشيء الوحيد الذي يتغيّر.
الأرقام تأتي من واجهة Hoody Cron للمداخل المُدارة ومن مواصفات تعبير cron القياسيّ — لا من اختبارات أداء مُختلَقة.
تعبير cron معياريّ من 5 حقول — الدقيقة، الساعة، يوم الشهر، الشهر، يوم الأسبوع. الصيغة ذاتها التي استخدمتها في 1985 ما زالت تجدول الإعادة في 2026.
GET /users/[user]/entries يُرقّم حتى 200 مدخل مُدار في كل مرّة. ثلاث وستّون جدول إعادة لكل بيئة في الميزانية بسهولة.
أنشئ الإعادة المتكرّرة بـ POST واحد إلى /users/me/entries — جدول، أمر، expires_at. PATCH لاحقاً لكتمها؛ DELETE لإزالتها؛ expires_at يُزيلها عنك.
حدود وفق واجهة Hoody Cron Managed Entries: تعبيرات cron معياريّة من 5 حقول إضافةً إلى ماكروات @daily / @hourly، ترقيم حتى 200 مدخل لكل صفحة، expires_at اختياريّ ويُعطّل المدخل تلقائياً بعد الموعد.
حركة إنتاج، مُسجَّلة مرّة، مُعاد تشغيلها وفق جدول.
الأدوات المعتادة لإعادة تشغيل حركة webhook — مُسجِّلات، خدمات إعادة، محاكيات مجدولة. كلّ منها SaaS أو sidecar أو سكربت ترعاه. ثنائيّ hoody-files + hoody-cron ليس أيّاً من هذه.
التقط حركة الجمعة. اجدول إعادة الأسبوع القادم. دع مدخل cron ينتهي بنفسه حين تنتهي التجربة.