Lo que necesitas (60 segundos)
Una sola cosa: un plan de cdn.com.tr que incluya la plataforma de contenedores — todos los planes estándar la incluyen. Instala la CLI con la línea de abajo e inicia sesión. Funciona igual en Linux, macOS y Windows; también hay repos APT/YUM, Homebrew y una imagen Docker si prefieres un gestor de paquetes.
$ curl -fsSL https://cdn.com.tr/downloads/cdnctl/install.sh | sh
$ cdnctl login --email you@company.com
Paso 1 — cdnctl init: deja que la carpeta se presente
Ejecuta init dentro del directorio del proyecto. Detecta el stack y el puerto, escribe un pequeño manifiesto cdnctl.yaml y deja una sección de deploy en AGENTS.md para que tu agente de programación con IA también aprenda el flujo. Además comprueba tu cuenta: si falta la plataforma de contenedores, imprime el enlace de compra exacto — y con --wait simplemente se queda en pausa hasta que tu pago se complete en el navegador, y luego continúa por sí solo.
$ cdnctl init
Proje : gorev-takip (node/express, port 3000)
Agent : claude-code (claude on PATH), cursor
Paket : ✓ Large (max 5 app)
Karne : 2 HATA, 2 uyarı — ayrıntı: cdnctl check
Yazıldı : cdnctl.yaml, AGENTS.md
→ Önce `cdnctl check` hatalarını düzeltin (deploy sonrası site açılmaz).
Paso 2 — cdnctl check: corrígelo mientras es barato
check es un linter local de desplegabilidad. Los errores (romperían el sitio en producción) detienen el deploy; las advertencias no. Las correcciones suelen ser de una línea: haz bind a 0.0.0.0 en lugar de 127.0.0.1, mueve el token hard-coded a --secret, añade un GET /health que devuelva 200, lee el puerto desde la variable de entorno PORT.
$ cdnctl check
[ERROR] bind-localhost (server.js:61)
The app binds to 127.0.0.1 — unreachable inside a container.
→ Bind to 0.0.0.0 (just drop the host argument).
[ERROR] secret-in-code (server.js:10)
A hard-coded secret (API key/token/password).
→ Move it to --secret KEY=VALUE; read it via process.env.
[WARNING] sqlite-single-pod
SQLite loses data on restart / multiple replicas.
→ Mount a persistent disk or switch to a managed database.
[WARNING] no-healthcheck
No /health route — the platform can’t tell your app is alive.
Paso 3 — cdnctl deploy: entra la carpeta, sale la URL
deploy archiva la carpeta (node_modules y .git nunca viajan), la sube, la construye en el sandbox de la plataforma y la publica. Las líneas de progreso significan exactamente lo que dicen; cuando veas LIVE, la URL ya está sirviendo por HTTPS. Las actualizaciones son el mismo comando — el nuevo build reemplaza al viejo solo cuando ya está en pie.
$ cdnctl deploy
→ archiving source (gorev-takip)
→ uploading (0.1 MB)
→ starting build (Kaniko, isolated sandbox)
build: running
build: success (41 s)
→ creating the app
→ assigning a subdomain
→ first deploy
→ waiting for the app to come up
✓ LIVE: https://ca…….cdn.com.tr
¿Aún sin plan? El apretón de manos con el navegador
Si init no encuentra la plataforma de contenedores en tu cuenta, te envía a la página de compra con contexto — la página muestra un banner confirmando que cdnctl te envió y marca el plan recomendado. Paga en el navegador como de costumbre; la página de confirmación te dice que vuelvas a la terminal, y cdnctl (con --wait, o simplemente ejecutando init de nuevo) retoma el flujo automáticamente. Sin copiar claves, sin configuración.
Límites y la letra pequeña honesta
Las subidas de código fuente están limitadas a 128 MB — de sobra en cuanto node_modules se queda en casa. Un build típico tarda alrededor de un minuto. Si tu app necesita conservar ficheros, pide un disco persistente en el momento del deploy o usa object storage; si usa SQLite, considera la base de datos gestionada — check te seguirá recordando por qué. Y si un build falla, cdnctl imprime el log del build directamente; la causa más común la primera vez es un Dockerfile que copia node_modules desde tu máquina (añádelo a .dockerignore).
Preguntas frecuentes
¿Puedo conectar mi propio dominio?
Sí — la app recibe un subdominio funcional de inmediato, y después puedes conectar tu propio dominio desde el panel o la CLI.
¿Dónde están mis logs?
cdnctl container apps show y la pestaña Salud del panel cubren el estado; los logs de build los imprime cdnctl deploy cuando falla, y los logs de ejecución viven en el panel.
¿Puedo ejecutar más de una app?
Sí; tu plan fija la cuota de apps. Cada carpeta de proyecto se despliega como su propia app con su propia URL.
Mi agente de IA escribe el código — ¿puede desplegar también?
Sí. init ya le enseña los comandos mediante AGENTS.md; dale un token solo-deploy (cdnctl deploy-token create) para que pueda publicar sin tener nunca la contraseña de tu cuenta.