APP_* environment variables you may want to set that no feature page already explains. Each row was checked against the code that reads it, and each default is the fallback in that code. Variables a feature page documents (for example the APP_INGRESS_* hardening limits in Domains and ingress or the APP_PIPELINE_* settings in Pipelines) stay on those pages. Branding variables (APP_BRAND_*) are in White-labeling.
How to set these
Each process reads these variables once at startup, so a change only takes effect after a restart.-
Installed with
install.sh: the control plane runs as thelevelrailsystemd service. The unit file sets onlyAPP_DATA_DIR,APP_HTTP_ADDR,APP_INGRESS_HTTP_ADDRandAPP_INGRESS_HTTPS_ADDRitself, with plainEnvironment=lines and noEnvironmentFile=. Add your own with a drop-in, which survives upgrades:Then add the variables under a[Service]heading and restart:This is the same method Installing uses forAPP_ALLOW_INSECURE_LOGIN. -
Docker or Compose: pass them with
-e NAME=valueor anenvironment:block, as in the examples in Docker. -
Node agent: variables marked “agent” below are read by
levelrail-agent. Set them on the agent’s container or service, not on the control plane. See Docker and Node provisioning. -
Command line client: variables marked “CLI” are read by
levelrail-cliin the shell where you run it.
30s, 5m, 1h30m. Most variables fall back to their default when the value is unset or invalid; the exceptions are called out in the tables.
Builds and build cache
The control plane builds images with BuildKit. By default each build starts from whatever cache BuildKit already holds. These variables add a shared cache on top of that. See Build node routing for dedicated build nodes.Git webhook (single repository mode)
These variables turn on the control plane’s ownPOST /webhook receiver for a single repository. They are separate from the per-app webhooks and GitHub App flow in Git integrations. The three required variables must all be set. If any is missing, the control plane still starts and logs a webhook not configured warning, and only this receiver is unavailable.
GitHub App manifest
Pipelines and OIDC
The pipeline engine’s own tuning variables are listed in Pipelines. These extra ones cover the scheduler, commit status reporting, and the OIDC token service described in Pipelines OIDC. Non-positive or unparseable values for the duration variables here fall back to the default without a warning.Scheduling and background intervals
Each of these sets how often a background loop wakes to check for work. Five-field cron only goes down to one minute, so the one-minute defaults are as short as the two cron-driven schedulers can usefully go.
For the invalid-value behavior of the first three, see the note at the end of this page.
Control plane off-box backups
These tune the scheduled off-box copy of the control plane’s own state and its restore drills, described in Control plane backup and Disaster recovery. Values that are unset, unparseable, or not greater than zero use the default. Control plane.Point-in-time restore
Log archive
The archiver’s other settings are on Log archive. These two bound how much one run does. Positive values only; anything else uses the default. Control plane.Data export
How these are used is on Data export. Positive values only; anything else uses the default. Control plane.Ingress
The edge hardening limits are in Domains and ingress. These two are not listed there. Control plane.Certificates and request thresholds
For all of these, a value that does not parse logs a warning and uses the default. For the two request thresholds, zero or a negative duration also means the default.
Doctor and diagnosis
These tunelevelrail-cli doctor and the structured diagnosis of failed deploys. See Troubleshooting and Deploy failures.
Updates
SSH node provisioning
Mesh networking
Behavior to know about
- Scheduler intervals are not range checked.
APP_BACKUP_SCHEDULER_INTERVAL,APP_SCHEDULED_TASK_SCHEDULER_INTERVAL,APP_UPDATE_CHECK_INTERVALandAPP_DEPLOY_APPROVAL_SWEEP_INTERVALuse any value that parses as a Go duration, including zero or a negative one. Only an unparseable value falls back to the default. Use a positive duration. - Ingress variables fail closed. Unlike most settings on this page, an invalid
APP_INGRESS_*hardening value is returned as an error at startup rather than ignored.