المستوى: متوسط — المقال مكتوب لحد عارف يعني إيه deploy وload balancer، وتعامل مع سيرفر إنتاج قبل كده. لو لسه مبتدئ، فيه مثال بسيط في الأول هيوصّلك الفكرة قبل التفاصيل التقنية.
Blue-Green Deployment: تنشر النسخة الجديدة وانت مغمّض
أهم مكسب من المقال ده: تنشر تحديث على الإنتاج من غير ما المستخدم يشوف ثانية توقف واحدة، ولو طلع خطأ ترجّع النسخة القديمة في تمن ثواني بدل ما تعيد deploy كامل في ست دقايق.
المشكلة باختصار
الطريقة الشائعة إنك توقّف الخدمة، تحدّث الكود، تشغّلها تاني. ده بيفشل في حاجتين. الأولى إن المستخدم بيشوف صفحة 502 طول مدة التحديث. التانية إن لو النسخة الجديدة فيها bug، الرجوع معناه deploy تاني من الأول، والناس بتتألم طول الوقت ده.
الافتراض هنا إن عندك خدمة بتشتغل 24 ساعة وفيها ترافيك حقيقي، يعني نافذة الصيانة مش رفاهية متاحة ليك.
الفكرة الأساسية بمثال بسيط
تخيّل مطعم عنده مطبخين متطابقين، أزرق وأخضر. الزباين كلهم بياكلوا من المطبخ الأزرق دلوقتي. عايز تجرّب وصفة جديدة؟ بتجهّزها بالكامل في المطبخ الأخضر وانت مقفول من غير ما حد ياكل منه. تتأكد إن كل حاجة تمام، وبعدين بتقول للجرسون: من دلوقتي قدّم من الأخضر. التحويل بيحصل في لحظة، والزبون مالحظش حاجة. لو طلعت الوصفة الجديدة وحشة، بترجّع الجرسون للأزرق على طول، والأزرق لسه شغّال زي ما هو.
علميًا: Blue-Green Deployment معناه إنك بتشغّل نسختين متطابقتين من بيئة الإنتاج بالتوازي. واحدة بس هي اللي بتستقبل ترافيك المستخدمين في كل لحظة (Blue)، والتانية (Green) بتستقبل النسخة الجديدة وبتتجرّب عليها. النشر بيتحوّل لعملية واحدة: تحويل مسار الترافيك من Blue لـ Green على مستوى الـ load balancer أو الـ DNS. مفيش إعادة تشغيل، ومفيش توقف.
التطبيق العملي بـ Nginx
أبسط شكل: عندك بيئتين شغّالتين على بورتين مختلفين، والـ Nginx بيوجّه الترافيك لواحدة منهم. التبديل بيبقى تغيير سطر واحد و reload.
البيئة الزرقاء على البورت 8080، والخضراء على 8081. ملف الإعداد بيشاور على ملف upstream منفصل:
# /etc/nginx/conf.d/app.conf
upstream app_backend {
server 127.0.0.1:8080; # blue (live حاليًا)
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://app_backend;
proxy_set_header Host $host;
}
}
دلوقتي نزّل النسخة الجديدة على البورت 8081 (green) وجرّبها داخليًا. لما تطمّن، بدّل سطر واحد وأعمل reload من غير قطع للاتصالات المفتوحة: