# 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