Содержание
Почему Docker и Docker Compose для Home Assistant?
Контейнеризация Home Assistant, возможно, не была вариантом, о котором вы задумывались. В конце концов, можно легко купить готовые решения, такие как Home Assistant Green, Yellow или Blue, или даже использовать Raspberry Pi. Однако запуск в контейнере — отличный вариант, особенно если у вас уже есть Docker-хост или виртуальная среда (например, Proxmox), так как у вас уже есть необходимое оборудование.
Кроме того, у Docker Compose есть и другие преимущества. Код конфигурации можно хранить в Git и легко воссоздавать при необходимости. Также это помогает избежать проблем с зависимостями Python и другими сложностями на физическом хосте, который может использоваться для других задач.
Я уже использую Docker Compose для всех своих сервисов. Это также позволяет легко добавлять sidecar-контейнеры, такие как MQTT-брокеры или дашборды.
Проектные решения
При запуске Home Assistant в Docker с использованием Docker Compose необходимо принять несколько ключевых решений, особенно касающихся сети. Давайте сначала обсудим это.
Сеть
При развёртывании Home Assistant я должен был решить, как контейнер будет подключён к моей сети. Docker предлагает три основных режима:
- Сеть host – Режим host предоставляет Home Assistant прямой доступ ко всем сетевым интерфейсам хоста. Это упрощает обнаружение устройств и интеграцию с такими протоколами, как mDNS или UPnP. Здесь вы жертвуете изоляцией ради лучшей обнаруживаемости устройств в Home Assistant.
- Сеть bridge – Режим bridge по умолчанию изолирует контейнер за виртуальным интерфейсом. В этой конфигурации необходимо пробросить каждый порт, который нужен Home Assistant, например, 8123 для веб-интерфейса. Режим bridge обеспечивает изоляцию, но может усложнить интеграции, зависящие от широковещательного трафика. Это можно решить с помощью sidecar-контейнеров, перенаправляющих mDNS и т. д.
- Сеть macvlan – Также можно использовать сеть macvlan в Docker. Macvlan создаёт виртуальный интерфейс, который делает контейнер физическим устройством в вашей сети. Home Assistant получает собственный IP в сегменте сети, поэтому, как и в режиме host, обнаружение работает «из коробки», а изоляция от хоста сохраняется. Недостаток в том, что некоторые хосты не могут взаимодействовать с macvlan-устройствами на том же физическом адаптере. Кроме того, эта конфигурация определённо добавляет сложности.
Хранилище
Home Assistant хранит конфигурацию YAML, базу данных SQLite (по умолчанию) и долгосрочную историю в постоянном хранилище Docker. Я предпочитаю следующие варианты:
- Bind mounts – Привязка директорий хоста, например, /srv/homeassistant/config, даёт прямой доступ к файлам для редактирования на хосте. Это просто, а резервное копирование может быть таким же лёгким, как копирование папки (подробнее об этом позже). Недостаток — возможные сложности с правами и проблемы с производительностью, если монтирование происходит по сети.
- Именованные тома (Named volumes) – Тома, управляемые Docker (например, /var/lib/docker/volumes/…), могут обеспечить немного лучшую производительность и автоматическую очистку. Однако доступ к данным требует взаимодействия через контейнер, например: docker run —rm -v volume:/data busybox.
На практике я чаще использую bind mounts. Они очень просты в настройке, и если ваше хранилище достаточно быстрое, проблем с производительностью не будет.
Резервные копии
Резервное копирование очень важно для данных постоянных томов. Прелесть контейнеров в том, что вы можете пересоздать контейнер Home Assistant, если у вас есть резервная копия данных. В своей лабораторной среде я использую комбинацию следующих инструментов:
- Veeam Backup and Replication – Я использую агент для Linux для резервного копирования локальных файлов и образов виртуальных машин, на которых работает мой Docker-хост. Также есть бесплатная Community Edition.
- Duplicati – Это самоуправляемое решение для резервного копирования томов, которое позволяет сохранять данные контейнеров в отдельном хранилище.
Как управлять устройствами Zigbee
С Home Assistant есть несколько способов организации связи с устройствами Zigbee. Можно позволить Home Assistant общаться напрямую с устройствами через USB-адаптер или использовать sidecar-контейнеры. Давайте разберём оба варианта.
Контейнер Home Assistant с USB-адаптером Zigbee
Первый вариант — подключить USB-адаптер Zigbee напрямую к контейнеру Home Assistant и использовать встроенную интеграцию ZHA. В этой конфигурации контейнер Home Assistant обращается напрямую к /dev/ttyACM0 (или другому устройству, соответствующему вашему адаптеру).
Вы можете приобрести адаптер по этой ссылке (партнёрская ссылка Amazon): https://geni.us/zigbeeusbdongle1
Сопряжение новых ламп, датчиков и выключателей происходит через страницу «Интеграции». Достаточно нажать «Настроить» в разделе ZHA и позволить системе обнаружить устройства. Обновления прошивки для многих популярных адаптеров можно применять прямо из этого интерфейса.
В этой конфигурации не нужны дополнительные контейнеры или брокеры, всё работает внутри процесса Home Assistant. Этот подход наиболее удобен, если вы планируете управлять устройствами Zigbee только через Home Assistant и не нуждаетесь в MQTT для других задач.
Home Assistant без USB-адаптера и sidecar-контейнеры
Если вы хотите изолировать трафик Zigbee или использовать его для нескольких сервисов, можно отказаться от прямого подключения USB и вместо этого запустить sidecar-контейнеры рядом с Home Assistant. Обычно это выглядит так:
Контейнер Zigbee2MQTT
|
1 2 3 4 5 6 7 8 9 10 11 |
zigbee2mqtt: image: koenkk/zigbee2mqtt:latest restart: unless-stopped network_mode: homenet devices: - /dev/ttyACM0:/dev/ttyACM0 volumes: - /srv/zigbee2mqtt/data:/app/data environment: - MQTT_SERVER=mosquitto |
Контейнер MQTT-брокера (Mosquitto)
|
1 2 3 4 5 6 7 8 9 10 |
mosquitto: image: eclipse-mosquitto:latest restart: unless-stopped network_mode: homenet ports: - "1883:1883" volumes: - /srv/mosquitto/config:/mosquitto/config:ro - /srv/mosquitto/data:/mosquitto/data |
Как работают sidecar-контейнеры? Zigbee2MQTT слушает USB-адаптер, преобразует сообщения устройств в JSON и публикует их в MQTT-брокер. Home Assistant получает эти сообщения через интеграцию MQTT.
Зачем нужна эта дополнительная сложность? Преимущество в поддержке большего количества устройств. Новые или нестандартные устройства Zigbee часто сначала появляются в Zigbee2MQTT. Кроме того, вы можете подключить Node-RED, пользовательские скрипты или дашборды напрямую к тем же MQTT-топикам. Вы жертвуете простотой ради гибкости и дополнительных возможностей.
Выбирайте прямое подключение USB, если вам важна простота. Используйте sidecar-контейнеры, если вам нужна максимальная гибкость и доступ к сети Zigbee из нескольких сервисов.
Создание файла Docker Compose
Ниже приведён аннотированный пример моего файла docker-compose.yml. Вы можете адаптировать теги образов, пути к томам и имена сетей под свою среду. В примере показаны:
- MQTT-брокер (eclipse-mosquitto)
- Zigbee2MQTT или deCONZ для устройств Zigbee
- InfluxDB и Grafana для долгосрочного хранения метрик и дашбордов
Если вам не нужны sidecar-контейнеры и вы используете USB-адаптер, просто удалите их из конфигурации.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
version: '3.8' services: homeassistant: image: ghcr.io/home-assistant/home-assistant:stable container_name: homeassistant user: "1001:1001" restart: unless-stopped network_mode: "service:proxy" # подключение к sidecar-контейнеру Traefik для SSL depends_on: - mosquitto volumes: - /srv/homeassistant/config:/config:rw - homeassistant_db:/config/home-assistant_v2.db environment: - TZ=America/Chicago secrets: - api_key healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8123/api/health || exit 1"] interval: 1m timeout: 10s retries: 3 cap_drop: - ALL cap_add: - CHOWN - SETUID - SETGID mosquitto: image: eclipse-mosquitto:latest container_name: mosquitto restart: unless-stopped networks: homenet: volumes: - /srv/mosquitto/config:/mosquitto/config:ro - /srv/mosquitto/data:/mosquitto/data - /srv/mosquitto/log:/mosquitto/log ports: - "1883:1883" influxdb: image: influxdb:2.6 container_name: influxdb restart: unless-stopped networks: homenet: volumes: - influxdb_data:/var/lib/influxdb2 environment: - INFLUXDB_ADMIN_USER=admin - INFLUXDB_ADMIN_PASSWORD_FILE=/run/secrets/influxdb_admin_password secrets: - influxdb_admin_password ports: - "8086:8086" grafana: image: grafana/grafana:9.5 container_name: grafana restart: unless-stopped networks: homenet: volumes: - grafana_data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORD_FILE=/run/secrets/grafana_admin_password secrets: - grafana_admin_password ports: - "3000:3000" networks: homenet: driver: macvlan driver_opts: parent: eth0 ipam: config: - subnet: 192.168.1.0/24 gateway: 192.168.1.1 volumes: homeassistant_db: influxdb_data: grafana_data: |
Добавление SSL-сертификатов
Вы можете легко добавить SSL-сертификаты в конфигурацию контейнера Home Assistant. Я рекомендую два решения:
Обновление без простоя
Для обновления Home Assistant я загружаю последний образ и перезапускаю контейнер с помощью команд Docker Compose:
|
1 2 |
docker compose pull homeassistant docker compose up -d homeassistant |
Заключение
Надеюсь, эта статья о проектировании Home Assistant в Docker Compose поможет тем, кто хочет развернуть Home Assistant в своей сети. Это мощное решение, которое объединяет умные устройства в настраиваемой и безопасной среде. Использование Docker — мой предпочтительный способ запуска Home Assistant, так как у меня уже есть домашняя лаборатория с Docker. Понимая ключевые концепции (хранилище, сеть, резервное копирование), вы сможете создать надёжную систему. Напишите в комментариях, как у вас настроен Home Assistant. Используете ли вы контейнеры?






