AI-translated from English; not yet reviewed by a fluent editor.

# 在 VPS 上运行一个 Hermes Agent 网关并核查 Telegram 私聊回复

> 在 Linux VPS 上配置经过版本核对的 Hermes Docker 网关，只允许一名 Telegram 私聊发送者，确认真实回复，再检查重启与停止控制。

By BIG CHANGE Editorial

Published: 2026-10-19T20:31:34.981Z
Updated: 2026-10-19T20:31:34.981Z
Canonical: https://bigchange.ai/blog/hermes-vps-docker-private-telegram-first-reply

![Conceptual charcoal illustration of one hand holding an unbranded phone with two blank message shapes on its screen.](https://bigchange.ai/api/media/file/hermes-private-reply-check-hero-v1.png)
AI-generated conceptual illustration by BIG CHANGE; no actual Telegram interface, Hermes deployment or observed reply is depicted.

Telegram 私人机器人方便访问 VPS 上的代理，但网关已连接不代表指定的人能得到回复。本指南从全新 Hermes Agent 数据目录开始，只允许一个 Telegram 数字用户 ID，检查真实回答，并为操作者保留经验证的停止控制。它依据 NousResearch 的 [v0.22.2 Docker 说明](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md)和[Telegram 说明](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/telegram.md)，于 2026 年 10 月 19 日核查。BIG CHANGE 没有为本指南运行 VPS、拉取镜像、创建机器人或调用模型。

## 关键变化

- **变化是什么：** 按摘要固定且核对版本的 Docker 镜像，加上专用的 `/opt/data` 挂载，可识别这一个网关的软件和状态。
- **为什么重要：** Telegram 数字 ID 白名单及真实私聊回复能确认指定账户是否可用网关。
- **需要注意：** 配对或全局授权可能扩大访问，无害提示不能限制代理工具。请检查授权、日志、重启及停止状态。

你须有权通过 SSH 管理一台 Linux VPS，有可用的 Docker Engine 和主机恢复访问、可通过 BotFather 创建机器人的 Telegram 账户，以及符合 Hermes 模型提供方条件的账户。核对主机架构与资源是否适合官方 amd64 或 arm64 镜像，并在向导前查看提供方当前的访问及计费条件。本指南假设 Docker 已可用，安装和防火墙变更依系统与服务商而定。主机须能出站连接 Telegram 及选定模型提供方。为 Hermes 状态保留私人目录并限制谁可读取：`/opt/data` 将保存凭据、会话和日志。[Docker 手册](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md)把该挂载称为持久的权威数据来源。

## 1. 配置前固定镜像

通过 SSH 连接，以下命令保持在同一个 shell 中运行。`stable` 标签可能移动。拉取镜像、记录仓库摘要，并确认镜像自身报告的版本为 `0.22.2`。版本不同、摘要缺失、目录已有状态，或名为 `hermes` 的容器已存在时停止。继续前按实际版本更新说明，或取得有文档支持的匹配镜像。摘要固定实际运行的镜像，但自身不能证明发行版本。

```sh
set -eu
docker info >/dev/null
docker container inspect hermes >/dev/null 2>&1 && { echo 'Container hermes already exists; stop here.'; exit 1; }
HERMES_DATA="$HOME/.hermes"
if [ -e "$HERMES_DATA" ]; then echo 'Hermes data path already exists; stop here.'; exit 1; fi
mkdir -m 700 "$HERMES_DATA"
docker pull nousresearch/hermes-agent:stable
docker image inspect nousresearch/hermes-agent:stable --format '{{json .RepoDigests}}'
IMAGE_REF="$(docker image inspect nousresearch/hermes-agent:stable --format '{{index .RepoDigests 0}}')"
if ! printf '%s\n' "$IMAGE_REF" | grep -Eq '^nousresearch/hermes-agent@sha256:[0-9a-f]{64}$'; then
  echo 'No valid repository digest; stop here.'; exit 1
fi
printf 'Pinned image: %s\n' "$IMAGE_REF"
VERSION_OUTPUT="$(docker run --rm "$IMAGE_REF" --version)"
printf 'Image version: %s\n' "$VERSION_OUTPUT"
if ! printf '%s\n' "$VERSION_OUTPUT" | grep -Eq '(^|[^0-9])v?0[.]22[.]2([^0-9]|$)'; then
  echo 'Image version is not 0.22.2; stop here.'; exit 1
fi
```

`set -eu` 会在 Docker 不可用、拉取或检查失败、版本命令失败时停止这一串 shell 操作。明确的摘要及版本检查也会拦下空摘要或其他版本。遇到这些结果不要继续配置。保留所记录的 `nousresearch/hermes-agent@sha256:…` 值。以下配置与网关均使用 `IMAGE_REF`，后续标签变化就不会悄悄替换这个容器。这些检查要在真实 VPS 上进行；本文没有已验证的镜像摘要。使用主机原生文件系统上的新专用目录，绝不要让两个网关容器同时使用同一数据目录。

## 2. 配置提供方和一名 Telegram 私聊发送者

使用已挂载目录运行[Docker 配置向导](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md)。选择账户获准的模型路径，完成认证并检查生成的提供方及模型设置。访问与费用依账户而定；设置已保存并不证明模型请求成功。

```sh
docker run -it --rm -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" setup
```

在 Telegram 向 [@BotFather](https://t.me/BotFather) 使用 `/newbot` 请求机器人，并保密其令牌。取得指定发送者的**Telegram 数字用户 ID**，例如采用[Telegram 手册](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/telegram.md)链接的 ID 检查方法；用户名不等于 ID。向导或 `hermes gateway setup` 可写入机器人令牌与白名单。手动配置时，将 `TELEGRAM_BOT_TOKEN=<private token>`和`TELEGRAM_ALLOWED_USERS=<your numeric ID>` 放入 `$HERMES_DATA/.env`，在容器内它对应 `/opt/data/.env`。不要把令牌放进命令、shell 历史、共享笔记或本文。

在 `$HERMES_DATA/config.yaml` (`/opt/data/config.yaml`，容器内路径）中，设置全局未授权私信行为：

```yaml
unauthorized_dm_behavior: ignore
```

配置容器退出后，官方镜像可能已把 `$HERMES_DATA` 的所有者改成运行时 UID 10000。引导过程把 `.env` 限为模式 `600`，并将已有的 `config.yaml` 收紧为 `640`；在该次引导中初次创建的配置也可能需要相同收紧。普通 SSH 登录者因此可能无法打开文件。若向导没有设置所需键，**获授权的主机管理员** 可用 `sudo` 检查和编辑这两个准确文件，再恢复运行时所有权及私人权限。以 UID 10000 运行主机编辑器，可能无法穿过登录用户所有的 `$HOME`，所以命令使用主机管理员权限。在具有 `sudo`和`vi` 的主机上，先核对不含秘密的所有者及模式回读，再使用命令。UID 不同或文件缺失时不要继续，先解决主机具体访问问题。

```sh
sudo stat -c '%u:%g %a %n' "$HERMES_DATA" "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"
# Expected: directory owner 10000 and mode 700; .env owner 10000 and mode 600.
# config.yaml should have owner 10000; its first-boot mode can vary.
sudo vi "$HERMES_DATA/.env"
sudo vi "$HERMES_DATA/config.yaml"
sudo chown 10000:10000 "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"
sudo chmod 700 "$HERMES_DATA"
sudo chmod 600 "$HERMES_DATA/.env"
sudo chmod 640 "$HERMES_DATA/config.yaml"
sudo stat -c '%u:%g %a %n' "$HERMES_DATA" "$HERMES_DATA/.env" "$HERMES_DATA/config.yaml"
```

最终的 `stat` 输出应显示两文件 UID/GID 均为 10000，目录模式为 `700`, `.env` 模式为 `600`和`config.yaml` 模式为 `640`；它显示元数据，不显示凭据。`chown` 只针对这两个文件，也包括编辑器生成的替换文件。若没有 `sudo`或`vi`，使用主机获准的管理流程，完成相同所有者与模式回读。不要把状态目录改成所有人可读，也不要为本步骤重映射容器用户。

编辑时保留向导的模型提供方设置。确保 Telegram 专属的 `unauthorized_dm_behavior` 覆盖没有设置 `pair`，全局的 `GATEWAY_ALLOWED_USERS`或`GATEWAY_ALLOW_ALL_USERS` 也没有给予更广访问。在 `config.yaml` 中，还须确保 `gateway.allow_all_users` 及顶层的 `allow_all_users` 都不为 true，且全局或 Telegram 白名单没有其他发送者。不要在白名单使用 `*`，不要加群组白名单，不要批准配对码。全新目录避免继承授权；已有数据时应停止并检查，不能覆盖。保持 BotFather 的群组隐私开启，不把机器人加入群组，也不设为群组管理员。[网关访问手册](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/index.md)将白名单与持久配对授权列为不同访问路径。[安全手册](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/security.md)说明 `ignore` 会静默丢弃未授权私信。

白名单控制谁能开始对话，不限制获授权代理能做什么。Hermes Telegram 会话默认带有终端工具；放行发送者前检查工具权限、Docker 挂载、提供方访问及主机政策。无害测试提示只是提示，不是权限限制。

## 3. 启动网关并检查首次回复

用已记录摘要启动一个命名容器。已发布的 Docker 命令包含可选的 `-p 8642:8642` 用于 API 访问；此处省略，因为 Telegram 私信不需要公开 API 或控制面板端口。镜像监督网关进程，Docker 的 `unless-stopped` 策略则管理 Docker 启动时的容器重启。挂载目录让配置和会话在容器重启后保留。

```sh
docker run -d --name hermes --restart unless-stopped \
  -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" gateway run
if ! {
  docker inspect hermes --format '{{.Image}} {{.State.Status}}' &&
  [ "$(docker inspect hermes --format '{{.State.Status}}')" = running ] &&
  docker logs --tail 50 hermes &&
  docker exec -u hermes hermes hermes pairing list
}; then
  echo 'State, logs or pairing check failed; stopping before any message.'
  docker stop hermes || true
  docker inspect hermes --format '{{.State.Status}}' || true
  exit 1
fi
```

确认容器为 `running`，检查日志中的 Telegram 连接及提供方错误，发送提示前查看配对列表。任何初始读取失败时，代码块会停止网关并打印状态；CLI 或授权结果不明不能算放行。继续调查前确认 `exited`，状态不明时不要发消息或重启。不应有其他获批发送者；发现后先停止网关并检查停止状态。`docker exec` 不能对已停止容器运行，而普通镜像入口可能恢复先前运行的网关。对于全新、默认 UID 的安装，下方离线检查只以 UID 10000 运行固定的 Hermes CLI，禁用网络且绕过网关启动。它改编自文档配对命令及入口，BIG CHANGE 未实测。只有已确认运行中网关 UID 和挂载数据所有者都是 10000 时才使用。所有权、UID、CLI 输出或授权状态不明，保持停止，解决后才能重启。

```sh
if [ "$(docker exec -u hermes hermes id -u)" != 10000 ] || [ "$(stat -c %u "$HERMES_DATA")" != 10000 ]; then
  echo 'Runtime UID or data owner differs; stop for a host-specific repair.'; docker stop hermes; exit 1
fi
docker stop hermes
if [ "$(docker inspect hermes --format '{{.State.Status}}')" != exited ]; then
  echo 'Container is not exited; do not mount state in another container.'; exit 1
fi
docker run --rm --network none --user 10000:10000 \
  --entrypoint /opt/hermes/.venv/bin/hermes \
  -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing list
# For a listed unwanted Telegram user, read the exact numeric ID first:
printf 'Unwanted numeric Telegram user ID: '; IFS= read -r UNWANTED_ID
if ! printf '%s\n' "$UNWANTED_ID" | grep -Eq '^[0-9]+$'; then echo 'Invalid ID; leave gateway stopped.'; exit 1; fi
docker run --rm --network none --user 10000:10000 \
  --entrypoint /opt/hermes/.venv/bin/hermes \
  -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing revoke telegram "$UNWANTED_ID"
docker run --rm --network none --user 10000:10000 \
  --entrypoint /opt/hermes/.venv/bin/hermes \
  -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" pairing list
```

确认最终列表不再有不需要的 ID。私下检查 `$HERMES_DATA/.env`和`config.yaml` 中其他平台及全局白名单、`*` 或全部允许设置，按文档配置路径撤除不需要的授权。所有访问路径检查前保持网关停止。移除白名单一项不会撤销独立配对或全局授权。完成回读后，`docker start hermes` 会有意恢复原容器；发消息前再检查日志及配对。

从获准账户打开与机器人的**私人**对话，发一个无害请求，例如“用简短问候回复”。确认聊天里有真实回答，并检查对应网关日志或会话记录。消息已发送、正在输入、状态显示或配置完成界面都不是回答。Telegram 的 `/whoami` 可显示当前消息范围，但不能证明主机授权。只保留不敏感的检查证据。

若机器人不答，先读取容器状态及 `docker logs --tail 50 hermes`。检查令牌、准确的数字 `TELEGRAM_ALLOWED_USERS` 值、模型提供方认证及用量资格、出站连接。轮次不明确时先看私聊及日志，再决定发下一条。文档所述冷启动可能丢掉待处理更新，去重也仅在有限内存范围内生效；此路径不保证恰好一次送达。

## 4. 检查重启、停止与恢复

首次轮次结束后重启同一容器，检查新日志及保留的 `/opt/data` 状态，然后发送一个**新的**无害私聊提示并确认回复。停止容器，读取 Docker 状态。`exited` 才是停止信号，聊天安静并不算。`docker start hermes` 是稍后有意恢复的方法。

```sh
docker restart hermes
docker logs --tail 50 hermes
docker inspect hermes --format '{{.State.Status}}'
# After the restarted gateway is ready, send a new private test message.
docker stop hermes
docker inspect hermes --format '{{.State.Status}}'
# Expected after stop: exited
# When intentionally resuming later: docker start hermes
```

重启失败时检查 Docker 状态及日志，再查看 `$HERMES_DATA/logs/gateways/default/current`和`$HERMES_DATA/logs/container-boot.log`、目录挂载、所有权及固定镜像与版本。[v0.22.2 发行说明](https://github.com/NousResearch/hermes-agent/releases/tag/v0.22.2)记载网关启动存活修复，不能证明你主机发生什么。不要删数据目录来修复。令牌泄漏时，停止网关、在 BotFather 撤销、私下替换挂载的 `.env` 中令牌，重启前再查访问。也要撤销不需要的配对授权，检查实际白名单。

VPS 托管与模型用量可能分别收费。核对实际套餐、限制及费用；没有承诺运行时间、免费模型额度或可用性目标。Telegram 及模型提供方会处理经过它们的消息，主机挂载目录保存本地秘密及会话状态。本检查只针对一台主机、一个机器人和首次回复。其他 BIG CHANGE 指南介绍[Hermes 备份与恢复](https://bigchange.ai/blog/hermes-encrypted-github-backup-recovery-guide)和[Hermes 定期任务](https://bigchange.ai/blog/hermes-skill-recurring-job-first-run).

## 来源与延伸阅读

以下[Docker 配置](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md), [Telegram 配置](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/telegram.md), [网关访问指南](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/index.md), [安全指南](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/security.md)和[v0.22.2 发行版](https://github.com/NousResearch/hermes-agent/releases/tag/v0.22.2)均为 NousResearch 的第一方来源。[快速入门](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/getting-started/quickstart.md)解释模型提供方配置。这些链接说明操作方法，不是 BIG CHANGE 运行 VPS 或 Telegram 机器人的记录。

## Sources

- [Hermes Agent v0.22.2 发行版](https://github.com/NousResearch/hermes-agent/releases/tag/v0.22.2) — 发布日期及文档所述启动存活修复。
- [Hermes Docker 配置，v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/docker.md) — 镜像通道、挂载、配置、监督网关、端口与日志。
- [官方 Dockerfile，v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/Dockerfile) — 入口、运行 UID、HERMES_HOME 及有限离线配对检查的 CLI 路径。
- [Docker 第二阶段钩子，v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/docker/stage2-hook.sh) — 配置后的特定数据所有权及 .env/config 权限行为。
- [Telegram 配置，v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/telegram.md) — BotFather、令牌、数字白名单、隐私及送达限制。
- [消息与网关，v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/messaging/index.md) — 实际访问、配对回读及撤销。
- [安全，v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/user-guide/security.md) — 未授权私信行为及访问限制。
- [快速入门，v0.22.2](https://raw.githubusercontent.com/NousResearch/hermes-agent/v0.22.2/website/docs/getting-started/quickstart.md) — 模型提供方配置路径。
