Установка Home Assistant на одноплатные компьютеры, имеющие внутреннюю память emmc, имеет много преимуществ. В частности, значительно возрастает скорость работы Home Assistant. Но такой способ имеет очень существенный недостаток - любая flash память подвержена старению и деградации, что приведет к неработоспособности как самой системы, так и одноплатника вообще. Как бы нас не уверяли производители, ничего вечного не существует. Самую значительную роль в деградации emmc, в случае установки Home Assistant, играет база данных. Причем неважно, будет это стандартная SQLite или более производительная MariaDB, любые операции с базой данных сильно изнашивают носитель. Существуют способы ограничить операции ввода-вывода в базу данных путем настройки рекордера, фильтрации сущностей и т.д. Кроме того, emmc, чаще всего, имеют не слишком большой размер, а т.к. на ней установлена и операционная система и Home Assistant, то для самой базы может остаться совсем мало места.
Я использую внешнюю базу данных, которая установлена на сервере Oracle Cloud. Плюсы этого решения заключаются в том, что на работу самой базы данных не расходуются достаточно ограниченные вычислительные ресурсы одноплатника и "вечный" носитель, о работоспособности которого заботится компания Oracle. Минусы тоже есть - во-первых, при нестабильном интернет соединении некоторые данные не смогут быть обработаны и не попадут в саму базу. Также многие пользователи считают, что собственный сервер, который не зависит от интернет соединения или воли поставщика вычислительных мощностей, должен быть в приоритете. Каждый выбирает то, что считает приемлемым для своего применения.
Есть другой вариант - это перемещение базы данных, установленной на одноплатнике, на карту памяти, которая имеется на всех одноплатниках. Также это может быть как USB флешка, так и внешний SSD диск. Мне больше по душе карта памяти, которую мы отправим "умирать" во благо нашего умного дома. Она имеет малую стоимость и практически всегда есть в наличии на замену. Если делать бекапы, то данные, которые "умрут" вместе с картой, будут зависить только от частоты бекапов. Решение, предлагаемое здесь, позволяет избавиться сразу от нескольких недостатков. Во-первых, это большой размер для базы. Во-вторых - продление срока службы emmc и самого одноплатника.
Если вам подходит такое решение, можно начинать.
Установка базы банных
- Переключаемся на суперпользователя. В зависимости от системы это либо
su -
либо
sudo su -
- Прежде всего, обновляем систему
apt update && apt upgrade -y && apt autoremove -y
- Устанавливаем требуемые пакеты
apt-get install libmariadb-dev libmariadb-dev-compat -y
И MariaDB
apt install mariadb-server -y
- Сразу останавливаем базу
systemctl stop mysql || systemctl stop mariadb
Перенос базы данных
- Создаем папку, в которую будет монтироваться внешний носитель
md /dbase
- Смотрим название раздела
lsblk
fdisk -l
сделаем вид, что карта памяти называется sdb1
- Смотрим UID пользователя mysql
id -u mysql
сделаем вид, что команда вернула значение 106
- Отредактируем файл fstab. Для этого запустим редактов nano
nano etc/fstab
В открывшемся редакторе добавим в конце строку
/dev/sdb1 /dbase vfat uid=106
Для записи изменений и выхода нажимаем CTRL+O, Enter и CTRL+Z
- Копируем все файлы данных MariaDB в созданную папку
rsync -av /var/lib/mysql /dbase
- Переименуем старую папку /var/lib/mysql, сохраним её на случай сбоя
mv /var/lib/mysql /var/lib/mysql.bak
Настройка MariaDB
- Редактируем файл конфигурации MariaDB
nano /etc/mysql/mariadb.conf.d/50-server.cnf
В секциии [mysqld] находим и изменяем параметры datadir и bind-address
[mysqld]
datadir = /dbase/mysql
bind-address = 0.0.0.0
CTRL+O, Enter и CTRL+X
- Настроим AppArmor, чтобы предоставить MySQL право на изменение нового каталога
nano /etc/apparmor.d/tunables/alias
Добавим правило
alias /var/lib/mysql/ -> /dbase/mysql/,
CTRL+O, Enter и CTRL+X
- Перезапусткаем AppArmor
systemctl restart apparmor
- Запускаем MariaDB
systemctl start mysql || systemctl start mariadb
- Заходим в консоль MariaDB
mysql -u root -p
вводим пароль администратора
Добавляем в базу таблицу, пользователя и устанавливаем права
CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'database_user_name'@'localhost' IDENTIFIED BY 'database_user_password';
grant all privileges on *.* to database_user_name@"%" identified by "database_user_password";
quit
Enter после каждой строчки, вместо <database_name>, <database_user_name>, <database_user_password> вводим ваше имя базы, имя пользователя и пароль
- Перезагрузка
reboot
Настройка Home Assistant
- Изменяем в configuration.yaml
recorder:
db_url: mysql://database_user_name:database_user_password@mysql_server_ip/database_name?charset=utf8mb4
- Добавляем датчик размера базы через штатную интеграцию SQL и настроив ее следующим образом:
URL-адрес базы данных
mysql://database_user_name:database_user_password@mysql_server_ip/database_name?charset=utf8mb4
Запроc
SELECT table_schema "database", Round(Sum(data_length + index_length) / 1024 / 1024, 1) "value" FROM information_schema.tables WHERE table_schema="database_name" GROUP BY table_schema;
Столбец
value
Примерно как здесь:
Наслаждаемся и благодарим.