Reference for config.toml, agent.toml, and plugins.toml.
Arcentra ships three example configuration files under conf.d/:
File
Used by
Default flag
conf.d/config.toml
Control plane
-conf
conf.d/agent.toml
Agent
-conf
conf.d/plugins.toml
Control plane
-plugin-conf
The example files include placeholder secrets (JWT key, Kafka SASL password,
database credentials). Always replace them before running outside a local
developer environment, and keep them out of source control or use a secret
manager.
The agent shares the metrics, log, Kafka, HTTP, Redis, and task queue layout
with the control plane. The HTTP server defaults to :8081, metrics to
:8084, and the agent uses its own log file (agent.LOG).
Keep the example files as a reference and maintain your real settings in a
separate, secret-managed location.
When using SASL or TLS for Kafka, prefer SASL_SSL and store credentials
outside the repository.
For multi-tenant deployments, give each agent a unique id and a label set
rich enough to drive scheduling decisions.
Match the database, Redis, and Kafka versions used in production with what
your CI environment validates against.
Last modified on April 26, 2026
Was this page helpful?
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Arcentra Documentation","description":"Arcentra Documentation","colors":{"primary":"#0A0A0A","light":"#111827","dark":"#F5F5F5"},"logo":{"light":"https://mintcdn.com/arcade-327ebd26/SUrLgfjkqVKJfT9q/logo/logo.svg?fit=max\u0026auto=format\u0026n=SUrLgfjkqVKJfT9q\u0026q=85\u0026s=58b3601181eb8283ff88dae5613038bc","dark":"https://mintcdn.com/arcade-327ebd26/SUrLgfjkqVKJfT9q/logo/logo.svg?fit=max\u0026auto=format\u0026n=SUrLgfjkqVKJfT9q\u0026q=85\u0026s=58b3601181eb8283ff88dae5613038bc"},"favicon":"https://mintcdn.com/arcade-327ebd26/SUrLgfjkqVKJfT9q/favicon.svg?fit=max\u0026auto=format\u0026n=SUrLgfjkqVKJfT9q\u0026q=85\u0026s=3f070d8802d41e90c7797e74afe1b6cd","appearance":{"default":"system"},"navbar":{"links":[{"href":"mailto:support@arcentra.co","label":"Support"},{"href":"https://github.com/arcentrix/arcentra","type":"github"}]},"footer":{"socials":{"github":"https://github.com/arcentrix/arcentra"}},"seo":{"indexing":"all"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":true},"metadata":{"timestamp":true},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","default":true,"href":"en"},{"language":"zh-Hans","href":"zh"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"arcade-327ebd26","hasAudioNarration":false,"actualSubdomain":"arcade-327ebd26","customDomains":["docs.arcentra.io"],"gitSource":{"type":"github","owner":"arcentrix","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a21f687eb6d34542d277000","collectionId":"7bc3fccf-8d5d-4f5e-8d10-73ca4ec2cfd9","schemaVersion":"v2"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6ae9403b294e429f43e1c0ab:success","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"en","tag":"Guides","count":6},{"language":"zh-Hans","tag":"指南","count":6},{"language":"en","tag":"Getting started","count":3},{"language":"zh-Hans","tag":"快速开始","count":3},{"language":"en","tag":"Concepts","count":2},{"language":"zh-Hans","tag":"核心概念","count":2},{"language":"en","tag":"API reference","count":1},{"language":"en","tag":"Overview","count":1},{"language":"en","tag":"Operate","count":1},{"language":"zh-Hans","tag":"API 参考","count":1},{"language":"zh-Hans","tag":"概览","count":1},{"language":"zh-Hans","tag":"运维","count":1}]},"assistantConfig":{"enableStarterQuestions":false},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/configuration","slug":"/en/configuration","pageMetadata":{"title":"Configuration","description":"Reference for config.toml, agent.toml, and plugins.toml.","href":"/en/configuration"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Reference for config.toml, agent.toml, and plugins.toml.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Table,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Arcentra ships three example configuration files under `,_jsx(_components.code,{children:`conf.d/`}),`:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`File`}),_jsx(_components.th,{children:`Used by`}),_jsx(_components.th,{children:`Default flag`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`conf.d/config.toml`})}),_jsx(_components.td,{children:`Control plane`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`-conf`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`conf.d/agent.toml`})}),_jsx(_components.td,{children:`Agent`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`-conf`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`conf.d/plugins.toml`})}),_jsx(_components.td,{children:`Control plane`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`-plugin-conf`})})]})]})]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`The example files include placeholder secrets (JWT key, Kafka SASL password,\ndatabase credentials). Always replace them before running outside a local\ndeveloper environment, and keep them out of source control or use a secret\nmanager.`})}),`\n`,_jsxs(Heading,{level:`2`,id:`control-plane-config-toml`,children:[`Control plane: `,_jsx(_components.code,{children:`config.toml`})]}),`\n`,_jsxs(_components.p,{children:[`The control plane configuration is read by `,_jsx(_components.code,{children:`cmd/arcentra`}),` and shared across\nHTTP, gRPC, scheduling, and storage subsystems.`]}),`\n`,_jsx(Heading,{level:`3`,id:`metrics`,children:_jsx(_components.code,{children:`[metrics]`})}),`\n`,_jsx(_components.p,{children:`Prometheus-compatible metrics endpoint.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Key`}),_jsx(_components.th,{children:`Purpose`}),_jsx(_components.th,{children:`Default`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`enable`})}),_jsx(_components.td,{children:`Enable or disable the metrics server`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`true`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`host`}),` / `,_jsx(_components.code,{children:`port`})]}),_jsx(_components.td,{children:`Listen address`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0.0.0.0:8082`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`path`})}),_jsx(_components.td,{children:`Scrape path`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/metrics`})})]})]})]}),`\n`,_jsxs(Heading,{level:`3`,id:`trace-and-trace-batch`,children:[_jsx(_components.code,{children:`[trace]`}),` and `,_jsx(_components.code,{children:`[trace.batch]`})]}),`\n`,_jsx(_components.p,{children:`OpenTelemetry tracing.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`exporterType`}),`: `,_jsx(_components.code,{children:`jaeger`}),`, `,_jsx(_components.code,{children:`otlp-grpc`}),`, `,_jsx(_components.code,{children:`otlp-http`}),`, or `,_jsx(_components.code,{children:`none`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`endpoint`}),`, `,_jsx(_components.code,{children:`insecure`}),`, `,_jsx(_components.code,{children:`headers`}),`: configure the exporter target.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[trace.batch]`}),` controls queue size and export timeouts; raise\n`,_jsx(_components.code,{children:`exportTimeout`}),` if you see `,_jsx(_components.code,{children:`context deadline exceeded`}),`.`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`3`,id:`events-and-messagequeue-kafka`,children:[_jsx(_components.code,{children:`[events]`}),` and `,_jsx(_components.code,{children:`[messageQueue.kafka]`})]}),`\n`,_jsx(_components.p,{children:`CloudEvents publishing and the Kafka transport. Important keys:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[events].sourcePrefix`}),` — prefix used for event sources.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[messageQueue.kafka].bootstrapServers`}),` — Kafka brokers.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`securityProtocol`}),` — `,_jsx(_components.code,{children:`PLAINTEXT`}),`, `,_jsx(_components.code,{children:`SSL`}),`, `,_jsx(_components.code,{children:`SASL_PLAINTEXT`}),`, `,_jsx(_components.code,{children:`SASL_SSL`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[messageQueue.kafka.sasl]`}),` — SASL `,_jsx(_components.code,{children:`mechanism`}),`, `,_jsx(_components.code,{children:`username`}),`, `,_jsx(_components.code,{children:`password`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[messageQueue.kafka.ssl]`}),` — TLS material when `,_jsx(_components.code,{children:`SSL`}),` is enabled.`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`3`,id:`log-and-logger-`,children:[_jsx(_components.code,{children:`[log]`}),` and `,_jsx(_components.code,{children:`[logger.*]`})]}),`\n`,_jsx(_components.p,{children:`Two complementary logging modes:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[log]`}),` — single-output logger (`,_jsx(_components.code,{children:`stdout`}),`, `,_jsx(_components.code,{children:`file`}),`, or `,_jsx(_components.code,{children:`kafka`}),`) with rotation\nby time and size.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[logger.*]`}),` — multi-category logger initialized via `,_jsx(_components.code,{children:`logger.InitMulti`}),`,\nwith per-category outputs (HTTP, plugin, cron, and so on).`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`3`,id:`grpc-and-http`,children:[_jsx(_components.code,{children:`[grpc]`}),` and `,_jsx(_components.code,{children:`[http]`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Section`}),_jsx(_components.th,{children:`Notable keys`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`[grpc]`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`host`}),`, `,_jsx(_components.code,{children:`port`}),`, `,_jsx(_components.code,{children:`maxConnections`}),`, `,_jsx(_components.code,{children:`readWriteTimeout`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`[http]`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`host`}),`, `,_jsx(_components.code,{children:`port`}),`, `,_jsx(_components.code,{children:`accessLog`}),`, read/write/idle/shutdown timeouts, `,_jsx(_components.code,{children:`bodyLimit`})]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`[http.auth]`}),` controls JWT issuance:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`accessExpire`}),` and `,_jsx(_components.code,{children:`refreshExpire`}),` accept duration strings (`,_jsx(_components.code,{children:`60m`}),`, `,_jsx(_components.code,{children:`1h`}),`,\n`,_jsx(_components.code,{children:`7d`}),`); plain numbers fall back to minutes.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`secretKey`}),` must be rotated before any non-local deployment.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`database`,children:_jsx(_components.code,{children:`[database]`})}),`\n`,_jsxs(_components.p,{children:[`Choose `,_jsx(_components.code,{children:`mysql`}),` or `,_jsx(_components.code,{children:`sqlite`}),` via `,_jsx(_components.code,{children:`driver`}),`.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[database.mysql].dsn`}),` — full DSN with charset and `,_jsx(_components.code,{children:`parseTime=True`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[database.sqlite].dsn`}),` — file path; SQLite is unsuitable for production\ncontrol-plane usage.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[database.options]`}),` — connection pool size, max lifetime/idletime, and SQL\nlogging (`,_jsx(_components.code,{children:`output`}),`).`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`redis`,children:_jsx(_components.code,{children:`[redis]`})}),`\n`,_jsx(_components.p,{children:`Single, cluster, or sentinel modes.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`mode`}),` — `,_jsx(_components.code,{children:`single`}),`, `,_jsx(_components.code,{children:`cluster`}),`, or `,_jsx(_components.code,{children:`sentinel`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`address`}),` — single host, comma-separated cluster endpoints, or sentinel\naddresses.`]}),`\n`,_jsxs(_components.li,{children:[`TLS, sentinel master and credentials, and `,_jsx(_components.code,{children:`maxRedirects`}),` are commented out\nin the defaults; uncomment as needed.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`taskqueue`,children:_jsx(_components.code,{children:`[taskQueue]`})}),`\n`,_jsx(_components.p,{children:`Task queue configuration for delayed jobs.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`provider`}),` — `,_jsx(_components.code,{children:`kafka`}),` is the supported default.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`delaySlotCount`}),` and `,_jsx(_components.code,{children:`delaySlotDuration`}),` — control delayed-execution slots.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`messageFormat`}),` and `,_jsx(_components.code,{children:`messageCodec`}),` — `,_jsx(_components.code,{children:`protobuf`}),`, `,_jsx(_components.code,{children:`json`}),`, `,_jsx(_components.code,{children:`sonic`}),`, or `,_jsx(_components.code,{children:`blob`}),`.`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`2`,id:`agent-agent-toml`,children:[`Agent: `,_jsx(_components.code,{children:`agent.toml`})]}),`\n`,_jsxs(_components.p,{children:[`The agent file is read by `,_jsx(_components.code,{children:`cmd/arcentra-agent`}),` and connects each agent to the\ncontrol plane.`]}),`\n`,_jsx(Heading,{level:`3`,id:`grpc`,children:_jsx(_components.code,{children:`[grpc]`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`serverAddr`}),` — control-plane gRPC address (`,_jsx(_components.code,{children:`host:port`}),`).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`token`}),` — bearer token for agent authentication.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`readWriteTimeout`}),`, `,_jsx(_components.code,{children:`maxMsgSize`}),`, `,_jsx(_components.code,{children:`maxReconnectAttempts`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`agent`,children:_jsx(_components.code,{children:`[agent]`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`mode`}),` — `,_jsx(_components.code,{children:`sandbox`}),` or `,_jsx(_components.code,{children:`baremetal`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`id`}),`, `,_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`description`}),` — identity for scheduling and audit.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`interval`}),` — heartbeat interval, in seconds.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`maxConcurrentJobs`}),`, `,_jsx(_components.code,{children:`jobTimeout`}),` — concurrency budget and per-job timeout.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`workspaceDir`}),`, `,_jsx(_components.code,{children:`tempDir`}),`, `,_jsx(_components.code,{children:`cacheDir`}),` — local working directories.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`deniedCommands`}),` — commands the shell builtin must refuse.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`proxyUrl`}),` — outbound proxy.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[agent.labels]`}),` — arbitrary key/value labels used by step run selectors\n(for example `,_jsx(_components.code,{children:`env`}),`, `,_jsx(_components.code,{children:`team`}),`, `,_jsx(_components.code,{children:`region`}),`).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[agent.resourceLimits]`}),` — declared CPU/memory budgets.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[agent.envVars]`}),` — environment variables injected into jobs.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[agent.cleanupPolicy]`}),` — workspace retention (`,_jsx(_components.code,{children:`max_size_gb`}),`,\n`,_jsx(_components.code,{children:`max_age_days`}),`).`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`3`,id:`agent-sandbox-agent-sandbox-containerd-agent-sandbox-kubernetes`,children:[_jsx(_components.code,{children:`[agent.sandbox]`}),`, `,_jsx(_components.code,{children:`[agent.sandbox.containerd]`}),`, `,_jsx(_components.code,{children:`[agent.sandbox.kubernetes]`})]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`enable`}),` and `,_jsx(_components.code,{children:`runtime`}),` — switch between `,_jsx(_components.code,{children:`containerd`}),` and `,_jsx(_components.code,{children:`kubernetes`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`containerd: `,_jsx(_components.code,{children:`network`}),`, `,_jsx(_components.code,{children:`unixSocket`}),`, default `,_jsx(_components.code,{children:`image`}),`, and resource limits.`]}),`\n`,_jsxs(_components.li,{children:[`kubernetes: target `,_jsx(_components.code,{children:`namespace`}),`, `,_jsx(_components.code,{children:`podName`}),`, `,_jsx(_components.code,{children:`image`}),`, and resource limits.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`other-sections`,children:`Other sections`}),`\n`,_jsxs(_components.p,{children:[`The agent shares the metrics, log, Kafka, HTTP, Redis, and task queue layout\nwith the control plane. The HTTP server defaults to `,_jsx(_components.code,{children:`:8081`}),`, metrics to\n`,_jsx(_components.code,{children:`:8084`}),`, and the agent uses its own log file (`,_jsx(_components.code,{children:`agent.LOG`}),`).`]}),`\n`,_jsxs(Heading,{level:`2`,id:`plugins-and-builtins-plugins-toml`,children:[`Plugins and builtins: `,_jsx(_components.code,{children:`plugins.toml`})]}),`\n`,_jsxs(_components.p,{children:[`This file provides default `,_jsx(_components.code,{children:`args.config`}),` for builtins and per-plugin\nconfiguration. Step-level configuration overrides these defaults.`]}),`\n`,_jsx(Heading,{level:`3`,id:`builtins`,children:`Builtins`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[builtins.shell]`}),` — shell binary, default `,_jsx(_components.code,{children:`timeout`}),`, and\n`,_jsx(_components.code,{children:`allowDangerous`}),` flag.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[builtins.stdout]`}),` — output `,_jsx(_components.code,{children:`prefix`}),` and `,_jsx(_components.code,{children:`json`}),` toggle.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[builtins.artifacts]`}),`, `,_jsx(_components.code,{children:`[builtins.reports]`}),`, `,_jsx(_components.code,{children:`[builtins.scm]`}),` — reserved\nfor future use.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`plugins`,children:`Plugins`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[plugins.git]`}),` — `,_jsx(_components.code,{children:`gitPath`}),`, default `,_jsx(_components.code,{children:`userName`}),` / `,_jsx(_components.code,{children:`userEmail`}),`, shallow\nclone settings.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`[plugins.svn]`}),` — `,_jsx(_components.code,{children:`svnPath`}),`, default credentials, `,_jsx(_components.code,{children:`trustServerCert`}),`,\n`,_jsx(_components.code,{children:`nonInteractive`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`configuration-tips`,children:`Configuration tips`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Keep the example files as a reference and maintain your real settings in a\nseparate, secret-managed location.`}),`\n`,_jsxs(_components.li,{children:[`When using SASL or TLS for Kafka, prefer `,_jsx(_components.code,{children:`SASL_SSL`}),` and store credentials\noutside the repository.`]}),`\n`,_jsxs(_components.li,{children:[`For multi-tenant deployments, give each agent a unique `,_jsx(_components.code,{children:`id`}),` and a label set\nrich enough to drive scheduling decisions.`]}),`\n`,_jsx(_components.li,{children:`Match the database, Redis, and Kafka versions used in production with what\nyour CI environment validates against.`}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Configuration","description":"Reference for config.toml, agent.toml, and plugins.toml.","href":"/en/configuration"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Control plane: config.toml","slug":"control-plane-config-toml","depth":2,"children":[{"title":"[metrics]","slug":"metrics","depth":3,"children":[]},{"title":"[trace] and [trace.batch]","slug":"trace-and-trace-batch","depth":3,"children":[]},{"title":"[events] and [messageQueue.kafka]","slug":"events-and-messagequeue-kafka","depth":3,"children":[]},{"title":"[log] and [logger.*]","slug":"log-and-logger-","depth":3,"children":[]},{"title":"[grpc] and [http]","slug":"grpc-and-http","depth":3,"children":[]},{"title":"[database]","slug":"database","depth":3,"children":[]},{"title":"[redis]","slug":"redis","depth":3,"children":[]},{"title":"[taskQueue]","slug":"taskqueue","depth":3,"children":[]}]},{"title":"Agent: agent.toml","slug":"agent-agent-toml","depth":2,"children":[{"title":"[grpc]","slug":"grpc","depth":3,"children":[]},{"title":"[agent]","slug":"agent","depth":3,"children":[]},{"title":"[agent.sandbox], [agent.sandbox.containerd], [agent.sandbox.kubernetes]","slug":"agent-sandbox-agent-sandbox-containerd-agent-sandbox-kubernetes","depth":3,"children":[]},{"title":"Other sections","slug":"other-sections","depth":3,"children":[]}]},{"title":"Plugins and builtins: plugins.toml","slug":"plugins-and-builtins-plugins-toml","depth":2,"children":[{"title":"Builtins","slug":"builtins","depth":3,"children":[]},{"title":"Plugins","slug":"plugins","depth":3,"children":[]}]},{"title":"Configuration tips","slug":"configuration-tips","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"arcade-327ebd26","siteName":"Arcentra Documentation","title":"Configuration - Arcentra Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/configuration","matchLevel":0},"zh-Hans":{"href":"/zh/configuration","matchLevel":1}}},"lastModified":"2026-04-26T14:45:22.531Z","originalFileLocation":"en/configuration.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Reference for config.toml, agent.toml, and plugins.toml.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Arcentra Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Configuration - Arcentra Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Reference for config.toml, agent.toml, and plugins.toml.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Arcentra Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.arcentra.io/en/configuration\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://arcade-327ebd26.mintlify.site/_mintlify/api/og/v2?division=Operate\u0026amp;title=Configuration\u0026amp;description=Reference+for+config.toml%2C+agent.toml%2C+and+plugins.toml.\u0026amp;theme=1c01cdfce5d4998c8c63fd4b\u0026amp;signature=1571323c8df0a5f006839192cd34b44b838463bfb4d6ffc5f2bd2daa18326db5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Configuration - Arcentra Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Reference for config.toml, agent.toml, and plugins.toml.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://arcade-327ebd26.mintlify.site/_mintlify/api/og/v2?division=Operate\u0026amp;title=Configuration\u0026amp;description=Reference+for+config.toml%2C+agent.toml%2C+and+plugins.toml.\u0026amp;theme=1c01cdfce5d4998c8c63fd4b\u0026amp;signature=1571323c8df0a5f006839192cd34b44b838463bfb4d6ffc5f2bd2daa18326db5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/arcade-327ebd26/ul9bMe4cDpqm6e7i/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Arcentra Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0A0A0A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.arcentra.io/en/configuration\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/configuration.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.arcentra.io/en/configuration\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hans\" href=\"https://docs.arcentra.io/zh/configuration\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.arcentra.io/en/configuration\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.arcentra.io/#organization\",\"name\":\"Arcentra Documentation\",\"url\":\"https://docs.arcentra.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/arcade-327ebd26/SUrLgfjkqVKJfT9q/logo/logo.svg?fit=max\u0026auto=format\u0026n=SUrLgfjkqVKJfT9q\u0026q=85\u0026s=58b3601181eb8283ff88dae5613038bc\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.arcentra.io#website\",\"name\":\"Arcentra Documentation\",\"url\":\"https://docs.arcentra.io\",\"publisher\":{\"@id\":\"https://docs.arcentra.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.arcentra.io/en/configuration#webpage\",\"url\":\"https://docs.arcentra.io/en/configuration\",\"name\":\"Configuration\",\"description\":\"Reference for config.toml, agent.toml, and plugins.toml.\",\"dateModified\":\"2026-04-26T14:45:22.531Z\",\"isPartOf\":{\"@id\":\"https://docs.arcentra.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.arcentra.io/en/configuration#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.arcentra.io/en/configuration#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Arcentra Documentation\",\"item\":\"https://docs.arcentra.io\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configuration\",\"item\":\"https://docs.arcentra.io/en/configuration\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.arcentra.io/en/configuration#article\",\"headline\":\"Configuration\",\"name\":\"Configuration\",\"description\":\"Reference for config.toml, agent.toml, and plugins.toml.\",\"url\":\"https://docs.arcentra.io/en/configuration\",\"mainEntityOfPage\":{\"@id\":\"https://docs.arcentra.io/en/configuration#webpage\"},\"dateModified\":\"2026-04-26T14:45:22.531Z\",\"publisher\":{\"@id\":\"https://docs.arcentra.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.arcentra.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Arcentra Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Arcentra Documentation","nav":{"global":null,"languages":[{"language":"en","default":true,"tabs":[{"tab":"Guides","groups":[{"group":"Getting started","pages":[{"title":"Arcentra","href":"/en"},{"title":"Quickstart","href":"/en/quickstart"},{"title":"Development","href":"/en/development"}]},{"group":"Concepts","pages":[{"title":"Architecture","href":"/en/architecture"},{"title":"Pipelines","description":"Pipeline model, DSL, run lifecycle, and HTTP API.","href":"/en/pipelines"}]},{"group":"Operate","pages":[{"title":"Configuration","href":"/en/configuration"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/en/api-reference/introduction"}]}]},{"language":"zh-Hans","pages":[{"title":"zh-Hans","href":"/zh/configuration"}]}]},"basePath":"","title":"Configuration - Arcentra Documentation","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":[],"chunks":[]}