主题
Hermes 镜像版本固定
日期: 2026-05-16 目标: 把 spawn-profile.sh 里的 HERMES_IMAGE 从 nousresearch/hermes-agent:latest 固定到具体 tag,消除"同脚本不同时刻 spawn 出不同 Hermes 版本"的可重现性漏洞。 不在范围: GHCR 镜像化 Hermes、自动 bump、滚动重建脚本。这些留给后续 plan。
背景
scripts/admin/spawn-profile.sh:160默认HERMES_IMAGE="${HERMES_IMAGE:-nousresearch/hermes-agent:latest}"- Hermes 上游迭代快;
:latest在不同时刻拉到不同 digest - 后果:
- 付费用户 A 周一买到 v0.7,用户 B 周三买到 v0.8,bug 报告对不上
- 任意上游 push 可能改 CLI/env/skill 契约,连锁炸 Hermes container
- 无回滚锚点(不知道 "上一个能跑的 tag" 是什么)
决策
只做 pin。
- 在
spawn-profile.sh写死具体语义化版本 tag - Bump 走 PR:改 tag → review → merge → 后续 ECS 上手动跑
docker pull+spawn-profile.sh重建(手动可控) - 旧 container 保留旧 image 直到主动重建(用户不会突然被换版本)
不做:
- ❌ 自动 pull / cron refresh — 上游炸跟着炸
- ❌ GHCR mirror — 等 GFW 拉 Docker Hub 真出问题再上
- ❌ 滚动重建脚本 — 当前用户少,手动
docker rm + spawn-profile.sh够用
步骤
1. 选定 pin tag
- SSH 进 ECS,查当前活跃 container:bash
docker inspect $(docker ps --filter "name=hermes-" -q) \ --format '{{.Config.Image}} {{.Image}}' - 拿 image digest → 反查上游 tag(
docker images --digests) - 选最近 stable tag(避免
dev/rc)
2. 改 scripts/admin/spawn-profile.sh:160
bash
HERMES_IMAGE="${HERMES_IMAGE:-nousresearch/hermes-agent:vX.Y.Z}"环境变量 override 保留 — 调试时仍可临时切 tag。
3. ECS 操作(部署后)
bash
docker pull nousresearch/hermes-agent:vX.Y.Z不动现有 container。下次 spawn 才生效。
4. 写 ops 笔记
docs/runbooks/hermes-version-bump.md(NEW):
- PR 改
spawn-profile.sh:160HERMES_IMAGE tag - Merge → SSH ECS →
docker pull <new-tag> - 对每个 active container:bash
docker rm -f hermes-<profile> /home/twilight/twilight/source/scripts/admin/spawn-profile.sh \ --profile <name> --tier <tier> ... - 验证 dashboard 端口可达;监控日志 5 分钟
- 回滚:PR revert + 同样流程
验收
- [ ]
grep ':latest' scripts/admin/spawn-profile.sh无 hermes 行 - [ ] ECS
docker images | grep hermes显示 pin 的 tag - [ ] 新 spawn 的 container 拿到 pin 版本(
docker inspect ... .Config.Image) - [ ] Runbook merged
后续 plan(不在此次范围)
- Hermes GHCR mirror(GFW 真断时启动)
- Hermes 自动 bump GH Action(监听上游 release → 开 PR 改 tag)
- 滚动重建脚本(用户量 >20 时上)