П’ять малинок, стійка і DietPi: як я будую домашній IoT-сервер
Риюсь у коробках у пошуках чогось цікавого з старих запасів, через деякий час біля мене лежить п’ять 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)
Всі підключені в стару
Чому DietPi, а не Raspberry Pi OS Lite
Навіщо DietPi якщо є офіційна Raspberry Pi OS Lite? Відповідь проста це RAM і розмір. DietPi в холостому режимі жере
Розмір образу: 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 — це
В імагері вибираємо: 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
Вставляємо карту, підключаємо живлення і чекаємо
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 → репозиторій → Settings → Deploy keys → Add 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 — підключення та ключі
|
Команда |
Що робить |
|
Підключитись до сервера за 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 назва |
Додати сервіс в автозапуск |
10 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівБагато років тому також зібрав собі кластер з пішок (2xRPi4 і все інше тройки). 5 під k3s-кластер і 1 а-ля бастіон хост з двома десятками всякого селфхостед гівна.
res.cloudinary.com/.../grzqhtpivi7xjiymx3pp.jpg
Так от, ранити кубер на «тройкі» — це просто пекельні борошна, як це все повільно. На 3b+ додали гігабітний езернет, але він ріжеться до 200мб юсб 2 шиною. На 4 версії не краще, бо все ще все впирається в швидкість сд-картки, а апгрейдити кожну пішку м2 шапкою + ссд — дуже дорого.
В результаті закинув кластер та на заміну взяв міні пк на 64 гб рами, 1.5 тб ссд, 2 гігабітні езернети, та з нормальним сучасним процесором. Накатив туди проксмокс, створив 5 «віртуалок» для кубкластера на основі телос і радію.
все ж не зрозуміло для чого кластер.
Виглядає що на кожні РІ запущений свій (мікро)сервіс.
Розподілені обчислення? Дублювання сервісів для надійності? Хотсвоп? Горизонтальне маштабування?
По ходу п’єси розберемся, тут головне почати, а там придумається навіщо ;)
доречі цікава тема кластерів в цілому
наприклад можна побудувати кластер тупо на ESP32 і одній малинці як мастер
ось таке було би дуже цікаво читати, не пряма прив’язка до моделі а принцип в цілому
бо у кожного своя ситуація і мало в кого е «зайві» саме малинки, а ось іншого мотлоху може бути в досталь
Оооо. Дякую, ідея супер, так і зроблю. Це дійсно набагато цікавіше і корисніше бо зазвичай є зоопарк і з нього хочеться щось зробити щоб не докуповувати
я написав коментар і самому стало цікаво
так ось, МК підходять тільки для брутфорсу чогось, і то дуже специфічного так как кеш в пам’яті вирішує
а ось просто «зі стола» можна збирати цікаві кластери. Та же олама підтримує різні архітектури що дозволяє підвищувати якість відповіді для локальних моделей.
ось тільки залізо це саме вузьке місце, причому навіть не ОЗУ а інтерфейс зв’язку, тобто інтернет з’єднання
буду чекати на вашу статтю))
щоби що?
майнити крипту?
DDoSити когось/щось?
саме цікаве що ви попали в 100%)))
майнинг — pl.aliexpress.com/...tem/1005011594341051.html
дедос взагалі ізі, як на рівні радіо, так і мережею когось класти
я роздивився з різних боків, саме оптимальне це юзати як зовнішний криптографічний модуль.
тобто якшо потрібно перебрати мільярди паролів в хеши, то розкидав батчами по ESP32 і отримуеш вже чисті мапи
но це реально прям зірки повинні скластися так як в esp32 реалізовано не так багато на рівні заліза і якийсь результат ти побачиш лише на дуже великих данних, коли немае потужного компа, але е купа ESP32.
Причому ми говоримо про обсяги коли на ПК воно буде рахуватись 7 днів, а з таким «кластером» 5 днів. Тобто чисто академічна задача із цікавості не більше.
Стаття дуже цікава і корисна. Мені також сподобались ілюстрації. І я так розумію планується друга частина статті про налаштування кластеру?
Але пʼять raspberry pi 3b+ у старих запасах. Звучить ніби ви їх «в тумбочці» берете. У мене в запасах лише одна і мені цікаво, якщо не секрет, для чого раніше використовувались ці Raspberry Pi
Дякую, за такий теплий відгук. Колись давно хотів організувати радіогурток і закупив багато чого і контролерів і мікросхем, транзисторів і резисторів, платок і паяльників (паяльники згодились при церкві вчив дітей паяти і мигати світлодіодом). А малінки ще запаковані, користувався іншими, які не увійшли в перелік ) Так, планується продовження...