Skip to content

Environment Variables

All Mantis components support environment variable configuration. Environment variables override file-based settings.

Each component uses a different convention:

ComponentConventionExample
MandibleMANDIBLE__SECTION__KEYMANDIBLE__JWT__SECRET
ThoraxTHORAX__SECTION__KEYTHORAX__GRPC__PORT
TarsusTARSUS__SECTION__KEYTARSUS__LISTEN__PORT
SharedMANTIS_ or DATABASE_URLMANTIS_TLS_CERT_PATH

All components use double underscore (__) as the separator for nested configuration sections. Shared variables (MANTIS_*, DATABASE_URL) use single underscores.

These environment variables are used by multiple components.

VariableComponentsDescription
MANTIS_TLS_CERT_PATHThorax, TarsusTLS certificate PEM file
MANTIS_TLS_KEY_PATHThorax, TarsusTLS private key PEM file
MANTIS_TLS_CA_CERT_PATHThorax, TarsusCA certificate PEM file
MANTIS_TLS_CA_KEY_PATHThoraxCA private key for signing client CSRs
MANTIS_TLS_AUTH_MODEThoraxTLS auth mode: thumbprint or ca_signed
MANTIS_ENCRYPTION_KEYMandible, ThoraxBase64-encoded 32-byte encryption key
MANTIS_LOG_LEVELThoraxLog level override
RABBITMQ_ENABLEDThoraxThorax-only: auto-enables cluster coordination when RabbitMQ is on (Mandible uses MANDIBLE__QUEUE__ENABLED)

Mandible uses the config crate with MANDIBLE__ prefix and double underscore separators.

MANDIBLE__<SECTION>__<KEY>=value

The database connection URL is conventionally set with MANDIBLE__DATABASE__URL. The unprefixed DATABASE_URL is also honored (and is what the Docker examples below use).

VariableDefaultDescription
MANDIBLE__SERVER__HOST"0.0.0.0"HTTP bind address
MANDIBLE__SERVER__PORT3000HTTP port
MANDIBLE__SERVER__REQUEST_TIMEOUT_SECS30Request timeout
MANDIBLE__SERVER__EXTERNAL_URL-External URL for OAuth2 discovery
MANDIBLE__DATABASE__URL-PostgreSQL connection URL
MANDIBLE__DATABASE__MAX_CONNECTIONS10Connection pool max size
MANDIBLE__JWT__SECRET-HS256 signing secret
MANDIBLE__JWT__ALGORITHM"HS256"JWT algorithm
MANDIBLE__JWT__PRIVATE_KEY_PATH-RS256 private key
MANDIBLE__JWT__PUBLIC_KEY_PATH-RS256 public key
MANDIBLE__JWT__KEY_ID"k1"Current key ID
MANDIBLE__JWT__PREVIOUS_SECRET-Previous secret for rotation
MANDIBLE__JWT__ACCESS_TOKEN_EXPIRY_SECS3600Access token lifetime
MANDIBLE__JWT__REFRESH_TOKEN_EXPIRY_SECS2592000Refresh token lifetime
MANDIBLE__CORS__ALLOWED_ORIGINSlocalhost dev originsComma-separated origins
MANDIBLE__CORS__ALLOW_CREDENTIALStrueAllow credentials
MANDIBLE__CORS__MAX_AGE_SECS3600Preflight cache duration
MANDIBLE__COOKIE__SECUREtrue (release)HTTPS-only cookies
MANDIBLE__COOKIE__SAME_SITE"Lax"SameSite policy
MANDIBLE__AUTH__LENS_BASE_URL"https://localhost:5173/login"Lens UI login URL
MANDIBLE__GRPC__ORCHESTRATION_URL"https://localhost:50051"Thorax gRPC URL
MANDIBLE__GRPC__TLS_CA_CERT_PATH-gRPC CA cert path (HTTPS URLs)
MANDIBLE__GRPC__TLS_CERT_PATH-gRPC client cert path (mTLS)
MANDIBLE__GRPC__TLS_KEY_PATH-gRPC client key path (mTLS)
MANDIBLE__INTERNAL_GRPC__ENABLEDfalseEnable internal gRPC server
MANDIBLE__INTERNAL_GRPC__HOST"0.0.0.0"Internal gRPC bind address
MANDIBLE__INTERNAL_GRPC__PORT50052Internal gRPC port
MANDIBLE__INTERNAL_GRPC__TLS_CERT_PATH-Internal gRPC server cert
MANDIBLE__INTERNAL_GRPC__TLS_KEY_PATH-Internal gRPC server key
MANDIBLE__INTERNAL_GRPC__TLS_CA_CERT_PATH-Internal gRPC CA cert
MANDIBLE__RATE_LIMIT__ENABLEDtrueEnable rate limiting
MANDIBLE__RATE_LIMIT__REQUESTS_PER_SECOND100Max requests per second
MANDIBLE__RATE_LIMIT__BURST_SIZE200Burst size
MANDIBLE__ENCRYPTION__KEY-Base64-encoded 32-byte encryption key
SSE_REDIS_URL"redis://127.0.0.1:6379"SSE Redis URL
MANDIBLE__QUEUE__ENABLEDfalseEnable RabbitMQ
MANDIBLE__QUEUE__HOST"localhost"RabbitMQ host
MANDIBLE__QUEUE__PORT5671RabbitMQ AMQPS port
MANDIBLE__QUEUE__USERNAME""RabbitMQ username
MANDIBLE__QUEUE__PASSWORD""RabbitMQ password
MANDIBLE__QUEUE__VHOST"/"RabbitMQ vhost
MANDIBLE__QUEUE__CA_CERT_PATH-RabbitMQ CA cert
MANDIBLE__QUEUE__FALLBACK_ON_FAILUREtrueFall back to polling
MANDIBLE__QUEUE__HEALTH_CHECK_INTERVAL_SECS10Health check interval
MANDIBLE__FILE_CACHE__ENABLEDtrueEnable file cache
MANDIBLE__FILE_CACHE__MEMORY_MAX_SIZE_BYTES104857600Cache max size (100 MB)
MANDIBLE__LOG_ANALYZER__PROVIDER_TYPE"ollama"LLM provider: ollama or openai
MANDIBLE__LOG_ANALYZER__API_URL"http://ollama:11434"LLM provider API URL
MANDIBLE__LOG_ANALYZER__MODEL"granite4"Model name

Thorax uses apply_env_overrides() with double-underscore separators for nested sections.

VariableDefaultDescription
THORAX_CONFIG-Path to config file
THORAX__NAMEhostname-derivedServer name
MANTIS_LOG_LEVEL"info"Log level
THORAX__GRPC__ADDRESS"0.0.0.0"gRPC bind address
THORAX__GRPC__PORT50051gRPC port
THORAX__GRPC__ENROLLMENT_PORT-Enrollment port (ca_signed)
MANTIS_TLS_CERT_PATH-Server TLS certificate
MANTIS_TLS_KEY_PATH-Server TLS private key
MANTIS_TLS_CA_CERT_PATH-CA certificate
MANTIS_TLS_CA_KEY_PATH-CA private key
MANTIS_TLS_AUTH_MODE"thumbprint"TLS auth mode
MANTIS_ENCRYPTION_KEY-Encryption key
THORAX__CONSOLE__ENABLEDfalseEnable tokio-console
THORAX__CONSOLE__ADDRESS"127.0.0.1"Console bind address
THORAX__CONSOLE__PORT0 (OS-assigned ephemeral port)Console port. Convention is 6669; set THORAX__CONSOLE__PORT=6669 explicitly (or in thorax.toml) to use the conventional port.
THORAX__CONSOLE__RETENTION_SECS60Console data retention
THORAX__CONSOLE__PUBLISH_INTERVAL_MS1000Console publish interval
THORAX__CONSOLE__RECORDING_PATH-Console recording path
THORAX__MANDIBLE__ENDPOINT"https://localhost:50052"Mandible gRPC endpoint (required)
THORAX__MANDIBLE__CONNECT_TIMEOUT_SECS10Mandible connect timeout
THORAX__MANDIBLE__REQUEST_TIMEOUT_SECS30Mandible request timeout
THORAX__MANDIBLE__HEARTBEAT_INTERVAL_SECS30Mandible heartbeat interval
THORAX__MANDIBLE__TLS_CERT_PATH-Mandible client cert
THORAX__MANDIBLE__TLS_KEY_PATH-Mandible client key
THORAX__MANDIBLE__TLS_CA_CERT_PATH-Mandible CA cert
RABBITMQ_ENABLEDfalseEnable queue + cluster coordination
THORAX__QUEUE__ENABLEDfalseQueue enabled (explicit)
THORAX__QUEUE__HOST"localhost"RabbitMQ host
THORAX__QUEUE__PORT5671RabbitMQ port
THORAX__QUEUE__USERNAME""RabbitMQ username
THORAX__QUEUE__PASSWORD""RabbitMQ password
THORAX__QUEUE__VHOST"/"RabbitMQ vhost
THORAX__QUEUE__CA_CERT_PATH-RabbitMQ CA cert
THORAX__QUEUE__CLIENT_CERT_PATH-RabbitMQ client cert
THORAX__QUEUE__CLIENT_KEY_PATH-RabbitMQ client key
THORAX__QUEUE__FALLBACK_ON_FAILUREtrueFall back to polling
THORAX__QUEUE__RECONNECT_DELAY_SECS5Reconnect delay
THORAX__CLUSTER__ENABLEDfalseCluster enabled (explicit)
THORAX__CLUSTER__REDIS_URL"redis://localhost:6379"Redis URL
THORAX__CLUSTER__HEARTBEAT_INTERVAL_SECS10Cluster heartbeat
THORAX__CLUSTER__LIVENESS_TIMEOUT_SECS30Liveness timeout
THORAX__CLUSTER__NAMESPACE"thorax"Redis key namespace
THORAX__WIREGUARD__ENABLEDfalseEnable the WireGuard overlay controller (guide)
THORAX__WIREGUARD__OVERLAY_IP"10.99.0.1"Controller’s overlay address
THORAX__WIREGUARD__OVERLAY_PREFIX_LEN16Overlay subnet prefix length
THORAX__WIREGUARD__UDP_BIND_ADDR"0.0.0.0:51820"WireGuard data-plane UDP bind
THORAX__WIREGUARD__UDP_ADVERTISE_ADDR(bind addr)Publicly reachable UDP endpoint advertised to agents
THORAX__WIREGUARD__PRIVATE_KEY_PATH/var/lib/mantis/thorax-wireguard.keyPersisted controller keypair path

Tarsus uses apply_env_overrides() with double-underscore separators for nested sections.

VariableDefaultDescription
TARSUS_CONFIG-Path to config file
TARSUS__NAMEhostnameClient name
TARSUS__MODE"listen"Operating mode: listen or poll
TARSUS__LOG_LEVEL"info"Log level
TARSUS__DATA_DIRplatform data dirData directory
TARSUS__MANDIBLE__ENDPOINT"localhost:50052"Mandible internal gRPC endpoint for registration (host:port) — typically port 50052, not the REST API port 3000
TARSUS__LISTEN__ADDRESS"0.0.0.0"Listen bind address
TARSUS__LISTEN__PORT9342Listen port
TARSUS__POLL__INTERVAL_SECS30Poll interval (seconds)
TARSUS__REGISTRATION__HEARTBEAT_INTERVAL_SECS30Heartbeat interval (seconds)
TARSUS__REGISTRATION__ENVIRONMENT-Environment name for target
TARSUS__REGISTRATION__TOKEN-Registration token
MANTIS_TLS_CERT_PATH-Client TLS certificate
MANTIS_TLS_KEY_PATH-Client TLS private key
MANTIS_TLS_CA_CERT_PATH-CA certificate
MANTIS_TLS_SERVER_THUMBPRINT-Server thumbprint (SHA-256 hex, 64 chars)
TARSUS__TLS__ENROLLMENT_ADDRESS-CSR enrollment address (host:port)
TARSUS__CONSOLE__ENABLEDfalseEnable tokio-console
TARSUS__CONSOLE__ADDRESS"127.0.0.1"Console bind address
TARSUS__CONSOLE__PORT6671 (assigned at startup)Console port
TARSUS__CONSOLE__RETENTION_SECS60Console data retention
TARSUS__CONSOLE__PUBLISH_INTERVAL_MS1000Console publish interval
TARSUS__CONSOLE__RECORDING_PATH-Console recording path
TARSUS__TRANSPORT__ENABLEDfalseEnable WireGuard transport
TARSUS__TRANSPORT__PRIVATE_KEY_PATH-WireGuard private key path
TARSUS__TRANSPORT__KEY_ROTATION_INTERVAL_SECS0WireGuard key rotation interval (seconds; 0 disables)
environment:
DATABASE_URL: 'postgres://mantis:secret@db:5432/mantis'
MANDIBLE__JWT__SECRET: '${JWT_SECRET}'
MANDIBLE__CORS__ALLOWED_ORIGINS: 'https://lens.example.com'
MANDIBLE__GRPC__ORCHESTRATION_URL: 'https://thorax:50051'
MANDIBLE__INTERNAL_GRPC__ENABLED: 'true'
MANDIBLE__QUEUE__ENABLED: 'true'
MANDIBLE__QUEUE__HOST: 'rabbitmq'
MANDIBLE__ENCRYPTION__KEY: '${ENCRYPTION_KEY}'
environment:
MANTIS_TLS_CERT_PATH: '/certs/server.crt'
MANTIS_TLS_KEY_PATH: '/certs/server.key'
MANTIS_TLS_CA_CERT_PATH: '/certs/ca.crt'
MANTIS_ENCRYPTION_KEY: '${ENCRYPTION_KEY}'
THORAX__MANDIBLE__ENDPOINT: 'https://mandible:50052'
RABBITMQ_ENABLED: 'true'
THORAX__QUEUE__HOST: 'rabbitmq'
THORAX__QUEUE__PASSWORD: '${RABBITMQ_PASSWORD}'
THORAX__CLUSTER__REDIS_URL: 'redis://redis:6379'
environment:
TARSUS__MODE: 'listen'
TARSUS__MANDIBLE__ENDPOINT: 'mandible:50052'
MANTIS_TLS_CA_CERT_PATH: '/certs/ca.crt'
MANTIS_TLS_SERVER_THUMBPRINT: '${SERVER_THUMBPRINT}'
TARSUS__REGISTRATION__ENVIRONMENT: 'production'
TARSUS__REGISTRATION__TOKEN: '${REGISTRATION_TOKEN}'