Использование docker-compose.yaml вместо супервизора Home Assistant

Вчера вышла новость. Ребята из Home Assistant заявили что установка HA в виде набора докер контейнеров под управлением супервизора более не поддерживается (ссылка).

Я устанавливал Home Assistant именно тем способом, который стал deprecated, поэтому я пошел думать как мне дальше жить с Home Assistant.

В итоге я даже рад что этот способ стал deprecated. После того как я обдумал что делать дальше, я понял что мне супервизор вообще не нужен. И это действие команды Home Assistant сподвигло меня полностью отказаться от супервизора, а запускать все нужные мне вещи с помощью docker-compose.

Я уже реализовал эту идею. Переделал свою инсталляцию HA на использование docker-compose. Супервизора у меня больше нет. У меня очень небольшая инсталляция Home Assistant, поэтому в моем случае это было просто.

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

Как работало раньше

Home Assistant можно установить несколькими разными способами. Самый простой способ — это скачать официальный образ специальной операционной системы в котором уже правильным способом существует HA. Этот образ ставится на хост и Home Assistant работает. Это способ никуда и не делся. Анонс про deprecated никак не влияет на этот способ установки — этот способ все еще официально поддерживается.

Плюс этого способа — он очень простой. Скачивается образ, заливается на носитель — компьютер загружается — все, Home Assistant работает.

Но у этого способа есть недостаток: очень ограниченная возможность делать что-то свое на операционной системе из этого образа.

Поэтому я использовал другой вариант установки:

Вот ровно этот скрипт установки и объявили deprecated.

Почему я ставил HA не в виде официального образа, на собственноручно установленную операционную систему? Во-первых, мне так удобнее. Эту операционную систему я понимаю, ту которую тащит с собой HA — я не понимаю. Удобно зайти, что-то там посмотреть-сделать. Кроме Home Assistant у меня на этой операционной системе еще и крутятся мои скрипты, с помощью которых у меня настроен удаленный доступ к HA (я делаю проброску ssh туннелей, подробнее о том как это настроено тут).

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

Что такое супервизор и зачем он нужен?

Супервизор для меня решает две задачи:

Супервизор HA это отдельный докер контейнер, который управляет другими контейнерами. Если на моем компьютере с HA выполнить команду "docker ps -a", то появится список запущенных контейнеров:

CONTAINER ID        IMAGE                                              COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
3f8575bf6af7        homeassistant/armv7-hassio-supervisor              "/init"                  27 hours ago        Up 27 hours                                                                              hassio_supervisor
b4a1cb189587        dwelch2101/zigbee2mqtt-armhf:1.13.0                "/init ./run.sh"         7 days ago          Up 7 days           0.0.0.0:8485->8485/tcp                                               addon_7ad98f9c_zigbee2mqtt
c8896eb85798        homeassistant/raspberrypi3-homeassistant:0.109.0   "/init"                  10 days ago         Up 9 hours                                                                               homeassistant
07e5228c90eb        homeassistant/armv7-addon-mosquitto:5.1            "/run.sh"                3 weeks ago         Up 3 weeks          0.0.0.0:1883-1884->1883-1884/tcp, 0.0.0.0:8883-8884->8883-8884/tcp   addon_core_mosquitto
6f2ac7d1dd27        homeassistant/armv7-hassio-multicast:2             "/init"                  3 weeks ago         Up 27 hours                                                                              hassio_multicast
679ba6c7d255        homeassistant/armv7-hassio-cli:25                  "/init /bin/bash -c …"   3 weeks ago         Up 3 weeks                                                                               hassio_cli
63e8df3820de        homeassistant/armv7-hassio-dns:9                   "/init coredns -conf…"   3 weeks ago         Up 27 hours                                                                              hassio_dns
74d8df79e422        homeassistant/armv7-hassio-audio:14                "/init"                  3 weeks ago         Up 3 weeks                                                                               hassio_audio

Тут видно:

Но кроме этих понятных для меня штук еще и работают вещи которые я совершенно не понимаю зачем нужны: * audio — зачем? у меня к этому компьютеру не подключены колонки, никакое аудио я на нем не играю * dns — а это зачем? почему не использовать данные о dns с хост машины

Я вполне могу запустить руками и сервер mosquitto и zigbee2mqtt. Мне не ясно зачем тащить все вот это которое делает непонятно что.

Есть и другая вещь, почему я рад отказаться от супервизора. Я тут недавно узнал что супервизор обновляется сам. Они выпустили версию с багом (тред про баг, а потом сами раскатили исправление.

В случае системы автоматизации я считаю что это неприемлемое поведение. Они сами заявляют local first, а тут что-то автоматом без моего ведома приезжает из облака. В случае HA я хочу контролировать что приходит с обновлениями и иметь возможность это не поставить если мне это не нравится.

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

Шаг 1. Убрать то что есть

Убираю из автозапуска:

root@raspberrypi:~# mv /etc/systemd/system/hassio-supervisor.service /root/
root@raspberrypi:~# mv /etc/systemd/system/multi-user.target.wants/hassio-supervisor.service /root/

Перезагружаю компьютер и убиваю все контейнеры:

root@raspberrypi:~# docker ps -a|perl -nalE '`docker rm -f $F[0]`'

И еще раз перезагружаюсь

Шаг 2. Установить docker-compose

Удивительно, но одна из самых сложных вещей в переезде на docker-compose это была установка docker-compose.

В итоге я успешно установил docker-compose с помощью команд:

root@raspberrypi:~# apt-get update && apt install -y python3-pip
root@raspberrypi:~# pip3 install docker-compose

Но до этого я пробовал еще несколько способов и там все шло совсем не так.

Шаг 3. Создание docker-compose.yaml

Через некоторое время я соорудил yaml файл с описанием всех контейнеров которые мне нужно запускать. Их всего 3:

Я положил этот файл в /root/ha/docker-compose.yaml

homeassistant:
  container_name: homeassistant
  image: homeassistant/raspberrypi3-homeassistant:0.109.0
  volumes:
    - /usr/share/hassio/homeassistant/:/config/
  ports:
    - "8123:8123"
  restart: always

mosquitto:
  container_name: mosquitto
  image: eclipse-mosquitto:1.6.9
  volumes:
    - ./mosquitto_data/:/mosquitto/data/
  ports:
    - "1883:1883"
  restart: always

zigbee2mqtt:
  container_name: zigbee2mqtt
  image: koenkk/zigbee2mqtt:1.13.0
  volumes:
    - ./zigbee2mqtt_data/:/app/data/
    - /run/udev:/run/udev:ro
  devices:
    - /dev/ttyACM0:/dev/ttyACM0
  restart: always
  privileged: true
  environment:
    - TZ=Europe/Moscow

И еще там же лежат 2 скрипта

restart

docker-compose build; ./stop; docker-compose up -d

stop:

docker-compose stop; docker-compose rm -f

Тут у меня написано что Home Assistant использует данные из той же папки с которой раньше работал Home Assistant из супервизора, так что все что у меня было настроено в HA осталось без изменений.

Я запускаю этот контейнер стандартным способом: он живет в своей собственной сети и только порт 8123 проброшен наружу. Для моих целей достаточно такого способа запуска, но вполне возможно это этот вариант подойдет не всем. Если у вас есть какие-то проблемы с тем как HA общается с сетевыми устройствами, то, возможно, вот этот вариант решит ваши проблемы (при таком способе сеть в контенере точно такая же как на хосте):

homeassistant:
  container_name: homeassistant
  image: homeassistant/raspberrypi3-homeassistant:0.109.0
  volumes:
    - /usr/share/hassio/homeassistant/:/config/
  net: "host"
  restart: always

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

Хуже всего с zigbee2mqtt. Кроме описания в docker-compose.yaml я еще написал конфиг /root/ha/zigbee2mqtt_data/configuration.yaml

homeassistant: true

permit_join: false

mqtt:
  base_topic: zigbee2mqtt
  server: 'mqtt://192.168.31.86:1883'

serial:
  port: /dev/ttyACM0
  disable_led: true

advanced:
  channel: 25

device_options:
  retain: true

devices: devices.yaml
groups: groups.yaml

Я не стал разбираться как перетащить старый конфиг zigbee2mqtt в мою новую инсталляцию, а просто переспарил все все устройства заново. У меня устройств мало, так что мне это подошло.

Плюс мне все равно нужно было это рано или поздно делать. Раньше у меня был выбран для zigbee канал по умолчанию 11, но сейчас ко мне едут несколько Konke кнопок. Они не могут работать на этом канале, поэтому я тут заодно и сменил канал, а это действие требует переспаривания.

Итак. раньше я использовал супервизор для двух вещей:

Сейчас чтобы обновить HA мне нужно поменять одну строчку в docker-compose.yaml файле и запустить ./restart (но чтобы HA был поменьше в дауне стоит сначала сделать docker pull на нужный образ)

У меня пропала возможность устанавливать аддоны в один клик. Но мне это и не особо нужно. Если нужно что-то поднять я вполне могу сделать это сам.

Зато настройка программ совершенно обычная (как-то я очень много времени провел пытаясь настроить аддон zigbee2mqtt прежде чем узнал что его настройка через аддон отличается от настройки в обычном режиме).

Итого

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

Несколько часов на переезд и и меня опять все работает. Даже, похоже, что это жрет немного меньше ресурсов (хотя это все неважно, раньше проц был загружен на 4%, сейчас на 2%, все то же самое).

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

Пока я не понимаю, будет ли Home Assistant продолжать выпускать официальные докер образы с системой. По моим ощущениям, должны, но я слышал некоторые сомнения от разных людей. Но даже если они не будут сами делать образы, придется самому заворачивать код в образ, что вполне решаемо.

Иван Бессарабов
ivan@bessarabov.ru

10 мая 2020

Кстати, у меня есть телеграм канал про Home Assistant: https://t.me/bessarabov_ha