跳到主要内容

后端配置参考

后端使用 dynaconf 配置:一组 YAML 文件加环境 变量,按固定顺序合并。本页是完整的字段参考。Docker ComposeKubernetes 指南只覆盖跑起来必须设置的少数几个 key,其余 都链接回这里。

配置的分层方式

活动环境由 ENV_FOR_DYNACONF 决定(部署镜像把它设为 production)。对该 环境,dynaconf 会按以下顺序加载并深度合并——后面的来源优先:

顺序来源是否提交放什么
1config.yamldefault: 块)每个 key 的基础默认值。不要改。
2config.production.yamlproduction: 块)生产专属默认值(如 cookie_secure: true)。不要改。
3config.production.local.yaml否(gitignored)你的非密钥覆盖——URL、模式、调优。
4config.production.secrets.yaml否(gitignored)你的密钥——密码、API key、JWT/CSRF/vault 材料。
5环境变量(CUBEPLEX_…最高优先级,可覆盖任何 key。

你只需编写第 3–5 层。localsecrets 的拆分纯粹是组织上的(可见 vs 敏感) ——dynaconf 对两者的合并方式相同。

环境段包裹

两个操作者文件都以环境名为顶层 key,并设置 dynaconf_merge: true,使其值 合并到(而非替换)默认值之上:

dynaconf_merge: true
production:
api:
public_url: "https://cubeplex.example.com"
auth:
cookie_secure: true

两种部署模式如何呈现这些文件

  • Docker Compose 直接把 config.production.local.yamlconfig.production.secrets.yaml 挂载进后端容器。你直接编辑文件(见 Compose 指南)。
  • Kubernetes 帮你渲染:values.local.yaml 里的 backend.configOverrides 变成 local(ConfigMap)文件,backend.secrets 变成 secrets(Secret)文件。 你不用手写 YAML——见 Kubernetes 指南

环境变量

任何 key 都可以被环境变量覆盖:前缀 CUBEPLEX_,嵌套层级用双下划线 __ 连接。

配置 key环境变量
auth.jwt_secretCUBEPLEX_AUTH__JWT_SECRET
auth.csrf_secretCUBEPLEX_AUTH__CSRF_SECRET
redis.urlCUBEPLEX_REDIS__URL
sandbox.domainCUBEPLEX_SANDBOX__DOMAIN
parsers.docling_serve.base_urlCUBEPLEX_PARSERS__DOCLING_SERVE__BASE_URL
social_login.google.client_idCUBEPLEX_SOCIAL_LOGIN__GOOGLE__CLIENT_ID

环境变量优先于所有文件,因此适合放你不想落盘的密钥。

生产环境必填

以下为空时安装会直接失败——首次启动前请先设置:

Key用途
auth.jwt_secret签发会话 JWT。openssl rand -hex 32
auth.csrf_secretCSRF 双提交 cookie。openssl rand -hex 32
auth.vault_key加密 MCP / 凭证 vault 的 Fernet key。
database.passwordPostgres 密码(与你的基础设施一致)。
redis.url包含 Redis 密码。
objectstore.access_key / access_secretS3 / rustfs 凭证。
llm.providers.*至少一个可用 provider——见 LLM Provider 配置

若你启用了 sandbox(agent 工具执行),还需额外设置 sandbox.{domain,image,api_key}


部署与 API

deployment:
mode: single_tenant # single_tenant | multi_tenant
api:
host: "0.0.0.0"
port: 8000
public_url: "https://cubeplex.example.com"
public_base_url: "https://cubeplex.example.com"
frontend_base_url: "https://cubeplex.example.com"
Key默认说明
deployment.modesingle_tenantsingle_tenant 首次注册时自动建一个 org(OSS)。multi_tenant 每个用户一个 org(云端)。
api.host / api.port0.0.0.0 / 8000容器内绑定地址。
api.public_url""客户端访问后端的 URL。有反代时用反代的 URL。
public_base_urlhttp://localhost:8000用于生成绝对 URL(OAuth 重定向等)。
frontend_base_urlhttp://localhost:3000后端重定向浏览器的目标。

认证与会话

auth:
jwt_secret: "…" # 必填
csrf_secret: "…" # 必填
vault_key: "…" # 必填(Fernet key)
cookie_secure: true # 纯 HTTP 必须设为 false
jwt_lifetime_seconds: 86400
cookie_samesite: "lax"
password_policy: "high" # high | low
rate_limit:
login_per_minute: 5
register_per_minute: 3
email_verification:
enabled: "auto" # auto | true | false(auto = 仅当 email.backend == smtp 时开启)
code_length: 6
code_ttl_seconds: 600
max_attempts: 5
Key默认说明
auth.cookie_securetrue(生产)纯 HTTP 下必须设为 false,否则浏览器会静默丢弃 auth cookie。
auth.jwt_lifetime_seconds86400会话时长(24h)。
auth.cookie_name / csrf_cookie_namecubeplex_auth / cubeplex_csrfCookie 名。
auth.password_policyhighhigh 强制更强的密码;low 放宽。
auth.rate_limit.*5 / 3 每分钟登录 / 注册限流。
auth.email_verification.enabledautoOTP 邮件验证;auto 仅在配置了 SMTP 邮件时开启。

LLM providers

完整字段参考——providers、preset、default_model / fallback_models——见 LLM Provider 配置。这里补充配置层定义的两项:

llm:
model_presets:
tiers:
lite: { enabled: true, primary: "provider/model-id", fallbacks: [] }
pro: { enabled: true, primary: "provider/model-id", fallbacks: ["provider/backup"] }
default_preset: pro

model_presets 把 lite/flash/pro/max 分层预设写入系统 org 的设置(即模型选择器 里用户可选的项);每个分层是一个主模型 ref 加有序 fallback。default_preset 是未选择时使用的分层。

数据库、Redis 与对象存储

database:
host: "postgres" # Docker/K8s 服务名
port: 5432
user: "cubeplex"
name: "cubeplex"
password: "…" # 必填
pool_size: 10
max_overflow: 20
redis:
url: "redis://:<password>@redis:6379/0" # 必填
key_prefix: "cubeplex"
objectstore:
provider: "s3" # s3 | oss
endpoint: "rustfs:9000"
bucket: "cubeplex"
region: "us-east-2"
access_key: "…" # 必填
access_secret: "…" # 必填

使用内置基础设施时,database.hostredis.urlobjectstore.endpoint 指向 集群内的服务名——除非你改了服务名或用外部后端,否则不要动。Postgres 必须是 pgroonga + pgvector 镜像(conversation-search 会执行 CREATE EXTENSION); 内置 chart 已经用了它。

Sandbox

控制 agent 工具执行。用户侧行为见 sandbox 指南, 接线方式见各部署指南。

sandbox:
enabled: true
domain: "…" # OpenSandbox API 地址(不带 schema)
image: "ghcr.io/cubeplexai/cubeplex-sandbox:v0.2.0"
api_key: "…"
use_server_proxy: false # 后端无法直连 sandbox pod/端口时设为 true
secure_access: true # docker-runtime OpenSandbox 下设为 false
ttl: 1800 # 空闲多少秒后清理
ready_timeout: 300 # 等待 sandbox 就绪(覆盖冷拉镜像)
resource:
cpu: "2"
memory: "4Gi"
Key默认说明
sandbox.enabledtrue关闭时对话可用,但工具调用失败。
sandbox.use_server_proxytrue直连 pod 设 false;Docker 桥接 / 隔离网络设 true
sandbox.secure_accesstrueKubernetes ingress 网关的签名 URL。docker-runtime OpenSandbox 下必须 false
sandbox.ttl1800空闲 30 分钟后回收。
sandbox.resource.cpu / memory2 / 4Gi单个 sandbox 的限额。

流式(Streaming)

streaming:
run_event_ttl_seconds: 43200 # 12h——一次 run 的事件可回放多久
run_stream_block_ms: 5000 # SSE 心跳节奏;必须 < redis socket 超时
run_stream_max_events: 1000000 # DoS 安全上限(裁剪 = 静默丢失回放)

run_event_ttl_seconds 同时是一次进行中的 run 能保持活动的上限——超长 agent run 需调大它。

对话上下文压缩

compaction:
enabled: true
threshold_ratio: 0.7 # 在 context_window * ratio 处压缩
keep_tail_tokens: 8000 # 逐字保留的近期 token
max_summary_tokens: null # null = cubepi 动态预算
fallback_context_window: 128000

对话搜索

对历史对话的混合检索(词法 + 向量)。

search:
enabled: true
lexical:
backend: "pgroonga" # pgroonga | pg_bigm
embedding:
enabled: false # 未开启前为纯词法模式
base_url: "https://api.openai.com/v1"
api_key: "" # 经 CUBEPLEX_SEARCH__EMBEDDING__API_KEY 提供
model: "text-embedding-3-small"
vector_dim: 1024

词法搜索开箱即用。向量搜索在你设置 embedding.enabled: true 并提供一个 OpenAI 兼容的 /v1/embeddings 端点之前保持关闭。vector_dim 在迁移时冻结—— 之后要改需重建表。

文件解析(docling)

parsers:
docling_serve:
base_url: "http://docling-serve-cpu:5001"
api_key: ""
timeout_sync_seconds: 30
async_threshold_mb: 3

file_read 工具通过 docling-serve 实例把 PDF / office 文档转成 markdown。 可选——部署方式见各指南的 docling 章节。

附件

attachments:
max_file_bytes: 52428800 # 单文件 50 MiB
max_per_message: 10
max_per_conversation_bytes: 524288000 # 500 MiB
allowed_mime_types: [ image/png, application/pdf,]

管控上传。allowed_mime_types 是允许列表(默认含图片、PDF、office 文档、 文本、压缩包);thumbnail / view_images 控制图片如何为模型缩放。

邮件与社交登录

email:
backend: "log" # log | smtp
from_address: "noreply@cubeplex.local"
smtp_host: "…"
smtp_port: 587
smtp_user: "…" # 经 env / secrets 提供
smtp_password: "…"
social_login:
google:
enabled: false
client_id: "…" # 经 env / secrets 提供
client_secret: "…"

email.backend: log 只是把邮件打印到 stdout(开发用)。设为 smtp 并填好 凭证(经 env 或 secrets 文件)才能真正发送验证 / 找回密码邮件。Google 登录 在你启用并提供 OAuth 凭证前保持关闭。

记忆(Memory)

memory:
short_term_enabled: true
long_term_enabled: false

对话记忆。短期(对话内工作记忆)默认开启;长期(跨对话回忆)默认关闭,需手动 开启。

MCP 工具

mcp:
progressive_disclosure:
enabled: "auto" # auto | on | off
threshold_pct: 10.0 # 可延迟 schema ≥ 上下文的此百分比时折叠
min_servers: 2
icons:
allow_remote: true # UI 可渲染远程 https 图标
fetch_remote: true # 发现时可外联拉取图标 → data: 缓存
fetch_timeout_ms: 2500
max_bytes: 262144 # 每个图标 256 KiB
Key默认说明
mcp.progressive_disclosure.enabledauto当可延迟的工具 schema 挤占上下文时折叠它们;auto 按下面的阈值判断。
mcp.progressive_disclosure.threshold_pct10.0可延迟 schema 超过上下文窗口的此比例时折叠。
mcp.icons.fetch_remotetrue离线部署把两个图标开关都设 false;目录品牌图标仍可从内置资源渲染。

连接器本身在 DB 目录里管理,不在这里。

技能(Skills)

skills:
cache_root: "skills_cache" # 本地解压缓存
preinstalled_dir: "skills/preinstalled"
registry:
skills_sh:
github_token: "" # 可选——把 GitHub API 限额从 60 提到 5000/h

preinstalled_dir 在启动时播种进全局技能目录。技能发现撞到 GitHub 限额时, 设置 registry.skills_sh.github_token(经 env / secrets)。

图片生成

image_generation:
enabled: false
api: "openai-images"
model: "gpt-image-2"
api_key: null # 经 CUBEPLEX_IMAGE_GENERATION__API_KEY
base_url: null

驱动 generate_image 工具(受 sandbox 门控)。默认关闭,需启用并提供 api_key

Tracing

tracing:
enabled: false
directory: "./cubepi-traces"
record_content: false # true 会捕获完整 prompt/响应/工具 I/O(更大、敏感)
otlp:
endpoint: null # 如 http://localhost:4318/v1/traces 以外发 span
headers: null
tempo:
query_endpoint: null # 设置后启用 admin trace 查看器

开启后把每次 run 的 cubepi span 写到磁盘,并可选外发到 OTLP collector(Grafana Tempo 等)。record_content: true 对调试很有用,但会捕获可能敏感的 prompt/工具 数据。

日志

logging:
third_party_level: "WARNING" # 压制吵闹的 botocore/httpcore/… logger
verbose_modules: [] # 为特定 logger 名重新开启 DEBUG
access_log: true # 每个 HTTP 请求一行

前面已有反代记录请求时,把 access_log 设为 false。往 verbose_modules 加 部分 logger 名可选择性重开 DEBUG。

生命周期

lifecycle:
graceful_drain_timeout_seconds: 3600 # 关机时等待进行中 run 的最大时间
stale_run_threshold_seconds: 120

graceful_drain_timeout_seconds 限定后端关机前等待活动 agent run 完成的时长—— 与你预期的最长 run 及编排器的终止宽限期对齐。

Egress 密钥注入监听器

egress_exchange:
auth:
mode: mtls # mtls(生产)| dev(共享密钥,仅 dev/test)
listener:
enabled: false # 由 egress bundle 开启
port: 8443
certfile: ""
keyfile: ""
ca_certs: ""

egress 密钥注入功能的后端侧。除非你 部署了 egress bundle(它会帮你设好监听器及其 mTLS 材料),否则保持关闭。

下一步