Hermes Agent VPS 部署教程:安全安装与微信、飞书、企业微信接入
Hermes Agent 是 Nous Research 开源的个人 AI Agent。它能调用模型、文件、命令、Skills、MCP 和消息网关;因此,部署的核心不是“把机器人跑起来”,而是先确定谁能向它输入内容,以及这些内容能触达哪些主机资源。
本文面向一个可信操作者管理的专用 Linux VPS。Hermes 官方安全策略把它定义为“单租户个人 Agent”;互不信任的人员、客户或业务域应使用独立实例和独立 allowlist,不能只靠不同会话隔开。
先选择正确的隔离方式
官方安全策略明确:面对恶意 LLM 输出或不可信输入时,只有操作系统隔离才是安全边界。审批提示、输出脱敏、工具 allowlist 和扫描器是纵深防护,但不构成容器或虚拟机级隔离。
| 场景 | 最低建议 | 原因 |
|---|---|---|
| 仅本人通过 CLI 做可信测试 | 专用普通用户,可先做宿主机验证 | 输入面和操作者都受控 |
| Agent 只需隔离 Shell 与文件工具 | 非默认 terminal backend | terminal backend 只约束 Shell/文件工具,不覆盖进程内代码路径 |
| 接入消息、网页、邮件或不可信 MCP | 整进程容器或 OpenShell | Agent、代码执行、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 初始安全配置,并确认以下条件:
- 使用已经验证密钥登录的普通用户,不长期直接运行 root 会话;
- 从第二个终端验证实际 SSH 端口,供应商控制台仍可用于恢复;
- 主机防火墙只保留已核对的 SSH 入口;
- Docker Engine 来自当前受支持的软件源,
docker version能正常返回; - 模型密钥、App Secret、聊天标识和备份不会进入公开仓库。
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 setup 或 hermes 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。先通过顶层群允许名单,再通过该群的成员允许名单,两层含义不能互换。
做行为级验收
配置完成不等于上线完成。依次验证:
- allowlist 中的私聊账号能收到一条最小回复;
- 未授权账号不能触发模型、工具或审批;
- 未批准群或成员不能触发 Agent;
- 微信只验证 iLink 实际支持的私聊,不把普通群失败当作 Hermes 配置问题;
- 飞书与企业微信都通过出站 WebSocket 工作,主机没有因此新增公网监听;
- 重启容器后,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