Skip to main content

Установка Hermes Agent (ИИ-агент) на VPS

В этом руководстве описано, как установить Hermes Agent на VPS HostMyServers. Hermes — фреймворк ИИ-агента с открытым исходным кодом (лицензия MIT), разрабатываемый Nous Research. В отличие от ассистента для программирования, которым вы пользуетесь в реальном времени на своём компьютере (Claude Code, OpenCode…), Hermes работает постоянно на сервере: вы общаетесь с ним через мессенджер (Discord, Telegram, Slack…), он автономно работает в фоновом режиме, сохраняет память о ваших диалогах, осваивает новые процедуры (skills) и может выполнять задачи по расписанию.

Развёртывание основано на Docker Compose с защищённой конфигурацией, а веб-интерфейс администрирования доступен только через VPN (Tailscale) и никогда — из Интернета.

Источник

Руководство основано на опыте, описанном в статье «Hermes : simple hype ou vraie révolution ?» («Hermes: просто хайп или настоящая революция?», damyr.fr), и на официальной документации Hermes Agent.

Заказать сервер

Hermes не запускает модели ИИ локально: он обращается к удалённым моделям (OpenRouter, Anthropic, Nous Portal…). Поэтому небольшого VPS более чем достаточно:

  • VPS Performance - Идеально для личного экземпляра
  • VPS NVMe - Отличное соотношение цены и качества
  • Выделенные серверы Eco - Для нескольких агентов/профилей или интенсивной автоматизации браузера

Требования

  • SSH-доступ root или пользователь с sudo
  • Система Ubuntu 24.04 LTS или Debian 12/13
  • Аккаунт у провайдера моделей (например, OpenRouter) с API-ключом
  • Аккаунт Tailscale (бесплатно для личного использования) для доступа к веб-интерфейсу
  • Аккаунт Discord (или Telegram, Slack…) для общения с агентом

Системные требования

КомпонентМинимумРекомендуется
RAM2 ГБ4 ГБ
CPU1 vCPU2 vCPU
Хранилище10 ГБ20 ГБ
Память

Автор статьи запускает Hermes на VPS 2 vCPU / 2 ГБ, но рекомендует не менее 4 ГБ RAM, если вы используете автоматизацию браузера (Playwright/Chromium) или несколько субагентов.

Подключайтесь по SSH, а не через веб-консоль

Браузерные консоли (noVNC) плохо передают некоторые символы (:, @, =) и могут незаметно искажать вставленные команды и API-ключи. Используйте полноценную SSH-сессию.

Подключение и обновление системы

ssh user@server_ip
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg openssl

Установка Docker

Официальный Docker-образ — рекомендуемый Hermes способ установки: образ не хранит состояния, все данные находятся в одной смонтированной папке (/opt/data), а обновление сводится к загрузке нового образа.

Установите Docker Engine и плагин Compose из официального репозитория Docker:

sudo install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
curl -fsSL https://download.docker.com/linux/$ID/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$ID $VERSION_CODENAME stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Проверьте установку:

docker --version
docker compose version

Установка Tailscale (приватный доступ)

Веб-интерфейс Hermes позволяет администрировать всё (API-ключи, конфигурацию, MCP, плагины, выполнение команд через агента). Его никогда нельзя открывать в Интернет: экземпляры, открытые на 0.0.0.0, были скомпрометированы автоматическими сканерами (установка вредоносных SSH-ключей через агента). Поэтому мы делаем его доступным только из вашей приватной сети Tailscale.

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Откройте показанную ссылку аутентификации, чтобы привязать сервер к вашему аккаунту Tailscale, затем получите IP-адрес Tailscale вашего VPS (диапазон 100.x.y.z):

tailscale ip -4

Запишите этот адрес: он будет использоваться как адрес прослушивания веб-интерфейса. Установите Tailscale также на свой компьютер или телефон, чтобы иметь к нему доступ.

Зачем привязывать порт к IP Tailscale?

Docker создаёт собственные правила iptables и обходит брандмауэр UFW для публикуемых портов. Публикация порта на адресе Tailscale (а не на 0.0.0.0) гарантирует, что он недоступен с публичного интерфейса, независимо от состояния брандмауэра.

Подготовка каталогов

sudo mkdir -p /opt/hermes/data
sudo chown -R 10000:10000 /opt/hermes/data
sudo chmod 0750 /opt/hermes/data
cd /opt/hermes

Контейнер запускает агента от непривилегированного пользователя UID/GID 10000: папка данных должна принадлежать ему.

Файл окружения

Создайте файл /opt/hermes/.env, который будет содержать адрес прослушивания и учётные данные веб-интерфейса:

sudo nano /opt/hermes/.env
# Адрес Tailscale сервера (результат `tailscale ip -4`) — НИКОГДА не 0.0.0.0
HERMES_BIND_ADDR=100.x.y.z
HERMES_DASHBOARD_PORT=9119

# Учётные данные веб-интерфейса
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=admin
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=PASSWORD
HERMES_DASHBOARD_BASIC_AUTH_SECRET=SECRET

# Ограничения ресурсов (адаптируйте под ваш VPS: ~1200m для 2 ГБ, 3g для 4 ГБ)
HERMES_MEMORY_LIMIT=1200m
HERMES_CPU_LIMIT=1.5

TZ=Europe/Paris

Сгенерируйте пароль и секрет сессии, затем впишите их в файл:

openssl rand -base64 24 # -> HERMES_DASHBOARD_BASIC_AUTH_PASSWORD
openssl rand -hex 32 # -> HERMES_DASHBOARD_BASIC_AUTH_SECRET
Секрет длиной не менее 16 байт

HERMES_DASHBOARD_BASIC_AUTH_SECRET должен иметь длину не менее 16 байт. Если он короче, модуль аутентификации не активируется, и интерфейс отказывается запускаться с вводящей в заблуждение ошибкой «no auth providers are registered». openssl rand -hex 32 более чем достаточно. Не меняйте этот секрет: его изменение делает недействительными открытые сессии.

Защитите файл — он содержит секреты:

sudo chmod 0600 /opt/hermes/.env

Конфигурация Docker Compose

Создайте /opt/hermes/compose.yaml:

sudo nano /opt/hermes/compose.yaml
services:
hermes:
image: nousresearch/hermes-agent:latest
container_name: hermes
command: gateway run
restart: unless-stopped
stop_grace_period: 30s

# Ни один процесс контейнера не может получить новые привилегии
security_opt:
- no-new-privileges:true
# Удаляет все Linux capabilities по умолчанию...
cap_drop:
- ALL
# ...и возвращает только те, что нужны для инициализации контейнера
cap_add:
- CHOWN
- FOWNER
- DAC_OVERRIDE
- SETUID
- SETGID
- KILL
# Предотвращает ошибки из-за слишком большого числа открытых файлов
ulimits:
nofile:
soft: 4096
hard: 8192

ports:
# Веб-интерфейс публикуется ТОЛЬКО на адресе Tailscale
- "${HERMES_BIND_ADDR}:${HERMES_DASHBOARD_PORT:-9119}:${HERMES_DASHBOARD_PORT:-9119}"

volumes:
# Все данные агента: конфигурация, ключи, память, skills, cron, логи
- ./data:/opt/data
# НИКОГДА не монтируйте /var/run/docker.sock: это эквивалентно root-доступу к хосту

environment:
PUID: "10000"
PGID: "10000"
TZ: "${TZ:-Europe/Paris}"
# Веб-интерфейс (работает под надзором в том же контейнере, что и gateway)
HERMES_DASHBOARD: "1"
HERMES_DASHBOARD_HOST: "0.0.0.0" # только внутри контейнера; на хосте открыт только Tailscale
HERMES_DASHBOARD_PORT: "${HERMES_DASHBOARD_PORT:-9119}"
HERMES_DASHBOARD_BASIC_AUTH_USERNAME: "${HERMES_DASHBOARD_BASIC_AUTH_USERNAME}"
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: "${HERMES_DASHBOARD_BASIC_AUTH_PASSWORD}"
HERMES_DASHBOARD_BASIC_AUTH_SECRET: "${HERMES_DASHBOARD_BASIC_AUTH_SECRET}"
# Защитные ограничения агента
HERMES_WRITE_SAFE_ROOT: "/opt/data" # агент может писать только в свою папку данных
HERMES_YOLO_MODE: "0" # опасные команды по-прежнему требуют подтверждения

shm_size: "256m"

deploy:
resources:
limits:
memory: "${HERMES_MEMORY_LIMIT:-1200m}"
cpus: "${HERMES_CPU_LIMIT:-1.5}"
pids: 512

# Не даёт слишком «разговорчивому» агенту заполнить диск
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Защищённый образ от сообщества

Автор статьи публикует вариант официального образа (DamyrFr/hermes-docker), который, в частности, добавляет rtk (фильтрация вывода команд для снижения расхода токенов) и удаляет setuid-бинарники. Приведённая выше конфигурация повторяет его настройки безопасности с официальным образом.

Первый запуск: мастер настройки

Перед запуском сервиса один раз запустите интерактивный мастер (текстовый интерфейс). Он запросит провайдера моделей, API-ключи и предложит настроить мессенджер (gateway):

cd /opt/hermes
sudo docker compose run --rm hermes setup

В ходе работы мастера:

  1. Провайдер моделей: выберите, например, OpenRouter и вставьте свой API-ключ. Альтернатива: hermes setup --portal с подпиской Nous Portal (300+ моделей и веб-инструменты включены, без управления ключами).
  2. Инструменты: включите веб-поиск и извлечение страниц (см. ниже).
  3. Мессенджер: настройте Discord (см. следующий раздел) — это основной интерфейс общения с агентом.
  4. Малопонятные параметры можно оставить по умолчанию, всё можно изменить позже.

Ключи сохраняются в /opt/hermes/data/.env, а конфигурация — в /opt/hermes/data/config.yaml.

Контроль бюджета с OpenRouter

OpenRouter позволяет установить лимит расходов на каждый API-ключ с периодическим сбросом. Это идеально для личного экземпляра с оплатой по факту использования.

Создание бота Discord (gateway)

Gateway — компонент, связывающий Hermes с вашим мессенджером. Discord — один из самых популярных вариантов: каналы и треды позволяют хорошо организовать общение.

  1. Перейдите в Discord Developer Portal и нажмите New Application.
  2. На вкладке Bot включите следующие Privileged Gateway Intents, затем нажмите Save Changes:
    • Message Content Intent (обязательно: без него бот получает пустые сообщения)
    • Server Members Intent (обязательно)
  3. Там же, в Bot, нажмите Reset Token и скопируйте токен.
  4. Пригласите бота на свой сервер Discord через вкладку Installation (или OAuth2 → URL Generator со scope bot).
  5. Получите свой идентификатор пользователя Discord: включите Режим разработчика (Настройки → Расширенные), затем щёлкните правой кнопкой по своему имени → Копировать ID.

Если вы не сделали этого в мастере, запустите настройку gateway:

sudo docker compose run --rm hermes gateway setup

Или добавьте эти строки напрямую в /opt/hermes/data/.env:

DISCORD_BOT_TOKEN=your-bot-token
DISCORD_ALLOWED_USERS=123456789012345678
Ограничьте доступ к боту

DISCORD_ALLOWED_USERS (или DISCORD_ALLOWED_ROLES) перечисляет единственных людей, которым разрешено отдавать команды агенту. Без этой переменной Hermes из соображений безопасности отказывает всем. Добавляйте только доверенных людей: агент может выполнять команды на сервере.

По умолчанию Hermes отвечает на все ваши личные сообщения, а в каналах — только когда его @упоминают.

Запуск сервиса

cd /opt/hermes
sudo docker compose up -d
sudo docker compose logs -f --tail=100

restart: unless-stopped автоматически перезапускает контейнер после сбоя или перезагрузки VPS (в том числе если интерфейс Tailscale ещё не готов при загрузке: Docker повторяет попытки, пока он не станет доступен).

Убедитесь, что порт опубликован только на адресе Tailscale:

sudo ss -tlnp | grep 9119

В выводе должно быть 100.x.y.z:9119, а не 0.0.0.0:9119.

Затем отправьте личное сообщение своему боту в Discord: он должен ответить.

Доступ к веб-интерфейсу

С устройства, подключённого к вашей сети Tailscale, откройте:

http://100.x.y.z:9119

Войдите с учётными данными, заданными в /opt/hermes/.env. Интерфейс позволяет общаться с агентом, просматривать логи, управлять конфигурацией, MCP, профилями и плагинами, а также содержит Kanban: вы создаёте задачу, агент разбивает её на подзадачи, поручаемые субагентам, и карточки продвигаются автоматически.

Структура данных

Всё состояние агента хранится в /opt/hermes/data (смонтировано в /opt/data внутри контейнера):

ПутьНазначение
config.yamlГлобальные параметры: модели, инструменты, подтверждения, делегирование
.envAPI-ключи (провайдеры моделей, Discord, веб-инструменты…)
auth.jsonАутентификация (OAuth, платформы мессенджеров)
SOUL.mdЛичность агента (имя, тон, манера общения)
skills/Процедуры, которые агент осваивает и улучшает со временем
cron/Задачи по расписанию
state.dbПамять агента: сессии, история… (никогда не изменяйте и не копируйте на работающем агенте)

Настройка агента

Задать личность (SOUL.md)

Файл SOUL.md определяет характер агента и его манеру выражаться. Дайте ему имя и тон: это делает ежедневное общение приятнее.

sudo nano /opt/hermes/data/SOUL.md
# Janet

Ты Janet — услужливая, лаконичная и немного озорная помощница.
Ты отвечаешь по-русски, говоришь по существу и запрашиваешь подтверждение
перед любым необратимым действием.

Выбор моделей

Хороший компромисс — использовать быструю и недорогую модель для общения и более мощную модель для автономной работы субагентов (делегирование). Пример конфигурации в /opt/hermes/data/config.yaml с OpenRouter:

model:
default: deepseek/deepseek-v4.1-flash
provider: openrouter
base_url: https://openrouter.ai/api/v1
api_mode: chat_completions

delegation:
max_iterations: 50
model: z-ai/glm5.3
provider: openrouter
note

Эти модели — примеры из статьи на момент её написания. Ситуация меняется быстро: выбирайте модели, соответствующие вашему бюджету и потребностям. Сменить модель также можно из Discord командой /model.

Второй агент для ревью кода

Чтобы модель не проверяла собственную работу, создайте отдельный профиль с другой моделью (например, Claude Opus), а затем попросите основного агента всегда отдавать ему код на проверку перед тем, как передать его вам:

sudo docker compose run --rm hermes profile create reviewer

Затем профиль настраивается (модель, провайдер) в веб-интерфейсе, в разделе Профили.

Веб-поиск

Для автономного поиска в Интернете агент использует два инструмента:

  • web_search: находит релевантные ссылки. duckduckgo-search работает локально и бесплатно.
  • web_extract: преобразует одну или несколько страниц в Markdown. Tavily предоставляет ключ с бесплатной квотой.

Включите их в веб-интерфейсе или командой sudo docker compose run --rm hermes tools.

Задачи по расписанию (cron)

Hermes поддерживает задачи по расписанию «из коробки». Проще всего запросить их прямо в Discord:

/cron add "every 2h" "Проверь состояние сервера и предупреди меня в случае аномалии"
/cron add "every 1d" "Сделай обзор новостей DevOps и кратко изложи 5 самых важных"

Идеи использования: автоматический мониторинг новостей из нескольких источников, регулярная загрузка хранилища Obsidian («второй мозг»), периодические отчёты. По умолчанию опасная команда, запущенная cron-задачей, отклоняется (approvals.cron_mode: deny).

Безопасность: рекомендации

  • Веб-интерфейс: только через Tailscale (или другой VPN), никогда на 0.0.0.0, всегда с аутентификацией.
  • Подтверждения: оставьте approvals.mode: smart (по умолчанию) или переключитесь на manual в config.yaml. Никогда не используйте --yolo / approvals.mode: off для агента, подключённого к мессенджеру.
  • Доступ через мессенджер: ограничьте DISCORD_ALLOWED_USERS только собой.
  • Сокет Docker: никогда не монтируйте его в контейнер.
  • API-ключи: используйте отдельные ключи с лимитом расходов и будьте осторожны с правами, предоставляемыми интеграциям (GitHub, e-mail, MCP…).
  • Брандмауэр: открывайте на публичном интерфейсе только SSH. См. Защита сервера Linux.

Полезные команды

ДействиеКоманда (из /opt/hermes)
Просмотр логовsudo docker compose logs -f --tail=100
Перезапускsudo docker compose restart
Остановкаsudo docker compose down
Повторный запуск мастераsudo docker compose run --rm hermes setup
Смена моделиsudo docker compose run --rm hermes model
Диагностикаsudo docker compose run --rm hermes doctor
tip

Остановите сервис (docker compose down) перед использованием docker compose run для изменения конфигурации, затем снова запустите его командой docker compose up -d.

Обновление

Поскольку образ не хранит состояния, достаточно загрузить новую версию и пересоздать контейнер:

cd /opt/hermes
sudo docker compose pull
sudo docker compose up -d

Резервное копирование

Весь агент (конфигурация, ключи, память, skills, cron) находится в /opt/hermes/data. Базу state.db нельзя копировать во время работы агента: остановите его на время создания архива.

cd /opt/hermes
sudo docker compose stop
sudo tar czf /root/hermes-backup-$(date +%F).tar.gz -C /opt/hermes data .env compose.yaml
sudo docker compose start

Храните эти архивы вне сервера: они содержат ваши API-ключи.

Устранение неполадок

Веб-интерфейс не запускается («no auth providers are registered»)

  • Убедитесь, что HERMES_DASHBOARD_BASIC_AUTH_SECRET имеет длину не менее 16 байт (используйте openssl rand -hex 32).
  • Убедитесь, что все три переменные HERMES_DASHBOARD_BASIC_AUTH_* заданы в /opt/hermes/.env.

Контейнер не запускается

  • Просмотрите логи: sudo docker compose logs --tail=200
  • Проверьте права на папку данных: ls -ln /opt/hermes (владелец 10000:10000)
  • Убедитесь, что HERMES_BIND_ADDR совпадает с tailscale ip -4 и что Tailscale активен: tailscale status
  • Если после обновления при инициализации появляется ошибка прав доступа, временно закомментируйте блок cap_drop/cap_add, чтобы подтвердить причину, затем добавьте только недостающую capability.

Бот Discord в сети, но не отвечает

  • Убедитесь, что Message Content Intent включён в Developer Portal.
  • Убедитесь, что ваш идентификатор указан в DISCORD_ALLOWED_USERS.
  • В канале не забудьте @упомянуть бота.
  • Перезапускайте после каждого изменения: sudo docker compose restart

«API key not set»

Повторно настройте провайдера: sudo docker compose run --rm hermes model, затем перезапустите сервис.

Ссылки