Есть отличный термин self hosted
, который очень популярен в англоязычном интернете.
Но он плохо переводится, почти как open source - хотя википедия и пытается дать ужасно звучащий термин "самохостинг"...
Как ни странно, на Хабре нет про него обзорных статей, и даже нет соответствующего тега, хоть я и искал.Возможно, плохо искал, и вы кинете в комментарии что-то хорошее.
В общем, self hosted - это когда вы решаете, что какие-то вещи лучше хранить у себя, а не отдавать злым корпорациям - фотографии, почту, умный дом, книги, и так далее.
И собираете под это какой-то сервер, полноценным хозяином которого являетесь только вы.
Эту статью я пишу во многом для нескольких друзей, которые решили приобщиться к этому тренду, и здесь будет обзор моего личного self hosted - про всякие разные штуки, которые показались полезны лично мне, и плотно заняли своё место на моём домашнем сервере.
На хабре много опытных пользователей, так что если вам что-то кажется очевидным - смело листайте дальше. Здесь есть много классных подробных статей, которые идут в глубину, а в этой статье я хотел дать общее представление, куда вообще можно копать и что делать.
Железки
Наверняка, вы начнёте с вопроса - "и куда мне всё это ставить?" Вариантиков много, и у всех есть плюсы и минусы.
Raspberry pi. По моему необязательному мнению - неоправданно дорогое, слабое и не масштабирующееся решение. Да и память в них быстро умирает. Но если у вас мало места и хочется чуток поэкспериментировать - хороший вариант.
Мини-ПК, например Intel NUC, или любой другой. Не сильно больше по размеру, зато полноценная железка с кучей оперативки и SSD. Минус - я не очень представляю, как это добро ремонтировать, если что-то погорело, в особенности если вы взяли красивую экзотику с алика.
Старый ноутбук. Отличный способ бесплатного переиспользования того, что и так пылится в шкафу.
Готовый брендовый NAS. Мне вот очень нравятся Synology. Они красивенькие, выглядят довольно долговечно, ремонтопригодно, и в них обычно сразу есть куча всего полезного софта и бекапы в облако производителя. Хотя с некоторых пор облачные бекапы в другие страны стали вызывать вопросики. Минус только один - дорого.
PC. Мне кажется идеальным вариантом, если у вас есть место, куда его можно закинуть. Всегда можно модернизировать, и легко выкинуть и заменить умерший диск\кулер\материнскую плату \ что угодно. Минусы - большой размер, большее энергопотребление, и весь софт - это то, что ты поставил туда сам. В общем, на любителя вроде меня.
Как туда ставить софт?
Начинал я с олдскульной установки всего софта в пакетах, однако примерно год спустя снёс всё нафиг и перешёл на докер контейнеры:
Это безопаснее. Например, в статье рядом я рассказывал, как поднять заведомо устаревший на 10 лет и дырявый софт.
Это надёжнее, так как в меньшей степени зависит от версии твоего дистрибутива Linux, установленных пакетов и погоды на улице
Можно поиграться и снести обратно какой-то сервис, не оставив от этого ни следа. А после классического способа установки в виде пакетов часто остаются конфиги, базы, настройки, логи, подцепленные репозитории, установленные зависимости и так далее.
Легко выделить мух и котлеты. Котлеты - в смысле - данные сервиса. Гораздо прозрачнее, что именно нужно резервировать.
Это банально быстрее - достаточно скопипастить compose файл - и вуаля, сервис поднят.
Если у вас красивый дорогой NAS, то в нём часто есть свои средства работы с контейнерами.
Если нет - удобно поставить какой-нибудь UI для того, чтобы не делать всё через терминал.
В качестве примера такого UI мне нравится portainer - бесплатный, легковесный, с удобным UI.
Если актуально, могу приложить свои docker compose файлы для каждого упомянутого в статье сервиса, но вообще в 2024 они всегда лежат где-то рядом с главной страницей, как основной способ установки. Ссылки давать не буду - весь помянутый софт находится по первой ссылке с запроса в поисковике.
Так, а что ставить-то?
Умный дом
Майн гот, ещё одна статья про умный дом? Нет, конечно! Про него уже сказали тысячу раз, и есть много хороших статей. В том числе я даже писал про умный дом моего геккона. Так что просто упомяну, что у меня стоит Home Assistant (вот например хорошая обзорная статья про него на хабре).
Кроме самого Home Assistant, в комплект у меня входит:
ESPHome - позволяет программировать на ямлах микроконтроллеры и легко интегрировать их в Home Assistant.
Zigbee2Mqtt - классная софтина, которая позволяет засунуть в Home Assistant практически любой Zigbee девайс.
Mosquitto - требуется для Zigbee2Mqtt, и в целом для Mqtt, если этот прокол вам нужен. Иногда посматриваю на EMQX - но mosquitto полностью удовлетворяет мои небольшие потребности.
Hass-dbstats - написанный мной сервис для контроля за размером СУБД Home Assistant. Можно использовать как эддон и как docker контейнер.
Frigate - для записи видео и прокидывания всяких событий в Home Assistant. У меня он записывает входящих в дом людей и кидает в телеграмм картинки с ними.
Торренты
После 2022 года актуализировалась... Потребность передавать друзьям большие файлы, конечно же. Например, фотоархивы с праздников. И если вы не пользуетесь большим и дорогим облаком, то раздавать их через торренты - отличный вариант.
Что тут есть интересного:
Transmission - наиболее экономный по ресурсам клиент. К сожалению, я перестал его использовать, так как его веб интерфейс так и не поменялся за последние 20 лет...
Qbittorrent - торрент клиент, который использую сейчас. Довольно прожорлив по ресурсам, и даже при ограничении оных начинает жрать своп (в докер файле 3 стандарта нельзя вменяемо его запретить). Тем не менее, если поиграть с настройками - получается довольно неплохо. А интерфейс - самый приятный.
Opentracker - домашний трекер, если вы хотите раздать что-то друзьям и не светить на открытых трекерах. Древний, как бивень (бивень же, да?) мамонта, но работает, и ресурсов не кушает.
Просмотр видео
Вот решили вы... Посмотреть запись семейного праздника. Которая у вас лежит на домашнем сервере. Самый простой вариант - сделать на сервере, где лежит видео, samba share с разрешением на чтение, и открывать видео по сети через VLC, который можно поставить на любой утюг. Однако, не всегда видео пролазит через сеть, не все форматы хорошо декодируются, и, если ваши праздники разбиты на много эпизодов - их просто неудобно переключать. Поэтому часто ставят различные медиа серверы, которые имеют удобный интерфейс и на лету кодируют видео в удобный формат.
Мой выбор пал на Jellyfin - он понравился простым и удобным веб интерфейс и хорошими андроид клиентами. Из альтернатив можно ещё посмотреть на Kodi и Emby. А вот Plex многим разонравился за его текущий фокус на модель подписки.
Секретики
Привет друзьям-параноикам! Долгое время для хранения явок и паролей я использовал KeePass, но было неудобно шарить базу паролей между телефоном и компьютером, а плагины с сетевыми дисками постоянно отваливались. Плюс к этому, меня несколько напрягало, что браузеры пытаются запоминать и хранить мои пароли - получить их оттуда довольно несложно.
Поэтому мой выбор довольно безальтернативно пал на Vaultwarden - открытый бекенд сервер для Bitwarden, приложения для управления паролями. Все пароли хранятся в зашифрованом виде, есть классные клиенты под все платформы и удобная веб морда. Мне казалось, я буду долго настраивать и мучаться от неудобства - но по факту переезд занял один вечер. Больше никаких паролей, сохранённых в браузере!
У нас дыра в безопасности!
В какой-то момент возникает вопрос - а как бы всё это богатство прикрыть?
У большей части сервисов есть какая-то авторизация - но не факт что не дырявая. И открывать их в интернет просто стрёмно. Конечно, есть радикальный метод - сделать домашние сервисы доступными только через VPN. Но не всегда это возможно и удобно. А делать это выборочно - половинчатое решение.
Здесь помогают сервисы, которые закрывают собой все ваши сервисы, не позволяя открыть их без авторизации. Кажется, большая часть пользователей выбирает Authelia за малое потребление ресурсов, но я сходу не разобрался, как там настроить нужный мне OAuth.
Поэтому я выбрал Authentik - вполне себе Enterprise grade авторизационный провайдер. Удобный интерфейс, можно быстро настроить буквально что угодно. Только вот жрёт примерно гигабайт оперативки, что конечно несколько перебор для решения задачи авторизации полутора пользователей...
Базы данных
Большая часть приложений предлагает несколько СУБД на выбор. Мой личный выбор в 2024 - Postgres. Быстрый, удобный, не кушает лишней памяти. Есть холиварный вопрос по поводу того, как именно ставить СУБД - ставить её на основную ОС, или ставить внутри контейнера, а если внутри контейнера - то использовать одну, или несколько разных инстансов. На этот холивар я уже как-то потратил вечер своей жизни, больше не хочу - так что просто скажу, что мне удобнее, когда база живёт в контейнере, и на каждое приложение есть по своему инстансу. Накладные расходы не так велики, а с изоляцией как-то спокойнее. Конечно, если у вас много больших баз, то картинка будет совсем другая, и лучше объединять базы, разграничивая доступ по разным пользователям.
Как объединять всю эту кашу
Если вы ставите всё на свете как эддоны Home Assistant, то он решает задачу объединения сервисов и отображения некоей единой точки входа. Но лично мне страшно не нравится эта модель, и она жутко реализована. Поверьте, я знаю, что говорю, я писал эддон для Home Assistant. Так что нужно какое-то другое решение. Обычно все начинают с того, что просто выкидывают сервисы на разные порты. Но потом ты думаешь о том, чтобы
прикрутить SSL
Добавить авторизационного провайдера
сделать разные домены
И здесь уже потребуется что-то, что будет всё это добро объединять и проксировать наружу.
По старой памяти у меня используется Nginx:
Мне легко и удобно всё в нём настраивать
Нравится, что настройки можно бекапить в гит
Приятно, что у меня есть гранулярный контроль над поведением прокси Но это не слишком user friendly подход в 2024 году, некий входной порог и много ручной работы - поэтому многие используют Traefik или Nginx Proxy Manager.
Traefik вроде как позволяет автоматически находить и "цеплять" сервисы из докер контейнеров, сам поднимает SSL, рисует красивые дашборды... А Nginx Proxy Manager вроде как обладает удобным UI, через который всё можно накликать.
Вопрос того, как всё это добро выставить в интернет - выходит за рамки этой статьи, но, к счастью, я уже писал другую статью по этому поводу. Советую обратить внимание на комментарии - там дали больше полезных советов, чем в самой статье!
Мониторинг
Когда весь этот зоопарк разрастается, и ещё у тебя есть несколько серверов со всякими пет проджектами - очень хочется автоматически наблюдать состояние серверов и сервисов.
Довольно долго я колебался между старым добрым Zabbix и связкой prometeus+Grafana, но всё же остановился на Zabbix. Кажется, он лучше подходит на роль "общие метрики из коробки". Пока не пожалел - штука довольно удобная, хотя интерфейс практически не поменялся лет за 10.
Единственная заметка - стоит хостить сам сервер вне дома, а дома держать агент. Иначе вы не узнаете о том, что домашний сервер упал...
Так же:
Для быстрой диагностики я иногда использую glances, который фактически является удобной веб мордой для htop.
За дисками я смотрю при помощи scrutiny
Проверяю обновления моих образов при помощи whats-up-docker. Пожалуйста, не используйте watchtower для автоматического обновления - это синоним автоматического падения ваших сервисов в случайное время.
Смотрю логи контейнеров при помощи dozzle
Бэкапы
Бэкап жёсткого диска
Вы мне вряд ли поверите, но в момент написания этой секции я вспомнил, что с утра у меня диск домашнего сервера перешёл в RO. Я пошёл смотреть в диагностическую тулзу scrutiny, и обнаружил, что вчера (4 июля) резко выросло количество нестабильных секторов:
"Ну, мало ли" - подумал я. "Может контакт отошёл". Пошёл переткнул. После чего диск вообще перестал распознаваться:
Jul 5 00:41:29 jehy-surveillance kernel: [ 537.858296] ata6: link is slow to respond, please be patient (ready=0)
Jul 5 00:41:33 jehy-surveillance kernel: [ 541.858311] ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 310)
Jul 5 00:41:33 jehy-surveillance kernel: [ 541.858980] ata6.00: failed to IDENTIFY (INIT_DEV_PARAMS failed, err_mask=0x80)
В качестве пруфа вот вам ещё скрин из заббикса:
Штош. Вот вам и наглядный смысл бекапов. К частью, я могу спокойно дописывать статью, ведь всё важное содержимое диска у меня в режиме реального времени пишется в облако.
Лично я в качестве резервного облака использую яндекс, потому что там есть удобный CLI, но наверное можно использовать и другие. Например, вот так выглядит синхронизация входящих. В прямом смысле - входящих в дверь!
Но при этом стоит помнить, что даже самые крупные и известные облака периодически что-то теряют. Так что я предпочитаю добавить к этому холодный бэкап - периодически подключаемый диск, на который копирую важную информацию, и убираю его подальше в шкаф.
Бэкап СУБД
Как сказал бы Боромир - нельзя просто так взять и забэкапить файлы СУБД. С большой вероятностью восстановиться из такого бэкапа не выйдет. Поэтому для "горячего" бэкапа нужно использовать соответствующие инструменты. Мне очень понравился контейнер для горячих бекапов Postgres - он занимает 20 MB оперативной памяти, и по крону пишет регулярные бекапы приятной структуры.
Чего у меня нет (пока?)
Своей библиотеки книжек, на роль которой может претендовать Calibre/Paperless
Своего почтового сервера, так как за много лет я привык к вполне определённому сервису и его интерфейсу. Да и доверия крупным компаниям в отношении почты у меня больше, чем своим кривым рукам. Впрочем, даже reddit согласен со мной, что не надо использовать свой почтовый сервер.
Своего файлового сервера. Мне вполне хватает, что диск моего домашнего сервера имеет двустороннюю синхронизацию в облако, где я могу всё смотреть, редактировать и шарить с другими людьми. Хотя можно бы поставить OwnCloud - кажется, он неплох. То ли Nextcloud. Если честно, не помню, кто чей форк.
Своего гит сервера. Да, мне уже блокировали гитхаб, и это было очень стрёмно - но мне хочется работать в облаке с другими людьми, и пока что я продолжаю его использовать. Но крон демон со скриптом бэкапа постоянно обновляет локальную копию моих репозиториев. Но если бы я ставил свой сервер, скорее всего это был бы Gitea.
Красивой домашней странички для сервера. Кажется, штуки типа Dashy/Homarr/Heimdall сейчас очень популярны, но я не вижу для себя в этом смысла.
Менеджера задачек. Стандартный облачный календарь закрывает далеко не всё, и я лениво посматриваю в сторону Vikunja
CompreFace и Double Take для распознавания всякого с видео. На самом деле, я даже ставил их, и смог натренировать. Но не придумал, зачем мне это, и пока снёс. Хотя лелею мысль в будущем повесить камеру на улицу, и в автоматическом режиме постить в особый канал всех замеченных котиков, чтобы хозяева могли там искать потеряшек.
Ноу хау
Ну и напоследок - пара забавных неочевидных вещей.
Яндекс станция. Для увлечённого технаря её возможностей умного дома вряд ли хватит, но она отлично встраивается в экосистему Home Assistant. Не вижу смысла спорить о том, что лучше - управление голосом, кнопками, или телефоном - если можно сделать все три варианта параллельно.
Облачный self hosted. Звучит как взаимоисключающие вещи, но на самом деле часть инфраструктуры вполне можно увести в облачный или обычный внешний сервер. У меня там стоит zabbix, Authentik, второй синхронизирующийся Mosquitto, opentracker и vaultvarden - все те штуки, которые хочется иметь в доступе, даже если домашний интернет отвалился, что нередко бывает в моём посёлке. Да, можно конечно сделать резерв через симку... Но так спокойнее.
Ссылки
Огромное количество всего интересного есть в сабреддите selfhosted
Гагантский список сервисов на все жизни можно посмотреть в репозитории awesome-selhosted
Ещё один список, чуть больше подходящий для системных администраторов, но полезный и для дома - awesome-sysadmin
Чудесный и отзывчивый чат про Home Assistant
Отличный чат про железки для умного дома
И ещё один - про ESPHome
Вместо заключения
Конечно, говорить о selfhosted можно бесконечно, но я столько не смогу написать, а вы - прочитать. Но если интересно развернуть какую-то тему - можем сделать это в комментариях. Так же было бы интересно узнать, а какие ещё полезные инструменты используете вы на своих домашних серверах.