sidebar_position: 3
title: "Nix & NixOS Setup"
description: "Install and deploy Hermes Agent with Nix — from quick nix run to fully declarative NixOS module with container mode"
lang: ru
Настройка Nix и NixOS
Агент Hermes поставляет версию Nix с тремя уровнями интеграции:
Уровень
Для кого это
Что вы получаете
nix run / nix profile install
Любой пользователь Nix (macOS, Linux)
Предварительно созданный двоичный файл со всеми параметрами — затем используйте стандартный рабочий процесс CLI
Модуль NixOS (родной)
Развертывание серверов NixOS
Декларативная конфигурация, усиленная служба systemd, управляемые секреты
Модуль NixOS (контейнер)
Агенты, нуждающиеся в самомодификации
Все вышеперечисленное, а также постоянный контейнер Ubuntu, где агент может apt/pip/npm install
ℹ️ Info
Чем отличается стандартная установка
Установщик `curl | bash` сам управляет Python, Node и зависимостями. Все это заменяет флейк Nix — каждая зависимость Python является производным от Nix, созданным [uv2nix](https://github.com/pyproject-nix/uv2nix), а инструменты времени выполнения (Node.js, git, ripgrep, ffmpeg) заключены в PATH двоичного файла. Нет ни пакета времени выполнения, ни активации venv, ни `npm install`.
**Для пользователей, отличных от NixOS**, это меняет только этап установки. Все после (`hermes setup`, `hermes gateway install`, редактирования конфигурации) работает идентично стандартной установке.
**Для пользователей модуля NixOS** весь жизненный цикл отличается: конфигурация находится в `configuration.nix`, секреты проходят через sops-nix/agenix, служба является модулем systemd, а команды конфигурации CLI блокируются. Вы управляете Hermes так же, как и любой другой службой NixOS.
Предварительные условия
Nix с включенными флейками — рекомендуется Определить Nix (по умолчанию флейки включены)
Ключи API для сервисов, которые вы хотите использовать (минимум: ключ OpenRouter или Anthropic).
Быстрый старт (любой пользователь Nix)
Клон не нужен. Nix извлекает, собирает и запускает все:
# Run directly (builds on first use, cached after)
nixrungithub:NousResearch/hermes-agent--setup
nixrungithub:NousResearch/hermes-agent--chat
# Or install persistently
nixprofileinstallgithub:NousResearch/hermes-agent
hermessetup
hermeschat
После того, как nix profile install, hermes, hermes-agent и hermes-acp находятся в вашем PATH. Отсюда рабочий процесс идентичен стандартной установке — hermes setup помогает вам выбрать поставщика, hermes gateway install настраивает пользовательскую службу launchd (macOS) или systemd, а конфигурация находится в ~/.hermes/.
:::примечание
Для этого модуля требуется NixOS. Для систем, отличных от NixOS (macOS, другие дистрибутивы Linux), используйте nix profile install и стандартный рабочий процесс CLI, описанный выше.
Добавляем входные данные Flake
# /etc/nixos/flake.nix (or your system flake){inputs={
nixpkgs.url="github:NixOS/nixpkgs/nixos-unstable";
hermes-agent.url="github:NousResearch/hermes-agent";};outputs={ nixpkgs, hermes-agent,...}:{
nixosConfigurations.your-host= nixpkgs.lib.nixosSystem {system="x86_64-linux";modules=[
hermes-agent.nixosModules.default
./configuration.nix];};};}
Вот и все. nixos-rebuild switch создает пользователя hermes, генерирует config.yaml, подключает секреты и запускает шлюз — долгоработающую службу, которая подключает агента к платформам обмена сообщениями (Telegram, Discord и т. д.) и прослушивает входящие сообщения.
:::предупреждение Требуются секреты
Строка environmentFiles выше предполагает, что у вас настроен sops-nix или agenix. Файл должен содержать хотя бы один ключ поставщика LLM (например, OPENROUTER_API_KEY=sk-or-...). См. Управление секретами для полной настройки. Если у вас еще нет менеджера секретов, вы можете использовать простой файл в качестве отправной точки — просто убедитесь, что он не доступен для чтения всем:
:::совет addToSystemPackages
Установка addToSystemPackages = true делает две вещи: помещает hermes CLI в PATH вашей системы и устанавливает HERMES_HOME для всей системы, чтобы интерактивный CLI делился состоянием (сессии, навыки, cron) со службой шлюза. Без него запуск hermes в вашей оболочке создаст отдельный каталог ~/.hermes/.
ℹ️ Info
Интерфейс командной строки с поддержкой контейнеров
Когда `container.enable = true` и `addToSystemPackages = true`, **каждая** команда `hermes` на хосте автоматически направляется в управляемый контейнер. Это означает, что ваш интерактивный сеанс CLI выполняется в той же среде, что и служба шлюза, с доступом ко всем пакетам и инструментам, установленным в контейнере.
- Маршрутизация прозрачна: `hermes chat`, `hermes sessions list`, `hermes version` и т. д. все выполняется в контейнере под капотом.
- Все флаги CLI пересылаются как есть.
- Если контейнер не запущен, CLI кратковременно повторяет попытку (5 секунд со счетчиком для интерактивного использования, 10 секунд в автоматическом режиме для сценариев), а затем завершается с ошибкой — без автоматического возврата
- Для разработчиков, работающих с кодовой базой Hermes, установите `HERMES_DEV=1`, чтобы обойти маршрутизацию контейнера и запустить локальную проверку напрямую.
Задайте `container.hostUsers`, чтобы создать символическую ссылку `~/.hermes` на каталог состояния службы, чтобы CLI хоста и контейнер совместно использовали сеансы, конфигурацию и память:
Пользователи, перечисленные в `hostUsers`, автоматически добавляются в группу `hermes` для доступа к файлам.
**Пользователи Podman:** Служба NixOS запускает контейнер от имени пользователя root. Пользователи Docker получают доступ через групповой сокет `docker`, но корневые контейнеры Podman требуют sudo. Предоставьте sudo без пароля для среды выполнения вашего контейнера:
CLI автоматически определяет, когда требуется sudo, и использует его прозрачно. Без этого вам придется запускать `sudo hermes chat` вручную.
Убедитесь, что это работает
После nixos-rebuild switch проверьте, что служба запущена:
# Check service status
systemctlstatushermes-agent
# Watch logs (Ctrl+C to stop)
journalctl-uhermes-agent-f
# If addToSystemPackages is true, test the CLI
hermesversion
hermesconfig# shows the generated config
Выбор режима развертывания
Модуль поддерживает два режима, управляемых container.enable:
Собственный (по умолчанию)
Контейнер
Как это работает
Усиленная служба systemd на хосте
Постоянный контейнер Ubuntu с /nix/store, смонтированным привязкой
Безопасность
NoNewPrivileges, ProtectSystem=strict, PrivateTmp
Изоляция контейнера, запускается внутри от имени непривилегированного пользователя
Агент может самостоятельно устанавливать пакеты
Нет — только инструменты, предоставляемые Nix PATH
Да — установки apt, pip, npm сохраняются при перезапуске
Агенту требуется установка пакета среды выполнения, изменяемая среда, экспериментальные инструменты
Чтобы включить режим контейнера, добавьте одну строку:
{
services.hermes-agent={enable=true;
container.enable=true;# ... rest of config is identical};}
:::информация
Режим контейнера автоматически включает virtualisation.docker.enable через mkDefault. Если вместо этого вы используете Podman, установите container.backend = "podman" и virtualisation.docker.enable = false.
Конфигурация
Декларативные настройки
Опция settings принимает произвольный набор атрибутов, который отображается как config.yaml. Он поддерживает глубокое слияние нескольких определений модулей (через lib.recursiveUpdate), поэтому вы можете разделить конфигурацию по файлам:
Оба глубоко объединены во время оценки. Объявленные Nix ключи всегда перевешивают ключи в существующем config.yaml на диске, но добавленные пользователем ключи, к которым Nix не прикасается, сохраняются. Это означает, что если агент или ручное редактирование добавляет ключи типа skills.disabled или streaming.enabled, они сохраняются nixos-rebuild switch.
:::примечание Именование модели
settings.model.default использует идентификатор модели, ожидаемый вашим провайдером. При использовании OpenRouter (по умолчанию) они выглядят как "anthropic/claude-sonnet-4" или "google/gemini-3-flash". Если вы используете поставщика напрямую (Anthropic, OpenAI), установите settings.model.base_url, чтобы указать на его API, и используйте его собственные идентификаторы модели (например, "claude-sonnet-4-20250514"). Если base_url не установлено, Hermes по умолчанию использует OpenRouter.
💡 Tip
Обнаружение доступных ключей конфигурации
Запустите `nix build .#configKeys && cat result`, чтобы увидеть каждый конечный ключ конфигурации, извлеченный из `DEFAULT_CONFIG` Python. Вы можете вставить существующий `config.yaml` в `settings` attrset — структура отображается 1:1.
Никогда не помещайте ключи API в `settings` или `environment`.
Значения в выражениях Nix попадают в `/nix/store`, который доступен для чтения всем. Всегда используйте `environmentFiles` с менеджером секретов.
И environment (несекретные переменные), и environmentFiles (секретные файлы) объединяются в $HERMES_HOME/.env во время активации (nixos-rebuild switch). Hermes читает этот файл при каждом запуске, поэтому изменения вступают в силу с systemctl restart hermes-agent — пересоздание контейнера не требуется.
Для платформ, требующих OAuth (например, Discord), используйте authFile для ввода учетных данных при первом развертывании:
{
services.hermes-agent={authFile= config.sops.secrets."hermes/auth.json".path;# authFileForceOverwrite = true; # overwrite on every activation};}
Файл копируется только в том случае, если auth.json еще не существует (если только authFileForceOverwrite = true). Обновления токена OAuth во время выполнения записываются в каталог состояния и сохраняются при перестроениях.
Документы
Опция documents устанавливает файлы в рабочий каталог агента (workingDirectory, который агент считает своим рабочим пространством). Hermes ищет определенные имена файлов по соглашению:
USER.md — контекст о пользователе, с которым взаимодействует агент.
Любые другие файлы, которые вы размещаете здесь, видны агенту как файлы рабочей области.
Файл идентификации агента является отдельным: Hermes загружает свой основной SOUL.md из $HERMES_HOME/SOUL.md, который в модуле NixOS — ${services.hermes-agent.stateDir}/.hermes/SOUL.md. Вставка SOUL.md в documents создает только файл рабочей области и не заменяет основной файл персоны.
{
services.hermes-agent.documents={"USER.md"=./documents/USER.md;# path reference, copied from Nix store};}
Значения могут быть встроенными строками или ссылками на пути. Файлы устанавливаются на каждый nixos-rebuild switch.
MCP-серверы
Опция mcpServers декларативно настраивает серверы MCP (Model Context Protocol). Каждый сервер использует транспорт stdio (локальная команда) или HTTP (удаленный URL-адрес).
Stdio Transport (локальные серверы)
{
services.hermes-agent.mcpServers={filesystem={command="npx";args=["-y""@modelcontextprotocol/server-filesystem""/data/workspace"];};github={command="npx";args=["-y""@modelcontextprotocol/server-github"];
env.GITHUB_PERSONAL_ACCESS_TOKEN="\${GITHUB_TOKEN}";# resolved from .env};};}
:::совет
Переменные среды в значениях env разрешаются из $HERMES_HOME/.env во время выполнения. Используйте environmentFiles для внедрения секретов — никогда не помещайте токены непосредственно в конфигурацию Nix.
Токены хранятся в $HERMES_HOME/mcp-tokens/<server-name>.json и сохраняются при перезапусках и перестройках.
<подробности>
Первоначальная авторизация OAuth на автономных серверах
Первая авторизация OAuth требует потока согласия на основе браузера. При автономном развертывании Hermes печатает URL-адрес авторизации в стандартный вывод/логи вместо открытия браузера.
Вариант A: Интерактивная загрузка — запустите поток один раз через docker exec (контейнер) или sudo -u hermes (собственный):
Когда Hermes запускается через модуль NixOS, следующие команды CLI блокируются с описательной ошибкой, указывающей на configuration.nix:
Заблокированная команда
Почему
hermes setup
Конфигурация является декларативной — отредактируйте settings в конфигурации Nix
hermes config edit
Конфигурация генерируется из settings
hermes config set <key> <value>
Конфигурация генерируется из settings
hermes gateway install
Служба systemd управляется NixOS
hermes gateway uninstall
Служба systemd управляется NixOS
Это предотвращает расхождение между тем, что объявляет Никс, и тем, что находится на диске. Обнаружение использует два сигнала:
HERMES_MANAGED=true переменная среды — устанавливается службой systemd и видна процессу шлюза.
.managed файл маркера в HERMES_HOME — устанавливается скриптом активации, видимый для интерактивных оболочек (например, docker exec -it hermes-agent hermes config set ... тоже блокируется)
Чтобы изменить конфигурацию, отредактируйте конфигурацию Nix и запустите sudo nixos-rebuild switch.
Контейнерная архитектура
:::информация
Этот раздел актуален только в том случае, если вы используете container.enable = true. Пропустите его для развертываний в основном режиме.
Когда режим контейнера включен, Hermes запускается внутри постоянного контейнера Ubuntu со встроенным Nix двоичным файлом, смонтированным с помощью привязки и доступным только для чтения с хоста:
Бинарный файл, созданный Nix, работает внутри контейнера Ubuntu, поскольку /nix/store монтируется по привязке — он имеет собственный интерпретатор и все зависимости, поэтому нет необходимости полагаться на системные библиотеки контейнера. Точка входа в контейнер разрешается через символическую ссылку current-package: /data/current-package/bin/hermes gateway run --replace. На nixos-rebuild switch обновляется только символическая ссылка — контейнер продолжает работать.
Что сохраняется, несмотря на что
Событие
Контейнер воссоздан?
/data (состояние)
/home/hermes
Доступный для записи слой (apt/pip/npm)
systemctl restart hermes-agent
Нет
сохраняется
сохраняется
сохраняется
nixos-rebuild switch (изменение кода)
Нет (символическая ссылка обновлена)
сохраняется
сохраняется
сохраняется
Перезагрузка хоста
Нет
сохраняется
сохраняется
сохраняется
nix-collect-garbage
Нет (корень GC)
сохраняется
сохраняется
сохраняется
Изменение изображения (container.image)
Да
сохраняется
сохраняется
Потерян
Изменение объема/опций
Да
сохраняется
сохраняется
Потерян
environment/environmentFiles изменить
Нет
сохраняется
сохраняется
сохраняется
Контейнер создается заново только при изменении его хэша идентификации. Хэш охватывает: версию схемы, изображение, extraVolumes, extraOptions и сценарий точки входа. Изменения переменных среды, настроек, документов или самого пакета Hermes не вызывают воссоздание.
⚠️ Warning
Потеря записываемого слоя
При изменении хэша идентификатора (обновление образа, новые тома, новые параметры контейнера) контейнер уничтожается и создается заново из новой версии `container.image`. Любые пакеты `apt install`, `pip install` или `npm install` на записываемом уровне теряются. Состояние `/data` и `/home/hermes` сохраняется (это привязка).
Если агент использует определенные пакеты, рассмотрите возможность включения их в собственный образ (`container.image = "my-registry/hermes-base:latest"`) или сценарий их установки в SOUL.md агента.
Защита корня GC
Скрипт preStart создает корень GC по адресу ${stateDir}/.gc-root, указывающий на текущий пакет Hermes. Это не позволяет nix-collect-garbage удалить работающий двоичный файл. Если корень GC каким-то образом сломается, перезапуск службы создаст его заново.
Плагины
Модуль NixOS поддерживает декларативную установку плагинов — императив hermes plugins install не требуется.
Плагины каталогов (extraPlugins)
Для плагинов, которые представляют собой просто дерево исходного кода с plugin.yaml + __init__.py (например, hermes-lcm):
Плагины имеют символическую ссылку $HERMES_HOME/plugins/ во время активации. Hermes обнаруживает их посредством обычного сканирования каталогов. Удаление плагина из списка и запуск nixos-rebuild switch удаляет символическую ссылку.
Плагины точки входа (extraPythonPackages)
Для плагинов в пакете pip, которые регистрируются через [project.entry-points."hermes_agent.plugins"] (например, rtk-hermes):
:::примечание
Проверка коллизий во время сборки не позволяет пакетам плагинов скрывать основные зависимости Hermes. Если плагин предоставляет пакет, уже находящийся в запечатанном венве, nixos-rebuild завершается с ошибкой.
Развитие
Оболочка для разработчиков
Flake предоставляет оболочку разработки с Python 3.11, uv, Node.js и всеми инструментами времени выполнения:
cdhermes-agent
nixdevelop
# Shell provides:# - Python 3.11 + uv (deps installed into .venv on first entry)# - Node.js 20, ripgrep, git, openssh, ffmpeg on PATH# - Stamp-file optimization: re-entry is near-instant if deps haven't changed
hermessetup
hermeschat
direnv (рекомендуется)
Включенный .envrc автоматически активирует оболочку разработки:
cdhermes-agent
direnvallow# one-time# Subsequent entries are near-instant (stamp file skips dep install)
Чешуйчатые чеки
Флейк включает проверку во время сборки, которая выполняется в CI и локально:
# Run all checks
nixflakecheck
# Individual checks
nixbuild.#checks.x86_64-linux.package-contents# binaries exist + version
nixbuild.#checks.x86_64-linux.entry-points-sync# pyproject.toml ↔ Nix package sync
nixbuild.#checks.x86_64-linux.cli-commands# gateway/config subcommands
nixbuild.#checks.x86_64-linux.managed-guard# HERMES_MANAGED blocks mutation
nixbuild.#checks.x86_64-linux.bundled-skills# skills present in package
nixbuild.#checks.x86_64-linux.config-roundtrip# merge script preserves user keys
<подробности>
Что проверяет каждая проверка
Проверить
Что он тестирует
package-contents
Двоичные файлы hermes и hermes-agent существуют и hermes version работают
entry-points-sync
Каждая запись [project.scripts] в pyproject.toml имеет упакованный двоичный файл в пакете Nix
cli-commands
hermes --help предоставляет подкоманды gateway и config
managed-guard
HERMES_MANAGED=true hermes config set ... выводит ошибку NixOS
bundled-skills
Каталог Skills существует, содержит файлы SKILL.md, HERMES_BUNDLED_SKILLS установлен в обертке
Добавьте hermes CLI в системный PATH и установите HERMES_HOME для всей системы
Конфигурация
Вариант
Тип
По умолчанию
Описание
settings
attrs (глубокое слияние)
{}
Декларативная конфигурация отображается как config.yaml. Поддерживает произвольную вложенность; несколько определений объединяются через lib.recursiveUpdate
configFile
null или path
null
Путь к существующему config.yaml. Полностью переопределяет settings, если установлено
Секреты и окружающая среда
Вариант
Тип
По умолчанию
Описание
environmentFiles
listOf str
[]
Пути к env-файлам с секретами. Объединен с $HERMES_HOME/.env во время активации
environment
attrsOf str
{}
Несекретные переменные окружения. Видимо в магазине Nix — не размещайте здесь секреты
authFile
null или path
null
Начальное значение учетных данных OAuth. Копируется только при первом развертывании
authFileForceOverwrite
bool
false
Всегда перезаписывать auth.json с authFile при активации
Документы
Вариант
Тип
По умолчанию
Описание
documents
attrsOf (either str path)
{}
Файлы рабочей области. Ключи — это имена файлов, значения — встроенные строки или пути. Устанавливается в workingDirectory при активации
MCP-серверы
Вариант
Тип
По умолчанию
Описание
mcpServers
attrsOf submodule
{}
Определения серверов MCP, объединенные в settings.mcp_servers
mcpServers.<name>.command
null или str
null
Команда сервера (транспорт stdio)
mcpServers.<name>.args
listOf str
[]
Аргументы команды
mcpServers.<name>.env
attrsOf str
{}
Переменные среды для серверного процесса
mcpServers.<name>.url
null или str
null
URL-адрес конечной точки сервера (транспорт HTTP/StreamableHTTP)
mcpServers.<name>.headers
attrsOf str
{}
HTTP-заголовки, например. Authorization
mcpServers.<name>.auth
null или "oauth"
null
Метод аутентификации. "oauth" включает OAuth 2.1 PKCE
mcpServers.<name>.enabled
bool
true
Включить или отключить этот сервер
mcpServers.<name>.timeout
null или int
null
Тайм-аут вызова инструмента в секундах (по умолчанию: 120)
mcpServers.<name>.connect_timeout
null или int
null
Таймаут соединения в секундах (по умолчанию: 60)
mcpServers.<name>.tools
null или submodule
null
Фильтрация инструментов (include/exclude списки)
mcpServers.<name>.sampling
null или submodule
null
Выборка конфигурации для запросов LLM, инициируемых сервером
Поведение службы
Вариант
Тип
По умолчанию
Описание
extraArgs
listOf str
[]
Дополнительные аргументы для hermes gateway
extraPackages
listOf package
[]
Дополнительные пакеты доступны агенту. Добавлено в индивидуальный профиль пользователя Hermes, чтобы все команды терминала, навыки и задания cron видели их
extraPlugins
listOf package
[]
Пакеты плагинов каталога для символической ссылки на $HERMES_HOME/plugins/. Каждый из них должен содержать plugin.yaml
extraPythonPackages
listOf package
[]
Пакеты Python добавлены в PYTHONPATH для обнаружения плагинов точки входа. Сборка с помощью python312Packages
restart
str
"always"
системная политика Restart=
restartSec
int
5
systemd RestartSec= значение
Контейнер
Вариант
Тип
По умолчанию
Описание
container.enable
bool
false
Включить режим контейнера OCI
container.backend
enum ["docker" "podman"]
"docker"
Среда выполнения контейнера
container.image
str
"ubuntu:24.04"
Базовый образ (полученный во время выполнения)
container.extraVolumes
listOf str
[]
Дополнительные тома монтируются (host:container:mode)
container.extraOptions
listOf str
[]
Дополнительные аргументы переданы docker create
container.hostUsers
listOf str
[]
Интерактивные пользователи, которые получают символическую ссылку ~/.hermes на сервис stateDir и автоматически добавляются в группу hermes
Макет каталога
Основной режим
/var/lib/hermes/# stateDir (owned by hermes:hermes, 0750)├──.hermes/# HERMES_HOME│├──config.yaml# Nix-generated (deep-merged each rebuild)│├──.managed# Marker: CLI config mutation blocked│├──.env# Merged from environment + environmentFiles│├──auth.json# OAuth credentials (seeded, then self-managed)│├──gateway.pid│├──state.db│├──mcp-tokens/# OAuth tokens for MCP servers│├──sessions/│├──memories/│├──skills/│├──cron/│└──logs/├──home/# Agent HOME└──workspace/# MESSAGING_CWD├──SOUL.md# From documents option└──(agent-createdfiles)
Установка apt/pip/npm — сохраняется при перезапуске, теряется при восстановлении
Обновление
# Update the flake input
nixflakeupdatehermes-agent--flake/etc/nixos
# Rebuild
sudonixos-rebuildswitch
В режиме контейнера символическая ссылка current-package обновляется, и агент получает новый двоичный файл при перезапуске. Никакого воссоздания контейнера, никакой потери установленных пакетов.
Устранение неполадок
:::совет пользователям Podman
Все приведенные ниже команды docker работают одинаково с podman. Замените соответствующим образом, если вы установили container.backend = "podman".
Журналы обслуживания
# Both modes use the same systemd unit
journalctl-uhermes-agent-f
# Container mode: also available directly
dockerlogs-fhermes-agent