Loading...

مطالعات موردی

انتقال برنامه Docker و Kubernetes به Managed Container App

یک راهنمای انتقال عملی برای انتقال یک container Docker موجود، استقرار Kubernetes یا backend برنامه موبایل به CDN.com.tr Managed Container App با Managed Redis، پایگاه داده مدیریت‌شده، Object Storage، کارهای زمان‌بندی‌شده، دامنه، SSL، CDN و WAF.

بازگشت به راهنمای پلتفرم
هیچ ابزار داخلی مورد نیاز نیست

جریان نیازی به kubectl، SSH، دستورات واردات artisan یا تغییرات مستقیم پایگاه داده ندارد. ابزارهای داخلی فقط در طرف تأیید و اشکال‌زدایی CDN.com.tr باقی می‌مانند.

جریان رابط پنل

1

ایجاد یا انتخاب یک حساب CDN

ابتدا وارد CDN.com.tr شوید. اگر مشتری قبلاً حساب CDN برای این برنامه ندارد، یکی از CDN Accounts یا جادوگر راه‌اندازی ایجاد کنید، سپس قبل از باز کردن Platforms آن را انتخاب کنید.

  • جادوگر راه‌اندازی پوسته حساب CDN و رابطه پکیج را ایجاد می‌کند.
  • انتقال Container App خود از Platforms پس از وجود حساب ادامه می‌یابد.
  • هنگامی که دامنه نهایی بعداً متصل می‌شود از یک دامنه placeholder یا سرویس مانند api.example.com استفاده کنید.
2

تأیید استحقاق‌های پلتفرم مدیریت‌شده

قبل از ایجاد برنامه تأیید کنید که استحقاق‌های Managed Container شامل Container App، Redis، DB، Object Storage، ذخیره‌سازی پایدار و کارهای زمان‌بندی‌شده می‌شوند.

  • اگر تخصیص Redis یا DB صفر است، متوقف شوید و قبل از واردات داده یک پکیج با قابلیت انتقال اختصاص دهید.
  • برای برنامه‌هایی که چندین worker شروع می‌کنند یا پایگاه داده بزرگی را در زمان راه‌اندازی مقداردهی می‌کنند از طرح‌های Standard یا بالاتر استفاده کنید.
  • مسیریابی عمومی فقط پس از قبولی بررسی‌های DNS، SSL و سلامت از طریق CDN edge reverse proxy باز می‌شود.
3

شروع جادوگر انتقال

جریان ایجاد Container App را از Platforms باز کنید و جزئیات برنامه را به عنوان انتقال برنامه Docker/Kubernetes موجود وارد کنید. یک نقطه تحویل موجود برای دامنه انتخاب کنید، یا دامنه سفارشی را خالی بگذارید تا DNS آماده شود.

  • Image: registry.example.com/acme/mobile-backend
  • Tag: 1.0.0
  • Port: 8080
  • Health check: /health
4

اضافه کردن اعتبارنامه registry

یک token فقط‌خواندنی از Docker Hub یا registry خصوصی ایجاد کنید، سپس در Registry Credential وارد کنید. فقط برای دریافت image استفاده می‌شود، به عنوان env یا secret به برنامه تزریق نمی‌شود.

5

وارد کردن مقادیر محیطی

تنظیمات runtime غیرمحرمانه را در قالب KEY=VALUE وارد کنید.

  • PYTHONUNBUFFERED=1
  • PYTHONPATH=/app
  • MEDIA_ROOT=/app/data/media
  • THUMBS_ROOT=/app/data/thumbs
  • IMAGE_CDN_BASE_URL=https://api.example.com
  • APP_URL=https://api.example.com
  • LOG_LEVEL=INFO
6

وارد کردن اسرار

مقادیر OpenAI، Meta، WhatsApp، WooCommerce، TikTok، ارائه‌دهنده حمل‌ونقل و token همگام‌سازی حمل‌ونقل را در فیلدهای Secret masked وارد کنید. این مقادیر بعداً در پاسخ‌های GET بازگردانده نمی‌شوند.

7

فعال‌سازی Managed Redis

Managed Redis را فعال کنید. host، port یا password وارد نکنید؛ سیستم REDIS_URL را به عنوان env/secret به برنامه متصل می‌کند.

8

ایجاد Managed DB و واردات dump

Managed Database ایجاد کنید، سپس dump .sql یا .sql.gz از سیستم مبدأ را آپلود کنید. مسیریابی عمومی تا تکمیل واردات باز نمی‌شود. اگر واردات با شکست مواجه شد، قبل از آپلود مجدد dump اصلاح‌شده رکورد واردات ناموفق را لغو کنید.

9

واردات آرشیو فایل‌های پایدار

ذخیره‌سازی پایدار برای /app/data فعال کنید، آرشیو media/data مبدأ را به صورت .tar.gz آپلود کنید و مسیر mount هدف را /app/data نگه دارید. اگر واردات آرشیو با شکست مواجه شد، قبل از امتحان مجدد یا استقرار رکورد واردات ناموفق را لغو کنید.

10

ایجاد کار زمان‌بندی‌شده

ابتدا order-shipping-sync را غیرفعال ایجاد کنید، به صورت دستی اجرا کنید، سپس پس از تأیید برنامه را فعال کنید.

  • Schedule: */30 * * * *
  • Method: POST
  • Path: /orders/shipping-sync/run?limit=200&min_stale_minutes=120
  • Secret header: X-Order-Shipping-Sync-Token
  • Secret source: ORDER_SHIPPING_SYNC_TOKEN
11

بررسی، استقرار و تأیید

image، دامنه، Redis، DB، ذخیره‌سازی، اسرار و کارهای زمان‌بندی‌شده را بررسی کنید. Deploy را شروع کنید، سپس جدول زمانی عملیات، وضعیت و لاگ‌ها را تماشا کنید.

اعتبارنامه‌ها و فایل‌های واردات از کجا می‌آیند

منابع اعتبارنامه

  • token API CDN.com.tr: آن را از Authorization / API Tokens ایجاد کنید؛ فقط یک بار قابل مشاهده است.
  • token registry Docker: یک token فقط‌خواندنی از ارائه‌دهنده registry ایجاد کنید.
  • کلید OpenAI: آن را از صفحه کلیدهای API در dashboard OpenAI ایجاد کنید؛ اگر کلید قدیمی قابل مشاهده نیست آن را بچرخانید.
  • tokenهای Meta، WhatsApp و TikTok: آن‌ها را از پورتال توسعه‌دهنده مربوطه دریافت کنید و در صورت نیاز دامنه برنامه مانند api.example.com را به عنوان callback/domain اضافه کنید.
  • کلید/secret WooCommerce: آن را از WordPress admin، WooCommerce، Settings، Advanced، REST API ایجاد کنید.

فایل‌های واردات

  • dump پایگاه داده: با mysqldump، phpMyAdmin، RDS export یا پنل hosting فعلی صادر کنید.
  • آرشیو پایدار: پوشه‌های upload/media/data را به صورت .tar.gz آماده کنید.
  • token همگام‌سازی حمل‌ونقل: یک secret تصادفی جدید ایجاد کنید؛ از همان مقدار در secret برنامه و header کار زمان‌بندی‌شده استفاده کنید.
  • secretهای production نباید در اسناد، لاگ‌ها یا تیکت‌ها نوشته شوند.

موانع رایج انتقال

  • تجاوز از حد Redis یا DB به این معنی است که پکیج حساب برای این انتقال آماده نیست؛ به عنوان راه‌حل جایگزین اعتبارنامه‌های مدیریت‌شده را در مقادیر env قابل‌مشاهده قرار ندهید.
  • HTTP 413 در هنگام واردات DB/فایل به این معنی است که یک محدودیت آپلود web/PHP هنوز کمتر از اندازه آرشیو است، حتی اگر اعتبارسنجی API فایل‌های بزرگ را مجاز بداند.
  • آپلودهای سمت مشتری نیز به اندازه فایل پکیج CDN کافی نیاز دارند، زیرا پیکربندی edge از آن به عنوان nginx client_max_body_size استفاده می‌کند.
  • ErrImagePull معمولاً به این معنی است که اعتبارنامه registry گم شده، انتخاب نشده یا نامعتبر بوده است. اعتبارنامه فقط‌خواندنی ذخیره‌شده را انتخاب کرده و مجدداً مستقر کنید.
  • Exit code 137 به این معنی است که برنامه احتمالاً از حافظه خارج شده است. با یک طرح بزرگ‌تر شروع کنید یا تعداد worker را برای اولین استقرار کاهش دهید.
  • waiting_dns به این معنی است که hostname هنوز یک نقطه تحویل CDN آماده نیست. دامنه را زیر Content Delivery Points اضافه کرده و DNS/SSL را قبل از انتظار برای قبولی بررسی‌های سلامت عمومی تکمیل کنید.
  • در تست‌های دود S3، اگر put-object کار می‌کند اما head-object با خطا مواجه می‌شود، مالکیت bucket/key و مسیر S3 passthrough CDN را بررسی کنید.

جریان ترمینال با cdnctl و AWS CLI

از cdnctl به عنوان جریان کاری اصلی ترمینال استفاده کنید. فراخوانی‌های REST خام فقط برای بررسی‌های معادل API یا عیب‌یابی هستند، و AWS CLI فقط برای تأیید Object Storage سازگار با S3 استفاده می‌شود.

جریان اصلی cdnctl

cdnctl update --check
cdnctl login --email <customer@example.com> --password <password>
cdnctl accounts list
cdnctl container registry-credentials create --account <account_uuid> --name docker --registry-url https://index.docker.io/v1/ --username <user> --password <token>
cdnctl container apps create --account <account_uuid> --name mobile-backend --image registry.example.com/acme/mobile-backend --tag 1.0.0 --port 8080 --healthcheck /health --domain api.example.com --persistent-mount-path /app/data --persistent-storage-gb 5
cdnctl object-storage buckets create --account <account_uuid> --name app-media
cdnctl object-storage access-keys create --account <account_uuid> --bucket <bucket_uuid>
cdnctl object-storage bindings create --account <account_uuid> --app <app_uuid> --bucket <bucket_uuid> --access-key <key_uuid> --env-prefix S3
cdnctl container imports database --account <account_uuid> --app <app_uuid> --file app.sql.gz
cdnctl container imports files --account <account_uuid> --app <app_uuid> --file app-data.tar.gz --target-path /app/data
cdnctl container jobs create --account <account_uuid> --app <app_uuid> --name order-shipping-sync --schedule "*/30 * * * *" --method POST --path "/orders/shipping-sync/run?limit=200&min_stale_minutes=120" --secret-header-name X-Order-Shipping-Sync-Token --secret-source ORDER_SHIPPING_SYNC_TOKEN
cdnctl container apps deploy --account <account_uuid> --app <app_uuid>
cdnctl container apps wait --account <account_uuid> --app <app_uuid> --status running --timeout 300
cdnctl container apps status --account <account_uuid> --app <app_uuid>
cdnctl container apps logs --account <account_uuid> --app <app_uuid> --tail 100

تأیید با AWS CLI و مسیر عمومی

curl -fsS https://api.example.com/health
export AWS_REQUEST_CHECKSUM_CALCULATION=when_required
export AWS_RESPONSE_CHECKSUM_VALIDATION=when_required
aws --endpoint-url https://s3.cdn.com.tr s3api list-buckets
aws --endpoint-url https://s3.cdn.com.tr s3api put-object --bucket <bucket> --key smoke.txt --body ./smoke.txt
aws --endpoint-url https://s3.cdn.com.tr s3api head-object --bucket <bucket> --key smoke.txt