П’ять малинок, стійка і DietPi: як я будую домашній IoT-сервер

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Риюсь у коробках у пошуках чогось цікавого з старих запасів, через деякий час біля мене лежить п’ять Raspberry Pi 3B+ і металева стійка для них. Це міг би бути початок смішної історії, але цього разу у мене серйозний план. У цій серії дописів розкажу як з цього зоопарку зроблю нормальну домашню інфраструктуру: IoT-сервер, медіацентр і кластер. Починаю з першої малинки, це буде IoT-сервер на DietPi з Docker. Платити за хостінг для Nodejs дороговато та і безцільно, у мому випадку краще придбати якісь модулі для чергового велосипеду).

Якщо ви чекаєте черговий туторіал «встановіть Raspberry Pi OS і запустіть hello world», то тут цього не буде. Тут буде реальний досвід з граблями, вибором між схожими рішеннями і поясненням чому саме так, а не інакше.

Архітектура: що робить кожна малинка

П’ять пристроїв — п’ять ролей:

  • Pi 1 — IoT-сервер (DietPi + Docker + MQTT + Node.js API + Next.js дашборд).
  • Pi 2 — Медіасервер (LibreELEC + Kodi)
  • Pi 3, 4, 5 — K3s кластер (master + два worker nodes)

Всі підключені в стару D-Link, яка прикидається звичайним свічем (DHCP вимкнений, кабель в LAN а не WAN). Статичні IP для всіх це обов’язково, бо шукати малинку по мережі після кожного ребуту це не той квест який мені потрібен.

Чому DietPi, а не Raspberry Pi OS Lite

Навіщо DietPi якщо є офіційна Raspberry Pi OS Lite? Відповідь проста це RAM і розмір. DietPi в холостому режимі жере 30-50 МБ RAM, тоді як RPi OS Lite — 60-80 МБ. На 1 ГБ оперативки це відчутно, особливо коли поруч крутяться Docker контейнери.

Розмір образу: DietPi ~500 МБ проти 2+ ГБ у RPi OS. Менше місця — швидші оновлення, менший бекап. Плюс вбудований інсталятор програмного забезпечення dietpi-software з каталогом 200+ пакетів — Docker ставиться буквально кількома кліками без ручного налаштування.

Якщо коротко: DietPi це як RPi OS, але на дієті. Звідси і назва.

Прошивка SD-карти

Для прошивки використовуємо Raspberry Pi Imager 2.0 — нещодавно вийшла нова версія з покроковим інтерфейсом. Завантажуємо як AppImage з офіційного сайту.

Образ для RPi 3B+:

wget dietpi.com/...​234-ARMv8-Bookworm.img.xz

Зверніть увагу на те, що файл називається RPi234, бо один образ покриває RPi 2/3/4/Zero 2. ARMv8 — це 64-bit, що важливо для нормальної роботи Docker.

В імагері вибираємо: Raspberry Pi 3 → Use custom image → наш .img.xz → SD-карта. Нюанс: для кастомного образу імагер не показує вкладку налаштувань (SSH, пароль) — це тільки для офіційних образів. Тому після запису монтуємо boot-розділ і вмикаємо SSH вручну:

sudo touch /media/alex/B496-F2C5/ssh

Порожній файл з назвою ’ssh’ на boot-розділі це сигнал для DietPi увімкнути SSH-сервер при першому завантаженні.

Перше завантаження і first-run wizard

Вставляємо карту, підключаємо живлення і чекаємо 2-3 хвилини. HDMI при першому завантаженні буде мовчати, в цей час DietPi робить автоналаштування. Знаходимо IP малинки:

nmap -sn 192.168.1.0/24
У нас з'явився 192.168.1.109. Підключаємось:
ssh [email protected] # пароль: dietpi

DietPi запускає текстовий wizard: зміна паролів для root і dietpi, пароль для веб-додатків, налаштування UART консолі.

Оскільки у мене вже є UART досвід і навіть одразу до малінки вже підключено CH340-USB-TTL-UART, мені UART консоль може стати в нагоді для дебагу малинки якщо SSH впаде або щось піде не так при завантаженні.

Вибираю No і залишаю UART увімкненим. Пам’ять зекономлю в іншому місці, зате матиму резервний доступ через GPIO піни якщо мережа відвалиться.

Тож і вам UART раджу залишити увімкненим якщо SSH відвалиться при налаштуванні, підключитись через GPIO піни буде рятівним кругом.

Встановлення Docker через dietpi-software

Після wizard відкривається меню DietPi-Software. Заходимо в Search Software, вводимо ’docker’ і вибираємо пробілом два пакети:

  • Docker — основний движок
  • Docker Compose — для запуску multi-container через docker-compose.yml

Install → йдемо пити каву. Хвилин 10 і Docker готовий. Перевіряємо:

docker —version docker compose version docker run hello-world

Docker встановлено! Малинка готова до роботи.

Перевіримо що Docker справді працює:

docker --version docker compose version docker run hello-world

Якщо hello-world виведе «Hello from Docker!», то все ідеально і можна рухатись далі до налаштування IoT стеку.

Налаштовуємо стек, для цього нам тре встановити проект з приватного репозиторію

Генеруємо SSH ключ для deploy:

ssh-keygen -t ed25519 -C "iot-server-deploy" -f ~/.ssh/deploy_key -N ""

отримуємо -bash: ssh-keygen: command not found

DietPi це мінімальний дистрибутив, тому SSH клієнт не встановлений за замовчуванням. Встановлюємо:

sudo apt install openssh-client -y

Потім знову генеруємо ключ. Ключ згенеровано, дивимось публічний ключ:

cat ~/.ssh/deploy_key.pub

Цей ключ тре додати в GitHub → репозиторій → SettingsDeploy keysAdd deploy key → вставляєш ключ, галочку «Allow write access» не чіпати (read-only для деплою достатньо).

Після цього клонуємо через SSH.

Безпека: SSH тільки по ключу

Планую прокидати порт назовні, тому вхід по паролю це погана ідея, є вже досвід ). Налаштовую SSH-ключі.

Для цього на десктопі генеруємо ключ:

ssh-keygen -t ed25519 -C "iot-server" -f ~/.ssh/iot_server_key -N ""

Копіюємо на малинку:

ssh-copy-id -i ~/.ssh/iot_server_key.pub [email protected]

Далі вимикаємо вхід по паролю. DietPi за замовчуванням використовує Dropbear, це легкий SSH-сервер без підтримки повноцінного sshd_config. Тому спочатку перемикаємось на OpenSSH через dietpi-software → SSH Server → OpenSSH.

Важливий нюанс: DietPi зберігає свої налаштування SSH в окремому файлі який перекриває основний конфіг. Якщо просто поставити PasswordAuthentication no в sshd_config — нічого не зміниться. Треба правити саме цей файл:

sudo nano /etc/ssh/sshd_config.d/dietpi.conf # Міняємо: PasswordAuthentication yes → no sudo systemctl restart ssh

Перевіряємо що пароль більше не працює:

ssh -o PubkeyAuthentication=no [email protected] # Очікуємо: Permission denied (publickey)

Так, усе налаштовано клонуємо репозиторій і отримуємо -bash: git: command not found повідомлення що git не встановлено, встановлюємо git sudo apt-get install -y git

Клонуємо репозиторій і отримуємо помилку — This key is not known by any other names.

Перевір чи ключ взагалі є на машині:

ls ~/.ssh/

Ключ є, але SSH не знає що треба використовувати саме deploy_key для GitHub. Тре вказати явно:

GIT_SSH_COMMAND="ssh -i ~/.ssh/deploy_key" git clone [email protected]:Gdymora/IOT_SYSTEM.git

А ще краще, щоб не писати кожного разу додаю це в ~/.ssh/config:

nano ~/.ssh/config Host github.com     IdentityFile ~/.ssh/deploy_key     User git

Потім звичайний clone: git clone [email protected]:Я/МійПроект

Що маємо в результаті

Після всіх кроків маємо:

  • Raspberry Pi 3B+ з DietPi ARMv8 (64-bit Bookworm)
  • Docker + Docker Compose встановлені і готові до роботи
  • OpenSSH з авторизацією виключно по ключу
  • Вхід по паролю вимкнений
  • UART консоль активна як резервний доступ
  • GitHub підключено, репозиторій клоновано

Шпаргалка адміна

SSH — підключення та ключі

Команда

Що робить

ssh [email protected]

Підключитись до сервера за IP

ssh -i ~/.ssh/iot_server_key [email protected]

Підключитись з конкретним приватним ключем

ssh-keygen -t ed25519 -C «email»

Згенерувати новий SSH ключ (ed25519)

cat ~/.ssh/id_ed25519.pub

Показати публічний ключ (для копіювання на сервер)

ssh-copy-id [email protected]

Скопіювати публічний ключ на сервер автоматично

nano ~/.ssh/config

Відкрити конфіг SSH (alias для хостів)

ssh -p 2222 user@host

Підключитись на нестандартний порт

exit

Закрити SSH сесію

Приклад ~/.ssh/config: Host dietpi / HostName 192.168.1.109 / User dietpi / IdentityFile ~/.ssh/iot_server_key

Git — deploy та базові команди

Команда

Що робить

git clone github.com/user/repo.git

Клонувати репо через HTTPS

GIT_SSH_COMMAND="ssh -i ~/.ssh/deploy_key" git clone [email protected]:user/repo.git

Клонувати з конкретним SSH ключем

git pull

Отримати останні зміни з remote

git pull origin main

Отримати зміни з гілки main

git status

Показати стан робочої директорії

git log —oneline —10

Останні 10 комітів в одну строку

git stash

Тимчасово зберегти незакомічені зміни

git stash pop

Повернути збережені зміни

git checkout -b feature/new

Створити і переключитись на нову гілку

Deploy key — read-only ключ прив’язаний до конкретного репо. Додається в GitHub → Settings → Deploy keys

DietPi — системні команди

Команда

Що робить

sudo poweroff

Вимкнути сервер

sudo reboot

Перезавантажити сервер

sudo apt update && sudo apt upgrade -y

Оновити всі пакети

sudo apt install -y git curl wget

Встановити пакети

dietpi-config

Відкрити конфігуратор DietPi (меню)

dietpi-software

Встановити/видалити програми через меню

df -h

Дискова статистика (скільки місця)

free -h

Статистика RAM

htop

Моніторинг процесів в реальному часі

uptime

Час роботи сервера без перезавантаження

journalctl -f

Дивитись системні логи в реальному часі

sudo systemctl status назва

Статус сервісу

sudo systemctl restart назва

Перезапустити сервіс

sudo systemctl enable назва

Додати сервіс в автозапуск

Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.

👍ПодобаєтьсяСподобалось20
До обраногоВ обраному11
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Багато років тому також зібрав собі кластер з пішок (2xRPi4 і все інше тройки). 5 під k3s-кластер і 1 а-ля бастіон хост з двома десятками всякого селфхостед гівна.

res.cloudinary.com/...​/grzqhtpivi7xjiymx3pp.jpg

Так от, ранити кубер на «тройкі» — це просто пекельні борошна, як це все повільно. На 3b+ додали гігабітний езернет, але він ріжеться до 200мб юсб 2 шиною. На 4 версії не краще, бо все ще все впирається в швидкість сд-картки, а апгрейдити кожну пішку м2 шапкою + ссд — дуже дорого.

В результаті закинув кластер та на заміну взяв міні пк на 64 гб рами, 1.5 тб ссд, 2 гігабітні езернети, та з нормальним сучасним процесором. Накатив туди проксмокс, створив 5 «віртуалок» для кубкластера на основі телос і радію.

все ж не зрозуміло для чого кластер.
Виглядає що на кожні РІ запущений свій (мікро)сервіс.
Розподілені обчислення? Дублювання сервісів для надійності? Хотсвоп? Горизонтальне маштабування?

По ходу п’єси розберемся, тут головне почати, а там придумається навіщо ;)

доречі цікава тема кластерів в цілому

наприклад можна побудувати кластер тупо на ESP32 і одній малинці як мастер

ось таке було би дуже цікаво читати, не пряма прив’язка до моделі а принцип в цілому
бо у кожного своя ситуація і мало в кого е «зайві» саме малинки, а ось іншого мотлоху може бути в досталь

Оооо. Дякую, ідея супер, так і зроблю. Це дійсно набагато цікавіше і корисніше бо зазвичай є зоопарк і з нього хочеться щось зробити щоб не докуповувати

я написав коментар і самому стало цікаво
так ось, МК підходять тільки для брутфорсу чогось, і то дуже специфічного так как кеш в пам’яті вирішує

а ось просто «зі стола» можна збирати цікаві кластери. Та же олама підтримує різні архітектури що дозволяє підвищувати якість відповіді для локальних моделей.
ось тільки залізо це саме вузьке місце, причому навіть не ОЗУ а інтерфейс зв’язку, тобто інтернет з’єднання

буду чекати на вашу статтю))

наприклад можна побудувати кластер тупо на ESP32 і одній малинці як мастер

щоби що?
майнити крипту?
DDoSити когось/щось?

саме цікаве що ви попали в 100%)))

майнинг — pl.aliexpress.com/...​tem/1005011594341051.html
дедос взагалі ізі, як на рівні радіо, так і мережею когось класти

я роздивився з різних боків, саме оптимальне це юзати як зовнішний криптографічний модуль.
тобто якшо потрібно перебрати мільярди паролів в хеши, то розкидав батчами по ESP32 і отримуеш вже чисті мапи
но це реально прям зірки повинні скластися так як в esp32 реалізовано не так багато на рівні заліза і якийсь результат ти побачиш лише на дуже великих данних, коли немае потужного компа, але е купа ESP32.
Причому ми говоримо про обсяги коли на ПК воно буде рахуватись 7 днів, а з таким «кластером» 5 днів. Тобто чисто академічна задача із цікавості не більше.

Стаття дуже цікава і корисна. Мені також сподобались ілюстрації. І я так розумію планується друга частина статті про налаштування кластеру?

Але пʼять raspberry pi 3b+ у старих запасах. Звучить ніби ви їх «в тумбочці» берете. У мене в запасах лише одна і мені цікаво, якщо не секрет, для чого раніше використовувались ці Raspberry Pi

Дякую, за такий теплий відгук. Колись давно хотів організувати радіогурток і закупив багато чого і контролерів і мікросхем, транзисторів і резисторів, платок і паяльників (паяльники згодились при церкві вчив дітей паяти і мигати світлодіодом). А малінки ще запаковані, користувався іншими, які не увійшли в перелік ) Так, планується продовження...

Підписатись на коментарі