Docker часть 5: MariaDB
Меняем базу данных в Home Assistant на MariaDB

В этой части мы переделаем базу данных SQLite на MariaDB. Так как стандартная база данных предназначена для большого количества данных. И может нестабильно работать при заполнении.
Контейнер с MariaDB
Продолжая ту же тенденцию, что и в предыдущих частях. Первым делом добавим новый контейнер, в котором будет храниться наша база данных.
version: '3.0'
services:
portainer: # часть 2
[...]
homeassistant: # часть 3
[...]
hass-configurator: # часть 4
[...]
mariadb:
container_name: mariadb
image: mariadb:latest
restart: unless-stopped
environment:
- TZ=Europe/Moscow
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_HA_DATABASE}
- MYSQL_USER=${MYSQL_HA_USER}
- MYSQL_PASSWORD=${MYSQL_HA_PASSWORD}
ports:
- "3306:3306"
volumes:
- ./mariadb:/var/lib/mysql
Так же создаем папку для mariadb
mkdir mariadb
Переменные окружения
Возможно вы заметили, что в docker-compose.yaml появились записи подобного типа ${MYSQL_ROOT_PASSWORD}. Они хранят конфиденциальные данные в отдельном файле. Это особенно полезно, когда мы хотим создать резервную копию и/или распространить нашу конфигурацию Docker в системе контроля версий (VCS), такой как GitHub/Gitlab.
Чтобы указать значение для этих переменных среды, создайте файл .env в том же каталоге, что и файл docker-compose.yaml.
sudo nano .env
# Так же настроим права на запись, чтобы не приходилось каждый раз писать sudo
sudo chown root:docker .env
sudo chmod g+w .env
.env файл будет выглядеть так, обязательно поменяйте пароли
MYSQL_ROOT_PASSWORD=mariadbrootpassword
MYSQL_HA_DATABASE=ha_db
MYSQL_HA_USER=homeassistant
MYSQL_HA_PASSWORD=mariadbhapassword
Зависимости контейнеров
Если перезагрузим нашу систему Docker, мы также хотим, чтобы контейнер Home Assistant перед запуском ждал, пока контейнер MariaDB запустится. Это необходимо, чтобы данные из HA не потерялись.
Поэтому добавьте следующее в запись конфигурации в контейнере homeassistant
[...]
homeassistant:
[...]
depends_on:
- mariadb
После всего перезапускам Docker
docker compose up -d

Конфигурация Home Assistant
Когда контейнеры запущены и они работают, то первая половина работы выполнена. Нам все еще нужно сообщить Home Assistant об этой новой базе данных. Для этого мы добавим конфигурацию в Home Assistant.
Секреты
Открываем файл secrets.yaml с помощью File Editor и добавляем новую переменную. Не забудьте поменять ip адрес, а также если вы меняли пароли, то замените их.
mariadb: "mysql://homeassistant:mariadbhapassword@<ip>:3306/ha_db?charset=utf8mb4"

Соединение с базой данных
Далее переходим к configuration.yaml. В него вставляем новую запись, в которой будет происходить соединение с базой данных.
recorder:
db_url: !secret mariadb
purge_keep_days: 30

Перезапуск
Последним этапом заходим в интерфейс Панель разработчика и проверяем все ли правильно мы заполнили. В случае успешной проверки нажимаем «Перезапуск». Теперь база данных будет MariaDB.

Управление базой из Home Assistant
Если вам необходим доступ напрямую в базу данных, то можно установить любой web клиент. Самым простым решением будет Adminer.
Для этого добавляем новый контейнер в docker-compose.yaml
adminer:
container_name: adminer
image: adminer
restart: unless-stopped
environment:
- ADMINER_DEFAULT_SERVER=mariadb
- ADMINER_PLUGINS=frames
ports:
- "8077:8080/tcp"
depends_on:
- mariadb
Ну и конечно вывести его в интерфейс Home Assistant, файл configuration.yaml
panel_iframe:
[...]
adminer:
title: Adminer
icon: mdi:database
url: "http://<ip>:8077"
require_admin: true


Итоговая структура проекта
home-assistant
├── .env
├── docker-compose.yaml
├── fileeditor
├── homeassistant
├── mariadb
│ └── ...
└── portainer
Docker часть 4: File Editor
Добавляем возможность редактировать конфигурацию напрямую в Home Assistant.
Docker часть 6: Mosquitto MQTT
Добавляем Docker контейнер в Home Assistant.
Обсуждение
Чтобы не пришлось тратить N часов после копи-паст – замените все черточки (код 0x97) на знак минус (код 0x2D).
Докер их не понимает. Для сравнения
— MYSQL_USER=${MYSQL_HA_USER}
– MYSQL_USER=${MYSQL_HA_USER}
Для тех, у кого возникнут ошибки, убил несколько часов, в итоге:
1 – Остановил контейнер с MariaDB
2 – Стер папку MariaDB и заново создал
3 – Отредактировал .env на простой логин пароль, например hass:hass
4 – Обязательно в dockerfile указал сеть (чтобы контейнеры общались между собой)
5 – Удалите номер версии в dockerfile
Путь такой: mariadb: “mysql://hass:hass@mariadb/ha_db?charset=utf8mb4”
Мой рабочий файл конфигурации на данный момент:
services:
homeassistant:
container_name: homeassistant
image: ghcr.io/home-assistant/home-assistant:stable
restart: unless-stopped
privileged: true
networks:
– ha-net
environment:
– TZ=Europe/Moscow
volumes:
– ./homeassistant/:/config
– /etc/localtime:/etc/localtime:ro
ports:
– “8123:8123”
depends_on:
– mariadb
hass-configurator:
container_name: hassconf
image: causticlab/hass-configurator-docker
restart: unless-stopped
networks:
– ha-net
environment:
– HC_BASEPATH=/hass-config
– DIRSFIRST=true
ports:
– “3218:3218/tcp”
volumes:
– ./fileeditor:/config
– ./homeassistant:/hass-config
mariadb:
container_name: mariadb
image: mariadb:latest
restart: unless-stopped
networks:
– ha-net
environment:
– TZ=Europe/Moscow
– MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
– MYSQL_DATABASE=${MYSQL_HA_DATABASE}
– MYSQL_USER=${MYSQL_HA_USER}
на текущую дату, обновив образы докера, никак не мог подключить homeassistant к mariadb.
ПОКА не поменял ip в строке подключения на имя контейнера
Хотя неделю назад всё работало по ip без проблем
Запуск интеграции recorder. До завершения запуска не всё будет доступно.
После всех манипуляций вот такое весит и крутит Loading Data. Сколько нужно ждать?
Пробую ставить всё по инструкции, до этого момента всё шло нормально, но тут споткнулся: контейнер с марией не запускался, разобрался, что порт 3306 чем-то занят (ручной запуск выдавал сообщение Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use), как оказалось – mysql, остановил сервис и у меня контейнер с марией заработал, но когда залез в Adminer, то обнаружил, что в базе ha_db вообще нет таблиц :(, короче совсем не как на скриншоте выше. По десять раз всё проверил: и пароли и записи во всех файлах и прочее рестарты докера, HomeAssistent – база пустая, причём сам HomeAssistent ничего не говорит, что у него где-то там проблемы. Куда можно посмотреть и что проверить? Ставлю на комп с Ubuntu 22.04.4 LTS x64.
В новой версии Home Assistant вывод в интерфейс через panel_iframe считается устаревшим и не работает, нужно создавать dashboardы (https://my.home-assistant.io/redirect/lovelace_dashboards/).
https://github.com/home-assistant/home-assistant.io/issues/32162
Все так, официальный образ MariaDB не поставляется для arm/v7.
При установке марии на raspberry pi 3 по инструкции возникает ошибка no matching manifest for linux/arm/v7 in the manifest list entries
В этом случае образ марии можно использовать yobasystems/alpine-mariadb
(аналогичная проблема имеется с code-server, но ему решения я не искал)
Спасибо за отменный материал.
Хотелось бы уточнить один момент для будущих последователей.
Настанет момент когда будете делать сенсор в HA который будет отображать объем места занимаемой системой MySql
Запрос подают такой
SELECT table_schema "database", Round(Sum(data_length + index_length) / 1048576, 2) "value"
FROM information_schema.tables
WHERE table_schema="homeassistant"
GROUP BY table_schema;
и вот тут у меня он возвращал пустоту – table_schema="homeassistant" – не было такой записи
Стал писать вопрос сюда и обозревая текст запроса и структуру баз – догал, что table_schema – это имя БД homeassistant, которое вы указали в настройках docker-compose. Т.к. я не иду простыми путями и даю свои имена, вот и попался.
Откорректируйте запрос под вашу БД
WHERE table_schema="имя-вашей бд-homeassistant"
переделывал. все равно выдает такие ошибки
Home Assistant Core
Setup failed for recorder: Integration failed to initialize.
16:23:55 – (ОШИБКА) setup.py – первое сообщение получено 16:23:51 и повторялось 5 раз
Unable to set up dependencies of logbook. Setup failed for dependencies: recorder
16:23:55 – (ОШИБКА) setup.py – первое сообщение получено 16:23:53 и повторялось 4 раз
Error during connection setup: (MySQLdb.OperationalError) (1045, “Access denied for user ‘homeassistant’@’172.18.0.1’ (using password: YES)”) (Background on this error at: https://sqlalche.me/e/20/e3q8) (retrying in 3 seconds)
16:23:48 – (ОШИБКА) Recorder – первое сообщение получено 16:23:21 и повторялось 10 раз
Setup of recorder is taking over 10 seconds.
16:23:30 – (ПРЕДУПРЕЖДЕНИЕ) runner.py