
ستون حاوية على خادم واحد
صندوق معادن عارية واحد يشغل عشرات إلى مئات حاويات Hoody. يجعل KSM و BTRFS dedup التكلفة الإضافية قريبة من الصفر.
سطر cron تقليدي يُشغّل reconcile.sh في الـ 2 صباحاً. سطر cron في Hoody يرسل POST بموجّه إلى hoody-agent. الجدول ثابت. العمل ليس كذلك. الحالات الحدّية تتوقف عن أن تكون فروعاً تصونها — تصبح سياقاً يستدلّ عليه العامل.
خمسة صباحات · خمسة قرارات مختلفة · سطر crontab واحد
Hoody Cron هو crontab مُدار على كل حاوية. Hoody Agent هو عامل مستقل مدمج على نفس الحاوية. إدخال cron يستدعي العامل عبر curl. العامل يقرأ التاريخ، يقرأ البيانات، ويقرّر ما يتطلّبه اليوم. كلا السطحين HTTP — cron يعيش في /api/v1/cron/users/me/entries، والعامل في /api/v1/agent/tasks. لا كود غراء بينهما.
# POST /api/v1/cron/users/me/entries { "schedule": "0 7 * * *", "command": "curl -X POST $AGENT/api/v1/agent/tasks \ -d @prompt.json", "comment": "morning-reports" }
# prompt.json — the body of the POST { "description": "وفّق طلبات الأمس. أعِد التعيين إذا انحرف schema. توقّف ونبّه المناوب إذا كانت درجة الشذوذ > 3. إذا كان اليوم آخر يوم من الشهر، أدرج إغلاق الشهر على دفتر الأستاذ المُعدَّل ضريبياً.", "mode": "code" }
POSTان وأنت انتهيت. سطر crontab لا يتغيّر مرة أخرى — الملف الوحيد الذي تصونه هو الموجّه. حالة حدّية جديدة؟ أضف جملة. قاعدة شذوذ جديدة؟ أضف جملة. الجدول يستمر في الانطلاق؛ العامل يكتشف ما يعنيه كل انطلاق.
شكل العمل الذي يتلقّاه العامل دائماً نفسه — تاريخ، مجموعة بيانات، هدف. ما يتغيّر هو ما يقرّر العامل فعله بشأنها.
العامل يعمل بعد انطلاق cron. يفحص التقويم — نهاية الشهر، عطلة، إغلاق سنة مالية. يأخذ عيّنة من مجموعة البيانات — schema، حجم، درجة شذوذ. يختار الإجراء التالي بهذا السياق، لا من شجرة if ثابتة كتبتها قبل ستة أشهر.
عندما تضيف صادرات الأمس عمود refund_reason، يكسر السكربت ويُنبّهك. العامل يقرأ الـ schema، يطابقه على الحقل القديم، ويذكر التغيير في ملخص التشغيل. سطر crontab لم يكن مضطراً للمعرفة.
كل تشغيل يُعيد نشر ما قرّره العامل ولماذا. السجل بإنجليزية واضحة — "تخطّى: لا بيانات جديدة"، "تكيّف: أُضيف عمود refund"، "شذوذ: ارتفاع refund بنسبة 412%، نُبّه المناوب" — لا رمز خروج 0 / رمز خروج 1. سجلات cron تصبح يوميات.
ثلاث خطوات — cron ينطلق، العامل يستدلّ، القرار يهبط. الخطوة الوسطى هي التي اعتدت كتابتها بنفسك في 400 سطر من سكربت shell بسبعة عشر فرعاً للحالات الحدّية. الآن هي موجّه.
Hoody Cron يُشغّل الإدخال. سطر crontab هو curl واحد: POST /api/v1/agent/tasks مع جسم الموجّه. لا إعادة محاولات تكتبها بنفسك، ولا أنابيب تسجيل — خدمة cron تحقن الإدخال في crontab النظام وتتتبع التشغيل.
العامل يستلم الوصف، يفتح أدواته — terminal، files، sqlite، browser، exec — ويختار خطة عمل. قد يُشغّل، يتخطى، يتكيّف، أو يُنبّه. الاختيارات تتغير يومياً. التعليمات لا.
التشغيل ينتهي. العامل يُعيد نشر سطر ملخّص: تقارير مُعاد توليدها، تخطّى لعدم وجود بيانات جديدة، توقّف على شذوذ. تقرأه على هاتفك مع الإفطار.
الجدول لم يتغيّر. السكربت لم يتغيّر. ما تغيّر هو ما إذا كان عليك، أنت البشري، الاستيقاظ للتعامل معه. مع العامل في الحلقة، الإجابة تقريباً دائماً لا — وسجل التشغيل يخبرك لماذا.
Hoody Cron و Hoody Agent خدمتان على نفس الحاوية، كلتاهما متاحتان كـ HTTP. الأرقام تأتي من الأسطح الموثّقة — لا من معايير مُختلَقة.
curl واحد في crontab، للأبد. جسم الموجّه هو الشيء الوحيد الذي تعيد كتابته — وتفعل ذلك في ملف JSON، لا بتشغيل crontab -e.
hoody-agent يكشف السطح بالكامل — terminal exec، قراءة/كتابة الملفات، استعلام sqlite، أتمتة المتصفح، تحكم daemon — لمهمة العامل كاستدعاءات HTTP بسيطة.
لا SDK بين cron والعامل. أرسل POST لعنوان URL، اقرأ آخر. كلتا الخدمتين تعيشان على نفس الحاوية، فالاستدعاء سريع بسرعة الشبكة المحلية.
Hoody Cron يدعم التعابير القياسية ذات الخمسة حقول (* * * * *) والماكروهات (@hourly, @daily, @weekly, @monthly, @yearly). إنشاء مهمة Hoody Agent هو POST /api/v1/agent/tasks واحد؛ التحديثات الحية تتدفق عبر /api/v1/agent/ws.
إدخال cron لا يُشغّل المهمة — يطلب من عامل أن يكتشف المهمة.
مجموعة الأشياء التي اعتدت كتابتها داخل reconcile.sh لأن cron كان يعرف فقط كيفية تشغيل الملفات. كل واحدة فرع، علم، إعداد — لا شيء منها يحتاج الجدول لمعرفته فعلاً. العامل يقرأ اليوم ويقرّر.
توقّف عن صيانة سكربتات cron. ابدأ صيانة موجّهات. الجدول ينطلق؛ العامل يكتشف.