# Despliegue

> **Estado: NO desplegar todavía.** Por decisión del proyecto, en el servidor de producción no se
> instala ni modifica nada (Apache, cPanel, Node existente, firewall, bases, vhosts) hasta la
> **Fase 15**. Este documento recoge lo que la aplicación ya trae preparado y las decisiones abiertas.

## Lo que la aplicación ya trae

- `output: "standalone"` en `next.config.ts`: el build genera `.next/standalone` con un `server.js`
  autocontenido (se copian además `.next/static` y `public/`).
- Endpoint de salud `GET /api/health` (200 si la base responde, 503 si no). No expone detalles.
- Cabeceras de seguridad: HSTS (solo producción), `X-Content-Type-Options`, `X-Frame-Options`,
  `Referrer-Policy`, `Permissions-Policy`, CSP (estricta con nonce en `/admin`).
- Cookie de sesión `__Host-chesco_session` (Secure + HttpOnly + SameSite=Lax) en producción:
  **requiere HTTPS**.
- IP real del cliente detrás de un reverse proxy: `TRUSTED_PROXY_HOPS=1` para un solo Apache.
- Logs JSON por stdout (Pino), con contraseñas, tokens y cookies redactados.

## Requisitos mínimos para producción

- Node.js 24 LTS dedicado a la app (no depender del Node 21 actual del servidor).
- PostgreSQL 16 o superior accesible solo localmente o por red privada.
- HTTPS en el dominio (la cookie de sesión no funciona sin él).
- Variables de entorno de producción (ver `.env.example`), con un `SESSION_SECRET` propio.

## Pasos de una publicación (cuando se apruebe)

```bash
npm ci
npm run build
npm run db:deploy                       # migraciones pendientes
NODE_ENV=production npm run db:seed     # solo la primera vez (exige SEED_ADMIN_PASSWORD)
node .next/standalone/server.js         # o el gestor de procesos que se defina
```

## Decisiones abiertas (Fase 15)

| Tema              | Situación                                                                                                                                 |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| Sistema operativo | El servidor usa Ubuntu 20.04 y cPanel 118, ambos sin soporte del proveedor. Evaluar migrar a una plataforma soportada antes de desplegar. |
| PostgreSQL        | Sin instalar. El repositorio oficial retiró los paquetes para Ubuntu 20.04; la forma de instalarlo depende de la decisión anterior.       |
| Node.js           | 24 LTS, instalado aparte del Node existente.                                                                                              |
| Gestor de proceso | Propuesto: servicio systemd con límites de memoria y CPU.                                                                                 |
| Reverse proxy     | Propuesto: Apache solo en el vhost de CHESCO (include de cPanel), con `ProxyPreserveHost On`.                                             |
| SSL               | AutoSSL de cPanel u otro, según la plataforma final.                                                                                      |
| Respaldos         | Ver [BACKUPS.md](BACKUPS.md).                                                                                                             |

Antes de cada paso en el servidor se enviará el comando exacto para aprobación.
