Личный Telegram-бот удобен для доступа к агенту на VPS, но подключение не доказывает ответ нужному человеку. Начинаем с нового каталога Hermes Agent, допускаем один числовой Telegram ID, проверяем настоящий ответ и подтверждённый способ остановки. Основа — инструкции Docker v0.22.2 и инструкции Telegram от NousResearch, проверенные 19 октября 2026 года. BIG CHANGE не эксплуатировала VPS, не загружала образ, не создавала бота и не вызывала модель для статьи.
Главное изменение
- Что изменилось: Фиксированный по дайджесту и проверенный по версии Docker-образ с отдельным монтированием
/opt/dataпозволяет определить ПО и состояние шлюза. - Почему это важно: Числовой список допуска Telegram и реальный личный ответ показывают доступ нужной учётной записи.
- На что обратить внимание: Сопряжение и глобальные права расширяют доступ; безобидный запрос не ограничивает инструменты агента. Проверьте права, журналы, перезапуск и остановку.
Нужны полномочия управлять Linux VPS через SSH, работающий Docker Engine и доступ восстановления хоста, Telegram-аккаунт с созданием бота BotFather и подходящий аккаунт поставщика модели Hermes. Сверьте архитектуру и ресурсы с официальным amd64/arm64-образом и условия доступа/оплаты до мастера настройки. Docker уже должен работать; установка и межсетевой экран зависят от ОС и поставщика. Хосту нужны исходящие соединения к 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. Настройте поставщика и одного личного отправителя
Запустите мастер настройки Docker с подключённым каталогом. Выберите разрешённый модельный маршрут, пройдите аутентификацию и проверьте поставщика/модель. Доступ и оплата зависят от аккаунта. Сохранённые настройки не подтверждают успешный запрос.
docker run -it --rm -v "$HERMES_DATA:/opt/data" "$IMAGE_REF" setupВ Telegram попросите у @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-пользователь может не открыть файлы. Если ключи не заданы, уполномоченный администратор хоста может проверить и изменить два точных файла через 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 затрагивает только два файла, включая замену редактором. Если нет sudo или vi, используйте разрешённую процедуру с той же проверкой. Не открывайте данные всем и не переназначайте пользователя контейнера.
При редактировании сохраните поставщика. Ни одно Telegram-переопределение unauthorized_dm_behavior не должно задавать pair, и глобальное GATEWAY_ALLOWED_USERS или GATEWAY_ALLOW_ALL_USERS не должно расширять доступ. В config.yaml также проверьте, что ни gateway.allow_all_users, ни верхнеуровневый allow_all_users не равны true и списки не содержат других отправителей. Не используйте * в списках, не добавляйте групповые разрешения и не подтверждайте коды сопряжения. Новый каталог исключает наследование; если есть данные, остановитесь и изучите, не перезаписывайте. Оставьте приватность групп BotFather включённой, не добавляйте бота в группу и не делайте администратором. Руководство доступа к шлюзу различает списки и постоянные разрешения сопряжения. Руководство безопасности описывает ignore как тихое отбрасывание неразрешённых личных сообщений.
Список ограничивает начало беседы, а не действия допущенного агента. Сеансы Hermes Telegram по умолчанию имеют терминальные инструменты. До допуска проверьте инструменты, монтирования, поставщика и политику хоста. Безобидный тестовый запрос остаётся лишь запросом.
3. Запустите шлюз и проверьте ответ
Запустите один именованный контейнер из записанного дайджеста. Опубликованная команда Docker содержит необязательный -p 8642:8642 для API. Здесь опустите его: личному Telegram не нужен публичный 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 на другие глобальные/платформенные списки, * или полное разрешение; удалите лишние права документированно. До проверки всех путей держите остановленным. Удаление записи не отменяет независимое сопряжение или глобальное право. После проверки docker start hermes намеренно продолжит исходный контейнер. До сообщения вновь проверьте журнал и сопряжения.
Из разрешённого аккаунта откройте личный чат с ботом и отправьте безобидное «Ответь коротким приветствием». Подтвердите реальный ответ и соответствующий журнал/сеанс. Отправка, индикатор набора, статус или завершённая настройка — не ответ. Telegram /whoami показывает область сообщений, не полномочия хоста. Сохраняйте только нечувствительные доказательства.
При отсутствии ответа сначала читайте состояние и docker logs --tail 50 hermes. Проверьте токен, точный числовой TELEGRAM_ALLOWED_USERS, аутентификацию и право использования модели, исходящую связь. При неопределённости читайте чат и журналы до повтора. Документированный холодный старт может потерять ожидающие обновления; защита от дублей ограничена памятью. Гарантии ровно одной доставки нет.
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 и поставщик обрабатывают сообщения, хост хранит секреты и состояние. Это первая проверка одного хоста и бота. Другие руководства BIG CHANGE описывают резервирование и восстановление Hermes и периодическую задачу Hermes.
Источники и дополнительные материалы
Материалы по настройке Docker, настройке Telegram, доступу шлюза, безопасности и выпуску v0.22.2 являются первоисточниками NousResearch. Быстрый старт объясняет поставщика. Это документация процедуры, не журнал работы VPS или бота BIG CHANGE.



