Instalar Selega
Selega se self-hostea con Docker. El docker-compose.yml provisto levanta dos contenedores
— Selega y su propio PostgreSQL — más un volumen para los datos. No necesitas instalar ni
aprovisionar una base por separado.
Requisitos
Sección titulada «Requisitos»- Docker con el plugin Compose (
docker compose). - Un puerto del host para la interfaz web (por defecto
8088). - Para producción: un reverse proxy con HTTPS/TLS (Caddy, nginx, o el TLS propio de tu panel).
La imagen del contenedor se construye desde node:22-slim y trae integrados Tesseract OCR
(con el paquete de idioma español) y poppler-utils para PDF escaneados. Corre como usuario
no-root.
Instalación en 1 minuto (Docker)
Sección titulada «Instalación en 1 minuto (Docker)»git clone https://github.com/diegoparras/selega.git && cd selegacp .env.example .env # edita POSTGRES_PASSWORD (usa algo fuerte)docker compose up -d --builddocker compose logs selega # aquí se imprime la contraseña de admin generada (una vez)# → http://localhost:8088Eso es todo: dos contenedores (selega + selega-db) y un volumen para los datos.
Cómo obtienes la imagen
Sección titulada «Cómo obtienes la imagen»Selega se publica en GHCR en cada push como ghcr.io/diegoparras/selega:latest, y el
docker-compose.yml también declara build: .. Por eso puedes construir desde el repo o
descargar la imagen publicada:
git clone https://github.com/diegoparras/selega.git && cd selegacp .env.example .envdocker compose up -d --buildSi tu panel solo te deja pegar un compose sin clonar el repo, usa este bloque image-only — descarga la imagen ya publicada en GHCR:
services: db: image: postgres:16-alpine environment: POSTGRES_USER: selega POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set a strong password} POSTGRES_DB: selega volumes: [ "selega-pg:/var/lib/postgresql/data" ] healthcheck: test: ["CMD-SHELL", "pg_isready -U selega -d selega"] interval: 5s timeout: 3s retries: 12 restart: unless-stopped selega: image: ghcr.io/diegoparras/selega:latest ports: [ "8088:8080" ] environment: SELEGA_ADMIN_EMAIL: ${SELEGA_ADMIN_EMAIL:-admin@selega.local} SELEGA_ADMIN_PASS: ${SELEGA_ADMIN_PASS:-} SELEGA_SECURE_COOKIE: ${SELEGA_SECURE_COOKIE:-0} DATABASE_URL: "postgresql://selega:${POSTGRES_PASSWORD}@db:5432/selega" depends_on: db: { condition: service_healthy } restart: unless-stoppedvolumes: selega-pg:Variables de entorno
Sección titulada «Variables de entorno»Copia .env.example a .env y pon valores reales. Nunca subas .env a git.
| Variable | Default | Para qué |
|---|---|---|
POSTGRES_PASSWORD | — (obligatoria) | Contraseña de la base. Usa algo fuerte. |
SELEGA_ADMIN_EMAIL | admin@selega.local | Usuario del primer superadmin. |
SELEGA_ADMIN_PASS | (vacío) | Déjala vacía → se genera una contraseña y se imprime una vez en los logs. |
SELEGA_SECURE_COOKIE | 0 | Pon 1 detrás de HTTPS/TLS (la cookie de sesión viaja solo por HTTPS). |
SELEGA_PORT | 8088 | Puerto del host (la app escucha en 8080 dentro del contenedor). |
OPENROUTER_KEY | (vacío) | API key de IA nube, opcional. Mejor cargarla desde Admin (queda write-only). |
POSTGRES_USER / POSTGRES_DB | selega | Usuario / nombre de la base. |
Primer arranque
Sección titulada «Primer arranque»- Ejecuta
docker compose logs selega(o lee los logs de tu panel) y copia la contraseña de admin generada. Se imprime una sola vez. - Inicia sesión con
SELEGA_ADMIN_EMAILy esa contraseña. Eres superadmin. - Abre el menú kebab (⋮) → Sistema: elige qué jurisdicciones atiende esta instalación y configura los motores.
- Abre el menú kebab (⋮) → Administración: crea usuarios (agente / supervisor / auditor / admin) y edita las reglas.
Desplegar en un panel
Sección titulada «Desplegar en un panel»Dokploy, Easypanel, Coolify y Portainer soportan Docker Compose. El camino recomendado es conectar este repo de GitHub para que el panel construya la imagen por ti; si tu panel solo acepta un compose pegado, usa el bloque image-only de arriba.
La única variable obligatoria es POSTGRES_PASSWORD. Deja SELEGA_ADMIN_PASS vacía para que
Selega genere la contraseña de admin y la imprima una vez en los logs del contenedor. Cuando el
panel provee TLS (Dokploy, Easypanel y Coolify lo hacen automáticamente), pon
SELEGA_SECURE_COOKIE=1.
Actualizar
Sección titulada «Actualizar»git pull && docker compose up -d --build # construir desde el repo# o, con la imagen publicada:docker compose pull && docker compose up -dChecklist de producción
Sección titulada «Checklist de producción»- TLS: pon Selega detrás de un reverse proxy con HTTPS y configura
SELEGA_SECURE_COOKIE=1. - Secretos fuertes en
.env; nunca subas.env.SELEGA_ADMIN_PASSvacía → autogenerada. - Cierra el puerto de Postgres — no expongas el servicio
dbal host en producción. - Respalda el volumen
selega-pg— es el registro de las legalizaciones.
El contenedor corre como usuario no-root, con CSP y cabeceras de seguridad, hash de contraseñas con scrypt, sesiones HMAC, lockout de login y queries parametrizadas. Está auditado con semgrep, OWASP ZAP, Trivy y gitleaks.