В этой статье я перечислю основной набор приложений, установленных на моем домашнем сервере. На сервере крутится система умного дома, медиа хранилище, а так же на нем я храню бекапы. Почти все упомянутые в статье приложения являются бесплатными и имеют открытый исходный код.
Сеть
Прежде чем перейти к основным приложениям, стоит разобраться с сетью. Для некоторых сервисов может потребоваться доступ извне.
На начальных этапах проброс портов на роутере может быть лучшим решением. Требует меньше навыков и не несет дополнительных расходов, если не брать в расчет выделенный ip. Однако при увеличении количества сервисов настройка, из-за отсутствия автоматизации, превращается в утомительную рутину. Приходится держать все порты в голове, или куда-то их записывать. И, пожалуй, самое главное — отсутствие нормального HTTPS. А сервисы без собственной аутентификации будут полностью открыты.
Альтернативный подход — купить домен и разместить все сервисы на поддоменах. Это не так дорого, а благодаря специализированному софту еще и достаточно просто.
Я перепробовал несколько вариантов обратных прокси, но остановился на Traefik из-за его гибкости и автоматизации настройки новых сервисов. Дополнительно подключены два midleware — Crowdsec и Authentic. Traefik перенаправляет трафик на них, а уже затем — на необходимый веб-сервис.
На сайте уже есть статья — Установка Traefik и Crowdsec.
Crowdsec является продвинутой fail2ban системой. Помимо анализа локальных логов, для выявления подозрительных IP-адресов, сервис предоставляет собственные блок-листы, формируемые на основе данных от комьюнити.
Для аутентификации используется Authentic. Он не только защищает веб-сервисы без встроенной системы авторизации, но и упрощает работу с несколькими приложениями, предоставляя единый логин для всех.
В качестве DNS я использую AdGuardHome. Сервис блокирует часть рекламы с помощью фильтров, но, как и любой другой подобный инструмент, не решает проблему полностью. По моему опыту, расширения в браузерах пока что остаются самым эффективным способом, а DNS-фильтры — хоть какая-то помощь устройствам, на которых невозможно установить собственный блокировщик.
Последнее приложение в списке — UnifiController. Это система управления WiFi точкой от Ubiquiti. Полностью бесполезна, если у вас нет оборудования от этого бренда. Да, помимо того, что у меня дома роутер без WiFi, у меня еще и точка доступа, без своего самодостаточного софта, и ей нужен отдельный сервис или дополнительная железка.
SmartHome
Когда я только начинал баловаться с устройствами “умного дома”, домашний сервер представлял собой Raspberry Pi 4. На текущий момент малина заменена на огромный гроб, но баловство и выбранные тогда сервисы неизменны. Мне все еще удобнее использовать узкоспециализированные приложения, нежели монструозные комбайны вроде Home Assistant.
Основное место, где прописана вся логика автоматизации, является Node-RED. Он управляет WiFi-лампами по всей квартире, вытяжкой в ванне, приточной вентиляцией, кондиционером, регулирует отопление батареями, а в случае обнаружения протечки отключает воду. Сервис связывает воедино множество брендов и протоколов, обеспечивая централизованное управление. Возможно мы когда-нибудь доживем до действительно умной Алисы или самодостаточному Home Kit’у, может нас спасет Matter, но этот день еще не настал.
Даже при наличии объединяющего Node-RED, после негативного опыта с WiFi устройствами, я стараюсь строить сеть преимущественно на Zigbee протоколе, по крайней мере там, где это возможно. Для управления сетью, в сервер подключен Zigbee донгл от Sonoff, а в качестве ПО выбран Zigbee2MQTT. Он, как можно догадаться из названия, ретранслирует сообщения от устройств в MQTT. А в качестве MQTT сервера (брокера) выбран Eclipse Mosquitto.
К брокеру, помимо Node-RED, подключены устройства на базе ESP32/ESP8266. Их я использовал для самодельных датчиков. На текущий момент их осталось два: один измеряет CO2, второй подключен к датчику движения и управляет светодиодной лентой над рабочем местом на кухне. Оба устройства WiFi, но они работают в разы стабильнее, чем лампы от Yeelight, несмотря на то, что у них так же используется ESP32. Разница в софте, в моем случае это прошивка на базе ESPHome. Что хоть и ориентирована на работу с Home Assistant, но этим не ограничена.
Последним, что у меня использует MQTT, – это Telegraf. Это сборщик данных для базы данных InfluxDB. Он передает информацию о системе, а так же принимает отчеты о датчиках от Node-RED, как раз через MQTT. Последнее необязательно и излишне, поскольку у InfluxDB есть API, которое можно напрямую использовать в Node-RED. Но “исторически так сложилось” хорошо описывает большинство подобных нелогичных решений. Разумеется, я обязательно переделаю этот момент…
Я не фанат дашбордов, что постоянно будут на виду. Мне все равно, какая температура у меня в комнате или уровень CO2 в данный момент, если мне комфортно. В 99,9% случаев эта информация нужна не мне, а скриптам автоматизации. Однако, когда, что-то пошло не так, собранная статистика и графики могут быть полезны для анализа. InfluxDB — база для этой статистики, а для визуализации я использую Grafana. Там же настроены алерты. Если отвалился датчик, не удался ежедневный бекап или упало соединение с VPS, мне придет сообщение от Telegram-бота.
ИБП, что питает сервер, подключен по USB, а Apcupsd собирает с него информацию и записывает в InfluxDB. При отключении питания в доме, я бы мог отправить себе сообщение. Но, во-первых, это не такая полезная информация, потому что я с ней ничего не могу сделать. А во-вторых, даже если бы захотел отправить, оборудование провайдера не имеет резервного питания, и интернет будет недоступен. И все же, есть Uptime Kuma, она запущена на нескольких машинах, в разных локациях. Они периодически пингуют друг друга и в случае недоступности я получаю сигнал от того же Telegram-бота.
Медиа
Фильмы и сериалы
Медиа пайплайн на первый взгляд переусложненный и должен вызывать головную боль, а не упрощать просмотр сериалов и фильмов, но это не так.
В идеальном случае, все что нужно, это добавить желаемый к просмотру фильм в Watchlist в Trakt.tv и он автоматически загрузится в Plex. Далее он доступен для просмотра на телевизоре, телефоне, компьютере и вебе. Причем Plex у меня доступен из внешней сети, так что, это неплохая альтернатива стриминговым сервисам.
Предлагаю пройтись по схеме, разобрав что и как работает, а так же, что за идеальный случай и что может пойти не так.
Trakt.tv — сторонний сервис, где я отмечаю что посмотрел и хотел бы посмотреть. Альтернатива IMDB или Кинопоиску, когда он еще не был стриминговым сервисом. Почему именно он? Не знаю, очередное “исторически так сложилось”. Профиль публичный, Watchlist открыт, в него и смотрят Radarr и Sonarr.
Radarr и Sonarr — менеджеры фильмов и сериалов соответственно. Выполняют следующие задачи:
- Проверку листа и добавления новых тайтлов. Добавлять можно и в ручную, но так как я все равно отмечаю все в Trakt мне проще добавлять через него.
- Поиск контента на трекерах с помощью Prowlarr. Поиск происходит автоматически при добавлении, периодически, а так же в ручном режиме.
- Подачу команды на загрузку в торрент-клиент. В моем случае qBittorrent.
- Перемещение и переименование файлов в формат, который распознает Plex.
Prowlarr — приложение для поиска сразу по нескольким трекерам. Входит в семейство Arr-приложений. Возможно вы захотите перейти в официальную wiki и почитать о других проектах, что занимаются менеджментом аудио медиатеки или автоматическому поиску субтитров.
Flood — красивый веб-интерфейс, поддерживающий несколько торрент-клиентов, включая qBittorrent. Ценой за его лаконичность приходится платить более упрощённым функционалом.
Проблемы
Большинство проблем возникает из-за ожиданий и фактических названий. Во-первых, Arr приложения в первую очередь рассчитаны на англоговорящую аудиторию. Поиск ведется по английским названиям фильмов. А на трекерах не всегда указано это название. Но еще смешнее ситуация, когда название раздачи удовлетворяет Radarr’у, он успешно ставит фильм на загрузку. Но после, Radarr не может найти файл, потому что тот назван иначе. Нужно зайти и вручную тыкнуть его носом, убеждая, что это именно тот фильм, что ему нужен. Сериал же могут выложить, назвав серии не в красивом и понятном всем формате S00Е00, а как то иначе. Sonarr такое не любит, и тоже будет ждать ручного вмешательства. Вы можете спросить: почему бы не качать сразу в папку Plex? Но он так же ожидает определенную структуру директорий и имена файлов.
Но красивая медиатека с обложками того стоит. А свалка файлов в папке download расшаренная через DLNA или Samba, это отвратительно.
Подкасты
Для подкастов я использую Pocket Casts. Помимо внутреннего поиска и подписки по RSS, доступно прослушивание mp3 файлов, откуда бы они у вас не появились. Сервис предоставляет “облако” на 20Gb. Однако все такие выпуски будут лежать в одной вкладке, перемешанные и толком без оформления. Если у вас пара таких выпусков, это не критично, но если забить все 20 Gb, то это превратится в свалку. А мы это не любим, ведь так?
А не захостить ли свой подкаст? С этим вопросом я обратился к гуглу. Перепробовав несколько вариантов, я остановился на audiobookshelf. У этого сервиса есть мобильное приложение и веб интерфейс для прослушивания книг и подкастов. Но не это сейчас интересно, главное, оно позволяет генерировать RSS фид.
Audiobookshelf формирует медиатеку ориентируясь на метаданные файлов, а так же структуру директорий. Через веб интерфейс можно подправить данные, но там нет инструментов для массового изменения. Лучшим вариантом будет использовать сторонний софт для правки метаданных или скрипты.
Например, я написал скрипт, который проверяет YouTube плейлист на наличие нового выпусков. Если такие есть, загружает аудио дорожку, заполняет метадату и подсовывает файл в audiobookshelf. И вот у меня новый выпуск “подкаста”, в удобном приложении.
Файлы
Предположим, что стандартные облачные решения от Google, Yandex или Apple не устраивают. Частым альтернативным решением является самосборный или готовый NAS. Причина почему у меня нет отдельного устройства — цена. После вышеупомянутой “исторически так сложилось”, цена — это вторая по популярности причина, почему у меня устроено так как устроено. Я постарался выжать максимум из располагаемых ресурсов и вот что у меня получилось.
Обмен и синхронизация файлов
Для синхронизации директорий между Windows машинами, я использую Syncthing. В качестве промежуточной ноды выступает домашний сервер, что позволяет передавать файлы без необходимости держать оба компьютера включенными одновременно. Однажды потеряв уйму полезной информации из-за умершего диска, я выделил несколько директорий и слежу за их сохранностью. Эти файлы пережили несколько обновлений железа и переустановок ОС. Ничего важного для себя я не храню за пределами этих директорий. Такой подход позволяет мне не синхронизировать лишнюю информацию и не занимать уйму места под бекапы.
К примеру, первое, что я делаю на чистой Windows, это изменяю пути к дефолтным директориям Изображения и Документы. Что часто используются различным софтом по умолчанию.
Syncthing использует и SteamDeck, но в отличие от Windows, это только для сохранности данных. А вот с iPhone ей пользоваться крайне не удобно, поэтому бекапы фотографий я делаю через PhotoPrism, а другой уникальной информации на телефоне нет. В крайнем случае есть iCloud, адресную книгу и настройки системы я доверяю ему.
PhotoPrism и Syncthing используют одну директорию на сервере, для хранения фотографий. Это позволяет просматривать фото с Windows в PhotoPrism, а фото с iPhone на Windows компьютерах.
Бекапы
И наконец самое важное — резервные копии. Синхронизация пары директорий, безусловно, повышает сохранность данных, но мне этого оказалось недостаточно. Во-первых, нет версионирования. Во-вторых, данные с самого сервера, а тем более с VPS, вообще не резервировались.
В поисках софта под эти задачи я наткнулся на BorgBackup. Консольное ПО, которое не имеет собственного расписания и какого либо автоматического запуска из коробки, зато обеспечивает шифрование, дедупликацию и сжатие.
С помощью Borg и Cron каждую ночь создаются бэкапы на нескольких дисках домашнего сервера, а так же на отдельный NAS, находящейся в другой квартире. Причем в каждом месте копии независимы и самодостаточны. Такой подход позволяет хранить историю изменений за несколько лет, но при этом экономить место, копируя только измененные файлы. Это отлично подходит для конфигурационных файлов, логов и других важных данных.
Железо
Сервер собран на базе Intel i7-7700K. Имеет 48 Gb оперативной памяти, 3 HDD суммарным объемом 11 Tb, и SATA SSD под систему на 250 Gb. Собрано все в корпусе от be quiet! Silent BASE 601. Большинство компонентов выбраны из того что было. В качестве ОС используется Debian.
Сервер запитан от ИБП APC BR900G-RS, от которого так же питаются:
- Mikrotik RB5009UG+S+IN
- TP-Link TL-SG1210P
- Ubiquiti UniFi nanoHD
Итоговое общее потребление 80 Wh.
Заключение
Домашний сервер для меня решает множество задач. Он достаточно гибок в настройке, в отличие от готовых решений, за что, разумеется, мне пришлось заплатить личным временем. Однако разбираться во всем этом было интересно, так что я не жалею о потраченном времени.
Возможно, через несколько лет моя конфигурация кардинально изменится. Возможно, появятся новые технологии, которые заставят пересмотреть текущие решения. Но на данный момент этот сервер — именно то, что мне нужно. И пока он продолжает работать, я доволен.