Установка 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…) для общения с агентом
Системные требования
| Компонент | Минимум | Рекомендуется |
|---|---|---|
| RAM | 2 ГБ | 4 ГБ |
| CPU | 1 vCPU | 2 vCPU |
| Хранилище | 10 ГБ | 20 ГБ |
Автор статьи запускает Hermes на VPS 2 vCPU / 2 ГБ, но рекомендует не менее 4 ГБ RAM, если вы используете автоматизацию браузера (Playwright/Chromium) или несколько субагентов.
Браузерные консоли (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 также на свой компьютер или телефон, чтобы иметь к нему доступ.
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
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
В ходе работы мастера:
- Провайдер моделей: выберите, например, OpenRouter и вставьте свой API-ключ. Альтернатива:
hermes setup --portalс подпиской Nous Portal (300+ моделей и веб-инструменты включены, без управления ключами). - Инструменты: включите веб-поиск и извлечение страниц (см. ниже).
- Мессенджер: настройте Discord (см. следующий раздел) — это основной интерфейс общения с агентом.
- Малопонятные параметры можно оставить по умолчанию, всё можно изменить позже.
Ключи сохраняются в /opt/hermes/data/.env, а конфигурация — в /opt/hermes/data/config.yaml.
OpenRouter позволяет установить лимит расходов на каждый API-ключ с периодическим сбросом. Это идеально для личного экземпляра с оплатой по факту использования.
Создание бота Discord (gateway)
Gateway — компонент, связывающий Hermes с вашим мессенджером. Discord — один из самых популярных вариантов: каналы и треды позволяют хорошо организовать общение.
- Перейдите в Discord Developer Portal и нажмите New Application.
- На вкладке Bot включите следующие Privileged Gateway Intents, затем нажмите Save Changes:
- Message Content Intent (обязательно: без него бот получает пустые сообщения)
- Server Members Intent (обязательно)
- Там же, в Bot, нажмите Reset Token и скопируйте токен.
- Пригласите бота на свой сервер Discord через вкладку Installation (или OAuth2 → URL Generator со scope
bot). - Получите свой идентификатор пользователя 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 | Глобальные параметры: модели, инструменты, подтверждения, делегирование |
.env | API-ключи (провайдеры моделей, 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
Эти модели — примеры из статьи на момент её написания. Ситуация меняется быстро: выбирайте модели, соответствующие вашему бюджету и потребностям. Сменить модель также можно из 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 |
Остановите сервис (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, затем перезапустите сервис.