docker-compose.yml
Todo vuzon se despliega con un único archivo Compose. Esta página explica cada bloque del archivo, qué puedes ajustar y qué conviene dejar como está.
Estructura del archivo
vuzon corre como un solo servicio: sin base de datos externa y sin colas. El archivo que descargaste del repositorio es este:
services:
vuzon:
container_name: vuzon
image: ghcr.io/kn990x/vuzon
env_file:
- path: .env
required: false
environment:
PORT: "8001"
restart: unless-stopped
init: true
read_only: true
tmpfs:
- /tmp
volumes:
- vuzon-data:/app/data
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
ports:
- "${VUZON_PORT:-8001}:8001"
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:'+(process.env.PORT||8001)+'/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
interval: 30s
timeout: 5s
start_period: 10s
retries: 3
volumes:
vuzon-data:Nota: guarda DOMAIN y CF_API_TOKEN en un archivo .env junto al
compose; Docker lo inyecta automáticamente (env_file con required: false
necesita Compose v2.24+).
Etiquetas de imagen
La imagen se publica en ghcr.io/kn990x/vuzon con cada release, multiarquitectura amd64 / arm64. La etiqueta por defecto sigue la última release estable. En producción conviene fijar una versión concreta y actualizar de forma deliberada siguiendo la guía de Actualizar vuzon.
Puertos y red
vuzon expone un único puerto HTTP para el panel y su API. El compose publica el puerto del anfitrión VUZON_PORT (por defecto 8001) asignado al 8001 del contenedor.
Advertencia: no expongas el puerto del panel directamente a internet. Sírvelo detrás de un proxy inverso con TLS (Caddy, Traefik, nginx) o de un túnel de Cloudflare — ver Reverse proxy y TLS.
Volúmenes y persistencia
No hay base de datos. La única ruta escribible es el volumen vuzon-data, montado en /app/data, que contiene:
- Las credenciales del panel, como hash scrypt.
- La clave de firma de sesión que el panel genera para sí mismo.
Perder este volumen es perder la contraseña del panel: el asistente de instalación se vuelve a abrir y el primer visitante reclama el panel. Haz copia como de cualquier otro estado de tu homelab — ver Backups.
Endurecimiento de serie
El compose viene bloqueado por defecto, y la imagen coopera:
read_only: true— el sistema de ficheros de la imagen queda en solo lectura;/tmpvive en tmpfs.cap_drop: ALLyno-new-privileges— el contenedor se ejecuta como usuario no root y sin ninguna capability.init: true— el PID 1 recoge zombis y reenvía señales, así quedocker stopapaga el panel limpiamente.- Un healthcheck contra
/healthzmantiene honesto adocker pssobre el estado del panel.
Entorno
Las dos variables obligatorias son DOMAIN y CF_API_TOKEN. La lista completa — puertos, directorio de datos, flags de proxy y cookies — está en Variables de entorno.