配置
--config 指定唯一一份常规文件。相对值只按进程启动时的 cwd 解析一次,绝对值保持绝对语义;文件 leaf 以 no-follow 方式打开,不搜索 parent 或 $HOME。TOML 内的相对文件系统路径以实际打开配置文件的 canonical parent 为基准,./.. 会规范化,~、环境变量文本、glob 与 URI 不展开。解析阶段不读 .env、不解析密钥值,未知字段直接拒绝。
本页路径示例使用 /etc/open-compute/config.toml。部分内嵌 runbook 写成 platform.toml;命令行只有 --config,没有按文件名切换的第二套格式。
ocd config init --data-dir /var/lib/open-compute > /etc/open-compute/config.tomlocd --config /etc/open-compute/config.toml config checkconfig init 先按启动 cwd 解析 data-dir,再把绝对路径写进模板并打印到 stdout;不创建目录、不写密钥。config check 只做静态解析与校验。
内嵌默认模板与 share/default-config.toml 同结构。运行中的数值上限以 ocd --config /abs/config.toml capabilities --json 的 limits 为准。
密钥只走引用,不要写进 unit、镜像、仓库或配置明文。
server.admin_auth、server.deployer_auth、server.read_only_auth:三类必填且解析后互不相同的 Bearer token reference,使用env和/或file路径。- 仅 S3 后端:
storage.access_key_id_env/storage.access_key_id_file与storage.secret_access_key_env/storage.secret_access_key_file,每对至少提供一种;Local 不读取这些环境变量。 - master key:
data.master_key_file;可选data.master_key_env。 - 环境变量名必须是非空的大写 ASCII、数字和下划线,且不能以数字开头。
- 租户 binding 名不得以
OPEN_COMPUTE_开头;那是平台保留前缀,不是让你把密钥写进配置正文的借口。
所有 admin listener(包括 loopback)都必须配置三类角色 token;解析后 token 值相同会拒绝启动,不按匹配顺序降权。
[ai]:provider backend 与 embedding profile
Section titled “[ai]:provider backend 与 embedding profile”一个 AI backend 表示一个 operation-specific 最终请求 URL。ocd 不会追加 /embeddings 或 /chat/completions,因此 endpoint 必须同时包含 provider 的路径前缀和操作路由:
[ai.backends.bailian-embeddings]protocol = "openai_embeddings_v1"endpoint = "https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings"auth = { kind = "bearer", secret = { env = "DASHSCOPE_API_KEY" } }headers = { "X-Title" = "open-compute" }
[ai.embedding_profiles."qwen/qwen3-1024"]dimensions = 1024max_input_tokens = 8192send_dimensions = truetokenizer = { kind = "qwen3", revision = "pinned-tokenizer-revision", artifact = { path = "/opt/open-compute/tokenizers/qwen3/tokenizer.json", sha256 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" } }
[ai.embedding_models."company/qwen-embedding"]backend = "bailian-embeddings"remote_model = "text-embedding-v4"profile = "qwen/qwen3-1024"认证是闭集:bearer、单个自定义 secret header 或 none。需要自定义 key header 时写成 auth = { kind = "header", name = "X-API-Key", secret = { file = "/run/secrets/provider-key" } }。可选 headers map 只承载非敏感静态 metadata,不能覆盖 Authorization、自定义 auth header、host/content header、cookie、proxy 或 hop-by-hop header。none 只允许 loopback HTTP;非 loopback endpoint 必须使用 HTTPS。
Profile 让模型事实可复用而不变成隐式猜测。维度、最大输入 token 数、是否发送 dimensions,以及 digest-pinned offline tokenizer 都属于 profile;AI Search 的 metric 固定为 cosine。config check 只验证 artifact 声明而不读取文件;ocd 组合 AI Search 服务时校验本地 bytes,绝不下载 tokenizer。
[data]:平台状态与锁
Section titled “[data]:平台状态与锁”[data]:
| 字段 | 作用 |
|---|---|
path |
数据根。SQLite、身份、master key、runtime 解压、缓存都在这 |
master_key_file |
master key 路径 |
sqlite_busy_timeout_ms |
SQLite busy_timeout |
free_space_soft_bytes |
低于此值健康降级 |
free_space_hard_bytes |
低于此值拒绝 mutation;必须 ≤ soft |
一个 ocd 对应一个 data-dir。排他锁是 <data_dir>/platform.lock。第二实例会得到 DATA_DIR_IN_USE,不要绕过。data-dir 必须可写且可执行(解压后的 workerd 须在此执行)。
[storage]:对象正文
Section titled “[storage]:对象正文”storage.backend 必填且只能是 local 或 s3。两种 variant 互斥,不回退、不双写、不自动迁移;两者都使用 canonical 且互不重叠的 prefix / r2_prefix。
Local 字段:
| 字段 | 约束 |
|---|---|
path |
安全本地对象根,只能是 <data.path>/objects 或与 data.path 完全分离 |
free_space_soft_bytes |
低于此值对象存储健康降级 |
free_space_hard_bytes |
低于此值拒绝对象写入;必须 ≤ soft |
partial_grace_ms |
回收可证明归属的 crash 残留前的最短等待 |
Local root 必须是受支持本地文件系统上的 mode-0700 目录;symlink、特殊文件、未知 entry、不安全权限及 network/FUSE filesystem 均 fail closed。Local 直接访问文件系统,不启动 S3 server 或 rclone。
S3 使用 AWS SDK SigV4:
| 字段 | 约束 |
|---|---|
endpoint |
服务 URL |
region |
非空;auto 可接受 |
bucket |
非空 |
force_path_style |
默认 true |
verify_tls |
不能关 |
prefix / r2_prefix |
必须 canonical 且互不重叠 |
失败 upload 不是 committed。平台初始化后会绑定 backend kind 与 authority fingerprint;不要临时切换 backend、root、provider、bucket 或 prefix 来「先启动」。
模板还包含 [server]、[runtime]、[cache]、[response_cache]、[images]、[ai]、[metrics]、[hardening]、[workers]、[kv]、[r2]、[d1]、[queues]、[durable_objects]、[scheduler](含 pool)和 [workflows]。这些是本机配额与超时,不是 Cloudflare 套餐。改之前用 config check,改完用 capabilities --json 看实际 limits。
hardening.emergency_reserve_bytes 必须低于 [data] 的 hard reserve。