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:
global.redis.existingSecretset — read from that Secret’sglobal.redis.existingSecretKey(defaulturl). Use this in production; managed Redis URLs carry credentials.global.redis.urlset — used literally.- 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 thatconfig.yaml hardcodes, using the per-service extension
point:
Related
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