4.2 · الموثوقية : فحص الصحة (healthcheck) وسياسات إعادة التشغيل (restart policies)

المستوى 4 · السجلات (registres)، والموثوقية (fiabilité) و CI

4.2الموثوقية : فحص الصحة (healthcheck) وسياسات إعادة التشغيل (restart policies)

الهدف: جعل خدمة قادرة على إعادة التشغيل وحدها والإشارة إلى حالتها الحقيقية.
الوقت المقدّر: 12 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • إعادة التشغيل (restart) تُحيي، وفحص الصحة (healthcheck) يُثبت : سياسة إعادة التشغيل تعيد تشغيل الحاوية بعد عطل أو إعادة إقلاع ؛ واختبار الصحة الدوري يقول إن كانت الخدمة جاهزة فعلا (وليست منطلقة فقط).
  • depends_on ترتب، وcondition: service_healthy تنتظر الجاهزية الحقيقية : دون شرط، ترتيب الإقلاع مجرد أمل — ومع فحص صحة على القاعدة، لا تنطلق الواجهة إلا على مثبت سلامته.
  • منعكس إدير : unless-stopped افتراضيا (يحترم الإيقافات الطوعية)، وUp ليست healthy : فخدمة Up لكن unhealthy مريضة تُعالَج، وليست خدمة تدور.

حالة مصغرة متواصلة — إدير ينهي أعطال صباح الاثنين

إدير، مهندس devops مبتدئ في الجزائر، يُوقَظ : بعد انقطاع كهرباء، الواجهة منطلقة لكن القاعدة لم تكن جاهزة — أعطال متسلسلة. فيضيف restart: unless-stopped لكل خدمة دائمة، وفحص صحة pg_isready على القاعدة، ويجعل الواجهة معتمدة على service_healthy. ثم يقتل القاعدة للتحقق : إعادة تشغيل تلقائية وانتظار مثبت. ثاني محطة في الخيط الرابط : المكدس يعيد الإقلاع وحده ولا يوجه إلا نحو مثبت سلامته.

تتمة حالة 4.1 — الصورة التي نشرها إدير تدور الآن باستقلالية.

1. إعادة التشغيل (restart) : سياسة الإحياء

restart: unless-stopped يعيد تشغيل الحاوية بعد عطل أو إعادة إقلاع الآلة، إلا الإيقاف الطوعي — الافتراضي الصحيح لخدمة دائمة. وalways يعيد التشغيل حتى بعد إيقاف يدوي (للخدمات الحرجة فقط)، وon-failure لا يعيد إلا عند خطأ. ودون سياسة، كما قبل إصلاح إدير، ينتظر عطل الليل الصباح.

اختاروا حسب القصد : دائمة (unless-stopped)، وحرجة يجب ألا تتوقف أبدا (always)، ومهمة لا تعود إلا عند الفشل (on-failure). وتفادوا always في كل مكان : فهو يعيد التشغيل حتى بعد إيقافاتكم الطوعية.

2. فحص الصحة (healthcheck) : « جاهز » خير من « منطلق »

depends_on ترتب، وفحص الصحة (healthcheck) يُثبت : أمر يُختبر دوريا (pg_isready لأجل Postgres، وطلب HTTP لأجل واجهة) يمرر الخدمة إلى healthy. ويمكن عندها انتظار الجاهزية الحقيقية (condition: service_healthy) بدلا من الأمل بأن القاعدة أنهت الإقلاع.

ويجب أن يستهدف الاختبار الخدمة الحقيقية (طلبا، وليس مجرد وجود العملية) : فهذا ما يُزيل أعطال الإقلاع « القاعدة غير جاهزة » لدى إدير.

3. ثلاث حالات، وثلاث ردود

starting (ننتظر)، وhealthy (نوجه)، وunhealthy (ننبه، ولا نرسل حركة بعد). ويعرض docker compose ps الحالة : فخدمة Up لكن unhealthy مريضة تُعالَج (السجلات، والتشخيص)، وليست خدمة تدور.

اضبطوا التواتر باعتدال : كافيا للرصد (10 إلى 30 ثانية)، مع محاولات مكررة لتفادي الإنذارات الكاذبة. فاختبار عدواني جدا يُشير بلا توقف ؛ ونادر جدا، يفوّت الأعطال.

خطأ شائع في الفهم: « تكفي depends_on لترتيب الإقلاع، وalways في كل مكان أسلم ». لا. فدون شرط service_healthy، لا تفعل depends_on إلا ترتيب الانطلاق دون انتظار جاهزية القاعدة — وتعود أعطال « القاعدة غير جاهزة » ؛ وalways في كل مكان يعيد التشغيل حتى بعد إيقافات الصيانة الطوعية. unless-stopped افتراضيا، وفحص صحة يُثبت، وشرط ينتظر : هذا الثلاثي هو ما يجعل الموثوقية.
جعل خدمة مستقلة إعادة تشغيل تلقائية، وصحة مثبتة، وحركة نحو السليم سياسة إعادة التشغيل إعادةالتشغيل بعد عطل أو إقلاعاختبار فحص الصحة يثبتالجاهزية الحقيقيةاعتماد مشروط ينتظرservice_healthyقراءة الحالة Upليست healthy
إعادة تشغيل تلقائية، وصحة مثبتة، وحركة نحو السليم
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) يضيف إدير restart: unless-stopped لكل خدمة دائمة للنجاة من الأعطال وعمليات الإقلاع. 2) يضيف فحص صحة pg_isready على القاعدة الذي يثبت الجاهزية الحقيقية. 3) يجعل الواجهة معتمدة على service_healthy بدلا من مجرد ترتيب انطلاق. 4) يقرأ docker compose ps : فـ Up لكن unhealthy تعني التشخيص، وليس التوجيه. الدرس : إعادة التشغيل تُحيي، وفحص الصحة يُثبت، والشرط ينتظر الجاهزية الحقيقية.

هل تعلم ؟

قد تعرض حاوية Up منذ ساعات بينما لا يرد تطبيقها على أحد — فالعملية حية، والخدمة ميتة.
صحيح : Up تصف العملية، وhealthy تصف الخدمة. ومن هنا فحص الصحة.

Up هي النبض ؛ وhealthy هي اللياقة.

🔎 مثال ملموس — 🔎 مثال ملموس — Postgres تثبت صحتها

مكدس إدير : لا تنطلق الواجهة إلا على قاعدة مثبتة الجاهزية.

services:
  bdd:
    image: postgres:16.4
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 10s
      retries: 5
  api:
    build: ./api
    depends_on:
      bdd:
        condition: service_healthy

القراءة : لا تنطلق الواجهة إلا على قاعدة مثبتة الجاهزية.

الدرس : تختفي أعطال الإقلاع « القاعدة غير جاهزة ».

مفردات القسم

إعادة التشغيل (restart)
سياسة إعادة التشغيل التلقائية للحاوية : no وon-failure وalways وunless-stopped.

مثال بسيط: يضع إدير unless-stopped : إعادة تشغيل بعد عطل أو إقلاع، لكن مع احترام إيقافه اليدوي.

ما ليس كذلك: إعادة تشغيل يدوية عند 3 صباحا بعد كل عطل.

رد فعل: لخدمة دائمة : صرحوا بسياسة restart.

فحص الصحة (healthcheck)
اختبار دوري يثبت الصحة الحقيقية للخدمة (طلب، وليس مجرد عملية).

مثال بسيط: يثبت pg_isready أن قاعدة إدير تقبل الاتصالات فعلا.

ما ليس كذلك: مجرد ترتيب انطلاق دون تحقق.

رد فعل: لاعتماد حرج : اختبروا الخدمة الحقيقية.

healthy / unhealthy
حالة سليمة أو مريضة حسب آخر اختبار صحة — مستقلة عن دوران العملية.

مثال بسيط: قاعدة إدير Up لكن unhealthy : يشخص بدلا من التوجيه.

ما ليس كذلك: مجرد شغال أو متوقف.

رد فعل: Up + unhealthy : عالجوا، ولا توجهوا.

condition: service_healthy
في depends_on : انتظار أن تثبت سلامة الاعتماد قبل الانطلاق.

مثال بسيط: تنتظر واجهة إدير القاعدة healthy بدلا من الأمل.

ما ليس كذلك: ترتيب انطلاق دون ضمان توفر.

رد فعل: لإقلاع مرتب : اشترطوا الشرط، وليس الترتيب فقط.

في التطبيق — عمليا — جعل مكدسكم مستقلا

  1. أضيفوا restart: unless-stopped لكل خدمة دائمة.
  2. أضيفوا فحص صحة للقاعدة (pg_isready).
  3. اجعلوا الواجهة معتمدة على service_healthy.
  4. اقتلوا القاعدة (kill) : وراقبوا إعادة التشغيل + الانتظار المثبت.
مكدسكم يعيد الإقلاع وحده ولا يوجه إلا نحو مثبت سلامته.

نص جاهز للقول — شرح جعل الموثوقية للفريق (30 ثانية)

« معكم إدير : كل خدمة دائمة تعيد التشغيل وحدها بعد عطل، والقاعدة تثبت جاهزيتها باختبار حقيقي، والواجهة تنتظر هذا الإثبات قبل الانطلاق. انتهت الاستيقاظات بعد انقطاع : المكدس ينهض وحده. »

يُقال في المراجعة : اعرضوا اختبار قتل القاعدة أمام الفريق.

نموذج للنسخ واللصق — قاعدة مثبتة + واجهة تنتظر (Compose)

services:
  bdd:
    image: postgres:16.4
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 10s
      timeout: 5s
      retries: 5
  api:
    build: ./api
    restart: unless-stopped
    depends_on:
      bdd:
        condition: service_healthy

واجهة ويب تُختبر بـ HTTP

مثل إدير لكن باختبار طلب ويب على الصفحة الرئيسية : تكون الخدمة healthy عندما ترد فعلا.

خدمة حرجة 24/7

restart: always مفترض وموثق : فحتى الإيقاف اليدوي يعيد التشغيل — للحالات الحرجة فعلا فقط.

مهمة ظرفية

restart: on-failure : لا نعيد إلا عند خطأ، وليس بعد نجاح عادي.

شعور زائف بالأمان

depends_on دون شرط + اختبار يستهدف الحاوية الخطأ : صححوا نحو service_healthy واختبار حقيقي.

✓ ممارسات جيدة

  • unless-stopped افتراضيا في الدائم.
  • اختبروا الخدمة الحقيقية (طلب، وليس PID).
  • اقرءوا حالة الصحة في compose ps.

✗ أخطاء شائعة

  • always في كل مكان (يعيد حتى بعد إيقافاتكم).
  • depends_on دون شرط (شعور زائف).
  • فحص صحة يختبر الحاوية الخطأ.

النقاط الأساسية

  • إعادة التشغيل تُحيي، وفحص الصحة يُثبت.
  • depends_on + شرط = ترتيب حقيقي.
  • Up ليست healthy.
  • unless-stopped : الافتراضي الصحيح.

تحدي 48 ساعة — طبّق غدا

على مكدسكم الحقيقي : أضيفوا unless-stopped + فحص صحة + شرط، واقتلوا القاعدة وراقبوا إعادة التشغيل والانتظار المثبت.

قائمة الخروج من القسم
  • أستطيع التصريح بسياسة إعادة تشغيل مناسبة.
  • أستطيع كتابة فحص صحة يثبت الجاهزية الحقيقية.
  • أستطيع جعل الانتظار على service_healthy وقراءة الحالة.
تقييم ذاتي 1-5 : هل ينجو مكدسي من إقلاع ليلي دوني ؟هل تنتظر اعتماداتي الجاهزية الحقيقية أم مجرد ترتيب ؟

أسئلة شائعة

فحص صحة أم مجرد محاولات جديدة في التطبيق ؟

كلاهما : المحاولات الجديدة تجعل التطبيق متينا في كل مكان، وفحص الصحة يجعل المكدس قابلا للرصد والجدولة. حليفان، وليسا متنافسين.

أي تواتر للاختبار ؟

كافيا للرصد (10 إلى 30 ثانية)، مع محاولات مكررة لتفادي الإنذارات الكاذبة. فاختبار عدواني جدا يُشير بلا توقف ؛ ونادر جدا، يفوّت الأعطال.

تحقّق من فهمك

خدمة « Up (unhealthy) ». ماذا نفهم ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 4أسئلة جديدة وأصعب للتحقق من مكتسباتك