DocsConfiguracióndocker-compose.yml

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:

docker-compose.yml
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; /tmp vive en tmpfs.
  • cap_drop: ALL y no-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í que docker stop apaga el panel limpiamente.
  • Un healthcheck contra /healthz mantiene honesto a docker ps sobre 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.