cloud cloud cloud cloud

2 ГБ ОЗУ, eMMC и китайский адаптер: как выживает мой домашний сервер на Alpine Linux

Итак, пару дней мой домашний сервер был вне зоны досягаемости. Хостинг лег, достучаться до него я не мог. Долгие часы диагностики, пинги в пустоту и, наконец, вердикт: умер китайский адаптер USB Type-C — SATA.

Но эта история не про хрупкость китайской электроники (хотя и про неё тоже). Эта история про то, как на «хламе» поднять полноценную, надежную и невероятно экономную домашнюю лабораторию.

«На таком далеко не уедешь». А вот и зря!

Давайте посмотрим правде в глаза: моя сборка — это тонкий клиент HP T430.

  • ОЗУ: 2 ГБ.
  • Процессор: Intel Celeron N4020 (2 ядра, Gemini Lake).
  • Накопитель: распаянная на плате eMMC.

Казалось бы, на таком железе можно только роутер крутить, но никак не полноценный сервер. Но вы удивитесь, если я скажу, что с правильной ОС эта малышка тянет на себе весь мой домашний инфраструктурный зоопарк. Секрет прост — Alpine Linux.

Энергоэффективность — одна из главных целей

Отдельно хочу подчеркнуть: я сознательно выбирал железо с минимальным энергопотреблением. Домашний сервер работает 24/7, и счёт за электричество — это реальная статья расходов. Мой HP T430 с Celeron N4020 в простое кушает около 4–6 Вт, а под нагрузкой едва переваливает за 15 Вт. Для сравнения: среднестатистический настольный ПК в простое легко съедает 50–80 Вт, а в пике — все 200+.

За год разницы в счетах за свет можно окупить часть оборудования. А если добавить сюда грамотную ОС, которая не гоняет диск почём зря и не держит процессор в тонусе ради фоновых задач, — получается по-настоящему «зелёный» сервер.

Магия eMMC и режим Diskless

eMMC — это, конечно, не SSD. Он не блещет скоростью, а главное — быстро изнашивается от постоянного чтения-записи (особенно если система начнет активно писать логи или swap).

Но в Alpine Linux эту проблему решает запуск в diskless-режиме (без дисковый режим). Что это значит? При загрузке система полностью распаковывается в оперативную память и работает целиком из неё. Все изменения, которые вы вносите в систему, тоже живут в RAM. На саму eMMC система практически не пишет, что убивает проблему износа и дает молниеносный отклик, ведь скорость упирается только в оперативную память. А чтобы изменения не пропали после перезагрузки, их нужно просто «закоммитить» на носитель (об этом ниже).

Минимализм во всем: прощайте, bloated-решения!

Раз уж сама система — это эталон минимализма, то и подход к сервисам должен быть соответствующим. Никакого «раздутого» софта.

Поначалу я, как и многие, пихал всё в Docker-контейнеры. Но быстро устал. Организация сетевого общения контейнеров друг с другом, проброс портов, оверлеи — это оказалось слишком сложно для моих задач и жрало те самые 2 ГБ ОЗУ.

В репозиториях Alpine есть огромное количество приложений, которые можно поставить нативно, прямо в систему. И знаете что? Это работает идеально. Мой HP T430 сейчас управляет:

  • NFS (расшариваю файлы);
  • WireGuard (удалённый доступ к серверу и мост с VPS);
  • AdGuard Home (режу рекламу на уровне сети);
  • Nginx (хостинг для локальных и внешних проектов);
  • Asterisk (мини-АТС, которую я настроил один раз и больше не использую — но об этом расскажу в отдельной статье, там история достойная).

Всё это работает нативно, потребляет копейки ресурсов и не требует оркестрации.

Табу на Python и спасение eMMC

Чтобы еще сильнее ужать потребление памяти и окончательно избавиться от необходимости использовать Docker, я ввел жесткое правило: не использовать приложения на Python. Они слишком прожорливы. Вместо них — бинарники на Go, Rust или классический C из репозиториев Alpine.

Именно поэтому, кстати, я отказался от Pi-hole в пользу AdGuard Home. Pi-hole — отличное решение, но его веб-интерфейс и часть компонентов сидят на PHP/Python, что для моего маломощного железа избыточно. AdGuard Home же написан на Go — один бинарник, минимум зависимостей, работает быстро и ест памяти в разы меньше.

А чтобы окончательно снять нагрузку с eMMC, я вынес все логи на внешний диск. Система пишет события туда, а внутренняя флеш-память отдыхает. Проблема нехватки места и износа решена полностью.

Мониторинг: от сложного к простому

Поначалу я, как и все, хотел «правильный» мониторинг. Пробовал разные решения — от тяжёлых Zabbix и Prometheus до более лёгких Kuma Uptime и Netdata. Но даже они оказались too much для этого сервера. Каждое решение жрало ресурсы, требовало обслуживания, обновлений, и в итоге я от всех них отказался.

Всё, что мне нужно — это понимать, что сервер жив и работает. Поэтому я пришёл к самым простым bash-скриптам. Каждое утро они собирают сводку по загрузке, статусу сервисов и свободному месту, а затем отправляют мне отчет по протоколу XMPP. Дешево, сердито и надежно. Никаких веб-интерфейсов, никаких баз данных, никаких зависимостей. Просто скрипт, который делает своё дело и молчит, если всё хорошо.

Грабли, на которые я наступаю (и вам советую)

Казалось бы, идеальная система. Но в мире хоумлаба «всё бы хорошо, но что-то постоянно ломается».

  1. Тайны BIOS. Отключили свет. Тонкий клиент отказался включаться самостоятельно при подаче питания, хотя в BIOS было четко настроено «Always On». Пришлось идти и нажимать кнопку. (Классика тонких клиентов, их BIOS иногда живёт своей жизнью).
    • Решение? Подумал, что можно поставить умную розетку, чтобы перегружать сервер по питанию, и умную тыкалку (fingerbot), которая физически нажимает кнопку старта на сервере. Да, есть и такие костыли в мире умного дома — и я, кажется, к ним скоро приду.
  2. Ловушка lbu commit. Перегрузил сервер после каких-то настроек, а часть сервисов не запустилась. Почему? Потому что я забыл сделать lbu commit.
    • Для тех, кто не в курсе: в diskless-режиме Alpine все ваши настройки живут в оперативке. Чтобы они сохранись на физический носитель и пережили ребут, нужно явно сказать системе упаковать изменения в архив командой lbu commit. Забыл сделать — откатился к состоянию последней загрузки.
  3. И, наконец, тот самый китайский адаптер, с которого всё началось. Он просто взял и перестал определяться.

Зачем всё это нужно?

В моменты, когда сервер лежит, а ты сидишь с внешней клавиатурой и консолью, думаешь: «Проще арендовать VPS за 300 рублей в месяц и не париться».

Но нет. Моя домашняя лаборатория — это моя мужская игрушка. Это мой личный полигон. Здесь я трачу время, набиваю шишки, получаю бесценный опыт и понимаю, как вещи устроены изнутри. VPS не даст тебе этого чувства, когда ты сам, своими руками, выжимаешь максимум из куска железа. К тому же, VPS — это всегда чужое железо, чужая сеть и чужие правила. А здесь — всё твоё, и ты волен делать с ним что угодно.

Так что, друзья, стройте свои хоумлабы, ставьте Alpine, экспериментируйте с сетями и скриптами. Балуйтесь на здоровье! И вам советую.