Skip to content

应用共享初始化与运行进程分离 ​

状态:implemented 类型:simplification Owner:backend/yuxi/bootstrap/app.py

问题 ​

API 和 worker 启动都同步系统配置、内置 MCP 与 Skills,发布内容的持久化写入随运行进程重复执行。数据库准备与这些共享内容缺少统一完成边界,初始化失败和业务进程启动相互耦合。

决策 ​

实现方案 ​

无网络 root storage-init 仅准备五个挂载根。Compose 的 app-init 复用 API 镜像和普通用户身份,仅挂载内置 Skill 来源存储,等待 PostgreSQL 健康和 storage-init 成功。入口显式装配全部 ORM 模型,在数据库 advisory lock 内顺序完成 Schema、配置定义、内置供应商、Agent、MCP 与 Skill 同步;领域服务继续拥有管理员字段保留和同步规则。Schema 初始化失败只清理已确认空库的半成品;后续共享内容失败保留已完成数据,重跑幂等收敛。

API 和 worker 等待 app-init 成功,启动保留实际进程配置校验、Schema 版本校验、缓存及客户端创建和恢复检查。共享内容每次部署显式运行,开发修改内置定义后也重新执行 app-init。配置校验与可变外部服务 readiness 继续由消费进程负责。内置 MCP 发布定义同步失败同样阻止部署;此步骤不连接外部 MCP,其连接与调用仍按启用状态执行。

替代方案 ​

  • 保持 API/worker 重复写入:共享定义的部署完成时点不明确,增加重复文件替换和并发维护成本。
  • 合并 storage-init:引入 root、数据库网络及凭据的混合职责,扩大 Milvus 的启动依赖。
  • 全部检查集中初始化:不能证明后续 API/worker 的实际配置或动态依赖仍可用。

后果 ​

共享同步包含多次数据库提交与 Skill 文件替换,不承诺单事务原子性;部署停止消费者,失败修正后重跑。管理员字段按领域现有契约保留,代码拥有的内置内容会刷新。初始化完成后的动态依赖可用性仍由运行时检查证明。无新增权限配置、初始化插件或全局 Token 探测。

验证 ​

旧能力不存在:Compose 无 schema-init 服务,API/worker 启动不调用共享持久定义同步。

重新引入条件:只有内容确实由独立进程私有持有或必须随运行时状态重建,才进入该进程启动生命周期。

验收主张失败面语义 Owner直接证据 / 命令负向案例当前结果
共享内容完成后才启动消费者服务依赖缺失或仅等待 startedCompose、bootstrap/app.pyconfig unit、真实 Production删除完成依赖或恢复运行进程共享写入使 guard 失败Passed:159 项聚焦 unit/config
重复执行保留管理员值并收敛内置定义覆盖配置、重复记录、文件不一致各域同步服务隔离 PostgreSQL 与临时 Skills 回读非空管理员值、不同启用状态与损坏内置文件Passed:真实 PostgreSQL integration
Schema 与共享初始化串行且失败可重试并行写入或失败后误清空现有数据app 入口、migrations真实 PostgreSQL 故障与并发测试不兼容版本、共享阶段故障、移除冷启动 ORM 装配Passed:23 项 integration,包含独立子进程正负控
API/worker 保留配置校验和运行恢复只在初始化检查导致运行期绕过bootstrap/api.py、worker.pyunit、真实 Production 新任务和旧数据回读无效密钥、错误 Schema 拒绝启动Passed:真实模型、worker、Cube 文件与 PG 回读
  • uv run --project backend --no-sync --group test pytest backend/test/unit/config backend/test/unit/services/test_schema_bootstrap.py backend/test/unit/services/test_worker_bootstrap.py backend/test/unit/utils/test_lifespan.py -q:159 passed。
  • docker compose exec -T api uv run --group test pytest test/integration/services/test_app_initialization.py test/integration/services/test_schema_migration_version.py -q:23 passed。测试使用隔离 Schema 和临时 Skill 目录;system-tests.yml 执行同一集合。
  • docker compose exec -T api uv run --group test pytest test/unit -m 'not slow':2727 passed、96 skipped、7 subtests passed;仓库根配置检查的容器 skip 由宿主聚焦集合补跑。工程契约及 66 项检查器单测、docs build、改动源码与新增测试的限定集合 Ruff 检查、git diff --check 通过。
  • Production 当前数据库冷启动与重复执行 app-init 均退出 0;实际用户为 1000:1000,仅挂载 Skill 来源目录。部署前后数据库回读确认五类共享记录身份、选取的管理员字段摘要与旧 Turn/Run 保持原值;内置 Skill 内容摘要保持原值。原 schema-init 容器已移除。
  • Production 登录、readiness、vector/keyword/hybrid 检索和真实模型会话通过。PG 回读证明新 Turn、结果 Run、输出消息关联与完成状态正确;实际工作区回读新文件字节为 APP_INIT_OK 加换行,旧验证文件字节保持原值。Milvus 仍为 UID 999、两挂载根 999:999/0755 且可写。

未验证 Windows 原生 PowerShell、公网 TLS、GPU OCR、原生 Cube、rootless/userns/NFS 映射及容量与真实备份恢复。

本项目基于 MIT License 开源,欢迎使用和贡献。