Есть два различных способа, которыми Docker взаимодействует с агентом Hermes:
Запуск Hermes В Docker — сам агент работает внутри контейнера (основной фокус этой страницы)
Docker как терминальный бэкенд — агент на вашем хосте, но выполняется каждую команду внутри одного постоянного контейнера-песочницы Docker, который сохраняется между вызовами инструментов, /new и под-агентами во время жизни процесса Hermes (см. Конфигурация → Docker Backend)
По этому варианту вариант 1. Контейнер хранит все пользовательские данные (конфигурация, API-ключи, сессия, навыки, воспоминания) в единой директории, смонтированной с хоста в /opt/data. Сам образ не имеет состояния и может быть обновлен посредством загрузки новой версии без потери конфигурации.
Быстрый старт
Если вы впервые запустите агент Hermes, создайте каталог данных на хосте и запустите контейнер в интерактивном режиме для работы с настройками мастера:
Это запустит мастер настройки, который запросит ваши API-ключи и запишет их в ~/.hermes/.env. Это нужно сделать только один раз. На этом этапе настоятельно рекомендуется настроить чат-систему для работы шлюза.
Запуск в режиме шлюза
После настройки запустите контейнер в фоновом режиме в качестве постоянного шлюза (Telegram, Discord, Slack, WhatsApp и т.д.):
Порт 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). Пример:
Открытие любого порта на машине, выход в Интернет, представляет собой полную безопасность. Не делайте этого, если вы не понимаете рисков.
Запуск панели управления
Встроенная веб-панель управления работает как опциональный фоновый процесс внутри того же контейнера, что и шлюз. Установите HERMES_DASHBOARD=1 и порт перехода 9119 вместе с портом шлюза 8642:
Точка запуска запускает 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 Desktop), просто выполните:
/opt/hermes/.venv/bin/hermes
Постоянные тома
Том /opt/data — это ручная посуда для всего состояния Hermes. Он отображается в каталоге ~/.hermes/ на вашем хосте и содержит:
Путь
Содержимое
.env
API-ключи и секреты
config.yaml
Вся конструкция Гермеса
ДУША.md
Личность/ идентичность агента
сессии/
История разговоров
воспоминания/
Постоянное хранилище воспоминаний
навыки/
Установленные навыки
крон/
Определение запланированных задач
крючки/
Хуки события
журналы/
Логи выполнения
скины/
Пользовательские настройки CLI
Никогда не запускайте два контейнера шлюза Hermes одновременно с одной и той же директорией данных — файлы сессий и память хранилища не соответствуют одновременным записям.
## Поддержка нескольких профилей
Поддержка Hermes несколько профилей — создание директорий ~/.hermes/, которые позволяют запускать независимых агентов (разные SOUL, навыки, память, сеансы, учетные данные) из одной установки. При запуске в Docker не рекомендуется использовать встроенную функцию многопрофильности Hermes.
Вместо этого рекомендуется шаблон один контейнер в профиле, где каждый контейнер монтирует свой собственный каталог хоста как /opt/data:
# Рабочий профиль
dockerrun-d\--namehermes-work\--restartunless-stopped\-v~/.hermes-work:/opt/data\-p8642:8642\nousresearch/hermes-agentgatewayrun
# Личный профиль
dockerrun-d\--namehermes-personal\--restartunless-stopped\-v~/.hermes-personal:/opt/data\-p8643:8642\nousresearch/hermes-agentgatewayrun
Почему следует использовать контейнеры вместо профиля в Docker:
Изоляция — каждый контейнер имеет свою файловую систему, таблицу процессов и ограничения ресурсов. Сбой, изменение зависимости или вышедшая из-под контроля сессия в одном профиле не связана с другим.
Независимый жизненный цикл — обновляйте, перезапускайте, приостанавливайте или откатывайте каждого агента отдельно («docker restart hermes-work» не затронет «hermes-personal»).
Чистое разделение портов и сетей — каждый шлюз привязывается к своему порту хоста; нет риска возникновения серьезных помех между чат-платформами или API-серверами.
Более простая модель — контейнер и есть профиль. Зарезервированные копии, поездки и права доступа к смонтированной директории без необходимости помнить дополнительные флаги --profile.
Избегает риска одновременной записи — предупреждение выше о недопустимости запуска двух шлюзов с одной директорией данных, которые по-прежнему применимы к профилям в одном контейнере.
В Docker Compose это объявление одного сервиса в профиле с указанием container_name, volumes и ports:
Флаги -e напрямую переопределяют значения .env. Это полезно для интеграций CI/CD или менеджеров секретов, когда вам не нужно хранить ключи на диске.
Пример Docker Compose
Для постоянного развертывания с шлюзом и панелью управления удобен файл docker-compose.yaml:
services:hermes:image:nousresearch/hermes-agent:latestcontainer_name:hermesrestart:unless-stoppedcommand:gateway runports:-"8642:8642"# API шлюза-"9119:9119"# панель управления (доступна только при HERMES_DASHBOARD=1)volumes:-~/.hermes:/opt/dataenvironment:-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:4Gcpus:"2.0"
Запустите с помощью docker compose up -d и просмотрите логи с помощью docker compose logs -f. Вывод панели управления имеет префикс [dashboard], что позволяет легко отфильтровать его из журналов шлюза.
Автоматизация браузера (Playwright/Chromium) — максимально требовательная к функции памяти. Если вам не нужны инструменты браузера, достаточно 1 ГБ. При активных инструментах браузера выделите не менее 2 ГБ.
Официальный образ основан на debian:13.4 и включает в себя:
Python 3 со всеми зависимостями Hermes (uv pip install -e ".[all]")
Node.js + npm (для автоматизации браузера и моста WhatsApp)
Playwright с Chromium (npx playwright install --with-deps chromium --only-shell)
ripgrep, ffmpeg, git и tini как системные утилиты
docker-cli — чтобы агенты, работающие внутри контейнера, могли управлять Docker-демоном хоста (примонтируйте /var/run/docker.sock для включения) для docker build, docker run, проверки контейнеров и т.д.
openssh-client — включает SSH-терминальный бэкенд из контейнера. SSH-бэкенд предоставляет системный бинарник ssh; без этого он молча сбоил в контейнерных установках.
Мост WhatsApp (scripts/whatsapp-bridge/)
Скрипт точки входа (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 в качестве среды выполнения (не описанные выше методы, когда агент запускает команды внутри Docker-песочницы — см. Конфигурация → Docker Backend), Hermes повторно использует один долгоживущий контейнер для всех инструментов вызовов и автоматически монтирует директорию функций (~/.hermes/skills/) и любые файлы учетных данных, объявленные алгоритмы, в этом контейнере, например, только для чтения. Скрипты, шаблоны и ссылки доступны внутри песочниц без ручной настройки, поскольку контейнер сохраняется во время живого процесса Hermes, любые установленные в зависимости или записанные файлы отображаются для следующего инструмента вызова.
Аналогичная синхронизация происходит для SSH и модальных бэкендов — файлы функций и учетные данные загружаются через rsync или API монтирования Modal перед каждой командой.
Подключение к локальным серверам инференса (vLLM, Ollama и т.д.)
При запуске Hermes в Docker, если ваш серверный сервер (vLLM, Ollama, text-generation-inference и т.д.) также работает на хосте или в другом контейнере, настройка сети требует особого внимания.
Docker Compose (рекомендуется)
Поместите оба сервиса в одну сеть Docker. Это самый надежный подход:
Затем в вашем ~/.hermes/config.yaml воспользуйтесь имя контейнера в качестве имени хоста:
model:provider:custommodel:my-modelbase_url:http://vllm:8000/v1api_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:**```shdocker run -d \--name hermes \-v ~/.hermes:/opt/data \-p 8642:8642 \nousresearch/hermes-agent gateway run
# config.yamlmodel:provider:custommodel:my-modelbase_url:http://127.0.0.1:8000/v1api_key:"none"```:::предупреждениеПри использовании `--network host` флага `-p` отключается — все порты-контейнеры открываются напрямую на хосте.</div>### Проверка подключенияИзнутри контейнера Hermes убедитесь, что сервер вывода доступен:```shdocker 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:
Проверьте логи: docker logs Hermes. Распространенные причины:
- Отсутствует или недействительный файл .env — сначала запустите интерактивно для завершения настроек.
- Конфликты портов, если запуск с открытыми портами.
Ошибки "Отказано в доступе"
Точка входа в контейнер сбрасывает привилегии некорневому пользователю hermes (UID 10000) через gosu. Ваш хост-каталог ~/.hermes/ соответствует UID, установите HERMES_UID/HERMES_GID в соответствии с вашим пользователем хоста или убедитесь, что данные каталога доступны для записи:
chmod-R755~/.hermes
Инструменты браузера не работают
Драматургу нужна разделяемая память. Добавьте --shm-size=1g в вашу команду Docker run:
Флаг --restart if-stopped обрабатывает большинство временных сбоев. Если шлюз завис, перезапустите контейнер:
dockerrestarthermes
Проверка работоспособности контейнера
dockerlogs--tail50hermes# Последние логи
dockerrun-it--rmnousresearch/hermes-agent:latestversion# Проверить версию
dockerstatshermes# Использование ресурсов