النشر على السحابة
درس 3 من 3
3النشر على السحابة
الصورة الكبيرةالنشر ليس رفع ملفات مرة واحدة. هو عملية تتكرر عشرات المرات: بناء صورة، تشغيلها بإعدادات الإنتاج، التأكد أنها سليمة، ثم تحويل الزوار لها، مع طريق رجوع إن ساء شيء.
ماذا تشاهد في الرسم: نشر بلا توقف: النسخة الجديدة تعمل وتُفحص قبل أن تستقبل أي زائر، والقديمة تبقى حتى تنجح.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
مثل افتتاح فرع جديد لمقهى: تجهّز المكان، تجرّب الآلات، تتأكد أن كل شيء يعمل، ثم تفتح الباب. ولو تعطلت الآلة في أول ساعة تحوّل الزبائن للفرع القديم ريثما تصلحها.
ثلاث درجات: PaaS (Render، Railway، Fly.io، Heroku): ترفع الكود أو الصورة والمنصة تدير الباقي، أسرع بداية. حاويات مُدارة (Cloud Run، ECS، Azure Container Apps): تحكم أكثر وتوسّع تلقائي. خادم افتراضي (VPS) مع Docker Compose وCaddy أو Nginx: أرخص وأكثر تحكمًا ومسؤولية. في كلها: نقطة /health تفحص الاعتماديات، HTTPS بشهادة Let's Encrypt، الترحيلات خطوة منفصلة متوافقة للخلف (أضف عمودًا قبل أن تعتمد عليه)، نشر متدرّج أو أزرق/أخضر، وصورة بوسم الإصدار (لا latest) ليكون التراجع إعادة نشر الوسم السابق.
قبل أن تبدأ
🐳Docker
صورة تعمل محليًا.
⚙️الإعدادات
الدرس السابق: البيئة والأسرار.
🌍DNS
درس DNS في مسار الإنترنت.
الفكرة الجوهرية
1فحص الصحة
المنصة تسأل /health كل بضع ثوانٍ. لو فشل لا ترسل زوارًا، أو تعيد التشغيل. الفحص الجيد يتأكد من الاعتماديات الأساسية لا أن الخادم يرد فقط:
def check_database():
return True
def check_cache():
raise TimeoutError("redis did not answer in 1s")
CHECKS = {"database": check_database, "cache": check_cache}
def health():
results = {}
for name, check in CHECKS.items():
try:
results[name] = "ok" if check() else "fail"
except Exception as e:
results[name] = f"fail: {e}"
healthy = all(v == "ok" for v in results.values())
return (200 if healthy else 503), results
status, body = health()
print(status, body)2نشر على منصة مُدارة
أغلب المنصات تقرأ Dockerfile، وتطلب الأسرار في لوحتها، ومسار فحص الصحة. مثال عام بخطوات واجهة سطر الأوامر:
# build and tag with the version, never "latest" docker build -t registry.example.com/cafe-api:1.4.0 . docker push registry.example.com/cafe-api:1.4.0 # run migrations as a one-off job before switching traffic <platform> run --image cafe-api:1.4.0 -- alembic upgrade head # deploy; the platform waits for /health before sending traffic <platform> deploy --image cafe-api:1.4.0 --health-path /health # something wrong? redeploy the previous tag <platform> deploy --image cafe-api:1.3.2
3خادم افتراضي مع Caddy
على VPS، Caddy أمام التطبيق يحصل على شهادة HTTPS ويجدّدها تلقائيًا. ملف إعداد من ثلاثة أسطر:
# Caddyfile
cafe.example.com {
reverse_proxy api:8000
}مثال محلول
المسألة: إصدار جديد يحذف عمود phone ويعيد تسميته mobile. أثناء النشر، النسخة القديمة ما زالت تعمل وتطلب phone فتنهار. الحل بثلاث مراحل: (1) أضف mobile وانسخ البيانات، والكود يكتب في الاثنين. (2) انشر كودًا يقرأ mobile فقط. (3) احذف phone في إصدار لاحق. كل مرحلة متوافقة مع النسخة التي قبلها.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| السحابة تعني Kubernetes. | أغلب المشاريع تكفيها منصة مُدارة أو خادم واحد لسنوات. |
| النشر الناجح = الصفحة تفتح. | افحص الصحة والسجلات والمسارات المهمة، فالصفحة الرئيسية قد تعمل والدفع معطل. |
أين تقابله في العمل
🧪بيئة تجريبية
نسخة طبق الأصل تُختبر قبل الإنتاج.
🔁نشر متكرر
إصدارات صغيرة يومية أقل خطرًا من إصدار ضخم شهري.
اختبر فهمك
لماذا تُوسم الصورة برقم الإصدار لا latest؟
latest يتغير، فلا تعرف ما الذي يعمل ولا كيف ترجع.
متى تُشغّل ترحيلات القاعدة؟
النسختان تعملان معًا لحظات، فيجب أن تفهما المخطط كلاهما.
فحص الصحة يرد 503. ماذا تفعل المنصة؟
تُبقي النسخة السليمة تعمل حتى تصبح الجديدة سليمة.
بطاقات مراجعة سريعة
تحقق من فهمك
ما أبسط خيار استضافة لمشروعك الأول؟
منصة مُدارة تقرأ Dockerfile وتعطيك HTTPS ونطاقًا.
لماذا الترحيلات متوافقة للخلف؟
لأن النسخة القديمة تبقى تعمل أثناء النشر.
ماذا يفحص /health؟
الاعتماديات الأساسية مثل القاعدة، بمهلة قصيرة.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.