第 9 章 部署拓扑与多设备共享
前面八章讲 Hermes 的内部机制。这一章讲”把它跑起来的地方”。这听起来像运维话题,但它实际上决定了 Agent 的几个关键属性:响应速度、可靠性、成本、多设备体验。选错了部署方式,前面所有优秀的设计都会被拖后腿。
9.1 部署的四种典型拓扑
拓扑一:纯本地(Local-Only)
Hermes 跑在你个人的电脑上,所有数据留在本地。优点:零服务器成本、数据绝对隐私、延迟最低。缺点:你关机它就不在 —— 没法做 cron 主动汇报,没法从手机远程访问,没法在多设备间共享。
适用:你只在一台固定电脑上使用 Agent,不需要主动触发,对数据隐私要求极高(比如涉及公司机密的个人分析)。
拓扑二:$5 VPS
最便宜的云服务器,每月 5 美元左右。Hermes 24 小时运行,通过飞书 / Telegram 接入。优点:永远在线、便宜、完全可控。缺点:小内存可能吃紧(512MB–1GB),冷启动有延迟,外部 API 调用的网络路径比本地长。
适用:大多数个人用户。这是默认推荐的配置,性价比最高。
拓扑三:按需计算(Modal / Daytona / Fly.io)
Hermes 不常驻服务器,而是按需唤醒 —— 有请求时启动 container,无请求时归还资源。优点:空闲时成本接近 0,弹性好,冷启动通常 2–5 秒可接受。缺点:状态持久化要外挂(SQLite 不能放在 ephemeral 存储里),冷启动期间的请求会变慢。
适用:使用频率不稳定的场景,既不想永远开着也不想错过请求。尤其适合”晚上高频 + 白天低频”的用户。
拓扑四:个人服务器 / 家用 NAS
Hermes 跑在家里的旧电脑、树莓派或 NAS 上。优点:无云账单、可以接入内网服务(本地 NAS、内网数据库)、可以跑本地模型(如果硬件够)。缺点:宽带上传带宽决定延迟,家庭网络可能不稳定,需要做内网穿透。
适用:有 homelab 习惯的技术用户、对本地模型有需求、或者想接入内网资源的人。
选择矩阵
| 我想… | 推荐拓扑 |
|---|---|
| 只想在一台电脑上用,简单就好 | 本地 |
| 每天都用,需要主动汇报和跨设备访问 | $5 VPS |
| 用的频率不稳定,不想为空闲时间付费 | Modal / 按需 |
| 想接本地 NAS / 跑本地模型 / 不想给云付钱 | 家用服务器 |
| 团队协作,多人共享同一个 Agent | 专用 VPS(不是 $5 的,升级到 2–4GB 内存) |
9.2 $5 VPS 部署实操(推荐默认)
这一节给一个完整的 $5 VPS 部署流程,以 DigitalOcean / Vultr / 腾讯云这类服务商的最便宜机型为例。
第 1 步:开机。选一个离你地理位置近的 region(国内用户选新加坡或东京,北美选 SF 或 NYC)。操作系统选 Ubuntu 22.04 LTS。SSH 密钥登录,别用密码。
第 2 步:基础配置:
# 更新系统
sudo apt update && sudo apt upgrade -y
# 装 Python、git、pipx
sudo apt install -y python3-pip python3-venv git curl
python3 -m pip install --user pipx
python3 -m pipx ensurepath
source ~/.bashrc
# 装 Hermes
pipx install hermes-agent
# 验证
hermes --version第 3 步:配置目录和 git:
mkdir -p ~/hermes-work
cd ~/hermes-work
git init
echo "sessions.db" > .gitignore
echo "trajectories/" >> .gitignore
echo "*.log" >> .gitignore第 4 步:初始化 Hermes:
cd ~/hermes-work
hermes init --workdir ~/hermes-work
# 跟随交互式配置:填模型 API key、选模型、初始 user profile第 5 步:配置 systemd 让它开机自启。创建 /etc/systemd/system/hermes.service:
[Unit]
Description=Hermes Agent
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/hermes-work
ExecStart=/home/ubuntu/.local/bin/hermes gateway start --gateway feishu
Restart=on-failure
RestartSec=10
StandardOutput=append:/home/ubuntu/hermes-work/logs/hermes.log
StandardError=append:/home/ubuntu/hermes-work/logs/hermes.err
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable hermes
sudo systemctl start hermes
sudo systemctl status hermes第 6 步:反向代理 + HTTPS。飞书 webhook 要求 HTTPS。用 caddy 最省事:
sudo apt install -y caddy编辑 /etc/caddy/Caddyfile:
hermes.yourdomain.com {
reverse_proxy localhost:8080
}sudo systemctl reload caddy第 7 步:在飞书开放平台把 webhook URL 填成 https://hermes.yourdomain.com/feishu/webhook。
第 8 步:测试。在飞书私聊你配的机器人,发一条消息,看 Hermes 的日志:
tail -f ~/hermes-work/logs/hermes.log应该看到 trigger 被处理、Agent 回复的日志。到这一步 Hermes 已经在一台 $5 的 VPS 上 24 小时在线了。
9.3 状态持久化与备份
无论哪种部署拓扑,都必须考虑状态持久化。Hermes 的”大脑”就在工作目录里,丢了等于从头开始。
要备份的东西:
memory/整个目录(用户画像、笔记、事实)skills/整个目录(所有学到的技能)config.toml(配置)cron.toml(定时任务)
可以不备份的东西:
sessions.db(会话历史,重要但占空间大,可选)trajectories/(每次运行的完整轨迹,占空间最大,通常可以不备份)cache/(各种缓存,重启会重建)logs/(日志,故障诊断用,按需保留)
最简单的备份方案:git + 远程仓库。
cd ~/hermes-work
git add -A
git commit -m "daily snapshot $(date +%Y-%m-%d)"
git push origin main用 cron 定时执行:
# crontab -e
0 3 * * * cd ~/hermes-work && git add -A && git commit -m "daily snapshot $(date +\%Y-\%m-\%d)" -q && git push -q 2>&1这种方案的好处:
- 版本化:你可以回到任意一天的状态
- 异地:远程仓库在另一个地方,服务器挂了也不丢
- 可读:你可以用普通 git 工具查看改了什么
如果你的 memory/skills 里可能包含敏感信息,不要推到公共仓库,用私有仓库或自建 Gitea。
备份的注意事项:
- 如果
sessions.db很大,git 会变慢。可以把它软链接到另一个目录,git 忽略 - 备份之前确保所有 skill 文件里没有明文 API key(第 11 章会讲一个真实事故)
- 定期验证备份可以恢复 —— 在另一台机器上克隆仓库、跑 Hermes,确认它能”想起”你是谁。没验证过的备份 = 没有备份
9.4 多设备共享:一个大脑,多个入口
“多设备共享”不等于”多台机器上跑多个 Hermes”。正确的模型是:一个 Hermes 实例(在 VPS 上),多个入口(CLI、飞书、Telegram)接入它。所有设备通过入口和同一个大脑交互。
具体配置:
在你的 MacBook 上:不跑 Hermes,装一个”远程 CLI 客户端”(或者用 ssh 远程连到 VPS 上直接跑 hermes 命令)。
在你的 iPhone 上:不跑 Hermes,通过飞书移动端和部署在 VPS 上的飞书机器人聊天。
在你的 iPad 上:同上,通过飞书。
在办公室电脑上:通过 ssh 连 VPS 用 CLI,或者用飞书桌面版。
这种拓扑的好处:
- 状态完全统一,任何设备上的任何交互都归入同一个大脑
- 本地设备不需要配置模型 API、不需要占 CPU 和内存
- 换设备的迁移成本是 0,新买一台电脑装个飞书就继续用
这种拓扑的代价:
- 依赖网络,离线时这些设备都用不了 Agent
- 依赖飞书等中间商的稳定性(不过对大多数人这不是问题)
如果你需要离线可用
极少数场景下(飞行途中、无网络环境),你可能需要本地 Hermes。做法是本地部署一份 Hermes,定期从远程同步 memory 和 skills:
# 离线前
cd ~/local-hermes-work
git pull origin main
hermes --workdir . repl
# 离线中你的修改只在本地
# 联网后
git add -A
git commit -m "offline changes"
git push origin main这种”双实例 + git 同步”的做法有冲突风险 —— 如果离线期间你在飞书也用了 Agent(Agent 改了服务器上的 memory),联网后 git 会冲突。解决策略:离线使用期间不要同时用服务器端的 Agent。这是一个约束,不是一个缺陷。
9.5 从本地到云的迁移
如果你一开始是本地部署,后来决定迁到 VPS,迁移流程:
- 在本地提交所有未提交的变化到 git
- 把 git 仓库推到一个远程(GitHub、自建 Gitea)
- 在 VPS 上克隆这个仓库
- 装 Hermes(同 9.2 节的前几步)
- 在 VPS 上把 workdir 指向克隆下来的目录
- 复制 API key 配置(配置里可能有本地路径,要改成 VPS 路径)
- 启动 Hermes,确认它能”想起”你
这个迁移在正常情况下 30 分钟搞定。关键是不要忘记任何一个文件 —— 用 git 管理的好处就是你不会忘。
9.6 版本升级的兼容性检查
Hermes 上游在高速迭代,你早晚要升级。升级前要做几件事:
事前:
- 备份当前状态(git commit + push)
- 看 release note 里有没有 breaking change,尤其是:
config.toml的字段变化SKILL.md的 frontmatter schema 变化sessions.db的数据库 schema 变化
- 在”备用环境”里先升级试用(把本地机器作为备用,先升本地的,没问题再升 VPS 的)
事中:
pipx upgrade hermes-agent
hermes --version # 确认新版本
hermes validate --workdir ~/hermes-work # 如果这个命令存在,它会检查配置和 schema事后:
- 重启服务:
sudo systemctl restart hermes - 跑一个冒烟测试:在飞书里发一条简单消息,确认能正常对话
- 检查日志,确认没有异常
- 观察一天,看看 memory 和 skills 有没有被意外重写
如果升级后出问题:回滚。
pipx install --force hermes-agent==<old-version>
cd ~/hermes-work
git checkout HEAD~1 # 回到升级前的 snapshot(如果升级破坏了文件)
sudo systemctl restart hermes这就是为什么 9.3 节那么强调 git 备份 —— 没有能回滚的备份,升级就是赌博。
9.7 资源监控
一个跑着的 Hermes 要持续监控几个指标:
- CPU 和内存(基础运维)
- 磁盘使用(sessions.db 会增长,trajectories 会堆积)
- API 成本(Hermes 本身可以产出,但最终要交叉验证)
- LLM 调用次数和失败率
- skill 执行统计
前两项用 top / htop / df 解决。后三项是 Hermes 自己产生的数据,在第 10 章的可观测性里讲。
对资源吃紧的 $5 VPS,两个常见问题:
问题一:内存不够。Hermes + Python runtime + caddy + systemd 加起来可能用 400–600MB。如果你的机器只有 512MB,会跑不起来或频繁 OOM。对策:
- 升级到 1GB 机型(加几美元)
- 或者禁用本地 embedding 模型,embedding 全部走 API
- 或者加 swap(不是长久之计,SSD 磨损)
问题二:磁盘满。sessions.db 可能每月增长几百 MB,trajectories 可能每天几十 MB。25GB 的默认磁盘能用几个月,然后会满。对策:
- 定期清理 trajectories(保留最近 30 天)
- 定期归档 sessions.db 的旧数据
- 扩容磁盘(加两三美元)
9.8 部署陷阱清单
陷阱一:没有监控 API 账单。Agent 跑飞了你不知道,月底一看账单几百美元。必须有成本上限 + 报警。
陷阱二:用明文 API key 写在配置里然后 git push。密钥必须走环境变量或 secrets manager,配置文件只留 placeholder。
陷阱三:HTTPS 证书过期。飞书 webhook 会拒绝非 HTTPS,证书过期后机器人就”死”了。用 caddy 的自动续期,或者 certbot。
陷阱四:没开防火墙。VPS 默认开着所有端口,很快会被扫描攻击。至少关闭非必要端口,只开 22/80/443。
陷阱五:ssh 还在用密码登录。改密钥,禁用密码,禁用 root 直接登录。
陷阱六:时区不一致。VPS 默认 UTC,但你在中国。cron “0 8 * * *” 变成”下午 4 点触发”而不是”早上 8 点”。解决:sudo timedatectl set-timezone Asia/Shanghai。
陷阱七:没做升级演练。上游发新版本,你直接在生产上升级。升坏了没法回滚。做法见 9.6 节。
陷阱八:多设备同时写 memory 冲突。本地和 VPS 都跑 Hermes 且都在改 memory,导致 git 冲突。解决:只有一个”主节点”可以写,其他节点只读或走入口接入主节点。
到这一章结束,你应该能把一个 Hermes 部署起来、长时间运行、必要时升级回滚。接下来进入第四部分 —— 讲”跑起来之后,你怎么知道它跑得好不好”。