Домашня інфраструктура на Raspberry Pi: IoT-сервер на DietPi + Docke

 


Я давно хотів зібрати невеликий домашній кластер на Raspberry Pi. Ідея проста: кілька «малинок» у стійці, кожна виконує свою роль, як то IoT-сервер, медіасервер і невеликий Kubernetes-кластер.

У цій серії статей покажу, як я це налаштовую.

Архітектура виглядає приблизно так:

У цій статті ми піднімемо 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-карти.

Завантажуємо образ:

Файл важить приблизно 172 MB, що ще раз показує, наскільки система мінімалістична.


Запис образу

Я використовую Raspberry Pi Imager.

Якщо у вас Linux — можна запустити AppImage:

Далі:

І вибираємо файл:


Крок 1

Крок 2

Увімкнення SSH

Є нюанс: для кастомних образів Raspberry Pi Imager не дозволяє одразу увімкнути SSH.

Тому робимо це вручну.

Після запису карти перевіряємо диски:

Boot-розділ буде виглядати приблизно так:

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

Перевіряємо:

Після цього безпечно відмонтовуємо карту:


Перший запуск Raspberry Pi

Вставляємо SD-карту у Raspberry Pi і вмикаємо живлення.

Через 2–3 хвилини можна знайти пристрій у мережі:

У моєму випадку Raspberry Pi отримала IP:

Підключаємось:

Пароль за замовчуванням:


Перший запуск 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

У меню:

або швидше:

Вводимо:

З’являться два пакети:

Вибір робиться клавішею Пробіл.

Після цього:

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


Після встановлення буде вікно опитування — анонімна статистика використання DietPi.

Можна підтримати проект і  вибирати 1 (Opt IN), це допомагає розробникам DietPi розуміти які платформи популярні. Анонімно, нічого особистого не збирає.

Або 0 якщо не хочеш — на роботу системи не впливає ніяк.

І відкривається термінал роботи

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

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

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

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

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

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

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

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

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

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

Оскільки в нас пристрій буде доступний зовні доступ по паролю не варіант.

Змінюємо SSH сервер з Dropbear на OpenSSH (він підтримує всі потрібні функції) і налаштуємо доступ тільки по ключу:

Заходиш SSH Server → міняєш Dropbear на OpenSSH → встановлюєш.

Instal

Або одразу:

Після цього:

  1. Генеруємо ключ на твоєму десктопі (не на малинці)
  2. Копіюємо публічний ключ на малинку
  3. Вимикаємо авторизацію по паролю в /etc/ssh/sshd_config

Спочатку на своєму десктопі, в моєму випадку (Ubuntu 22) генеруємо ключ:

Потім копіюємо публічний ключ на малинку:

Бачимо ERROR це нормально,

Це нормально — малинка перепрошита тому старий ключ в known_hosts не збігається з новим. Видаляємо старий запис:

І повторюємо:

Після цього перевіряємо що вхід по ключу працює:

Якщо зайшло без пароля — вимикаємо вхід по паролю на малинці:

Знаходимо і міняємо:

 

Все правильно налаштовано:

  • PubkeyAuthentication yes
  • PasswordAuthentication no
  • KbdInteractiveAuthentication no

Зберігаємо і перезапускаємо SSH:

Ctrl+O → Enter → Ctrl+X

Потім з десктопу перевіряємо що вхід по ключу працює:


І він все одно працює, може тре перезавантажити чи ребутнути

Налаштування є, але треба перезапустити SSH щоб підхопило:

Потім з десктопу тестуємо:

Все ще пускає по паролю. Перевіримо чи є інший конфіг який перекриває:

Так і є.

/etc/ssh/sshd_config.d/dietpi.conf перекриває основний конфіг з PasswordAuthentication yes.

Виправляємо:

Міняємо PasswordAuthentication yes на no, зберігаємо Ctrl+OCtrl+X:

Потім з десктопу тестуємо:

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

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

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

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

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

Потім звичайний clone:

Що далі

Після встановлення Docker Raspberry Pi готова стати IoT-сервером.

У наступній статті покажу:

  • запуск MQTT брокера
  • API сервер на Node.js
  • веб-панель на Next.js
  • і як підключати IoT пристрої

 

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *