Host Migration · Read-only Recon

MacBook Pro 上的 Hermes → 容器迁移方案
8.9 GB 现状盘点、17 项逐条可移植性审计、按 content / web / jenkins / ops 重划分

对象 tangmingmacbook-pro(macOS 15.8.1 · Intel) profile tangming + work 历史 570 会话 / 157,340 条消息 仓库 40+ git repo 摸排 2026-10-27 · 全程只读
目录
  1. 结论先行
  2. 现状:8.9 GB 里到底有什么
  3. 目标结构:4 个 profile,不是 3 个
  4. 逐项可移植性审计
  5. 迁移路径:git 优先,可回滚
  6. 需要你拍板的 5 件事
  7. 风险与已发现的问题

1 · 结论先行

真正要搬的只有约 1 GB,其余 7 GB 不该搬。两个 profile 合计 1.7 GB,里面 state.db 占 963 MB、LSP 二进制 146 MB、缓存 245 MB、旧备份 371 MB、bin/tirith 34 MB(Mach-O,Linux 跑不了)。核心可迁移资产是 178 个自建技能 + 两份 config + 80/90 个密钥 + 私有脚本。

迁移路径已经有人替你铺好了:hermes-agent-data(87 MB,gitcode 私有仓库,每晚 22:00 自动提交)已经把 skills / memories / cron / config 纳入版本控制,容器 git clone 后按家族分拣即可,不需要 rsync 搬文件。

三个硬约束先说清:① 容器没有图形界面,公众号/抖音后台的扫码登录做不了;② 内网模型网关(leaptic / tokenhub / 302api)依赖 Mac 上那条 SSH 隧道,不重建就用不了;③ ~/hermes-agent-data/ssh/ 里有 明文私钥,已经推进了 git。

2 · 现状:8.9 GB 里到底有什么

Mac 侧 ~/.hermes 是 git 安装(hermes-agent @ 1298c8e74b,2026-10-04,工作区干净),由 launchd 托管两个进程:

组件实测
ai.hermes.gateway常驻网关,pid 627;飞书 + Telegram + 元宝三平台接入
ai.hermes.model-tunnelpid 621,ssh -N -L 127.0.0.1:14000:litellm.leaptic.tech:443,先试办公网 10.6.41.142 再走 cloudflared 别名 cloud
com.nanshanju.*7 个站点服务(noteweb / reader / reports / books / mms / mms-tunnel / mms-revssh)——不在本次迁移范围

2.1 两个在用的 profile

项tangming(个人向)work(公司运维向)
体积707 MB1.0 GB
接入平台飞书(独立应用 cli_aa1254b5…,home oc_4bd0b182…,一个群免 @)+ Telegram + 元宝Telegram(config 无 platforms 块,全靠 .env);channel_directory 里有 AI Coding / 腾讯云 / Slide 多组话题群
技能87 活跃(84 自建)+ 66 归档97 活跃(94 自建)+ 112 归档
state.db290 MB · 221 会话 · 45,069 消息673 MB · 349 会话 · 112,271 消息
cron4 个,1 个启用(22:00 备份)6 个,5 个启用(心跳 60m、备份 22:00、SSL 提醒、state.db 备份 03:20、站点保活 5m)
私有脚本7 个(gzh_metrics.py、wx_rate_watch.py…)24 个(acr_cred_refresh.py、cdn_internal_flip.py…)
插件model-providers/opencode-acphermes-achievements(自写)+ opencode-acp
额外状态A2A 127.0.0.1:9901,token 明文写在 config.yamla2a 会话记录 8 份;state.db.bak-migration 160 MB 旧备份

来源:du -sh ~/.hermes/profiles/* · sqlite3 mode=ro&immutable=1 统计 · cron/jobs.json · .env 键名(值未读取)

2.2 仓库族谱(40+ 个)

内容创作(11)
  • douyin-cli weibo-cli zhihu-cli xianyu-cli
  • tuiyouhui-cli wxstore-cli wxstore-api-cli
  • wxstore-web wxstore-mms reader-card books
网站(6)
  • nanshanju-infra noteweb(simple-note)
  • hummerstudio.github.io yuetool-com.github.io
  • tc-service-docs photon-src
Jenkins 插件体系(8)
  • jenkins-atom-sdk -plugin -demo
  • jenkins-shared-library pkr-step(上游)
  • rpu ci_scripts agentic-devops
公司 / 其他(15+)
  • momenta-ios-offline tc-docs-recon
  • PycharmProjects/qc/*(3 个)hacker-path quan
  • hermes-agent-data(数据备份仓库)

2.3 已有的备份机制

~/hermes-agent-data(87 MB,gitcode/tangmoying/hermes-agent-data)由 cron 每晚 22:00 同步并 push,内容含 config.yaml / SOUL.md / memories/ / skills/ / cron/ / reports/ / tccli/ / ssh/。最近三次提交:10-26(70 文件)、10-25(55 文件)、10-25(245 文件)——这就是现成的迁移通道。

3 · 目标结构:4 个 profile,不是 3 个

profile承接为什么这样切
content内容 11 仓库 + social-media/*、creative/*;依赖 ~/.wxstore 与 API token共用内容风格/素材/发布红线;发布是不可逆动作,凭据边界必须独立
web站点 6 仓库 + nanshanju-web-deploy、noteweb、jekyll-*共用服务器/域名/隧道,按话题分二级域;一个群足够
jenkins插件 8 仓库 + devops/jenkins-*(6 个)、android-*、github/*SDK↔插件版本互锁,必须同一上下文才能改
ops 建议新增work 里 50+ 个公司运维技能:阿里云 / Devtron / LDAP / Jumpserver / 云桌面 / 成本不然 jenkins profile 里混进公司内网运维,memory 与凭据全线打架
default杂事、临时查询;历史只读检索保持干净

依据:work 的 94 个自建技能里约 55 个属于公司运维域(devops/aliyun-ops、devtron-api、jumpserver-api、ldap-ops、cloud-desktop-*、cloud-cost/*…),全部塞进 jenkins 只会让那个 profile 膨胀到不可用。

4 · 逐项可移植性审计

条目体积容器上的 Linux 等价物 / 动作结论
config.yaml ×24.6 / 4.2 KB结构兼容(两边 _config_version: 49)。需改 3 处:browser.backend + cdp_url=127.0.0.1:9222(Mac 上的 Chrome,容器没有)、a2a token、路径类键可移植
.env ×224 KB / 5.3 KB
80+ / 90+ 键
值跨平台;按新 profile 重分组。已核实:飞书应用与三个 Telegram bot 全不同 → 切换期可并存不抢锁可移植
自建 skills178 个纯 md + 脚本。实测仅 4 个文件含 /Users/tangming 硬路径;macOS 专属技能(签名、字体、显示器、Xcode、iOS)保留但标注「需在 Mac 执行」可移植
state.db963 MBSQLite 跨平台,但 570 个会话横跨内容+运维,无法按新 profile 干净拆分 → 只读归档,用 session_search 查归档
sessions/*.jsonl53 MB与 state.db 重复不迁
cron 10 个—可迁 3 个(SSL 提醒、state.db 备份、费用报告待定);留 Mac 6 个:站点保活、AICoding 心跳、两个备份脚本部分
私有脚本 31 个136 KB走公网的(gzh_metrics、wx_rate_watch、tyh_sync_watch)可迁;依赖内网的(acr_cred_refresh、cdn_internal_flip)留 Mac部分
plugins416 KBopencode-acp 是 git 仓库可 clone;hermes-achievements 待确认无 macOS 依赖可移植
hooks913 B ×2heartbeat.sh 可迁;activity.sh 打公司接口 → 留 Mac部分
bin/tirith34 MBMach-O x86_64,Linux 不可执行;容器自带丢弃
lsp/146 MBmacOS 版语言服务器二进制重建
各类 cache245 MBmodels_dev_cache、uv、模型清单丢弃
A2A(9901)—容器内重建,必须换 token(现在 tangming-mima 明文躺在 config.yaml)重建
~/.wxstore + token—JSON 明文,直接搬迁移
model-tunnel.sh—容器需重建同款隧道(办公网 10.6.41.142 或 cloudflared cloud),否则内网 provider 全部不可用待决策
nanshanju 7 个站点—站点本体在 Mac 上跑,不在本次范围留 Mac
work.bak-20260921371 MB9 月旧 profile 备份 + state.db.bak-* 160 MB归档后删
账算下来:

5 · 迁移路径:git 优先,可回滚

Phase 0 容器侧准备(不碰 Mac) ├─ 建 4 个 profile:content / web / jenkins / ops ├─ 每 profile 一个飞书群 + gateway.profile_routes 路由 └─ 只读验证:用 0.22.2 打开一份 state.db 副本,确认 schema 可读 Phase 1 内容搬迁(走 git,不 rsync) ├─ git clone hermes-agent-data → 按家族分拣进 4 个 profile ├─ 缺的(state.db / ~/.wxstore / scripts / hermes-achievements)一次性 scp └─ 落地后 git add 进各自备份仓库,4 处硬路径改写为 /opt/data/work/… Phase 2 历史归档 ├─ 两份 state.db → /opt/data/work/legacy/{tangming,work}.db(只读) └─ 建一页索引:哪个项目在哪个库里 Phase 3 切换(可逆) ├─ Mac 停 ai.hermes.gateway(站点 launchd 不动) ├─ 容器接管新 profile 的飞书 / Telegram ├─ 验收:4 群各 @ 一次 + 真实内容草稿 + 一次插件构建 └─ 回滚:Mac launchctl load 恢复,原状保留 2 周

双跑可行性已核实:Mac 的飞书应用(cli_aa1254b5…)、容器飞书应用(cli_aa55d175…)、三个 Telegram bot 的 token 全部不同 → 切换期并行不会互相踢下线。

6 · 需要你拍板的 5 件事

#问题我的建议
1ops 单独建 profile 吗?建。否则公司运维技能污染 jenkins
2570 个会话的历史怎么办只读归档 + session_search,不并入新 profile
3密钥怎么传按新 profile 拆三份,走一次性 scp;不要整包复制
4公众号/抖音登录态内容发布留 Mac,容器只做代码迭代与草稿审核(容器扫不了码)
5内网模型网关要不要接先不接,新 profile 用 opencode-go / zhipu;要接再重建隧道

7 · 风险与已发现的问题

✗ 明文私钥进了 git

~/hermes-agent-data/ssh/ 含 id_rsa、id_buildmac,仓库推在 gitcode。建议轮换 + 只备份 .pub 与 config,私钥走密码库。

⚠ 容器无 GUI

扫码类流程(公众号后台、抖音创作者中心)无法完成;cdp_url=127.0.0.1:9222 依赖 Mac 上开着 Chrome。

⚠ 内网模型网关

leaptic / tokenhub / 302api 全靠 Mac 的 SSH 隧道;容器不重建就没有这些模型。

⚠ 版本差

Mac 1298c8e74b(10-04)vs 容器 0.22.2 d923a5eb(10-15)。skills/config 兼容,state.db schema 需 Phase 0 只读验证。

判断

这次迁移的技术风险低、组织成本高:搬文件是小事(1 GB,且已有 git 通道),真正的工作量在于把 178 个技能按 4 个域重新分拣,以及决定内容发布这条线留在 Mac 还是放弃扫码走 cookie。

建议顺序:先只做 Phase 0(建 profile + 路由),拿 jenkins 和 web 两组做试点——它们不依赖扫码、不依赖内网模型;content 留到最后,因为它是唯一会被“容器没有屏幕”卡住的域。

本次未做:Mac 上未创建、修改、删除任何文件;容器上未建 profile、未改 config / cron、未动 gateway。全程只用 ls / du / git log / sqlite3(mode=ro) 等只读命令,密钥只读键名不读值。摸排用的 tailscaled 用完即停。