CONTAINER APPS · دراسة حالة
انشر دون خوف: blue/green preprod ⇄ prod بنقرة واحدة
سير عمل حقيقي لفريق يشغّل تطبيقًا مباشرًا على Managed Containers ويريد دورات نشر/اختبار طويلة دون لمس الإنتاج: ابنِ نسخة preprod، اختبرها لأي مدة تريدها على نطاقها الفرعي الخاص، ثم بدّل النطاق المباشر إليها فوريًا — وتراجع بنفس السرعة إذا بدا أي شيء خاطئًا. معروض بطريقتين: من لوحة الإدارة، ومع أداة سطر الأوامر cdnctl.
السيناريو
يعمل ajansspor.com على Managed Containers (تطبيق حاوية إنتاج + MySQL مُدارة). يريد الفريق اختبار تغيير كبير لأيام، ثم الانتقال إلى الإنتاج خلال ثوانٍ مع ضمان تراجع فوري. مع blue/green لا نُعدّل تطبيق الإنتاج قيد التشغيل مباشرة أبدًا: نستنسخه إلى بيئة preprod، نختبر هناك، ثم ننقل نطاق الإنتاج إليها.
- prod (الأزرق) — التطبيق المباشر الذي يخدم
ajansspor.com. - preprod (الأخضر) — نسخة يمكن الوصول إليها على نطاقها الفرعي الخاص
ca-*.cdn.com.tr. - الترقية (Promote) تنقل
ajansspor.comمن prod إلى preprod خلال ثوانٍ، دون أي توقف. - التراجع (Rollback) ينقلها للخلف — ويستعيد، لتغييرات البيانات، لقطة قاعدة بيانات تلقائية.
عندما يكون المنتج أكثر من تطبيق واحد (web + api + worker)
معظم المنتجات الحقيقية هي مكدس (stack)، لا حاوية واحدة. يعمل blue/green على المكدس بأكمله كوحدة واحدة: المشروع (project) هو مجموعة التطبيقات في حسابك، وإجراء واحد يستنسخ أو يرقّي أو يتراجع عن جميعها معًا.
- إنشاء preprod من جميع التطبيقات يستنسخ كل تطبيق إنتاج (web، api، worker، …) إلى نسخة preprod مزدوجة ضمن مشروع واحد.
- يُعاد ربط الروابط بين التطبيقات تلقائيًا — إذا كان
webيتحدث إلىapi، فإنwebفي preprod يتحدث إلىapiفي preprod. مكدس preprod مكتفٍ ذاتيًا ولا يشير أبدًا إلى الإنتاج. - الترقية (المشروع بالكامل) تنقل نطاق الإنتاج لكل تطبيق إلى نسخته في preprod دفعة واحدة؛ التراجع (المشروع بالكامل) يعكسها جميعًا. تغيير يمتد عبر عدة خدمات يصبح مباشرًا — أو يُلغى — كوحدة واحدة.
- تغيّرت خدمة واحدة فقط؟ استخدم إنشاء preprod / الترقية الخاصة بتطبيق واحد على تلك الخدمة فقط.
كيف سيستخدم videoonly هذا: تطبيقاته (الواجهة الأمامية، API، العُمّال) تعيش في حساب واحد. تنقر على إنشاء preprod من جميع التطبيقات (الحالة shared لإعادة استخدام قاعدة البيانات/Redis المباشرة، أو clone لاختبار ترحيل (migration) على بيانات منسوخة)، تتحقق من المكدس بالكامل على النطاقات الفرعية ca-*، ثم الترقية (المشروع بالكامل) لنقل كل اسم مضيف إنتاج إلى الإصدارات الجديدة خلال ثوانٍ — مع التراجع (المشروع بالكامل) كمخرج طوارئ فوري.
الحالة (State): ما الذي تشاركه preprod مع prod
تختار هذا عند إنشاء preprod (--state / القائمة المنسدلة):
- shared — تستخدم preprod نفس قاعدة البيانات/Redis المُدارة وحاويات التخزين الكائني (object storage) الخاصة بـprod (عبر مراجع آمنة بين التطبيقات؛ دون نسخ). الأفضل لتغييرات الكود/الواجهة.
- clone — تحصل preprod على MySQL مُدارة خاصة بها بنسخة من بيانات prod. آمن لتغييرات البيانات/المخطط (schema)؛ لا يُمس بيانات prod.
- isolated — تبدأ preprod نظيفة.
عند الترقية (Promote) تأخذ المنصة أولاً لقطة قاعدة بيانات تلقائية، لذا يمكن لـالتراجع (Rollback) استعادة البيانات أيضًا. يمكن مشاركة الملفات الثابتة/الوسائط الموجودة على قرص دائم (RWX) بحيث تبقى الرفوعات متسقة.
شرح تفصيلي أ — من اللوحة
- افتح حسابك على CDN ← تبويب المنصات ← Managed Container Apps. تقع لوحة بيئات Blue/Green فوق Your apps مباشرة. (إذا كان هذا الحساب لا يزال يعمل عبر Pull/Push CDN وليس لديه تطبيقات بعد، انقر أولاً على Enable Apps Alongside Current Delivery تحت المنصات.)

لوحة بيئات Blue/Green فوق قائمة التطبيقات - اختر حالة (state) وانقر على إنشاء preprod من جميع التطبيقات (المنتج بالكامل) — أو إنشاء preprod (تطبيق واحد) إذا تغيرت خدمة واحدة فقط.

اختر حالة، ثم «إنشاء preprod من جميع التطبيقات» (المشروع بالكامل) — أو أنشئها لتطبيق واحد - تظهر تطبيقات preprod مقترنة بـprod ضمن مشروع واحد (كل منها على نطاقه الفرعي الخاص). انشرها واختبرها طالما احتجت — يستمر الإنتاج في تقديم حركة المرور دون أي مساس.

المشروع مع تطبيقات prod وpreprod الخاصة به، والترقية / التراجع على مستوى المشروع بالكامل - عندما تصبح جاهزًا، انقر على الترقية (المشروع بالكامل) → prod. يتحول كل نطاق إنتاج إلى نسخته في preprod خلال ثوانٍ.

الترقية (المشروع بالكامل) تنقل كل نطاق إنتاج إلى نسخته في preprod - إذا كان هناك خطأ ما، انقر على التراجع (المشروع بالكامل) — تعود حركة المرور إلى التطبيقات السابقة فورًا (وتُستعاد لقطة قاعدة البيانات السابقة للترقية). يظهر زر التراجع في اللوحة بمجرد تنفيذ عملية ترقية.
لقطات الشاشة أعلاه هي التقاطات حقيقية للوحة CDN.com.tr المباشرة (المنصات → Managed Container Apps → بيئات Blue/Green).
شرح تفصيلي ب — باستخدام cdnctl
نفس التدفق، قابل للبرمجة النصية من البداية للنهاية. تطبيق واحد:
# 1) Clone prod → preprod (shared add-ons; use --state clone for isolated DB+data)
cdnctl container apps create-preprod --account <uuid> --app <prod_app_uuid> --state shared
# 2) Deploy + test the preprod app on its own subdomain
cdnctl container apps deploy --account <uuid> --app <preprod_app_uuid>
cdnctl container apps expose --account <uuid> --app <preprod_app_uuid>
cdnctl container apps status --account <uuid> --app <preprod_app_uuid>
# 3) Go live: move the production domain to preprod (instant, no downtime)
cdnctl container apps promote --account <uuid> --app <preprod_app_uuid>
# 4) If needed, roll back (traffic + pre-promote DB snapshot)
cdnctl container apps rollback-promotion --account <uuid> --app <prod_app_uuid>
المنتج بالكامل (مشروع متعدد التطبيقات) — يشغّله المسؤولون/فريق العمليات على الخادم باستخدام artisan:
# Clone EVERY prod app in the account into a paired preprod (one project)
php artisan container-apps:env create-preprod --account <uuid> --all --state shared
# ... deploy & test each preprod app on its ca-* subdomain ...
# Promote the whole project (all production domains move together)
php artisan container-apps:env promote --account <uuid> --project <project_uuid>
# Roll the whole project back (traffic + DB snapshots for every app)
php artisan container-apps:env rollback --account <uuid> --project <project_uuid>
نفس إجراءات المجموعة متاحة في اللوحة (لوحة «بيئات Blue/Green»: إنشاء preprod من جميع التطبيقات، الترقية / التراجع (المشروع بالكامل)) وعبر واجهة برمجة تطبيقات العملاء (POST …/platform/container/project/{create-preprod,promote,rollback}). لبنات البناء منخفضة المستوى: container-apps:switch-origin (نقل نطاق واحد) وcontainer-apps:db clone|snapshot|restore (عمليات بيانات MySQL المُدارة).
لماذا هو آمن
- لا يُعدَّل الإنتاج في مكانه أبدًا — تبني وتختبر في تطبيق منفصل.
- فوري وقابل للعكس — الترقية/التراجع هما تبديل ملكية نطاق (ثوانٍ)، وليس إعادة بناء.
- البيانات قابلة للعكس أيضًا — تأخذ الترقية لقطة تلقائية لقاعدة البيانات؛ ويستعيدها التراجع.
- لكل حساب / لكل نطاق — لا تتأثر DNS وTLS؛ تبقى شهادة الإنتاج كما هي.
راجع أيضًا دليل بيئات Blue/green.