Yet another dev blog
Free Vectors by Vecteezy

© 2024 System Out

29.03.24 29 марта 2024 г.
⇦ Назад

Зачем я завёл себе домашний сервер

Homelab

Когда я учился в институте, то думал, что стану системным администратором.
Мне было интересно изучать различные операционные системы: после занятий ходил на курсы от Microsoft Academy по администрированию Windows Server, а по ночам возился с Fedora Core на виртуалке или устанавливал KDE на FreeBSD.
Также я подрабатывал “эникейщиком” по вызову, помогая людям переустанавливать Windows или настраивать принтеры и антивирусы.

В какой-то момент судьба сделала поворот, и в итоге я стал разработчиком.
Но желание поковыряться в операционках или в каких-нибудь компьютерных железках хоть и притихло, но никуда не ушло.

Четыре года назад, когда всех посадили на карантин, и появилось больше свободного времени, я решил купить себе одноплатный компьютер Raspberry Pi, о котором давно мечтал.
Я абсолютно не представлял зачем мне “малинка” и что я буду с ней делать, но очень хотелось покрутить сей девайс в руках и что-нибудь с ним придумать.
В итоге чего-то вразумительного придумать так и не удалось, поэтому “малинка” была отложена в дальний ящик.

Спустя где-то год я случайно наткнулся на видео в YouTube, где автор рассказывал про настоящий сервер у себя в подвале, на котором он развернул различные приложения для собственного пользования. Его пример мне так понравился, что я решил углубиться в эту тему.
Raspberry Pi была извлечена из дальнего ящика и подвешена под потолок рядом с роутером. Так у меня появился домашний “сервер”.

Homelab: что это и зачем?

Cловом Homelab (Home Laboratory или домашняя лаборатория) обычно называют одно или несколько физических устройств, которые располагаются дома и используются в качестве домашнего сервера. При этом слово “лаборатория” намекает на то, что обычно это нужно для обучения или исследования каких-то новых для себя технологий.

А изучать можно много чего, особенно если работа с серверами и системное администрирование не входит в сферу вашей профессиональной деятельности: проектирование сетей, сетевое оборудование, установка и администрирование операционных систем, виртуализация, работа с контейнерами, Kubernetes, развёртывание, мониторинг и бэкапирование приложений, DevOps, GitOps и многое, многое, многое другое.

Но только изучением всё не ограничивается.
Вместе с homelab частенько можно встретить слово “selfhosted”. Я бы сказал, что это целое движение, приверженцы которого вместо использования сторонних облачных сервисов стараются развернуть альтернативные варианты на своих серверах.
Причины для этого могут быть разные:

  • недоверие корпорациям, которые собирают о вас информации больше, чем нужно;
  • нежелание отдавать чувствительную информацию (например, пароли) в руки сторонних сервисов (например, облачным менеджерам паролей);
  • желание сэкономить, т.к. стоимость содержания домашнего сервера, на котором может быть развёрнуто сразу несколько приложений, бывает меньше, чем суммарная стоимость подписок на коммерческие сервисы.

Да и в целом от этого веет каким-то духом старых времён, когда не было всяких gmail-ов и dropbox-ов, а увлечённые люди сами для себя устанавливали почтовые сервера и держали ftp-хранилища в домовых сетях с исключительно лицензионным контентом 🙂.
Поэтому не всегда можно выделить какие-то рациональные причины, почему кто-то начинает самостоятельно хостить те или иные сервисы для себя и/или для своих друзей. Просто потому что хочется, потому что нравится, потому что может.

И если вы заведёте дома сервер, то обязательно найдёте что-нибудь для себя полезное, что можно будет на него задеплоить.

На сегодняшний день у меня развёрнуты:

  • Pi-Hole – DNS сервер, фильтрующий рекламу.
    С этого приложения у меня всё и началось.
    Знакомые многим блокировщики рекламы устанавливаются в браузер. Работают они по принципу анализа загруженного html + js кода, вырезая из страницы рекламу и трекеры.
    Pi-Hole (и его аналоги) устроен немного иначе. Обычно реклама загружается с определённых доменов или поддоменов. Люди собирают списки с такими адресами, чтобы можно было добавить их в Pi-Hole для блокирования.
    Работает это всё следующим образом: прописываешь на своём устройстве адрес сервера с Pi-Hole в качестве DNS сервера для интернет-соединения (например, для домашнего Wi-Fi), далее заходишь на какой-нибудь сайт, где скрипт рекламы подгружает рекламу с определённого домена. Устройство запрашивает у DNS сервера IP-адрес для этого домена, а в ответ получает localhost вместо реального IP, так как этот домен находится в списке для блокировки. В итоге никакой контент с рекламой не загружается и плагину в браузере вырезать нечего.
    Загружаешь меньше – страницы грузятся быстрее и появляется ощущение, что интернет работает чуточку быстрее. Учитывая, как некоторые сайты любят напихать себе побольше баннеров и всяческих трекинг-сервисов, порой увеличение скорости загрузки заметно невооруженным глазом.
    Вдобавок, раз это полноценный DNS сервер, то в него можно прописывать доменные имена на другие домашние сервисы и не заморачиваться с запоминанием IP адресов.
    Сейчас я перехожу с Pi-Hole на AdGuard Home, который делает примерно всё то же самое, но обладает некоторыми дополнительными возможностями.

  • RSS to Telegram Bot – Телеграм бот для отслеживания обновлений в RSS каналах и отправки уведомлений.
    Как-то не прижились у меня программы RSS-аггрегаторы. Одни закрываются, другие становятся платными, третьи зарастают ненужными функциональностями. Периодически приходится менять программу, устанавливать её на все устройства, привыкать к новому интерфейсу. Надоело.
    Телеграм же у меня всегда под рукой. Регистрируешь бота, разворачиваешь у себя серверную часть, скармливаешь боту список своих подписок и вуаля – все нотификации приходят в единый и удобный для меня канал.
    Таким образом я отслеживаю не только блоги или какие-нибудь хабы на хабре, но и интересные YouTube каналы, на которые тоже можно получить RSS фид. Больше не нужно переживать, что пропустишь что-то интересное из-за того, что официальный YouTube клиент решит подсунуть в ленту бесполезные рекомендации вместо новых видео с твоих подписок.

  • Gitea – selfhosted аналог GitHub.
    Я очень люблю Git (и GitHub) и стараюсь использовать его везде, где только можно.
    Так, например, помимо проектных репозиториев я храню в GitHub свои заметки в markdown формате, которые делаю в программе Obsidian. И скрипты для развёртывания приложений на домашнем сервере я храню в GitHub. Там же лежат всякие скрипты и настройки для моего компьютера и ноутбука.
    А чтобы не переживать, что в какой-нибудь злосчастный день GitHub может заблокировать доступ к моим данным, я настроил синхронизацию репозиториев GitHub на свой сервер с Gitea.
    Ещё в Gitea есть встроенный docker registry, куда можно заливать контейнеры со своими наработками. Вдобавок недавно Gitea выкатили поддержку GitHub Actions, и я использую этот сервер теперь не только для хранения данных, но и для своих devops пайплайнов. А так как в GitHub я тоже использую Actions, то не пришлось изучать новый инструмент и новый синтаксис.
    К примеру, именно так я тестирую этот блог. Когда я добавляю новую фичу или статью, то сначала заливаю код в Gitea в определённую ветку. В этой ветке настроен пайплайн, который запускает генерацию сайта, заворачивает полученный дистрибутив в docker контейнер, пушит контейнер в docker registry и дёргает скрипт передеплоя на другом сервере, где делается pull новой версии контейнера и перезапуск docker-compose.
    Проверив на домашнем сервере новую версию блога, я делаю пуш в GitHub, где запускается другой пайплайн, который собирает дистрибутив сайта и выкладывает его в GitHub Pages.
    Если бы потребовалось выбирать, я бы назвал Gitea своим самым любимым сервисом на домашнем сервере.

  • linkding – минималистичный менеджер закладок.
    Так вышло, что на разных устройствах в сумме я пользуюсь тремя разными браузерами (не спрашивайте), поэтому браузерные закладки мне не подходят. Не скажу, что linkding меня устраивает на 100%, но это пока лучшее из всего, что я пробовал.
    Хочу ещё пощупать shiori в качестве “read-it-later” сервиса наподобие Pocket. Но пока руки не дошли.

  • Nginx Proxy Manager – proxy, с помощью которого я настроил доменные имена и https доступ к своим домашним сервисам.
    Хороший мануал можно посмотреть тут. Для работы docker registry в Gitea https обязателен, в остальном в рамках домашней сети можно было бы обойтись и без него.
    Хочу когда-нибудь переехать с него на Traefik, который хранит конфигурацию не в БД, а в конфиг-файлах, чтобы положить их в git.

  • Uptime Kuma – простенький сервис для мониторинга доступности других сервисов.
    Планирую переехать на Gatus, чтобы тоже можно было хранить конфиги в файлах в git.

  • Homer – дэшборд со ссылками на домашние сервисы.
    Начинал с Heimdall, перешёл на Homer тоже из-за хранения конфигов в файлах вместо БД. Сейчас собираюсь мигрировать в homepage, т.к. там возможностей побольше.

  • Jellyfin – медиа центр по типу какого-нибудь Кинопоиска для локального хранилища с медиа файлами.

Из основного – пока всё.
Ещё есть несколько видов СУБД для локальной разработки и некоторые свои пет-проекты.

Как можно заметить, selfhosting – это непрекращающийся процесс каких-то изменений, улучшений, миграций с одних сервисов на другие. Ты узнаёшь что-то новое, хочешь реализовать изученное у себя на сервере, меняешь деплоймент, переходишь с одних сервисов на другие, добавляешь новые.

Существует огромная подборка selfhosted сервисов на GitHub. Советую почитать хотя бы по диагонали. Иногда даже в голову не приходит, что тебе нужен какой-то сервис. А потом натыкаешься на него в такой подборке и дальше жить без него не можешь 🙂.

С чего начать?

Универсального ответа на этот вопрос, конечно же, нет, так как у всех разный начальный уровень знаний.
Но для старта точно не требуется каких-то больших вложений.

Как уже писал, я начинал с одного Raspberry Pi, на котором поместилась большая часть приложений из списка выше. Прекрасно подойдёт старый компьютер или старый ноутбук. Видел как умельцы приспосабливают даже старый телефон на Android под какие-то серверные приложения. Но новичкам такое бы не посоветовал.

Если желание что-то изучать есть, а подходящей железки под рукой нет, можно найти дешёвый облачный сервер или просто развернуть виртуальную машину на локальном компьютере.
А дальше шаг за шагом изучайте то, чего не знаете.

Никогда не работали с Linux? Найдите в интернете мануал как установить какой-нибудь серверный Linux-дистрибутив и развернуть на нём простейший http сервер.
Не знаете ничего про docker? Обязательно установите его на свой сервер и разверните парочку приложений в контейнерах. В интернете найдётся не одна инструкция и по докеру в целом, и по развёртыванию каких-нибудь конкретных приложений в контейнерах.
Хочется разобраться с Kubernetes? Вот сайт с серией статей про установку k3s (облегчённый дистрибутив кубера) на несколько Raspberry PI.
Я разворачивал у себя на двух “малинках” – всё получилось. Возможно, когда-нибудь вернусь к Kubernetes на своих серверах.

Сейчас в открытом доступе достаточно информации, чтобы научиться практически чему угодно, было бы желание.
Например, по этой теме я черпаю информацию (и вдохновение) в основном из трёх источников:

  • YouTube канал TechnoTim
    Тут я могу рекомендовать чуть ли не каждое второе видео. Есть и обзор железок, и какие-то материалы с теорией, и туториалы по различным selfhosted сервисам, и обзорные видео по домашним серверам автора, в которых можно подметить какие-то идеи для себя.

  • YouTube канал NetworkChuck
    На этом канале поменьше полезных видео (на мой взгляд), но зато если такие появляются, я готов их рекомендовать.
    Например, видео про сети в docker. Или про docker-compose. Или целая серия видео про подсети, например вот это, где рассказывается про диапазоны IP адресов, или это про создание собственных подсетей.

  • Subreddit SelfHosted, где время от времени появляются хорошие посты с рассказами про свой опыт или со ссылками на что-нибудь интересненькое.

Остальное – через поисковики и perplexity.ai.

Чем больше попробуете сделать всякого разного своими руками, тем больше знаний и навыков приобретёте.
Главное – не бойтесь экспериментировать, не бойтесь что-то сломать (не физически, а внутри ОС 🙂). Это только ваш сервер, и он создан для обучения. Если что-то пошло не так, всегда можно отформатировать жёсткий диск и начать всё с нуля.
Когда начинать заново надоест, вы придёте к желанию автоматизировать настройку системы и развёртывание приложений. И это тоже отдельная большая тема, достойная изучения.

И лишь когда захочеся разделить стабильно работающий с нужными приложениями сервер и сервер для экспериментов, тогда можно будет задуматься о втором компьютере в вашей домашней лаборатории.

Долгое время я обходился одной Raspberry Pi, затем приобрёл вторую.
Сейчас в мой homelab входят:

  • 2 x Raspberry Pi 4B, 8GB RAM

  • Неттоп Beelink Mini S12 Pro (Intel N100, RAM 16 ГБ, SSD 500 ГБ)
    Я установил на него гипервизор Proxmox и разбил на две виртуалки для разных нужд, где требуется жесткий диск (а не флешка, как на RPi) и/или x86_64 процессор, а не arm. В основном это Gitea, всякие СУБД и в планах система для мониторинга и сбора метрик.

  • Коммутатор MIKROTIK RB260GS
    Если по началу сетевых разъёмов на роутере хватит, то с ростом количества устройств потребуется дополнительное сетевое оборудование. Сейчас немного жалею, что взял такой маленький коммутатор, уже занял все слоты.

  • Сетевое хранилище (NAS) Synology DS220+ и диск Western Digital Red Plus на 4 ТБ
    В целом NAS можно собрать и самостоятельно, но мне захотелось чего-то готового.
    Synology предоставляет из коробки систему, на которую в пару кликов можно поставить и домашнее облачное хранилище по типу Dropbox, и развернуть облачную платформу для работы с офисными документами, и многое другое. А наличие внутри докера позволяет развернуть прям на этом же сервере что угодно из списка selfhosted приложений.
    На этой машинке я развернул Jellyfin и linkding, чтобы в случае переезда по началу можно было подключить только NAS и получить доступ к самому необходимому.

  • Источник бесперебойного питания Ippon Back Power Pro II Euro 850
    В моих краях бывают проблемы с электричеством. Помимо защиты устройств от просадок или скачков напряжения, в случае отключения света этот ИБП может поддерживать работу всех моих устройств в течение нескольких часов.

В целом такого запаса вычислительных мощностей для домашних нужд хватит на долгое время. Больше половины сервисов у меня до сих пор развёрнуто на одной Raspberry Pi.

А выглядит всё это вот так: Моя "серверная"

Никаких серверных стоек и прочего гламура. Просто кучка железяк у стены в кладовке 🙂.

На этом обзор, думаю, можно закончить. В следующей статье на эту тему я расскажу про свой подход к автоматизации деплоя приложений в docker контейнерах с помощью Ansible.

Если у кого-то тоже есть домашний сервер – поделитесь в комментариях на каком железе и что вы у себя развернули.