Blue-Green على VM واحدة: نشر Node.js بدون downtime طويل
هتقلل توقف نشر Node.js من حوالي 45 ثانية إلى ثانية أو ثانيتين، بدون Kubernetes وبدون منصة deploy كبيرة. الفكرة: تشغل إصدارين على نفس الـ VM، وتخلي NGINX يحوّل الترافيك للإصدار السليم فقط.
مستوى القارئ: متوسط
المشكلة باختصار
الطريقة الشائعة على VM صغيرة هي: اسحب الكود، أوقف الخدمة، ابنِ النسخة الجديدة، شغّل الخدمة. الطريقة دي بتفشل لما عندك مستخدمين حقيقيين وقت النشر. أي طلب ييجي أثناء الإيقاف ياخد 502 أو timeout.
الافتراض هنا إن عندك تطبيق Node.js واحد، VM واحدة، NGINX قدامه، وحجم ترافيك متوسط مثل 20K إلى 80K زيارة يوميًا. مش محتاج cluster. محتاج فقط منفذين: واحد للإصدار الحالي وواحد للإصدار الجديد.
الفكرة بمثال بسيط
ركز في المثال ده. عندك مطعم بباب واحد للزبائن، ومطبخين خلف الباب. المطبخ الأزرق شغال الآن. أنت تجهز المطبخ الأخضر في الخلف، تختبر الأكل، ثم تقول للباب: وجّه الطلبات للمطبخ الأخضر. الزبون لم يرَ النقل.
ده بالظبط Blue-Green Deploy. الـ blue هو الإصدار الحالي على port 3001. الـ green هو الإصدار الجديد على port 3002. NGINX هو الباب. فحص /health هو اختبار إن المطبخ الجديد جاهز.
علميًا، Blue-Green Deploy هو نمط نشر يشغل بيئتين متشابهتين. واحدة تستقبل الترافيك، والثانية تتجهز وتُختبر. التحويل يتم بتغيير الـ routing ثم reload خفيف للـ proxy. في NGINX، reload يقرأ الإعداد الجديد بدون قتل الاتصالات الجارية غالبًا، بشرط إن الإعداد صحيح.
إعداد NGINX للتبديل بين الإصدارين
اعمل ملف upstream منفصل. ده يخلي سكربت النشر يغيّر سطر واحد بدل ما يلمس ملف NGINX كامل.
# /etc/nginx/conf.d/app-upstream.conf
upstream app_backend {
server 127.0.0.1:3001;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://app_backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
ابدأ بـ blue على 3001. الإصدار التالي يشتغل على 3002. بعد فحص الصحة، السكربت يبدّل upstream إلى 3002 ثم يعمل nginx -s reload.
خدمتان systemd بدل خدمة واحدة
بدل خدمة واحدة اسمها app.service، اعمل template واحد يخدم blue وgreen. المكسب إنك تقدر تشغل الإصدار الجديد بدون لمس القديم.