Mac mini AI 中枢迁移 — 现状调查与重整方案

双 gateway 双活实证 · WireGuard/Tailscale 定案 · 模型固化 · 无缝衔接执行计划

版本 2.0 · 2026-08-12 · project-blueprint v2.2.0 · 阶段一(需求对齐)+ 阶段二(方案确认)交付

一、调查结论(10 项事实 + 证据)

事实 1:迁移实际进度远超方案文档 已核实

Mac mini(hermini@arm64)已具备:Homebrew ✓ · Claude Code(/opt/homebrew/bin/claude)✓ · wrangler ✓ · node ✓ · ~/.cf_token ✓ · ~/deploy/ 全量项目 ✓ · ~/.hermes 已 rsync(state.db 327MB,cron/memories/refs 已同步)✓ · gateway 已运行(launchd ai.hermes.gateway)✓ · 反向 SSH 隧道(VPS:22022→Mac:22)在线 ✓

但方案文档(mac-mini-setup-b0h.pages.dev v1.1)仍停留在"买北京 VPS + WireGuard"阶段——文档与执行完全脱节

事实 2:双 gateway 同 token 并行 = 回复混乱头号元凶 实证

13:10:43 用户消息「我打算要用Mac mini作为我hermes运行的主平台…」被 两端同时接收并同时处理

VPS gateway 日志(13:10:42 inbound)→ 我用 deepseek-v4-flash 处理(即本会话)
Mac mini gateway 日志(13:10:43 inbound)→ k3 先 403(额度耗尽)→ fallback glm-5.2 处理

结果:同一条消息会产生 两条来自不同模型、可能互相矛盾的回复。这就是"回复信息混乱"的直接实证。两 gateway 还会互相踢 Discord 连接,造成消息重复/丢失。

事实 3:两端 config 不一致 需修复

VPS config:provider: deepseek / default: deepseek-v4-flash(已固化主用)
Mac mini config:provider: kimi-coding / default: k3(旧配置,k3 今日 403 → 每轮先撞墙再 fallback)

事实 4:哨兵(模型自动切换服务)仍在自动切换主模型 需处理

哨兵 hermes-sentinel(仅 VPS)每 5s 轮询,在 kimi↔glm↔deepseek 间切换主模型并重启 gateway。历史 switch_count=5(最近 2026-08-06)。当前状态:deepseek 主用,但每 5s 探测 GLM(probe_glm: ok)与 K3(probe_k3: error)——一旦 GLM/K3 恢复就会自动切回,同一线程下一轮换模型回答。

事实 5:WireGuard 已被实测判死刑,但文档还残留 确认

08-03 实测:腾讯云轻量服务器封所有入站 UDP(控制台防火墙规则不生效,已验证),WireGuard 握手包无法到达 VPS → 已从 VPS 和 Mac mini 卸载。但 v1.1 方案页 + bootstrap.sh 仍写 WireGuard/买北京 VPS → 方案污染源头。

事实 6:Tailscale 半成品状态 差一步

VPS 节点在线:100.100.33.57 vps-worker
Mac mini 节点:已安装但 Logged out,认证链接 https://login.tailscale.com/a/193684c001a917 等待用户浏览器点一次 Authorize。

事实 7:kimi 双 key 额度现状 coding2 今日耗尽
KeyBilling 额度重置时间结论
coding1 (…ls38jZ)41/10008-18可用 ✓
coding2 (…z3Maa1) — Hermes .env 在用100/100 耗尽08-13 10:47今日 403 ✗

Mac mini 上 13:10 的 403 就是这个 key。Hermes 固化 deepseek 后不受影响;CC 固定 kimi 时用 coding1(现可用),coding2 明天恢复。

事实 8:Cloudflare 能力已随迁移保留 已核实

Mac mini 已有 wrangler + ~/.cf_token(与 VPS 同 token)+ ~/deploy/ 全部项目目录。CF Pages/Workers 部署能力迁移后不丢失。

事实 9:Mac mini 运维通道可用 已核实

VPS→Mac mini:反向隧道 ssh -p 22022 hermini@127.0.0.1 通 ✓。hermes CLI 位于 ~/.hermes/hermes-agent/venv/bin/hermes(PATH 未配置,运维需用全路径或补软链)。

事实 10:迁移遗漏项清单 待补齐

二、回复混乱根因判定(核实结论)

判定:用户怀疑成立,且比预想更严重——是三层叠加:

#根因证据影响
双 gateway 并行(VPS + Mac mini 同 token)13:10:43 同消息两端同时处理(deepseek vs glm)同消息双回复、互相矛盾、踢线丢消息
模型不固化:哨兵自动切换 + fallback 链 + 两端 config 不一致switch_count=5;Mac mini k3→403→glm;VPS=deepseek同一线程不同轮次由不同模型回答,风格/结论漂移
长会话上下文压缩污染08-03 会话"一句话回复两遍、答案还不一样"(218 万 token 上下文)压缩残留旧片段(如"WireGuard 通了"假结论)
用户提议的修复方向验证 正确

① Hermes 固化 deepseek-v4-flash → 消除哨兵切换 + fallback 漂移(VPS 已如此,Mac mini 待同步)✓
② Claude Code 固定两个 kimi coding key → cc-switch 已有 3 provider(coding1/coding2/deepseek 兜底),配置就绪 ✓
③ 补充必要动作:收敛为单 gateway(必须二选一),否则固化模型也挡不住双回复。

三、组网决策:WireGuard vs Tailscale

3.1 关键事实

3.2 数据出境分析(用户核心约束)

方案控制面(元数据)数据面(内容)结论
WireGuard 自建(国内 VPS hub)不出境不出境合规最优,但腾讯云 UDP 被封,需换厂商
Tailscale 纯默认境外协调服务器(设备名/IP/密钥)P2P 直连不出境;NAT 穿透失败走境外 DERP 中继(加密内容过境)元数据出境;内容绝大多数直连,极端场景过境
Tailscale + 国内自建 DERP(推荐)境外(元数据,同左)直连不出境;穿透失败走国内 VPS 自建 DERP,内容全程境内内容严格不出境 + NAT 穿透能力兼得
推荐方案:Tailscale(完成认证)+ 国内 VPS 自建 DERP 中继兜底

理由(第一性原理):本质需求 = "MacBook/iPhone 任何网络都能安全连到 Mac mini,且业务内容不出境"。

  1. Tailscale 负责 NAT 穿透与设备组网(这是最难的部分,自研成本极高)
  2. 国内 VPS 上跑 DERP 中继(derper,单二进制)→ 穿透失败时内容中继落在境内,满足严格出境约束
  3. 未来多 VPS 扩展 = Tailscale 加节点 + 登录,零新增配置
  4. 分层数据流(用户 08-03 已认可):Tailscale 只管"够得着",Hermes 业务数据走 Discord/SSH 国内链路,不经过 VPN

备选 A:纯 Tailscale(先跑通,DERP 后补)——今天即可完成,推荐过渡路径。
备选 B:换非腾讯云 VPS 自建 WireGuard——合规最严格,但需新购机器 + 时间,且 NAT 穿透仍要解决(家庭宽带无公网 IP)。

四、目标架构

┌─────────────────────────────────────────────────────────────┐
│  Mac mini(家庭 AI 中枢,7x24)                               │
│  ├─ Hermes gateway(Discord 唯一连接)                        │
│  ├─ Hermes cron + 记忆 + 哨兵(只监控,不切模型)              │
│  ├─ Claude Code(编码代理,kimi 双 key)                      │
│  └─ wrangler + CF token(Cloudflare 网页服务)                │
└──────────────┬──────────────────────────────────────────────┘
               │ Tailscale 组网(内容直连/境内 DERP)
   ┌───────────┼──────────────┬───────────────┐
   ▼           ▼              ▼               ▼
 MacBook     iPhone        VPS 1(现)       VPS 2+(未来)
 Claude Code→SSH→Mac mini   DERP 中继/备用   组网扩展节点
 (Hermes 无响应时运维)

五、模型固化方案

组件固化配置状态
Hermes 主模型deepseek-v4-flash(两端 config 一致)VPS 已生效;Mac mini 待同步
哨兵改为只读监控(记录限流/卡死,不自动切模型、不重启 gateway)或直接停用待改
Hermes fallback 链保留 glm-5.2 → deepseek(仅作兜底,主模型 429 时单轮降级)两端一致即可
Claude Codecoding1(现可用)/ coding2(08-13 恢复)/ deepseek 兜底,固定不轮换cc-switch 已就绪

六、执行计划(P0-P4)

P0

止血(已执行 ✅):停 Mac mini gateway,消除双活。验证 VPS 单活、无双回复。

P1

配置收敛:Mac mini config.yaml 同步为 deepseek 主 + fallback 一致;哨兵改为只读监控(或停用);hermes CLI 补 PATH。

P2

迁移收尾:rsync 剩余状态(sentinel.json、最新 state.db、.env 同步);Tailscale Mac mini 认证(用户浏览器点一次链接);可选:VPS 自建 DERP。

P3

正式切换(用户确认后一次完成):VPS gateway 停(systemctl --user stop hermes-gateway)→ sleep 5 → Mac mini gateway 启(launchctl bootstrap)→ 验证 Discord 单连接、会话上下文衔接。

P4

验证与文档:执行测试清单 T1-T10;更新方案页 v2.1(清 WireGuard 残留);清理 bootstrap.sh 文案;kimi 双 key 轮换机制文档化。

七、严格测试清单(T1-T10)

ID测试项验证方法通过标准
T1单 gatewayVPS/Mac mini 各查 gateway 进程 + Discord WS 连接数全系统仅 1 个 gateway 进程在线处理消息
T2模型固化生效读两端 config.yaml + agent.log 的 API call 记录model=deepseek-v4-flash;无 kimi/glm 主调用
T3哨兵不再自动切换观察 sentinel.log 30min + sentinel.json switch_count无 switch_to_* 动作;config.yaml 不变
T4双回复消除发测试消息,统计回复条数每条消息恰好 1 条回复
T5会话衔接Discord 线程发「继续」上下文接上原会话(session 路由一致)
T6SSH 通道VPS→Mac mini 隧道、MacBook→Mac mini(Tailscale/内网)3 条路径全部 ssh 通
T7CC 远程运维MacBook claude code 经 SSH 执行 hermes status能列出 gateway/cron 状态
T8CF 部署能力Mac mini 上 wrangler pages deploy 测试页部署 URL 返回 200
T9迁移完整性cron 列表、memories、state.db 大小、sessions 数两端对比与 VPS 一致(差集为空)
T10kimi 双 keyusage API 探测 coding1/coding2coding1 200;coding2 08-13 后 200

八、决策点(需用户拍板)

D1:组网方案

推荐 Tailscale 认证 + 国内 DERP 兜底(今天完成认证,DERP 可后补)。
备选:纯 Tailscale / 换非腾讯云 VPS 自建 WireGuard(新购机器,耗时)。

D2:哨兵去留

推荐 改为只读监控(保留限流/卡死记录与告警,去掉自动切换与自动重启)。
备选:直接停用(最简,失去告警)。

D3:正式切换时机

推荐 P1/P2 就绪后立即切换(今天可完成,全程 VPS 服务不中断,切换窗口 ~30s)。
备选:用户指定时间窗口执行。