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.
trueorfalse, lowercase.1,yes, andTRUEare 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
0700is the norm); - not be writable by group or others (mode
0600); - be readable by UID 1000, the
nodeuser 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 |
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-idp →
CORP_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.