Telegram の私的なボットは VPS 上のエージェントへの窓口になりますが、接続だけでは意図した人が返信を得られるとは限りません。新品の Hermes Agent データディレクトリから始め、数値 Telegram ID を1つ許可し、本当の回答と停止手段を確認します。NousResearch の v0.22.2 Docker 手順とTelegram 手順に基づき、2026年10月19日確認。BIG CHANGE は VPS 運用、イメージ取得、ボット作成、モデル呼び出しを実施していません。
大きな変化
- 何が変わるか: ダイジェストで固定し版を確認した Docker イメージと専用の
/opt/dataマウントで、このゲートウェイのソフトウェアと状態を識別できます。 - なぜ重要か: 数値 Telegram 許可リストと実際の私信返信で、予定のアカウントが利用できるか確認できます。
- 注意点: ペアリングや全体の許可はアクセスを広げ得ます。無害な指示はツールを制限しません。権限、ログ、再起動、停止状態を確認します。
Linux VPS 1台を SSH で管理する権限、稼働する Docker Engine、ホスト復旧手段、BotFather でボットを作れる Telegram アカウント、利用資格のある Hermes モデル提供元アカウントが必要です。VPS の構成と資源を公式 amd64/arm64 ビルドと照合し、ウィザード前に提供元のアクセスと料金を確認します。Docker は導入済みとします。導入・ファイアウォール変更は OS と事業者次第です。ホストから Telegram と提供元への外向き通信が必要です。状態用の非公開ディレクトリを用意し、読む人を制限します。/opt/data に認証情報、セッション、ログが入ります。Docker マニュアルはこのマウントを永続的な正本としています。
1. 設定前にイメージを固定する
SSH 接続し、これらのコマンドは同じシェルで実行します。stable タグは変わり得ます。取得後にリポジトリダイジェストを記録し、イメージ自身の報告が 0.22.2 であることを確認します。版違い、ダイジェスト欠落、既存状態、または hermes という既存コンテナがあれば停止します。実際の版に手順を更新するか、対応する文書付きイメージを用意してから進めます。ダイジェストは対象を固定するだけで、版の証明にはなりません。
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
fiset -eu は Docker 不可、取得・検査失敗、版コマンド失敗時にシェル処理を止めます。明示した検査は空のダイジェストや別の版でも停止します。その状態で設定へ進まず、記録した nousresearch/hermes-agent@sha256:… 値を保存します。以後の設定とゲートウェイは IMAGE_REF を使うため、タグ変更で密かにコンテナが変わりません。実 VPS で読者が検査する手順で、記事に確認済みイメージダイジェストはありません。ホストのネイティブファイルシステムに新規専用ディレクトリを作り、2つのゲートウェイで同じデータを共用しないでください。
2. 提供元と私信送信者1人を設定する
マウントしたディレクトリでDocker 設定ウィザードを実行します。アカウントが許可するモデル経路を選び、認証し、提供元・モデル設定を確認します。アクセスと料金はそのアカウント次第です。保存だけでモデル要求の成功は示せません。
docker run -it --rm -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" setupTelegram で @BotFather に /newbot を使ってボットを依頼し、トークンは秘密にします。送信者の数値 Telegram ユーザー IDを、例えばTelegram マニュアルが参照する方法で確認します。ユーザー名は ID ではありません。ウィザードか hermes gateway setup でトークンと許可リストを書けます。手動なら TELEGRAM_BOT_TOKEN=<private token>とTELEGRAM_ALLOWED_USERS=<your numeric ID> を $HERMES_DATA/.env に入れます。コンテナ内では /opt/data/.env です。トークンをコマンド、履歴、共有メモ、記事へ載せないでください。
次の $HERMES_DATA/config.yaml (/opt/data/config.yaml、コンテナ内の位置)で未許可私信の全体動作を設定します。
unauthorized_dm_behavior: ignore設定コンテナの終了後、公式イメージは $HERMES_DATA の所有者を実行 UID 10000 に変えている場合があります。起動処理は .env をモード 600 に制限し、既存の config.yaml を 640 に厳格化します。その起動で初作成した設定にも同じ調整が必要な場合があります。通常の SSH ユーザーは開けない可能性があります。必要なキーが設定されなかった場合、権限のあるホスト管理者が2つの指定ファイルを sudo で確認・編集し、実行所有者と非公開モードを復元します。UID 10000 のホストエディターはログインユーザー所有の $HOME を通れない場合があるため、管理権限を使います。sudoとvi のあるホストで、秘密を出さない所有者・モード確認後に使います。UID 違いやファイル欠落なら進まず、ホスト固有のアクセスを先に解決します。
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 の対象はこの2ファイルだけで、エディターの置換ファイルも含みます。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 のグループプライバシーを有効に保ち、ボットをグループへ入れたり管理者にしたりしません。ゲートウェイアクセスのマニュアルは許可リストと永続ペアリングを別経路として説明します。セキュリティマニュアルによると ignore は未許可私信を黙って破棄します。
許可リストは会話を始める人を制限するだけです。許可されたエージェントの行動は制限しません。Hermes の Telegram セッションには標準で端末ツールがあるため、送信者を許可する前にツール権限、Docker マウント、提供元アクセス、ホスト方針を確認します。無害なテスト指示は単なる指示です。
3. 起動して最初の返信を確認する
記録したダイジェストから名前付きコンテナを1つ起動します。公開 Docker コマンドには API 用の任意の -p 8642:8642 がありますが、私信に公開 API やダッシュボードのポートは不要なので省きます。イメージがゲートウェイを監督し、Docker の unless-stopped が Docker 起動時の再起動を制御します。マウントは再起動後も設定とセッションを保ちます。
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 の環境では、次のオフライン確認は固定した Hermes CLI のみを UID 10000、ネットワーク無効で実行し、起動を迂回します。文書のコマンドと入口からの応用で、BIG CHANGE の実測ではありません。稼働時 UID とマウント所有者がともに10000と確認した場合だけ使います。所有者、UID、CLI 出力、権限が不明なら停止を保ち、解決まで再起動しません。
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 を非公開で調べ、他の全体・プラットフォーム許可、* や全許可設定を見つけ、文書に従って撤去します。全アクセス経路の確認まで停止します。リスト1項目の削除では独立ペアリングや全体許可は失効しません。確認後に docker start hermes で元コンテナを意図的に再開します。送信前にログと一覧を再確認します。
許可アカウントでボットとの非公開チャットを開き、「短い挨拶を返してください」など無害な要求を送ります。実際の回答と対応するログ・セッションを確認します。送信済み、入力中、状態表示、設定完了は返信ではありません。Telegram の /whoami は現在のメッセージ範囲を示せてもホスト権限の証明ではありません。秘密でない証拠だけ残します。
返信がなければコンテナ状態と docker logs --tail 50 hermes を先に読みます。トークン、正しい数値 TELEGRAM_ALLOWED_USERS、提供元認証と利用資格、外向き接続を確認します。結果不明なら次を送る前にチャットとログを読みます。文書のコールドブートは保留更新を捨て得て、重複抑制もメモリー内で限定的です。厳密に1回の配送保証はありません。
4. 再起動・停止・復旧を確認する
最初の処理完了後、同じコンテナを再起動し、新しいログと保管された /opt/data 状態を確認してから、新しい無害な私信要求と返信を確認します。コンテナを止めて Docker の状態を読みます。exited が停止の印です。静かなチャットだけでは不十分です。docker start hermes が後で意図的に再開する方法です。
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 リリースノートは起動時の稼働確認修正を説明しますが、実ホストの出来事は証明しません。修理に状態ディレクトリを削除しないでください。トークン漏えい時は止め、BotFather で無効化し、マウントした .env 内で秘密に交換してアクセス確認後に再起動します。不要ペアリングを失効させ、有効リストも調べます。
VPS とモデルは別々に費用がかかる場合があります。実プラン、上限、料金を確認してください。所要時間、無料枠、可用性目標は保証しません。Telegram と提供元は通過メッセージを処理し、ホストは秘密と会話状態を保持します。これは1ホスト・1ボットの初回返信検査です。別の BIG CHANGE ガイドはHermes バックアップと復旧とHermes の定期ジョブを扱います.
出典と参考資料
次のDocker 設定, Telegram 設定, ゲートウェイアクセス, セキュリティとv0.22.2 リリースは NousResearch の一次資料です。クイックスタートは提供元設定を説明します。手順の文書であり、BIG CHANGE の VPS・ボット運用記録ではありません。



