# Despliegue en Coolify ## Arquitectura recomendada | Servicio Coolify | Repo / Dockerfile | Puerto | |------------------|-------------------|--------| | **moraworld-web** | `apps/web/Dockerfile` (build context: raíz del monorepo) | 3000 | | **moraworld-api** | `apps/api/Dockerfile` (build context: raíz del monorepo) | 3001 | | **PostgreSQL** | Servicio Coolify o externo | 5432 | | **Redis** | Servicio Coolify o externo | 6379 | ## Variables de entorno ### API (`moraworld-api`) ``` DATABASE_URL=postgresql://USER:PASS@HOST:5432/moraworld REDIS_URL=redis://HOST:6379 API_PORT=3001 JWT_SECRET= CORS_ORIGINS=https://tu-dominio.com NODE_ENV=production ``` ### Web (`moraworld-web`) ``` NEXT_PUBLIC_API_URL=https://api.tu-dominio.com PORT=3000 NODE_ENV=production ``` > En build de Coolify para **web**, pasar `NEXT_PUBLIC_API_URL` como **build argument** si usas Dockerfile (ya declarado en `apps/web/Dockerfile`). ## Build en Coolify 1. Conectar repositorio Git. 2. Crear **dos aplicaciones** desde el mismo repo: ### Aplicación API - **Build Pack:** Dockerfile - **Dockerfile location:** `apps/api/Dockerfile` - **Base directory / Context:** `/` (raíz del monorepo) - **Health check path:** `/api/health` - **Puerto expuesto:** 3001 ### Aplicación Web - **Build Pack:** Dockerfile - **Dockerfile location:** `apps/web/Dockerfile` - **Base directory / Context:** `/` - **Health check path:** `/` - **Puerto expuesto:** 3000 ## Migraciones en producción Ejecutar una vez (o en CI) antes/después del deploy de API: ```bash pnpm db:generate pnpm exec prisma migrate deploy --schema=packages/database/prisma/schema.prisma ``` En Coolify puedes usar un **one-off command** o job con imagen Node y `DATABASE_URL` del servicio Postgres. ## Desarrollo local vs Coolify | | Local | Coolify | |---|--------|---------| | Postgres/Redis | `docker compose up` | Servicios gestionados | | API | `pnpm --filter @moraworld/api dev` | Contenedor NestJS | | Web | `pnpm --filter @moraworld/web dev` | Contenedor Next standalone | | Dominio | localhost | HTTPS + dominio real | ## Notas - No subir `.env` al repositorio. - Ajustar `CORS_ORIGINS` con el dominio exacto del frontend. - Para archivos (facturas/fotos), configurar S3 o MinIO en Fase 1 (`S3_*` en `.env.example`).