Despliegue en Dokploy
Es la vía recomendada: Dokploy construye las imágenes desde tu repositorio, gestiona los certificados y reinicia solo el servicio que cambió.
Lo que vas a crear
Tres aplicaciones y dos servicios de datos:
Aplicaciones API · Web · Worker
Servicios PostgreSQL · Redis
Volumen zapi-files-dataCrear PostgreSQL y Redis
Desde Dokploy, crea un servicio PostgreSQL 16 y otro Redis 7. Anota sus credenciales: las necesitarás en las tres aplicaciones.
Conéctate a PostgreSQL una vez y habilita la extensión:
CREATE EXTENSION IF NOT EXISTS pgcrypto;Crear el volumen de archivos
Crea un volumen llamado zapi-files-data y móntalo en API y Worker con la misma
ruta interna:
Mount path: /var/lib/zapi/filesSi las rutas internas no coinciden, o si cada servicio monta un volumen distinto, se rompen las miniaturas, las importaciones, las marcas de agua y las imágenes generadas con IA. No lo montes en Web: no lo necesita.
Crear las tres aplicaciones
Las tres apuntan al mismo repositorio y rama, con contexto raíz:
| Aplicación | Dockerfile | Context | Dominio | Puerto |
|---|---|---|---|---|
| API | Dockerfile.api | . | api.zapisocial.com | 3001 |
| Web | Dockerfile.web | . | zapisocial.com y app.zapisocial.com | 3000 |
| Worker | Dockerfile.worker | . | ninguno | — |
No definas un Start Command manual: cada imagen ya trae el suyo.
Configurar las variables
Cada aplicación recibe solo lo que usa. Está detallado en Variables de entorno.
Vigilar solo lo que cambió
Cada aplicación tiene un campo Watch Paths. Sin él, un cambio de documentación reinicia el Worker mientras está entregando publicaciones.
| Aplicación | Rutas |
|---|---|
| Web | apps/web/**, packages/{ui,contracts,api-client}/**, Dockerfile.web |
| API | apps/api/**, packages/{contracts,database,file-ingestion}/**, Dockerfile.api |
| Worker | apps/worker/**, packages/{contracts,database,file-ingestion}/**, Dockerfile.worker |
Las tres añaden además package.json, bun.lock, turbo.json y tsconfig.json.
Añade cada ruta por separado con el botón +. Si las pegas todas juntas separadas
por espacios se crea un único patrón que no coincide con nada, y esa aplicación deja
de desplegarse en silencio.
Aplicar las migraciones
Una vez que la API tiene su DATABASE_URL, ejecuta en su consola:
bun --filter @workspace/database db:migrateRepite este paso en cada versión que incluya migraciones.
Desplegar
Despliega API, luego Worker, luego Web. Comprueba que la API responde antes de seguir:
GET https://api.zapisocial.com/v1/healthDebe devolver status, database y redis en ok.
Certificados
Activa HTTPS en los tres dominios. No expongas PostgreSQL ni Redis con dominio público.