Skip to content

Configuration

Canonical deployment settings, parsed from Python and native source. Removed interfaces are not configurable: guest addresses are derived, and the gateway is a native service. Set deployment values in /opt/zoo/.env (the installer writes JWT_SECRET and ZOO_SECRETS_KEY) or in the chart’s documented values on Kubernetes. Peer RPCs use TLS on 7444; peer HTTP uses TLS on 8002; guest websockets use 8001; native node enrollment uses mTLS on 7443.

VariableDefaultPurpose
ADMIN_EMAILS—Comma-separated emails allowed to use /admin/* and Domains.
AWS_ACCESS_KEY_ID—Credentials for ZOO_OBJECT_STORE (with AWS_SECRET_ACCESS_KEY).
AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE—Internal setting.
AWS_CONTAINER_CREDENTIALS_FULL_URI—Internal setting.
AWS_DEFAULT_REGION—Internal setting.
AWS_REGION—Internal setting.
AWS_ROLE_ARN—Internal setting.
AWS_ROLE_SESSION_NAMEzooInternal setting.
AWS_SECRET_ACCESS_KEY—Credentials for ZOO_OBJECT_STORE (with AWS_ACCESS_KEY_ID).
AWS_SESSION_TOKEN—Internal setting.
AWS_WEB_IDENTITY_TOKEN_FILE—Internal setting.
CORS_ORIGINShttp://localhost:5173,http://localhost:3000Allowed dashboard origins.
DATABASE_URL—A postgresql:// URL (required).
DOCKER_HOSTunix:///var/run/docker.sockInternal setting.
GOOGLE_APPLICATION_CREDENTIALS—Google Cloud credentials, for the gcp: KMS.
HOST127.0.0.1API server bind address. The API image sets 0.0.0.0.
JWT_SECRET—Signs sessions.
KUBECONFIG—Kubeconfig used outside a cluster.
KUBERNETES_SERVICE_HOST—Internal setting.
KUBERNETES_SERVICE_PORT443Internal setting.
NODE_NAME—Internal setting.
OTEL_EXPORTER_OTLP_ENDPOINT—Enables OpenTelemetry traces, metrics and logs.
OTEL_SERVICE_NAMEzoo-apiService name in traces.
PORTself.portAPI server port.
RELOAD1Dev autoreload. The API image sets 0.
VAULT_ADDR—HashiCorp Vault address, for the vault: KMS.
VAULT_NAMESPACE—HashiCorp Vault namespace, for the vault: KMS.
VAULT_TOKEN—HashiCorp Vault token, for the vault: KMS.
ZOO_API_URL—API URL the dashboard calls, read at container start. Also baked into installer commands and join tokens.
ZOO_API_WORKERS—API processes (uvicorn workers); defaults to the CPU count. Ignored while reloading from source.
ZOO_BACKUP_INTERVAL_HOURS24Internal setting.
ZOO_BACKUP_KEEP7Internal setting.
ZOO_BROWSER_HOMEhttps://duckduckgo.comStart page for browser sandboxes.
ZOO_BROWSER_IMAGEf'{SANDBOX_REGISTRY}/zoo-sandbox-browser:latestFirefox-only image for Linux browser sandboxes.
ZOO_CODE_IMAGEf'{SANDBOX_REGISTRY}/zoo-sandbox-code:latestImage for code sandboxes.
ZOO_DOCS_URLhttps://github.com/chann44/zoo/blob/main/site/src/content/docs/docs/reference/errors.mdBase of the errors page that error responses link to as docs_url (<url>#<code>).
ZOO_DOMAIN—Always-allowed domain for Caddy.
ZOO_EGRESS_IMAGEdocker.io/chann44/zoo-egress:latestEgress controller image deployed on enrolled Linux Docker engines.
ZOO_EMBED_ORIGINS—Origins (space-separated) that may put a viewer link’s page in an iframe; none when unset.
ZOO_EVENT_RETENTION_DAYS7How long events (GET /events, webhooks) and their deliveries are kept.
ZOO_GATEWAY_GRPC_PORT7444Authenticated TLS RPC port shared by API clients and gateway replicas; default 7444.
ZOO_GATEWAY_HTTP_PORT8001Guest websocket and health listener; default 8001. Public ingress routes /guest/connect here.
ZOO_GATEWAY_IP—This gateway replica’s own IP; must occur in peer DNS. Use the downward pod IP on Kubernetes or explicit loopback for source development.
ZOO_GATEWAY_NODE_PORT7443Internal setting.
ZOO_GATEWAY_PEERSgatewayGateway peer DNS name, not a URL: gateway in Compose, headless service DNS on Kubernetes, localhost for source development.
ZOO_GATEWAY_PEER_HTTP_PORT8002Private TLS HTTP listener for gateway-to-gateway relays; default 8002. Do not expose it as a public API.
ZOO_GATEWAY_SERVICEzoo-gatewayInternal setting.
ZOO_GUEST_DARWIN_BINARYcomputedPath of the darwin zoo-guest build to install into macOS VMs.
ZOO_GUEST_WINDOWS_BINARYcomputedInternal setting.
ZOO_IDLE_MEMORY_MB_CODE250Idle memory request for code pods in MiB; defaults to 250.
ZOO_IDLE_MEMORY_MB_DESKTOP700Idle memory request for desktop/browser pods in MiB; defaults to 700.
ZOO_INSTALL_URL—Optional installer source override; by default enrollment uses installers served by this API image.
ZOO_ISOLATIONautoDocker isolation on local and remote engines: auto prefers Kata, kata requires Kata, runc uses ordinary containers.
ZOO_KMS—Wrap workspace data keys with an external KMS: aws:<key ARN>, gcp:… or vault:<mount>/<key>.
ZOO_KUBERNETES_CONTEXT—Kubeconfig context to use in-cluster-less setups.
ZOO_KUBERNETES_EGRESS_NAMESPACE—Namespace of the egress daemon (default: the sandbox namespace).
ZOO_KUBERNETES_EGRESS_SELECTORapp.kubernetes.io/component=egressLabel selector of the egress daemon’s pods.
ZOO_KUBERNETES_HELPER_IMAGE—Helper image for snapshot and move jobs.
ZOO_KUBERNETES_HOME_SIZE10GiSize of each home claim.
ZOO_KUBERNETES_IMAGE_PULL_SECRET—Pull secret for sandbox and helper pods.
ZOO_KUBERNETES_PROBE_IMAGEregistry.k8s.io/pause:3.10What the requirements check starts on each node.
ZOO_KUBERNETES_START_TIMEOUT600Seconds to wait for a sandbox pod to start.
ZOO_MACOS_BASEzoo-macos-basezoovm VM that macOS sandboxes are cloned from.
ZOO_MACOS_CPUS4CPUs of each macOS sandbox.
ZOO_MACOS_MEMORY_MB8192Memory of each macOS sandbox.
ZOO_MACOS_USERadminGuest user for macOS sandboxes.
ZOO_MAX_SANDBOX_CPUS8Internal setting.
ZOO_MAX_SANDBOX_DISK_GB200Internal setting.
ZOO_MAX_SANDBOX_MEMORY_MB16384Internal setting.
ZOO_MAX_SNAPSHOTS10Snapshots kept per sandbox.
ZOO_MAX_VIEWER_LINK_HOURS24Longest a viewer link may last.
ZOO_METRICS_PORT—Serves Prometheus metrics on this port at /metrics.
ZOO_NAMESPACEzooNamespace for Kubernetes sandbox pods and home claims.
ZOO_NETWORK—Docker network shared by the API and sandboxes. Compose sets it to zoo.
ZOO_NODE_DIR—Internal setting.
ZOO_NODE_DIST—zoo-node builds served to installers and pushed to nodes on another version.
ZOO_NODE_HOST—Public node endpoint hostname or IP without a port; defaults to the API URL’s hostname. Set separately for a node load balancer.
ZOO_NODE_PORT7443Native gateway’s public zoo-node mTLS port; default 7443. Distinct from private gateway RPCs.
ZOO_OBJECT_STORE—Required. s3://<bucket>[/<prefix>]: profiles, portable home snapshots and database backups.
ZOO_PAUSE_MINUTES30How long a stopped Linux sandbox stays paused (resumable) before it is deleted to its volume; defaults to 30.
ZOO_PUBLIC_IP—This server’s public address(es), used to check that a domain’s DNS points here.
ZOO_REGISTRYdocker.io/chann44Where compose pulls the platform images (api, gateway, egress, web) from.
ZOO_ROLE—Python process role: all, api or worker. The gateway is a separate native Go process.
ZOO_RUNTIMEdockerDefault Linux backend: docker or kube. Kubernetes requires Kata; Docker follows ZOO_ISOLATION.
ZOO_S3_ENDPOINT—S3-compatible endpoint for ZOO_OBJECT_STORE (MinIO, R2).
ZOO_S3_REGION—Region for ZOO_OBJECT_STORE.
ZOO_SANDBOX_DISK_GB20Internal setting.
ZOO_SANDBOX_IMAGEf'{SANDBOX_REGISTRY}/zoo-sandbox-desktop:latestImage for Linux desktop sandboxes.
ZOO_SANDBOX_REGISTRYREGISTRYRegistry the sandbox images (zoo-sandbox-*) come from; ZOO_REGISTRY when empty.
ZOO_SECRETS_KEY—Wraps workspace keys that encrypt secrets, app profiles and VNC passwords. Back it up.
ZOO_SECRETS_KEY_PREVIOUS—Old keys, comma-separated, kept only until make rotate-secrets has run.
ZOO_SNAPSHOT_CLASSzoo-snapshotsCSI snapshot class used before home archives are uploaded; defaults to zoo-snapshots.
ZOO_SPARE_VOLUMES4Unbound default-size home claims kept ready per Kubernetes sandbox node; defaults to 4.
ZOO_STORAGE_CLASSzoo-localStorageClass of home claims; defaults to zoo-local.
ZOO_VM_CONTROL_CLIENT_CERT—Controller leaf certificate file with the exact api or worker URI matching ZOO_ROLE; do not reuse one role’s leaf for the other.
ZOO_VM_CONTROL_CLIENT_KEY—Private key file for the process’s VM-control controller leaf.
ZOO_VM_CONTROL_DAEMONSET—Expected VM-control DaemonSet owner name.
ZOO_VM_CONTROL_DOCKER_ENROLL_TOKEN—Internal setting.
ZOO_VM_CONTROL_DOCKER_NAMESPACE—Actual Docker containerd namespace, normally moby; not the Zoo sandbox network.
ZOO_VM_CONTROL_DOCKER_URL—Explicit HTTPS frontend URL for the authenticated single-host VM controller.
ZOO_VM_CONTROL_NAMESPACE—Kubernetes sandbox/VM-control namespace used for authenticated discovery.
ZOO_VM_CONTROL_NODE_CA—Public node/server CA file used to verify VM-control frontends; not the gateway CA.
ZOO_VM_CONTROL_NODE_CA_KEY—Node signing key file mounted only in the dedicated issuer, not normal API/worker or frontend pods.
ZOO_VM_CONTROL_NODE_NAME—Provisioned single-Docker-host node identity name.
ZOO_VM_CONTROL_NODE_UID—Immutable generation UUID for the single Docker host.
ZOO_VM_CONTROL_SELECTOR—Exact installation VM-control DaemonSet Pod label selector.
ZOO_VM_CONTROL_SERVER_NAME—Expected VM-control frontend DNS SAN; node URI/generation is also verified.
ZOO_VM_CONTROL_SERVICE_ACCOUNT—Expected VM-control node enrollment/discovery ServiceAccount.
ZOO_VM_CONTROL_TRUST_DOMAIN—Installation-specific SPIFFE trust domain; separate from the node-enrollment CA.
ZOO_WEBHOOK_ALLOW_PRIVATE—1 lets webhooks reach private addresses.
ZOO_WEBHOOK_BACKOFF_SECONDS60,300,1800,7200,21600Seconds between a failed webhook delivery’s retries, comma-separated; it fails after the last.
ZOO_WINDOWS_BASEzoo-windows-baseHyper-V VM that Windows sandboxes are cloned from.
ZOO_WINDOWS_CPUS4CPUs of each Windows sandbox.
ZOO_WINDOWS_MAX_VMS4Windows sandboxes running at once on each server.
ZOO_WINDOWS_MEMORY_MB8192Memory of each Windows sandbox.

Undocumented in this table: DOCKER_HOST, KUBERNETES_SERVICE_HOST, KUBERNETES_SERVICE_PORT, NODE_NAME, ZOO_BACKUP_INTERVAL_HOURS, ZOO_BACKUP_KEEP, ZOO_GATEWAY_NODE_PORT, ZOO_GATEWAY_SERVICE, ZOO_GUEST_WINDOWS_BINARY, ZOO_MAX_SANDBOX_CPUS, ZOO_MAX_SANDBOX_DISK_GB, ZOO_MAX_SANDBOX_MEMORY_MB, ZOO_NODE_DIR, ZOO_SANDBOX_DISK_GB, ZOO_VM_CONTROL_DOCKER_ENROLL_TOKEN.