panels-origin/docs/coolify.md
2026-08-21 16:55:01 -05:00

98 lines
3.5 KiB
Markdown

# Deploy PANELS en Coolify (Docker Compose)
## Resumen
| Qué | Cuánto |
|-----|--------|
| Bases gestionadas Coolify (Postgres/MySQL) | **0** |
| Archivos SQLite en volumen | **2** (`app.db`, `platform.db`) |
| Contenedores | **3** (`api`, `web-panel`, `web-saas`) |
| Volumen persistente | **1** → `/app/data` en `api` |
Los fronts (Alpine + nginx) hacen proxy de `/v1` al servicio `api`, así las cookies de sesión van same-origin.
## Datos sensibles (qué NO va al git)
| Ítem | Estado |
|------|--------|
| `.env` | gitignored — no commitear |
| `data/` (`*.db`, expedientes, pdfs) | gitignored |
| SMTP password en SaaS | vive en `platform.db` (volumen) — proteger backups |
| Defaults de desarrollo en código | solo fallbacks locales; Coolify **exige** secrets |
## Variables de entorno (servicio `api`)
### Obligatorias
| Variable | Formato | Uso |
|----------|---------|-----|
| `SESSION_SECRET` | string largo aleatorio | Firma cookie de sesión |
| `DOCS_KEY` | **64** caracteres hex (32 bytes) | Cifrado de documentos |
| `SEED_PASSWORD` | string | Password inicial de `admin` SaaS (solo al crear / migrar seed) |
| `PANEL_LOGIN_URL` | URL absoluta | Link en correos de acceso |
Generar:
```bash
openssl rand -hex 32 # SESSION_SECRET o DOCS_KEY
```
### Recomendadas (HTTPS / Coolify)
| Variable | Default compose | Uso |
|----------|-----------------|-----|
| `COOKIE_SECURE` | `true` | Cookie solo por HTTPS |
| `PORT` | `8000` | Puerto interno API |
| `CORS_ORIGINS` | vacío | Lista `https://a,https://b` si la API se llama cross-origin; con proxy `/v1` en nginx **no hace falta** |
### Opcionales
| Variable | Uso |
|----------|-----|
| `API_KEY` | Auth alternativa por header `X-API-Key` (vacío = desactivado) |
| `VCARD_BASE` | Prefijo QR/vCard gafetes |
| `SMTP_HOST` / `SMTP_PORT` / `SMTP_USER` / `SMTP_PASS` / `SMTP_FROM` | Correo por env (alternativa al panel `/smtp`) |
`web-panel` y `web-saas` **no** necesitan variables de entorno en runtime (estáticos + proxy nginx).
## Imágenes
- **api:** Deno 2.9 + OpenJDK 21 JRE + Liquibase (Debian; no Alpine por FFI SQLite)
- **web-panel / web-saas:** build Node Alpine → **nginx Alpine**
Archivos: `Dockerfile.api`, `Dockerfile.web-panel`, `Dockerfile.web-saas`, `docker-compose.yml`, `web-panel/nginx.conf`, `web-saas/nginx.conf`.
En Coolify el servicio de PANELS se llama **`web-panel`** (FQDN ej. `panels.mrdev.mx`). La carpeta `web/` queda libre para una website futura.
## Paso a paso en Coolify
1. **Push** este repo (sin `.env` ni `data/`).
2. Coolify → **New Resource → Docker Compose** → `docker-compose.yml`.
3. **Persistent storage:** volumen `panel-data` → `/app/data` en `api`.
4. **Dominios:** `web-panel` → panels; `web-saas` → saas; `api` sin FQDN (proxy `/v1`).
5. Cargar en Coolify las **obligatorias** + `COOKIE_SECURE=true`.
6. Deploy (Liquibase crea/migra las 2 SQLite en el volumen).
7. Verificar `https://app…/v1/health`, login SaaS `admin` / tu `SEED_PASSWORD`.
8. SMTP en `/smtp` o por `SMTP_*`.
## Local
```bash
cp .env.example .env # rellenar obligatorias
docker compose up --build
```
Sin `SESSION_SECRET` / `DOCS_KEY` / `SEED_PASSWORD` / `PANEL_LOGIN_URL`, compose **no arranca**.
## Checklist ops
- [ ] `.env` y `data/` fuera del git
- [ ] Secrets distintos a los de desarrollo
- [ ] Backup del volumen `panel-data` (incluye DBs + SMTP guardado)
- [ ] `COOKIE_SECURE=true` en HTTPS
- [ ] Healthcheck API OK
## Qué no hace falta
- Postgres/MySQL/MariaDB en Coolify
- Contenedor monolítico Node+Deno+Java