docker-compose.yml
All of vuzon deploys with a single Compose file. This page explains each block of the file, what you can adjust and what is best left as is.
File structure
vuzon runs as a single service: no external database, no queues. The file you downloaded from the repository is this:
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:Note: keep DOMAIN and CF_API_TOKEN in a .env file next to the
compose; Docker injects it automatically (env_file with required: false
needs Compose v2.24+).
Image tags
The image is published to ghcr.io/kn990x/vuzon on every release, multi-arch amd64 / arm64. The default tag follows the latest stable release. In production it is worth pinning a concrete version and updating deliberately following the Updating vuzon guide.
Ports and network
vuzon exposes a single HTTP port for the panel and its API. The compose publishes host port VUZON_PORT (default 8001) mapped to the container’s 8001.
Warning: do not expose the panel port directly to the internet. Serve it behind a reverse proxy with TLS (Caddy, Traefik, nginx) or a Cloudflare Tunnel — see Reverse proxy & TLS.
Volumes and persistence
There is no database. The only writable path is the vuzon-data volume, mounted at /app/data, which holds:
- Your panel credentials, as a scrypt hash.
- The session signing key the panel generates for itself.
Losing this volume means losing the panel password: the setup wizard reopens and the first visitor claims the panel. Back it up like any other homelab state — see Backups.
Hardening baked in
The compose ships locked down by default, and the image cooperates:
read_only: true— the image filesystem stays read-only;/tmplives on tmpfs.cap_drop: ALLandno-new-privileges— the container runs as a non-root user with every capability dropped.init: true— PID 1 reaps zombies and forwards signals, sodocker stopshuts the panel down cleanly.- A
/healthzhealthcheck keepsdocker pshonest about the panel’s state.
Environment
The two required variables are DOMAIN and CF_API_TOKEN. The full list — ports, data directory, proxy and cookie flags — is in Environment variables.