Loading...

دراسات الحالة

ترحيل تطبيق Docker وKubernetes إلى Managed Container App

دليل ترحيل عملي لنقل حاوية Docker موجودة أو نشر Kubernetes أو خلفية تطبيق جوال إلى 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 بعد وجود الحساب.
  • استخدم نطاقاً خدمياً كـ api.example.com إذا سيُربط النطاق النهائي لاحقاً.
2

تأكيد استحقاقات المنصة المُدارة

تأكد أن استحقاقات Managed Container تتضمن Container App وRedis وDB وObject Storage والتخزين الدائم والمهام المجدولة قبل إنشاء التطبيق.

  • إذا كان تخصيص Redis أو DB صفراً، توقف وعيِّن حزمة قادرة على الترحيل قبل استيراد البيانات.
  • استخدم خطط Standard أو أعلى للتطبيقات التي تبدأ عمال متعددين أو تُهيئ قاعدة بيانات كبيرة عند التشغيل.
  • يُفتَح التوجيه العام عبر CDN edge reverse proxy فقط بعد اجتياز فحوصات DNS وSSL والصحة.
3

بدء معالج الترحيل

افتح تدفق إنشاء Container App من Platforms وأدخل تفاصيل التطبيق كترحيل تطبيق Docker/Kubernetes قائم. اختر نقطة تسليم حالية للنطاق أو اتركه فارغاً حتى يكون DNS جاهزاً.

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

إضافة بيانات اعتماد السجل

أنشئ رمزاً للقراءة فقط من Docker Hub أو السجل الخاص، ثم أدخله في Registry Credential. يُستخدَم فقط لسحب الصورة ولا يُحقَن كمتغير بيئة أو سر.

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 ومزود الشحن ورمز مزامنة الشحن في حقول Secret المُخفاة. لا تُعاد هذه القيم لاحقاً في ردود GET.

7

تفعيل Managed Redis

فعِّل Managed Redis. لا تدخل host أو port أو password؛ يربط النظام REDIS_URL بالتطبيق كمتغير بيئة/سر.

8

إنشاء Managed DB واستيراد التفريغ

أنشئ Managed Database ثم ارفع تفريغ .sql أو .sql.gz من النظام المصدر. لا يُفتَح التوجيه العام حتى يكتمل الاستيراد. إذا فشل الاستيراد، ألغِ سجل الاستيراد الفاشل قبل رفع التفريغ المُصحَّح مجدداً.

9

استيراد أرشيف الملفات الدائمة

فعِّل التخزين الدائم لـ /app/data وارفع أرشيف media/data المصدر بصيغة .tar.gz مع الإبقاء على مسار التثبيت الهدف /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

المراجعة والنشر والتحقق

راجع الصورة والنطاق وRedis وDB والتخزين والأسرار والمهام المجدولة. ابدأ Deploy ثم تابع الجدول الزمني للعمليات والحالة والسجلات.

مصادر بيانات الاعتماد وملفات الاستيراد

مصادر بيانات الاعتماد

  • رمز API لـ CDN.com.tr: أنشئه من Authorization / API Tokens؛ يظهر مرة واحدة فقط.
  • رمز سجل Docker: أنشئ رمز قراءة فقط من مزود السجل.
  • مفتاح OpenAI: أنشئه من صفحة مفاتيح API في لوحة تحكم OpenAI؛ دوِّره إذا تعذَّر عرض المفتاح القديم.
  • رموز Meta وWhatsApp وTikTok: احصل عليها من بوابة المطور ذات الصلة وأضف نطاق التطبيق مثل api.example.com كـ callback/domain عند الضرورة.
  • مفتاح/سر WooCommerce: أنشئه من WordPress admin، WooCommerce، Settings، Advanced، REST API.

ملفات الاستيراد

  • تفريغ قاعدة البيانات: صدِّره باستخدام mysqldump أو phpMyAdmin أو RDS export أو لوحة الاستضافة الحالية.
  • أرشيف التخزين الدائم: جهِّز مجلدات upload/media/data بصيغة .tar.gz.
  • رمز مزامنة الشحن: أنشئ سراً عشوائياً جديداً؛ استخدم نفس القيمة في سر التطبيق ورأس المهمة المجدولة.
  • لا تُكتَب الأسرار الإنتاجية في المستندات أو السجلات أو التذاكر.

عوائق الترحيل الشائعة

  • تجاوز حد Redis أو DB يعني أن حزمة الحساب غير جاهزة لهذا الترحيل؛ لا تضع بيانات الاعتماد المُدارة في حقول env المرئية كحل بديل.
  • HTTP 413 أثناء استيراد DB/ملف يعني أن حد رفع الويب/PHP لا يزال أقل من حجم الأرشيف حتى لو أجاز التحقق من API الملفات الكبيرة.
  • تحميلات العميل عبر CDN تحتاج أيضاً لحجم ملف حزمة CDN كافٍ لأن تهيئة الحافة تستخدمه كـ nginx client_max_body_size.
  • عادةً ما يعني ErrImagePull أن بيانات اعتماد السجل مفقودة أو غير محددة أو غير صالحة. حدد بيانات الاعتماد المحفوظة للقراءة فقط وأعد النشر.
  • عادةً ما يعني Exit code 137 نفاد الذاكرة. ابدأ بخطة أكبر أو قلل عدد العمال للنشر الأول.
  • يعني waiting_dns أن المضيف ليس نقطة تسليم CDN جاهزة بعد. أضف النطاق تحت Content Delivery Points وأكمل DNS/SSL قبل توقع نجاح فحوصات الصحة العامة.
  • في اختبارات دخان S3، إذا نجح put-object لكن head-object أعطى 403، تحقق من ملكية bucket/key ومسار S3 passthrough في CDN.

سير عمل الطرفية مع cdnctl وAWS CLI

استخدم cdnctl باعتباره سير عمل الطرفية الرئيسي. استدعاءات REST الخام مخصصة لفحوصات المكافئة أو Troubleshooting فقط، و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