Skip to main content
Installation

Configuration reference

Every setting in .env: required, login and accounts, QRadar connection and AQL budgets, model and reasoning, offense sync, scheduled reports, platform-check thresholds, audit and retention. Values changed in the UI win.

Everything lives in .env in the install directory and is read when docker compose starts. After editing .env, run docker compose -f docker-compose.prod.yml up -d to recreate the gateway container.

Whatever can be changed on Settings and AI settings (QRadar connection, log-source whitelist, masking, audit forwarding, offense sync, providers) is stored on the gateway's state volume and takes precedence over .env. For those keys .env is only the seed for the first start.

Required

VariableMeaning
QRADAR_URLYour QRadar Console, https://qradar.corp.local, no path
QRADAR_SEC_TOKENAuthorized-service SEC token; rights in QRadar token permissions
LLM_API_KEY / LLM_BASE_URL / LLM_MODELThe first LLM provider
CADDY_SITE_ADDRESSHostname analysts use; several separated by spaces
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 admin's password hash, generated. Unset, the gateway refuses every non-local login
GATEWAY_IMAGE_TAGImage tag in use; written by deploy.sh, changed by rst-update.sh on upgrade

Login and accounts

VariableDefaultMeaning
RST_ADMIN_USERNAMEadminFirst admin's username
RST_SESSION_TTL_HOURS12Login session lifetime
RST_USER_DB_URLset by composePostgres for multi-user accounts; empty = single account
RST_USER_DB_PASSWORDgeneratedPassword of the bundled userdb container
RST_ALLOW_DEFAULT_PASSWORDempty1 allows the factory password from the LAN (isolated trials only)
RST_CORS_ORIGINSemptyCross-origin sources; the gateway serves the front-end itself, so normally unneeded

QRadar connection and AQL

VariableDefaultMeaning
QRADAR_API_VERSION20.0The Version: request header. 20.0 for 7.5; 16.0 for 7.4
RST_QRADAR_VERIFY_CERTSfalseVerify the Console certificate. Consoles are usually self-signed, so off by default; true for a trusted certificate
RST_QRADAR_CA_CERTemptyPrivate CA path inside the container, e.g. /certs/qradar-ca.pem; put the file in ./certs/. Setting it turns verification on
RST_AQL_TIMEOUT_SECONDS120Budget per AQL: the search is cancelled after polling this long and qradar_timeout is returned
RST_AQL_MAX_ROWS1000Hard row cap; a generated AQL without LIMIT, or with a larger one, is clamped to this
RST_AQL_DEFAULT_WINDOW_MINUTES60Window added when the question names no time
RST_LOG_SOURCE_WHITELISTemptyStrongly recommended: comma-separated log-source names or ids, * allowed, e.g. WinCollect @ *,PaloAlto-*,63. Limits the catalogue the model sees; every Ariel search is checked against it, and a statement that names no source gets LOGSOURCENAME(logsourceid) IN (...) appended
RST_LOG_SOURCE_CACHE_S300Log-source catalogue cache
RST_ARIEL_SCHEMA_CACHE_S900Ariel column-definition cache
RST_CONVERSATION_TTL_DAYS7Idle lifetime of a multi-turn conversation
RST_DSL_CACHE_TTL_S300Cache of NL→AQL results for identical questions; 0 = off

Model and reasoning

VariableDefaultMeaning
LLM_TIMEOUT_S180Per-call model timeout; raise if investigation / triage / rule drafting time out
LLM_REASONINGautoReasoning effort for this provider: auto / off / low / high, see AI settings
RST_NL2AQL_REASONINGlowEffort for the NL→AQL step in Ask AI: none / low / high / native
RST_LLM_FIRST_TOKEN_TIMEOUT_S45Hard cap on time to first token when generating a query; 0 = none
RST_AGENTIC_INVESTIGATE1Offense investigation gathers evidence itself through the aql_search tool; models without function calling fall back to a single pass
RST_AGENTIC_DEADLINE_S180Total budget of one investigation in seconds; 0 = none
RST_TRIAGE_LLM_CHUNK / RST_TRIAGE_LLM_CONCURRENCY4 / 3Clusters per model call and concurrency in batch triage
RST_MASKING_MODEfrom licenceForce the masking mode cloud / private / airgapped
RST_TIMEZONEUTCTimezone the model uses for "today / yesterday"
RST_TRIAL_DAILY_LIMIT200Daily LLM calls while unactivated
RST_RATELIMIT_GENERATE / _EXECUTE30 / 30Per-IP per-minute limits; raise for a large team behind one egress IP

Offense sync

VariableDefaultMeaning
RST_OFFENSE_INGEST_ENABLED1Poll /api/siem/offenses once QRadar is configured; 0 = off, the Offenses page only syncs by hand
RST_OFFENSE_INGEST_INTERVAL_SECONDS30Poll interval
RST_OFFENSE_INGEST_LOOKBACK7dHow far the first sync looks back (6h / 30d). Offenses live for days; too short misses the open backlog
RST_OFFENSE_MIN_MAGNITUDE0Offenses below this magnitude (0–10) are neither stored nor pushed
RST_OFFENSE_INGEST_CONCURRENCY4Summary concurrency (one model call per offense)
RST_ALERT_SUMMARY10 = store without an AI summary
RST_ALERT_SUMMARY_MIN_SEVERITYinfoSummaries only above this level

Each tick reads at most 10 pages × 100 rows; the rest follows on the next tick. offense_ingest_page_cap_reached in the gateway log means the backlog is bigger than one tick and is expected.

Scheduled reports

VariableDefaultMeaning
RST_REPORT_SCHEDULEemptydaily,weekly,monthly; empty = none
RST_REPORT_TZfollows RST_TIMEZONETimezone of the period boundaries
RST_REPORT_WEBHOOK_URL / _HEADERSemptyEvery report is POSTed here
RST_REPORT_PERSIST1Archive in copilot.db
RST_REPORT_CHECK_INTERVAL_SECONDS1800Scheduler check interval
RST_REPORT_CATCHUP_MAX7Periods to catch up after downtime
RST_REPORT_TRIAGE01 appends an automatic triage to each report (one model call; paid engine)

Platform-check thresholds

VariableDefaultMeaning
RST_PLATFORM_EPS_WARN_PCT / _FAIL_PCT85 / 100EPS usage as a percentage of the licence
RST_PLATFORM_STALE_WARN_H / _FAIL_H6 / 24Hours without events before a log source counts as stale
RST_PLATFORM_OFFENSE_WARN / _FAIL200 / 800OPEN offense backlog

Audit and retention

VariableDefaultMeaning
RST_AUDIT_ENABLEDtrueWrite audit events to the audit table in copilot.db
RST_AUDIT_RETENTION_DAYS180Audit retention
RST_AUDIT_SYSLOG_URLemptyForward audit to syslog, udp:// / tcp:// / tls://host:port; QRadar itself is a valid target
RST_AUDIT_WEBHOOK_URL / _HEADERSemptyForward audit to a webhook
RST_AUDIT_WEBHOOK_ALLOWLISTemptyAllowed webhook hosts; empty = only loopback / link-local refused
RST_ANALYSIS_TTL_DAYS30Retention of investigation records
RST_METRICS_TOKENempty/metrics scrape token

Resources

VariableDefaultMeaning
RST_GATEWAY_CPUS / RST_GATEWAY_MEM2 / 2gGateway container caps
RST_STATE_DB/app/state/copilot.dbSQLite state file (inside the container)

SSO variables are in Enterprise SSO.

On this page