mirror of
https://origin.cursor.com/mrdevmx/panels.git
synced 2026-10-09 17:33:16 +00:00
98 lines
3.5 KiB
Markdown
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
|