Apps multi-servicio (estilo compose)
Una app puede correr varios contenedores — ej. un frontend web más un cache o una base de datos internos. Es la versión de la plataforma de un stack de Compose: 1 app = N servicios, pero cuenta como una unidad en tu cuota.
Reglas
- Pasás un array
services(al menos uno). - Exactamente uno debe ser
public: true— ese se queda con el dominio HTTPS de la app. - Los servicios internos (
public:false) no se exponen a internet. Viven en una red privada por-app y son alcanzables por los otros servicios por suname(ej.http://cache:6379). - Cada servicio puede usar su propia
image, o buildear desde unrepocompartido a nivel app. repo/branch/repoTokenquedan a nivel app (un repo para el stack);port/env/cpu/memory/ secrets son por servicio.
Ejemplo — web público + redis interno
curl -s -X POST $API/deploy \
-H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \
-d '{
"name": "shop",
"services": [
{ "name": "web", "image": "acme/storefront:1.0", "port": 8080, "public": true,
"env": { "REDIS_URL": "redis://cache:6379" } },
{ "name": "cache", "image": "redis:7-alpine", "port": 6379, "public": false }
]
}'
https://shop.cynchro.cloud→ el contenedor web.webalcanza acachepor la red privada enredis://cache:6379.cachees invisible desde internet.
Campos de cada servicio
| Campo | Requerido | Notas |
|---|---|---|
name | ✅ | DNS-safe; también es el hostname interno. |
image | ✅* | Imagen prearmada, O omitir para buildear desde el repo a nivel app. |
dockerfile / context | Cuando buildea desde repo (rutas relativas). | |
port | Default 80. Puerto donde escucha el servicio. | |
public | true para el único servicio expuesto a internet. | |
domain | Override del hostname del servicio público. | |
cpu / memory | Límites por servicio. | |
env | Env por servicio (cifrado at-rest). | |
envFrom / secretFiles | Referencias a Secrets por servicio. |
* Cada servicio necesita su propia image o un repo a nivel app para buildear.
Buildear todos los servicios desde un repo
-d '{
"name": "stack",
"repo": "https://github.com/acme/monorepo",
"services": [
{ "name":"api", "dockerfile":"api/Dockerfile", "context":"api", "port":3000, "public":true },
{ "name":"worker", "dockerfile":"worker/Dockerfile", "context":"worker", "port":0, "public":false }
]
}'
El repo se clona una vez y cada servicio se buildea desde su propio Dockerfile.
Ciclo de vida
Restart / stop / delete actúan sobre toda la app (todos sus contenedores). Borrarla también destruye la red privada. El self-healing vigila cada contenedor — si alguno cae, se redesplega la app.
→ Volver a lo básico: Desplegar desde Git · Inyectar config: Secrets