Я давно хотів зібрати невеликий домашній кластер на Raspberry Pi. Ідея проста: кілька «малинок» у стійці, кожна виконує свою роль, як то IoT-сервер, медіасервер і невеликий Kubernetes-кластер.
У цій серії статей покажу, як я це налаштовую.
Архітектура виглядає приблизно так:
|
1 2 3 4 5 6 7 |
Роутер ├── Pi 1 — IoT сервер (DietPi + Docker + MQTT + Node.js + Next.js) ├── Pi 2 — Медіасервер (LibreELEC + Kodi) └── Pi 3,4,5 — K3s кластер ├── Pi 3 — master node └── Pi 4,5 — worker nodes |
У цій статті ми піднімемо IoT-сервер на Raspberry Pi 3B+.
Вибір операційної системи
Для Raspberry Pi 3B+ з 1GB RAM важливо не перевантажувати систему. Я розглядав три варіанти.
Raspberry Pi OS Lite
Найочевидніший варіант.
Плюси:
- офіційна система
- велика спільнота
- Docker ставиться однією командою
Мінус — вона трохи важча.
Ubuntu Server
Плюси:
- довга підтримка
- знайомий apt
Мінуси:
- важча
- на Pi 3B+ може працювати повільніше
DietPi
Мій вибір для цього проєкту.
Причини:
- дуже легка система
- мінімальне використання RAM
- вбудований менеджер софту
Для порівняння:
| OS | RAM у простої |
|---|---|
| Raspberry Pi OS Lite | ~120 MB |
| DietPi | ~35 MB |
Для Raspberry Pi з 1GB RAM це відчутна різниця.
І так — це та сама “схудла малинка” 😄
Підготовка SD-карти
Для DietPi достатньо навіть 32GB SD-карти.
Завантажуємо образ:
|
1 2 |
wget https://dietpi.com/downloads/images/DietPi_RPi234-ARMv8-Bookworm.img.xz |
Файл важить приблизно 172 MB, що ще раз показує, наскільки система мінімалістична.
Запис образу
Я використовую Raspberry Pi Imager.
Якщо у вас Linux — можна запустити AppImage:
|
1 2 3 |
chmod +x ./RaspberryPiImager*.AppImage ./RaspberryPiImager*.AppImage |
Далі:
|
1 2 3 4 |
Raspberry Pi Device → Raspberry Pi 3 Operating System → Use custom image Storage → вибрати SD карту |
І вибираємо файл:
|
1 2 |
DietPi_RPi234-ARMv8-Bookworm.img.xz |
Крок 1
Крок 2

Увімкнення SSH
Є нюанс: для кастомних образів Raspberry Pi Imager не дозволяє одразу увімкнути SSH.
Тому робимо це вручну.
Після запису карти перевіряємо диски:
|
1 2 |
lsblk |
Boot-розділ буде виглядати приблизно так:

|
1 2 |
sdc1 |
Якщо він змонтувався автоматично — просто створюємо файл ssh.

|
1 2 |
sudo touch /media/alex/B496-F2C5/ssh |
Перевіряємо:
|
1 2 |
ls /media/alex/B496-F2C5/ssh |
Після цього безпечно відмонтовуємо карту:
|
1 2 |
sudo umount /media/alex/B496-F2C5 |
Перший запуск Raspberry Pi
Вставляємо SD-карту у Raspberry Pi і вмикаємо живлення.
Через 2–3 хвилини можна знайти пристрій у мережі:
|
1 2 |
nmap -sn 192.168.1.0/24 |
У моєму випадку Raspberry Pi отримала IP:
|
1 2 |
192.168.1.109 |
Підключаємось:
|
1 2 |
ssh dietpi@192.168.1.109 |
Пароль за замовчуванням:
|
1 2 |
dietpi |
Перший запуск DietPi

Вхід до DietPi ПОПЕРЕДЖЕННЯ ] Потрібні права root Щоб завершити налаштування першого запуску DietPi, цей скрипт спробує перезапустити себе з “sudo”. Якщо це не вдасться, увійдіть як користувач “root” з паролем “dietpi”, відповідно тим, який ви обрали за допомогою “dietpi.txt”. <ОК>
Під час першого запуску система попросить:
- змінити пароль

Програмне забезпечення DietPi-Set_software DietPi постачається з двома обліковими записами користувачів UNIX за замовчуванням: “root” та “dietpi”. Обидва користувачі все ще мають пароль за замовчуванням, який необхідно змінити з міркувань безпеки. Будь ласка, введіть новий пароль для входу для “root” та “dietpi”: Примітка: Сервер SSH за замовчуванням Dropbear не підтримує паролі довжиною понад 100 байт. Деякі спеціальні символи, такі як символи з наголосами, займають 2 байти.
- встановити пароль для веб-додатків
Цей пароль буде використовуватись для:
- Grafana
- Node-RED
- інших веб-сервісів
Рекомендація: використовуйте простий пароль без екзотичних символів.

Це пароль для веб-додатків які будеш встановлювати через dietpi-software (Grafana, Node-RED тощо).
Вводь надійний пароль і запиши окремо — він буде використовуватись як початковий пароль для всіх веб-інтерфейсів. Краще без спецсимволів типу $, “, \ щоб не було проблем.
Далі запитає чи хочете ви використовувати UART
Оскільки у мене вже UART досвід і навіть одразу до малінки вже підключено CH340-USB-TTL-UART, мені UART консоль може стати в нагоді для дебагу малинки якщо SSH впаде або щось піде не так при завантаженні.
Вибираю No і залишаю UART увімкненим. Пам’ять зекономлю в іншому місці, зате матиму резервний доступ через GPIO піни якщо мережа відвалиться.
Меню DietPi Software
Після першого запуску відкриється меню DietPi-Software.
Це одна з найкращих фіч цієї системи.
Тут можна встановлювати:
- Docker
- Grafana
- Node-RED
- MQTT брокери
- бази даних
Встановлення Docker
Нам потрібно встановити:
- Docker
- Docker Compose
У меню:
|
1 2 |
Browse Software |
або швидше:
|
1 2 |
Search Software |
Вводимо:
|
1 2 |
docker |
З’являться два пакети:
|
1 2 3 |
Docker Docker Compose |
Вибір робиться клавішею Пробіл.
|
1 2 3 |
[*] Docker [*] Docker Compose |

Після цього:
|
1 2 |
Install |

Тиснемо Ок і DietPi автоматично встановить усе необхідне.

Після встановлення буде вікно опитування — анонімна статистика використання DietPi.
Можна підтримати проект і вибирати 1 (Opt IN), це допомагає розробникам DietPi розуміти які платформи популярні. Анонімно, нічого особистого не збирає.
Або 0 якщо не хочеш — на роботу системи не впливає ніяк.
І відкривається термінал роботи
Docker встановлено! Малинка готова до роботи.
Перевіримо що Docker справді працює:
|
1 2 3 4 |
docker --version docker compose version docker run hello-world |
Якщо hello-world виведе “Hello from Docker!”, то все ідеально і можна рухатись далі до налаштування IoT стеку.
Налаштовуємо стек, для цього нам тре встановити проект з приватного репозиторію
Генеруємо SSH ключ для deploy:
|
1 |
ssh-keygen -t ed25519 -C "iot-server-deploy" -f ~/.ssh/deploy_key -N "" |
отримуємо -bash: ssh-keygen: command not found

DietPi це мінімальний дистрибутив, тому SSH клієнт не встановлений за замовчуванням. Встановлюємо:
|
1 2 |
sudo apt install openssh-client -y |
Потім знову генеруємо ключ. Ключ згенеровано, дивимось публічний ключ:
|
1 2 |
cat ~/.ssh/deploy_key.pub |
Цей ключ тре додати в GitHub → репозиторій → Settings → Deploy keys → Add deploy key → вставляєш ключ, галочку “Allow write access” не чіпати (read-only для деплою достатньо).
Після цього клонуємо через SSH.
Оскільки в нас пристрій буде доступний зовні доступ по паролю не варіант.
Змінюємо SSH сервер з Dropbear на OpenSSH (він підтримує всі потрібні функції) і налаштуємо доступ тільки по ключу:
|
1 |
<span class="token token">sudo</span> dietpi-software |
Заходиш SSH Server → міняєш Dropbear на OpenSSH → встановлюєш.


Instal

Або одразу:
|
1 |
<span class="token token">sudo</span> <span class="token token">apt</span> <span class="token token">install</span> openssh-server -y |
Після цього:
- Генеруємо ключ на твоєму десктопі (не на малинці)
- Копіюємо публічний ключ на малинку
- Вимикаємо авторизацію по паролю в
/etc/ssh/sshd_config
Спочатку на своєму десктопі, в моєму випадку (Ubuntu 22) генеруємо ключ:
|
1 2 |
ssh-keygen -t ed25519 -C "iot-server" -f ~/.ssh/iot_server_key -N "" |
Потім копіюємо публічний ключ на малинку:
|
1 2 |
ssh-copy-id -i ~/.ssh/iot_server_key.pub dietpi@192.168.1.109 |

Бачимо ERROR це нормально,
Це нормально — малинка перепрошита тому старий ключ в known_hosts не збігається з новим. Видаляємо старий запис:
|
1 2 |
ssh-keygen -f "/home/alex/.ssh/known_hosts" -R "192.168.1.109" |
І повторюємо:
|
1 2 |
ssh-copy-id -i ~/.ssh/iot_server_key.pub dietpi@192.168.1.109 |
Після цього перевіряємо що вхід по ключу працює:
|
1 2 |
ssh -i ~/.ssh/iot_server_key dietpi@192.168.1.109 |
Якщо зайшло без пароля — вимикаємо вхід по паролю на малинці:
|
1 2 |
sudo nano /etc/ssh/sshd_config |
Знаходимо і міняємо:
|
1 2 3 |
PasswordAuthentication no PubkeyAuthentication yes |

Все правильно налаштовано:
PubkeyAuthentication yes✅PasswordAuthentication no✅KbdInteractiveAuthentication no✅
Зберігаємо і перезапускаємо SSH:
Ctrl+O → Enter → Ctrl+X
|
1 2 |
sudo systemctl restart ssh |
Потім з десктопу перевіряємо що вхід по ключу працює:
|
1 2 |
ssh -i ~/.ssh/iot_server_key dietpi@192.168.1.109 |
І він все одно працює, може тре перезавантажити чи ребутнути
Налаштування є, але треба перезапустити SSH щоб підхопило:
|
1 2 |
sudo systemctl restart ssh |
Потім з десктопу тестуємо:
|
1 2 |
ssh -o PubkeyAuthentication=no dietpi@192.168.1.109 |
Все ще пускає по паролю. Перевіримо чи є інший конфіг який перекриває:
|
1 2 |
grep -r "PasswordAuthentication" /etc/ssh/ |
Так і є.
/etc/ssh/sshd_config.d/dietpi.conf перекриває основний конфіг з PasswordAuthentication yes.
Виправляємо:
|
1 2 |
sudo nano /etc/ssh/sshd_config.d/dietpi.conf |

Міняємо PasswordAuthentication yes на no, зберігаємо Ctrl+O → Ctrl+X:
|
1 2 |
sudo systemctl restart ssh |
Потім з десктопу тестуємо:
|
1 2 |
ssh -o PubkeyAuthentication=no dietpi@192.168.1.109 |
Так, усе налаштовано клонуємо репозиторій і отримуємо -bash: git: command not found повідомлення що git не встановлено, встановлюємо git sudo apt-get install -y git
Клонуємо репозиторій і отримуємо помилку – This key is not known by any other names.
Перевір чи ключ взагалі є на машині:
|
1 |
<span class="token token">ls</span> ~/.ssh/ |
Ключ є, але SSH не знає що треба використовувати саме deploy_key для GitHub. Тре вказати явно:
|
1 2 |
GIT_SSH_COMMAND="ssh -i ~/.ssh/deploy_key" git clone git@github.com:Gdymora/IOT_SYSTEM.git |
А ще краще, щоб не писати кожного разу додаю це в ~/.ssh/config:
|
1 2 |
nano ~/.ssh/config |
|
1 2 3 4 |
Host github.com IdentityFile ~/.ssh/deploy_key User git |
Потім звичайний clone:
|
1 |
git clone git@github.com:Я/МійПроект |
Що далі
Після встановлення Docker Raspberry Pi готова стати IoT-сервером.
У наступній статті покажу:
- запуск MQTT брокера
- API сервер на Node.js
- веб-панель на Next.js
- і як підключати IoT пристрої

