История самостоятельного размещения
Опыт со своими серверами начался давно — ещё во времена, когда это явление не называли словом «self-hosting». На первом курсе в университете пришлось запустить веб-сайт с Linux-машины, спрятанной под кроватью в общежитии. Надежность была относительной: когда соседу надоедал шум вентилятора, он просто отключал сервер. Позже несколько лет работали с MythTV, а затем перешли на XBMC (позже переименованный в Kodi).
Несколько лет жизни в Индии показали, насколько дешевыми там могут быть потоковые сервисы — Netflix, Disney Plus (Hotstar в Индии) и Spotify. Однако после переезда платить западные цены за те же услуги было невозможно. Но дело было не только в стоимости. Семья устала от «трубки рекомендаций»: хотелось ограничить контент для сына конкретными программами, но постоянные "рекомендуется для вас" и "далее смотреть" вызывали конфликты. Хотя в сервисах есть способы ограничить контент или отключить автозапуск, переделывать это для каждого приложения при каждом обновлении — слишком сложно.
Решение пришло в виде самостоятельного Jellyfin. За полтора года это открыло двери к целой экосистеме самостоятельно размещаемых сервисов, снижая зависимость от облачных провайдеров и обеспечивая стабильность. Больше нет постоянных редизайнов, новых функций сомнительной ценности и писем о обновлениях условий использования, связывающих арбитражем или о утечках данных. Теперь можно прочитать примечания выпуска и самому решить, нужно ли обновляться.
Правила
Соблюдаются несколько принципов.
За исключением VPN-серверов на маршрутизаторе, никакие сервисы не открыты в публичный интернет напрямую. Удобство и безопасность приложений — это хорошо, но с учетом развития AI-ассистентов для хакинга это просто неразумно. К тому же ISP использует CGNAT для IPv4-адресов, поэтому домашняя сеть недоступна из интернета по IPv4. VPN-серверы маршрутизируются в публичный интернет только через IPv6 — это имеет недостатки, но работает для текущих задач и вероятно помогает ограничить враждебные подключения. Главный минус: VPN почти никогда не работает в открытых Wi-Fi сетях, где IPv6 редкость. На телефоне можно отключить Wi-Fi и использовать мобильный интернет, если он есть.
Предпочтение — запускать сервисы natively, когда возможно, но контейнеризировать сложные сервисы или те, что требуют много зависимостей. Идеально: сервис как один Go-бинарик. Если же сервис поставляется только Docker compose-файлом и требует MySQL, Redis и трёх других контейнеров — сразу ищется альтернатива. Если зависимостей немного, native лучше, быстрее и эффективнее. Одни и те же инструменты управления работают через все сервисы. Нет умственных затрат на запуск команды внутри контейнера, поиски curl'а в нём или разбор в том, что один контейнер запускает busybox с другими аргументами, и работа с виртуальной сетью и маппингом портов.
К этому же: Docker больше не используется. Это не принципиальная позиция, просто устал управлять отдельной системой управления сервисами на сервере. Интеграция Podman с systemd теперь отличная.
Оборудование
В прошлом году куплен Beelink Mini PC — модель S12 Pro с процессором Intel N100, 16 ГБ ОЗУ и 512 ГБ SSD. Это было до роста цен, и стоил EUR 180. Сейчас такой же на Amazon — EUR 359. К серверу подключен 6 ТБ диск для хранения медиа.
В комментарии на Hacker News о самостоятельном размещении появились вопросы, как всё это может работать с 16 ГБ ОЗУ. Как описано ниже, сделаны выборы, снижающие требования к ресурсам, но в итоге оказывается, что много оборудования не требуется. Конечно, никакого локального запуска моделей на этом железе не происходит, но для всего остального это просто работает из коробки или с простыми настройками.
Сервисы
В алфавитном порядке.
Actual Budget
ПО для ведения бюджета с десктоп-клиентами и веб-приложением, пользовательские отчеты и категоризация по правилам. Используется только для бюджетирования и отслеживания текущих/сберегательных/кредитных счетов. Для инвестиционных счетов — облачный сервис. Когда-нибудь захочется и его перенести…
Actual Budget поддерживает автоматический импорт транзакций из разных банков, но эта функция не используется. Вместо этого в конце каждого месяца скачиваются транзакции предыдущего месяца (предпочтение — OFX, CSV если нет другого варианта) и импортируются вручную. Это работает, потому что Actual Budget используется в основном для отслеживания расходов, а не… собственно… для бюджетирования.
Podman.
Audiobookshelf
Добавление, скачивание и хранение аудиокниг и подкастов на сервере, прослушивание на телефоне. Функция аудиокниг используется нечасто (в основном для детей), но есть очень хорошая работа с главами. Раньше для подкастов использовались PlayerFM, затем Pocket Casts, но теперь, пока есть подключение к VPN, прибегают к Audiobookshelf.
Native.
Automatic Ripping Machine (ARM)
ARM автоматизирует рипинг и перекодирование DVD (и Blu-rays, но последние не используются). Да, сейчас 2026 год, а DVD ещё рипятся. Помните, мы отказались от потокового видео, поэтому это не только способ получить новый для нас контент, но и доступ к контенту на двух языках (английский и французский).
Podman.
Backrest
Веб-интерфейс для ПО резервного копирования Restic. Резервные копии важны! Особенно для Immich (фотографии). Restic хорошо дедуплицирует и сжимает данные, а Backrest облегчает управление политиками хранения. Уведомления об ошибках идут в Gotify.
Native.
Beszel
Beszel — простая панель мониторинга, собирающая базовые статистики от агентов (в классическом смысле — небольших фоновых сервисов) для отображения нагрузки ЦПУ, использования памяти и диска, температуры, батареи и т.п. Помогает следить за другими хостами в доме (несколько Raspberry Pi и кластер Proxmox, который может быть предметом будущей заметки).
Native.
Caddy
Caddy — веб-сервер и обратный прокси. Вначале не было понимания ценности обратного прокси и казалось, что можно обойтись локальным DNS-именем или даже IP-адресом с номером порта. Но со временем сервисов становилось всё больше, и некоторые требовали HTTPS. Зарегистрирован домен (не этот) и настроен Caddy для автоматического получения SSL-сертификатов LetsEncrypt. Теперь почти все сервисы доступны в LAN (или через VPN) по HTTPS с удобными поддоменами. Добавление нового сервиса — быстрое редактирование Caddyfile.
Native.
Cockpit
Cockpit — веб-консоль администрирования сервера. Использует обычные методы аутентификации системы. В основном полезен для замечания упавших сервисов, когда уведомления не настроены.
Native.
Forgejo
Forgejo — форк Gitea, развёртывается одним бинарником. GitHub-ы часто шутят о его reliability, но скорость своего git-remote тоже ценна. Когда-нибудь настроим CI/CD и runners, хотя бы для развертывания этого блога.
Native.
FreshRSS
Веб-читалка RSS. Сейчас в основном посещают два сайта, поэтому используется редко. Но есть подписка на GitHub releases сервисов, которые размещаются самостоятельно, чтобы видеть новые функции и исправления багов.
Native.
Frigate
Сетевой видеорегистратор (NVR). Вначале использовался Zoneminder (ностальгия), но стало ясно, что проект давно на спаде. Frigate оказался фантастическим. Работает с 8 IP-камерами, выдаёт уведомления о людях и машинах в проезде, интегрируется с Home Assistant для автоматизаций (например, когда человек в заднем дворе — включить прожектор камеры). Возможно напишу отдельную заметку о приключениях с IP-камерами.
Камеры работают с пониженным разрешением, чтобы избежать перегруженности Wi-Fi. Большинство поддерживают ещё более низкоразрешённый RTSP-подпоток, который использует Frigate для обнаружения движения и объектов. Низкие разрешения уменьшают нагрузку на процессор и память при обработке видео, экономят место на диске. Качество достаточно для опознания лиц, и законы страны запрещают съёмку общественных мест, поэтому камеры не смотрят далеко.
Podman.
Gonic
Subsonic-совместимый сервер, написанный на Go. Когда-то давно куплена вечная лицензия на Subsonic, но оригинальный проект древний, а современные альтернативы лучше. Запущены две отдельные копии Gonic: одна для детской музыки, другая для взрослой.
Native.
Gotify
Простой сервис уведомлений, написанный на Go. Многие self-hosted сервисы напрямую поддерживают Gotify уведомления или могут их отправлять через пользовательский HTTP POST. В сочетании с Uptime Kuma используется для оповещений о неработающих сервисах или устройствах, что смотрит сын на Jellyfin, когда в Audiobookshelf появился новый эпизод подкаста и т.д.
Native.
Home Assistant
Home Assistant заслуживает отдельной статьи. Это фантастика, и представить то же самое в рамках проприетарных экосистем вроде Google Home, Amazon Alexa или Apple Home сложно. Сейчас дела лучше, когда производители стандартизируют протоколы вроде Matter, но контроль и гибкость с Home Assistant перебить трудно. Кривая обучения крутая, и нужно подумать о реалистичных способах справиться с падением сервера без компрометирования функциональности дома.
Podman.
Homepage
На какой-то момент стало ясно, что сервисов столько, что нужен ещё один сервис просто для их отслеживания. Homepage — хорошее решение. Есть виджеты почти для всех запущенных сервисов, позволяя быстро увидеть, что происходит, или просто получить быструю ссылку на поддомен сервиса.
Podman.
Immich
Альтернатива Google Photos. Надоело, что Google постоянно в приложениях продвигает платные планы хранения. Хотя управление хранилищем было контролируемым, жена постоянно на грани переполнения. Перешли на Immich в прошлом году, вскоре после выхода версии 2. Страницы с фотографиями загружаются намного быстрее, когда весь трафик в пределах дома. Найден способ поделиться альбомами с семьей. Впрочем, в Immich ещё много работы — много дубликатов, и теперь, когда место не проблема, дисциплина в удалении фото и видео ослабла.
Podman.
Jellyfin
Как упомянуто во введении, самостоятельное размещение медиа началось давно — с MythTV двадцать с лишним лет назад. Jellyfin требователен к организации медиа, но в целом работает хорошо. Используется только для фильмов, ТВ и домашних видео, поэтому о других функциях (электронные книги, музыка, фотографии) ничего не скажу. Сын ещё помнит Netflix, но доволен Jellyfin. Нравится отсутствие автозапуска, никаких рекомендаций и того, что не нужно прокручивать гору мусора, чтобы найти то, что хочется смотреть.
Один из способов снижения требований — предпочтение 720p вместо 1080p или выше. И конечно, при рипинге DVD — 576p или 480p. Есть 4K TV, но он не очень большой, и хотя разница между SD и HD видна, 720p кажется достаточно хорошо для большинства контента.
Podman.
Music Player Daemon (MPD)
Иногда попадаются решения, которые просто работают и не требуют изменений. Кажется, MPD — одно из них. Существует 23 года. Gonic отличен для прослушивания музыки на телефоне, даже для потокового воспроизведения из дома через VPN, но MPD — это как музыка воспроизводится через Snapcast на всю домашнюю аудиосистему. Запущены две копии MPD: одна для музыки, одна для подкастов.
Native.
PocketBase
Раньше отслеживание транзакций и квитанций для спецсчётов (HSA, 529 и т.д.) велось в SQLite-файле, обращаясь прямо через SQL Workbench/J. Но усложнилось с переездами между странами, валютами, разными страховыми системами, и захотелось дать жене возможность вносить транзакции. Перешли на PocketBase, который по-прежнему просто SQLite-файл, но с хорошим веб-интерфейсом управления, который используется как generic CRUD-фронтенд. Достаточно простой для использования женой, и можно ещё запускать произвольные запросы к базовому файлу базы данных.
Native.
Readeck
Readeck позволяет тегировать и архивировать копии прочитанного. Активно используется Zotero во время учёбы в аспирантуре, но потребность в библиографиях давно прошла. Однако хочется быть уверенным, что можно вернуться к прочитанному позже. Сначала пробовали Wallabag, но он плохо справлялся с архивированием платного контента, даже когда был авторизован на телефоне. Readeck же архивирует то, что видит телефон, и хранит на сервере.
Native.
Samba
Samba обеспечивает общее сетевое хранилище, облегчая копирование файлов с сервера и на сервер, или поделиться важными документами с женой. Забавно, что протокол обмена файлами, разработанный в 1980-х и ассоциируемый с Windows, остаётся лучшим вариантом для кроссплатформного обмена файлами в локальной сети.
Native.
slskd
Native.
Snapcast
Snapcast обеспечивает синхронизированное аудио по всему дому. Подумайте о Sonos, но без дорогой привязки к вендору и планового устаревания. Это тоже заслуживает отдельной статьи. Сложно настраивать, но работает действительно хорошо. Планируется покупка дополнительных устройств в основном для использования в качестве приёмников Snapcast.
Native.
Syncthing
Syncthing — часть стратегии резервного копирования фотографий в Immich. Настроена одностороння синхронизация (receive only) на MacBook, так что копии всех фотографий в Immich в итоге попадают на внешний диск MacBook.
Native.
Transmission Daemon
Этот тоже самоочевиден.
Native.
Uptime Kuma
После нескольких случаев, когда жена говорила «X не работает» и нужно было вручную перезапустить сервис, стало ясно, что нужна система отслеживания запущенных или остановленных сервисов. Uptime Kuma простой, но с полезным набором функций. Можно пинговать устройства для проверки их включения, проверять статус Podman-контейнеров, искать HTTP 2XX ответы от разных сервисов, или даже парсить JSON-payload и извлекать детали для проверки здоровья. Если что-то упадёт, можно отправить уведомление Gotify (после нескольких повторных попыток, конечно).
Podman.
Vaultwarden
Self-hosted версия Bitwarden. Годами использовался KeePass, но не было хорошего решения для синхронизации, поэтому избегали логирования в вещи на телефоне. Тем временем жена использовала LastPass с его различными взломами и инцидентами, да и автозаполнение работало неважно. Перемещение её на KeePass было непрактично, и выбор пал на VaultWarden — open-source переимплементацию BitWarden API, совместимую с официальными клиентами BitWarden. Расширение BitWarden для браузера не очень нравится, но в целом приемлемо. Приложение для Android хорошее, синхронизируется плавно и автоматически при подключении к LAN; без VPN можно вручную запустить синхронизацию при необходимости.
Немного беспокойно, что Bitwarden когда-нибудь может стать враждебным к VaultWarden и сломать совместимость клиентов. На данный момент известен только ещё один крупный Bitwarden-совместимый клиент — Keyguard, у которого нет open source лицензии и используется freemium-модель.
Podman.
Vikunja
Десять лет использовался Trello. Но после катастрофического многодневного отказа Trello в начале года решено найти self-hosted альтернативу. Отклонены все варианты с PostgreSQL или MySQL для сервиса, обслуживающего двух пользователей. Vikunja по умолчанию использует SQLite, хотя может быть настроен на другие базы. Не идеален, в приложении для Android есть пропуски функций, но для текущих задач достаточно. Развертывание одним бинарником? Да, пожалуйста.
Podman.
Yubal
Простое веб-приложение для скачивания плейлистов YouTube Music. Обычно используется yt-dlp для скачивания видео с YouTube или NewPipe для просмотра на телефоне, но Yubal правильно именует, организует и тегирует музыку, скачанную из YouTube Music.
Podman.
То, что не запущено
Несколько вещей, что не размещаются самостоятельно, попробованы и отклонены, или маловероятно, что будут.
The *arr Stack
Sonarr, Lidarr, Radarr и прочие. Каждый раз, прочитав о настройке, это звучит как ресурсоёмкая неразбериха, изначально подверженная частым поломкам. Противоположность тому, что ищется при выборе self-hosted сервисов.
Collabora Online
Хотя было бы хорошо полностью избавиться от Google, сложно превзойти Google Docs как удобный и лёгкий способ хранения и обмена информацией. Но предпочтение — LibreOffice Writer и Calc, если только документ не нужно хранить в облаке. Если уже есть общий сетевой диск, нет смысла запускать сервис вроде Collabora Online (веб-офисный пакет) вместо использования LibreOffice локально.
Firefly III
Пробовали Firefly III перед Actual Budget, думая, что нужна встроенная поддержка нескольких валют. Была сложная настройка с несколькими контейнерами, включая один только для импорта данных. Actual Budget настраивается и использует намного проще. Для иностранных счётов написана простая скрипт для конвертации курсов валют, поэтому всё в Actual Budget остаётся в USD.
Owntracks
Нравился Google Maps Timeline, но после ограничения Google на данные геолокации только отдельного устройства захотелось найти self-hosted версию. Но никогда не получилось заставить приложение OwnTracks для Android последовательно сообщать позицию, несмотря на попытки разных настроек батареи и геолокации. Dawarich — ещё один вариант в этой области, но требует запуска «минимум» четырёх контейнеров (PostgreSQL, Redis, Sidekiq, веб-приложение). Это не убедительный обмен требуемых ресурсов на ценность, которая вероятно будет получена.
Music Assistant
Music Assistant может работать лучше, если нет уже полюбившейся музыкальной установки. В данном случае уже был Gonic, Snapcast и MPD, работающие хорошо. Music Assistant казался, что хочет «владеть» всем; например, постоянно переставлял группы устройств Snapcast.
Электронная почта
Self-hosting электронной почты — много работы за очень мало пользы. Невозможно рисковать неспособностью отправлять или получать письма. Когда-нибудь хотелось бы перейти от Gmail к платному провайдеру.
Заключение
Итого: 17 native сервисов и 11 Podman-сервисов, все управляемые systemd. htop сейчас показывает около 7.5 ГБ используемой памяти и ЦПУ колеблются между 30% и 40%. Получается, этот Mini PC может запустить много! Учитывая, насколько дорогим стало компьютерное оборудование из-за AI-бума, есть надежда, что продолжим видеть self-hostable проекты, которые ценят простоту и эффективность.