Обо мне Блог Контакты

Дистрибутив 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. Может быть кому-то это будет полезно.