CONTAINER APPS · مطالعه موردی
بدون ترس منتشر کنید: preprod ⇄ prod بهروش blue/green با یک کلیک
یک جریان کاری واقعی برای تیمی که یک اپلیکیشن زنده روی Managed Containers اجرا میکند و میخواهد چرخههای استقرار/تست طولانی را بدون دستزدن به production انجام دهد: یک نسخه preprod بسازید، آن را هرقدر که میخواهید روی سابدامین مخصوص به خودش تست کنید، سپس دامنه زنده را آنی به آن سوییچ کنید — و اگر چیزی درست بهنظر نرسید، با همان سرعت بازگردانید. به دو روش نشان داده شده: از پنل مدیریت، و با ابزار خط فرمان cdnctl.
سناریو
ajansspor.com روی Managed Containers اجرا میشود (یک container app پروداکشن + یک MySQL مدیریتشده). تیم میخواهد یک تغییر بزرگ را روزها تست کند، سپس در چند ثانیه با یک بازگردانی آنی تضمینشده زنده کند. با blue/green هرگز اپ prod در حال اجرا را در محل ویرایش نمیکنیم: آن را به یک محیط preprod کلون میکنیم، آنجا تست میکنیم، سپس دامنه production را جابهجا میکنیم.
- prod (آبی) — اپلیکیشن زندهای که
ajansspor.comرا سرویس میدهد. - preprod (سبز) — یک کپی، قابل دسترسی روی سابدامین مخصوص به خودش
ca-*.cdn.com.tr. - Promote،
ajansspor.comرا در چند ثانیه و بدون قطعی از prod به preprod منتقل میکند. - Rollback آن را برمیگرداند — و برای تغییرات داده، یک اسنپشات خودکار پایگاهداده را نیز بازیابی میکند.
وقتی محصول بیش از یک اپلیکیشن است (web + api + worker)
بیشتر محصولات واقعی یک stack هستند، نه یک کانتینر تنها. blue/green روی کل stack بهعنوان یک واحد کار میکند: یک پروژه مجموعه اپهای داخل حساب شماست، و یک عملیات همه آنها را با هم کلون، Promote یا Rollback میکند.
- Create preprod from all apps هر اپ prod (web، api، worker، …) را در یک کپی preprod جفتشده در یک پروژه واحد کلون میکند.
- اتصالهای اپبهاپ بهطور خودکار دوباره سیمکشی میشوند — اگر
webباapiصحبت کند،webدر preprod نیز باapiدر preprod صحبت میکند. stack پیشرود خودکفاست و هرگز به production اشاره نمیکند. - Promote (کل پروژه) دامنه production هر اپ را همزمان به کپی preprod آن منتقل میکند؛ Rollback (کل پروژه) همه را برمیگرداند. تغییری که چند سرویس را در بر میگیرد، بهعنوان یک واحد واحد زنده میشود — یا لغو میشود.
- فقط یک سرویس تغییر کرده؟ از Create preprod / Promote تکاپ فقط روی همان اپ استفاده کنید.
videoonly چگونه از این استفاده میکند: اپهای آن (فرانتاند، API، worker ها) در یک حساب زندگی میکنند. روی Create preprod from all apps کلیک میکنید (state shared برای استفاده مجدد از DB/Redis زنده، یا clone برای تست یک مایگریشن روی داده کپیشده)، کل stack را روی سابدامینهای ca-* اعتبارسنجی میکنید، سپس با Promote (whole project) هر hostname تولید را در چند ثانیه به نسخههای جدید منتقل میکنید — با Rollback (whole project) بهعنوان دریچه فرار آنی.
State: preprod چه چیزی را با prod بهاشتراک میگذارد
این را هنگام ساخت preprod انتخاب میکنید (--state / منوی کشویی):
- shared — preprod از همان DB/Redis مدیریتشده و باکتهای object-storage prod استفاده میکند (از طریق ارجاعات امن بیناپی؛ بدون کپی). برای تغییرات کد/رابط کاربری بهترین است.
- clone — preprod یک MySQL مدیریتشده مخصوص خودش با یک کپی از دادههای prod میگیرد. برای تغییرات داده/طرحواره امن است؛ داده prod دستنخورده میماند.
- isolated — preprod تمیز آغاز میشود.
هنگام Promote، پلتفرم ابتدا یک اسنپشات خودکار از پایگاهداده میگیرد، پس Rollback میتواند داده را نیز بازگرداند. محتوای استاتیک/رسانه روی یک دیسک پایدار میتواند بهاشتراک گذاشته شود (RWX) تا آپلودها همگام بمانند.
راهنمای A — در پنل
- حساب CDN خود را باز کنید → تب Platforms → Managed Container Apps. پنل محیطهای Blue/Green درست بالای Your apps قرار دارد. (اگر این حساب هنوز از طریق Pull/Push CDN سرویس میدهد و هنوز اپی ندارد، ابتدا زیر Platforms روی Enable Apps Alongside Current Delivery کلیک کنید.)

پنل محیطهای Blue/Green بالای فهرست اپها - یک state انتخاب کنید و روی Create preprod from all apps کلیک کنید (کل محصول) — یا اگر فقط یک سرویس تغییر کرده، Create preprod (single app).

یک state انتخاب کنید، سپس «Create preprod from all apps» (کل پروژه) — یا یکی برای تک اپلیکیشن بسازید - اپ(های) preprod بهصورت جفتشده با prod در یک پروژه ظاهر میشوند (هرکدام روی سابدامین مخصوص به خودش). آنها را هرقدر لازم است مستقر و تست کنید — production بدون دستخوردن به سرویسدهی ترافیک ادامه میدهد.

پروژه بههمراه اپهای prod و preprod آن، و Promote / Rollback کل پروژه - وقتی آماده بود، روی Promote (whole project) → prod کلیک کنید. هر دامنه production در چند ثانیه به کپی preprod آن سوییچ میشود.

Promote (whole project) هر دامنه production را به کپی preprod آن منتقل میکند - اگر چیزی اشتباه بود، روی Rollback (whole project) کلیک کنید — ترافیک بلافاصله به اپهای قبلی برمیگردد (و اسنپشات پایگاهداده پیش از promote بازیابی میشود). دکمه Rollback پس از اجرای یک promote در پنل ظاهر میشود.
تصاویر بالا ضبطهای واقعی از پنل زنده CDN.com.tr هستند (Platforms → Managed Container Apps → محیطهای Blue/Green).
راهنمای B — با 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»: Create preprod from all apps، Promote / Rollback (whole project)) و از طریق API مشتری (POST …/platform/container/project/{create-preprod,promote,rollback}) در دسترساند. اجزای سطحپایین: container-apps:switch-origin (جابهجایی یک دامنه) و container-apps:db clone|snapshot|restore (عملیات دادهای MySQL مدیریتشده).
چرا امن است
- production هرگز در محل ویرایش نمیشود — روی یک اپلیکیشن جداگانه میسازید و تست میکنید.
- آنی + برگشتپذیر — Promote/Rollback یک تعویض مالکیت دامنه است (چند ثانیه)، نه بازساخت.
- داده هم برگشتپذیر است — Promote بهطور خودکار از پایگاهداده اسنپشات میگیرد؛ Rollback آن را بازیابی میکند.
- بهازای هر حساب / هر دامنه — DNS و TLS تحت تأثیر قرار نمیگیرند؛ گواهی production دستنخورده میماند.
همچنین به راهنمای محیطهای Blue/green مراجعه کنید.