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

Есть два различных способа, которыми 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 обеспечивает API-сервер, совместимый с OpenAI шлюза и эндпоинт проверки здоровья. Это необязательно, если вы используете только чат-платформы (Telegram, Discord и т.д.), но обязательно, если вам нужна панель управления или внешние инструменты для доступа к шлюзу.

Примечание: API-сервер блокируется по API_SERVER_ENABLED=true. Чтобы открыть его за подключением 127.0.0.1 внутри контейнера, также установите API_SERVER_HOST=0.0.0.0 и API_SERVER_KEY (минимум 8 символов — сгенерируйте с помощью openssl rand -hex 32). Пример:

docker run -d \
  --name hermes \
  --restart unless-stopped \
  -v ~/.hermes:/opt/data \
  -p 8642:8642 \
  -e API_SERVER_ENABLED=true \
  -e API_SERVER_HOST=0.0.0.0 \
  -e API_SERVER_KEY=your_api_key_here \
  -e API_SERVER_CORS_ORIGINS='*' \
  nousresearch/hermes-agent gateway run

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

Запуск панели управления

Встроенная веб-панель управления работает как опциональный фоновый процесс внутри того же контейнера, что и шлюз. Установите 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 в фоновом режиме (работает от имени не-root пользователя hermes) перед выполнением основной команды через exec. Вывод панели управления имеет префикс [dashboard] в docker logs, что позволяет легко отделить его от журналов-шлюза.

Переменная окружения Описание По умолчанию
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. Он отображается в каталоге ~/.hermes/ на вашем хосте и содержит:

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

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

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

# Рабочий профиль
docker run -d \
  --name hermes-work \
  --restart unless-stopped \
  -v ~/.hermes-work:/opt/data \
  -p 8642:8642 \
  nousresearch/hermes-agent gateway run

# Личный профиль
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"   # API шлюза
      - "9119:9119"   # панель управления (доступна только при HERMES_DASHBOARD=1)
    volumes:
      - ~/.hermes:/opt/data
    environment:
      - HERMES_DASHBOARD=1
      # Раскомментируйте, чтобы передать конкретные переменные окружения вместо использования файла.env:
      # - 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], что позволяет легко отфильтровать его из журналов шлюза.

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

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

Ресурс Минимум нравится
Память 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 (см. Запуск панели управления) - Затем запускается Гермес с переданными аргументами.:::предупреждение Не переопределяйте точку входа образа, если только вы не сохранили /opt/hermes/docker/entrypoint.sh в цепочке команды. Точка входа сдает привилегии root пользователю hermes перед созданием файлов состояния шлюза. Запуск hermesgatewayrun от root внутри официального образа по умолчанию запрещен, так как это может оставить файлы, отказ root, в /opt/data и нарушить последующий запуск панели управления или шлюза. Установите HERMES_ALLOW_ROOT_GATEWAY=1 только в том случае, если вы осознанно принимаете этот риск.

Обновление

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

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

docker compose pull
docker compose up -d

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

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

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

Подключение к локальным серверам инференса (vLLM, Ollama и т.д.)

При запуске Hermes в Docker, если ваш серверный сервер (vLLM, Ollama, text-generation-inference и т.д.) также работает на хосте или в другом контейнере, настройка сети требует особого внимания.

Docker Compose (рекомендуется)

Поместите оба сервиса в одну сеть Docker. Это самый надежный подход:

services:
  vllm:
    image: vllm/vllm-openai:latest
    container_name: vllm
    command: >
      --model Qwen/Qwen2.5-7B-Instruct
      --served-model-name my-model
      --host 0.0.0.0
      --port 8000
    ports:
      - "8000:8000"
    networks:
      - hermes-net
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]

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

networks:
  hermes-net:
    driver: bridge

Затем в вашем ~/.hermes/config.yaml воспользуйтесь имя контейнера в качестве имени хоста:

model:
  provider: custom
  model: my-model
  base_url: http://vllm:8000/v1
  api_key: "none"
```<div class="admonition admonition-tip"><p class="admonition-title">💡 Tip</p> Ключевые моменты
- Используйте **имя контейнера** (`vllm`) в качестве имени хоста — не `localhost` или `127.0.0.1`, которые ссылаются на сам контейнер Hermes.
- Значение `model` должно совпасть с `-served-model-name`, переданным вами vLLM.
- Установите `api_key` в любой непустой текст (vLLM требует заголовка, но не позже его по умолчанию).
- **Не** добавляйте завершающий слэш в `base_url`.</div>
### Отдельный запуск Docker (без Compose)

Если ваш серверный сервер работает непосредственно на хосте (не в Docker), используйте `host.docker.internal` в macOS/Windows или `--network Host` в Linux:

**macOS/Windows:**
```sh
docker run -d \
  --name hermes \
  -v ~/.hermes:/opt/data \
  -p 8642:8642 \
  nousresearch/hermes-agent gateway run
# config.yaml
model:
  provider: custom
  model: my-model
  base_url: http://host.docker.internal:8000/v1
  api_key: "none"

Linux (хост-сеть):

docker run -d \
  --name hermes \
  --network host \
  -v ~/.hermes:/opt/data \
  nousresearch/hermes-agent gateway run
# config.yaml
model:
  provider: custom
  model: my-model
  base_url: http://127.0.0.1:8000/v1
  api_key: "none"
```:::предупреждение
При использовании `--network host` флага `-p` отключается — все порты-контейнеры открываются напрямую на хосте.</div>
### Проверка подключения

Изнутри контейнера Hermes убедитесь, что сервер вывода доступен:
```sh
docker exec hermes curl -s http://vllm:8000/v1/models

Вы должны увидеть JSON-ответ со списком обслуживаемых моделей. Если это не сработало, проверьте: 1. Оба контейнера находятся в одной сети Docker (docker Network Inspect Hermes-Net) 2. Сервер вывода слушает 0.0.0.0, а не 127.0.0.1 3. Номер на открытом воздухе

Оллама

Оллама работает красиво. Если Ollama работает на хосте, воспользуйтесь host.docker.internal:11434 (macOS/Windows) или 127.0.0.1:11434 (Linux с --network Host). Если Оллама работает в своем собственном контейнере в той же сети Docker:

model:
  provider: custom
  model: llama3
  base_url: http://ollama:11434/v1
  api_key: "none"

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

Контейнер сразу завершает работу

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

Ошибки "Отказано в доступе"

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

chmod -R 755 ~/.hermes

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

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

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          # Последние логи
docker run -it --rm nousresearch/hermes-agent:latest version     # Проверить версию
docker stats hermes                    # Использование ресурсов