Skip to content
MCP server built inHow that works

Configuration

The agent service is configured entirely through the environment. Required values have no built-in defaults: if one is missing, startup aborts and names the variable.

On this page

Validation happens once at startup, and completely. A misconfigured variable should not kill the service hours later on the first call that happens to need it.

Required

VariableMeaning
DATABASE_URLPostgreSQL connection string (postgres:// or postgresql://).
KEYCLOAK_URLKeycloak base URL without a trailing slash — the internal one, used for JWKS and token exchange.
KEYCLOAK_REALMName of the realm.
AGENT_CLIENT_IDThe service's OIDC client id; also the expected audience of incoming tokens.
AGENT_CLIENT_SECRETThe matching secret (confidential client).
PLATFORM_ENCRYPTION_KEYKey material for the credential store, produced by scripts/generate-secrets.sh.
PORTTCP port the HTTP server listens on.

Rotate PLATFORM_ENCRYPTION_KEY only deliberately

The key for every stored secret is derived from this material. After a change, those secrets have to be entered again.

Identity and addresses

VariableMeaning
KEYCLOAK_ISSUER_URLThe public, browser-facing Keycloak address. It alone determines the expected token issuer. Unset, it falls back to KEYCLOAK_URL — correct for single-host and development setups, wrong as soon as inside and outside differ.
TRINO_URLAddress of the Trino coordinator. Defaults to the in-cluster service address.
MINIO_ENDPOINT, MINIO_REGIONObject storage for table data and the audit archive.

Security

VariableDefaultMeaning
SOURCE_TLS_MODEverifyTransport security to source databases: verify enforces TLS with certificate verification, require TLS without it, disable none at all. Overridable per source.
SOURCE_EGRESS_ALLOWLISTemptyComma-separated host patterns or CIDRs. Set: outbound admin calls may only go there. Empty: permissive — except for the always-active block on link-local and cloud-metadata addresses. A malformed CIDR entry prevents startup.
TRINO_ACCESS_RULES_FILEunsetPath the agent writes the generated row and column rules to — on a volume Trino also reads. Unset, policies are stored but not enforced.

Embeddings

VariableMeaning
EMBEDDING_BASE_URLOpenAI-compatible address of the embedding provider. The local model by default.
EMBEDDING_MODELModel name, nomic-embed-text by default.
EMBEDDING_API_KEYOnly needed if the provider requires one — the local model does not.
EMBEDDING_DIMENSIONSDimension of the vector column. Must match the migration; changing it means rebuilding the index.

Audit archival

VariableMeaning
AUDIT_BUCKETBucket holding the archived hash chain, under Object Lock.
AUDIT_BATCH_SIZE, AUDIT_FLUSH_INTERVAL_MSHow large a batch grows and how long it may wait at most.
AUDIT_RETENTION_DAYSRetention period in the archive.
AUDIT_S3_DISABLEDTurns archival off. For tests — not for production.

Further switches

VariableMeaning
KEYCLOAK_ADMIN_USER, KEYCLOAK_ADMIN_PASSWORDEffective only together. Without them the user and role management routes are not registered — the feature is simply absent.
CRAWL_ROOTSThe directories the fileshare crawler may touch at all.
MODEL_ANTHROPIC, MODEL_OPENAI, MODEL_OPENAI_COMPATIBLE, MODEL_CLAUDE_SUBSCRIPTIONDefault model ids per provider, overridable per deployment.
CLAUDE_OAUTH_CLIENT_IDPublic client id for the sign-in-with-Claude flow.
K8S_API_URL, K8S_API_TOKEN, K8S_NAMESPACEOnly for reaching the Kubernetes API from outside the cluster. In-cluster, the mounted ServiceAccount provides everything.

Secrets are generated for you

up.sh and bootstrap.sh create a .env with random values on first run. That file stays out of version control.

Applies to: This page describes lavalake 0.16.0. Product and documentation live in separate repositories — when in doubt, what the console shows is authoritative.

Something missing?

If these pages do not answer your question, we will walk through the platform against your own case in half an hour.

Book a demo