Дистрибутив NixOS для Homelab
Введение
Сегодня я хочу поделиться своим опытом использования дистрибутива NixOS в качестве основы для Homelab.
С тех пор как я перешёл на NixOS на своём основном рабочем ноутбуке, меня не покидала идея развернуть на нём домашний сервер. К тому моменту я уже несколько месяцев использовал XPenology и в целом был им доволен, однако любопытство и желание собрать Homelab самостоятельно на Linux взяли верх.
По мере изучения темы мне всё чаще попадались интересные приложения, которые хотелось бы иметь в своём Homelab, но реализовать их в рамках XPenology казалось не самым удобным решением.
При этом стоит отметить, что Synology DSM — достаточно самодостаточная система и для большинства популярных задач имеет собственные аналоги приложений, со своими плюсами и минусами.
Если вам нужен просто домашний сервер с базовым набором широко используемых сервисов, оригинальная Synology или XPenology будут вполне разумным выбором.
Старт с NixOS
У меня как раз оказался старый ноутбук, который и стал подопытным экземпляром для конфигурации сервера. Я установил на него NixOS и начал постепенно добавлять необходимые мне сервисы для Homelab.
Я не буду подробно останавливаться на том, как именно конфигурировать систему и какие сервисы выбирать. Здесь я хочу лишь поделиться выводами, к которым пришёл, опираясь на личный опыт.
В NixOS большинство популярных сервисов уже имеют интеграцию через nixpkgs. Практически любой распространённый сервис (Immich, Nextcloud и т.д.) можно найти в составе NixOS и подключить примерно следующим образом:
services.immich = {
enable = true;
environment = {
DB_URL = "postgresql://immich:password@postgres:5432/immich"
};
mediaLocation = '/path/to/media';
};
Это всего лишь пример стандартной установки Immich на NixOS. Разумеется, у сервиса есть множество дополнительных параметров настройки — таких как host, port и другие. Причём у каждого сервиса они свои. У каких-то их минимум, у других достаточно много. На первый взгляд всё выглядит довольно-таки просто.
Проблемы
Меня действительно порадовала сама идея: описал нужную конфигурацию, пересобрал систему — и все сервисы уже развернуты. При этом конфигурация всегда хранится в одном месте, её можно постепенно дополнять, улучшать и исправлять.
Однако со временем, по мере добавления всё большего количества сервисов, я начал замечать, что конфигурация становится довольно «грязной». Многие однотипные функции реализованы по-разному от сервиса к сервису. Модули пишутся разными людьми, и в итоге приходится постоянно изучать реализацию конкретного модуля в репозитории.
Для примера, вот так выглядит модуль Immich в NixOS на GitHub.
Конкретно Immich у меня почему-то после пары дней работы падал, и его приходилось перезапускать. Что-то связано было с подключением к базе данных Postgres. Разобраться, так и не разобрался.
Важно понимать, что сервисы NixOS запускаются через systemd и не используют контейнеры по умолчанию. Это значит, что они работают на хосте, и при ошибке или уязвимости приложения потенциально могут повлиять на остальную систему. При этом systemd предоставляет базовые механизмы изоляции, но она значительно уступает изоляции Docker-контейнеров.
Docker стандарт для Homelab
Практически все приложения для Homelab имеют официальный способ установки через Docker и docker-compose. Контейнеры изолированы, и при правильной настройке ограничивают доступ к файловой системе и ресурсам хоста. Docker облегчает управление зависимостями, обновлениями и откатами, особенно для приложений, которые хотят писать в свои каталоги. Тем не менее для Homelab это чаще всего безопаснее, чем запуск сервисов напрямую на хосте без контейнера.
В случае с NixOS сначала приходится выяснять:
- есть ли приложение в
nixpkgs; - как устроен модуль;
- какие параметры вынесены в опции;
- какие задаются через
environment.
Да, в NixOS можно использовать Docker без проблем, но тогда во многом теряется сам смысл выбора этого дистрибутива. Зачем, если можно установить Ubuntu, кинуть файл docker-compose и развернуть нужный сервис. Да и по факту docker-compose - это своего рода тоже декларативный подход.
Обновления
С обновлениями в NixOS есть свои особенности. Сами сервисы обновляются через nixpkgs, и если новая версия ещё не появилась там, обновить её "одним кликом" невозможно — придётся либо подождать, либо собрать пакет самостоятельно через overlay или nix-build. Кроме того, все пакеты в /nix/store только для чтения, что предотвращает автообновление приложений, которые пытаются изменять свои файлы, как это делают Prowlarr, Radarr или Sonarr. Это не баг, а особенность NixOS, гарантирующая атомарность и воспроизводимость. Для сервисов с активным автообновлением чаще используют Docker — контейнер можно пересобрать и заменить без изменения хост-системы.
Документация приложений
Официальная документация многих приложений фактически становится неприменимой, либо не совсем точной. Вместо стандартных инструкций приходится разбираться в Nix-модуле и писать конфигурацию на языке Nix, чтобы добиться нужного результата. Казалось бы есть переменная в ENV в официальной документации, но чтобы ее поменять в Nix-модуле этого приложения есть отдельная переменная, а если ты ее не указал, она устанавливается по умолчанию. И ты должен прежде погуглить именно Nix-овские Package-Search сайты, каким образом устанавливается тот или иной сервис.
Если при этом нужная функция не описана в Nix-модуле, внедрить её простым способом не получится — приходится писать derivations, overlays и прочие низкоуровневые вещи. А это уже требует достаточно глубоких знаний как самого языка Nix, так и внутреннего устройства устанавливаемого приложения.
Итоговый опыт и переход на Proxmox
В итоге примерно пару месяцев я экспериментировал с NixOS в роли Homelab-сервера и в целом собрал рабочую конфигурацию, которая лежит на GitHub: https://github.com/roman-kvasnikov/nixos-server-config
Однако меня не покидало ощущение, что я использую систему не совсем по назначению. Периодически возникали проблемы со стабильностью: сервисы, которые вчера работали без нареканий, сегодня могли неожиданно упасть и требовали ручного перезапуска.
В какой-то момент я решил отказаться от этого подхода, установил Proxmox и пошёл более традиционным путём. 🙂 И впринципе возвращаться обратно не хочу.
Заключение
В тоже самое время на своем рабочем ноутбуке я до сих пор использую NixOS, и думаю буду продолжать его использовать. Этой статьей я хотел описать именно опыт Homelab на NixOS. Может быть кому-то это будет полезно.