Skip to main content

Configuration

The environment variables each service reads, grouped by service, with the Helm value that produces each one.

Synopsis

Configuration has two layers, and which one you edit depends on the deployment target. On Kubernetes, charts/agentarea/config.yaml is the source of truth. It declares one group per service; each group lists configVars (plain values), secrets (pulled from a Secret by name and key), and envExtras (values composed from other variables). make helm-gen regenerates the per-group templates under charts/agentarea/templates/configs/ from it, and CI fails if the generated files drift from config.yaml. Every group below maps to a generated ConfigMap named <release>-env-<group>.

Parameters

Database (group database)

Consumed by the backend, worker, and event service. global.database.maxConnections and global.database.connectionTimeout exist in values.yaml but are not rendered into any environment variable by config.yaml. Setting them changes nothing.

Redis (group redis)

REDIS_URL is emitted by templates/_redis-url.tpl, not by the redis group, in this order:
  1. global.redis.existingSecret set — read from that Secret’s global.redis.existingSecretKey (default url). Use this in production; managed Redis URLs carry credentials.
  2. global.redis.url set — used literally.
  3. Neither — derived as redis://:$(REDIS_PASSWORD)@$(REDIS_HOST):$(REDIS_PORT) against the bundled Valkey subchart.
global.redis.database, ssl, maxConnections, and connectionTimeout are present in values.yaml but are not rendered into environment variables.

Object storage (group storage)

Rendered only when rustfs.enabled is true. global.storage.publicEndpoint is rendered in the backend group as PUBLIC_S3_ENDPOINT, not here.

Backend API (group backend)

METRICS_ENABLED, METRICS_PORT, HEALTH_CHECK_ENABLED, and HEALTH_CHECK_PORT are rendered by the chart but have no reader in the Python source. The API serves /health on its normal port unconditionally and exposes no /metrics endpoint. See observability. API_BASE_URL is the URL the backend advertises for itself — provider icon URLs, OAuth protected-resource metadata, and the MCP WWW-Authenticate header. It must be reachable by the client, not by the pod.

Worker (group worker)

global.temporal.worker.maxConcurrentActivityExecutions, maxConcurrentWorkflowTaskExecutions, and maxConcurrentSessionExecutions in values.yaml do not feed these variables — config.yaml hardcodes 10 and 5. To change worker concurrency, use worker.extraEnv. The worker must agree with the API on MCP_LAZY_PROVISIONING_ENABLED. The worker dispatches agent tool calls, so it is a provisioning trigger in its own right; without it a reclaimed instance stays down for agents.

Temporal client (group temporal)

Consumed by the backend and the worker. global.temporal.client.connectionTimeout, rpcTimeout, and longPollTimeout are not rendered into environment variables.

Temporal server (group temporalServer)

MCP Manager (group mcpManager)

MCP_IDLE_TIMEOUT is derived from serverless.enabled rather than configured separately. Only instances created as lazy are eligible for reclaim, so a timeout without lazy start reclaims nothing, and lazy start without a timeout leaves instances up forever. One switch makes both half-configured states unreachable. mcpManager.instancePod (labels, annotations, nodeSelector, tolerations, affinity, imagePullSecrets, priorityClassName) is passed to the manager as a single JSON environment variable, KUBERNETES_INSTANCE_POD. Platform security invariants — the managed-by label, securityContext and seccomp, the withheld ServiceAccount token, and the RuntimeClass clamp — are applied on top and cannot be weakened from these values.

Frontend (group frontend)

ORY_SDK_URL is used for server-side calls from the frontend container; ORY_BROWSER_URL is what the browser is redirected to. Set kratos.urls.publicBrowser separately whenever pods cannot resolve the public domain.

Application secrets (group application)

Secret manager (not in config.yaml)

Read by SecretManagerSettings in the platform. On Kubernetes, set these through backend.extraEnv and worker.extraEnv.

Event service (group eventService values, chart keys only)

Telegram long-polling is a development fallback. Production Telegram ingress uses webhooks.

Sandbox runner (mcpSandboxRunner)

The runner consumes sandbox execution requests from Redis Streams. In Docker Compose there is no separate runner: the manager runs it in-process (SANDBOX_EMBEDDED_RUNNER=true) and delegates execution to the sandbox-executor container over SANDBOX_EXECUTOR_URL.

Docker Compose variables

Read from .env by docker-compose.yaml. Only the ones with no Kubernetes equivalent are listed; the rest map onto the groups above. The two sandbox secrets are declared ${VAR:?message}, so Compose aborts rather than starting with them empty.

Errors

Example

Override a value that config.yaml hardcodes, using the per-service extension point: