П’ять малинок, стійка і 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 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів