Part 1: 部署指南
Part 2: 运维与故障排除

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 服务器选型

推荐配置

提供商配置存储月费(参考)特点
Hetzner2 vCPU / 4 GB40 GB NVMe~€4.50欧洲最便宜,性能好
Vultr2 vCPU / 4 GB80 GB SSD~$24全球机房多,新加坡可用
DigitalOcean2 vCPU / 4 GB80 GB SSD~$24文档好,新加坡可用
RackNerd2 vCPU / 4 GB60 GB SSD~$13便宜,年付更划算
Oracle Cloud4 vCPU / 24 GB200 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 MBPython + SQLite FTS5,API-only 模式
Docker sandbox(工具执行时)+100-300 MB / 容器每次执行沙箱工具时临时启动
Messaging Gateway~50-100 MBTelegram/Discord bot 常驻进程
Dashboard~100-200 MBWeb 管理界面
SQLite 数据库几 MB即使上千条会话也很小

按使用场景选配置

场景配置月费说明
轻度使用:单 Agent + Telegram 偶尔聊1 vCPU / 2 GB / 25 GB~$5-12Hermes 官方最低要求 2 GB,Basic 共享 CPU 够用
推荐起步2 vCPU / 4 GB / 40GB+$4-24共享 CPU 对 API 调用影响很小,80 GB 存储更宽裕
进阶:需要稳定 CPU2 vCPU / 4 GB(专用 CPU)$20-42专用 CPU,适合浏览器自动化等 CPU 密集任务
进阶:多 Agent + MCP + Dashboard2 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 LTSHermes 官方支持,Docker 生态最好
存储25 GB 起步Hermes 数据通常不超过几 GB,Docker 镜像约 2-3 GB
GPU不需要Hermes 不跑模型,只调用远程 API
备份开启(+$2/月)保护 config、memory、sessions

免费额度和学生优惠

很多 VPS 提供商有新用户优惠或免费额度:

提供商优惠说明
Oracle Cloud Always Free永久免费 4C/24GBARM 实例,抢号看运气
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 与服务器连接

CRITICAL

SSH 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 提供商

  1. 复制公钥内容:
# macOS
cat ~/.ssh/hermes_do.pub | pbcopy

# Windows (Git Bash)
cat ~/.ssh/hermes_do.pub | clip.exe

# Linux
cat ~/.ssh/hermes_do.pub
# 手动复制输出
  1. 在 VPS 控制面板 → SSH Keys 设置中添加公钥(大多数提供商都支持)
  2. 粘贴公钥,命名如 hermes-laptop,点击 Add
  3. 创建 VPS 实例时选择这个 SSH Key

3.3 创建 VPS 实例

方式一:控制面板(推荐新手)

  1. 登录你的 VPS 控制面板
  2. 选择 Ubuntu 24.04,地区选离你最近的(亚洲推荐新加坡/东京),配置 2vCPU / 4GB
  3. 选择刚才添加的 SSH Key 进行认证
  4. 点击 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 list

3.4 配置本地 SSH Config(命令行用户)

如果你用 Termius(下一节),可以跳过这步 — Termius 有自己的连接管理界面,不需要编辑 config 文件。

编辑 ~/.ssh/config,之后只需输入 ssh hermes 即可连接:

Host hermes
    HostName <你的服务器IP>
    User root
    IdentityFile ~/.ssh/hermes_do
    ServerAliveInterval 60
    ServerAliveCountMax 3

3.5 首次连接

ssh hermes
# 首次连接会提示 fingerprint,输入 yes
# 成功后看到 root@hermes-agent:~# 即连接成功

3.6 使用 Termius 连接(推荐 GUI 方式)

Termius 是跨平台 SSH 客户端(Windows/Mac/iOS/Android),支持保存连接、SFTP 文件传输、端口转发。

  1. 下载安装 Termius
  2. 新建 Host:HostName = 服务器 IP,User = hermes(或 root)
  3. 在 Keychain 中导入你的 SSH 私钥(~/.ssh/hermes_do)
  4. 关联 Key 到 Host,点击连接即可
Termius 的 SFTP 面板可以直接拖拽文件上传/下载,编辑 SOUL.md、config.yaml 等配置文件很方便,不用记 nano 命令。Pro 版支持端口转发(访问 Dashboard 9119 端口)。
如果你在多台电脑上使用,在每台电脑上都生成 SSH Key,全部添加到 VPS 控制面板的 SSH Keys 列表。这样任何一台电脑都能连接服务器。

4. 服务器初始化

CRITICAL

4.1 系统更新

apt update && apt upgrade -y

4.2 安装基础工具

apt install -y curl git build-essential ufw fail2ban tmux htop
工具用途详细介绍
curl命令行下载工具下载安装脚本、测试 API 接口、检查 URL 是否可达。Hermes 安装脚本需要用它。
git版本控制Hermes 核心依赖。也用于你自己管理 ~/.hermes/ 配置的版本。
build-essentialC/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 verbose

4.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最大失败次数55 次,太低容易误封自己
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 获取 root

4.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-world

4.8 创建目录结构

mkdir -p ~/.hermes
mkdir -p ~/hermes-deploy

5. 部署方式选择: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 一个容器,互不影响需要手动管理多个进程
Dashboardcompose 自带 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

向导会依次引导你:

  1. 选择 LLM Provider(OpenRouter / Anthropic / OpenAI 等)
  2. 输入 API Key
  3. 选择消息平台(Telegram / Discord / 微信 等)并输入 token
  4. 选择 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 seconds

Step 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/datavolume 挂载
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 xxxdocker 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.yaml

Step 2:拉取新镜像

cd ~/hermes-deploy
docker compose pull

Step 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 32

Step 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: true

Step 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 nginx

Step 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

连接远程服务器:

  1. 打开 Desktop App → Settings → Gateway → Remote gateway
  2. Remote URL 填 http://你的服务器IP:9119
  3. 输入 Step 6 设置的用户名和密码
  4. 点 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)

CRITICAL

Hermes 支持 15+ LLM 提供商,随时可切换,无需改代码。Docker 用户在 setup 向导中已配置过,这里介绍手动修改和高级配置。

交互式配置

# Docker 用户(推荐先进容器)
docker exec -it hermes bash
hermes model          # 交互式选择模型
hermes setup          # 重新运行 setup 向导
exit

# 非 Docker 用户
hermes model
hermes setup

LLM Provider 选择

Provider环境变量价格(per 1M tokens)推荐度
DeepSeek V4-FlashDEEPSEEK_API_KEY$0.14 / $0.28⭐⭐⭐⭐⭐ 最便宜,日常首选
DeepSeek V4-ProDEEPSEEK_API_KEY$0.435 / $0.87(促销至 5/31)⭐⭐⭐⭐⭐ 1.6T 参数,质量接近 Claude
OpenRouterOPENROUTER_API_KEY按模型定价⭐⭐⭐⭐⭐ 200+ 模型一个 key
AnthropicANTHROPIC_API_KEY$3 / $15⭐⭐⭐⭐⭐ Claude 质量最高
OpenAIOPENAI_API_KEY$2.50 / $15⭐⭐⭐⭐
GoogleGOOGLE_API_KEY$0.50 / $3⭐⭐⭐ Gemini 系列
Alibaba CloudDASHSCOPE_API_KEY按模型定价⭐⭐⭐ Qwen 系列,国内快
Kimi / MoonshotKIMI_API_KEY$0.74 / $3.49⭐⭐⭐ 中文优化
Nous PortalOAuth按模型定价⭐⭐⭐⭐ 可选升级,自带 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 / TavilyBrave:2000 次/月免费BRAVE_API_KEY
图像生成AI 生成图片只能用 FAL(不支持 OpenRouter)新用户赠 $5FAL_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/sessionBROWSER_USE_API_KEY云浏览器,无需本地资源
Browserbase云按 planBROWSERBASE_API_KEY反检测、代理、CAPTCHA 解决
Firecrawl云按 planFIRECRAWL_API_KEY搜索+浏览器一体

免费方案怎么选?

场景推荐方案说明
偶尔用一下agent-browser CLI一行命令安装,无需 API key,最简单
需要保持登录状态CamofoxDocker 部署,支持持久化 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~8sGemini 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 Searchbrave.com/search/api2000 次/月
FAL(图像,只能用这个)fal.ai新用户赠 $5
agent-browser(浏览器,免费)npm install -g agent-browser完全免费,本地运行
Camofox(反检测浏览器)github.com/jo-inc/camofox-browser免费,Docker 自部署
OpenAI TTSplatform.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 config
hermes 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-4o

Auxiliary Models(成本优化)

Hermes 用 "auxiliary" 模型处理图片分析、网页摘要、会话标题生成、上下文压缩等辅助任务。默认全部走主模型。如果你用昂贵的推理模型(如 Opus),可以给辅助任务配一个便宜模型:

# ~/.hermes/config.yaml
auxiliary:
  compress:
    provider: openrouter
    model: openai/gpt-4o-mini    # 便宜快速
  vision:
    provider: openrouter
    model: google/gemini-2.0-flash

Nous Portal 订阅方案(可选升级)

以上方案(DeepSeek + Brave)已经覆盖大部分需求。如果你需要更多工具能力,可以升级 Nous Portal:

方案月费月度额度奖励额度滚存推荐场景
Free$0$0.10——试用
Plus$20$2210%$10个人日常使用(推荐)
Super$100$11010%$50重度使用 / 多 Agent
Ultra$200$22010%$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.00mimo 升级版
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 TTSVOICE_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搜索其他工具月费适合
轻量(推荐起步)DeepSeekBrave 免费暂不需要~$27日常聊天 + 跑命令
标准OpenRouter/AnthropicBrave 免费FAL 按量~$30-45需要多模型 + 出图
全包OpenRouterNous GatewayNous 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-flash
Nous 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: true

7. 更新与配置版本管理

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 backupSQLite 一致性快照,输出 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. 消息网关

CRITICAL

Hermes 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 requiredpip 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 setup

WhatsApp(通过 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 集成

MEDIUM

MCP(Model Context Protocol) 是 Anthropic 提出的开放协议,让 AI Agent 连接外部工具服务器。可以理解为:Hermes 是大脑,MCP 服务器是手臂——每个 MCP 服务器提供一组特定的工具(如读写 GitHub、搜索网页、操作数据库)。

MCP 是什么

概念说明
MCP Server一个独立的工具服务进程,提供特定能力(如 GitHub 操作、文件访问、网页搜索)
MCP ClientHermes 本身,连接并调用 MCP Server 提供的工具
工具(Tool)MCP Server 暴露的具体操作,如 create_issue、read_file、web_search
通信方式stdio(本地进程)或 HTTP(远程服务器)

常用 MCP 服务器一览

MCP 服务器功能安装方式典型用途
@modelcontextprotocol/server-filesystem安全地读写指定目录的文件npx(本地)让 Agent 管理项目文件、读取配置
@modelcontextprotocol/server-githubGitHub 全功能(Issues、PR、代码搜索、仓库管理)npx(本地)自动创建 Issue、审查 PR、搜索代码
@modelcontextprotocol/server-brave-searchBrave 搜索引擎npx(本地)实时网页搜索,获取最新信息
@modelcontextprotocol/server-google-mapsGoogle Maps APInpx(本地)地理编码、路线规划、地点搜索
@modelcontextprotocol/server-slackSlack 消息和频道管理npx(本地)发送消息、搜索历史、管理频道
@modelcontextprotocol/server-memory知识图谱记忆系统npx(本地)结构化记忆存储和检索
@modelcontextprotocol/server-puppeteer浏览器自动化npx(本地)网页截图、表单填写、自动化测试
@modelcontextprotocol/server-sqliteSQLite 数据库操作npx(本地)查询和管理本地数据库
@modelcontextprotocol/server-postgresPostgreSQL 数据库操作npx(本地)查询生产数据库
mcp-server-mysqlMySQL 数据库操作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: false
YAML 格式注意: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 serve

Claude Code 配置示例:

{
  "mcpServers": {
    "hermes": {
      "command": "hermes",
      "args": ["mcp", "serve"]
    }
  }
}

10. Skills 系统

MEDIUM

Skills 是 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 系统

MEDIUM

Memory 让 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 PG

Memory vs Skills

MemorySkills
内容事实(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✅ LLM3 容器(PG + Redis + API)$0(自托管)✅需要 Dashboard 和多 agent
Mem0✅ Cloud云 API$20+✅不差钱

Hindsight 方案总览

组件选择月费
PostgreSQLHeroku Postgres Essential-0 (1 GB)$0(GitHub Student Pack)
LLM 记忆提取DeepSeek deepseek-chat(免费)$0
向量 EmbeddingOpenRouter 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 部署

HIGH

Hindsight 是目前最强的 Agent Memory 系统(LongMemEval 94.6% 排名第一),支持知识图谱、实体解析、多策略检索。使用 local_external 模式:Docker 跑 Hindsight API,连 Heroku Postgres,Hermes 通过插件调用。

为什么不用旧方案?

旧方案问题
Holographicsync_turn 是空操作(no-op),auto_extract 只匹配英文正则。中文对话零自动提取
Hindsight local_embeddedDocker 内 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:网页操作(推荐)

  1. 打开 dashboard.heroku.com → New → Create new app
  2. App name: hermes-memory,Region: Singapore 🇸🇬(和 DO 同区,延迟 ~3ms)
  3. 进入 app → Resources 标签 → Add-ons 搜 Heroku Postgres
  4. 选 Plan: Essential-0($5/月 → Student Pack 抵扣 $0)→ Submit Order Form
  5. 等待 2-5 分钟数据库就绪
  6. 获取连接串:Settings → Config Vars → Reveal Config Vars → 复制 DATABASE_URL
  7. 启用 pgvector:Heroku Dashboard 里没有能执行 DDL 的地方(Dataclips 是只读的)。用 Heroku CLI:
    heroku pg:psql -a hermes-memory -c "CREATE EXTENSION vector;"
  8. 验证:
    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
EOF
HINDSIGHT_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-slimSlim 才 512MB,full 要 2GB 跑不动
LLMdeepseek-chat(DeepSeek 内置 provider)免费无 thinking,不会烧 token。备选 OpenRouter qwen/qwen3.5-9b
Embeddingbaai/bge-m3C-MTEB 中文最优,$0.01/M
RerankerRRF passthrough(已禁用)$0,semantic+BM25+graph 三路融合 + recency 排序。需更高精度可启用 cohere/rerank-v3.5(≈$0.001/search)
端口127.0.0.1:8888hermes-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

在交互式向导中:

  1. 选 hindsight → 选 local_external 模式
  2. 输入 API URL:http://hindsight:8888
  3. 确认 auto_recall / auto_retain 都为 true
  4. 向导会创建 ~/.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 restart

Step 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 faileddocker logs hindsight,看是不是 DATABASE_URL 写错或 SSL 不对
镜像拉不动slim ~500MB,从 ghcr.io 拉很快
too many clientsHeroku 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 Postgres0(云端)不在服务器上
Reranker0(云端)走 OpenRouter,不在服务器上
服务器剩余~3.2 GB / 4 GB ✅绰绰有余

12. SOUL.md 人格定制

HIGH

SOUL.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

  1. 读最近 10 条对话,找出 agent 浪费文字的地方
  2. 找到模式(每次都以 "Great question!" 开头?总是 hedge?回避问题?)
  3. 把具体问题加到 "禁止" 部分,要写得具体(不是 "be concise",而是 "不要把一行能说完的事写成三段")
  4. 测试:再问同样的问题,看是否改善
  5. 迭代: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.md

13. 安全配置

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每次都问(默认)本地部署
smartLLM 自动判断风险,低风险自动批准平衡安全和效率
off跳过所有审批✅ Docker 部署推荐

微信中审批(如果保持 manual 模式)

回复含义建议
/approve仅本次安全
/approve session本会话内同类命令自动批准推荐
/approve always永久白名单(写入 config.yaml)慎用
/deny拒绝最安全
Docker 部署直接设 approvals.mode: off,agent 执行命令不再被拦截。如果在微信里被卡住,回复 /approve always 也能解决。

配置文件说明

Hermes 的配置分两个文件,各司其职:

文件存什么编辑方式举例
~/.hermes/.envAPI 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

  1. Cloudflare DNS → 添加 A 记录:hermes → 服务器 IP(子域名 hermes.treetree.tech)
  2. 开启 Proxied(橙色云朵)
  3. SSL/TLS → Flexible(Cloudflare 到服务器走 HTTP,nginx 监听 80 端口即可)
  4. 可选: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名指定 profilehermes -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 key
  • SOUL.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/data

18. 故障排查

# 全面诊断
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 foundsource ~/.bashrc 或检查 PATH
API key not sethermes 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/.envroot (0)❌ 不能
echo 'x' | sudo tee ~/.hermes/.envroot (0)❌ 不能
docker exec -it hermes hermes config set ...hermes (1000)✅ 能
nano ~/.hermes/.envhermes (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.yamlLLM provider、网关设置等
环境变量~/.hermes/.envAPI keys(敏感,不要提交 git)
SOUL.md~/.hermes/SOUL.mdAgent 人格定义
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 -d
rsync 拷贝后必须 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 小时确认无遗漏。

Part 2: 运维与故障排除 →

20. 参考资料

资源链接
官方文档hermes-agent.nousresearch.com/docs
GitHubgithub.com/NousResearch/hermes-agent
Discorddiscord.gg/NousResearch
Skills Hubagentskills.io
LLM 可读索引llms.txt (~17KB)
完整文档llms-full.txt (~1.8MB)
Tips & Best Practices官方 Tips
SOUL.md GuideSOUL.md 指南
SOUL.md Anti-Patterns社区优化指南

Part 2: 运维与故障排除

部署完成后的日常维护、备份、更新和常见问题排查。

← 返回 Part 1: 部署指南

21. 日常运维速查

频率操作命令
每天检查容器状态sudo docker compose ps
每天Gateway 健康检查curl -s http://localhost:8642/health
每周更新 Hermescd ~/hermes-deploy && sudo docker compose pull && sudo docker compose up -d
每周清理 Docker 缓存sudo docker system prune -f
每周查看错误日志sudo docker compose logs hermes --tail=50 | grep -i error
每月系统更新sudo apt update && sudo apt upgrade -y

22. 备份与恢复

官方推荐:hermes backup(SQLite 安全)

# 完整备份(包含配置、记忆、会话、skills,SQLite 一致性快照)
docker exec hermes hermes backup

# 快速备份(只备份关键状态文件,更快)
docker exec hermes hermes backup --quick --label "daily"

# 指定输出路径
docker exec hermes hermes backup -o /opt/data/hermes-backup.zip

# 恢复
docker exec hermes hermes import /opt/data/hermes-backup.zip

# 聊天中快速快照
/snapshot create pre-upgrade    # 保存
/snapshot restore 1             # 恢复
自动备份:sudo crontab -e 添加 0 3 * * * docker exec hermes hermes backup --quick -o /opt/data/backup-$(date +\%Y\%m\%d).zip(每天凌晨 3 点)
备选:手动 tar 备份(需先停止服务)
# 备份(必须先停止服务,避免 SQLite WAL 不一致)
cd ~/hermes-deploy && sudo docker compose down
sudo tar czf ~/hermes-backup-$(date +%Y%m%d).tar.gz -C / home/hermes/.hermes/
sudo docker compose up -d

# 恢复
cd ~/hermes-deploy && sudo docker compose down
sudo tar xzf ~/hermes-backup-20260502.tar.gz -C /
sudo chown -R hermes:hermes ~/.hermes/
sudo docker compose up -d
手动 tar 需要先停止容器,否则可能损坏 SQLite 数据库。hermes backup 可以在运行时安全备份,推荐优先使用。

23. 更新与回滚

# 更新前:保存配置快照(可选,聊天中执行)
/snapshot create pre-update

# 更新
cd ~/hermes-deploy && sudo docker compose pull && sudo docker compose up -d

# 验证版本
docker exec hermes hermes --version

# 回滚镜像版本(改 docker-compose.yaml 里的 image 版本号)
sudo docker compose down
# image: nousresearch/hermes-agent:v1.2.3
sudo docker compose up -d

# 回滚配置(聊天中执行)
/snapshot restore 1

24. 常见运维场景

场景解决方法
改了 .env 不生效sudo docker compose restart hermes 或聊天中发 /reload
改了 config.yaml 不生效sudo docker compose restart hermes(必须重启)
改了 SOUL.md 不生效聊天中发 /new(开新会话才加载)
容器不断重启sudo docker compose logs hermes --tail=50 看日志
微信消息不回复sudo docker exec hermes env | grep WEIXIN 检查配置是否注入
磁盘空间不足sudo docker system prune -f 清理缓存

25. 安全要点

  • 防火墙:只开 22/80/443,不要暴露 8642/9119 到公网
  • API Server 密码:API_SERVER_KEY 必须设强密码(RCE 风险)
  • SSH:禁用密码登录,只用密钥
  • 定期更新:sudo apt upgrade + sudo docker compose pull

26. 配置备份:Agent + GitHub MCP

个人单服务器部署,不需要在 VPS 上跑 Git。推荐让 Hermes Agent 通过 GitHub MCP 直接操作 GitHub,备份配置、回滚、迁移都更方便。

26.1 配置 GitHub MCP

在 .env 中添加密钥,然后在 config.yaml 的 mcp_servers 下添加:

# 1. .env 中添加
echo 'GITHUB_PERSONAL_ACCESS_TOKEN=ghp_你的token' >> ~/.hermes/.env

# 2. config.yaml 中添加
mcp_servers:
  github:
    command: "npx"
    args: ["-y", "@modelcontextprotocol/server-github"]
    env:
      GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_PERSONAL_ACCESS_TOKEN}"
    timeout: 120

获取 Token:GitHub → Settings → Developer settings → Personal access tokens → Generate new token (classic) → 勾选 repo 权限。

26.2 使用方式

在微信里直接对 Agent 说:

你说Agent 做
「把配置备份到 GitHub」创建私有仓库,推送 config.yaml、SOUL.md、docker-compose.yaml
「回滚 SOUL.md 到上一版」从 GitHub 拉取历史版本覆盖
「查看配置变更记录」列出 GitHub 上的 commit 历史
「迁移服务器」在新服务器 clone 仓库,恢复配置
关键优势:VPS 是无状态的 — 配置在 GitHub,服务器可以随时重建。比在 VPS 上跑 git 更简单、更安全。
安全提醒:Agent 推送时会自动排除 .env(密钥文件)。但建议检查仓库确认没有泄露。Token 用完后妥善保管,不要发给 Agent 或写进聊天记录。

27. Syncthing 文件同步(Obsidian 三端同步)

Syncthing 是开源 P2P 文件同步工具,用于在手机、电脑、服务器之间同步 Obsidian 知识库。88k+ GitHub Stars,运行超过 11 年。

27.1 为什么用 Syncthing 而不是 Obsidian 插件

方案手机支持实现方式评价
obsidian-ssh-sync 插件❌ 桌面端 onlyObsidian 内调用 rsync仅 6 stars,不支持手机
Obsidian Git 插件⚠️ 需 TermuxGit push/pull不是同步工具,是版本控制
Syncthing✅ 完美P2P 实时同步88k stars,全平台

27.2 架构

📱 手机 ←→ 🖥️ 服务器(24h 在线,做中继)←→ 💻 电脑
     P2P 加密              P2P 加密

Hermes Agent 通过 Obsidian Skill 直接读写服务器上的 vault 文件,修改后 Syncthing 自动同步到手机和电脑。

27.3 端口说明

端口协议用途公网
8384TCPWeb 管理界面❌ 仅 127.0.0.1(SSH 隧道访问)
22000TCP文件数据传输✅ UFW
22000UDPQUIC 快速连接 + NAT 打洞✅ UFW
21027UDP局域网设备发现❌ 仅内网
为什么 TCP + UDP 都要开:TCP 负责数据传输,UDP (QUIC) 负责快速握手和 NAT 穿透。只开 TCP 也能用(降级到纯 TCP),但建立连接会慢几秒。两个都开 = 最佳体验。

27.4 手机端配置

  1. F-Droid 安装 Syncthing-Fork
  2. 「设备」→ 添加服务器 ID
  3. 「文件夹」→ 添加 Obsidian vault,文件夹 ID 填 obsidian-vault
  4. 共享给服务器
  5. 系统设置 → 电池 → Syncthing-Fork → 无限制(防止被杀)
  6. 忽略模式(可选):排除大文件 *.mp4 *.mov

27.5 电脑端配置

  1. syncthing.net 下载安装
  2. 添加远程设备 → 粘贴服务器 ID
  3. 添加文件夹 → 选本地 Obsidian vault 路径 → 文件夹 ID 填 obsidian-vault

27.6 常见问题

问题解决
手机显示断开检查电池优化设置,确保 Syncthing-Fork 后台不被杀
连接但不同步确认两端文件夹 ID 一致(都是 obsidian-vault)
权限错误sudo chown -R hermes:hermes ~/.hermes/obsidian-vault
同步慢确保 22000 端口已开防火墙,走直连而非中继