Установка и запуск Node-Red и HomeBridge на RaspberryPi в Docker

19 марта 2021, 16:58

Для чего?

Многие задаются вопросом, как без проблем заставить работать Node-Red и HomeBridge на малине. Особенно после каких-либо изменений и/или обновлений. Другая часть аудитории наверняка спросит - "А зачем это надо? В Node-Red есть Homekit и все можно без бриджа". Оставим дискуссию на данную тему за рамками данной статьи и приступим к тому, что, собственно, написано в заголовке.

Что такое Docker и с чем его едят

Данный абзац исключительно для информации, если вам неинтересно или вы уже знаете, что это такое - смело переходите к следующему.

В общем и целом, докер - это утилита, которая позволяет запускать приложения в фиксированном окружении (библиотеки, зависимости и пр). Это позволяет нескольким приложениям работать с разными версиями одной и той же библиотеки, не нарушая зависимостей, и тем самым, ничего не ломая. Упрощенными словами - каждое приложение работает внутри своей "песочницы". Я не буду подробно останавливаться на описании технологии, все желающие могут почитать об этом на сайте докера. Я же затрону здесь основные аспекты, на которые стоит обратить внимание.

Все контейнеры докера по умолчанию работают в своей сети. Если у вас приложение, которому нужен доступ к броадкастам или чему-то подобному, это нужно явно указать при запуске.

Все контейнеры по умолчанию хранят все данные внутри. Это значит, что при пересоздании контейнера все данные будут утеряны. Об этом надо помнить и хранить все необходимые данные с помощью так называемых томов (volumes) снаружи контейнера. В терминологии докера это называется persistent storage.

Очень много контейнеров получают свои первоначальные настройки из переменных окружения. Не забывайте об этом и старайтесь указывать все параметры до первого запуска контейнера

Docker - служба, которая следит за состоянием контейнеров, и автоматически их перезапускает, если... вы явно об этом сказали.

Все вышеперечисленное звучит конечно сложно, но поверьте, звучит реально страшнее, чем есть на самом деле. Почему - увидите ниже. 

Установка

Данная статья предполагает, что у вас уже есть установленная (желательно чистая) система на RaspberryPi (автор статьи рекомендует минимум версию 3, но это условие не так, чтобы прям обязательное), малина включена в сеть, подключена к WiFi или к проводной сети, настроен SSH и вы имеете туда доступ. Если нет - самое время сделать это.

Мы с вами последовательно установим и настроим 4 компонента, имеющих отношение к этой статье. Разумеется, это только начало, и в дальнейшем, вы сможете использовать ваш Docker для запуска других приложений, которые вам понадобятся. Итак, последовательно установим: 

Docker

1600x_image.png?1616104118

Подключаемся к RaspberyPi с помощью любимого SSH-Клиента. Автор статьи будет использовать PuTTY.

Становимся root-ом (здесь и далее все команды, которые необходимо выполнить в консоли, будут написаны курсивом).

sudo -s

1600x_image.png?1616104120

Обновляем репозитории (не забываем говорить "y" на вопросы)

apt-get update && apt-get upgrade

Данная процедура займет некоторое время, можете пока сходить, налить себе чайку. 

Настоятельно рекомендую перезагрузить малину после обновления, иначе могут возникнуть проблемы с установкой.

1600x_image.png?1616104118

Скачиваем и устанавливаем Docker:

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

После установки нужно разрешить пользователю pi создавать и запускать контейнеры.

usermod -aG docker pi


Осталось проверить, что у нас докер работает, а также сказать системе, что докер должен запускаться при старте.

docker version
docker info
systemctl enable docker.service
systemctl start docker.service

Если никаких ошибок вы не получили (скорее всего так и есть), переходим к следующему шагу.

1600x_image.png?1616104119

Лирическое отступление. У докера есть огромное хранилище образов, которое зовется doccker hub и располагается по адресу hub.docker.com. Если ищете контейнер - идите сразу туда.

Portainer

Portainer - это веб-интерфейс для управления контейнерами. После установки этой оболочки, командная строка нам больше не понадобится и мы сможем все делать из браузера.

Итак, для установки нам потребуется образ контейнера. Весь кайф в том, что при попытке запуска контейнера, докер, не найдя образа локально, будет сам его скачивать (по умолчанию из своего хаба, если не указано иного). Интересующиеся могут пройти на вышеупомянутый хаб и в поиске ввести "portainer", а мы продолжим.

1600x_image.png?1616104119

Создадим тот самый persistent storage для контейнера, чтобы при обновлении или пересоздании контейнера, все настройки не потерялись.

docker volume create portainer_data
(вместо portainer_data можно использовать любое понравившееся вам слово, главное - не забыть его использовать везде далее по тексту).

И запускаем сам контейнер:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

Расскажу немного по параметрам. Просто для информации.

-d - говорит докеру, что нужно "демонизировать" контейнер, то есть не цепляться к нему.
-p 8000:8000 -p 9000:9000 - "проброс" портов 8000 и 9000 внутрь контейнера из хост системы. Именно по этим портам работает Portainer.
--name=portainer - имя контейнера. Можете использовать любое какое хотите. Используется для идентификации.
--restart=always - та самая команда docker-у, что этот контейнер нужно всегда перезапускать.
-v /var/run/docker.sock:/var/run/docker.sock - использование системного стораджа /var/run/docker.sock в качестве внутреннего. Таким образом, мы "мапим" сокет докера внутрь контейнера.
-v portainer_data:/data/portainer/portainer-ce - "маппинг" того самого volume, что мы создали выше внутрь контейнера. Таким образом, контейнер будет все свои настройки хранить вне контейнера и не потеряет при пересоздании.

1600x_image.png?1616104118

После этого, открываем наш любимый браузер и переходим по адресу http://<ip-адрес малины>:9000/. Нам предложат создать пароль администратора. Что мы и делаем.

После успешного создания администратора, вас отправят на экран выбора подсистемы, где необходимо выбрать docker и нажать кнопочку connect. Нажав на рамку, в которой отражен статус вашего докера (можете нажать на иконку кита), вы попадете на экран статуса. Можно переходить к следующему шагу.

Установка Node-Red

Установку сервера node-red начнем с создания persistent стораджа для него.

1600x_image.png?1616153656

Выберем слева volumes, нажмем вверху кнопку create volume.

Name - имя хранилища. Может быть любым.
Driver - драйвер тома. Оставьте local.
Driver options - ничего не надо.
Use NFS Volume и Use CIFS Volume должны быть выключены.
Access Control - по вкусу. Это только разрешения, кто может управлять данным хранилищем внутри портейнера. Я всегда оставляю по умолчанию, ибо все равно один я управляю.

NFS и CIFS можно использовать тогда, когда вы хотите расположить это хранилище не локально на малине, а где-то по сети с использованием NFS и/или CIFS.

Жмем Create the Volume и переходим к созданию контейнера

Выбираем слева в меню пункт Containers и там жмем вверху кнопочку Add сontainer.

Name - имя контейнера. Используется для идентификации.
Registry - DockerHub стоит по умолчанию и в большинстве случаев менять это не надо.
Image - образ контейнера. С помощью hub.docker.com находим нужный и называется он nodered/node-red. Вписываем это в поле.
Остальные настройки, в данном случае, не меняем и скроллим экран вниз. Кнопку Deploy the container НЕ НАЖИМАЕМ!!!

1600x_image.png?1616153654
1600x_image.png?1616153652

В Advanced conatiner settings переходим на закладку Volumes, нажимаем map additional volume.

Вводим параметры:
container/data (путь, куда будет маппинг внутри контейнера).
volume — выбираем наш созданный node-red-data.

Переходим на вкладку Network.

Поскольку нам нужно, чтобы наш node-red был доступен из сети по всем портам и в том числе, работали всяческие mDNS и прочие броадкасты, нам необходимо, чтобы контейнер работал не на внутренней сети, а на внешнем интерфейсе хоста. Для чего в поле Network выбираем режим host.

Остальные параметры не меняем, в режиме host они не нужны.

1600x_image.png?1616153653
1600x_image.png?1616153653

Последнее телодвижение перед запуском контейнера. Перейдите на вкладку Restart policy и выберите режим Unless stopped. Этим мы расскажем демону докера, что контейнер нужно автоматически рестартовывать, пока мы не остановим его вручную.

После этой операции, прокрутите экран вверх и нажмите кнопку Deploy the conatainer.

Докер скачает образ и запустит контейнер. После этого можно проверить доступность Node-Red, перейдя по адресу http://<ip-адрес малины>:1880

Homebridge

Надеюсь, что до данного момента у вас не возникло никаких проблем с запуском всех вышеперечисленных приложений и контейнеров, поэтому переходим к установке Homebridge в докер. С вашего позволения, я не буду сопровождать все свои действия скриншотами, поскольку они не будут отличаться от уже проделанных выше. Все отличия, разумеется, я покажу. Итак.

Создадим еще один Volume для хранения данных Homebridge. Имя, разумеется, вы можете использовать любое, автор использует homebridge-data.

Создадим контейнер Homebridge со следующими параметрами:

  • Name - Homebridge.
  • Registry - DockerHub.
  • Image name - oznu/homebridge.
  • Volume mapping: /homebridge -> homebridge_data.
  • Network - host.
  • Restart policy - unless stopped.
А вот тут есть небольшие отличия. Данный контейнер конфигурируется с помощью переменных окружения. Поэтому перед нажатием кнопки Deploy.. нужно зайти во вкладку Env.
1600x_image.png?1616153654

Во вкладке Env вам необходимо создать 3 переменных со следующими именами и значениями:

HOMEBRIDGE_CONFIG_UI
1
HOMEBRIDGE_CONFIG_UI_PORT
8581
TZ
Europe/Moscow
Поясню.
HOMEBRIDGE_CONFIG_UI - включает плагин для веб-интерфейса к хоумбриджу.
HOMEBRIDGE_CONFIG_UI_PORT - указывает, по какому порту должен отвечать web-интерфейс. В данном случае - 8581
TZ - в какой временной зоне живет хоумбридж.
Разумеется, вы можете указывать необходимые вам значения.

Жмем Deploy the container и ждем, пока докер скачает образ контейнера и запустит его. По окончанию процесса, можно перейти по адресу http://<ip-адрес малины>:8581 и насладиться окном логина в веб-интерфейс Homebridge.

Обратите внимание, что контейнеру понадобится некоторое время для запуска, поэтому после запуска подождите пару минут и веб-интерфейс точно будет доступен. И да, логин/пароль - admin

k01-1.jpg

Заключение

Разумеется, данная статья не претендует на полноценное руководство по докеру вообще и по контейнерам в частности. Однако, я надеюсь, она дала вам представление, насколько просто и легко можно запускать различные приложения в собственном окружении. В следующей статье я опишу процесс обновления запущенных нами контейнеров, поверьте, это еще проще.

Если у вас возникнут вопросы после прочтения этой статьи, вы всегда можете найти меня в профильных чатах в Telegram по нику @blacklion_msk.


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Александр Л (Lkt)
    Александр Л (Lkt) 4 месяца назад

    Очень подробная статья. Предлагаю написать для всех контейнеров docker-compose файл для удобства новичкам в докере. 

    • Дмитрий Прохоров (dprohorov)

      Не вижу смысла по нескольким причинам.
      Во-первых, compose в основном нужен, если ты хочешь собрать свой образ. 
      Во-вторых, малина все-таки не предназначена для запуска кучи контейнеров. Данное решение является неким компромиссом для тех, и написано в основном для тех, кто не может или не хочет использовать по каким-то причинам только ноду или только хоумбридж. 

  2. (jevvol)
    (jevvol) отредактировано 13 дней назад

    Статья хорошая. Однозначный Like.

    UPD: Я тут подумал и понял, что странно, что для node-red вы не устанавливаете переменную env TZ. В случае использования нод, работающих со временем - будут проблемы (например node-red-contrib-time-range-switch)

К списку статей

Устройства в материале

Raspberry Pi 4

Производитель: Raspberry Pi
Заказать на:

Raspberry Pi 3 Model B

Производитель: Raspberry Pi

Тематические чаты

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
04 сентября 2018, 12:14
Интеграция RGB ленты на ESP8266 с прошивкой tasmota в систему HomeBridge (HomeKit)
25 сентября 2020, 11:49
Сенсорный монитор для управления умным домом. Настройка и использование.
15 ноября 2018, 13:11
Xiaomi Mi Remote 360 добавляем Apple HomeKit
15 ноября 2018, 09:42
Способы автоматизации механических ворот
28 августа 2018, 09:48
От голого Raspbian до веб-интерфейса homebridge за четыре команды в терминале.
03 октября 2018, 22:03
Как собрать и настроить Hyperion Ambilight - адаптивную подсветку ТВ.
01 ноября 2018, 09:27
Настройка Deconz USB стика ConBee от Dresden Elektronik в Hass.io и некоторые особенности эксплуатации
09 ноября 2020, 19:03
В статье я расскажу о том, как сделать ваши рулонные, в том числе и кассетные шторы, чуточку умнее. Дам ссылки на дешевые аккумуляторные моторы. Расскажу про способы трансляции сигналов 433Мгц в MQTT. И продемонстрирую много фотографий решения и немного видео.
01 октября 2019, 07:07
"У всякого в умном дому неведомо никому" (с) Народная мудрость