Skip to main content

Nora environment variable reference

Complete reference for every environment variable Nora reads, grouped by category, with required flags, defaults, and configuration guidance.
Every Nora deployment is configured through environment variables. Start by copying .env.example to .env in your project root, then replace all <REPLACE_...> placeholders with real values before starting the stack. The sections below describe every variable Nora reads, grouped by function. Settings — the provider-keys surface that several environment variables ultimately drive
Generate cryptographic secrets with the following command. Never reuse secrets across deployments or commit them to version control.

Required

These variables must be set before the stack will start. Without them, JWTs cannot be signed, stored credentials cannot be encrypted, backup archives cannot be sealed, and Agent Hub source-catalog API keys cannot be hashed.

Secret files

Production Compose and Helm deployments mount core credentials read-only under /run/secrets instead of exposing them to frontend containers. The production control-plane entrypoint loads files whose names are valid environment-variable names. A non-empty direct environment value takes precedence; custom orchestrators can use these conventional aliases: The setup scripts keep .env owner-only: mode 0600 on macOS/Linux/WSL and a protected, non-inherited ACL on Windows. Treat timestamped .env.backup-* files with the same sensitivity. For Compose, setup also materializes the six core values as individual files under NORA_COMPOSE_SECRETS_DIR (default .secrets/compose). The directory is gitignored and restricted to the owner; Compose mounts only the requested files read-only into control-plane containers. Operators who bypass setup must run bash scripts/materialize-compose-secrets.sh <env-file> before Compose startup and after rotating any core value.

Bootstrap admin account

These variables seed the first administrator account on the very first boot. They are ignored on subsequent starts once an account exists. Both must be set together. An empty hosted PaaS database requires secure explicit values and refuses to start without them; a self-hosted installation may leave both blank and claim the first administrator through /signup. Setting only one is always invalid.
Do not set a weak or well-known password here. This account has full operator access from the moment the database is seeded.

Database

PostgreSQL connection settings. Defaults match the Docker Compose service name and port.

Redis and queue

Redis backs BullMQ for deployment, ClawHub install, backup, and alert-delivery jobs.

Access and URL

These variables control which nginx configuration is mounted, the listening port, and the public-facing base URL.

API request rate limits

App-wide per-IP abuse protection sits in front of every route: a generous global budget for all traffic plus a tighter budget for state-changing methods (POST/PUT/PATCH/DELETE). Overrides must be positive integers; invalid values fall back to the secure defaults below. Raise them only where many requests legitimately share one source IP — for example the Playwright E2E suite, which drives the whole API from a single localhost address and otherwise self-throttles.

Login abuse protection

Password and OAuth login share one per-IP rate-limit budget. Overrides must be positive integers; invalid values fall back to the secure defaults below.

OAuth

OAuth login is disabled by default. Set OAUTH_LOGIN_ENABLED=true along with provider credentials to enable it. Provider verification must be completed in the relevant developer consoles before these values take effect.

Public signup abuse protection

Signup remains public, but Nora bounds signup spikes with dedicated app-level rate limits and a runtime bot challenge. Self-hosted operators may explicitly opt out; hosted PaaS signup fails closed until Turnstile or reCAPTCHA is fully configured. The signup page reads this configuration at runtime from GET /api/auth/bootstrap-status, so published frontend images do not need provider-specific build arguments. Existing NEXT_PUBLIC_SIGNUP_BOT_PROTECTION_PROVIDER, NEXT_PUBLIC_SIGNUP_TURNSTILE_SITE_KEY, and NEXT_PUBLIC_SIGNUP_RECAPTCHA_SITE_KEY values remain accepted as deprecated runtime aliases; setup migrates their values into the canonical names above.
The reference production workflow refuses a PLATFORM_MODE=paas deployment unless the selected provider has both its public site key and server secret. This preflight runs before release metadata, secret materialization, image builds, or Compose replacement so a release cannot deploy public signup into a known unavailable state.

Release tracking and upgrades

Drives the admin “release available” banner and the one-click upgrade runner. Setting NORA_GITHUB_REPO enables Nora to compare the running version against the latest published GitHub release. The former built-in 40 attempts / 3 seconds pair is treated as a legacy default and upgraded to 221 / 3; other valid custom pairs are preserved.

System banner

Platform mode

Self-hosted resource limits

These variables are only read when PLATFORM_MODE=selfhosted. They define the maximum resources any single user can request when deploying an agent.

Billing / Stripe

These variables are only read when PLATFORM_MODE=paas. See Platform modes for a full explanation of PaaS mode.

Runtime selection

Runtime selection is three-dimensional: runtime family × deploy target × sandbox profile. Each enabled-list variable accepts a comma-separated list. The first id in each list is the default for new deployments. See Provisioner backends for details.

Kubernetes registry and Compose mount helpers

Nora no longer creates Kubernetes execution targets from .env labels. Register every Kubernetes cluster in Admin -> Kubernetes. Each enabled row becomes a concrete execution target such as k8s:aks-eastus2 and stores its provider, actual cluster name, kubeconfig, namespaces, exposure mode, Service annotations, load-balancer source ranges, and load-balancer class. docker-compose.kubernetes.yml only mounts a kubeconfig directory into the Nora containers. Put one or more kubeconfig files under NORA_KUBECONFIGS_DIR, then enter /kubeconfigs/<file> as each Admin Kubeconfig path. The Admin path must be the path visible inside backend-api and worker-provisioner, not the host path. For more than one cluster, put multiple kubeconfig files under NORA_KUBECONFIGS_DIR. The Kubernetes overlay mounts that directory at /kubeconfigs, so two AKS clusters can use Admin paths such as /kubeconfigs/aks-eastus2 and /kubeconfigs/aks-westus2 while both still run through docker-compose.kubernetes.yml. Admin-registered encrypted kubeconfigs require ENCRYPTION_KEY because Nora stores pasted kubeconfig content encrypted at rest.

Docker agent published ports

Docker and remote-Docker agents reserve their published gateway ports in PostgreSQL. The configurable subrange must remain inside 19000-19999, which is already allowed by the gateway proxy’s default SSRF guard. Local Docker deployments skip ports published by running containers and retry a bounded number of bind conflicts, including conflicts caused by non-Docker listeners.

Gateway proxy SSRF guard

Defaults allow OpenClaw’s internal gateway port, Docker-published 19000-19999, and Kubernetes NodePort 30000-32767. Override only if you publish gateways on non-default ports or hosts.

Remote Docker safety and authorization

Active Remote Docker gateway, log, and terminal streams periodically re-check that the agent owner still owns the host or has an editor, admin, or owner workspace grant. Lower values reduce the window before those streams close after revocation, at the cost of more authorization queries. Remote-host create, edit, Test, SSH-pin reset, delete, share, and unshare operations are serialized per host id so concurrent ownership, grant, trust, or credential mutations cannot race across backend replicas.

Proxmox

Proxmox is an opt-in experimental LXC target for standard OpenClaw and prepared Hermes images. Keep Docker enabled while validating it, use verified API TLS and pinned SSH host keys, and run the real-host smoke before production use. NemoClaw on Proxmox remains blocked.

NemoClaw / NVIDIA

Read when ENABLED_SANDBOX_PROFILES includes nemoclaw.

OpenClaw runtime

These variables tune the OpenClaw runtime image and gateway. Most operators leave them at their defaults; override when running a forked OpenClaw build or pinning to a specific image. When OPENCLAW_DOCKER_PACKAGE is overridden for NemoClaw, NEMOCLAW_SANDBOX_IMAGE must reference a prebuilt image containing the same exact OpenClaw version. The non-root NemoClaw runtime fails closed on a version mismatch instead of replacing the global package inside the sandbox.

Hermes runtime

Agent Hub source catalog

Configure where Agent Hub fetches community templates from. Internal templates are seeded automatically.

Workspace invitations

Integrations

Managed backups

NORA_BACKUP_STORAGE selects the destination. Supported values: local (default volume), s3, r2, ssh. Leave the destination credentials empty to manage them through Admin Settings instead of .env.

S3-compatible

Use NORA_BACKUP_STORAGE=s3 for AWS S3 or any S3-compatible service. Set NORA_BACKUP_S3_ENDPOINT for non-AWS providers.

Cloudflare R2

Use NORA_BACKUP_STORAGE=r2. Set NORA_BACKUP_R2_ENDPOINT to your account endpoint, e.g. https://<account-id>.r2.cloudflarestorage.com.

SSH / SFTP

Use NORA_BACKUP_STORAGE=ssh.

Security

LLM key storage

TLS

Optional; only relevant when nginx terminates TLS directly inside the stack.

Marketing analytics

Optional privacy-light analytics for the public marketing site, powered by Plausible. Off by default — self-hosted deployments ship zero tracking unless NEXT_PUBLIC_ANALYTICS_DOMAIN is set at build time.

Cost reporting

These optional rates drive the Cost dashboards. Nora estimates spend from token usage recorded by OpenClaw, Hermes, and future runtime chat paths. Example:
Use input_per_1k and output_per_1k when Nora records prompt/completion token splits. Use per_1k for total-token-only pricing.

Legacy AWS backup variables

These variables are read by older platform-settings code paths for backward compatibility. New deployments should use the NORA_BACKUP_S3_* family above instead.