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

3.5 KiB

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:

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

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