Configuration reference
Every parameter below exists in the code (or, where marked, in the
compose/installer layer only). Grouped by category; "Edition" marks
EE-only parameters. Unless noted, changing a value requires
recreating the containers (docker compose up -d) for it to reach
the backend.
Application
Parameter
Required
Default
Description
Edition
APP_ENV
recommended
dev
dev/development/test/production. In production: ENCRYPTION_KEY becomes mandatory, COOKIE_SECURE defaults on, rate-limiter active
both
UPLOAD_ROOT
no
/data/uploads
Root for uploads, loot files, audit JSONL, generated keys
both
WORKER_BACKEND
no
internal
internal (in-process pool) or arq (Redis-queued worker)
both
WORKER_POOL_MAX_WORKERS
no
8
Total job slots
both
WORKER_POOL_MAX_PER_PROJECT
no
3
Job slots per project
both
MODULES_DIR
no
/app/modules
Module plugins directory (compose mounts ./modules read-only)
both
SECURE_DELETE
no
false
shred -uzn 3 (fallback: single zero pass) before deleting files
both
ENABLE_API_DOCS
no
false
Expose /docs, /redoc, /openapi.json (off by default — they mount outside the authed /api prefix)
both
LOG_LEVEL / LOG_FORMAT
no
INFO / text
Backend logging level; json option
both
Database
Parameter
Required
Default
Description
Edition
DATABASE_URL
yes
sqlite:// (dev)
SQLAlchemy URL; compose builds it from DB_*
both
DB_USER / DB_PASSWORD / DB_NAME
compose: yes
umbryx / — / umbryx
DSN parts + PostgreSQL service credentials
both
DB_HOST / DB_PORT
no
db / 5432
Point at a VIP for external/HA clusters
both
DB_SSLMODE
no
prefer
e.g. require for HA clusters
both
DATABASE_REPLICA_URL
no
—
Read-replica engine for read-heavy lists
both
DATABASE_POOL_SIZE / _MAX_OVERFLOW / _POOL_RECYCLE
no
10 / 20 / 1800
Connection pool tuning
both
DATABASE_STATEMENT_TIMEOUT
no
30000
PostgreSQL statement_timeout, ms (0 disables)
both
POSTGRES_PASSWORD
prod-compose: yes
—
Used by the db service in prod/demo compose variants
both
PGBOUNCER_POOL_SIZE / PGBOUNCER_MAX_CLIENT_CONN
no
25 / 200
Optional PgBouncer sidecar (service commented out)
both
Authentication and sessions
Parameter
Required
Default
Description
Edition
JWT_SECRET
yes
auto-generated, persisted to /data/.jwt_secret
HS256 signing key; known-weak values are rejected
both
JWT_EXPIRE_HOURS
no
8
Access-token lifetime
both
JWT_REFRESH_EXPIRE_HOURS
no
24
Refresh-token lifetime (rotating)
both
SETUP_TOKEN
recommended
—
Gates first-run /api/auth/setup
both
ADMIN_USERNAME / ADMIN_PASSWORD
first start
admin / generated
Bootstrap admin (only when the users table is empty)
both
COOKIE_SECURE
no
auto (true in production)
Secure flag on the session cookie
both
CORS_ORIGINS
no
empty (same-origin)
Comma-separated origins; never wildcard
both
REDIS_URL
compose: yes
redis://localhost:6379/0
Enables JWT blacklist, login lockout, WS presence, leader election
both
REDIS_PASSWORD
no
empty
Password for the Redis instance, applied when REDIS_URL carries no inline credentials (redis_factory.py)
both
JWT_BLACKLIST_FAIL_CLOSED
no
true
Reject tokens when Redis is unavailable
both
Cryptography
Parameter
Required
Default
Description
Edition
ENCRYPTION_KEY
yes in production
dev: auto-generated /data/secret.key
Fernet key (KEK) for credential/secret encryption; invalid or missing in production is a startup error
both
PLUGIN_SIGNING_KEY
for signing
—
Enables module signing (POST /api/admin/modules/sign)
both
PLUGIN_REQUIRE_SIGNATURE
no
true
Reject unsigned module uploads
both
SYNC_SIGNING_KEY
for sync
— (sync disabled)
HMAC over instance-to-instance sync events; must match across instances
both
AUDIT_INTEGRITY_KEY
no
—
HMAC fingerprints on timeline events (GET /api/admin/audit/verify)
both
OLD_KEY / NEW_KEY
rekey only
—
Consumed by backend/scripts/rekey.py for key rotation
both
Integrations and infrastructure
Parameter
Required
Default
Description
Edition
WEBHOOK_HMAC_SECRET
for webhooks
— (webhooks disabled)
Fail-closed HMAC for /api/webhooks/{token}
both
PUBLIC_BASE_URL
recommended
derived from request host
Canonical external URL (OIDC redirect_uri, workstation callbacks)
both
PLATFORM_HOST
no
empty
Fallback callback base for workstation action hooks (http://<host>:8888), probed when PUBLIC_BASE_URL is unset (core/workstation/actions.py)
both
OUTBOUND_PROXY
no
— (or DB setting)
HTTP(S) proxy for outbound egress
both
REGISTRY_URL / REGISTRY_EXTERNAL_URL / REGISTRY_USER / REGISTRY_PASS
no
http://registry:5000 / — / ""
Internal Docker registry for infra images
both
KUBECONFIG_PATH / KUBECTL_TIMEOUT
no
— / 60
kubectl access for k8s deploy methods
both
EVIDENCE_BACKEND + S3_* / EVIDENCE_LOCAL_DIR
for S3
local / /data/evidence
Evidence storage backend (S3/Minio)
both
DNS_SERVER_1 / DNS_SERVER_2
no
8.8.8.8 / 1.1.1.1
DNS for the backend container (compose-level)
both
DOCKER_HOST / DOCKER_SOCKET
no
unix:///var/run/docker.sock
Docker API access for instance management
both
Audit logging
Parameter
Required
Default
Description
Edition
AUDIT_LOG_DIR
no
UPLOAD_ROOT/audit
Append-only JSONL mirror of timeline events
both
AUDIT_S3_BUCKET / AUDIT_S3_PREFIX / AUDIT_S3_ENDPOINT_URL + AWS_*
for S3
— / timeline/
WORM forward of audit events
both
High availability (application side; recipe ships with EE)
Parameter
Default
Description
REDIS_SENTINEL_HOSTS
—
Enables Sentinel (takes precedence over REDIS_URL)
REDIS_SENTINEL_MASTER
mymaster (recipe: umbryx-master)
Monitored master name
REDIS_SENTINEL_PASSWORD
—
Sentinel auth
HA_MONITOR_HOST/PORT/DB/USER/PASSWORD
— / 5433 / pg_auto_failover
Read-only pg_auto_failover monitor for the HA status page
All five are read by both editions' application code; the packaged HA
cluster recipe (docker-compose.ha.yml, installer modes) is EE.
EE-only
Parameter
Required
Default
Description
INFRA_TLS_VERIFY
no
true
TLS verification for infra provisioning calls (lab self-signed opt-out; the C2 agent-login always verifies)
INFRA_SSH_KNOWN_HOSTS
no
/data/infra_known_hosts
TOFU known-hosts file for infra SSH
UMBRYX_VERIFY_DEPLOY
no
1
Post-deploy health verification on/off
Umbryx_STATE_DIR
no
/data/infra_states
Cloud provisioning state directory (note the non-standard capitalization — a known quirk of the source)
LICENSE_SERVER_URL
no
https://update.umbryx.pro
License heartbeat endpoint (read in both editions' code; only EE has a token to renew)
Ports and build-time (compose layer only)
Parameter
Default
Description
PORT
3000
Published HTTP port
HTTPS_PORT
3443
Optional TLS termination variant (commented out; use your reverse proxy)
DATA_DIR
./data
Host path mounted at /data
BACKEND_IMAGE / FRONTEND_IMAGE / IMAGE_TAG
umbryx-backend / umbryx-frontend / latest
Deploy prebuilt images (EE licensed registry)
UMBRYX_EDITION
auto (by tree)
Build-time frontend edition (ce forces Core)
Secrets in all examples must be placeholders — never commit real
values. Rotate anything shipped in .env.example before production
use.