Skip to main content
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. Neither the API nor the worker configures on-demand MCP start any more. Every container-backed call goes through the manager’s demand gateway, which starts a cold workload itself; there is nothing for the Python side to agree on. See the MCP Manager group below.

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)

All four gateway durations are required — the manager refuses to start when one is missing or unparseable, and only MCP_IDLE_TIMEOUT may be zero (LoadPolicyFromEnv in internal/mcpgateway/gateway.go). Failing to boot is the intended outcome: a gateway with an unset lease TTL would hold workloads open indefinitely. serverless.enabled collapses to a single duration: enabled renders idleTimeout, disabled renders 0, and 0 means “never reclaim”. The switch controls idle reclaim only. On-demand start is not conditional — every container-backed call passes through the gateway, which serializes cold starts and brings the workload up regardless of this setting. 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:

Requirements

Host, cluster, and dependency versions required to run AgentArea, per deployment target

Deploy on Kubernetes with Helm

Install the agentarea Helm chart, decide which bundled dependencies to keep

Deploy with Docker Compose

Run the full AgentArea platform on one host with docker- compose.yaml

Choose a secrets backend

Configure where AgentArea stores workspace secrets

Collect logs and metrics

Read AgentArea’s structured JSON logs, enable OpenTelemetry tracing
Last modified on September 17, 2026