Агент Гермеса — Докер

Существует два различных способа взаимодействия Docker с агентом Hermes:

  1. Запуск Hermes в Docker — сам агент запускается внутри контейнера (основная тема этой страницы).
  2. Docker как серверная часть терминала — агент запускается на вашем хосте, но выполняет каждую команду внутри одного постоянного контейнера песочницы Docker, который сохраняется при вызовах инструментов, /new и субагентах на протяжении всего процесса Hermes (см. Конфигурация → Docker Backend)

На этой странице описан вариант 1. Контейнер хранит все пользовательские данные (конфигурацию, ключи API, сеансы, навыки, воспоминания) в одном каталоге, смонтированном с хоста в /opt/data. Сам образ не имеет состояния и может быть обновлен путем получения новой версии без потери конфигурации.

Быстрый старт

Если вы впервые запускаете агент Hermes, создайте каталог данных на хосте и запустите контейнер в интерактивном режиме, чтобы запустить мастер установки:

mkdir -p ~/.hermes
docker run -it --rm \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent setup

Вы попадете в мастер установки, который запросит у вас ключи API и запишет их в ~/.hermes/.env. Вам нужно сделать это только один раз. На этом этапе настоятельно рекомендуется настроить систему чата для работы шлюза.

Работа в режиме шлюза

После настройки запустите контейнер в фоновом режиме в качестве постоянного шлюза (Telegram, Discord, Slack, WhatsApp и т. д.):

docker run -d \
  --name hermes \
  --restart unless-stopped \
  -v ~/.hermes:/opt/data \
  -p 8642:8642 \
  nousresearch/hermes-agent gateway run

Порт 8642 предоставляет доступ к OpenAI-совместимому API-серверу и конечной точке работоспособности шлюза. Это необязательно, если вы используете только платформы чата (Telegram, Discord и т. д.), но необходимо, если вы хотите, чтобы панель управления или внешние инструменты подключались к шлюзу.

Открытие любого порта на компьютере с выходом в Интернет представляет собой угрозу безопасности. Не следует этого делать, если вы не понимаете риски.

Запуск панели мониторинга

Встроенная веб-панель мониторинга работает как дополнительный побочный процесс внутри того же контейнера, что и шлюз. Установите HERMES_DASHBOARD=1 и откройте порт 9119 рядом с портом 8642 шлюза:

docker run -d \
  --name hermes \
  --restart unless-stopped \
  -v ~/.hermes:/opt/data \
  -p 8642:8642 \
  -p 9119:9119 \
  -e HERMES_DASHBOARD=1 \
  nousresearch/hermes-agent gateway run

Точка входа запускает hermes Dashboard в фоновом режиме (работает от имени пользователя hermes без полномочий root) перед выполнением основной команды. Вывод информационной панели имеет префикс «[dashboard]» в журналах Docker, поэтому его легко отделить от журналов шлюза.

Переменная среды Описание По умолчанию
HERMES_DASHBOARD Установите значение 1 (или true/yes), чтобы запускать панель мониторинга вместе с основной командой (не установлено — панель не запущена)
HERMES_DASHBOARD_HOST Привязка адреса для HTTP-сервера панели мониторинга 0.0.0.0
HERMES_DASHBOARD_PORT Порт для HTTP-сервера приборной панели 9119
HERMES_DASHBOARD_TUI Установите значение «1», чтобы открыть вкладку «Чат» в браузере (встроенная «hermes --tui» через PTY/WebSocket) (не установлено)

Значение по умолчанию HERMES_DASHBOARD_HOST=0.0.0.0 требуется, чтобы хост мог получить доступ к информационной панели через опубликованный порт; В этом случае точка входа автоматически передает --insecure на hermes Dashboard. Переопределите значение «127.0.0.1», если вы хотите ограничить доступ к панели мониторинга только внутри контейнера (например, за обратным прокси-сервером в боковой панели).:::примечание Побочный процесс информационной панели не контролируется — в случае сбоя он остается неактивным до перезапуска контейнера. Запуск его как отдельного контейнера не поддерживается: для обнаружения активности шлюза панели мониторинга требуется общее пространство имен PID с процессом шлюза.

Запуск в интерактивном режиме (чат CLI)

Чтобы открыть сеанс интерактивного чата с работающим каталогом данных:

docker run -it --rm \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent

Или, если вы уже открыли терминал в работающем контейнере (например, через Docker Desktop), просто запустите:

/opt/hermes/.venv/bin/hermes

Постоянные тома

Том /opt/data является единственным источником правды для всего состояния Гермеса. Он отображается в каталог ~/.hermes/ вашего хоста и содержит:

Путь Содержание
.env Ключи и секреты API
config.yaml Все конфигурации Гермеса
ДУША.md Личность/личность агента
сессии/ История разговора
воспоминания/ Постоянное хранилище памяти
навыки/ Установленные навыки
крон/ Определения плановых должностей
крючки/ Крючки событий
журналы/ Журналы выполнения
скины/ Пользовательские скины CLI
Никогда не запускайте два контейнера шлюза Hermes в одном и том же каталоге данных одновременно — файлы сеансов и хранилища памяти не предназначены для одновременного доступа к записи.
## Поддержка нескольких профилей

Hermes поддерживает несколько профилей — отдельные каталоги ~/.hermes/, которые позволяют запускать независимые агенты (разные ДУШИ, навыки, память, сеансы, учетные данные) из одной установки. При работе в Docker не рекомендуется использовать встроенную многопрофильную функцию Hermes.

Вместо этого рекомендуемый шаблон — один контейнер на профиль, при этом каждый контейнер привязывает свой собственный каталог хоста как /opt/data:

# Work profile
docker run -d \
  --name hermes-work \
  --restart unless-stopped \
  -v ~/.hermes-work:/opt/data \
  -p 8642:8642 \
  nousresearch/hermes-agent gateway run

# Personal profile
docker run -d \
  --name hermes-personal \
  --restart unless-stopped \
  -v ~/.hermes-personal:/opt/data \
  -p 8643:8642 \
  nousresearch/hermes-agent gateway run

Зачем разделять контейнеры по профилям в Docker:

В Docker Compose это просто означает объявление одной службы для каждого профиля с разными container_name, volumes и ports:

services:
  hermes-work:
    image: nousresearch/hermes-agent:latest
    container_name: hermes-work
    restart: unless-stopped
    command: gateway run
    ports:
      - "8642:8642"
    volumes:
      - ~/.hermes-work:/opt/data

  hermes-personal:
    image: nousresearch/hermes-agent:latest
    container_name: hermes-personal
    restart: unless-stopped
    command: gateway run
    ports:
      - "8643:8642"
    volumes:
      - ~/.hermes-personal:/opt/data

Пересылка переменных среды

Ключи API считываются из /opt/data/.env внутри контейнера. Вы также можете передавать переменные среды напрямую:

docker run -it --rm \
  -v ~/.hermes:/opt/data \
  -e ANTHROPIC_API_KEY="sk-ant-..." \
  -e OPENAI_API_KEY="sk-..." \
  nousresearch/hermes-agent

Прямые флаги -e переопределяют значения из .env. Это полезно для интеграции CI/CD или менеджера секретов, когда вам не нужны ключи на диске.

Пример Docker Compose

Для постоянного развертывания как со шлюзом, так и с информационной панелью удобно использовать docker-compose.yaml:

services:
  hermes:
    image: nousresearch/hermes-agent:latest
    container_name: hermes
    restart: unless-stopped
    command: gateway run
    ports:
      - "8642:8642"   # gateway API
      - "9119:9119"   # dashboard (only reached when HERMES_DASHBOARD=1)
    volumes:
      - ~/.hermes:/opt/data
    environment:
      - HERMES_DASHBOARD=1
      # Uncomment to forward specific env vars instead of using.env file:
      # - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
      # - OPENAI_API_KEY=${OPENAI_API_KEY}
      # - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
    deploy:
      resources:
        limits:
          memory: 4G
          cpus: "2.0"

Начните с docker compose up -d и просмотрите журналы с docker Compose logs -f. Вывод информационной панели имеет префикс «[dashboard]», поэтому его легко фильтровать из журналов шлюза.

Ограничения ресурсов

Контейнеру Гермеса требуются умеренные ресурсы. Рекомендуемый минимум:

Ресурс Минимум Рекомендуется
Память 1 ГБ 2–4 ГБ
процессор 1 ядро ​​ 2 ядра
Диск (объем данных) 500 МБ 2+ ГБ (растет в зависимости от сеансов/навыков)

Автоматизация браузера (Playwright/Chromium) — функция, требующая больше всего памяти. Если вам не нужны инструменты браузера, достаточно 1 ГБ. При активных инструментах браузера выделите не менее 2 ГБ.

Установите ограничения в Docker:

docker run -d \
  --name hermes \
  --restart unless-stopped \
  --memory=4g --cpus=2 \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent gateway run

Что делает Dockerfile

Официальный образ основан на Debian:13.4 и включает в себя:

Скрипт точки входа (docker/entrypoint.sh) загружает том данных при первом запуске: - Создает структуру каталогов («сессии/», «воспоминания/», «навыки/» и т. д.) - Копирует .env.example.env, если .env не существует. - Копирует файл config.yaml по умолчанию, если он отсутствует. - Копирует файл SOUL.md по умолчанию, если он отсутствует. - Синхронизирует связанные навыки с использованием подхода на основе манифеста (сохраняет пользовательские изменения) - При необходимости запускает hermes Dashboard в качестве фонового побочного процесса, если HERMES_DASHBOARD=1 (см. Запуск приборной панели) - Затем запускается hermes с любыми аргументами, которые вы передаете.

Обновление

Извлеките последний образ и воссоздайте контейнер. Ваш каталог данных нетронут.

docker pull nousresearch/hermes-agent:latest
docker rm -f hermes
docker run -d \
  --name hermes \
  --restart unless-stopped \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent gateway run

Или с помощью Docker Compose:

docker compose pull
docker compose up -d

Навыки и файлы учетных данных

При использовании Docker в качестве среды выполнения (не описанных выше методов, а когда агент запускает команды внутри песочницы Docker — см. Конфигурация → Docker Backend), Hermes повторно использует один долгоживущий контейнер для всех вызовов инструментов и автоматически привязывает каталог навыков (~/.hermes/skills/) и все файлы учетных данных, объявленные навыками, в этот контейнер как тома, доступные только для чтения. Сценарии навыков, шаблоны и ссылки доступны внутри песочницы без ручной настройки, а поскольку контейнер сохраняется в течение всего срока действия процесса Hermes, любые устанавливаемые вами зависимости или записываемые вами файлы остаются до следующего вызова инструмента.

Такая же синхронизация происходит для SSH и модальных бэкэндов — файлы навыков и учетных данных загружаются через rsync или API модального монтирования перед каждой командой.

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

Контейнер немедленно завершает работу

Проверьте журналы: docker logs Hermes. Распространенные причины: - Отсутствует или недействителен файл .env — сначала запустите в интерактивном режиме, чтобы завершить настройку. - Конфликты портов при работе с открытыми портами.

Ошибки «Отказано в разрешении»

Точка входа в контейнер передает привилегии пользователю Hermes без полномочий root (UID 10000) через gosu. Если ваш хост ~/.hermes/ принадлежит другому UID, установите HERMES_UID/HERMES_GID в соответствии с пользователем вашего хоста или убедитесь, что каталог данных доступен для записи:

chmod -R 755 ~/.hermes

Инструменты браузера не работают

Драматургу нужна общая память. Добавьте --shm-size=1g в команду запуска Docker:

docker run -d \
  --name hermes \
  --shm-size=1g \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent gateway run

Шлюз не подключается повторно после проблем с сетью

Флаг --restart if-stopped обрабатывает большинство временных сбоев. Если шлюз завис, перезапустите контейнер:

docker restart hermes

Проверка работоспособности контейнера

docker logs --tail 50 hermes          # Recent logs
docker run -it --rm nousresearch/hermes-agent:latest version     # Verify version
docker stats hermes                    # Resource usage