存储配置:PostgreSQL、Redis 与 Qdrant

适用版本:ChengOS v0.1.0+ | 最后核对:2026-08-12 | 来源:deploy/.env.examplecrates/cheng-storage/srccrates/cheng-storage/src/janitorcrates/cheng-storage/src/artifact_store.rscrates/cheng-vector/src

ChengOS 有四个存储,它们的必需程度并不相同:

存储 存什么 必需?
PostgreSQL 全部业务真相
Redis 调度协调、智能体记忆、缓存 用到定时与智能体记忆时必需
Qdrant RAG 的向量 仅 RAG 需要
产物存储 磁盘上的大文件 内建

PostgreSQL 是真相来源,其余是对它的加速或扩展。

PostgreSQL

DATABASE_URL=postgres://user:password@127.0.0.1:5432/master_router
DATABASE_MAX_CONNECTIONS=10
DATABASE_MIN_CONNECTIONS=1
DATABASE_CONNECTION_TIMEOUT=30

主机名取决于你的部署模式,这也是最常见的配置错误:

模式 主机
hybrid / managed-process 127.0.0.1
docker / 生产 postgresredisqdrant(compose 服务名)
分布式 你的外部数据库主机

智能体记忆节点除了 URL 之外还需要拆开的连接信息,因为它们自己开连接:

DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=master_router
DB_USER=tianai_db
DB_PASSWORD=…

DB_INSTALL_MODE 决定原生安装如何提供数据库:

取值 含义
managed-process 由安装器管理的、用户级沙箱进程
system-service 系统包加 systemd 服务

RUN_MIGRATIONS=true 时迁移在启动时执行,也可以用 Diesel 手动执行——见开发环境搭建

Redis

REDIS_URL=redis://:password@127.0.0.1:6379
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
# REDIS_DB=0
REDIS_MAX_CONNECTIONS=10
REDIS_MIN_CONNECTIONS=1
REDIS_CONNECTION_TIMEOUT=30

ENABLE_REDIS=false        # 原生/hybrid 安装

Redis 承载调度器的温层队列和分布式执行锁,以及智能体记忆节点和缓存。没有它,定时和智能体记忆无法工作;系统其余部分照常。

与 PostgreSQL 一样,智能体记忆节点读取的是与 REDIS_URL 分开的 REDIS_HOST / REDIS_PORT / REDIS_PASSWORD

Valkey 可以直接替代 Redis。

Qdrant

QDRANT_URL=http://127.0.0.1:6334      # gRPC 端口,不是 6333
ENABLE_QDRANT=false

注意端口:6334 是 Qdrant 的 gRPC 端点,ChengOS 连的就是它。指向 6333(HTTP 端口)会失败。

部署模式有本地 Docker、云端和自托管;云端与需要认证的自托管要提供 API 密钥,use_https 和连接超时(默认 30 秒)也可配置。

除了普通向量检索,ChengOS 还用到 Qdrant 的两项能力:

  • 具名向量——同一个点里放着维度不同的 parent_vec(384)、child_vec(1024)和 context_vec(256)。见 RAG 管线设计
  • 内建的 BM25 全文检索,正是它让混合检索模式无需第二套搜索引擎即可实现。

集合命名为 kb_<workspace_id>_<kb_id>,因此工作区之间不会撞车——见知识库

产物存储

大文件不放数据库。产物存储在磁盘上保存不可变对象:

<artifact_root>/
  objects/
    <artifact-id>/
      <safe-filename>
      metadata.json
  tmp/
    <写入中的文件>

写入协议值得了解,因为它解释了你能观察到的行为:

  1. 字节先写进临时文件。
  2. 对文件做哈希。
  3. 原子重命名objects/<id>/
  4. 此后数据库行才变为可读。

注册失败会移除待定对象。因此不存在「数据行指向不存在的字节」的窗口;上传中途崩溃留下的是 tmp/ 里的垃圾,而不是一个损坏的对象。

解析是工作区范围的,且解析出的路径会被校验落在规范化的产物根目录之内,从而挫败路径穿越与符号链接逃逸。

根目录默认是 CHENG_WORKSPACE_ROOT/artifacts,回退到 ./workspaces/artifacts

工作区级的产物设置——单文件上限、单次请求总量、LLM 预览预算、保留策略——会覆盖引擎默认值。见知识库与工作区上下文

数据生命周期:清道夫

后台清道夫实行三阶段策略:软删除(可恢复)、冷备份(后续增强),然后硬删除

默认值:

保留对象 软删除 硬删除
工作流 7 天 30 天
执行 7 天 30 天
执行日志 7 天 30 天

此外还有孤儿产物清理、用于避免大事务的批大小、清理间隔,以及一个dry-run 模式:只报告会删什么而不真删。

清道夫使用独立的连接池,其连接上限低于主连接池,因此清理绝不会饿死业务流量;它的阻塞工作跑在 spawn_blocking 上,不会占用 Tokio 线程。

在任何可能觉得默认保留期过于激进的部署上,先跑一次 dry-run。

密钥

CREDENTIAL_MASTER_KEY_1=<64 位十六进制>   # openssl rand -hex 32
JWT_SECRET=<64 位十六进制>
POSTGRES_PASSWORD=…                       # openssl rand -hex 16
REDIS_PASSWORD=…

CREDENTIAL_MASTER_KEY_1 是凭证保险库的 AES-256-GCM 密钥,数字后缀是为轮换准备的。丢了它,所有已存凭证都不可恢复——请与数据库分开备份,因为只有数据库备份是恢复不出一个可用系统的。

容量调优

设置 何时调高
DATABASE_MAX_CONNECTIONS 并发执行很多;每个运行中的节点都可能占一条连接
REDIS_MAX_CONNECTIONS 大量使用定时或智能体记忆
清道夫的 batch_size 清理跟不上——但要留意事务大小
调度器的 max_concurrency 定时与触发器

先用默认值。引擎自身的并发是 CPU 核数 × 3,因为多数节点是 I/O 密集的,所以你先撞上的通常是数据库连接数而不是核心数。

下一步

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容