Skip to main content
Installation

Configuration reference

Every setting in .env: required ones, security, ES connection, models and reasoning, alert ingest, scheduled reports, baseline, audit and retention. Values changed in the UI win.

All configuration lives in .env in the install directory and is read when docker compose starts. After editing .env, docker compose -f docker-compose.prod.yml up -d recreates the gateway so the change applies.

Whatever can be changed on the Settings and AI models pages (ES connection, whitelist, masking, audit, providers) is stored in the gateway's state volume and takes precedence over .env. Those variables only seed the first start.

Required

VariableNotes
ES_URLYour Elasticsearch, https://es.corp.local:9200; several nodes comma-separated
ES_USER / ES_PASSWORDES account; both empty when security is off
LLM_API_KEY / LLM_BASE_URL / LLM_MODELThe first LLM provider
CADDY_SITE_ADDRESSHostname analysts use; several space-separated
RST_GATEWAY_SHARED_SECRETShared secret between Caddy and the gateway, generated by deploy.sh
RST_ADMIN_TOKENOps API token (X-RST-Admin-Token header), generated
RST_ADMIN_PASSWORD_HASHFirst administrator's password hash, generated. Unset, the gateway refuses every non-local login
GATEWAY_IMAGE_TAGImage tag to run; written by deploy.sh, changed by rst-update.sh

Login and accounts

VariableDefaultNotes
RST_ADMIN_USERNAMEadminFirst administrator's name
RST_SESSION_TTL_HOURS12Session lifetime
RST_USER_DB_URLset by composePostgres for the multi-user table; empty = single account
RST_USER_DB_PASSWORDgeneratedPassword of the bundled userdb
RST_ALLOW_DEFAULT_PASSWORDempty1 allows the shipped password over the LAN (isolated labs only)
RST_CORS_ORIGINSemptyCross-origin sources; not needed, the gateway serves its own frontend

Elasticsearch

VariableDefaultNotes
RST_ES_VERIFY_CERTStrueVerify the ES certificate; false for self-signed, or set a CA
RST_ES_CA_CERTemptyPrivate CA path inside the container, e.g. /certs/es-ca.pem; put the file under ./certs/
RST_ES_TIMEOUT_S30Per-request ES timeout
RST_ES_MAX_RETRIES2Transparent retries on timeout / connection error
RST_INDEX_WHITELISTemptyStrongly recommended: queryable index patterns, logs-*,filebeat-*,winlogbeat-*
KIBANA_URLemptyKibana, for deep links only; empty = off
KIBANA_PUBLIC_URLemptyThe Kibana address the analyst browser can reach, when it differs from the gateway's
RST_CONVERSATION_BACKENDesConversations in ES (.rst_copilot_conversations) - survive restarts, shared across replicas; memory = in-process only
RST_CONVERSATION_TTL_DAYS7Idle expiry
RST_DSL_CACHE_TTL_S600Cache identical NL→DSL generations; 0 = off
RST_FIELD_DICT_CACHE_TTL_S300Field-dictionary scan cache

Models and reasoning

VariableDefaultNotes
LLM_TIMEOUT_S180Per-call LLM timeout; raise if investigations / triage time out
LLM_REASONINGautoThis provider's reasoning level auto / off / low / high, see AI models
RST_NL2DSL_REASONINGlowReasoning for the NL→DSL step: none / low / high / native
RST_LLM_FIRST_TOKEN_TIMEOUT_S45Hard cap on the first token while generating a query; 0 = unlimited
RST_EMBED_MODEL / RST_EMBED_BASE_URL / RST_EMBED_DIMemptyEmbedding model; better set on the AI models page
RST_EMBED_COOLDOWN_S60Cool-down after an embedding endpoint failure
RST_MASKING_MODEper licenceForce cloud / private / airgapped
RST_TIMEZONEUTCTimezone the model uses for "today / yesterday"; set +08:00 for China
RST_TRIAL_DAILY_LIMIT200Daily LLM calls while unactivated
RST_RATELIMIT_GENERATE / _EXECUTE / _KIBANA_LINK30 / 30 / 120Per-IP per-minute limits; raise for a large team behind one NAT address

Live alerts

VariableDefaultNotes
RST_ALERT_INGEST_INDEX.alerts-security.alerts-defaultAlert index to poll (the read alias); empty = off
RST_ALERT_INGEST_INTERVAL_SECONDS10Poll interval
RST_ALERT_WEBHOOK_SECRETemptyShared secret for Kibana webhook push (X-RST-Alert-Token); enables push when set
RST_ALERT_INGEST_CONCURRENCY / RST_ALERT_INGEST_BUDGET_S4 / 20One push carries up to 200 alerts, each costing one summary call; these bound concurrency and total time

Scheduled reports and baseline

VariableDefaultNotes
RST_REPORT_SCHEDULEemptydaily,weekly,monthly; empty = no automatic reports
RST_REPORT_TZRST_TIMEZONETimezone of period boundaries
RST_REPORT_WEBHOOK_URL / _HEADERSemptyPOST every report here
RST_REPORT_PERSIST / RST_REPORT_INDEX1 / .rst_copilot_reportsArchive to ES
RST_REPORT_CATCHUP_MAX7Periods to catch up after downtime
RST_BASELINE_INTERVAL_SECONDSemptyBaseline poll interval, ≥ 300; empty = manual only
RST_BASELINE_MAX_AGE_HOURS48osquery data older than this is stale
RST_BASELINE_HOST_ROSTER_DAYS30Hosts silent this long leave the roster
RST_BASELINE_OSQUERY_INDEXlogs-osquery_manager.result-*Read: your osquery results
RST_BASELINE_RESULTS_INDEX / _RULES_INDEX / _RUNS_INDEXbaseline-results / -rules / -runsWrite: the gateway's three indices

Audit and retention

VariableDefaultNotes
RST_AUDIT_ENABLEDtrueAudit to .rst_copilot_audit
RST_AUDIT_WEBHOOK_ALLOWLISTemptyHosts audit forwarding may POST to; empty = only loopback / link-local refused
RST_ILM_BOOTSTRAP01 = create the ILM policy + index template on start; do it when audit is on
RST_AUDIT_RETENTION_DAYS180Audit retention (with ILM on)
RST_METRICS_TOKENemptyScrape token for /metrics

Resources

VariableDefaultNotes
RST_GATEWAY_CPUS / RST_GATEWAY_MEM2 / 2gGateway container ceiling

SSO variables are on the Enterprise SSO page.

On this page