适用版本:ChengOS v0.1.0+ | 最后核对:2026-08-12 | 来源:
chengflow/docs/release-operations-guide.md、deploy/chengos.sh、CHANGELOG.md
更新是仅升级、经过校验且可恢复的。在新版本通过校验之前不会发生任何不可逆的操作,在新版本被证明健康之前也不会把它记录为已安装。
命令
./chengos.sh status # 版本 + 健康状况 + 最新稳定版检查
./chengos.sh update # 仅升级,经校验,可恢复
./chengos.sh update --force # 刻意重装或降级
./chengos.sh rollback # 恢复上一个版本
./chengos.sh version # 纯版本号,供脚本使用
Docker 安装需加 --mode docker,而且 update 额外接受 --to <version> 指定确切目标。
update 的执行顺序
- 读取并规范化
.chengos_version(v1.2.3与1.2.3都读作1.2.3)。 - 解析最新稳定版本。查询失败是一次清晰、非破坏性的失败——绝不会被谎报为「已是最新」。
- 严格比较
remote > local。相同或更旧不会更新。 - 下载到一个唯一的
mktemp -d目录。 - 先校验校验和,再校验签名。
- 校验归档布局,以及内嵌的
VERSION与所选版本一致。 - 检查暂存与安装两个文件系统的可用空间。
- 把当前属于安装包的状态备份到
.chengos_backups/。 - 停止服务——如果停止失败则中止,此时尚未触碰任何文件。
- 用同文件系统的重命名操作替换属于安装包的目录。
- 启动服务并执行有时限的健康检查。
- 到此刻才写入
.chengos_version并清理旧备份。
如果第 10、11 步或健康检查失败,会自动恢复此前的状态并重启此前的服务。
这个顺序中有两个性质值得记住:版本记录最后才写入,因此崩溃的更新绝不会在磁盘上留下一条谎言;服务停止是一道闸门,因此无法干净停止的主机绝不会被升级到一半。
归属边界
这条边界从不被跨越,这也是在承载真实数据的系统上放心执行更新的前提:
| 属于安装包(会被替换和恢复) | 属于实例(永不触碰) |
|---|---|
bin/、ui/、app/、config/、skills/、node_skills/、workflow-templates/、infra/ |
.env |
hybrid/{start,stop,status,generate-env}.sh |
数据库卷与 runtime/ |
chengos.sh、.env.example、VERSION |
logs/、models/、workspace/、workspaces/ |
备份只包含属于安装包的内容。你的配置、数据、日志和工作区永远不会被复制进备份,也永远不会被回滚删除。
备份与保留
备份位于 .chengos_backups/<version>-<timestamp>/,保留最新的 CHENGOS_BACKUP_KEEP 份(默认 3 份)。
一次回滚会消耗它的回滚点,因此第二次回滚会再往前走一个版本,而不是重复同一次恢复。
Docker 更新
四个服务的标签都来自同一个 CHENGOS_VERSION,因此不同版本的镜像绝不会被混用。更新流程是:固定版本 → 拉取 → 重建 api ui app → 校验 /health。若拉取、重建或健康检查失败,会恢复此前的版本固定值并重建此前的服务。
针对 latest 执行 docker compose pull 不是更新。 它破坏可复现性,也使回滚变得含糊,因为不存在一个确定的可返回版本。
只要设置了任何 CHENGOS_<SERVICE>_IMAGE 覆盖项,协调式版本更新就会被禁用,status 会明确说明。
数据卷——PostgreSQL、Valkey、Qdrant 以及用户卷——永远不会被更新或回滚删除或重建。
何时会拒绝回滚
自动回滚是一个文件层面的操作。只要旧版本仍能读取当前数据库,它就是安全的。
一旦某个版本应用了删除列或表、破坏性改写数据,或以非扩宽方式改变类型的迁移,回滚就不再安全。这样的版本会在发布说明中声明 Migration policy: irreversible,两条回滚路径都会拒绝执行。
变更日志中每个版本条目都必须声明其策略:
| 声明 | 含义 |
|---|---|
Migration policy: reversible |
旧版本可以在迁移后的数据库上运行。允许自动回滚。 |
Migration policy: irreversible |
旧版本无法读取这些数据。拒绝自动回滚。 |
从不可逆版本手工恢复
./chengos.sh stop- 恢复更新之前所做的数据库备份。发布说明会给出该版本所需的确切 dump/restore 命令。
- 从最新的
.chengos_backups/目录恢复安装包(原生),或在.env中手工把CHENGOS_VERSION改回去(Docker)。 - 把恢复后的纯版本号写入
.chengos_version。 ./chengos.sh start- 确认
/health报告的是恢复后的版本。
在更新声明了不可逆迁移的版本之前,务必先做数据库备份。 更新器无法重建被迁移删除的数据。
离线更新
把校验过的 chengos-full-linux-amd64-v<version>.tar.gz(最好连同它的 .sha256)放在 chengos.sh 旁边,更新器就会使用它而不走网络。没有内嵌 chengos/VERSION 的本地包早于发布契约,会被拒绝。
网络超时
| 操作 | 变量 | 默认值 |
|---|---|---|
| 版本元数据查询 | CHENGOS_META_TIMEOUT |
10 秒 |
| 包下载 | CHENGOS_DOWNLOAD_TIMEOUT |
1800 秒 |
| 更新后健康检查 | CHENGOS_HEALTH_TIMEOUT |
90 秒 |
status 中的元数据超时会打印 latest version unavailable——这不是在说你已是最新版。update 中的元数据超时会中止,且不触碰安装。
事故恢复
| 现象 | 处理 |
|---|---|
| 更新失败,服务停止 | 更新器已恢复此前的包。运行 ./chengos.sh start,然后查看 logs/cheng-api.log |
| 自动恢复也失败了 | 备份完好。把 shared/* 复制回安装根目录,hybrid/* 复制回 hybrid/,然后启动 |
| 运行中的版本与记录不一致 | 安装包被手工替换过。运行 ./chengos.sh update --force |
status 显示 latest version unavailable |
网络问题或频率限制。重试,或离线更新 |
| Docker 更新后服务不健康 | 版本固定值已自动恢复。查看 docker compose logs api,必要时回滚到上一版本 |
| 某个版本需要撤回 | 标签是不可变的,绝不移动。发布一个新的补丁版本 |

暂无评论内容