Mac mini AI 中枢迁移 — 现状调查与重整方案
双 gateway 双活实证 · WireGuard/Tailscale 定案 · 模型固化 · 无缝衔接执行计划
一、调查结论(10 项事实 + 证据)
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"阶段——文档与执行完全脱节。
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 连接,造成消息重复/丢失。
VPS config:provider: deepseek / default: deepseek-v4-flash(已固化主用)
Mac mini config:provider: kimi-coding / default: k3(旧配置,k3 今日 403 → 每轮先撞墙再 fallback)
哨兵 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 恢复就会自动切回,同一线程下一轮换模型回答。
08-03 实测:腾讯云轻量服务器封所有入站 UDP(控制台防火墙规则不生效,已验证),WireGuard 握手包无法到达 VPS → 已从 VPS 和 Mac mini 卸载。但 v1.1 方案页 + bootstrap.sh 仍写 WireGuard/买北京 VPS → 方案污染源头。
VPS 节点在线:100.100.33.57 vps-worker ✓
Mac mini 节点:已安装但 Logged out,认证链接 https://login.tailscale.com/a/193684c001a917 等待用户浏览器点一次 Authorize。
| Key | Billing 额度 | 重置时间 | 结论 |
|---|---|---|---|
| coding1 (…ls38jZ) | 41/100 | 08-18 | 可用 ✓ |
| coding2 (…z3Maa1) — Hermes .env 在用 | 100/100 耗尽 | 08-13 10:47 | 今日 403 ✗ |
Mac mini 上 13:10 的 403 就是这个 key。Hermes 固化 deepseek 后不受影响;CC 固定 kimi 时用 coding1(现可用),coding2 明天恢复。
Mac mini 已有 wrangler + ~/.cf_token(与 VPS 同 token)+ ~/deploy/ 全部项目目录。CF Pages/Workers 部署能力迁移后不丢失。
VPS→Mac mini:反向隧道 ssh -p 22022 hermini@127.0.0.1 通 ✓。hermes CLI 位于 ~/.hermes/hermes-agent/venv/bin/hermes(PATH 未配置,运维需用全路径或补软链)。
- sentinel.json 未迁移到 Mac mini(Mac mini agent 曾 read_file 报 File not found)
- Mac mini config.yaml 未同步(k3→deepseek)
- hermes CLI 未入 PATH
- Tailscale Mac mini 未认证
- VPS gateway 未停(双活根源)
二、回复混乱根因判定(核实结论)
判定:用户怀疑成立,且比预想更严重——是三层叠加:
| # | 根因 | 证据 | 影响 |
|---|---|---|---|
| ① | 双 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 关键事实
- 腾讯云轻量封入站 UDP(08-03 实测,控制台防火墙规则不生效)→ WireGuard 服务端无法部署在当前 VPS;除非另购非腾讯云 VPS(阿里云/搬瓦工等),成本 + 时间。
- Tailscale 底层就是 WireGuard,但由境外协调服务器做 NAT 穿透引导,规避了"需要公网 UDP 入站"的问题。
3.2 数据出境分析(用户核心约束)
| 方案 | 控制面(元数据) | 数据面(内容) | 结论 |
|---|---|---|---|
| WireGuard 自建(国内 VPS hub) | 不出境 | 不出境 | 合规最优,但腾讯云 UDP 被封,需换厂商 |
| Tailscale 纯默认 | 境外协调服务器(设备名/IP/密钥) | P2P 直连不出境;NAT 穿透失败走境外 DERP 中继(加密内容过境) | 元数据出境;内容绝大多数直连,极端场景过境 |
| Tailscale + 国内自建 DERP(推荐) | 境外(元数据,同左) | 直连不出境;穿透失败走国内 VPS 自建 DERP,内容全程境内 | 内容严格不出境 + NAT 穿透能力兼得 |
理由(第一性原理):本质需求 = "MacBook/iPhone 任何网络都能安全连到 Mac mini,且业务内容不出境"。
- Tailscale 负责 NAT 穿透与设备组网(这是最难的部分,自研成本极高)
- 国内 VPS 上跑 DERP 中继(derper,单二进制)→ 穿透失败时内容中继落在境内,满足严格出境约束
- 未来多 VPS 扩展 = Tailscale 加节点 + 登录,零新增配置
- 分层数据流(用户 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 无响应时运维)
- MacBook 运维路径:
claude code(MacBook 本地)→ Tailscale SSH →hermini@mac-mini→~/.hermes/hermes-agent/venv/bin/hermes(补 PATH 软链后可直接hermes)。此路径独立于 Hermes gateway,无响应时仍可操作。 - VPS 角色:组网节点(Tailscale)+ DERP 中继 + 冷备。未来可扩展多个 VPS 做任务 Worker。
五、模型固化方案
| 组件 | 固化配置 | 状态 |
|---|---|---|
| Hermes 主模型 | deepseek-v4-flash(两端 config 一致) | VPS 已生效;Mac mini 待同步 |
| 哨兵 | 改为只读监控(记录限流/卡死,不自动切模型、不重启 gateway)或直接停用 | 待改 |
| Hermes fallback 链 | 保留 glm-5.2 → deepseek(仅作兜底,主模型 429 时单轮降级) | 两端一致即可 |
| Claude Code | coding1(现可用)/ coding2(08-13 恢复)/ deepseek 兜底,固定不轮换 | cc-switch 已就绪 |
六、执行计划(P0-P4)
止血(已执行 ✅):停 Mac mini gateway,消除双活。验证 VPS 单活、无双回复。
配置收敛:Mac mini config.yaml 同步为 deepseek 主 + fallback 一致;哨兵改为只读监控(或停用);hermes CLI 补 PATH。
迁移收尾:rsync 剩余状态(sentinel.json、最新 state.db、.env 同步);Tailscale Mac mini 认证(用户浏览器点一次链接);可选:VPS 自建 DERP。
正式切换(用户确认后一次完成):VPS gateway 停(systemctl --user stop hermes-gateway)→ sleep 5 → Mac mini gateway 启(launchctl bootstrap)→ 验证 Discord 单连接、会话上下文衔接。
验证与文档:执行测试清单 T1-T10;更新方案页 v2.1(清 WireGuard 残留);清理 bootstrap.sh 文案;kimi 双 key 轮换机制文档化。
七、严格测试清单(T1-T10)
| ID | 测试项 | 验证方法 | 通过标准 |
|---|---|---|---|
| T1 | 单 gateway | VPS/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 路由一致) |
| T6 | SSH 通道 | VPS→Mac mini 隧道、MacBook→Mac mini(Tailscale/内网) | 3 条路径全部 ssh 通 |
| T7 | CC 远程运维 | MacBook claude code 经 SSH 执行 hermes status | 能列出 gateway/cron 状态 |
| T8 | CF 部署能力 | Mac mini 上 wrangler pages deploy 测试页 | 部署 URL 返回 200 |
| T9 | 迁移完整性 | cron 列表、memories、state.db 大小、sessions 数两端对比 | 与 VPS 一致(差集为空) |
| T10 | kimi 双 key | usage API 探测 coding1/coding2 | coding1 200;coding2 08-13 后 200 |
八、决策点(需用户拍板)
推荐 Tailscale 认证 + 国内 DERP 兜底(今天完成认证,DERP 可后补)。
备选:纯 Tailscale / 换非腾讯云 VPS 自建 WireGuard(新购机器,耗时)。
推荐 改为只读监控(保留限流/卡死记录与告警,去掉自动切换与自动重启)。
备选:直接停用(最简,失去告警)。
推荐 P1/P2 就绪后立即切换(今天可完成,全程 VPS 服务不中断,切换窗口 ~30s)。
备选:用户指定时间窗口执行。