Self-hosting
Ejecuta korva-vault como un servicio compartido para tu equipo. Docker Compose viene en el repo con Traefik opcional para HTTPS. Unidad systemd para servidores Linux, plist launchd para máquinas de desarrollo macOS.
Actualizado: 2026-04-30
El Vault está diseñado para correr en tu laptop por defecto, pero nada impide que lo ejecutes como servicio compartido en una VPS, en Kubernetes o detrás de tu reverse proxy. Esta página documenta las tres formas oficiales de despliegue.
Docker (recomendado para despliegues compartidos)
docker pull ghcr.io/alcandev/korva-vault:latestdocker compose up -d vaultEl Dockerfile es multi-stage:
- Stage Beacon (Node 22-alpine): construye la SPA React 19 →
beacon/dist. - Stage Vault (Go 1.26-alpine): copia
distdentro devault/internal/ui/dist/y compila con-tags embedui. - Stage Runtime (alpine 3.21): corre como
korva(uid 1001), volume mount en/data, expone 7437.
Trae un health check cableado:
wget -qO- http://localhost:7437/healthz | grep -q '"status":"ok"' || exit 1(intervalo 30 s, timeout 5 s, 3 reintentos, periodo de inicio 10 s).
Docker Compose
El repo incluye docker-compose.yml con dos servicios:
services: vault: image: ghcr.io/alcandev/korva-vault:latest ports: ["7437:7437"] volumes: - korva-data:/data - ${KORVA_ADMIN_KEY_PATH}:/data/admin.key:ro # Traefik opcional para HTTPS automático vía Let's Encrypt # traefik: # ...volumes: korva-data:Para correr solo el vault:
docker compose up -d vaultPara correr vault + el servidor de licencias (solo operadores, perfil teams):
KORVA_LICENSING_SECRET=change-me \KORVA_LICENSING_KEY_PEM="$(cat priv.pem)" \ docker compose --profile teams up -dTraefik para HTTPS automático
El docker-compose.yml viene con los labels de Traefik comentados. Descoméntalos para exponer el Vault en vault.tuempresa.com con certificados Let’s Encrypt que se auto-renuevan:
labels: - "traefik.enable=true" - "traefik.http.routers.vault.rule=Host(`vault.tuempresa.com`)" - "traefik.http.routers.vault.entrypoints=websecure" - "traefik.http.routers.vault.tls.certresolver=letsencrypt" - "traefik.http.services.vault.loadbalancer.server.port=7437"Los clientes apuntan al host público:
KORVA_VAULT_HOST=vault.tuempresa.com korva ...LaunchAgent en macOS (máquinas de desarrollo)
cp scripts/korva-vault.plist ~/Library/LaunchAgents/dev.korva.vault.plistlaunchctl load ~/Library/LaunchAgents/dev.korva.vault.plist- Label:
dev.korva.vault RunAtLoad,KeepAliveante caída- Logs en
~/.korva/logs/vault.{log,error.log} - Throttle de reinicio: 10 s
Servicio user de systemd (servidores Linux)
mkdir -p ~/.config/systemd/usercp scripts/korva-vault.service ~/.config/systemd/user/systemctl --user daemon-reloadsystemctl --user enable --now korva-vault- Restart
on-failure(delay 5 s), máx. 5 reinicios en 60 s - Logs vía journald:
journalctl --user -u korva-vault -f - Hardening:
NoNewPrivileges,PrivateTmp,ProtectSystem=strict,ProtectHome=read-only,ReadWritePaths=~/.korva
Variables de entorno necesarias
| Variable | Default | Propósito |
|---|---|---|
KORVA_VAULT_HOST | 127.0.0.1 para local, 0.0.0.0 para compartido | Dirección de bind |
KORVA_VAULT_PORT | 7437 | Puerto de escucha |
KORVA_VAULT_DB | /data/vault.db (Docker) | Ruta de SQLite |
KORVA_CORS_ORIGIN | http://localhost:5173 | Origen permitido por CORS (Beacon dev) |
KORVA_EMAIL_API_KEY / KORVA_EMAIL_FROM | sin valor | API de Resend para invitaciones de Teams |
KORVA_LICENSING_ENDPOINT | https://licensing.korva.dev | URL del servidor de licencias |
KORVA_HIVE_ENDPOINT | https://hive.korva.dev | Cerebro cloud de Hive |
KORVA_HIVE_DISABLE | sin valor | Define 1 para matar el worker de Hive |
Consideraciones de reverse proxy
El Vault espera que TLS se termine en el proxy y recibir HTTP/1.1 en cleartext internamente. CORS se configura vía KORVA_CORS_ORIGIN. El rate limit (120 req/min/IP) se aplica dentro del Vault, así que no necesitas una regla de WAF separada para protegerlo.
Observabilidad
- Sonda de salud:
GET /healthzdevuelve{"status":"ok"}. - Snapshot de estado:
GET /api/v1/status— versión, uptime, tier de licencia, total de observaciones. - Métricas:
GET /api/v1/metrics— formato Prometheus.
Conéctalas a tu stack de monitoring.
Dónde viven los datos en Docker
El volumen nombrado korva-data se mapea a /data dentro del contenedor:
| Ruta | Qué |
|---|---|
/data/vault.db | Base de datos SQLite |
/data/admin.key | Credencial admin (modo 0600, montado solo lectura) |
/data/license.key | Token JWS de la licencia activa |
Toma un snapshot del volumen diariamente para backup; SQLite soporta backups en caliente si usas VACUUM INTO.