Configuration reference
Environment variables, ports, volumes and roles for the cluster manager, workers and updater agent.
Every setting each component reads, with its default. Values marked required cause the process to exit at startup if unset.
Cluster manager
The control plane. Listens on PORT behind the OpenResty edge, which owns ports 80 and
443.
Core
Prop
Type
In the container, VEIL_INSTALL_DIR is /srv/cluster-manager, backed by the cm-state
volume, and DATABASE_URL is set to the absolute
file:/srv/cluster-manager/data/cluster-manager.db for exactly that reason.
Only some paths are anchored to the install root
VEIL_INSTALL_DIR anchors the secrets, TLS material, ACME state and
TUS_UPLOADS_DIR, so those survive an image roll wherever the process happens to
start. DATABASE_URL is not among them on the cluster manager. (On a worker it
is: a file:./ path there does resolve under the install directory.)
Authentication
Prop
Type
Licensing and registry
Prop
Type
Releases and storage
Prop
Type
Edge (OpenResty)
Prop
Type
Docker provisioning and self-update
Prop
Type
Worker (Local API)
Prop
Type
Launch broker
Prop
Type
Set VEIL_MAX_BROWSERS on every worker
The default of 0 means unlimited, so a worker will keep accepting launches until it
runs out of memory. Set it to what the host can actually hold, and the load balancer
will route overflow to another worker instead of degrading this one.
Container and display
Prop
Type
Updater agent
A sidecar that pulls and recreates a container on request, because a container cannot recreate itself.
Prop
Type
Ports
| Port | Component | Exposure |
|---|---|---|
| 80 | OpenResty edge | Public — ACME challenges, or the origin in Cloudflare Flexible mode |
| 443 | OpenResty edge | Public — console, wss://…/launch, release origin |
| 4180 | Cluster manager | Internal, behind the edge |
| 38923 | Worker | The published container image's port. 3000 is the from-source default and appears only in a development checkout |
| 3999 | Updater agent | Internal only — never expose it |
Volumes
| Volume | Mount | Contents |
|---|---|---|
cm-state | /srv/cluster-manager | Database, auth secret, setup token, TLS and ACME material, logs |
cm-webroot | /var/www/release | Published browser builds and profile bundles |
cm-openresty | …/nginx/conf/conf.d | The rendered edge configuration. Derived from the database — nothing here needs backing up |
veil-install | /var/veil/install | Worker's browsers and profiles trees |
All three cm-* volumes are declared with explicit, unprefixed names so they survive
re-creation under a different Compose project name. Address them as cm-state, not
veil_cm-state.
Workers have host requirements beyond these volumes — the Chromium sandbox, a sized
/dev/shm, a writable /tmp. They are stated once, with the reason for each, in
Run a worker.
Console roles
| Role | Can |
|---|---|
admin | Everything below, plus manage users, apply config reloads that touch the live load balancer, and delete releases |
operator | Edit the cluster and fleet, publish and activate releases, preview renders, manage uploads |
viewer | Read-only dashboards |
The first admin is created in the first-run wizard from a one-time setup token. Add more users under Users in the console.
Next steps
- Installation — where these values get set.
- Troubleshooting — what a misconfiguration looks like.
- Backup & restore — which of these paths to protect.