Environment variables

Every THREEAM_* variable the 3AM container reads, with its default and meaning, grouped by area (core, intake and concurrency, models, investigation, causal, mail, licence, Keychain, syslog, FIPS).

The installer, Compose and the Helm chart set these for you; installer options map to them. Change them only when you run the container yourself, or to override a default. Secrets: prefer the _FILE form.

Core

VariableDefaultMeaning
THREEAM_DATA/var/lib/3amThe data directory: audit log, incidents, settings, secrets. Back it up
THREEAM_PORT8700The port inside the container
THREEAM_BIND0.0.0.0The address inside the container (the installer publishes it on --bind, default 127.0.0.1)
THREEAM_CONSOLE_URLnoneThe console's address as people reach it: links in messages; where Keychain sites reach this install
THREEAM_CONSOLE_DIRthe image's consoleWhere the console's files are (development)
THREEAM_ADMIN_TOKENgeneratedThe admin token; generated at first start and kept in admin-token in the data directory
THREEAM_INGEST_TOKENnoneBearer token for POST /v1/events and POST /v1/alerts/<source>; ingestion is off without it
THREEAM_ORCHESTRATE10 turns incident handling off (the console, API and audit log still work)
THREEAM_LICENCE/etc/3am/licence.jsonA licence file; absent: install it in the console
THREEAM_PACKS/etc/3am/packsSealed check packs
THREEAM_CONNECTORS/etc/3am/connectors.jsonConnectors in a file (GitOps); console-added ones are in the data directory
THREEAM_POLICY/etc/3am/policy.jsonThe policy in a file
THREEAM_INSTANCEthe host nameThis instance's name, for the licence's instance limit

Intake and concurrency

VariableDefaultMeaning
THREEAM_POLL_S15How often alert sources and approval channels are polled, in seconds
THREEAM_POLL_WORKERS16Alert-source polls at once
THREEAM_MAX_CONCURRENT2 per vCPU, 4–32Investigations at once (16 on 8 vCPU); 32–64 if bursts are common
THREEAM_CONNECTOR_CONCURRENCY4Calls in flight per connector (max_in_flight on a connector wins)
THREEAM_SNAPSHOT_S600How often 3AM reads how your systems are set up (what changed)
THREEAM_DISCOVER_TIMEOUT_S45Discovery's limit per connector

Models

VariableDefaultMeaning
THREEAM_MODEL_URLnone (required without a GPU)OpenAI-compatible endpoint for the investigator and the note
THREEAM_MODELqwen2.5:7b-instruct on a local GPU runtime; otherwise from the System 2 profileThe model name at that endpoint (OpenRouter id, Hugging Face id on vLLM, Ollama tag)
THREEAM_SYSTEM2llama-3.3-70bSystem 2 profile: llama-3.3-70b or qwen2.5-72b; THREEAM_MODEL wins
THREEAM_MODEL_KEY_FILE / THREEAM_MODEL_KEYnoneIts bearer token
THREEAM_MODEL_EXTRAnoneJSON merged into every request, e.g. {"provider":{"data_collection":"deny"}}
THREEAM_MODEL_TIMEOUT_S60A model call is given up after this (the note falls back to the template)
THREEAM_MODEL_CONCURRENCY8Model calls at once
THREEAM_MODEL_DAILY_TOKENS0 (none)Daily token ceiling; spent, model steps are skipped until 00:00 UTC
THREEAM_MODEL_LOCAL1: treat the endpoint as on this host (labs)
THREEAM_S1_URLOpenRouter's when THREEAM_MODEL_URL is OpenRouter, else noneSystem 1's decisions endpoint, or none. Required without a GPU otherwise
THREEAM_S1_MODELtogethercomputer/tev1-4b-experimentalSystem 1's model
THREEAM_S1_KEY_FILE / THREEAM_S1_KEYthe model key, with OpenRouterSystem 1's key
THREEAM_S1_TIMEOUT_S20A System 1 call is given up after this (what it gates stays unverified)
THREEAM_S1_CONCURRENCY16System 1 calls at once
THREEAM_S1_DAILY_TOKENS0 (none)Daily token ceiling for System 1
THREEAM_MODEL_CASSETTE, THREEAM_MODEL_REPLAYnoneRecord and replay model calls: a directory, and record, replay or auto

Never on the CPU: Models: GPU or endpoint.

Investigation

VariableDefaultMeaning
THREEAM_INVESTIGATORlooploop or mcts (the tree search)
THREEAM_MCTS_S2_CALLS16The tree search's System 2 calls
THREEAM_MCTS_READS24Its reads
THREEAM_MCTS_DEPTH4Its depth
THREEAM_ML_DIR<data>/mlVerified ML artifacts (the graph network, DPO adapters)
THREEAM_ML_TRUSTnoneA public key: ML artifacts must also be signed by it, or are refused

Causal discovery

VariableDefaultMeaning
THREEAM_CAUSAL_URLnone3am-causal's address (the installer's --causal sets it)
THREEAM_CAUSAL_TOKEN_FILE / THREEAM_CAUSAL_TOKENnoneThe bearer token it expects
THREEAM_CAUSAL_TAU6PCMCI+'s maximum lag
THREEAM_CAUSAL_TIMEOUT_S20A discovery call is given up after this

Mail

VariableDefaultMeaning
THREEAM_MAIL_PROVIDERResend, or SMTP when THREEAM_SMTP_HOST is setresend or smtp
THREEAM_MAIL_FROM3AM <verify@3am.si>The sender, on a domain your provider has verified
THREEAM_RESEND_KEY_FILE / THREEAM_RESEND_KEYnoneResend's key
THREEAM_RESEND_URLhttps://api.resend.com/emailsResend's API
THREEAM_SMTP_HOST, THREEAM_SMTP_PORTnone, 587Your SMTP server
THREEAM_SMTP_USER, THREEAM_SMTP_PASSWORD_FILE / THREEAM_SMTP_PASSWORDnoneIts account
THREEAM_SMTP_SECURITYstarttlsstarttls, ssl (465) or none (a relay on a trusted network)

Licence

VariableDefaultMeaning
THREEAM_LICENCE_CHECKautoauto, strict (confirmed within 72 h, or setup mode) or offline (Licensing)
THREEAM_WARDEN_URLhttps://warden.3am.siWarden, 3AM's licence authority
THREEAM_WARDEN_PINSnonesha256/<base64> SPKI pins of Warden's certificate, comma-separated
THREEAM_CA_BUNDLEthe system'sYour CA, for a TLS-inspecting proxy
THREEAM_REVOCATION_FILEthe bundle'sA signed revocation list
THREEAM_CLOCK_TOLERANCE_S3600How far the clock may move back before it's treated as tampering
THREEAM_MACHINE_ID_FILE/etc/machine-idThe single-host fingerprint source
THREEAM_HARDWARE_ID_FILEnoneA hardware id (as root on RHEL, from 3am-hardware-id.service)
THREEAM_CLUSTER_UIDnoneSet by Helm: the fingerprint follows the cluster

HTTPS_PROXY and NO_PROXY are honoured for licence checks.

Keychain

VariableInstallerMeaning
THREEAM_KEYCHAIN_JOIN, THREEAM_KEYCHAIN_SITE_KEY--keychain-join, --keychain-site-key-fileSet this new site up from its home with a site key (retried every 30 s for up to 2 hours)
THREEAM_KEYCHAIN_FILE, THREEAM_KEYCHAIN_PASSPHRASE_FILE / THREEAM_KEYCHAIN_PASSPHRASE--keychain, --keychain-passphrase-fileSet this install up from a sealed Keychain file, once per version

Syslog and SIEM

VariableDefaultMeaning
THREEAM_SYSLOGautoWhere security and licence events go: stdout (journald under Podman on RHEL), /dev/log, udp://siem:514, tcp://…, tls://…
THREEAM_SYSLOG_EVENTSsecurityWhich events: security, or more
THREEAM_SYSLOG_FACILITYauthprivThe syslog facility

FIPS and hardening

VariableDefaultMeaning
THREEAM_FIPSauto-detected1: FIPS mode (also when OPENSSL_FORCE_FIPS_MODE=1): the audit log seals with ECDSA P-256, sealed Keychain files use PBKDF2
THREEAM_ANTIDEBUGAnti-debugging checks in the compiled build

Labs only

VariableInstallerMeaning
THREEAM_LAB_APPROVER--lab-approver1: offer the auto-approving connection. Doctor fails while it's on
THREEAM_DEV_LICENCE_PUBKEY, THREEAM_DEV_PACKS, THREEAM_DEV_PACK_SECRETDevelopment builds only

The fingerprint comes from THREEAM_CLUSTER_UID, the machine id or the hardware id. Changing them (moving 3AM to another host) makes a new install: add it to the licence.

Secrets in connector settings

A connector's secret settings never hold the secret itself; they point to it:

{"token": {"file": "/etc/3am/secrets/pagerduty-token"}}
{"token": {"env": "PD_API_TOKEN"}}

Read only when the connector is built; never logged.

On this page