Configuration
112 settings. With the quickstart’s Compose install, set them under the pando service in docker-compose.override.yml, then run docker compose up -d:
Acme
PANDO_ACME_CA_FILEA PEM bundle of certificates trusted, beside the system's, when connecting to the ACME directory: for a private ACME server. Empty trusts the system roots.
PANDO_ACME_DIRECTORY_URLThe ACME directory of the certificate authority that issues the edge's certificates when Pando orders them itself.
Apps
PANDO_APPS_CPU_MILLISThe CPU each new app may use, in thousandths of a CPU. An app can override its own. 0 means 1000, one CPU.
PANDO_APPS_DISK_BYTESThe disk each new app may use, in bytes. An app can override its own. 0 means 10 GiB.
PANDO_APPS_DOCKER_CREDENTIALSPull a private image with the Docker login on the Pando server when the app has no registry credential of its own. Off by default: it lends every app on the install whatever that login can read.
PANDO_APPS_MEMORY_BYTESThe memory each new app may use, in bytes. An app can override its own. 0 means 512 MiB.
Bootstrap
PANDO_ADMIN_PASSWORDSecretThe first administrator's password, for an unattended install. Read only on first run, and the account must change it at first sign-in. Empty: the administrator is set up in the console with the setup token Pando prints to its log.
PANDO_ADMIN_PASSWORD_FILEA file holding the first administrator's password, in place of admin_password. An empty file is no password. The bundled Compose file writes PANDO_ADMIN_PASSWORD here.
PANDO_JOIN_NAMEThis host's name in the cluster when it joins with join_token. Empty is the machine's hostname.
PANDO_JOIN_TOKENSecretA join token, which joins this new Pando to a cluster at its first start in place of setting it up. Ignored once it has joined; refused when it already has an account or an app.
Cluster
PANDO_CLUSTER_LIVENESS_INTERVALHow often a host probes every other. 0 means a sixth of liveness_period, which is also the most it may be.
PANDO_CLUSTER_LIVENESS_PERIODT: how long a host may reach fewer than half the cluster before it stops its apps. Its standbys start after 3T. Every host of the cluster must have the same value. From 6s to 10m.
PANDO_CLUSTER_SHIP_EVERYHow old an app's newest volume copy on its standby may get before another is shipped. At least standby_every, and at most a day.
PANDO_CLUSTER_STANDBY_EVERYHow often the standby pass looks at every app: places, refreshes and ships its standby. From 5s to an hour.
Database
PANDO_DATABASE_CONNECT_TIMEOUTHow long Pando keeps trying to reach Postgres at startup before giving up.
PANDO_DATABASE_MAX_CONNSThe most connections this replica opens to Postgres. Postgres's max_connections must allow this for every replica, plus a few more for each.
PANDO_DATABASE_PASSWORD_FILEA file holding the password for the database URL's user, which the URL then leaves out. The bundled Compose file generates one on first start.
PANDO_DATABASE_URLSecretThe Postgres connection string. The bundled Compose file supplies it; set it to use an existing database. Its account must be able to manage Pando's application role.
Log
PANDO_LOG_DEVELOPMENTWrite logs as colored, human-readable lines rather than JSON.
PANDO_LOG_LEVELThe least severe log level written: debug, info, warn or error.
Metrics
PANDO_METRICS_INTERVALHow often metrics are pushed.
PANDO_METRICS_OTLP_ENDPOINTThe OpenTelemetry collector Pando pushes its own metrics to, such as http://otel-collector:4318 for HTTP or :4317 for gRPC. Empty exports nothing.
PANDO_METRICS_OTLP_HEADERSSecretHeaders sent with every export, as key=value pairs separated by commas with values URL-encoded, as OTEL_EXPORTER_OTLP_HEADERS takes them. Usually an API key.
PANDO_METRICS_OTLP_PROTOCOLThe OTLP protocol: http/protobuf or grpc.
Reconciler
PANDO_RECONCILER_BACKOFFThe retry schedule after a failed deploy or restart, as durations separated by commas: the first retry waits the first, and so on. Empty means 0s,5s,15s,60s,5m. Leave it unset in production; Pando warns at startup when it is faster.
PANDO_RECONCILER_FAILURE_THRESHOLDHow many failures within failure_window before an app is given up on and left failed. 0 means 10.
PANDO_RECONCILER_FAILURE_WINDOWThe window failures are counted in, measured from the last failure. 0 means 30 minutes.
PANDO_RECONCILER_GC_INTERVALHow often garbage collection runs. 0 means an hour.
Registry
PANDO_REGISTRY_ALWAYSSend every build through the registry, even when the runtime could import it directly.
PANDO_REGISTRY_INSECUREAllow plain HTTP to the registry.
PANDO_REGISTRY_KINDHow Pando signs in to the registry: basic (a username and password) or ecr (an AWS access key).
PANDO_REGISTRY_LAYOUTHow images are arranged in the registry: per_app (a repository per app) or single (one repository for every image). Empty means the kind's default.
PANDO_REGISTRY_PASSWORDSecretThe registry password or access token. With kind ecr, the AWS secret access key. Read from the environment only, never from the config file.
PANDO_REGISTRY_PASSWORD_FILEA file holding the registry password, in place of password.
PANDO_REGISTRY_URLThe image registry Pando pushes builds to, with an optional path prefix, such as https://registry.internal:5000 or 123456789012.dkr.ecr.us-east-1.amazonaws.com/pando. Set, it declares the install's image registry adapter. Empty: no registry, which single-host Docker does not need.
PANDO_REGISTRY_USERNAMEThe registry username. With kind ecr, the AWS access key ID.
Retention
PANDO_RETENTION_DELETED_APPSHow long a deleted app's detection and backup records are kept. 0 means 30 days.
PANDO_RETENTION_DEPLOYMENTS_PER_APPHow many deployments are kept for each app. 0 means 50.
PANDO_RETENTION_EVENTSHow long the event outbox is kept. 0 means 30 days.
PANDO_RETENTION_IDEMPOTENCY_KEYSHow long idempotency keys are kept. 0 means a day.
PANDO_RETENTION_SCANSHow long security scans are kept. 0 means 90 days.
PANDO_RETENTION_SESSIONSHow long expired or revoked sessions are kept. 0 means 30 days.
PANDO_RETENTION_SSO_FLOWSHow long expired sign-in flows are kept. 0 means a day.
Server
PANDO_SERVER_ADDRThe address the console, the API and the proxy listen on, as host:port. A bare :port listens on every interface.
PANDO_SERVER_ADVERTISE_URLWhere other Pando replicas reach this one, for a deploy's live log. Empty means http://<hostname> and the port of addr, which is right on a Compose network. In Kubernetes, the pod's address, such as http://$(POD_IP):8080.
PANDO_SERVER_AUDIT_ARCHIVE_DIRWhere Pando keeps audit log archives itself, when host policy's audit_archive is keep.
PANDO_SERVER_BASE_DOMAINThe domain per-app subdomains are made under, so an app called notes is reached at notes.example.com. Used only when routing by subdomain.
PANDO_SERVER_CLUSTER_ADDRThe address new hosts join the cluster on, as host:port, served over TLS. Join tokens name its port; it must be reachable from every host that joins.
PANDO_SERVER_CLUSTER_DIRWhere a host that joined a cluster keeps its certificate, the cluster's authority and, on a control host, the cluster's database address, which then takes the place of database.url.
PANDO_SERVER_EXTERNAL_URLThe address browsers reach Pando on, such as https://pando.example.com. Set it whenever something else terminates TLS: its scheme is what marks session cookies Secure. Empty is right when Pando serves TLS itself, or on plain-HTTP localhost.
PANDO_SERVER_ISSUERThe iss claim in every identity assertion Pando sends an app. It names this installation to the apps behind it.
PANDO_SERVER_PORT_RANGE_ENDThe last host port given to an app when apps are reached by port.
PANDO_SERVER_PORT_RANGE_STARTThe first host port given to an app when apps are reached by port.
PANDO_SERVER_PROXY_UPSTREAMThe address routing adapters send app traffic to, which is Pando's own proxy. It must be reachable from wherever the routing adapter runs. Empty means http://pando:8080, the Compose service.
PANDO_SERVER_ROUTING_MODEHow new apps are addressed by default: path (under Pando's own address), subdomain (each app at its own name under base_domain), or port (each app on its own port).
PANDO_SERVER_SHUTDOWN_TIMEOUTHow long Pando waits for requests in flight to finish when it is stopped.
PANDO_SERVER_TOKEN_KEY_PATHThe file holding the key API tokens are stored under. Made on first start. Every replica must read the same file, and a disaster-recovery bundle carries it.
PANDO_SERVER_TRUSTED_PROXIESThe proxies in front of Pando whose X-Forwarded-For header names the client in the audit log: addresses and CIDR ranges, separated by commas. Empty records the connecting address.
PANDO_SERVER_WORK_DIRWhere a disaster-recovery bundle is assembled before it is encrypted and sent. It needs room for a database dump and every app volume.
Work
PANDO_WORK_AUTO_DEPLOYHow many apps the leader checks for new commits at once. 0 means eight.
PANDO_WORK_BACKUPSHow many rolling backups the leader takes at once. 0 means two.
PANDO_WORK_DEPLOYSThe older name for host policy's max_concurrent_deploys. Set, it fixes that policy setting unless the policy setting is also set.
PANDO_WORK_DETECTIONSHow many detections this replica runs at once. 0 means one per CPU, and at least two.
Policy
PANDO_POLICY_AGENT_DISABLED_VERBSVerbs an agent's token may not use: denied to CLI and MCP tokens only, not to people.
PANDO_POLICY_ALLOW_ANONYMOUS_GRANTSOlder form of public_sharing: false means apps cannot be shared with everyone. Prefer public_sharing.
PANDO_POLICY_ALLOW_CPU_OVERSUBSCRIPTIONLet apps together ask for more CPU than the runtime has. Off by default: a deploy that would need more CPU than is left is refused. On, busy apps share the CPU and run slower.
PANDO_POLICY_ALLOW_FAILOVER_OVERSUBSCRIPTIONIn a cluster, let apps' standbys be placed past the CPU and memory kept free for losing a host. Off by default: an app whose standby could not start anywhere runs without one. On, a host that takes over starts what fits, highest availability.priority first. Disk is never oversubscribed.
PANDO_POLICY_ALLOW_MEMORY_OVERSUBSCRIPTIONLet apps together ask for more memory than the runtime has. Off by default: a deploy that would need more memory than is left is refused. On, the host may run out and stop an app to free memory. Disk is never oversubscribed.
PANDO_POLICY_ALLOW_PRIVATE_WEBHOOKSLet event subscription webhooks send to private addresses — the local network, loopback, and link-local addresses such as a cloud metadata service. Off by default, because anyone who can see an app can subscribe to it.
PANDO_POLICY_AUDIT_ARCHIVEWhere a month of the audit log goes once it is past retention: keep (archived under Pando's own directory), export (to a backup destination), or off (nothing is archived, so nothing is removed).
PANDO_POLICY_AUDIT_ARCHIVE_DESTINATIONThe backup destination, by adapter ID, that audit archives are exported to when audit_archive is export. Empty means the default backup destination.
PANDO_POLICY_AUDIT_RETENTION_MONTHSHow many months the audit log keeps before an older month is archived and removed from the live log. 0 means 3, which is also the least it may be.
PANDO_POLICY_AUTO_UPGRADE_PATCHESUpgrade to new patch releases automatically inside maintenance_window. Takes a database copy for rollback but not a full backup. Needs upgrade_in_place.
PANDO_POLICY_DEPLOY_APPROVAL_APPSApps, by ID, whose deploys need approval whatever their owners say.
PANDO_POLICY_DEPLOY_APPROVAL_COUNTHow many approvals a deploy needs. 0 means one.
PANDO_POLICY_DEPLOY_APPROVAL_EXPIRY_HOURSHow long a deploy waits for approval before it expires, in hours. 0 means it waits until somebody answers.
PANDO_POLICY_DEPLOY_APPROVAL_REQUIREDEvery app's deploys need approval from somebody holding install.deploys.approve or app.deploy.approve. Automatic deploys stop while it is on.
PANDO_POLICY_DISABLE_AI_SCREENINGTurn off AI screening of deployment plans: AI is never sent a repository to repair a plan or answer detection's questions.
PANDO_POLICY_DISABLE_ANONYMOUS_DENIAL_AUDITDon't record refusals of people who aren't signed in: authz.denied is written for an anonymous visitor to an app not shared with them only while this is off. Refusals of signed-in people and tokens are always recorded.
PANDO_POLICY_DISABLE_ANONYMOUS_USE_AUDITDon't record visits from people who aren't signed in: app.use is written to the audit log for signed-in people and tokens only, not for anonymous visitors to public apps.
PANDO_POLICY_DISABLE_JIT_PROVISIONINGDon't make an account when someone first signs in through an identity provider, whatever the provider is set to. People need an account from SCIM or an administrator first.
PANDO_POLICY_DISABLE_PASSWORD_SIGN_INTurn off sign-in with a local username and password, so people sign in through an external identity provider. Needs at least one provider turned on.
PANDO_POLICY_DISABLE_UPDATE_CHECKDon't check GitHub for newer Pando releases. Off sends no request at all, for an installation that has no internet access or may not call out.
PANDO_POLICY_DISABLE_WEBHOOK_ROUTESTurn off webhook routes: a plan declaring one is refused, and deliveries to those already deployed meet the app's ordinary access.
PANDO_POLICY_DISABLED_VERBSPermissions nobody may use, install-wide, including an app's owner. app.exec here is the Policy screen's "Turn off terminal access for the whole installation".
PANDO_POLICY_EGRESS_ALLOWLISTOlder form of egress_mode allowlist with egress_list. Prefer those.
PANDO_POLICY_EGRESS_BLOCK_PRIVATEStop apps connecting to private addresses — the local network, loopback, and the cloud metadata address — whatever egress_mode says.
PANDO_POLICY_EGRESS_LISTThe installation's egress list: hostnames, *.wildcards, addresses or ranges, each optionally with a port. Read by egress_mode.
PANDO_POLICY_EGRESS_LOOSENINGWhether an app may loosen the installation's egress rules (add to an allowlist, remove from a denylist, unblock private addresses): verb (somebody holding app.egress.loosen may), approval (its deploy needs approval), or forbidden.
PANDO_POLICY_EGRESS_MODEWhere apps may connect out to: allow_all (anywhere), denylist (anywhere except egress_list), or allowlist (only egress_list). Apps can narrow it; loosening it is governed by egress_loosening.
PANDO_POLICY_IDLE_DELETE_DAYSDelete an app nobody has used for this many days, counted from its last use, so it is longer than idle_stop_days. Its owner is told 7 days before. Storage is backed up first when require_backup_before_destroy is on, and discarded otherwise. An app can set its own number or turn this off. 0 means never.
PANDO_POLICY_IDLE_STOP_DAYSStop an app nobody has used for this many days. Its owner is told 7 days before, and somebody starts it again by hand. An app can set its own number or turn this off. 0 means never.
PANDO_POLICY_IGNORE_UNFIXABLE_FINDINGSIgnore findings with no fix available, in both the security score and the list.
PANDO_POLICY_INSECURE_ACTIONWhat happens to a running app that falls below the minimum security score: warn, or stop (after the grace period).
PANDO_POLICY_INSECURE_GRACE_HOURSGrace period, in hours, before stop applies to an app below the minimum score.
PANDO_POLICY_MAINTENANCE_WINDOWWhen automatic upgrades may start, in UTC: weekdays, a start time and a length, such as "sun,wed 02:00 2h" or "daily 03:30 1h".
PANDO_POLICY_MAX_APPS_PER_USERHow many apps each person may own, unless their account or one of their groups says otherwise. 0 means unlimited.
PANDO_POLICY_MAX_CONCURRENT_DEPLOYSHow many deploys each replica of Pando runs at once. A deploy past the limit waits in the queue and its log says how many are ahead of it. 0 means one per CPU, and at least two.
PANDO_POLICY_MAX_LOG_DISK_BYTESTotal disk for app logs across every app, in bytes. 0 means no limit.
PANDO_POLICY_MAX_TOKEN_LIFETIME_DAYSLongest a token may live, in days. 0 means no limit.
PANDO_POLICY_MIN_BUILD_ISOLATIONMinimum isolation for builds, as an isolation class number (10 is a container).
PANDO_POLICY_MIN_RUNTIME_ISOLATIONMinimum isolation for running apps, as an isolation class number (10 is a container).
PANDO_POLICY_MIN_SECURITY_SCOREMinimum security score a deploy must reach, 0 to 100. 0 means off.
PANDO_POLICY_PUBLIC_SHARINGWhether an app may be shared with anyone on the internet: allowed, passcode_only (only behind the app's passcode), or none.
PANDO_POLICY_REQUIRE_BACKUP_BEFORE_DESTROYRequire a backup before anything is destroyed: an app's storage is backed up before the app or its volumes are deleted.
PANDO_POLICY_REQUIRE_LOCAL_TWO_FACTORRequire two-factor authentication on every local account. Someone without it sets it up at their next sign-in, and can do nothing else until they have. Accounts from an identity provider are not affected.
PANDO_POLICY_SOURCE_ALLOWLISTWhere apps may be created from: a host (github.com), a host suffix (.corp.example), or a host and path (github.com/acme, ghcr.io/acme) — repositories and image registries alike. Add upload to allow files sent from a computer. Empty means anywhere.
PANDO_POLICY_STANDBYKeep a stopped copy of each app on another host, with its storage copied every 5 minutes, and start it if the app's host is lost. On by default. An app can turn it on or off for itself. Only a runtime with more than one host keeps one.
PANDO_POLICY_STOP_ORPHANED_APPSStop an app once none of its owners has an active account and no group owns it. On by default. It stays stopped until somebody starts it. Administrators are told either way.
PANDO_POLICY_UPDATE_CHANNELWhich Pando releases the update check offers: stable (releases only) or prerelease (release candidates too).
PANDO_POLICY_UPGRADE_IN_PLACELet Pando upgrade itself to a newer release from the Updates screen. Needs Pando's image set to a moving tag such as trypando/pando:latest; usually set in the deployment's configuration.