Hermes Agent VPS 部署教程:安全安装与微信、飞书、企业微信接入

· 更新于 · 发布:iVPSer · Linux教程建站

Hermes Agent 是 Nous Research 开源的个人 AI Agent。它能调用模型、文件、命令、Skills、MCP 和消息网关;因此,部署的核心不是“把机器人跑起来”,而是先确定谁能向它输入内容,以及这些内容能触达哪些主机资源。

本文面向一个可信操作者管理的专用 Linux VPS。Hermes 官方安全策略把它定义为“单租户个人 Agent”;互不信任的人员、客户或业务域应使用独立实例和独立 allowlist,不能只靠不同会话隔开。

先选择正确的隔离方式

官方安全策略明确:面对恶意 LLM 输出或不可信输入时,只有操作系统隔离才是安全边界。审批提示、输出脱敏、工具 allowlist 和扫描器是纵深防护,但不构成容器或虚拟机级隔离。

场景最低建议原因
仅本人通过 CLI 做可信测试专用普通用户,可先做宿主机验证输入面和操作者都受控
Agent 只需隔离 Shell 与文件工具非默认 terminal backendterminal backend 只约束 Shell/文件工具,不覆盖进程内代码路径
接入消息、网页、邮件或不可信 MCP整进程容器或 OpenShellAgent、代码执行、MCP、插件、Hooks 与 Skills 都进入同一 OS 边界
生产或共享部署整进程隔离,并拆分信任域官方把这类场景列为 whole-process wrapper 的支持姿态

terminal.backend 设为 Docker,不等于把整个 Hermes 进程放进 Docker。它只隔离经 terminal backend 发出的 Shell 和文件工具;代码执行、MCP 子进程、插件、Hooks 与 Skills 仍可能在宿主 Agent 进程内运行。

每个启用的消息或网络适配器都要有明确 allowlist。一个适配器内的已授权用户被视为同等可信;若两组用户互不信任,应运行独立 Hermes 实例并使用独立 allowlist,必要时拆到不同容器或 VPS。

准备 VPS 与恢复入口

先完成 Linux VPS 初始安全配置,并确认以下条件:

Hermes 的平台支持和依赖会变化。部署前查阅当前 Platform Support,再根据真实模型、浏览器任务、会话量和监控数据选择 VPS 规格,不照搬固定内存数字。

先备份已有实例

全新服务器且没有 ~/.hermes 状态时可跳过。已有实例必须在安装器、配置或频道变更之前,用当前 Hermes 用户创建官方全量备份:

mkdir -p "$HOME/Backups/hermes"
BACKUP_ARCHIVE="$HOME/Backups/hermes/pre-change-$(date -u +%Y%m%dT%H%M%SZ).zip"
hermes backup --output "$BACKUP_ARCHIVE"
test -s "$BACKUP_ARCHIVE"
chmod 600 "$BACKUP_ARCHIVE"

备份包含配置、认证、会话、Skills 和其他状态,也可能包含密钥。将它加密复制到 VPS 之外,并实际记录恢复所需的账号与步骤;同一主机上的单份 zip 不能应对主机故障。

下载并检查官方安装器

宿主机 CLI 适合先验证模型和配置,但不要直接把可变网络响应管道给 Shell。以下命令下载当前官方安装器、记录摘要并人工查看,然后才执行:

HERMES_INSTALLER=$(mktemp)
trap 'rm -f "$HERMES_INSTALLER"' EXIT
curl --proto '=https' --tlsv1.2 --fail --show-error --location \
  https://hermes-agent.nousresearch.com/install.sh \
  --output "$HERMES_INSTALLER"
sha256sum "$HERMES_INSTALLER"
less "$HERMES_INSTALLER"
bash "$HERMES_INSTALLER"

安装器会变化,因此本文不把某次摘要写成永久可信值。核对下载域名、脚本内容和本次 sha256sum 记录;不理解的权限、下载或持久化操作应先停下。

重新打开 Shell,验证 CLI:

hermes version
hermes doctor
hermes setup
hermes doctor

优先用 hermes setuphermes model 输入模型凭据,让 CLI 把秘密写到正确位置。不要把真实 API Key 粘进教程、命令历史、工单或公开配置;并检查 ~/.hermes/.env 权限为 0600

先在 CLI 完成一轮最小对话和会话恢复。模型调用未通过时,不要继续叠加消息网关、Cron、第三方 Skills 或插件。

宿主机常驻只用于可信试运行

若当前输入只有可信操作者,可用官方命令安装服务,不要手写一份可能随版本失效的 systemd unit:

hermes gateway setup
hermes gateway
# 前台验证后按 Ctrl+C
hermes gateway install
hermes gateway start
hermes gateway status

这条路径仍让 Hermes 进程处在宿主用户的信任范围内。不要把 terminal backend 的 Docker 选项误认为整进程隔离,也不要把服务用户加入 Docker 组;Docker socket 通常等价于宿主机高权限。

准备切换到容器时,先停止宿主机 Gateway,避免同一 token 被两个 poller 同时使用:

hermes gateway stop
hermes gateway status

生产消息网关采用整进程容器

生产消息面会接收外部内容,应使用整进程隔离。下面基于官方镜像,但先记录实际 RepoDigest,再用该摘要启动;升级时也能明确知道旧镜像。

sudo docker pull nousresearch/hermes-agent:latest
HERMES_IMAGE=$(sudo docker image inspect nousresearch/hermes-agent:latest \
  --format '{{index .RepoDigests 0}}')
case "$HERMES_IMAGE" in
  *@sha256:*) printf '%s\n' "$HERMES_IMAGE" ;;
  *) echo '没有取得 Hermes 镜像摘要' >&2; exit 1 ;;
esac
HERMES_UID=$(id -u)
HERMES_GID=$(id -g)
mkdir -p "$HOME/.hermes"
chmod 700 "$HOME/.hermes"

首次配置使用同一数据目录和固定摘要:

sudo docker run --rm -it \
  -e PUID="$HERMES_UID" -e PGID="$HERMES_GID" \
  -v "$HOME/.hermes:/opt/data" \
  "$HERMES_IMAGE" setup

正式启动时不发布 API 或 Dashboard 端口,也不挂载 Docker socket、宿主根目录或 SSH 私钥:

sudo docker run -d \
  --name hermes \
  --restart unless-stopped \
  -e PUID="$HERMES_UID" -e PGID="$HERMES_GID" \
  -v "$HOME/.hermes:/opt/data" \
  "$HERMES_IMAGE" gateway run
sudo docker exec hermes hermes doctor
sudo docker logs --tail 100 hermes

消息渠道采用出站长连接或轮询时,不需要发布容器端口。Dashboard 等本地 HTTP 面应保持 loopback;不要绑定公网 0.0.0.0。确需管理界面时,按官方认证方案配置,并优先通过 SSH 隧道或私有网络访问。

统一配置原则

在运行中的容器里启动官方向导:

sudo docker exec -it hermes hermes gateway setup

每新增一个平台,都要完成四件事:保存凭据、配置明确 allowlist、重启 Gateway、分别用允许和拒绝账号做行为测试。不要用 open 临时掩盖用户 ID、权限或事件订阅错误。

修改后收紧秘密文件并重启:

chmod 600 "$HOME/.hermes/.env"
sudo docker exec hermes hermes gateway restart
sudo docker exec hermes hermes gateway status

接入个人微信 Weixin

Hermes 的 Weixin 适配器使用腾讯 iLink Bot API,通过出站长轮询收消息,不需要公网 webhook。运行 hermes gateway setup,选择 Weixin,再用手机扫码并确认。

扫码连接的是独立 iLink bot,不是可完全脚本化的普通个人微信账号。普通微信群通常不能邀请该身份,或无法把群事件送达到 Hermes;不要承诺“扫码后所有微信群都能用”。

向导保存 account ID 和 token 后,把最终访问策略核对为:

WEIXIN_DM_POLICY=allowlist
WEIXIN_ALLOWED_USERS=填写允许私聊的用户ID
WEIXIN_GROUP_POLICY=disabled

其中 Weixin 私聊策略默认是 open,本文显式改为 allowlist。群策略保持 disabled;即使改成 allowlist,也只有 iLink 实际返回群事件时才会生效。

同一个 Weixin token 只能有一个 poller。切换宿主机与容器、迁移 VPS 或恢复备份时,先停旧 Gateway,再启动新实例。

接入飞书或 Lark

飞书推荐使用出站 WebSocket 长连接,不需要公网回调 URL。运行向导选择 Feishu/Lark;扫码创建不可用时,再到官方开发者控制台创建应用并输入 App ID 与 App Secret。

手工创建应用至少要按当前文档配置消息、发消息、资源和会话权限;contact:user.id:readonly 用于解析 allowlist 身份。配置事件 im.message.receive_v1,发布版本并完成企业管理员审批后,权限才会生效。

最终关键值应等价于:

FEISHU_CONNECTION_MODE=websocket
FEISHU_ALLOWED_USERS=ou_允许用户的OpenID
FEISHU_GROUP_POLICY=allowlist
FEISHU_REQUIRE_MENTION=true

FEISHU_ALLOWED_USERS 使用用户 Open ID。群策略默认 allowlist,且默认必须 @机器人;不要为“看起来没回复”关闭 mention 或改成 open,应先检查应用版本、事件、用户 Open ID 和 Gateway 日志。

接入企业微信 WeCom

企业微信 AI Bot 适配器连接 wss://openws.work.weixin.qq.com,也是出站 WebSocket,不需要公网 webhook。运行向导选择 WeCom,通过扫码或企业微信管理后台提供 Bot ID 与 Secret。

WeCom 的私聊和群策略默认都是 open,因此上线前必须显式收紧:

WECOM_DM_POLICY=allowlist
WECOM_ALLOWED_USERS=填写允许私聊的用户ID
WECOM_GROUP_POLICY=allowlist

需要按群进一步限制时,在 config.yaml 的既有 platforms.wecom.extra 下合并配置,不要重复创建顶层键:

platforms:
  wecom:
    extra:
      dm_policy: allowlist
      allow_from:
        - "user_id_1"
      group_policy: allowlist
      group_allow_from:
        - "group_id_1"
      groups:
        group_id_1:
          allow_from:
            - "user_id_1"

这里 group_allow_from 填群 ID,而 groups.<group_id>.allow_from 填成员用户 ID。先通过顶层群允许名单,再通过该群的成员允许名单,两层含义不能互换。

做行为级验收

配置完成不等于上线完成。依次验证:

  1. allowlist 中的私聊账号能收到一条最小回复;
  2. 未授权账号不能触发模型、工具或审批;
  3. 未批准群或成员不能触发 Agent;
  4. 微信只验证 iLink 实际支持的私聊,不把普通群失败当作 Hermes 配置问题;
  5. 飞书与企业微信都通过出站 WebSocket 工作,主机没有因此新增公网监听;
  6. 重启容器后,Gateway、凭据权限和允许名单仍然有效。

检查容器、服务和监听:

sudo docker inspect hermes --format '{{.Config.Image}}'
sudo docker exec hermes hermes gateway status
sudo docker exec hermes hermes doctor
sudo docker logs --since 10m hermes
sudo ss -lntp

日志不应出现循环重启、重复 poller、持续认证失败或未授权消息触发任务。公开工单只提供脱敏片段;删除 token、App Secret、用户 ID、消息正文、内部路径和模型凭据。

备份后再升级

宿主机可信试运行路径先预览,再强制创建完整更新备份。成功后仍要检查 Gateway,而不是只看 updater 退出码:

hermes update --check
hermes update --backup
hermes gateway status
hermes doctor

容器路径不要在容器内 git pull。先创建全量备份并复制到 VPS 之外,再拉取新镜像、记录新旧 RepoDigest、重建容器并重复前述行为验收。

UPGRADE_NAME="pre-image-upgrade-$(date -u +%Y%m%dT%H%M%SZ).zip"
HOST_UPGRADE_BACKUP="$HOME/Backups/hermes/$UPGRADE_NAME"
mkdir -p "$HOME/Backups/hermes"
chmod 700 "$HOME/Backups/hermes"
sudo docker exec hermes hermes backup --output "/tmp/$UPGRADE_NAME"
sudo docker cp "hermes:/tmp/$UPGRADE_NAME" "$HOST_UPGRADE_BACKUP"
test -s "$HOST_UPGRADE_BACKUP"
chmod 600 "$HOST_UPGRADE_BACKUP"
sudo docker exec hermes rm -f -- "/tmp/$UPGRADE_NAME"
OLD_IMAGE=$(sudo docker inspect hermes --format '{{.Image}}')
printf '%s\n' "$OLD_IMAGE"
sudo docker pull nousresearch/hermes-agent:latest

取得并记录新 RepoDigest 后,按首次启动参数重建。不要先删除旧镜像;若新版行为验收失败,停止新容器,用记录的旧镜像 ID 和未覆盖的数据恢复计划回退。

全量备份中包含秘密。恢复前先在隔离目录检查归档来源和权限,再使用官方 hermes import 流程;不要把未验证归档直接解压覆盖正在运行的 ~/.hermes

iVPSer 服务边界

iVPSer 可提供 VPS 开通、基础资源和控制台入口。Hermes 安装、模型账户、Docker、消息平台审核、允许名单、密钥保护、内容合规、备份恢复以及 Agent 执行结果由使用者负责。

实例价格、库存和配置以实时控制台为准。先选择满足当前真实负载的规格,再根据容器监控、会话量、工具调用和磁盘增长决定是否调整。

👉 立即购买 VPS

参考资料