7.4 KiB
Despliegue en Coolify — Moraworld Imports
TL;DR — Coolify gestiona Postgres + Redis. Solo necesitas el repo,
coolify-compose.ymly las variables de.env.example.
1️⃣ Requisitos previos
- Servidor con Docker 24+ y Coolify instalado (
curl -fsSL https://get.coolify.io | bash) - Dominio propio con DNS apuntando al servidor (A/AAAA + wildcard
*.tu-dominio.com) - Cuenta GitHub/GitLab con el repo clonado
2️⃣ Crear Project en Coolify
- Projects → New Project → nombre:
moraworld-imports - Resources → New → Docker Compose
- Repository:
https://github.com/lizandrogd/moraworld-imports - Branch:
main - Compose file:
coolify-compose.yml - Build pack:
Dockerfile(auto-detectado)
- Repository:
3️⃣ Servicios gestionados (managed services)
En el projecto → Services → Add Service:
| Servicio | Tipo | Nombre lógico | Notas |
|---|---|---|---|
| PostgreSQL | PostgreSQL 16 |
postgres |
Coolify inyecta DATABASE_URL |
| Redis | Redis 7 |
redis |
Coolify inyecta REDIS_URL |
| MinIO (opcional) | MinIO |
minio |
Solo si no usas S3 externo; expón puertos 9000/9001 |
Importante: Los nombres lógicos (
postgres,redis) deben coincidir con los hostnames usados enDATABASE_URL/REDIS_URLsi los escribes a mano. Coolify los resuelve automáticamente.
4️⃣ Variables de entorno
En Project → Environment Variables, añade una por una (no pegues el bloque completo):
| Variable | Ejemplo / Generación |
|---|---|
NODE_ENV |
production |
NEXT_PUBLIC_API_URL |
https://api.tu-dominio.com |
NEXT_PUBLIC_WS_URL |
https://api.tu-dominio.com |
JWT_SECRET |
openssl rand -base64 48 |
JWT_REFRESH_SECRET |
openssl rand -base64 48 (distinto) |
AUDIT_HMAC_SECRET |
openssl rand -hex 32 |
CORS_ORIGINS |
https://app.tu-dominio.com,https://www.tu-dominio.com |
S3_ENDPOINT |
https://s3.tu-proveedor.com (o vacío para disco local) |
S3_ACCESS_KEY |
minioadmin |
S3_SECRET_KEY |
minioadmin |
S3_BUCKET |
moraworld-imports |
S3_REGION |
us-east-1 |
S3_PUBLIC_URL |
https://cdn.tu-dominio.com |
STRIPE_WEBHOOK_SECRET |
whsec_... (de Stripe Dashboard) |
No pongas claves de Zeptomail, SENAE, Amazon, Twilio, WhatsApp, etc. aquí. Se configuran en Admin → Integraciones tras el primer deploy.
5️⃣ Dominios y TLS
En Project → Domains añade:
| Dominio | Servicio | Puerto | TLS |
|---|---|---|---|
api.tu-dominio.com |
api |
3001 |
✅ Auto |
app.tu-dominio.com |
web |
3000 |
✅ Auto |
ws.tu-dominio.com |
api |
3001 |
✅ Auto (WebSocket) |
Coolify genera certificados Let's Encrypt automáticos y renueva cada 60 días.
WebSocket: el gateway corre en
/wsbajo el mismo puerto 3001. El dominiows.tu-dominio.comapunta al mismo servicioapi.
6️⃣ Health Checks
Coolify usa los health checks del docker-compose para saber cuándo el servicio está listo:
- API:
GET http://localhost:3001/api/health→ 200 OK - Web:
GET http://localhost:3000/status→ 200 OK (creaapps/web/public/status.txtconoksi no existe)
Si el health check falla, Coolify reintenta según retries y start_period.
7️⃣ Primer deploy y post-configuración
- Deploy → espera a que ambos servicios estén "Healthy"
- Entra a
https://app.tu-dominio.com - Regístrate (primer usuario =
SUPER_ADMINautomático si BD vacía) - Ve a Admin → Configuración → Integraciones y guarda:
- Zeptomail:
zeptomail_api_key,email_from,email_from_name - SENAE:
senae_endpoint,senae_api_key,senae_ruc,senae_agent_code - Stripe:
stripe_public_key,stripe_secret_key,stripe_webhook_secret - Amazon SP-API:
amazon_client_id,amazon_client_secret,amazon_refresh_token - Twilio SMS:
sms_account_sid,sms_auth_token,sms_from_number - WhatsApp Business:
whatsapp_api_token,whatsapp_phone_number_id - Couriers (FedEx/DHL/UPS), INEN, Bodega, etc. según necesites
- Zeptomail:
- Stripe Webhook en Dashboard →
https://api.tu-dominio.com/api/payments/webhook?tenant=mi-tenant-slug- Eventos:
checkout.session.completed,checkout.session.expired
- Eventos:
8️⃣ Actualizaciones
Auto-deploy (recomendado):
- Project → Settings → Auto Deploy = ON
- Push a
main→ Coolify detecta, build y despliega sin downtime (rolling update)
Manual:
- Project → Deploy → Force rebuild si cambiaste Dockerfile o dependencias
9️⃣ Backups y recuperación
- PostgreSQL: Coolify → Service
postgres→ Backups → Schedule (diario/semanal) - Redis: No crítico (cache/sesiones), pero puedes snapshottear
- MinIO: Versiona el bucket o replica a otro S3
- Código: GitHub es la fuente de verdad
Para restaurar: detén servicios → restaura dump SQL → pnpm prisma db push → reinicia.
🔟 Troubleshooting rápido
| Síntoma | Causa probable | Solución |
|---|---|---|
| API 502 / health fail | DATABASE_URL mal formada |
Revisa variable; usa hostname postgres |
| WebSocket no conecta | Dominio ws. no apunta a api |
Añade dominio ws.tu-dominio.com → servicio api |
| CORS error | CORS_ORIGINS sin tu frontend |
Añade https://app.tu-dominio.com |
| Stripe webhook 404 | URL mal escrita en Dashboard | Debe ser /api/payments/webhook?tenant=<slug> |
| Prisma migrate fail | prisma db push en prod |
Usa prisma migrate deploy en CI si migras schema |
| Uploads 404 | S3_ENDPOINT vacío pero archivos en disco |
Configura MinIO/S3 o sirve /uploads vía reverse proxy |
📁 Estructura de archivos Coolify
moraworld-imports/
├── coolify-compose.yml # ← Coolify usa este archivo
├── .env.example # ← Copia valores a Coolify UI
├── apps/
│ ├── api/Dockerfile # Multi-stage, standalone node
│ └── web/Dockerfile # Next.js standalone output
├── packages/database/ # Prisma schema
└── COOLIFY.md # ← Este archivo
🔐 Secrets management
Coolify encripta las variables marcadas como Secret en la UI. Para rotar secrets:
- Genera nuevo valor local
- Actualiza en Coolify → Environment Variables
- Redeploy (rolling, cero downtime)
📊 Monitoring básico
- Logs: Coolify → Service → Logs (stdout/stderr)
- Metrics: Coolify → Service → Metrics (CPU, RAM, Network)
- Uptime: Configura Uptime Kuma / Better Uptime apuntando a
/api/healthy/status
🚀 Checklist pre-producción
JWT_SECRETyJWT_REFRESH_SECRETúnicos, 48+ chars base64AUDIT_HMAC_SECRET32+ chars hexCORS_ORIGINSsolo tus dominios reales (sin*)DATABASE_URLapunta a Postgres gestionado por CoolifyREDIS_URLapunta a Redis gestionado por Coolify- Dominios
api.,app.,ws.creados en Coolify con TLS - Health checks pasan en ambos servicios
- Integraciones guardadas en Admin UI
- Stripe webhook registrado y probado
- Backup automático de Postgres configurado
¿Problemas? Revisa logs en Coolify → Service → Logs. La mayoría son variables de entorno mal escritas o health checks que tardan más de start_period.