Environment Variables
All configuration is driven by environment variables defined in the .env
file at the repository root. Copy .env.example to .env before starting.
Memory & Upload
Upload limits are derived from a single memory budget rather than set
directly. Set APP_MEMORY_MB and everything else scales automatically.
Variable |
Default |
Description |
|---|---|---|
|
|
Total RAM (in MB) allocated to the backend container. Derived
automatically from this value: JVM heap = 75%, max upload size = 25%,
nginx body limit = max upload + 50 MB multipart buffer, and the
proxy/analysis timeout scales with memory (300–900 s). Examples:
|
File Retention
Variable |
Default |
Description |
|---|---|---|
|
|
Set to |
|
|
Number of hours after upload before a file is automatically deleted
(only applies when |
Analysis Queue & Reconciliation
Uploaded files are analyzed asynchronously by an in-memory thread pool. Analysis
is Suricata-dominated (~50 s per file), so throughput is CPU-bound. When the
pool and its queue are both full the executor applies back-pressure: the
upload request runs the analysis inline and slows down, rather than dropping the
file. A reconciliation job additionally flips any file left stuck in
PROCESSING past a timeout to FAILED (covering crashes and restarts, since
the queue is in-memory and lost on restart).
Sizing guidance: keep ASYNC_MAX_POOL_SIZE at or below the host CPU core
count to avoid CPU contention between concurrent Suricata runs. Raise
ASYNC_QUEUE_CAPACITY to absorb larger bursts before back-pressure kicks in.
For a 24-core box, ASYNC_MAX_POOL_SIZE=20 (leaving headroom for the JVM, DB,
and MinIO) with a queue of a few hundred is a reasonable starting point.
Variable |
Default |
Description |
|---|---|---|
|
|
Number of threads kept alive to run analyses. These stay up even when idle. |
|
|
Maximum analysis threads. Keep at or below the host CPU core count — analysis is CPU-bound (Suricata), so oversubscribing degrades throughput. |
|
|
Files that may wait in the in-memory queue once all threads are busy.
Once the queue is also full, uploads apply back-pressure (run analysis
inline). This queue is not persisted — pending work is lost on
restart and recovered as |
|
|
Set to |
|
|
Minutes a file may stay in |
|
|
Deployment-wide kill-switch for Suricata IDS enrichment. Set to
|
Nginx
Variable |
Default |
Description |
|---|---|---|
|
|
Host port on which nginx listens. Change if port 80 is already in use. |
Public Origin & Authentication
These variables apply only when running with the production overlay that enables OIDC/Keycloak authentication. See Authentication (OIDC / Keycloak) for the full walkthrough. They are ignored by the base stack.
Variable |
Default |
Description |
|---|---|---|
|
|
The exact origin you browse to (scheme + host + port). Pins Keycloak’s
token issuer and the backend’s issuer check, so the browser must load
the app via this same origin. Include the port only if non-standard
(e.g. |
|
|
Backend toggle. When |
|
|
Keycloak bootstrap admin username (admin console is served same-origin
at |
|
|
Keycloak bootstrap admin password. Change for any real deployment. |
Note
KEYCLOAK_ISSUER_URI, KEYCLOAK_JWK_SET_URI, and the VITE_AUTH_*
build args are set automatically by docker-compose.prod.yml and derived
from PUBLIC_URL — you normally do not set them by hand.
LLM
Variable |
Default |
Description |
|---|---|---|
|
|
Base URL of an OpenAI-compatible inference API. See LLM Setup. |
|
(empty) |
API key sent in the |
|
|
Model identifier passed in each API request. Must match a model loaded on your inference server. |
|
|
Sampling temperature (0.0–2.0). Lower values produce more deterministic output; higher values more creative output. |
|
|
Maximum number of tokens the LLM may generate per response. Controls response length only — not the context window. Increase if stories are cut off; decrease to save compute. Recommended 4000–8000. |
|
(auto) |
The context window size (in tokens) configured on your LLM server. Used
to detect prompt-too-large errors early. If unset, auto-detected from
the |
|
|
HTTP timeout in seconds for LLM API requests. Local models can be slow — increase if you get timeout errors. |
Overview Applications
Variable |
Default |
Description |
|---|---|---|
|
|
Cap the number of detected applications shown in the overview. Set to
|
|
|
Maximum detected applications shown in the overview when
|
File Extraction
Tunes the limits applied when extracting embedded files from captures. When any limit is hit, a warning is shown on the Extracted Files tab. See File Extraction.
Variable |
Default |
Description |
|---|---|---|
|
|
Max files extracted from a single raw TCP/UDP stream. Guards against runaway extraction on streams with many magic-byte sequences. |
|
|
Max number of non-HTTP streams scanned for embedded files per PCAP. |
|
|
Max size (MB) of a single extracted file that will be stored. Larger files are detected but skipped (shown with a “Too large” badge). |
Frontend (build-time)
VITE_* variables are baked in at build time, so changing them requires a
rebuild (docker compose up -d --build).
Variable |
Default |
Description |
|---|---|---|
|
|
Polygon fidelity of the world map. |
|
|
Comma-separated list of accepted upload extensions. |
|
|
Toggles the 500-conversation rendering cap in the Network Topology
Diagram. Set |
|
|
Version string rendered in the app footer (passed as the
|
Database Configuration (internal)
The following variables configure the PostgreSQL connection. They are set automatically by Docker Compose and generally do not need to be changed unless you are connecting to an external database.
Variable |
Description |
|---|---|
|
Database name |
|
Database user |
|
Database password — change this in production |
|
Backend database connection password — must match |
MinIO Configuration (internal)
Variable |
Description |
|---|---|
|
MinIO admin username (default |
|
MinIO admin password (default |