Агент Hermes: настройка безголового сервера и удалённого рабочего стола

Сервер Headless Hermes с доступом по удаленному рабочему столу

Содержимое страницы

Запуск агента Hermes на сервере без графического интерфейса (headless) при подключении с настольного клиента на другом компьютере требует наличия двух процессов на сервере и одного клиентского соединения.

Архитектура разделяет бэкенд Hermes на два серверных процесса и один клиентский интерфейс. Бэкенд hermes serve обрабатывает соединения API и панели управления, в то время как процесс hermes gateway run независимо управляет каналами сообщений. Настольный клиент подключается к бэкенду serve, а не к шлюзу.

flowchart LR subgraph Server["СЕРВЕР БЕЗ ГРАФИЧЕСКОГО ИНТЕРФЕЙСА"] serve["hermes serve
--host 0.0.0.0
:9119"] gateway["hermes gateway run
Telegram, Discord, Slack"] end subgraph Client["НАСТОЛЬНЫЙ ПК"] desktop["hermes desktop
(WebSocket connection)"] end desktop <--->|WebSocket| serve gateway -.->|Shares ~/.hermes/| serve

Два процесса на сервере, одно приложение на клиенте. Оба серверных процесса используют одну и ту же конфигурацию ~/.hermes/, навыки, память и сессии. Периодические задачи (Cron jobs) выполняются на сервере, где работает шлюз.

Архитектура сервера агента Hermes без графического интерфейса

Для установки, настройки провайдера и первоначальной конфигурации начните с руководства Hermes AI Assistant — Установка, настройка, рабочий процесс и устранение неполадок.

Настройка сервера без графического интерфейса

1. Настройка аутентификации

Базовая аутентификация обеспечивает достаточную защиту для доверенной локальной сети (LAN). Добавьте учетные данные в файл окружения:

cat >> ~/.hermes/.env << 'EOF'
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=admin
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=choose-a-strong-password
HERMES_DASHBOARD_BASIC_AUTH_SECRET=$(openssl rand -base64 32)
EOF
chmod 600 ~/.hermes/.env

Файл .env находится рядом с config.yaml в директории ~/.hermes/. Hermes разрешает конфигурацию в следующем порядке: сначала переопределения из командной строки (CLI), затем config.yaml, затем .env, и наконец встроенные значения по умолчанию. Секреты должны храниться в .env.

2. Запуск бэкенда

Запустите бэкенд serve на всех интерфейсах:

hermes serve --host 0.0.0.0 --port 9119

Бэкенд слушает порт 9119 и принимает WebSocket-соединения от настольного клиента. Убедитесь, что он запущен, выполнив быструю проверку статуса:

curl -s http://localhost:9119/api/status | jq '.auth_required, .auth_providers'
# Ожидаемый результат: true  "basic"

3. Запуск как systemd-сервис

Для создания постоянного сервера, который сохраняется после перезагрузки, установите пользовательский systemd-сервис. Создайте файл юнита в /etc/systemd/user/hermes-serve.service:

[Unit]
Description=Hermes Agent Serve Backend

[Service]
EnvironmentFile=%h/.hermes/.env
ExecStart=/home/rg/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main serve --host 0.0.0.0 --port 9119
Restart=on-failure

[Install]
WantedBy=default.target

Перезагрузите демон, включите сервис и запустите его:

systemctl --user daemon-reload
systemctl --user enable hermes-serve
systemctl --user start hermes-serve

Проверьте статус сервиса:

systemctl --user status hermes-serve

4. Запуск шлюза

Шлюз — это отдельный процесс, который обрабатывает каналы сообщений: Telegram, Discord, Slack и другие. Запустите его независимо:

hermes gateway run

Шлюз и бэкенд serve — это два отдельных процесса. Шлюз управляет сессиями, запускает периодические задачи (cron jobs) и маршрутизирует сообщения. Бэкенд serve предоставляет интерфейс API для подключений настольного клиента и веб-панели управления. Они используют одну и ту же домашнюю директорию, но работают независимо.

Полный список команд и подкоманд шлюза см. в шпаргалке по CLI агента Hermes. Если ваш основной интерфейс — мобильные сообщения, дополните эту настройку голосовым управлением Hermes с телефона для рабочих процессов с приоритетом на голос поверх того же процесса шлюза.

5. Проверка бэкенда

Убедитесь, что бэкенд отвечает и аутентификация активна:

curl -s http://localhost:9119/api/status | jq '.auth_required, .auth_providers'

Ожидаемый вывод:

true
"basic"

Если аутентификация не включена, в ответе для auth_required будет показано false. Проверьте, что файл .env содержит правильные переменные и что сервис был перезапущен после изменений конфигурации.

Подключение с настольного клиента

Вариант A: Приложение Hermes Desktop

Установите Hermes Desktop с официального сайта. Запустите приложение, перейдите в Настройки → Шлюз → Удаленный шлюз и введите адрес сервера:

http://<ip-адрес-сервера>:9119

Войдите с помощью имени пользователя и пароля, настроенных на сервере.

В качестве альтернативы установите удаленный URL через переменную окружения:

HERMES_DESKTOP_REMOTE_URL=http://<ip-адрес-сервера>:9119 hermes desktop

Вариант B: Веб-панель управления

Откройте http://<ip-адрес-сервера>:9119 в браузере и войдите с учетными данными базовой аутентификации. Веб-панель управления предоставляет интерфейс на основе браузера для взаимодействия с бэкендом Hermes, не требуя установки настольного приложения.

Вариант C: Командная строка (CLI)

Из терминала настольного ПК настройте удаленный URL через настройки настольного приложения или переменную окружения HERMES_DESKTOP_REMOTE_URL. Интерфейс командной строки подключается через тот же канал WebSocket, что и настольное приложение.

Сетевые аспекты и безопасность

Сценарий Рекомендация
Доверенная локальная сеть --host 0.0.0.0 + базовая аутентификация
Доступ из интернета Используйте Tailscale (--host <tailscale-ip>) или провайдера OAuth
Брандмауэр Откройте порт 9119 TCP на сервере

Для доверенной локальной сети базовой аутентификации на 0.0.0.0 достаточно. Если сервер доступен из интернета, используйте Tailscale для привязки к IP-адресу Tailscale вместо 0.0.0.0 или настройте провайдера OAuth для более сильной аутентификации. Всегда открывайте порт 9119 TCP в брандмауэре сервера, когда бэкенду необходимо принимать внешние соединения.

Важные различия между процессами

Понимание разделения между двумя серверными процессами предотвращает распространенные ошибки конфигурации:

  • hermes serve — Бэкенд, к которому подключаются настольное приложение и веб-панель управления. Обрабатывает поверхность API и WebSocket-соединения.
  • hermes gateway run — Процесс, который обрабатывает Telegram, Discord, Slack и другие каналы сообщений. Управляет сессиями, запускает периодические задачи (cron jobs) и маршрутизирует сообщения.
  • Это два отдельных процесса на сервере. Они используют одну и ту же конфигурацию ~/.hermes/, навыки, память и сессии, но работают независимо.
  • Периодические задачи (Cron jobs) выполняются на сервере, где работает шлюз.
  • Профили, навыки и память настраиваются на стороне сервера. Клиент подключается к уже настроенному бэкенду.

Для настройки, ориентированной на профили, и навыков, адаптированных к различным ролям в производственной среде, см. Навыки помощника Hermes AI для реальных производственных настроек.

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

Настольный клиент не может подключиться к серверу

  1. Убедитесь, что бэкенд запущен: systemctl --user status hermes-serve
  2. Проверьте, открыт ли порт: ss -tlnp | grep 9119
  3. Протестируйте с сервера: curl -s http://localhost:9119/api/status
  4. Протестируйте с клиентской машины: curl -s http://<ip-адрес-сервера>:9119/api/status
  5. Если тест клиента не удался, проверьте правила брандмауэра: sudo ufw status или sudo iptables -L

Ошибка аутентификации

  1. Убедитесь, что у файла .env правильные права доступа: ls -la ~/.hermes/.env (должны быть 600)
  2. Проверьте, был ли сгенерирован секрет: grep HERMES_DASHBOARD_BASIC_AUTH_SECRET ~/.hermes/.env
  3. Перезапустите сервис после изменения конфигурации: systemctl --user restart hermes-serve

Шлюз не отвечает на сообщения

Шлюз — это процесс, отличный от бэкенда. Если настольный клиент подключается, но платформы обмена сообщениями не работают:

  1. Проверьте статус шлюза: hermes gateway status
  2. Запустите шлюз, если он остановлен: hermes gateway start
  3. Просмотрите журналы: hermes logs gateway -f

Ссылки

Эта статья является частью кластера Системы ИИ, который охватывает самодостаточных ассистентов, архитектуру поиска, локальную инфраструктуру LLM и наблюдаемость.

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.