Skip to main content
This page lists the 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 the levelrail systemd service. The unit file sets only APP_DATA_DIR, APP_HTTP_ADDR, APP_INGRESS_HTTP_ADDR and APP_INGRESS_HTTPS_ADDR itself, with plain Environment= lines and no EnvironmentFile=. 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 for APP_ALLOW_INSECURE_LOGIN.
  • Docker or Compose: pass them with -e NAME=value or an environment: 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-cli in the shell where you run it.
Duration values use Go duration syntax such as 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 own POST /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 tune levelrail-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_INTERVAL and APP_DEPLOY_APPROVAL_SWEEP_INTERVAL use 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.
Last modified on October 12, 2026