Skip to content
Lumaft documentation contents
Lumaft documentation

Configuration reference

Every setting Lumaft reads, its default, the file rules that apply, and which settings belong to which topology.

Configuration reference

Lumaft is configured entirely through environment variables. Secrets — the bootstrap password, backend definitions, database URLs, keys — are read from files whose paths those variables name, never from the variables themselves.

How configuration behaves

  • Read once at startup. Changing any setting or file requires a restart. There is no live reload and no configuration API.
  • Fail closed. An invalid value, a missing file, or a file that breaks the rules below stops startup with one sanitized log line. Nothing starts in a degraded mode.
  • Booleans are exact. true or false, lowercase. 1, yes, and TRUE are refused.
  • Paths are literal. Absolute, already normalized; no ~, no variables, no trailing slash.
  • Every replica is identical. On Enterprise PostgreSQL, all replicas start from the same settings and files.

File rules

Every file a setting names must:

  • be a regular file reached without following a final symlink, with a non-symlinked parent;
  • have a parent directory that is not writable by group or others (mode 0700 is the norm);
  • not be writable by group or others (mode 0600);
  • be readable by UID 1000, the node user the container runs as.

Kubernetes Secret volumes and other projected mounts materialize files as symlinks and are rejected. Write files into a task-local volume from an init step instead; every environment guide shows the pattern.

Core

Variable Default Purpose
PORT 8080 Listening port. The container listens on all interfaces; bind or route to it from outside
LUMAFT_PUBLIC_ORIGIN unset The HTTPS origin browsers use, without a path. Required for OIDC and SAML; harmless otherwise
LUMAFT_ALLOW_HTTP false Loopback-only evaluation: uses the unprefixed lumaft-session cookie without Secure so a browser on the same machine can sign in over http://127.0.0.1. Never set it on a network-reachable deployment

Bootstrap administrator

Variable Default Purpose
LUMAFT_LOCAL_ADMIN_PASSWORD_FILE unset File holding the first administrator's password (12–4096 characters). Read only when no account exists. Unset after first sign-in
LUMAFT_LOCAL_ADMIN_USERNAME admin Username for that account. A lowercase letter, then up to 63 lowercase letters, digits, ., _, or -. Set before first startup
LUMAFT_LOCAL_ADMIN_PASSWORD_ROTATE false One-shot lost-password rotation: re-reads the password file, replaces the named account's credential, revokes its sessions. Remove after one restart

See Users and permissions.

Backends

Variable Default Purpose
LUMAFT_BACKENDS_FILE unset The validated JSON document listing backends to observe. Unset starts with no backends. Schema, limits, and examples: Connect a backend

Backend credentials are not Lumaft settings. The AWS SDK's default credential chain applies:

Variable Used when
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN Static or exported credentials (laptop, Azure, VMware)
AWS_WEB_IDENTITY_TOKEN_FILE, AWS_ROLE_ARN Web-identity federation (EKS IRSA, workload federation)
AWS_PROFILE, with ~/.aws mounted at /home/node/.aws A named profile
none ECS task role or EC2 instance profile

NODE_EXTRA_CA_CERTS=/path/to/ca-bundle.pem adds a private CA for an S3-compatible endpoint or a corporate proxy certificate. Certificate verification cannot be disabled.

Database

Exactly one database source applies. Setting more than one refuses startup.

Variable Default Applies to Purpose
LUMAFT_SQLITE_PATH /data/lumaft.db SQLite Database file. Its parent directory must exist, be owned by UID 1000, mode 0700
LUMAFT_POSTGRES_URL unset PostgreSQL Connection URL for a fresh PostgreSQL installation
LUMAFT_POSTGRES_URL_FILE unset PostgreSQL Same, read from a file. Preferred

A SQLite installation adopted to PostgreSQL through the console keeps a UI-managed provider file in the data directory instead; do not also set a PostgreSQL variable. See PostgreSQL operations.

Replicas (Enterprise, PostgreSQL only)

Variable Default Purpose
LUMAFT_REPLICAS_MAX 1 Ceiling the orchestrator may scale to, including rollout surge
LUMAFT_POSTGRES_POOL_MAX 1 Pooled connections per replica, beyond two dedicated sessions
LUMAFT_POSTGRES_CONNECTION_HEADROOM 10 Connections left for your own tools, backups, and monitoring
LUMAFT_MIGRATION_WAIT_SECONDS 300 How long a non-migrating replica waits for the migrating one

Startup refuses with pool-topology-exceeds-server unless replicas × (pool + 2) + headroom ≤ max_connections − reserved, and with multi-replica-requires-postgresql when the ceiling is above 1 on SQLite.

Schema upgrades

Variable Default Purpose
LUMAFT_SCHEMA_UPGRADE_APPLY unset Authorizes exactly the gated migration revision the refusal named. Remove afterwards
LUMAFT_SCHEMA_UPGRADE_RECOVERY_DIRECTORY beside the database Where the verified pre-migration copy is written (absolute, existing, not world-writable)

See Gated migrations.

Licensing

An installation with none of these runs as Community.

Variable Purpose
LUMAFT_LICENSING_SERVICE_URL Connected licensing endpoint (HTTPS) for Business and Enterprise
LUMAFT_CONNECTED_LICENSE_DIR Protected directory for connected-license state. Required with the URL on SQLite; optional on PostgreSQL, where it seeds the shared licensing row on first start
LUMAFT_OFFLINE_SITE_LICENSE_FILE The signed offline-site license document (Enterprise Advanced Security). No outbound calls

On SQLite the two connected settings are set together or not at all; a non-HTTPS URL refuses startup. Activation itself happens in Administration → Licensing.

Federated sign-in (Enterprise)

Providers are registered in the console; their protocol settings are environment variables. <KEY> is the issuer key uppercased with dashes changed to underscores (corp-idpCORP_IDP). LUMAFT_PUBLIC_ORIGIN is required for OIDC and SAML.

Variable Provider Purpose
LUMAFT_OIDC_<KEY>_CLIENT_ID OIDC Authorization-code client id
LUMAFT_OIDC_<KEY>_CLIENT_SECRET OIDC Client secret
LUMAFT_SAML_<KEY>_SSO_URL SAML IdP HTTP-Redirect single sign-on URL
LUMAFT_SAML_<KEY>_IDP_CERT SAML IdP signing certificate (PEM)
LUMAFT_SAML_<KEY>_NAMEID_FORMAT SAML Optional; only urn:oasis:names:tc:SAML:2.0:nameid-format:persistent is accepted
LUMAFT_TRUSTED_PROXY_<KEY>_SUBJECT_HEADER Trusted proxy Header carrying the immutable subject
LUMAFT_TRUSTED_PROXY_<KEY>_SHARED_SECRET Trusted proxy ≥ 32-character secret the proxy presents in x-lumaft-trusted-proxy-secret
LUMAFT_TRUSTED_PROXY_<KEY>_DISPLAY_HEADER Trusted proxy Optional header carrying a display label only

Walkthroughs for common providers: Federated identity.

Optional capture and audit

Variable Purpose
LUMAFT_TRANSCRIPT_KEY_FILE Canonical base64 of a random 32-byte key, outside /data. Enables transcript body storage. Back it up separately from the database
LUMAFT_TRANSCRIPT_REDACTION_FILE Optional extra redaction rules: {"schemaVersion":1,"literals":[…],"patterns":[…]}, at most 64 KiB
LUMAFT_TRANSCRIPT_POSTGRES_CAPACITY_FILE PostgreSQL only: the measured capacity report the supplied producer writes every five seconds; without a fresh report, capture stays closed
LUMAFT_STATE_KEY_FILE Base64 32-byte key for opt-in whole-state retention. Losing it makes retained copies unrecoverable
LUMAFT_AUDIT_SINK_ID Enterprise external audit sink: a stable lowercase UUID v4 for this receiver binding
LUMAFT_AUDIT_SINK_URL The receiver's HTTPS URL, without user info, query, or fragment
LUMAFT_AUDIT_SINK_SECRET_FILE File holding a dedicated 32–256-character printable ASCII signing secret

The three audit-sink settings are set together on every replica or not at all. The URL and id are bound in the database on first configured startup and cannot be changed in this version; rotating the secret keeps the binding.

Health and diagnostics endpoints

Endpoint Auth Purpose
GET /api/v1/health none Process liveness
GET /api/v1/readiness none 200 after a bounded database query; 503 otherwise
GET /api/v1/storage-health storage:health:read Write probe, free space, database file sizes, last durable write
GET /api/v1/observation-polling storage:health:read Per-scheduler cycle counts, failure classes, backoff
GET /api/v1/object-store-traffic storage:health:read S3 request, retry, and throttling counters
GET /legal/eula none The license text the image carries

Diagnostic reports are per process and reset on restart. None contains backend identity or provider payloads.

Worked examples

SQLite on a VM (Community)

LUMAFT_LOCAL_ADMIN_PASSWORD_FILE=/run/lumaft/admin-password   # remove after first sign-in
LUMAFT_BACKENDS_FILE=/run/lumaft/backends.json
LUMAFT_PUBLIC_ORIGIN=https://lumaft.example.com

Credentials come from the instance profile; the database is at the default /data/lumaft.db.

PostgreSQL, one replica (Business)

LUMAFT_BACKENDS_FILE=/run/lumaft/backends.json
LUMAFT_POSTGRES_URL_FILE=/run/lumaft/postgres-url
LUMAFT_PUBLIC_ORIGIN=https://lumaft.example.com
LUMAFT_LICENSING_SERVICE_URL=https://licensing.dekglas.com

PostgreSQL, three replicas (Enterprise)

LUMAFT_BACKENDS_FILE=/run/lumaft/backends.json
LUMAFT_POSTGRES_URL_FILE=/run/lumaft/postgres-url
LUMAFT_PUBLIC_ORIGIN=https://lumaft.example.com
LUMAFT_LICENSING_SERVICE_URL=https://licensing.dekglas.com
LUMAFT_REPLICAS_MAX=3
LUMAFT_POSTGRES_POOL_MAX=2
LUMAFT_POSTGRES_CONNECTION_HEADROOM=10
LUMAFT_OIDC_CORP_IDP_CLIENT_ID=…
LUMAFT_OIDC_CORP_IDP_CLIENT_SECRET=…

Requires 3 × (2 + 2) + 10 = 22 non-reserved PostgreSQL connections.

Loopback evaluation on a laptop

LUMAFT_LOCAL_ADMIN_PASSWORD_FILE=/run/lumaft/admin-password
LUMAFT_BACKENDS_FILE=/run/lumaft/backends.json
LUMAFT_ALLOW_HTTP=true
AWS_ACCESS_KEY_ID=…
AWS_SECRET_ACCESS_KEY=…
AWS_SESSION_TOKEN=…

This is the Quickstart shape and nothing else.