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. Дешево, сердито и надежно. Никаких веб-интерфейсов, никаких баз данных, никаких зависимостей. Просто скрипт, который делает своё дело и молчит, если всё хорошо.
Грабли, на которые я наступаю (и вам советую)
Казалось бы, идеальная система. Но в мире хоумлаба «всё бы хорошо, но что-то постоянно ломается».
- Тайны BIOS. Отключили свет. Тонкий клиент отказался включаться самостоятельно при подаче питания, хотя в BIOS было четко настроено «Always On». Пришлось идти и нажимать кнопку. (Классика тонких клиентов, их BIOS иногда живёт своей жизнью).
- Решение? Подумал, что можно поставить умную розетку, чтобы перегружать сервер по питанию, и умную тыкалку (fingerbot), которая физически нажимает кнопку старта на сервере. Да, есть и такие костыли в мире умного дома — и я, кажется, к ним скоро приду.
- Ловушка
lbu commit. Перегрузил сервер после каких-то настроек, а часть сервисов не запустилась. Почему? Потому что я забыл сделатьlbu commit.- Для тех, кто не в курсе: в diskless-режиме Alpine все ваши настройки живут в оперативке. Чтобы они сохранись на физический носитель и пережили ребут, нужно явно сказать системе упаковать изменения в архив командой
lbu commit. Забыл сделать — откатился к состоянию последней загрузки.
- Для тех, кто не в курсе: в diskless-режиме Alpine все ваши настройки живут в оперативке. Чтобы они сохранись на физический носитель и пережили ребут, нужно явно сказать системе упаковать изменения в архив командой
- И, наконец, тот самый китайский адаптер, с которого всё началось. Он просто взял и перестал определяться.
Зачем всё это нужно?
В моменты, когда сервер лежит, а ты сидишь с внешней клавиатурой и консолью, думаешь: «Проще арендовать VPS за 300 рублей в месяц и не париться».
Но нет. Моя домашняя лаборатория — это моя мужская игрушка. Это мой личный полигон. Здесь я трачу время, набиваю шишки, получаю бесценный опыт и понимаю, как вещи устроены изнутри. VPS не даст тебе этого чувства, когда ты сам, своими руками, выжимаешь максимум из куска железа. К тому же, VPS — это всегда чужое железо, чужая сеть и чужие правила. А здесь — всё твоё, и ты волен делать с ним что угодно.
Так что, друзья, стройте свои хоумлабы, ставьте Alpine, экспериментируйте с сетями и скриптами. Балуйтесь на здоровье! И вам советую.
