Loading...

Casos de estudio

Migración de aplicación Docker y Kubernetes a Managed Container App

Una guía de migración práctica para mover un contenedor Docker existente, un despliegue de Kubernetes o un backend de aplicación móvil a CDN.com.tr Managed Container App con Managed Redis, base de datos gestionada, Object Storage, tareas programadas, dominio, SSL, CDN y WAF.

Volver a la Ayuda de la Plataforma
No se requiere ninguna herramienta interna

El flujo no requiere kubectl, SSH, comandos de importación artisan ni cambios directos en la base de datos. Las herramientas internas permanecen solo en el lado de verificación y depuración de CDN.com.tr.

Flujo de interfaz del panel

1

Crear o seleccionar una cuenta CDN

Inicia sesión en CDN.com.tr primero. Si el cliente no tiene ya una cuenta CDN para esta aplicación, crea una desde CDN Accounts o el asistente de configuración, luego selecciónala antes de abrir Platforms.

  • El asistente de configuración crea el shell de la cuenta CDN y la relación con el paquete.
  • La propia migración de Container App continúa desde Platforms después de que exista la cuenta.
  • Usa un dominio de marcador de posición o de servicio como api.example.com cuando el dominio final se conectará más adelante.
2

Confirmar los derechos de la plataforma gestionada

Confirma que los derechos de Managed Container incluyen Container App, Redis, DB, Object Storage, almacenamiento persistente y tareas programadas antes de crear la app.

  • Si la asignación de Redis o DB es 0, detente y asigna un paquete con capacidad de migración antes de importar datos.
  • Usa planes Standard o superiores para apps que inicien múltiples workers o inicialicen una base de datos grande al arrancar.
  • El enrutamiento público se abre a través del CDN edge reverse proxy solo después de que pasen las verificaciones de DNS, SSL y salud.
3

Iniciar el Asistente de Migración

Abre el flujo de creación de Container App desde Platforms e introduce los detalles de la aplicación como una migración de app Docker/Kubernetes existente. Elige un punto de entrega existente para el dominio, o deja el dominio personalizado vacío hasta que DNS esté listo.

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

Añadir credencial de registro

Crea un token de solo lectura desde Docker Hub o el registro privado, luego introdúcelo en Registry Credential. Se usa solo para la extracción de imágenes, no se inyecta en la app como env o secreto.

5

Introducir valores de entorno

Introduce los ajustes de runtime no secretos en formato 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

Introducir secretos

Introduce los valores de OpenAI, Meta, WhatsApp, WooCommerce, TikTok, proveedor de envíos y token de sincronización de envíos en campos Secret enmascarados. Estos valores no se devuelven posteriormente en respuestas GET.

7

Activar Managed Redis

Activa Managed Redis. No introduzcas host, puerto ni contraseña; el sistema vincula REDIS_URL a la app como env/secreto.

8

Crear Managed DB e importar el volcado

Crea Managed Database, luego sube el volcado .sql o .sql.gz del sistema de origen. El enrutamiento público no se abre hasta que la importación esté completa. Si la importación falla, cancela el registro de importación fallido antes de subir el volcado corregido de nuevo.

9

Importar el archivo de archivos persistentes

Activa el almacenamiento persistente para /app/data, sube el archivo de media/data de origen como .tar.gz y mantén la ruta de montaje objetivo como /app/data. Si la importación del archivo falla, cancela el registro de importación fallido antes de reintentar o desplegar.

10

Crear tarea programada

Crea order-shipping-sync desactivado primero, ejecútalo manualmente y luego activa el programa tras la verificación.

  • 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

Revisar, desplegar y verificar

Revisa la imagen, el dominio, Redis, DB, almacenamiento, secretos y tareas programadas. Inicia Deploy, luego observa la línea de tiempo de operaciones, el estado y los registros.

De dónde vienen las credenciales y los archivos de importación

Fuentes de credenciales

  • Token de API de CDN.com.tr: créalo desde Authorization / API Tokens; solo es visible una vez.
  • Token de registro Docker: crea un token de solo lectura desde el proveedor de registros.
  • Clave de OpenAI: créala desde la página de claves API del dashboard de OpenAI; rótala si la clave antigua no se puede ver.
  • Tokens de Meta, WhatsApp y TikTok: obtenlos del portal de desarrolladores correspondiente y añade el dominio de la aplicación, como api.example.com, como callback/domain cuando sea necesario.
  • Clave/secreto de WooCommerce: créalos desde WordPress admin, WooCommerce, Settings, Advanced, REST API.

Archivos de importación

  • Volcado de DB: expórtalo usando mysqldump, phpMyAdmin, exportación RDS o el panel de hosting actual.
  • Archivo persistente: prepara las carpetas de upload/media/data como .tar.gz.
  • Token de sincronización de envíos: genera un nuevo secreto aleatorio; usa el mismo valor en el secreto de la app y el encabezado de la tarea programada.
  • Los secretos de producción no deben escribirse en documentos, registros ni tickets.

Bloqueos de migración comunes

  • Redis o DB limit exceeded significa que el paquete de la cuenta no está listo para esta migración; no pegues las credenciales gestionadas en valores de env visibles como solución alternativa.
  • HTTP 413 durante la importación de DB/archivo significa que un límite de carga de web/PHP sigue siendo inferior al tamaño del archivo, aunque la validación de API permita archivos grandes.
  • Las cargas orientadas al cliente también necesitan que el tamaño de archivo del paquete CDN sea suficiente, porque la configuración del edge lo usa como nginx client_max_body_size.
  • ErrImagePull generalmente significa que la credencial de registro estaba ausente, no seleccionada o no era válida. Selecciona la credencial de solo lectura guardada y vuelve a desplegar.
  • Exit code 137 significa que la app probablemente se quedó sin memoria. Empieza con un plan más grande o reduce el número de workers para el primer despliegue.
  • waiting_dns significa que el nombre de host aún no es un punto de entrega CDN listo. Añade el dominio bajo Content Delivery Points y completa DNS/SSL antes de esperar que pasen las verificaciones de salud pública.
  • En las pruebas de humo de S3, si put-object funciona pero head-object falla, verifica la propiedad del bucket/key y la ruta S3 passthrough del CDN.

Flujo por terminal con cdnctl y AWS CLI

Usa cdnctl como el flujo de trabajo principal de terminal. Las llamadas REST directas son solo para verificaciones de equivalencia de API o resolución de problemas, y AWS CLI se usa solo para verificación de Object Storage compatible con S3.

Flujo principal de 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

Verificación con AWS CLI y ruta pública

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