Hermes Agent 服务器部署完整指南
基于官方文档 (hermes-agent.nousresearch.com/docs) + 社区最佳实践整理。 面向个人自托管场景。目标:一台 Linux VPS(推荐 Ubuntu 24.04),2vCPU/4GB 起步。
1. 什么是 Hermes Agent
Hermes Agent 是 Nous Research 开源的自主 AI Agent 框架(MIT License):
- 自我改进的学习循环 — 自动创建 Skills、跨会话 Memory、FTS5 全文检索、用户建模
- 不绑定笔记本 — 跑在 VPS 上,通过 Telegram/Discord/微信/WhatsApp 等 15+ 平台对话
- 6 种终端后端 — local、Docker、SSH、Daytona、Singularity、Modal
- 68+ 内置工具 — 文件操作、Web 搜索、浏览器自动化、代码执行、TTS、图像生成
- MCP 支持 — 连接任何 MCP 服务器扩展工具能力
- 支持任何 LLM — Nous Portal、OpenRouter、Anthropic、OpenAI、DeepSeek 等 15+ 提供商
- 定时任务 — 内置 Cron,可将结果推送到任何平台
与 Claude Code / OpenClaw 的区别:Hermes 不是 IDE 插件,而是一个独立运行在服务器上的自主 Agent,可以通过消息平台远程交互,且有完整的 Memory + Skills 学习循环。每完成 15 个任务会自动评估自身表现。
2. VPS 服务器选型
推荐配置
| 提供商 | 配置 | 存储 | 月费(参考) | 特点 |
|---|---|---|---|---|
| Hetzner | 2 vCPU / 4 GB | 40 GB NVMe | ~€4.50 | 欧洲最便宜,性能好 |
| Vultr | 2 vCPU / 4 GB | 80 GB SSD | ~$24 | 全球机房多,新加坡可用 |
| DigitalOcean | 2 vCPU / 4 GB | 80 GB SSD | ~$24 | 文档好,新加坡可用 |
| RackNerd | 2 vCPU / 4 GB | 60 GB SSD | ~$13 | 便宜,年付更划算 |
| Oracle Cloud | 4 vCPU / 24 GB | 200 GB | $0(永久免费) | Always Free Tier,但抢号难 |
推荐起步:2vCPU / 4GB / 40GB+ SSD。Hermes 是 API 调用模式,大部分时间在等网络响应,共享 CPU 影响很小。大多数 VPS 提供商都支持在线升级(Resize),几分钟搞定,数据不丢。先跑起来,不够再加。
共享 vs 专用 CPU
Hermes 用共享 CPU 就够了。它是轻量 Python 编排器,大部分时间在等 API 响应(网络 I/O),不怎么吃 CPU。共享 CPU 对这种工作模式影响很小,能省一半以上的钱。
共享 CPU 的实际影响:
- 高峰时段(同物理机其他用户高负载时),Gateway 响应可能偶尔慢几百毫秒
- 对 API 调用模式几乎无感知 — 瓶颈在网络上,不在 CPU
- 对浏览器自动化(Playwright)有一定影响 — 渲染页面需要 CPU
什么时候升级到专用 CPU:需要稳定跑浏览器自动化、多 Agent 并行、或 CPU 密集任务时。大多数 VPS 都支持在线升级(Resize),几分钟搞定,数据不丢。
建议:先用 2vCPU / 4GB 的共享 CPU 方案(大多数提供商 $4-24/月),跑起来再说。以后需要浏览器自动化或多 Agent 时,再在线升级到更高配置。Hermes 是 API 调用模式,共享 CPU 影响很小。
Hermes 实际资源占用
Hermes 是一个轻量 Python 编排器,本身不吃资源(不跑模型,只调 API):
| 组件 | 内存占用 | 说明 |
|---|---|---|
| Hermes Agent 进程 | ~150-400 MB | Python + SQLite FTS5,API-only 模式 |
| Docker sandbox(工具执行时) | +100-300 MB / 容器 | 每次执行沙箱工具时临时启动 |
| Messaging Gateway | ~50-100 MB | Telegram/Discord bot 常驻进程 |
| Dashboard | ~100-200 MB | Web 管理界面 |
| SQLite 数据库 | 几 MB | 即使上千条会话也很小 |
按使用场景选配置
| 场景 | 配置 | 月费 | 说明 |
|---|---|---|---|
| 轻度使用:单 Agent + Telegram 偶尔聊 | 1 vCPU / 2 GB / 25 GB | ~$5-12 | Hermes 官方最低要求 2 GB,Basic 共享 CPU 够用 |
| 推荐起步 | 2 vCPU / 4 GB / 40GB+ | $4-24 | 共享 CPU 对 API 调用影响很小,80 GB 存储更宽裕 |
| 进阶:需要稳定 CPU | 2 vCPU / 4 GB(专用 CPU) | $20-42 | 专用 CPU,适合浏览器自动化等 CPU 密集任务 |
| 进阶:多 Agent + MCP + Dashboard | 2 vCPU / 8 GB / 80GB+ | ~$24-63 | 大多数提供商 $24-63 |
你的场景:单 Agent + 微信 + Docker + Dashboard,推荐 2vCPU / 4GB。Hermes 是 API 调用模式,共享 CPU 影响很小。总内存占用约 1.5 GB,4 GB 绰绰有余。
迁移超简单:Docker 部署下,所有数据在~/.hermes/目录,换服务器只需打包这个目录 + compose 文件,新服务器docker compose up -d就搞定。
选型要点
| 维度 | 推荐 | 原因 |
|---|---|---|
| 地区 | 就近选区 | 亚洲用户推荐新加坡、东京、香港(如果有的话)。欧洲用户选法兰克福。延迟越低体验越好 |
| 系统 | Ubuntu 24.04 LTS | Hermes 官方支持,Docker 生态最好 |
| 存储 | 25 GB 起步 | Hermes 数据通常不超过几 GB,Docker 镜像约 2-3 GB |
| GPU | 不需要 | Hermes 不跑模型,只调用远程 API |
| 备份 | 开启(+$2/月) | 保护 config、memory、sessions |
免费额度和学生优惠
很多 VPS 提供商有新用户优惠或免费额度:
| 提供商 | 优惠 | 说明 | |
|---|---|---|---|
| Oracle Cloud Always Free | 永久免费 4C/24GB | ARM 实例,抢号看运气 | |
| CPU-Optimized 2vCPU/4GB(专用) | $42 | ~42天 | 需要稳定 CPU 性能时再升级 |
| General Purpose 2vCPU/8GB(专用) | $63 | ~30天 | 多 Agent + MCP 全开才需要 |
建议:Hermes 本身只占 ~300 MB 内存,4 GB 绰绰有余。大多数 VPS 支持在线 Resize,几分钟搞定,数据不丢。先跑起来,不够再加。
月度总成本估算
根据使用强度选择方案:
| 方案 | LLM | 工具 | 月总费用 | 适合 |
|---|---|---|---|---|
| 轻量(推荐起步) | DeepSeek($0.14/$0.28/M) | Brave 搜索免费 | ~$27-28 | 低强度日常使用 |
| 标准 | OpenRouter 按量(Sonnet/GPT) | Brave 免费 + FAL 按量 | ~$30-45 | 中等使用,多模型切换 |
| 全包 | OpenRouter 按量 | Nous Portal Plus $20 | ~$49-59 | 重度使用,需要浏览器自动化等 |
推荐起步:VPS $4-24 + DeepSeek $3-4/月 = ~$7-28/月。先跑起来,不够再加。
省钱策略:LLM 用 DeepSeek($0.14/$0.28/M tokens),搜索用 Brave(免费 2000 次/月),月总费用约 $4-5。需要更多工具时再加 Nous Portal。
3. SSH Key 与服务器连接
CRITICALSSH Key 是你连接服务器的唯一方式。丢失 = 无法登录。
3.1 本地生成 SSH Key
# 在你的本地电脑(Windows/Mac/Linux)运行
ssh-keygen -t ed25519 -C "hermes-server" -f ~/.ssh/hermes_do
# 一路回车(不设密码短语也可以,设了更安全)
# 生成两个文件:
# ~/.ssh/hermes_do (私钥,永远不要分享)
# ~/.ssh/hermes_do.pub (公钥,上传到服务器)3.2 将公钥添加到 VPS 提供商
- 复制公钥内容:
# macOS
cat ~/.ssh/hermes_do.pub | pbcopy
# Windows (Git Bash)
cat ~/.ssh/hermes_do.pub | clip.exe
# Linux
cat ~/.ssh/hermes_do.pub
# 手动复制输出- 在 VPS 控制面板 → SSH Keys 设置中添加公钥(大多数提供商都支持)
- 粘贴公钥,命名如
hermes-laptop,点击 Add - 创建 VPS 实例时选择这个 SSH Key
3.3 创建 VPS 实例
方式一:控制面板(推荐新手)
- 登录你的 VPS 控制面板
- 选择 Ubuntu 24.04,地区选离你最近的(亚洲推荐新加坡/东京),配置 2vCPU / 4GB
- 选择刚才添加的 SSH Key 进行认证
- 点击 Create,等待 30 秒,记下分配的 IP 地址
方式二:CLI(以 DigitalOcean 为例,其他提供商有自己的 CLI 工具)
# 本地安装 doctl
brew install doctl # macOS
# 或 snap install doctl # Linux
# 认证
doctl auth init
# 创建 Droplet
doctl compute droplet create hermes-agent \
--region sgp1 \
--image ubuntu-24-04-x64 \
--size s-2vcpu-4gb \
--ssh-keys <your-ssh-key-fingerprint>
# 查看分配的 IP
doctl compute droplet list3.4 配置本地 SSH Config(命令行用户)
如果你用 Termius(下一节),可以跳过这步 — Termius 有自己的连接管理界面,不需要编辑 config 文件。
编辑 ~/.ssh/config,之后只需输入 ssh hermes 即可连接:
Host hermes
HostName <你的服务器IP>
User root
IdentityFile ~/.ssh/hermes_do
ServerAliveInterval 60
ServerAliveCountMax 33.5 首次连接
ssh hermes
# 首次连接会提示 fingerprint,输入 yes
# 成功后看到 root@hermes-agent:~# 即连接成功3.6 使用 Termius 连接(推荐 GUI 方式)
Termius 是跨平台 SSH 客户端(Windows/Mac/iOS/Android),支持保存连接、SFTP 文件传输、端口转发。
- 下载安装 Termius
- 新建 Host:
HostName= 服务器 IP,User=hermes(或root) - 在 Keychain 中导入你的 SSH 私钥(
~/.ssh/hermes_do) - 关联 Key 到 Host,点击连接即可
Termius 的 SFTP 面板可以直接拖拽文件上传/下载,编辑SOUL.md、config.yaml等配置文件很方便,不用记nano命令。Pro 版支持端口转发(访问 Dashboard 9119 端口)。
如果你在多台电脑上使用,在每台电脑上都生成 SSH Key,全部添加到 VPS 控制面板的 SSH Keys 列表。这样任何一台电脑都能连接服务器。
4. 服务器初始化
CRITICAL4.1 系统更新
apt update && apt upgrade -y4.2 安装基础工具
apt install -y curl git build-essential ufw fail2ban tmux htop| 工具 | 用途 | 详细介绍 |
|---|---|---|
curl | 命令行下载工具 | 下载安装脚本、测试 API 接口、检查 URL 是否可达。Hermes 安装脚本需要用它。 |
git | 版本控制 | Hermes 核心依赖。也用于你自己管理 ~/.hermes/ 配置的版本。 |
build-essential | C/C++ 编译工具链 | 包含 gcc、g++、make。Python 的某些依赖(如 cryptography)需要编译 C 扩展,没有这个会安装失败。 |
ufw | 防火墙 | Uncomplicated Firewall 的缩写,iptables 的简化前端。控制服务器哪些端口对外开放。详见下方 4.4 节。 |
fail2ban | 入侵防御 | 监控日志,自动封禁多次登录失败的 IP。防止 SSH 暴力破解。详见下方 4.5 节。 |
tmux | 终端复用器 | 在 SSH 会话中创建"虚拟终端窗口"。即使 SSH 断开,tmux 里的进程继续运行。用法:tmux 新建会话 → 执行命令 → Ctrl+B 然后 D 脱离 → tmux a 恢复。跑 Docker Compose 或长时间任务时必备。 |
htop | 交互式进程监控 | 比 top 更好用的系统监控工具。实时显示 CPU、内存、进程列表。可以排序、搜索、杀进程。直接输入 htop 启动,按 q 退出。 |
tmux 常用快捷键
tmux 所有快捷键都以 Ctrl+B 为前缀(先按 Ctrl+B,松开再按下一个键):
| 快捷键 | 功能 |
|---|---|
Ctrl+B 然后 D | 脱离当前会话(后台继续运行) |
Ctrl+B 然后 C | 新建窗口 |
Ctrl+B 然后 N | 切换到下一个窗口 |
Ctrl+B 然后 % | 左右分屏 |
Ctrl+B 然后 " | 上下分屏 |
Ctrl+B 然后方向键 | 在分屏间切换 |
tmux ls | 列出所有会话 |
tmux a -t 0 | 恢复指定编号的会话 |
4.3 创建非 root 用户
HIGH永远不要用 root 跑应用。创建专用用户:
# 创建用户 hermes
adduser hermes
# 输入密码(记下来!),其他信息一路回车
# 赋予 sudo 权限
usermod -aG sudo hermes
# 免密 sudo(可选但推荐 —— sudo 不再每次要密码)
echo "hermes ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/hermes
sudo chmod 440 /etc/sudoers.d/hermes
# 创建 .ssh 目录并复制授权密钥
mkdir -p /home/hermes/.ssh
cp /root/.ssh/authorized_keys /home/hermes/.ssh/
chown -R hermes:hermes /home/hermes/.ssh
chmod 700 /home/hermes/.ssh
chmod 600 /home/hermes/.ssh/authorized_keys
# 测试:新终端连接
# ssh hermes@<IP> 应该能用 hermes 用户登录NOPASSWD 的作用:配置后 sudo ufw allow 22/tcp 直接执行,不再弹密码提示。如果没配 NOPASSWD,每次 sudo 都要输入 hermes 用户的密码。不影响安全性 —— 只有能 SSH 登录 hermes 用户的人才能用 sudo。
测试新用户能 SSH 登录后,再继续下一步。如果新用户登不上,检查 authorized_keys 权限。
4.4 配置防火墙 (UFW)
# 只开放必要端口(hermes 用户需要 sudo)
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP (Nginx)
sudo ufw allow 443/tcp # HTTPS (Nginx)
# 8642 和 9119 不要开!通过 Nginx 反向代理访问
sudo ufw allow 22000/tcp # Syncthing P2P 直连(TCP 数据传输)
sudo ufw allow 22000/udp # Syncthing QUIC 加速(UDP 快速握手)
sudo ufw enable
# 提示 "proceed with operation",输入 y
# 查看状态
sudo ufw status verbose4.5 配置 Fail2Ban(防暴力破解)
Fail2Ban 是一个入侵防御工具,原理很简单:监控日志文件,发现某个 IP 多次登录失败后,自动用防火墙封禁该 IP 一段时间。服务器暴露在公网上,每分钟都有机器人在扫 SSH 端口尝试暴力破解,Fail2Ban 是第一道防线。
工作原理
| 步骤 | 说明 |
|---|---|
| 1. 监控日志 | Fail2Ban 持续读取 /var/log/auth.log(SSH 登录日志) |
| 2. 匹配失败 | 检测到 "Failed password" 等失败记录,计数 +1 |
| 3. 达到阈值 | 同一 IP 在 findtime 内失败 maxretry 次 → 触发封禁 |
| 4. 执行封禁 | 自动添加 iptables/firewall 规则,丢弃该 IP 的所有流量 |
| 5. 自动解封 | 过了 bantime 后自动解除封禁 |
关键参数说明
| 参数 | 含义 | 默认值 | 建议 |
|---|---|---|---|
maxretry | 最大失败次数 | 5 | 5 次,太低容易误封自己 |
findtime | 检测时间窗口 | 600 秒(10 分钟) | 10 分钟内 5 次失败就封 |
bantime | 封禁时长 | 3600 秒(1 小时) | 可设 -1 永久封禁 |
完整配置步骤
# Step 1: 创建本地配置(不要直接改 jail.conf,升级会覆盖)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Step 2: 配置 SSH 防护
sudo tee /etc/fail2ban/jail.d/sshd.local > /dev/null <<'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 600
bantime = 3600
EOF
# Step 3: 启动并设为开机自启
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Step 4: 验证状态
sudo fail2ban-client status sshd常用管理命令
| 命令 | 说明 |
|---|---|
sudo fail2ban-client status | 查看所有 jail 状态 |
sudo fail2ban-client status sshd | 查看 SSH jail 详情(封禁 IP 数量等) |
sudo fail2ban-client set sshd banip 1.2.3.4 | 手动封禁某个 IP |
sudo fail2ban-client set sshd unbanip 1.2.3.4 | 手动解封某个 IP |
sudo fail2ban-client reload | 修改配置后重新加载 |
sudo tail -f /var/log/fail2ban.log | 实时查看 Fail2Ban 日志 |
如果你自己也被封了(输错密码太多次),去 VPS 控制面板用 Recovery Console(VNC)登录服务器,运行sudo fail2ban-client set sshd unbanip 你的IP解封。或者临时关闭:sudo systemctl stop fail2ban。
如果用了 Termius 等 SSH 客户端,建议把 maxretry 设为 8-10,因为某些客户端连接时会自动尝试多种认证方式,容易触发误封。
4.6 禁用 root SSH 登录(可选但推荐)
MEDIUM为什么要禁用 root SSH 登录?
| 原因 | 说明 |
|---|---|
| 攻击面 | 公网上的机器人不停扫描 SSH 端口,root 是它们猜密码的第一个用户名 |
| 误操作风险 | root 没有安全网 — rm -rf / 直接执行,没有 sudo 的"确认"缓冲 |
| 审计 | 用 hermes 用户 + sudo,日志里能看到"谁执行了什么";root 登录无法区分 |
禁用 root 后,需要系统管理操作时:ssh hermes@<IP>登录 →sudo 命令(已配 NOPASSWD 免密)。如果需要完整 root shell,用sudo -i。
# 确认 hermes 用户能 sudo 后再操作!
# 兼容 Ubuntu 24.04(默认 PermitRootLogin prohibit-password)和其他版本
sudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# 之后用 ssh hermes@<IP> 连接,再 sudo -i 获取 root4.7 安装 Docker + Docker Compose
CRITICAL# 切换到 hermes 用户
su - hermes
# 安装 Docker(一键脚本)
curl -fsSL https://get.docker.com | sudo sh
# 将 hermes 用户加入 docker 组(免 sudo 运行 docker)
sudo usermod -aG docker hermes
# 重新登录使组生效
exit
su - hermes
# 验证
docker --version # Docker version 27.x
docker compose version # Docker Compose version v2.x(已随 Docker 自带)
docker run hello-world4.8 创建目录结构
mkdir -p ~/.hermes
mkdir -p ~/hermes-deploy5. 部署方式选择:Docker vs 脚本安装
CRITICAL一句话结论
用 Docker Compose 部署。官方推荐、生产首选。一行命令启动,30秒升级,崩溃自动重启,数据不怕丢。除非你需要改 Hermes 源码,否则不要选其他方式。
两种方式全面对比
| Docker Compose(推荐) | 脚本 / 源码安装(备选) | |
|---|---|---|
| 安装 | docker compose up -d,一行搞定 | 需要 Python 3.11、Node.js 22、uv、ripgrep、ffmpeg |
| 环境隔离 | 容器完全隔离,不污染宿主机 | 装在系统里,可能跟 Python/Node 版本冲突 |
| 升级 | docker compose pull && up -d(30秒) | hermes update(偶尔依赖出错) |
| 回滚 | 指定旧镜像 tag,秒级回滚 | git checkout + 重装依赖 |
| 迁移 | 拷贝 ~/.hermes/ + compose 文件即可 | 拷贝数据 + 重装整个运行环境 |
| 崩溃恢复 | restart: unless-stopped 自动重启 | 需要自己配 systemd 或 tmux |
| 资源限制 | compose 里设 limits,防止 OOM | 无限制,runaway 进程可能拖垮服务器 |
| 安全隔离 | Agent 命令在容器内执行,宿主机安全 | Agent 命令直接在宿主机运行,风险更高 |
| 多 Agent | 每个 Agent 一个容器,互不影响 | 需要手动管理多个进程 |
| Dashboard | compose 自带 Web 管理界面 | 需要额外配置 |
| 适合谁 | 所有人(新手到生产) | 需要改 Hermes 源码的开发者 |
Docker 部署的核心优势
- 容器 = 安全边界 — Agent 在容器内执行命令,即使执行了危险操作也只影响容器,宿主机安全。官方文档:Docker 后端下跳过危险命令检查,因为容器本身就是安全边界
- 无状态镜像 — 容器随时可删可重建,所有数据在宿主机
~/.hermes/,不会丢 - 一键升级 —
docker compose pull && up -d,拉新镜像 → 停旧容器 → 建新容器 → 挂载同一份数据 - Gateway + Dashboard — compose 同时启动消息网关和 Web 管理界面
- 资源可控 — 内存、CPU 上限写在 compose 里,不会吃光服务器资源
什么时候用脚本安装?
- 你需要修改 Hermes 源码(提交 PR、调试 bug)
- 服务器不支持 Docker(极少数 VPS 限制)
- 你想最小化资源占用(Docker 镜像约 2-3 GB)
下面先讲 Docker 部署(推荐),脚本安装放在本节最后作为备选。
Docker 已在 4.7 节安装完成。如果还没装,先回去执行 4.7 节的命令。
5.1 首次配置(Setup 向导)
用交互式向导配置 API keys 和消息平台:
# 运行 setup 向导(交互式,-it 必须)
# -v 把宿主机 ~/.hermes 挂载到容器内 /opt/data
docker run -it --rm \
-v ~/.hermes:/opt/data \
nousresearch/hermes-agent setup向导会依次引导你:
- 选择 LLM Provider(OpenRouter / Anthropic / OpenAI 等)
- 输入 API Key
- 选择消息平台(Telegram / Discord / 微信 等)并输入 token
- 选择 Terminal Backend(推荐 Docker)
所有配置写入 ~/.hermes/.env 和 ~/.hermes/config.yaml。
如果向导中跳过了某些配置,后续可以用 docker exec -it hermes hermes config set KEY VALUE 手动添加,或重新运行 setup 向导。
5.2 Docker Compose 部署
Step 1: 创建 compose 文件
cd ~/hermes-deploy创建 docker-compose.yaml:
cat > docker-compose.yaml << 'EOF'
services:
# ===== 主服务:Hermes Gateway =====
hermes:
image: nousresearch/hermes-agent:latest
container_name: hermes
restart: unless-stopped # 崩溃或重启后自动恢复
env_file:
- ~/.hermes/.env # API keys 和认证信息
ports:
- "127.0.0.1:8642:8642" # Gateway API 端口(仅本地访问)
- "127.0.0.1:9119:9119" # Dashboard Web 端口(仅本地访问)
volumes:
- /home/hermes/.hermes:/opt/data # 数据持久化(用绝对路径,见下方警告)
# - /var/www/rss/digest:/opt/data/digest # RSS 每日简报(装了 RSS 系统才加)
environment:
- HERMES_UID=${HERMES_UID:-1000} # 对齐宿主机 UID,避免权限问题
- HERMES_GID=${HERMES_GID:-1000}
- PATH=/opt/hermes/.venv/bin:$PATH # 让 hermes 命令直接可用
- TZ=Asia/Shanghai # 容器时区(宿主机改了时区,容器也要改)
- HERMES_DASHBOARD=1 # 启用 Dashboard(s6 监督,与 Gateway 共存)
networks:
- hermes-net
# - rss-stack_rss-net # RSS 系统网络(装了 Miniflux 才加,见下方说明)
deploy:
resources:
limits:
memory: 4G # 内存上限,防止 OOM 影响宿主机
cpus: "2.0" # CPU 上限
# ===== Syncthing(文件同步 — 手机/电脑/服务器三端同步 Obsidian)=====
syncthing:
image: linuxserver/syncthing:latest
container_name: syncthing
restart: unless-stopped
network_mode: host # P2P 需要 host 网络(UDP 打洞)
environment:
- PUID=1000
- PGID=1000
volumes:
- /home/hermes/.hermes/syncthing-config:/config
- /home/hermes/.hermes/obsidian-vault:/data/vault
# ===== FileBrowser(Web 文件管理) =====
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
restart: unless-stopped
ports:
- "127.0.0.1:8080:80"
volumes:
- /opt/data/shared:/srv
- /home/hermes/.hermes/filebrowser-config:/config
networks:
- hermes-net
networks:
hermes-net:
driver: bridge # 容器间通信网络
# rss-stack_rss-net: # RSS 系统外部网络(装了 Miniflux 才取消注释)
# external: true
EOF路径陷阱:volumes 里必须用绝对路径(如/home/hermes/.hermes),不能用~/.hermes。因为sudo docker compose时~会解析成/root,导致挂载的是/root/.hermes(空目录),容器内看不到你的配置文件。这是新手最常踩的坑之一。
UID 对齐:HERMES_UID=1000让容器内 hermes 用户 UID 与宿主机一致(都是 1000),这样~/.hermes/下的文件权限自动正确,不需要sudo chown。如果你的宿主机用户 UID 不是 1000,用id -u查看后替换。
Step 2: 启动服务
cd ~/hermes-deploy
# 首次启动(拉取镜像 + 后台运行)
docker compose up -d
# 查看容器状态(应看到 hermes 是 running)
docker compose ps预期输出:
NAME IMAGE STATUS
hermes nousresearch/hermes-agent:latest Up 30 secondsStep 3: 验证服务
# 查看 Gateway 日志(确认启动成功)
docker compose logs hermes
# 检查 Gateway 健康状态
curl http://localhost:8642/health
# 检查 Dashboard(应返回 302 重定向到登录页)
curl -s -o /dev/null -w '%{http_code}' http://localhost:9119/Step 4: 测试对话
# 方式 A:在微信/Telegram 中给 bot 发消息(如果已配置消息平台)
# 方式 B:直接在终端聊天
docker exec -it hermes hermes chat
# 方式 C:单次查询(不进入交互模式)
docker exec -it hermes hermes chat -q "你好,你是谁?"退出聊天:在 hermes 交互界面中按Ctrl+D或输入/exit退出。如果卡住,Ctrl+C中断当前回复,再按Ctrl+D退出。
启动时 lark_oapi 报错:如果看到 lark_oapi 相关的 Python traceback,这是飞书 SDK 的已知 bug,不影响主要功能(微信/Telegram 正常使用)。等 banner 出现后即可正常聊天。
已验证的工作配置参考
| 配置项 | 值 | 说明 |
|---|---|---|
| 服务器 | VPS 2vCPU / 4GB RAM | 就近选区 |
| LLM 模型 | DeepSeek V4-Pro(via OpenRouter) | 默认模型,性价比高 |
| 消息平台 | 微信(iLink Bot) | Hermes 原生支持 |
| 微信白名单 | allowlist + 你的 user_id | ⚠️ 不要用 ALLOW_ALL_USERS |
| 部署方式 | Docker Compose(单容器,s6 监督) | Gateway + Dashboard 共存 |
| 数据目录 | ~/.hermes/ → 容器 /opt/data | volume 挂载 |
| UID 对齐 | HERMES_UID=1000 in compose | 容器 hermes UID = 宿主机 hermes UID,权限自动一致 |
| hermes 命令 | docker exec -it hermes bash 进容器后直接用 | 推荐先进容器再操作,权限自动正确 |
5.3 日常管理命令
| 操作 | 命令 | 说明 |
|---|---|---|
| 进入容器(推荐) | docker exec -it hermes bash | 进容器后直接用 hermes 命令,权限正确 |
| 启动 | docker compose up -d | 后台启动所有服务 |
| 停止 | docker compose down | 停止并移除容器(数据不丢) |
| 重启 | docker compose restart | 重启所有服务 |
| 重启单个 | docker compose restart hermes | 只重启 Gateway |
| 查看状态 | docker compose ps | 查看容器运行状态 |
| 实时日志 | docker compose logs -f | 跟踪所有服务日志 |
| 单服务日志 | docker compose logs -f hermes | 只看 Gateway 日志 |
| 进入聊天 | docker exec -it hermes hermes chat | 在容器内交互式聊天 |
| 单次查询 | docker exec -it hermes hermes chat -q "问题" | 不进入交互模式 |
| 查看资源 | docker stats hermes | 实时 CPU / 内存占用 |
| 执行命令 | docker exec -it hermes hermes doctor | 在容器内执行任何 hermes 命令 |
| Gateway 状态 | docker exec -it hermes hermes gateway status | 查看消息平台连接状态 |
Docker 命令前缀详解
Docker 容器是一个隔离的迷你系统,和你的服务器(宿主机)是两个独立环境:
| 环境 | 有什么 | 没有 |
|---|---|---|
| 宿主机(你的服务器) | docker 命令、compose 文件 | hermes 命令 |
| 容器(hermes) | hermes 命令、所有 agent 数据 | docker 命令 |
所以操作分两类:
| 类型 | 在哪执行 | 命令格式 | 示例 |
|---|---|---|---|
| 管理容器(启停、日志) | 宿主机 | docker compose xxx | docker compose up -d |
| 让 hermes 干活(config、model、chat) | 容器内 | 先 bash 进容器 | 见下方 |
UID 对齐:compose 文件中设置HERMES_UID=1000后,容器内hermes用户 UID 与宿主机一致(都是 1000)。你可以直接在宿主机编辑~/.hermes/下的文件,权限自动正确,不用进容器。
# ===== 在宿主机执行,管理容器 =====
docker compose up -d # 启动
docker compose down # 停止
docker compose restart # 重启
docker compose logs -f # 看日志
# ===== 推荐:先进入容器,再操作 hermes =====
docker exec -it hermes bash # 进入容器 shell
hermes config set DEEPSEEK_API_KEY "sk-xxx"
hermes config show
hermes model
hermes gateway setup
hermes chat
hermes doctor
exit # 退出容器,回到宿主机
# ===== 或者单条命令(不进容器)=====
docker exec -it hermes hermes config show
docker exec -it hermes hermes chat
docker exec -it hermes hermes doctor容器内安装 nano(可选):容器默认没有编辑器。进容器后执行apt update && apt install -y nano即可使用nano编辑文件。注意:容器重建后需重新安装。或者直接在宿主机用nano ~/.hermes/config.yaml编辑(UID 对齐后不需要 sudo)。
5.4 升级 Hermes
升级方式:docker compose pull && docker compose up -d即可。容器本身无状态,升级不会丢失配置、记忆或会话数据(都挂载在~/.hermes/)。
cd ~/hermes-deploy
# 拉取最新镜像
docker compose pull
# 用新镜像重建容器(数据在 ~/.hermes/,不会丢失)
docker compose up -d
# 验证版本和时区
docker exec -it hermes hermes --version
docker exec -it hermes date升级过程:拉新镜像 → 停旧容器 → 建新容器 → 挂载同一份数据。整个过程 ~/.hermes/ 里的 config、memory、sessions 完全不受影响。
v0.15.x → v0.16.0 升级指南(含 Dashboard 认证配置)
v0.16.0 的核心变化:Dashboard 不再是独立容器,改为与 Gateway 共享同一容器(s6 监督),并新增用户名/密码认证。
| 项目 | 升级前 (v0.15.x) | 升级后 (v0.16.0+) |
|---|---|---|
| Dashboard | 独立容器,--insecure 无密码 | 与 Gateway 共享容器(s6 监督),用户名/密码认证 |
| 认证方式 | 无 | Basic Auth(密码哈希 + 签名密钥) |
| compose 变化 | 两个 service(hermes + hermes-dashboard) | 一个 service(HERMES_DASHBOARD=1) |
Step 1:备份
cp -r ~/.hermes ~/.hermes.backup.$(date +%Y%m%d)
ls -la ~/.hermes.backup.*/config.yamlStep 2:拉取新镜像
cd ~/hermes-deploy
docker compose pullStep 3:生成密码哈希
⚠️ 必须在 Step 2 之后执行(旧镜像没有 dashboard_auth 插件)
# 替换 'YourPassword123!' 为你实际想设的密码
docker run --rm nousresearch/hermes-agent:latest python -c "from plugins.dashboard_auth.basic import hash_password; print(hash_password('YourPassword123!'))"输出类似:scrypt$16384$8$1$abcdef...$fedcba...(⚠️ 复制完整输出,不要漏掉 scrypt$)
Step 4:生成签名密钥
openssl rand -base64 32Step 5:修改 docker-compose.yaml
备份后编辑:cp ~/hermes-deploy/docker-compose.yaml ~/hermes-deploy/docker-compose.yaml.bak
增量修改(不要照搬模板重写,保留你已有的 volumes、networks、environment):
具体操作:
1. 删除整个 hermes-dashboard: 服务块(从 hermes-dashboard: 到下一个 services: 或文件末尾):
# 删除以下整个块(包括所有缩进行):
hermes-dashboard:
command: bash -c "hermes dashboard --host 0.0.0.0"
container_name: hermes-dashboard
depends_on:
- hermes
...(删除到下一个服务或文件末尾)2. 在 hermes 服务的 environment 里添加(如果还没有):
environment:
# ... 你现有的环境变量保留 ...
- TZ=Asia/Shanghai # ← 保留这个
- HERMES_DASHBOARD=1 # ← 新增这行3. 在 hermes 服务的 ports 里添加(如果还没有):
ports:
- "127.0.0.1:8642:8642" # ← 保留
- "127.0.0.1:9119:9119" # ← 新增这行4. 删除 hermes-dashboard 容器里的 GATEWAY_HEALTH_URL 行(如果有的话)——单容器模式下 Dashboard 自动通过 localhost 连接 Gateway,不需要此变量。
5. 保留你已有的其他配置(volumes、networks、其他 environment 变量)。
修改后应该是这样的:
services:
hermes:
image: nousresearch/hermes-agent:latest
container_name: hermes
restart: unless-stopped
env_file:
- ~/.hermes/.env
environment:
- HERMES_UID=${HERMES_UID:-1000}
- HERMES_GID=${HERMES_GID:-1000}
- TZ=Asia/Shanghai
- HERMES_DASHBOARD=1 # ← 新增
ports:
- "127.0.0.1:8642:8642"
- "127.0.0.1:9119:9119" # ← 新增
volumes:
- /home/hermes/.hermes:/opt/data
# - /var/www/rss/digest:/opt/data/digest # 如果有 RSS 系统
networks:
- hermes-net
# - rss-stack_rss-net # 如果有 RSS 系统
# hermes-dashboard: ← 已删除,不需要了
networks:
hermes-net:
driver: bridge
# rss-stack_rss-net:
# external: trueStep 6:添加 Dashboard 认证到 .env
进容器编辑(推荐,权限自动正确):
docker exec -it hermes bash
cat >> /opt/data/.env <<'EOF'
# === Dashboard 认证(v0.16.0+)===
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=admin
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=这里粘贴Step3的输出
HERMES_DASHBOARD_BASIC_AUTH_SECRET=这里粘贴Step4的输出
EOF
grep "DASHBOARD" /opt/data/.env # 验证写入
exit⚠️ 每行一个变量,替换占位符为实际值。不要有多余空格或换行。
Step 7:检查 nginx
cat /etc/nginx/sites-available/hermes确认 proxy_pass http://127.0.0.1:9119,没有单独的 location /api/ 块。如有,删除。
Step 8:重建并验证
cd ~/hermes-deploy
docker compose down && docker compose up -d
# 验证
docker ps --format 'table {{.Names}} {{.Status}} {{.Ports}}'
docker exec hermes hermes --version # 预期 v0.16.x
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:9119/ # 预期 200 或 302
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8642/health # 预期 200
sudo nginx -t && sudo systemctl reload nginx回滚
点击展开回滚步骤
# 回滚 compose
cp ~/hermes-deploy/docker-compose.yaml.bak ~/hermes-deploy/docker-compose.yaml
cd ~/hermes-deploy && docker compose down && docker compose up -d
# 回滚 .env(删掉 HERMES_DASHBOARD_BASIC_AUTH_* 三行)
docker exec -it hermes nano /opt/data/.env
docker restart hermes
# 回滚 nginx
sudo cp /etc/nginx/sites-available/hermes.bak /etc/nginx/sites-available/hermes
sudo nginx -t && sudo systemctl reload nginxStep 9:安装 Hermes Desktop App(可选)
v0.16.0 新增原生桌面客户端,可远程连接服务器上的 Dashboard。在你的本地电脑上操作:
下载安装:
# macOS / Linux:已有 Hermes CLI 的用户
hermes desktop
# 或者从官网下载安装包
# https://hermes-agent.nousresearch.com/desktop
# macOS: .dmg | Windows: .exe | Linux: .AppImage / .deb连接远程服务器:
- 打开 Desktop App → Settings → Gateway → Remote gateway
- Remote URL 填
http://你的服务器IP:9119 - 输入 Step 6 设置的用户名和密码
- 点 Sign in → 连接成功后可远程管理 Hermes
安全提示:Dashboard 通过 nginx 反向代理暴露在公网上,务必使用强密码。如需更高安全性,可用 Tailscale VPN 替代公网暴露。
5.4.1 版本更新亮点
| 版本 | 关键改进 |
|---|---|
| v0.15.0 |
• run_agent.py 从 16,083 行重构为 3,821 行(-76%),拆成 14 个模块• session_search 重写:不再调 LLM,4,500× 快(~90s → ~20ms)• 冷启动再优化:每轮函数调用减少 47%, hermes --version 冷启动 701ms → 258ms• Kanban 多 Agent 平台:104 PRs,支持自动分解、Swarm 拓扑、per-task 模型覆盖 • Bitwarden Secrets Manager:一个 bootstrap token 替代所有 API key • Promptware 防御:防 Brainworm 级 prompt 注入攻击 • ntfy 推送通知(第 23 个消息平台) • Skill Bundles: /name 一次加载多个技能• Nous MCP 目录 + 交互式 picker • xAI 深度集成:Web Search 插件、OAuth、自然 TTS 语音标签 |
| v0.15.1 |
• Dashboard 401 无限重载循环修复(hotfix 头条) • Docker --insecure 改为显式 HERMES_DASHBOARD_INSECURE=1 环境变量• MCP 裸命令(npx/npm/node)Docker 内路径解析修复 • Kanban worker SIGTERM 修复 • skills.sh 完整目录:858 → 19,932 条目 • .md 文件恢复发送、URL 查询参数不再被误过滤
|
| v0.16.0 |
• Hermes Desktop App:原生桌面客户端(macOS/Linux/Windows),支持远程连接服务器 Dashboard • Dashboard 从独立容器合并到主容器(s6 监督),加用户名/密码认证 • 安装:hermes-agent.nousresearch.com/desktop 下载,或已有 CLI 的用户运行 hermes desktop• 连接远程服务器:Desktop App → Settings → Gateway → Remote gateway → 输入 http://服务器IP:9119 + 用户名密码
|
5.5 数据目录结构
所有用户数据持久化在宿主机 ~/.hermes/(挂载到容器的 /opt/data):
~/.hermes/
├── config.yaml # 主配置(model、terminal、工具等)
├── .env # API keys(不要提交到 git!)
├── auth.json # OAuth tokens
├── SOUL.md # Agent 人格定义
├── memories/ # 持久记忆(MEMORY.md, USER.md)
├── memory_store.db # Holographic 本地 SQLite 记忆库
├── skills/ # Agent 创建的 skills
├── cron/ # 定时任务
├── sessions/ # 会话记录(SQLite + JSON)
└── logs/ # 日志(自动脱敏)备份推荐用docker exec hermes hermes backup(SQLite 一致性快照)。手动tar打包~/.hermes/也可以,但需先停止容器避免数据库损坏。详见 §22。
5.6 快速替代:单容器 docker run
如果你不需要 Dashboard,也不想维护 compose 文件,一行命令也能跑:
# 交互式 setup(首次)
docker run -it --rm \
-v ~/.hermes:/opt/data \
nousresearch/hermes-agent setup
# 后台常驻
docker run -d \
--name hermes \
--restart unless-stopped \
-v ~/.hermes:/opt/data \
-p 8642:8642 \
nousresearch/hermes-agent gateway run
# 日常操作
docker logs -f hermes # 查看日志
docker exec -it hermes hermes chat # 进入聊天
docker restart hermes # 重启
docker stop hermes && docker rm hermes # 停止并删除缺点:没有 Dashboard、没有资源限制、升级需要手动 rm + run。适合快速验证,长期使用建议 Compose。
5.7 非 Docker 安装(备选)
点击展开:脚本安装 / 源码安装
方式一:官方安装脚本
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
# 安装完成后
source ~/.bashrc
hermes --version # 验证
hermes doctor # 检查依赖安装器自动处理:Python 3.11(通过 uv)、Node.js v22、ripgrep、ffmpeg、虚拟环境、全局 hermes 命令。
方式二:Git 源码安装(开发者)
git clone https://github.com/NousResearch/hermes-agent.git ~/.hermes/hermes-agent
cd ~/.hermes/hermes-agent
./setup-hermes.sh # 自动安装 uv、venv、依赖、symlink
./hermes # 启动安装位置对照
| 安装方式 | 代码位置 | hermes 命令 | 数据目录 |
|---|---|---|---|
| 脚本安装(普通用户) | ~/.hermes/hermes-agent/ | ~/.local/bin/hermes | ~/.hermes/ |
| 脚本安装(root) | /usr/local/lib/hermes-agent/ | /usr/local/bin/hermes | /root/.hermes/ |
| Git 安装 | ~/.hermes/hermes-agent/ | 源码目录内 | ~/.hermes/ |
| Docker(推荐) | 容器内(无状态) | 容器内 | ~/.hermes/(挂载) |
6. 配置 LLM Provider(切换 API)
CRITICALHermes 支持 15+ LLM 提供商,随时可切换,无需改代码。Docker 用户在 setup 向导中已配置过,这里介绍手动修改和高级配置。
交互式配置
# Docker 用户(推荐先进容器)
docker exec -it hermes bash
hermes model # 交互式选择模型
hermes setup # 重新运行 setup 向导
exit
# 非 Docker 用户
hermes model
hermes setupLLM Provider 选择
| Provider | 环境变量 | 价格(per 1M tokens) | 推荐度 |
|---|---|---|---|
| DeepSeek V4-Flash | DEEPSEEK_API_KEY | $0.14 / $0.28 | ⭐⭐⭐⭐⭐ 最便宜,日常首选 |
| DeepSeek V4-Pro | DEEPSEEK_API_KEY | $0.435 / $0.87(促销至 5/31) | ⭐⭐⭐⭐⭐ 1.6T 参数,质量接近 Claude |
| OpenRouter | OPENROUTER_API_KEY | 按模型定价 | ⭐⭐⭐⭐⭐ 200+ 模型一个 key |
| Anthropic | ANTHROPIC_API_KEY | $3 / $15 | ⭐⭐⭐⭐⭐ Claude 质量最高 |
| OpenAI | OPENAI_API_KEY | $2.50 / $15 | ⭐⭐⭐⭐ |
GOOGLE_API_KEY | $0.50 / $3 | ⭐⭐⭐ Gemini 系列 | |
| Alibaba Cloud | DASHSCOPE_API_KEY | 按模型定价 | ⭐⭐⭐ Qwen 系列,国内快 |
| Kimi / Moonshot | KIMI_API_KEY | $0.74 / $3.49 | ⭐⭐⭐ 中文优化 |
| Nous Portal | OAuth | 按模型定价 | ⭐⭐⭐⭐ 可选升级,自带 Tool Gateway |
| 自定义 endpoint | — | 自定义 | ⭐⭐⭐ 任何 OpenAI 兼容 API |
推荐起步:先配一个 DeepSeek key。默认用deepseek-v4-pro($0.435/$0.87 促销价,1.6T 参数,质量接近 Claude)。需要省钱时切换到deepseek-v4-flash($0.14/$0.28)。所有 key 一次配好,用/model随时切换。⚠️ 旧版deepseek-chat将于 2026-07-24 退役,请迁移到 V4 模型。
工具 API Key 一览
Hermes 内置 68+ 工具,大部分不需要额外 API key。只有以下 4 类工具需要单独注册:
| 工具类型 | 功能 | 后端 | 免费方案 | 需要的 key |
|---|---|---|---|---|
| Web 搜索 | 搜索网页、抓取内容 | Brave / Firecrawl / Exa / Tavily | Brave:2000 次/月免费 | BRAVE_API_KEY |
| 图像生成 | AI 生成图片 | 只能用 FAL(不支持 OpenRouter) | 新用户赠 $5 | FAL_KEY |
| 语音合成(TTS) | 文字转语音 | OpenAI TTS / ElevenLabs | 无 | VOICE_TOOLS_OPENAI_KEY |
| 浏览器自动化 | 网页交互、表单填写 | 见下方详解 | 有免费方案(本地浏览器) | 见下方详解 |
工具 API Key 详细说明(浏览器 / 图像 / TTS)
浏览器自动化详解(有免费方案)
Hermes 支持 6 种浏览器后端,其中 3 种完全免费:
| 后端 | 类型 | 费用 | 需要的 key / 配置 | 特点 |
|---|---|---|---|---|
| agent-browser CLI | 本地 | 免费 | npm install -g agent-browser | 本地 Chromium,无需 API key |
| Camofox | 本地 | 免费 | Docker 部署 + CAMOFOX_URL | 反检测 Firefox,可保持登录 |
| Local Chrome CDP | 本地 | 免费 | /browser connect | 连接你自己的 Chrome,实时观看 |
| Browser Use | 云 | $0.10/session | BROWSER_USE_API_KEY | 云浏览器,无需本地资源 |
| Browserbase | 云 | 按 plan | BROWSERBASE_API_KEY | 反检测、代理、CAPTCHA 解决 |
| Firecrawl | 云 | 按 plan | FIRECRAWL_API_KEY | 搜索+浏览器一体 |
免费方案怎么选?
| 场景 | 推荐方案 | 说明 |
|---|---|---|
| 偶尔用一下 | agent-browser CLI | 一行命令安装,无需 API key,最简单 |
| 需要保持登录状态 | Camofox | Docker 部署,支持持久化 cookie/session |
| 想实时看 agent 操作 | Local Chrome CDP | 连接你自己的 Chrome,/browser connect |
| 需要反检测/绕过封锁 | Browserbase(付费) | 住宅代理、指纹随机化、CAPTCHA 解决 |
快速启用免费浏览器
# 方式 1:agent-browser CLI(最简单)
npm install -g agent-browser
# 不需要任何 API key,直接可用
# 方式 2:Camofox(反检测,Docker 部署)
docker run -d -p 127.0.0.1:9377:9377 -e CAMOFOX_PORT=9377 jo-inc/camofox-browser
# 然后设置
hermes config set CAMOFOX_URL "http://localhost:9377"
# 方式 3:连接你自己的 Chrome
# 在 Hermes CLI 中执行
/browser connect大多数人不需要付费浏览器。agent-browser CLI 安装后直接可用,无需 API key。只有需要反检测、绕过封锁、或不想占用服务器资源时才需要付费云浏览器。图像生成才是真正需要 FAL key 的工具。
图像生成详解(只能用 FAL)
Hermes 的图像生成硬编码使用 FAL.ai,不支持 OpenRouter 或其他图像模型。9 个模型可选,用 hermes tools 切换:
| 模型 | 速度 | 特点 | 价格 |
|---|---|---|---|
flux-2/klein/9b(默认) | <1s | 快速,文字清晰 | $0.006/MP |
z-image/turbo | ~2s | 中英双语 | $0.005/MP |
flux-2-pro | ~6s | 写实摄影 | $0.03/MP |
gpt-image-1.5 | ~15s | 提示词遵循好 | $0.034/张 |
gpt-image-2 | ~20s | 文字渲染最强(支持中文) | $0.04-0.06/张 |
ideogram/v3 | ~5s | 最佳排版 | $0.03-0.09/张 |
qwen-image | ~12s | 复杂文字 | $0.02/MP |
nano-banana-pro | ~8s | Gemini 3 Pro 推理 | $0.15/张 |
recraft/v4/pro | ~8s | 设计/品牌 | $0.25/张 |
FAL 新用户赠 $5,默认模型 flux-2/klein 只要 $0.006/MP,够用很久。不需要一开始就注册,等真正需要出图时再注册即可。用 hermes tools → Image Generation 切换模型。
哪些工具需要我注册?
| 你的使用场景 | 需要做的 | 费用 |
|---|---|---|
| 日常聊天 + 跑命令(大多数人) | 不需要额外 key | $0 |
| 需要搜索网页 | 注册 Brave Search(免费) | $0(2000 次/月) |
| 需要浏览器自动化 | npm install -g agent-browser | $0(本地免费) |
| 需要生成图片 | 注册 FAL(只能用 FAL) | 新用户赠 $5,之后按量 |
| 需要语音输出 | 注册 OpenAI TTS | $15/1M chars |
| 需要反检测浏览器 | 注册 Browserbase 或部署 Camofox | 按 plan / 免费自部署 |
大多数人只需要 LLM key + Brave Search key。文件操作、代码执行、MCP 调用等核心工具都不需要额外 key。图像/TTS/浏览器按需添加。
注册链接
| 工具 | 注册/安装地址 | 免费额度 |
|---|---|---|
| Brave Search | brave.com/search/api | 2000 次/月 |
| FAL(图像,只能用这个) | fal.ai | 新用户赠 $5 |
| agent-browser(浏览器,免费) | npm install -g agent-browser | 完全免费,本地运行 |
| Camofox(反检测浏览器) | github.com/jo-inc/camofox-browser | 免费,Docker 自部署 |
| OpenAI TTS | platform.openai.com | 按量 |
| Browser Use(云,可选) | browser-use.com | $0.10/session |
手动配置(多平台一次性配好)
以下命令省略了docker exec -it hermes前缀。Docker 部署时需加上,或先docker exec -it hermes bash进入容器再执行。
# 把你有的 key 全部添加(写入 ~/.hermes/.env,不用每次切换时重新设置)
hermes config set OPENROUTER_API_KEY "sk-or-v1-xxx"
hermes config set ANTHROPIC_API_KEY "sk-ant-xxx"
hermes config set OPENAI_API_KEY "sk-xxx"
hermes config set DEEPSEEK_API_KEY "sk-xxx"
# 设置默认模型(写入 ~/.hermes/config.yaml)
hermes config set model openrouter/anthropic/claude-sonnet-4
# 验证当前配置
hermes confighermes config set KEY VALUE只是编辑.env的便捷方式,效果和直接nano ~/.hermes/.env手动写入完全一样。详见下方 13. 安全配置 → 配置文件说明。
重要:64K 上下文要求
Hermes 要求模型至少有 64,000 tokens 的上下文窗口。大多数云端模型都满足。本地模型需设置 --ctx-size 65536。
高级配置(Fallback / Auxiliary / Nous Portal)
Provider Fallback(可选)
# ~/.hermes/config.yaml
model: anthropic/claude-sonnet-4
# 可选:配置 fallback
providers:
fallback:
- openrouter/anthropic/claude-sonnet-4
- openai/gpt-4oAuxiliary Models(成本优化)
Hermes 用 "auxiliary" 模型处理图片分析、网页摘要、会话标题生成、上下文压缩等辅助任务。默认全部走主模型。如果你用昂贵的推理模型(如 Opus),可以给辅助任务配一个便宜模型:
# ~/.hermes/config.yaml
auxiliary:
compress:
provider: openrouter
model: openai/gpt-4o-mini # 便宜快速
vision:
provider: openrouter
model: google/gemini-2.0-flashNous Portal 订阅方案(可选升级)
以上方案(DeepSeek + Brave)已经覆盖大部分需求。如果你需要更多工具能力,可以升级 Nous Portal:
| 方案 | 月费 | 月度额度 | 奖励 | 额度滚存 | 推荐场景 |
|---|---|---|---|---|---|
| Free | $0 | $0.10 | — | — | 试用 |
| Plus | $20 | $22 | 10% | $10 | 个人日常使用(推荐) |
| Super | $100 | $110 | 10% | $50 | 重度使用 / 多 Agent |
| Ultra | $200 | $220 | 10% | $100 | 团队 / 商业用途 |
推荐模型价格
| 模型 | 输入 / 输出(per 1M tokens) | 特点 |
|---|---|---|
| minimax/minimax-m2.7 | $0.30 / $1.20 | 最便宜 |
| xiaomi/mimo-v2.5 | $0.40 / $2.00 | 性价比高 |
| Google Gemini 3 Flash | $0.50 / $3.00 | 速度快 |
| moonshotai/kimi-k2.6 | $0.74 / $3.49 | 中文优化 |
| OpenAI GPT-5.4-mini | $0.75 / $4.50 | 通用能力强 |
| xiaomi/mimo-v2.5-pro | $1.00 / $3.00 | mimo 升级版 |
| z-ai/glm-5.1 | $1.05 / $3.50 | 中文强 |
| Anthropic Claude Sonnet 4.6 | $3.00 / $15.00 | 质量高 |
| OpenAI GPT-5.4 | $2.50 / $15.00 | 旗舰 |
| Anthropic Claude Opus 4.7 | $5.00 / $25.00 | 最强推理 |
Tool Gateway(付费订阅专属)
付费用户自动获得 Tool Gateway,不需要单独申请以下 API key:
| 工具 | 功能 | 单独申请需要的 key |
|---|---|---|
| Web 搜索 | Firecrawl 搜索 + 网页抓取 | FIRECRAWL_API_KEY / EXA_API_KEY |
| 图像生成 | 代理 FAL(9 个模型,底层仍是 FAL) | FAL_KEY |
| 语音合成 | OpenAI TTS | VOICE_TOOLS_OPENAI_KEY |
| 浏览器自动化 | Browser Use 云浏览器 | BROWSER_USE_API_KEY |
Tool Gateway 是 Nous Portal 最大的附加价值。单是 Browser Use 的 API key 就要 $0.10/session,Firecrawl 也要单独付费。Plus $20/月全部包含,对个人用户来说非常划算。
Hermes 4 作为 Auxiliary Model
Nous 自家的 Hermes 4 模型不推荐做主模型(官方明确说 "not recommended for use in Hermes Agent"),但价格极低,非常适合做辅助任务:
| 模型 | 输入 / 输出(per 1M tokens) | 对比 |
|---|---|---|
| Hermes-4-70B | $0.05 / $0.20 | 比 GPT-4o-mini 便宜 15 倍 |
| Hermes-4-405B | $0.09 / $0.37 | 比 GPT-4o-mini 便宜 8 倍 |
| GPT-4o-mini(对比) | $0.75 / $4.50 | — |
# ~/.hermes/config.yaml — 用 Hermes-4-70B 做辅助任务
auxiliary:
compress:
provider: nous
model: hermes-4-70b # 上下文压缩,$0.05/$0.20
title:
provider: nous
model: hermes-4-70b # 会话标题生成
vision:
provider: openrouter
model: google/gemini-2.0-flash # 图片分析用 Gemini(Hermes 4 不支持视觉)推荐方案对比
| 方案 | LLM | 搜索 | 其他工具 | 月费 | 适合 |
|---|---|---|---|---|---|
| 轻量(推荐起步) | DeepSeek | Brave 免费 | 暂不需要 | ~$27 | 日常聊天 + 跑命令 |
| 标准 | OpenRouter/Anthropic | Brave 免费 | FAL 按量 | ~$30-45 | 需要多模型 + 出图 |
| 全包 | OpenRouter | Nous Gateway | Nous Gateway | ~$49-59 | 重度使用,需要浏览器自动化 |
轻量方案配置示例
# ~/.hermes/config.yaml — 推荐起步配置
# 主模型:DeepSeek V4-Pro($0.435/$0.87 促销价,1.6T 参数)
model: deepseek/deepseek-v4-pro
# 辅助模型:用 V4-Flash 省钱($0.14/$0.28)
auxiliary:
compress:
provider: deepseek
model: deepseek-v4-flash
vision:
provider: openrouter
model: google/gemini-2.0-flash # DeepSeek 不支持视觉,用 Gemini
# 需要省钱时,切换到 V4-Flash
# /model deepseek/deepseek-v4-flashNous Portal 升级配置(可选)
# 当你需要更多工具能力时,加 Nous Portal
# 主模型仍走 OpenRouter,工具走 Nous Gateway
model: openrouter/anthropic/claude-sonnet-4
auxiliary:
compress:
provider: nous
model: hermes-4-70b # $0.05/$0.20,几乎免费
title:
provider: nous
model: hermes-4-70b
vision:
provider: openrouter
model: google/gemini-2.0-flash
# 工具走 Nous Gateway(需先 hermes model → 选择 Nous Portal)
tools:
web:
use_gateway: true
image:
use_gateway: true
tts:
use_gateway: true
browser:
use_gateway: true7. 更新与配置版本管理
MEDIUM更新 Hermes
根据你的安装方式,选择对应的更新命令:
| 安装方式 | 更新命令 | 说明 |
|---|---|---|
| Docker(推荐) | docker compose pull && docker compose up -d | 拉新镜像 → 重建容器,数据不丢,30秒完成 |
| 脚本安装 | hermes update | 自动拉取最新代码并更新依赖 |
| Git 源码 | cd ~/.hermes/hermes-agent && git pull && ./setup-hermes.sh | 手动拉取 + 重装依赖 |
Docker 用户只需记住 docker compose pull && up -d。容器本身无状态,升级不会丢失任何配置、记忆或会话数据。
版本管理你的配置
推荐通过 Hermes Agent + GitHub MCP 备份配置,无需在 VPS 上手动操作 Git。详见 Part 2 §26。
Agent 可以直接帮你把 config.yaml、SOUL.md、docker-compose.yaml 等推到 GitHub 私有仓库,需要回滚或迁移时从 GitHub 拉回即可。
快速备份:在微信里对 Agent 说「把当前配置备份到 GitHub」,Agent 会自动完成。
官方备份工具
| 方式 | 命令 | 说明 |
|---|---|---|
| 完整备份 | docker exec hermes hermes backup | SQLite 一致性快照,输出 zip 文件 |
| 快速备份 | docker exec hermes hermes backup --quick | 只备份 config.yaml、state.db、.env、auth 等关键文件 |
| 恢复备份 | docker exec hermes hermes import backup.zip | 从 zip 文件恢复 |
| 会话内快照 | /snapshot create [标签] | 聊天中快速保存/恢复配置状态 |
hermes backup使用 SQLite 的backup()API,即使 Hermes 正在运行也能安全备份。tar直接打包可能在 WAL 模式下拿到不一致的数据库。
8. 消息网关
CRITICALHermes Gateway 让你通过消息平台与 Agent 对话,一个 Gateway 同时支持多平台。
微信(WeChat)— 主要平台
Hermes 原生支持微信,使用腾讯 iLink Bot API,不需要桥接。支持文字、图片、视频、文件、语音消息,自动加密 CDN 传输。
iLink Bot 限制:QR 登录连接的是 iLink Bot 身份(如 a5ace6fd482e@im.bot),不是普通个人微信号。私聊(DM)可靠,群聊取决于 iLink 是否推送群事件(大多数情况下不推送)。详见 官方文档。
步骤 1:安装依赖
# 安装微信适配器依赖
pip install aiohttp cryptography
# 可选:终端 QR 码显示
pip install hermes-agent[messaging]步骤 2:QR 码登录
# 运行设置向导,选择 Weixin
hermes gateway setup
# 向导会:
# 1. 从 iLink Bot API 获取 QR 码
# 2. 在终端显示 QR 码(或提供 URL)
# 3. 等你用微信扫码
# 4. 手机确认登录
# 5. 自动保存凭证到 ~/.hermes/weixin/accounts/
# 成功后显示:微信连接成功,account_id=your-account-id步骤 3:配置环境变量
# ~/.hermes/.env
WEIXIN_ACCOUNT_ID=your-account-id # 必填(QR 登录后自动保存)
# WEIXIN_TOKEN=your-bot-token # 可选(通常自动保存)
# 访问控制
WEIXIN_DM_POLICY=open # open / allowlist / disabled
# WEIXIN_ALLOWED_USERS=user_id_1,user_id_2 # allowlist 模式下指定用户
# 群聊(默认禁用,iLink Bot 通常不推送群事件)
# WEIXIN_GROUP_POLICY=disabled # open / allowlist / disabled
# WEIXIN_GROUP_ALLOWED_USERS=group_id_1,group_id_2
# Home Channel(Cron 任务推送目标)
# WEIXIN_HOME_CHANNEL=chat_id
# WEIXIN_HOME_CHANNEL_NAME=Home步骤 4:启动
hermes gateway # 启动网关(微信 + 其他已配置的平台)微信功能一览
| 功能 | 说明 |
|---|---|
| 私聊(DM) | 可靠,支持文字/图片/视频/文件/语音 |
| 群聊 | 默认禁用,iLink Bot 通常不推送群事件 |
| Markdown | 原生保留,支持标题/表格/代码块 |
| 媒体 | AES-128-ECB 加密 CDN,自动加解密 |
| 输入状态 | 显示 "正在输入..." 状态 |
| 消息分块 | 4000 字符限制,智能分割 |
| 长轮询 | 无需公网 endpoint / webhook |
微信故障排查
| 问题 | 解决方法 |
|---|---|
aiohttp and cryptography are required | pip install aiohttp cryptography |
WEIXIN_TOKEN is required | 运行 hermes gateway setup 重新扫码 |
WEIXIN_ACCOUNT_ID is required | 在 .env 中设置,或运行 hermes gateway setup |
Session expired (errcode=-14) | 重新运行 hermes gateway setup 扫码 |
| Bot 不回复私聊 | 检查 WEIXIN_DM_POLICY,allowlist 模式需在 WEIXIN_ALLOWED_USERS 中 |
| 群消息无响应 | iLink Bot 通常不推送群事件,这是 iLink 限制,非 Hermes 问题 |
| 媒体上传/下载失败 | 确保 cryptography 已安装,检查网络访问 novac2c.cdn.weixin.qq.com |
| QR 码过期 | QR 码自动刷新 3 次,仍过期则检查网络连接 |
Telegram Bot(最简单,推荐备用)
Telegram 有官方 Bot API,5 分钟即可配好,推荐作为微信的备用通道:
以下hermes config set命令需要在容器内执行:docker exec -it hermes bash进容器后直接运行。
# === 步骤 1: 创建 Telegram Bot ===
# 在 Telegram 中找到 @BotFather
# 发送 /newbot
# 输入 bot 名称(如 "My Hermes Agent")
# 输入 bot username(如 "my_hermes_bot",必须以 _bot 或 Bot 结尾)
# BotFather 会给你一个 token,格式如:123456789:ABCdefGHIjklMNOpqrsTUVwxyz
# === 步骤 2: 获取你的 Telegram User ID ===
# 在 Telegram 中找到 @userinfobot,发送任意消息,它会回复你的 User ID
# === 步骤 3: 配置 Hermes ===
hermes config set TELEGRAM_BOT_TOKEN "你的token"
hermes config set TELEGRAM_ALLOWED_USERS "你的user_id"
# === 步骤 4: 设置 Gateway ===
hermes gateway setup
# === 步骤 5: 启动 ===
# 非 Docker 用户:
hermes gateway install # 安装为 systemd 服务(推荐)
hermes gateway start # 启动服务
# Docker 用户:跳过上面两行,直接用 docker compose:
# cd ~/hermes-deploy && docker compose up -d
hermes gateway status # 检查状态其他平台(Discord / WhatsApp)
Discord Bot
# 1. 去 https://discord.com/developers/applications 创建 Application
# 2. Bot → Reset Token → 复制 token
# 3. OAuth2 → URL Generator → bot scope → Send Messages + Read Messages
# 4. 用生成的 URL 邀请 bot 到你的 server
hermes config set DISCORD_BOT_TOKEN "你的token"
hermes gateway setupWhatsApp(通过 Baileys 桥接)
hermes gateway setup # 选择 WhatsApp,用手机扫码配对多平台同时运行
只需配置多个平台的 token,Gateway 会同时连接所有平台。推荐 微信(主要)+ Telegram(备用) 组合。
Gateway 管理命令
hermes gateway run # 前台运行(调试用)
hermes gateway install # 安装为 systemd 服务
hermes gateway start # 启动服务
hermes gateway stop # 停止服务
hermes gateway restart # 重启
hermes gateway status # 查看状态设置 Home Channel(重要)
在 Telegram 中对 bot 发送/sethome,设定为默认投递频道。微信在.env中设置WEIXIN_HOME_CHANNEL。Cron 任务结果、定时报告都会推送到这里。
9. MCP 集成
MEDIUMMCP(Model Context Protocol) 是 Anthropic 提出的开放协议,让 AI Agent 连接外部工具服务器。可以理解为:Hermes 是大脑,MCP 服务器是手臂——每个 MCP 服务器提供一组特定的工具(如读写 GitHub、搜索网页、操作数据库)。
MCP 是什么
| 概念 | 说明 |
|---|---|
| MCP Server | 一个独立的工具服务进程,提供特定能力(如 GitHub 操作、文件访问、网页搜索) |
| MCP Client | Hermes 本身,连接并调用 MCP Server 提供的工具 |
| 工具(Tool) | MCP Server 暴露的具体操作,如 create_issue、read_file、web_search |
| 通信方式 | stdio(本地进程)或 HTTP(远程服务器) |
常用 MCP 服务器一览
| MCP 服务器 | 功能 | 安装方式 | 典型用途 |
|---|---|---|---|
@modelcontextprotocol/server-filesystem | 安全地读写指定目录的文件 | npx(本地) | 让 Agent 管理项目文件、读取配置 |
@modelcontextprotocol/server-github | GitHub 全功能(Issues、PR、代码搜索、仓库管理) | npx(本地) | 自动创建 Issue、审查 PR、搜索代码 |
@modelcontextprotocol/server-brave-search | Brave 搜索引擎 | npx(本地) | 实时网页搜索,获取最新信息 |
@modelcontextprotocol/server-google-maps | Google Maps API | npx(本地) | 地理编码、路线规划、地点搜索 |
@modelcontextprotocol/server-slack | Slack 消息和频道管理 | npx(本地) | 发送消息、搜索历史、管理频道 |
@modelcontextprotocol/server-memory | 知识图谱记忆系统 | npx(本地) | 结构化记忆存储和检索 |
@modelcontextprotocol/server-puppeteer | 浏览器自动化 | npx(本地) | 网页截图、表单填写、自动化测试 |
@modelcontextprotocol/server-sqlite | SQLite 数据库操作 | npx(本地) | 查询和管理本地数据库 |
@modelcontextprotocol/server-postgres | PostgreSQL 数据库操作 | npx(本地) | 查询生产数据库 |
mcp-server-mysql | MySQL 数据库操作 | npx(本地) | 查询 MySQL 数据库 |
@anthropic-ai/mcp-server-remote | 连接远程 HTTP MCP 服务器 | npx(本地) | 连接公司内部 API |
firecrawl-mcp | 网页抓取与转换 | npx(本地) | 抓取网页、转 Markdown、提取结构化数据 |
完整 MCP 服务器列表见 github.com/modelcontextprotocol/servers 和 mcp.so(社区目录,可按功能搜索)。
MCP 实战配置示例(5 个常见场景)
以下配置都添加到~/.hermes/config.yaml的mcp_servers段下。在宿主机用nano ~/.hermes/config.yaml编辑(UID 对齐后不需要 sudo),改完docker compose restart。
密钥管理:所有 API Key / Token 先写入~/.hermes/.env(如GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx),然后在 config.yaml 中用"${变量名}"引用。不要在 config.yaml 中硬编码密钥。
示例 1:GitHub 集成(管理 Issues 和 PR)
场景:让 Hermes 自动帮你创建 Issue、查看 PR、搜索代码。
# 1. 先在 .env 中添加密钥
echo 'GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxxxxxxxxxxx' >> ~/.hermes/.env
# 2. 添加到 /opt/data/config.yaml 末尾
mcp_servers:
github:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_PERSONAL_ACCESS_TOKEN}"
tools:
include: [list_issues, create_issue, search_code, get_file_contents]
resources: false
prompts: false生成 GitHub PAT:github.com/settings/tokens → Generate new token → 勾选 repo 权限。
配置后可以说:
- "帮我创建一个 Issue,标题是 xxx,描述是 yyy"
- "搜索 repo-name 里包含 TODO 的代码"
- "查看 my-project 的最近 5 个 open issues"
- "把当前配置备份到 GitHub"(自动创建私有仓库推送)
配置备份详见 Part 2 §26。
示例 2:Brave 搜索(实时网页搜索)
# 1. 先在 .env 中添加密钥
echo 'BRAVE_API_KEY=BSAxxxxxxxxxxxxxxxx' >> ~/.hermes/.env
# 2. config.yaml
mcp_servers:
brave-search:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-brave-search"]
env:
BRAVE_API_KEY: "${BRAVE_API_KEY}"获取 API Key:brave.com/search/api → 免费计划每月 2000 次搜索。
示例 3:文件系统访问
mcp_servers:
filesystem:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "/opt/data"]
# 最后一个参数是允许访问的目录,可指定多个Hermes 自带 file 和 terminal 工具,通常不需要额外加 filesystem MCP。仅在需要更精细的文件访问控制时才加。
示例 4:SQLite 数据库
mcp_servers:
sqlite:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-sqlite", "--db-path", "/opt/data/app.db"]示例 5:浏览器自动化(Puppeteer)
mcp_servers:
puppeteer:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-puppeteer"]示例 6:Firecrawl(网页抓取与转换)
场景:让 Agent 抓取网页内容、提取结构化数据、将页面转为 Markdown。
# 1. 先在 .env 中添加密钥
echo 'FIRECRAWL_API_KEY=fc-你的key' >> ~/.hermes/.env
# 2. config.yaml
mcp_servers:
firecrawl:
command: "npx"
args: ["-y", "firecrawl-mcp"]
env:
FIRECRAWL_API_KEY: "${FIRECRAWL_API_KEY}"
timeout: 120获取 API Key:firecrawl.dev → 注册后在 Dashboard 获取。免费计划每月 500 次抓取。
配置后可以说:
- "帮我抓取这个网页的内容"
- "把这个页面转成 Markdown"
- "提取这个产品页面的价格和标题"
远程 HTTP MCP 服务器
如果公司或团队部署了内部 MCP 服务,可以直接通过 HTTP 连接:
# 1. 先在 .env 中添加密钥
echo 'MCP_INTERNAL_TOKEN=your-token' >> ~/.hermes/.env
# 2. config.yaml
mcp_servers:
internal_api:
url: "https://mcp.你的公司.com" # 远程 MCP 服务器地址
headers:
Authorization: "Bearer ${MCP_INTERNAL_TOKEN}"
tools:
include: [query_data, list_items] # 只暴露需要的工具
resources: false工具过滤规则
| 配置 | 行为 | 场景 |
|---|---|---|
include: [a, b] | 只暴露 a 和 b | 敏感系统用白名单 |
exclude: [x] | 暴露除 x 外的所有 | 排除危险操作 |
| 两者同时存在 | include 优先 | — |
对于敏感系统(金融、客户数据),始终使用白名单(include),不要用黑名单。
MCP 工具命名
自动加前缀:mcp_<server>_<tool>,如 mcp_github_create_issue。在 Hermes 聊天中输入 /tools 可以看到所有可用工具。
Docker 部署下配置 MCP
MCP 配置写在 ~/.hermes/config.yaml 的 mcp_servers 段。Docker 部署时在宿主机编辑(容器内没有编辑器):
# 1. 在宿主机编辑配置文件(UID 对齐后可以直接编辑,不需要 sudo)
sudo nano ~/.hermes/config.yaml
# 2. 先在 .env 中添加密钥
# echo 'BRAVE_API_KEY=你的Brave密钥' >> ~/.hermes/.env
#
# 3. 在文件末尾添加 mcp_servers 段(示例:Brave 搜索)
# 注意:必须是有效的 YAML,缩进用空格,不要用 Tab
#
# mcp_servers:
# brave-search:
# command: "npx"
# args: ["-y", "@modelcontextprotocol/server-brave-search"]
# env:
# BRAVE_API_KEY: "${BRAVE_API_KEY}"
# 3. 修复权限(因为用了 nano/root 编辑)+ 重启
# 3. 重启容器
docker compose restart添加多个 MCP 服务器
# 1. 先在 .env 中添加所有密钥
# echo 'BRAVE_API_KEY=你的Brave密钥' >> ~/.hermes/.env
# echo 'GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx' >> ~/.hermes/.env
# 2. 所有服务器都写在同一个 mcp_servers 下
mcp_servers:
brave-search:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-brave-search"]
env:
BRAVE_API_KEY: "${BRAVE_API_KEY}"
github:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_PERSONAL_ACCESS_TOKEN}"
tools:
include: [list_issues, create_issue, search_code]
prompts: false
resources: falseYAML 格式注意:mcp_servers只写一次,所有服务器都在它下面。缩进用2 个空格,不要用 Tab。保存后检查 YAML 语法:python3 -c "import yaml; yaml.safe_load(open('/home/hermes/.hermes/config.yaml'))"
验证 MCP 配置
# 进容器查看已配置的 MCP 服务器
docker exec -it hermes bash
hermes mcp list
hermes mcp test brave-search
exit
# 在微信聊天中发送 /tools 或 /mcp 查看可用工具管理命令
| 命令 | 说明 |
|---|---|
hermes mcp list | 查看已配置的 MCP 服务器 |
hermes mcp test <name> | 测试 MCP 服务器连接 |
hermes mcp remove <name> | 删除 MCP 服务器 |
/reload-mcp | 在聊天中重新加载 MCP 服务器 |
/tools | 列出所有可用工具(包括 MCP 工具) |
/mcp | 查看已连接的 MCP 服务器状态 |
修改 MCP 配置后,重启容器(docker compose restart)或在聊天中输入/reload-mcp生效。
Hermes 自身作为 MCP Server
Hermes 也可以作为 MCP 服务器,让 Claude Code 等工具调用 Hermes 的消息能力:
hermes mcp serveClaude Code 配置示例:
{
"mcpServers": {
"hermes": {
"command": "hermes",
"args": ["mcp", "serve"]
}
}
}10. Skills 系统
MEDIUMSkills 是 Hermes 的程序性记忆。与其他 agent 的静态 skills 不同,Hermes 的 skills 可以:
- 自动生成 — 完成复杂任务后自动提取可复用流程
- 自我改进 — 使用过程中根据结果不断优化
- 手动编写 — 你也可以自己写
内置 ~90 个 Skills
涵盖:代码审查、测试、调试、文档生成、研究分析、系统管理、内容创作。
使用 Skills
# 在聊天中
/skills # 浏览可用 skills
/skills install <name> # 安装
/deploy-staging # 直接调用已安装的 skill让 Agent 创建 Skill
# 完成一个复杂任务后说
"save what you just did as a skill called deploy-staging"Skills Hub
社区贡献:agentskills.io
11. Memory 系统
MEDIUMMemory 让 Agent 跨会话记住高价值信息。对个人自托管场景,建议把 Memory 分成两层理解:
- 内置 Memory:
MEMORY.md和USER.md,有容量上限,适合存放稳定偏好和长期事实 - 外部 Memory Provider:可选增强层,用来补充更细的长期检索能力
Holographic 的auto_extract仅匹配英文正则("I prefer/like/want" 等模式),中文对话无法自动提取事实;sync_turn为空操作,事实提取仅在会话结束时触发。我们改用了 Hindsight local_external(LLM 驱动提取,中文原生支持)。下面 §11b 是部署方案。
核心文件
~/.hermes/memories/
├── MEMORY.md # 项目知识、长期事实、偏好
└── USER.md # 用户画像、工作方式、固定约束Hindsight 是独立 Docker 容器 + 外部 PostgreSQL,数据不在本地文件:
Heroku Postgres (云端) # Hindsight 的记忆库、向量索引、知识图谱
Docker: hindsight 容器 # Hindsight API,连 Heroku PGMemory vs Skills
| Memory | Skills | |
|---|---|---|
| 内容 | 事实(what) | 流程(how) |
| 例子 | "CI 用 GitHub Actions" | "部署 staging 的 5 步流程" |
| 用途 | 跨会话延续上下文 | 复用完成任务的方法 |
| 自动? | 是(LLM 自动提取每条对话) | 是,复杂任务后可自动抽取 |
Memory 是快照。会话中写入的新记忆通常要到下一个会话才会稳定出现在 system prompt 中。
Memory Provider 对比
| 方案 | 自动提取 | 依赖 | 月费 | 中文支持 | 适合谁 |
|---|---|---|---|---|---|
| Hindsight local_external | ✅ LLM (sync_turn) | Docker + Heroku PG | $0.25 | 🏆 完美 | 个人长期用、要真正的自动记忆 |
| Holographic | ⚠️ 英文正则提取 | 无 | $0 | ❌ 中文不可用 | 英文场景可用,中文不推荐 |
| Honcho | ✅ LLM | 3 容器(PG + Redis + API) | $0(自托管) | ✅ | 需要 Dashboard 和多 agent |
| Mem0 | ✅ Cloud | 云 API | $20+ | ✅ | 不差钱 |
Hindsight 方案总览
| 组件 | 选择 | 月费 |
|---|---|---|
| PostgreSQL | Heroku Postgres Essential-0 (1 GB) | $0(GitHub Student Pack) |
| LLM 记忆提取 | DeepSeek deepseek-chat(免费) | $0 |
| 向量 Embedding | OpenRouter BAAI bge-m3(中文优化) | ~$0.001 |
| 重排序 | OpenRouter cohere/rerank-v3.5 | ~$0.001 |
| Hindsight 镜像 | ghcr.io/vectorize-io/hindsight:latest-slim (~512MB) | $0 |
| 总计 | ~$0.002/月 |
和旧的 Holographic($0)比,多了 ~$0.002/月的 embedding+reranker 费用,LLM 走 DeepSeek 内置 provider 免费。真正的自动记忆提取,不用手动调 fact_store。
架构图
Heroku Postgres Essential-0 (Cloud, $0) │ pgvector, 1 GB, 20 connections, SSL ▼ Docker: hindsight (slim, ~512MB) │ Port 127.0.0.1:8888, hermes-net bridge │ LLM → DeepSeek deepseek-chat(免费) │ Embedding → OpenRouter BGE-M3 │ Reranker → OpenRouter cohere/rerank-v3.5 ▼ Hermes Gateway → Hindsight plugin │ auto_recall: true │ auto_retain: true │ memory_mode: hybrid
11b. Hindsight + Heroku Postgres 部署
HIGHHindsight 是目前最强的 Agent Memory 系统(LongMemEval 94.6% 排名第一),支持知识图谱、实体解析、多策略检索。使用 local_external 模式:Docker 跑 Hindsight API,连 Heroku Postgres,Hermes 通过插件调用。
为什么不用旧方案?
| 旧方案 | 问题 |
|---|---|
| Holographic | sync_turn 是空操作(no-op),auto_extract 只匹配英文正则。中文对话零自动提取 |
| Hindsight local_embedded | Docker 内 PostgreSQL initdb 拒绝 root 用户,daemon 无限崩溃重启 |
| Hindsight full image | 需要 ~2GB RAM,4GB 服务器跑不动。Slim 镜像(512MB)完美解决 |
前提条件
- GitHub Student Pack(领取→内含 $13/mo Heroku 赠额)
- Heroku 账号(注册,可用 GitHub 登录)
- OpenRouter API Key(已有)
- 服务器已有 hermes-net 网桥 + Docker Compose
Step 1:创建 Heroku Postgres
方式 A:网页操作(推荐)
- 打开 dashboard.heroku.com → New → Create new app
- App name:
hermes-memory,Region: Singapore 🇸🇬(和 DO 同区,延迟 ~3ms) - 进入 app → Resources 标签 → Add-ons 搜
Heroku Postgres - 选 Plan: Essential-0($5/月 → Student Pack 抵扣 $0)→ Submit Order Form
- 等待 2-5 分钟数据库就绪
- 获取连接串:Settings → Config Vars → Reveal Config Vars → 复制
DATABASE_URL - 启用 pgvector:Heroku Dashboard 里没有能执行 DDL 的地方(Dataclips 是只读的)。用 Heroku CLI:
heroku pg:psql -a hermes-memory -c "CREATE EXTENSION vector;" - 验证:
heroku pg:psql -a hermes-memory -c "SELECT extversion FROM pg_extension WHERE extname='vector';"→ 返回0.8.1
方式 B:CLI 操作(备选)
heroku login
heroku apps:create hermes-memory --region singapore
heroku addons:create heroku-postgresql:essential-0 -a hermes-memory
heroku pg:psql -a hermes-memory -c "CREATE EXTENSION vector;"
heroku config:get DATABASE_URL -a hermes-memory⚠️ 必须记下 DATABASE_URL! 格式:postgres://user:pass@ec2-xxx...com:5432/dbname。之后填进 docker-compose 时末尾加?sslmode=require。
如果 Singapore 不可选(灰掉),退而求其次选 Oregon (US West),延迟 ~160ms 对 Hindsight 异步 retain 几乎无感。
Step 2:添加 Hindsight 到 docker-compose
创建 .env 文件,写入敏感信息(密钥不写进 compose 文件):
cd ~/hermes-deploy
cat >> .env << 'EOF'
# === Hindsight ===
HINDSIGHT_DATABASE_URL=postgresql://user:***@host:5432/db?sslmode=require
OPENROUTER_API_KEY=sk-or-xxx
OPENCODE_GO_API_KEY=sk-xxx
EOFHINDSIGHT_DATABASE_URL就是 Step 1 复制的DATABASE_URL,末尾加?sslmode=require。已有.env直接追加即可。
然后编辑 docker-compose.yaml,在 services: 段末尾添加 Hindsight 服务(所有敏感值用 ${VAR} 从 .env 读取):
nano docker-compose.yaml
# 找到 services: 段,在最后一个服务下方粘贴以下内容 hindsight:
image: ghcr.io/vectorize-io/hindsight:latest-slim
container_name: hindsight
restart: unless-stopped
networks:
- hermes-net
ports:
- "127.0.0.1:8888:8888"
environment:
# === Heroku Postgres ===
- HINDSIGHT_API_DATABASE_URL=${HINDSIGHT_DATABASE_URL}
# === LLM(deepseek 内置 provider,0.6.2 原生支持)===
# 注:0.6.2 不含 opencode-go provider(PR#1652 5/19 合并,镜像 5/14 发布),
# 直接用 deepseek 内置 provider。deepseek-chat 无 thinking 不会烧 token。
# 等 0.6.3 发布后可改回 opencode-go 网关。
- HINDSIGHT_API_LLM_PROVIDER=deepseek
- HINDSIGHT_API_LLM_API_KEY=${OPENCODE_GO_API_KEY}
- HINDSIGHT_API_LLM_MODEL=deepseek-chat
# 备选:OpenRouter(默认 qwen/qwen3.5-9b,有 thinking 会烧 token)
# - HINDSIGHT_API_LLM_PROVIDER=openrouter
# - HINDSIGHT_API_LLM_API_KEY=${OPENROUTER_API_KEY}
# === 向量 Embedding(slim 需显式设 provider)===
- HINDSIGHT_API_EMBEDDINGS_PROVIDER=openrouter
- HINDSIGHT_API_EMBEDDINGS_OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
- HINDSIGHT_API_EMBEDDINGS_OPENROUTER_MODEL=baai/bge-m3
# === 数据库连接池(Heroku Essential 只有 20 连接,默认 100 会打满)===
- HINDSIGHT_API_DB_POOL_MAX_SIZE=10
- HINDSIGHT_API_DB_POOL_MIN_SIZE=2
- HINDSIGHT_API_DB_COMMAND_TIMEOUT=120
# === 重排序(已禁用,slim 默认 fallback 到 RRF passthrough)===
# RRF passthrough:免费,用 semantic+BM25+graph 三路 RRF 融合排序,
# 叠加 recency 时间衰减。2,200 条记忆库完全够用。
# 如需更高精度,取消下面两行注释(cohere/rerank-v3.5 ≈ $0.001/search):
# - HINDSIGHT_API_RERANKER_PROVIDER=openrouter
# - HINDSIGHT_API_RERANKER_OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
command: ["hindsight-api", "--host", "0.0.0.0"]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8888/health"]
interval: 10s
start_period: 60s
deploy:
resources:
limits:
memory: 1g
cpus: "0.5"📌 判断标准:带密码/Token/Key 的 →.env;端口/模型名/Pool 大小等 → 直接写 compose。Docker Compose 会自动加载同目录下的.env文件。
💾 nano 保存方法:Ctrl+O保存 →Enter确认 →Ctrl+X退出。改完后执行docker compose restart重启容器。UID 对齐后不需要修复权限。
配置说明
| 配置 | 值 | 原因 |
|---|---|---|
| 镜像 | latest-slim | Slim 才 512MB,full 要 2GB 跑不动 |
| LLM | deepseek-chat(DeepSeek 内置 provider) | 免费无 thinking,不会烧 token。备选 OpenRouter qwen/qwen3.5-9b |
| Embedding | baai/bge-m3 | C-MTEB 中文最优,$0.01/M |
| Reranker | RRF passthrough(已禁用) | $0,semantic+BM25+graph 三路融合 + recency 排序。需更高精度可启用 cohere/rerank-v3.5(≈$0.001/search) |
| 端口 | 127.0.0.1:8888 | hermes-net 网桥,不暴露公网 |
Step 3:启动 Hindsight
cd ~/hermes-deploy
docker compose up -d hindsight
# 等镜像拉取(首次 ~2-3min,~500MB)
docker logs hindsight --tail 20
# 健康检查
curl http://localhost:8888/health
# Expected: {"status":"ok"}Step 4:配置 Hermes 插件
直接用 Hermes 内置的 memory setup 向导:
docker exec -it hermes hermes memory setup在交互式向导中:
- 选 hindsight → 选 local_external 模式
- 输入 API URL:
http://hindsight:8888 - 确认
auto_recall/auto_retain都为 true - 向导会创建
~/.hermes/hindsight/config.json并自动设memory.provider=hindsight
验证:
docker exec -it hermes hermes memory status
# 应显示 provider: hindsight, mode: local_external如果向导不可用,手动创建 ~/.hermes/hindsight/config.json:
{
"mode": "local_external",
"api_url": "http://hindsight:8888",
"auto_recall": true,
"auto_retain": true,
"retain_every_n_turns": 1,
"recall_budget": "mid",
"memory_mode": "hybrid"
}然后手动切换:
hermes config set memory.provider hindsight
hermes gateway restartStep 5:验证
# 检查插件加载
grep "hindsight" /opt/data/logs/agent.log | tail -5
# 发条测试消息,查数据库
heroku pg:psql -a hermes-memory -c "SELECT COUNT(*) FROM memories;"
# 查看 Hindsight 日志
docker logs hindsight --tail 30备用方案:如果 DeepSeek 直连不可用
如果 DeepSeek API 挂了,切回 OpenRouter:
# 方案:切回 OpenRouter(注意:qwen/qwen3.5-9b 有 thinking,会烧 token)
- HINDSIGHT_API_LLM_PROVIDER=openrouter
- HINDSIGHT_API_LLM_API_KEY=${OPENROUTER_API_KEY}
# 需要 .env 有 OPENROUTER_API_KEY故障排查
| 问题 | 排查 |
|---|---|
healthcheck failed | docker logs hindsight,看是不是 DATABASE_URL 写错或 SSL 不对 |
| 镜像拉不动 | slim ~500MB,从 ghcr.io 拉很快 |
too many clients | Heroku Essential 限制 20 connections,compose 里已设 DB_POOL_MAX_SIZE=10 |
| retain 没生效 | 检查 OpenRouter Key 是否有效,余额是否够($0.25/月绰绰有余) |
| Heroku app 休眠? | Postgres add-on 是独立的,app 休眠不影响数据库 |
pending_operations 堆积不减少 | Worker 死锁:操作卡在 processing 状态。见下方 Reaper 方案 |
进阶:部署 Reaper 防死锁
Hindsight 有已知设计缺陷:worker 崩溃后,它认领的操作永远停在 processing 状态,新 worker 跳过,API 不允许重置。需要定期清理。
在宿主机的 ~/.hermes/scripts/ 目录下执行(与 backup-hermes.sh 等维护脚本同级):
# 创建脚本(~/.hermes/scripts/ 已有其他维护脚本)
cat > ~/.hermes/scripts/hindsight-reaper.sh << 'SCRIPT'
#!/bin/bash
set -euo pipefail
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
log() { echo "$(date '+%Y-%m-%d %H:%M:%S') [reaper] $*" >&2; }
DB_URL=$(docker inspect hindsight --format '{{range .Config.Env}}{{println .}}{{end}}' 2>/dev/null | grep HINDSIGHT_API_DATABASE_URL | cut -d= -f2- || true)
if [ -z "$DB_URL" ]; then log "WARNING: container not found"; exit 0; fi
RESULT=$(docker run --rm postgres:alpine psql "$DB_URL" -t -c "
UPDATE async_operations SET status='pending', worker_id=NULL, claimed_at=NULL
WHERE status='processing' AND bank_id='hermes' AND claimed_at < NOW() - INTERVAL '30 minutes'
RETURNING id;" 2>/dev/null || true)
COUNT=$(echo "$RESULT" | grep -c '[0-9]' || true)
if [ "$COUNT" -gt 0 ]; then
CLEAN_IDS=$(echo "$RESULT" | tr '\n' ',' | sed 's/,$//' | xargs)
log "Reset $COUNT stuck operation(s): [$CLEAN_IDS]"
fi
SCRIPT
chmod +x ~/.hermes/scripts/hindsight-reaper.sh
docker pull postgres:alpine # 预拉镜像
# 加入 crontab(每10分钟)
(crontab -l 2>/dev/null; echo "*/10 * * * * ~/.hermes/scripts/hindsight-reaper.sh >> ~/.hermes/hermes-deploy/reaper.log 2>&1") | crontab -📌 30 分钟阈值是安全值 — 正常 retain 操作 2-5 分钟完成,30 分钟足以排除正常任务。脚本用|| true防止set -euo pipefail下 grep 无匹配导致脚本崩溃。
资源占用
| 组件 | RAM | 说明 |
|---|---|---|
| Hindsight (slim) | ~300-500 MB | 空闲 ~256MB,retain 时 ~512MB |
| Heroku Postgres | 0(云端) | 不在服务器上 |
| Reranker | 0(云端) | 走 OpenRouter,不在服务器上 |
| 服务器剩余 | ~3.2 GB / 4 GB ✅ | 绰绰有余 |
12. SOUL.md 人格定制
HIGHSOUL.md 是 Hermes 的主身份文件,注入到 system prompt 的第一个位置(slot #1)。它定义了 agent 是谁、怎么说话、避免什么。写得好,agent 会变成你想要的样子;写得差,agent 会变成一个烦人的客服机器人。
SOUL.md vs AGENTS.md
| 文件 | 作用 | 范围 | 位置 |
|---|---|---|---|
SOUL.md | 人格、语气、风格、价值观 | 全局适用 | ~/.hermes/SOUL.md |
AGENTS.md | 项目规范、文件路径、技术命令 | 仅限当前项目 | 项目根目录下 |
.hermes.md | 项目上下文补充 | 仅限当前项目 | 项目根目录下 |
好 SOUL.md 的结构
官方推荐的 SOUL.md 结构包含四个部分:
| 部分 | 作用 | 示例 |
|---|---|---|
| Identity(身份) | 一句话定义 agent 是谁 | "You are a pragmatic senior engineer" |
| Style(风格) | 3-5 条具体的语气和行为准则 | "Be direct without being cold" |
| What to avoid(禁止) | 3-5 条明确的反面模式 | "No sycophancy, no hype language" |
| Technical posture(技术立场) | 可选,技术偏好的补充 | "Prefer simple systems over clever systems" |
好 SOUL.md 的公式:身份定义 + 3-5 条风格 + 3-5 条禁止 + 技术立场(可选)。简短、有态度、具体。不要写成公司备忘录。
官方推荐示例
官方文档中的标准 SOUL.md
# Personality
You are a pragmatic senior engineer with strong taste.
You optimize for truth, clarity, and usefulness over politeness theater.
## Style
- Be direct without being cold
- Prefer substance over filler
- Push back when something is a bad idea
- Admit uncertainty plainly
- Keep explanations compact unless depth is useful
## What to avoid
- Sycophancy(讨好、拍马屁)
- Hype language(夸大其词)
- Repeating the user's framing if it's wrong
- Overexplaining obvious things
## Technical posture
- Prefer simple systems over clever systems
- Care about operational reality, not idealized architecture
- Treat edge cases as part of the design, not cleanup
这个 SOUL.md 的特点:有明确的身份(pragmatic senior engineer)、风格具体(direct without being cold)、禁止项可操作(sycophancy, hype language)、技术立场清晰(simple > clever)。
反面教材(大多数人写的)
❌ 客服机器人风格
## Personality
- Be helpful and professional
- Always be polite and courteous
- Respond in a clear and organized manner
- Use proper grammar and formatting
- Be respectful at all times
结果:每句开头都是 "Great question!" 或 "I'd be happy to help!"
❌ 过度规则
## Rules
1. Always check memory before responding
2. Never use markdown headers
3. Always format code with triple backticks
4. Use exactly 2 blank lines between sections
5. ... (40 more rules)
结果:agent 花更多精力遵守格式规则,而非解决问题
实战模板
1. 实用工程师(中文版)
# 人格
你是一个务实的高级工程师,有强烈的审美。
你追求真实、清晰和有用,而非礼貌的表演。
## 风格
- 直接但不冷漠
- 内容优先于废话
- 方案不好就直接反驳
- 不确定就说不确定
- 解释简洁,除非确实需要深入
## 禁止
- 讨好、拍马屁
- 夸大其词
- 用户说错了不要重复他的框架
- 明显的事情不要过度解释
## 技术立场
- 简单系统优于巧妙系统
- 关注运维现实,而非理想化架构
- 边界情况是设计的一部分,不是事后清理
2. 研究伙伴
# 人格
你是一个好奇、诚实的研究伙伴。
## 风格
- 区分推测和证据
- 不确定时明确说不确定
- 当想法空间不清晰时主动提问
- 追求概念深度而非表面完整
- 对新想法开放,但不盲目接受
## 禁止
- 不要假装确定
- 不要给出三个模糊选项代替一个正确答案
- 不要为了显得全面而堆砌无关信息
3. 严格审查者
# 人格
你是一个严格的代码和方案审查者。
## 风格
- 公正但不软化重要批评
- 直接指出薄弱假设
- 正确性优先于和谐
- 明确说明风险和权衡
## 禁止
- 不要用 "it's a good start" 开头然后接一堆问题
- 不要为了礼貌而模糊表达
- 不要对明显错误说 "interesting approach"
4. 中英混合(适合中文用户)
# 人格
你是一个务实的高级工程师。中文回复为主。
## 风格
- 技术术语保留英文(API、Docker、deploy)
- 直接、精准、不废话
- 有观点,不当和事佬
- 代码优先,解释其次
- 错了就说错了,不要找台阶
## 禁止
- 不要用 "好的"、"没问题"、"当然可以" 开头
- 不要用 emoji(除非用户要求)
- 不要重复用户的问题
- 不要把一行能说完的事写成三段
如何调试 SOUL.md
- 读最近 10 条对话,找出 agent 浪费文字的地方
- 找到模式(每次都以 "Great question!" 开头?总是 hedge?回避问题?)
- 把具体问题加到 "禁止" 部分,要写得具体(不是 "be concise",而是 "不要把一行能说完的事写成三段")
- 测试:再问同样的问题,看是否改善
- 迭代:SOUL.md 不是一次写好的,用的过程中不断调整
编辑方法
# 方式 1:SSH 进服务器用 sudo nano 编辑(推荐)
sudo nano ~/.hermes/SOUL.md
# UID 对齐后不需要修复权限
# 方式 2:Termius SFTP 拖拽编辑
# UID 对齐后 SFTP 直接可读写
# 先在 SSH 终端执行一次权限放行:
sudo chmod -R o+rX ~/.hermes/
# 然后在 SFTP 面板找到 ~/.hermes/SOUL.md,双击编辑
# 注意:每次执行 sudo chown 后需重新 chmod
# 编辑后不需要重启,开始新会话即可生效
# 或在聊天中用 /new 开始新会话临时切换人格
/personality teacher # 临时切换为老师人格(需要 ~/.hermes/personalities/teacher.md)
/personality # 切回默认 SOUL.md13. 安全配置
HIGH消息平台白名单 CRITICAL
Hermes 有 terminal 执行权限 — 任何能给你 bot 发消息的人,都能让 agent 在服务器上执行命令。白名单是你最重要的安全措施。
生产环境绝对不要设置GATEWAY_ALLOW_ALL_USERS=true。不设白名单 = 任何人都能操控你的服务器、消耗你的 API 额度。仅在初次调试微信连接时临时使用,验证连通后立即切换为allowlist模式。
什么时候配?
初始化时就配好。在 hermes gateway setup 向导中会提示你设置。如果跳过了,在启动 gateway 之前手动配置:
配置方法
Docker 部署时,以下命令需加前缀docker exec -it hermes,或先docker exec -it hermes bash进入容器。
# === 微信(推荐第一个配,主要平台)===
# DM 策略:open=所有人 / allowlist=仅白名单 / disabled=关闭
hermes config set WEIXIN_DM_POLICY "allowlist"
hermes config set WEIXIN_ALLOWED_USERS "你的微信user_id"
# === Telegram(推荐备用)===
hermes config set TELEGRAM_ALLOWED_USERS "你的telegram_user_id"
# === Discord(如果用的话)===
hermes config set DISCORD_ALLOWED_USERS "你的discord_user_id"
# 配好后再启动 gateway
hermes gateway start从 ALLOW_ALL_USERS 切回 allowlist(重要!)
如果你之前为调试设置了 GATEWAY_ALLOW_ALL_USERS=true,验证微信能用后应立即切回安全模式:
# 1. 获取你的微信 user_id(在微信聊天中发 /whoami)
# 或查看日志:docker compose logs hermes 2>&1 | grep -i "user_id"
# 2. 进容器设置白名单模式
docker exec -it hermes bash
hermes config set WEIXIN_DM_POLICY "allowlist"
hermes config set WEIXIN_ALLOWED_USERS "你的微信user_id"
exit
# 3. 在宿主机删除 ALLOW_ALL + 重启
sed -i '/GATEWAY_ALLOW_ALL_USERS/d' ~/.hermes/.env
cd ~/hermes-deploy && docker compose restart怎么获取 user_id?
| 平台 | 获取方式 |
|---|---|
| 微信 | QR 登录后在 ~/.hermes/weixin/accounts/ 中查看,或在聊天中发 /whoami |
| Telegram | 找 @userinfobot,发任意消息,它会回复你的 User ID(纯数字) |
| Discord | 开启开发者模式 → 右键你的头像 → Copy User ID |
白名单策略详解
| 场景 | 推荐配置 | 说明 |
|---|---|---|
| 个人使用(只有你自己) | allowlist + 你的 ID | 最安全,只有你能操控 agent |
| 团队使用(几个人) | allowlist + 多个 ID(逗号分隔) | 逐个授权,可控 |
| 临时让朋友试用 | 配对模式(pairing) | 朋友 DM bot 获得一次性配对码,你审批 |
| 完全不想被骚扰 | disabled | 关闭该平台 DM,只用其他平台 |
推荐:微信用allowlist(只有你自己),Telegram 也设allowlist。两个平台都配白名单后,即使一个平台的 token 泄露,攻击者也无法操控 agent。
DM 配对(团队场景)
队友 DM bot 时获得一次性配对码,你审批:
hermes pairing approve telegram XKGH5N7P命令审批
Hermes 默认检查危险命令(rm -rf、DROP TABLE、curl | sh)。Docker 部署时建议关闭,因为容器本身就是安全边界。
审批模式(config.yaml)
# 进容器设置
docker exec -it hermes bash
hermes config set approvals.mode off # 关闭审批(Docker 推荐)
exit
cd ~/hermes-deploy && docker compose restart| 模式 | 行为 | 建议 |
|---|---|---|
manual | 每次都问(默认) | 本地部署 |
smart | LLM 自动判断风险,低风险自动批准 | 平衡安全和效率 |
off | 跳过所有审批 | ✅ Docker 部署推荐 |
微信中审批(如果保持 manual 模式)
| 回复 | 含义 | 建议 |
|---|---|---|
/approve | 仅本次 | 安全 |
/approve session | 本会话内同类命令自动批准 | 推荐 |
/approve always | 永久白名单(写入 config.yaml) | 慎用 |
/deny | 拒绝 | 最安全 |
Docker 部署直接设approvals.mode: off,agent 执行命令不再被拦截。如果在微信里被卡住,回复/approve always也能解决。
配置文件说明
Hermes 的配置分两个文件,各司其职:
| 文件 | 存什么 | 编辑方式 | 举例 |
|---|---|---|---|
~/.hermes/.env | API keys、tokens、白名单 ID(敏感信息) | hermes config set KEY VAL或直接 nano .env | OPENROUTER_API_KEY, DEEPSEEK_API_KEY, WEIXIN_ALLOWED_USERS |
~/.hermes/config.yaml | 模型选择、MCP 服务器、工具开关(非敏感配置) | hermes config set KEY VAL或直接 nano config.yaml | model, mcp_servers, SOUL.md |
简单记:带 key/token/secret 的 →.env;其他配置 →config.yaml。hermes config set会自动判断写入哪个文件(API key 类写.env,其他写config.yaml),效果和手动编辑完全一样。两个文件都在~/.hermes/下,Docker 部署时映射到容器/opt/data/。
查看和修改配置
# 进容器操作(推荐,权限自动正确)
docker exec -it hermes bash
# 查看当前配置(脱敏显示)
hermes config show
# 添加/修改 API key(自动写入 .env)
hermes config set OPENROUTER_API_KEY "sk-or-xxx"
hermes config set DEEPSEEK_API_KEY "sk-xxx"
# 编辑 config.yaml(模型、MCP 等)
# 容器内没 nano,用宿主机编辑:
exit
sudo nano ~/.hermes/config.yaml
sudo chown -R hermes:hermes ~/.hermes/
docker compose restart切换模型
| 方式 | 命令 | 场景 |
|---|---|---|
| 聊天中切换 | /model anthropic/claude-sonnet-4 | 对话中直接切 |
| 交互式选择 | hermes model | 列出所有可用模型 |
| CLI 设置 | hermes config set model openrouter/xxx | 脚本/自动化 |
| 切回默认 | /model default | 恢复 config.yaml 中的默认模型 |
.env 文件模板
# ~/.hermes/.env — 按需填入,不需要的注释掉
# === LLM Provider ===
DEEPSEEK_API_KEY=sk-xxx # DeepSeek(推荐,便宜好用)
# OPENROUTER_API_KEY=sk-or-v1-xxx # OpenRouter(200+ 模型)
# ANTHROPIC_API_KEY=sk-ant-xxx # Claude(质量最高)
# OPENAI_API_KEY=sk-xxx # GPT 系列
# === 工具 API ===
BRAVE_API_KEY=BSA_xxx # Brave Search(免费 2000 次/月)
# FAL_KEY=xxx # 图像生成
# === 消息平台 ===
WEIXIN_DM_POLICY=allowlist # open / allowlist / disabled
WEIXIN_ALLOWED_USERS=YOUR_WEIXIN_ID # allowlist 模式必填(用 /whoami 获取)
# TELEGRAM_BOT_TOKEN=YOUR_TELEGRAM_TOKEN # 从 @BotFather 获取
# TELEGRAM_ALLOWED_USERS=YOUR_TELEGRAM_ID
# === API Server(反向代理必须) ===
# API_SERVER_ENABLED=true
# API_SERVER_HOST=0.0.0.0
# API_SERVER_KEY=你的密码14. Cloudflare 域名与反向代理
MEDIUM前置:启用 API Server
Gateway 的 HTTP API Server 默认关闭,反向代理必须先开启。注意:API Server 配置只能写在 .env 文件里,config.yaml 不支持(官方说未来版本会支持)。
sudo nano ~/.hermes/.env在 .env 文件末尾添加:
# === API Server(反向代理必须) ===
API_SERVER_ENABLED=true
API_SERVER_HOST=0.0.0.0 # 允许外部访问(默认只监听 127.0.0.1)
API_SERVER_KEY=YOUR_STRONG_PASSWORD # Bearer token(0.0.0.0 时必须设,换成你自己的强密码)sudo chown -R hermes:hermes ~/.hermes/
cd ~/hermes-deploy && sudo docker compose restart hermes
sleep 10
curl -s http://localhost:8642/health
# 预期输出:{"status":"ok","platform":"hermes-agent"}安全:API_SERVER_HOST=0.0.0.0时必须设API_SERVER_KEY,否则任何人都能操控你的 agent(RCE 风险)。nginx 里会自动带 Bearer token,外部访问需要密码。
Nginx 反向代理
sudo apt install -y nginx创建 /etc/nginx/sites-available/hermes(把 hermes.treetree.tech 换成你的子域名):
sudo tee /etc/nginx/sites-available/hermes << 'EOF'
server {
listen 80;
server_name hermes.treetree.tech; # ← 改成你的子域名
# 全部交给 Dashboard(它内部会转发 API 请求到 Gateway)
location / {
proxy_pass http://127.0.0.1:9119;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF# 启用站点 + 测试 + 重载
sudo ln -s /etc/nginx/sites-available/hermes /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx不要单独路由/api/:Dashboard 内部已经配置了连接 Gateway(通过GATEWAY_HEALTH_URL),它的前端会调用/api/status、/api/dashboard/*等端点。如果 nginx 单独把/api/路由到 Gateway 8642 端口,Dashboard 自己的 API 端点会 404。全部交给 Dashboard 处理即可。
Dashboard 认证:v0.16.0+ 的 Dashboard 默认需要用户名/密码登录。认证信息在.env文件中配置(HERMES_DASHBOARD_BASIC_AUTH_*),详见 §7。
Cloudflare DNS
- Cloudflare DNS → 添加 A 记录:
hermes→ 服务器 IP(子域名hermes.treetree.tech) - 开启 Proxied(橙色云朵)
- SSL/TLS → Flexible(Cloudflare 到服务器走 HTTP,nginx 监听 80 端口即可)
- 可选:Network → 开启 WebSockets
用子域名还是子路径?上面用的是子域名hermes.treetree.tech。如果你想用treetree.tech/hermes,需要改location /hermes/并调整 proxy_pass 路径。子域名更简单,推荐。
15. 自动化任务(Cron)
LOW(先跑起来再加)在 Hermes 聊天中用自然语言创建:
"每天早上 9 点给我发送技术新闻摘要,推送到 Telegram"
"每周一检查 GitHub issues 并汇总"/cron list # 查看所有任务
/cron delete <job-id> # 删除16. 日常运维命令速查
推荐:docker exec -it hermes bash 进容器后直接用 hermes 命令,不用前缀,权限自动正确。详细命令见右侧栏 →
常用操作一句话总结:
- 聊天:
hermes(交互)/hermes -c(恢复会话)/hermes chat -q "问题"(单次查询) - 诊断:
hermes doctor→hermes doctor --fix - 配置:
hermes config set KEY VAL(自动路由到 .env 或 config.yaml) - Gateway:
hermes gateway status(状态)/hermes gateway restart(重启) - Docker:
docker compose ps(状态)/docker compose logs -f(日志)/docker compose restart(重启) - 备份:
docker exec hermes hermes backup(完整)/docker exec hermes hermes backup --quick(快速) - 配置文件:
sudo nano ~/.hermes/config.yaml(MCP/模型)/sudo nano ~/.hermes/.env(API keys/网关)/ 改完sudo chown -R hermes:hermes ~/.hermes/ && sudo docker compose restart - 聊天快捷键:
/model切模型 ·/compress压缩上下文 ·/new新会话 ·/reload热加载 .env
17. 实用 Tips 汇编
提问技巧
| 技巧 | 说明 |
|---|---|
| 具体描述问题 | 不要说 "修一下代码",说 "修 api/handlers.py:47 的 TypeError — parse_body() 返回了 None" |
| 前置上下文 | 把文件路径、错误信息、期望行为放在消息开头,一次说清比三轮追问高效 |
| 用 AGENTS.md 代替重复指令 | "用 tab 缩进"、"测试用 pytest" 这类反复说的话写进项目根目录的 AGENTS.md,自动注入每轮对话 |
| 让 agent 自己探索 | 说 "找到并修复失败的测试" 而不是 "打开 test_foo.py 看第 42 行然后..." |
| 用 /skills 找现成技能 | 输入 /skills 浏览可用技能,复杂流程可能已有现成的 skill |
Hermes CLI 快捷键
| 快捷键 | 功能 | SSH 注意 |
|---|---|---|
Alt+Enter / Ctrl+J | 换行不发送(多行输入) | — |
Ctrl+C | 中断 agent 回复(2 秒内按两次强制退出) | — |
Ctrl+V | 粘贴文本 / 图片(自动检测) | 图片需 VSCode Remote SSH |
Ctrl+G / Ctrl+X Ctrl+E | 用外部编辑器编辑长消息(vim/nano) | SSH 时自动用 vim/nano |
Ctrl+Z | 挂起到后台,fg 恢复 | — |
Tab | 接受自动建议 / / 命令补全 | — |
Ctrl+D | 退出 hermes | — |
\ + 回车 | 反斜杠续行(另一种多行输入方式) | — |
CLI 常用命令
| 命令 | 功能 |
|---|---|
/model | 查看 / 切换当前模型 |
/compress | 压缩上下文(长会话变慢时用) |
/usage | 查看当前 token 用量 |
/title 名称 | 给会话命名,方便 hermes -r 恢复 |
/verbose | 切换工具输出模式:off → new → all → verbose |
/tools | 列出当前可用工具 |
/browser connect | 连接本地 Chrome(浏览器自动化) |
/reload | 热加载 .env(改了 API key 不用重启) |
/reload-mcp | 重新加载 MCP 服务器配置 |
/busy queue|steer|interrupt | 设置 agent 工作时按 Enter 的行为 |
/cron | 管理定时任务(list/add/edit/run/remove) |
/skills | 搜索、安装、管理 skills |
/sethome | 设置当前聊天为 Home Channel(消息平台用) |
/snapshot create|restore|prune | 配置状态快照(保存/恢复/清理) |
/rollback [编号] | 列出或恢复文件系统检查点 |
/save | 保存当前会话 |
/busy 三种模式
| 模式 | 行为 | 适用场景 |
|---|---|---|
interrupt(默认) | 立即中断 agent,处理新消息 | 发现 agent 走偏时重定向 |
queue | 排队,等当前任务完成再处理 | 准备后续消息但不想打断 |
steer | 不中断,把新消息注入当前任务 | "顺便也检查一下测试" 这种追加指令 |
会话管理
| 命令 | 功能 |
|---|---|
hermes -c | 恢复最近一次会话(完整历史) |
hermes -r "名称" | 按名称恢复会话 |
hermes -c my-project | 恢复最近一次名为 my-project 的会话 |
hermes sessions list | 列出所有会话 |
hermes -z "问题" | 一次性查询(纯文本输出,适合脚本/CI) |
hermes chat -q "问题" | 一次性查询(含工具输出) |
会话命名很重要:用/title auth-refactor给会话命名,之后hermes -r "auth-refactor"一秒恢复。未命名的会话堆积后无法区分。
性能与成本
| 技巧 | 说明 |
|---|---|
| 别破坏 Prompt Cache | 保持 system prompt 稳定(不换模型、不改 context),后续消息命中缓存更便宜 |
| 长会话用 /compress | 响应变慢时压缩上下文,保留关键信息同时减少 token |
| 并行委派 | 让 agent 用 delegate_task 并行研究多个主题 |
| 批量用脚本 | "写个 Python 脚本批量重命名文件" 比逐条命令便宜 |
| 选对模型 | 复杂推理用 DeepSeek V4-Pro($0.435/$0.87),简单任务用 V4-Flash($0.14/$0.28),/model 随时切换 |
| 低成本起步 | DeepSeek V4-Pro + Brave Search 免费,月费 ~$27;需要更多工具时再加 Nous Portal |
CLI 启动参数
| 参数 | 功能 | 示例 |
|---|---|---|
-c [名称] | 恢复最近会话 | hermes -c |
-r "名称" | 按名称恢复会话 | hermes -r "my-project" |
-q "问题" | 一次性查询(不进交互模式) | hermes -q "什么是 RAG" |
-z "问题" | 纯文本输出(适合脚本/CI) | hermes -z "版本号" |
-m 模型名 | 临时指定模型 | hermes -m deepseek/deepseek-v4-pro |
--tui | 启动 TUI 模式(现代化界面) | hermes --tui |
--yolo | 跳过所有命令审批(⚠️ 慎用) | hermes --yolo |
--worktree | 隔离 git worktree 运行 | hermes --worktree |
-p profile名 | 指定 profile | hermes -p coder |
脚本集成:hermes -z 是最干净的一次性入口 — 纯文本输入、纯文本输出,无 banner/spinner/工具预览。适合 shell 脚本、CI pipeline、cron 调用。
Context Files 最佳实践
| 技巧 | 说明 |
|---|---|
| 保持简短 | 20K 字符以内,每轮都注入 |
| 用 headers 结构化 | ## 分节 |
| 给具体例子 | 展示偏好代码模式 |
| 写明 "不要做什么" | "never modify migration files directly" |
| 列出关键路径和端口 | agent 执行命令时会用 |
| 跟项目演进更新 | 过时的 context 比没有更糟 |
多 Agent / Profile(重要)
Profile 让你在同一台服务器上运行多个独立的 Agent,每个有独立的人格、配置、记忆和消息平台。适合这些场景:
| 场景 | 说明 |
|---|---|
| 工作 vs 个人 | 一个 Agent 用于工作(严肃风格,连微信),一个用于个人(轻松风格,连 Telegram) |
| 不同职能 | 一个代码助手(coder profile,连 GitHub MCP),一个研究助手(researcher profile,连 Brave Search) |
| 团队共享 | 给不同团队成员创建独立 Agent,各自有独立的 memory 和权限 |
| 测试 vs 生产 | 一个 profile 用来测试新 SOUL.md 和 MCP 配置,稳定后再应用到生产 profile |
Profile 管理命令
# 创建新 profile(从零开始)
hermes profile create coder
# 克隆当前配置到新 profile(推荐,继承现有设置)
hermes profile create researcher --clone
# 完整克隆(配置 + 记忆 + 会话 + skills,适合备份)
hermes profile create backup --clone-all
# 列出所有 profile
hermes profile list
# 切换默认 profile
hermes profile use coder
# 导出 profile 为压缩包(备份/迁移用)
hermes profile export coder
# 从压缩包导入 profile
hermes profile import coder-backup.tar.gz
# 删除 profile
hermes profile delete coder使用 Profile
# profile 名字直接作为命令使用
coder chat # 用 coder profile 聊天
coder gateway start # 用 coder profile 启动 gateway
researcher chat # 用 researcher profile 聊天
# 或者用 hermes 命令指定
hermes --profile coder chat
hermes --profile researcher gateway start每个 Profile 独立的内容
每个 profile 有完全独立的:
config.yaml— 可以用不同 LLM model、不同 terminal backend.env— 可以用不同 API keySOUL.md— 不同人格memories/— 不同记忆sessions/— 不同会话历史skills/— 不同 skills- Gateway — 可以连不同的 Telegram bot(不同 token)
Docker 多 Profile 部署
# docker-compose.yaml
# 注意:每个 profile 需要独立的数据目录,不能共享 ~/.hermes
services:
hermes-coder:
image: nousresearch/hermes-agent:latest
container_name: hermes-coder
restart: unless-stopped
command: --profile coder gateway run
ports:
- "127.0.0.1:8642:8642"
volumes:
- /home/hermes/.hermes-coder:/opt/data
hermes-researcher:
image: nousresearch/hermes-agent:latest
container_name: hermes-researcher
restart: unless-stopped
command: --profile researcher gateway run
ports:
- "127.0.0.1:8643:8642" # 不同端口
volumes:
- /home/hermes/.hermes-researcher:/opt/data18. 故障排查
# 全面诊断
hermes doctor
hermes status --all # 查看所有状态| 问题 | 排查步骤 |
|---|---|
| Agent 不回复 | hermes doctor → 检查 API key → 检查模型上下文 >= 64K |
| MCP 工具不出现 | /reload-mcp → 检查 enabled: false → 检查 filter 配置 |
| Gateway 连不上 | hermes gateway status → 检查端口 → ufw status |
| Docker OOM | 增加 deploy.resources.limits.memory |
| Telegram bot 不响应 | 检查 token → 确认 bot 未被禁用 → 检查 allowed_users |
| hermes: command not found | source ~/.bashrc 或检查 PATH |
| API key not set | hermes config set OPENROUTER_API_KEY your_key |
| agent 执行命令被卡住(审批) | hermes config set approvals.mode off(Docker 推荐)或微信回复 /approve always |
| SOUL.md 改了没效果 | 确认改的是 ~/.hermes/SOUL.md(不是 repo 里的)→ 开新会话 |
| 微信 "Unauthorized user" / 配对不工作 | Docker 权限问题 → 见下方详细排查 |
| config.yaml Permission denied (Errno 13) | Docker 权限问题 → 见下方详细排查 |
容器内 .env 配置不生效(微信/API Server 不工作) | sudo docker compose 时 ~ 解析为 /root → volumes 必须用绝对路径 → 见下方详细排查 |
| nginx 反代后 Dashboard 显示 404 | 不要单独路由 /api/ 到 Gateway → 全部交给 Dashboard 处理 |
| API Server 设置写在 config.yaml 不生效 | API Server 配置只能写在 .env,config.yaml 不支持(官方文档确认) |
Dashboard 报 401 Unauthorized | 检查 .env 中是否正确配置了 HERMES_DASHBOARD_BASIC_AUTH_* 三个变量 |
command_review: deny 不生效 | 正确的配置名是 approvals.mode: off,不是 command_review |
Docker 容器权限问题(微信配对 / config 读写失败)
Hermes 官方镜像内 hermes 用户默认 UID 为 10000,而宿主机 hermes 用户通常是 UID 1000。UID 不匹配时,容器写入 ~/.hermes/ 的文件 owner 为 10000,宿主机用户无法读取,表现为:
- 微信发消息返回 "Unauthorized user"(无法读取白名单配置)
- 日志出现
Permission denied: '/opt/data/config.yaml' - 配对码(pairing code)审批不工作
修复方法
# 修复现有文件权限
sudo chown -R hermes:hermes ~/.hermes/
# 重启容器使更改生效
cd ~/hermes-deploy && docker compose restart为什么权限反复坏?
容器内 hermes 用户 UID = 10000(镜像默认),宿主机 hermes 用户 UID = 1000。容器通过 volume mount 写文件时,文件 owner 映射为容器内的 UID(10000),宿主机上就变成了一个不存在的用户。
正确修复:在 docker-compose.yaml 中设置 HERMES_UID=1000 和 HERMES_GID=1000,让容器 hermes 用户 UID 与宿主机一致。
| 操作 | 文件所有者 | 容器能读? |
|---|---|---|
sudo nano ~/.hermes/.env | root (0) | ❌ 不能 |
echo 'x' | sudo tee ~/.hermes/.env | root (0) | ❌ 不能 |
docker exec -it hermes hermes config set ... | hermes (1000) | ✅ 能 |
nano ~/.hermes/.env | hermes (1000) | ✅ 能 |
推荐做法
先进容器,再操作(最简单,一劳永逸)
# 进入容器(之后所有 hermes 命令直接用,不用前缀,权限自动正确)
docker exec -it hermes bash
# 在容器里操作
hermes config set model "deepseek/deepseek-v4-flash"
hermes config set OPENROUTER_API_KEY "sk-or-..."
hermes config show
nano /opt/data/SOUL.md
exit # 退出容器或者单条命令(不进容器)
docker exec -it hermes hermes config set model "deepseek/deepseek-v4-flash"方法 B:在宿主机用正确 UID 编辑
# UID 对齐后可以直接编辑,不需要 sudo
nano ~/.hermes/.env
nano ~/.hermes/config.yaml
# 或者用 hermes config set(推荐,不需要手动编辑)
docker exec -it hermes hermes config set KEY VALUE方法 C:改了权限就修复(兜底方案)
# 已经用 sudo 改了文件?修复权限
sudo chown -R hermes:hermes ~/.hermes/
cd ~/hermes-deploy && docker compose restart最佳实践:所有~/.hermes/下的操作,先docker exec -it hermes bash进容器再操作。权限自动正确,不用 sudo,不用写全路径。
Docker Compose 路径陷阱(~ 在 sudo 下解析错误)
这是最常见的部署坑之一。症状:
- 容器内
.env配置不生效(微信不工作、API Server 不启动) sudo docker exec hermes cat /opt/data/.env看到的是模板内容,不是你编辑的配置- 宿主机
sudo grep WEIXIN ~/.hermes/.env有输出,但容器内没有
根因
sudo docker compose up -d 执行时,~ 被 shell 解析为 /root(不是 /home/hermes)。所以 ~/.hermes:/opt/data 实际挂载的是 /root/.hermes(空目录或错误目录),而不是你的配置目录。
| 写法 | sudo 下实际路径 | 结果 |
|---|---|---|
~/.hermes:/opt/data | /root/.hermes:/opt/data | ❌ 挂载错误目录 |
/home/hermes/.hermes:/opt/data | /home/hermes/.hermes:/opt/data | ✅ 正确 |
修复
# 编辑 docker-compose.yaml,把所有 volumes 的 ~/.hermes 改成绝对路径
sudo nano ~/hermes-deploy/docker-compose.yaml
# 改成:
# volumes:
# - /home/hermes/.hermes:/opt/data # ← 绝对路径
# 重建容器
cd ~/hermes-deploy && sudo docker compose down && sudo docker compose up -d
# 验证容器内 .env 是否正确
sudo docker exec hermes cat /opt/data/.env | grep "WEIXIN_DM_POLICY"Nginx 反代 Dashboard 404 问题
症状:浏览器打开 https://hermes.treetree.tech 显示 Error: 404: Not Found,但 curl http://localhost:9119 正常。
根因
nginx 配置中单独设置了 location /api/ 路由到 Gateway 8642 端口。但 Dashboard 前端会调用 /api/status、/api/dashboard/plugins 等端点 —— 这些是 Dashboard 自己的 API,不是 Gateway 的。nginx 把 /api/* 全部转发到 Gateway,Dashboard 的 API 端点就 404 了。
修复
去掉 location /api/ 路由,全部交给 Dashboard 处理(它内部已经通过 GATEWAY_HEALTH_URL 连接 Gateway):
sudo nano /etc/nginx/sites-available/hermes
# 只保留一个 location /,去掉 location /api/
server {
listen 80;
server_name hermes.treetree.tech;
location / {
proxy_pass http://127.0.0.1:9119;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo nginx -t && sudo systemctl reload nginx日志位置
~/.hermes/logs/gateway.log # Gateway 日志
~/.hermes/logs/errors.log # 错误日志(自动脱敏)
docker compose logs -f # Docker 日志
hermes logs --follow # 实时日志19. 服务器迁移指南
本文档假设只跑 Hermes Agent。如果你的服务器还跑着 RSS、Home Assistant、Syncthing 等其他服务,参见 基础设施/服务器迁移指南.md(Obsidian vault)获取完整服务清单和迁移步骤。
仅 Hermes 迁移(3 步)
| 数据 | 位置 | 说明 |
|---|---|---|
| 配置文件 | ~/.hermes/config.yaml | LLM provider、网关设置等 |
| 环境变量 | ~/.hermes/.env | API keys(敏感,不要提交 git) |
| SOUL.md | ~/.hermes/SOUL.md | Agent 人格定义 |
| Memory | ~/.hermes/memories/ | 跨会话记忆 |
| Skills | ~/.hermes/skills/ | 自动生成的技能文件 |
| Sessions | ~/.hermes/sessions/ | 对话历史 |
# 1. 旧服务器:用官方工具备份(SQLite 一致性安全)
ssh hermes@OLD_IP
cd ~/hermes-deploy
docker exec hermes hermes backup -o /opt/data/migration-backup.zip
# 2. 传到新服务器
scp hermes@OLD_IP:~/.hermes/migration-backup.zip /tmp/
# 3. 新服务器:恢复 + 启动
ssh hermes@NEW_IP
cp /tmp/migration-backup.zip ~/.hermes/
cd ~/hermes-deploy && docker compose up -d
docker exec hermes hermes import /opt/data/migration-backup.zip --force
docker compose restart hermes备选:rsync 全量同步(适合多服务迁移,不停机)
# 从旧服务器同步整个数据目录(不停机)
sudo rsync -avzP root@OLD-IP:/home/hermes/ /home/hermes/
sudo rsync -avzP root@OLD-IP:/opt/data/ /opt/data/
sudo rsync -avzP root@OLD-IP:/etc/nginx/ /etc/nginx/
sudo chown -R hermes:hermes /home/hermes/
cd ~/hermes-deploy && docker compose up -drsync 拷贝后必须 chown -R hermes:hermes /home/hermes/ 修复权限,否则容器可能读不了文件。
新服务器必须先初始化:创建 hermes 用户(UID=1000)、装 Docker、配 UFW 防火墙(22/80/443/22000)、配 fail2ban。详见 部署指南 §3-4。
权限防坑:compose 文件中 volumes 必须用绝对路径/home/hermes/.hermes(不能用~/.hermes),否则 sudo 下~会解析成/root。确认HERMES_UID=1000已设置,这样容器内外 UID 一致,不需要反复 chown。
迁移后记得:① 更新 DNS 指向新 IP;② 如果用了 Cloudflare Tunnel,在新服务器重装 cloudflared 并关联隧道;③ 旧服务器保留 24-48 小时确认无遗漏。
20. 参考资料
| 资源 | 链接 |
|---|---|
| 官方文档 | hermes-agent.nousresearch.com/docs |
| GitHub | github.com/NousResearch/hermes-agent |
| Discord | discord.gg/NousResearch |
| Skills Hub | agentskills.io |
| LLM 可读索引 | llms.txt (~17KB) |
| 完整文档 | llms-full.txt (~1.8MB) |
| Tips & Best Practices | 官方 Tips |
| SOUL.md Guide | SOUL.md 指南 |
| SOUL.md Anti-Patterns | 社区优化指南 |