Loading...

Études de cas

Migration d'application Docker et Kubernetes vers Managed Container App

Un guide de migration pratique pour déplacer un conteneur Docker existant, un déploiement Kubernetes ou un backend d'application mobile vers CDN.com.tr Managed Container App avec Managed Redis, base de données gérée, Object Storage, tâches planifiées, domaine, SSL, CDN et WAF.

Retour à l'Aide Plateforme
Aucun outil interne requis

Le flux ne nécessite pas kubectl, SSH, commandes d'import artisan ni modifications directes de base de données. Les outils internes restent uniquement du côté vérification et débogage de CDN.com.tr.

Flux de l'interface du panneau

1

Créer ou sélectionner un compte CDN

Connectez-vous d'abord à CDN.com.tr. Si le client n'a pas encore de compte CDN pour cette application, créez-en un depuis CDN Accounts ou l'assistant de configuration, puis sélectionnez-le avant d'ouvrir Platforms.

  • L'assistant de configuration crée la structure du compte CDN et la relation avec le package.
  • La migration de Container App elle-même continue depuis Platforms après l'existence du compte.
  • Utilisez un domaine fictif ou de service comme api.example.com lorsque le domaine final sera connecté plus tard.
2

Confirmer les droits de la plateforme gérée

Confirmez que les droits Managed Container incluent Container App, Redis, DB, Object Storage, stockage persistant et tâches planifiées avant de créer l'app.

  • Si l'allocation Redis ou DB est 0, arrêtez-vous et assignez un package capable de migration avant d'importer des données.
  • Utilisez des plans Standard ou supérieurs pour les apps qui démarrent plusieurs workers ou initialisent une grande base de données au démarrage.
  • Le routage public est ouvert via le CDN edge reverse proxy uniquement après que les vérifications DNS, SSL et de santé réussissent.
3

Démarrer l'Assistant de Migration

Ouvrez le flux de création Container App depuis Platforms et saisissez les détails de l'application comme migration d'une app Docker/Kubernetes existante. Choisissez un point de livraison existant pour le domaine, ou laissez le domaine personnalisé vide jusqu'à ce que DNS soit prêt.

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

Ajouter un identifiant de registre

Créez un token en lecture seule depuis Docker Hub ou le registre privé, puis saisissez-le dans Registry Credential. Il est utilisé uniquement pour la récupération d'image, pas injecté dans l'app comme env ou secret.

5

Saisir les valeurs d'environnement

Saisissez les paramètres runtime non secrets au format 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

Saisir les secrets

Saisissez les valeurs OpenAI, Meta, WhatsApp, WooCommerce, TikTok, fournisseur d'expédition et token de synchronisation d'expédition dans les champs Secret masqués. Ces valeurs ne sont pas renvoyées ultérieurement dans les réponses GET.

7

Activer Managed Redis

Activez Managed Redis. Ne saisissez pas de host, port ou mot de passe ; le système lie REDIS_URL à l'app comme env/secret.

8

Créer Managed DB et importer le dump

Créez Managed Database, puis téléversez le dump .sql ou .sql.gz du système source. Le routage public ne s'ouvre pas tant que l'import n'est pas terminé. Si l'import échoue, annulez l'enregistrement d'import échoué avant de téléverser à nouveau le dump corrigé.

9

Importer l'archive de fichiers persistants

Activez le stockage persistant pour /app/data, téléversez l'archive media/data source en .tar.gz et conservez le chemin de montage cible /app/data. Si l'import d'archive échoue, annulez l'enregistrement d'import échoué avant de réessayer ou de déployer.

10

Créer une tâche planifiée

Créez d'abord order-shipping-sync désactivé, exécutez-le manuellement, puis activez la planification après vérification.

  • 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

Examiner, déployer et vérifier

Examinez l'image, le domaine, Redis, DB, le stockage, les secrets et les tâches planifiées. Démarrez Deploy, puis surveillez la chronologie des opérations, l'état et les journaux.

D'où viennent les identifiants et les fichiers d'import

Sources des identifiants

  • Token API CDN.com.tr : créez-le depuis Authorization / API Tokens ; il n'est visible qu'une seule fois.
  • Token de registre Docker : créez un token en lecture seule depuis le fournisseur de registre.
  • Clé OpenAI : créez-la depuis la page des clés API du tableau de bord OpenAI ; faites-la pivoter si l'ancienne clé ne peut pas être consultée.
  • Tokens Meta, WhatsApp et TikTok : obtenez-les depuis le portail développeur concerné et ajoutez le domaine de l'application, comme api.example.com, comme callback/domain si nécessaire.
  • Clé/secret WooCommerce : créez-les depuis WordPress admin, WooCommerce, Settings, Advanced, REST API.

Fichiers d'import

  • Dump DB : exportez-le avec mysqldump, phpMyAdmin, export RDS ou le panneau d'hébergement actuel.
  • Archive persistante : préparez les dossiers upload/media/data en .tar.gz.
  • Token de synchronisation d'expédition : générez un nouveau secret aléatoire ; utilisez la même valeur dans le secret de l'app et l'en-tête de la tâche planifiée.
  • Les secrets de production ne doivent pas être écrits dans des documents, journaux ou tickets.

Blocages de migration courants

  • Redis ou DB limit exceeded signifie que le package du compte n'est pas prêt pour cette migration ; ne collez pas les identifiants gérés dans des valeurs env visibles comme solution de contournement.
  • HTTP 413 lors de l'import DB/fichier signifie qu'une limite de téléversement web/PHP est encore inférieure à la taille de l'archive, même si la validation API autorise les grands fichiers.
  • Les téléversements côté client ont également besoin que la taille de fichier du package CDN soit suffisante, car la configuration edge l'utilise comme nginx client_max_body_size.
  • ErrImagePull signifie généralement que l'identifiant de registre était manquant, non sélectionné ou invalide. Sélectionnez l'identifiant en lecture seule sauvegardé et redéployez.
  • Exit code 137 signifie que l'app a probablement manqué de mémoire. Commencez avec un plan plus grand ou réduisez le nombre de workers pour le premier déploiement.
  • waiting_dns signifie que le nom d'hôte n'est pas encore un point de livraison CDN prêt. Ajoutez le domaine sous Content Delivery Points et terminez DNS/SSL avant d'attendre que les vérifications de santé publiques réussissent.
  • Pour les tests de fumée S3, si put-object fonctionne mais que head-object échoue, vérifiez la propriété bucket/key et la route S3 passthrough du CDN.

Flux terminal avec cdnctl et AWS CLI

Utilisez cdnctl comme flux de travail terminal principal. Les appels REST bruts sont uniquement pour les vérifications d'équivalence API ou le dépannage, et AWS CLI est utilisé uniquement pour la vérification Object Storage compatible S3.

Flux cdnctl principal

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

Vérification avec AWS CLI et route publique

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