Home Assistant Backup

12-07-2022

Создание и сохранение резервных копий (Backup) описано в документации. Популярные решения представлены в следующем списке:

В связи с текущей ситуацией, рассмотрим сохранение копий на Yandex.Disk.

Для Backup создадим автоматизацию. Переходим Настройки->Автоматизации и сцены и нажимаем Создать автоматизацию.

Backup

Выбираем Начать с нуля.

Добавляем название - Full-Backup и описание Ежедневное полное сохранение. Режим - Одиночный.

Создаем Триггеры - Время, Режим - Фиксированное время - 3:00:00.

Условия пропускаем.

В Действиях выбираем - Вызвать службу. Служба - Home Assistant Supervisor: Create a full backup. Имя - daily_full_backup. Password - обязательно добавить. Compressed - сжатие тоже обязательно.

Действия

В формате yaml это выглядит так:

alias: Full-Backup
description: Ежедневное полное сохранение
trigger:
  - platform: time
    at: '03:00:00'
condition: []
action:
  - service: hassio.backup_full
    data:
      name: daily_full_backup
      password: password
mode: single

Для проверки запустим автоматизацию.

Переходим Настройки->Система->Резервные копии. Видим созданную резервную копию.

Backup

Теперь осталось только сохранить эту копию в Yandex.Disk. По статье - Бэкап на Yandex Disk настраиваем Yandex.Disk и скрипты.

Создаем папку scripts:

mkdir scripts

Создаем в ней скрипты:

  • backup-ha-day.sh - для ежедневного бэкапа
  • backup-ha-week.sh - еженедельного бэкапа
  • backup-ha-month.sh - ежемесячного бэкапа

На Yandex.Disk создаем следующую структуру каталогов:

  • Yandex.Disk/backups/ha/day - храним 7 архивов за последние 7 дней
  • Yandex.Disk/backups/ha/week - хранятся 4 бэкапа за последние 4 недели
  • Yandex.Disk/backups/ha/month - храним все резервные копии Home Assistant за все время

При установке Home Assistant в контейнер Docker, по этой инструкции, директория в которую сохраняются backup файлы на хостовой системе находится - /usr/share/hassio/backup/  Имена файлов backup в Home Assistant выглядят примерно так:

0d58ab97.tar  6bcf0ea5.tar  b6e7a1dc.tar  cc78178b.tar  ed4e3499.tar

Поэтому скрипты немного подправим. Для начала нужно определить самый последний созданный файл. Для этого воспользуемся такой командой:

ls -t | head -n1

backup-ha-day.sh:

#!/bin/bash
# Задаем переменные
# Текущая дата в формате 2020-12-01_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/home/drhellp/Yandex.Disk/backups/ha/day'
# Директория для архива
inf_dir='/usr/share/hassio/backup'
# Имя самого последнего созданного файла
file_to_bk=$(ls -t $inf_dir | head -n1)
# Копируем файл на Yandex.Disk
/usr/bin/cp $inf_dir/$file_to_bk $bk_dir/ha_$date_time.tar 
# Удаляем архивы старше 7-ми дней
/usr/bin/find $bk_dir -type f -mtime +7 -exec rm {} \;

backup-ha-week.sh:

#!/bin/bash
# Задаем переменные
# Текущая дата в формате 2020-12-01_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/home/drhellp/Yandex.Disk/backups/ha/week'
# Директория для архива
inf_dir='/usr/share/hassio/backup'
# Имя самого последнего созданного файла
file_to_bk=$(ls -t $inf_dir | head -n1)
# Копируем файл на Yandex.Disk
/usr/bin/cp $inf_dir/$file_to_bk $bk_dir/ha_$date_time.tar 
# Удаляем архивы старше 30-ти дней
/usr/bin/find $bk_dir -type f -mtime +30 -exec rm {} \;

backup-ha-month.sh:

#!/bin/bash
# Задаем переменные
# Текущая дата в формате 2020-12-01_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Куда размещаем backup
bk_dir='/home/drhellp/Yandex.Disk/backups/ha/month'
# Директория для архива
inf_dir='/usr/share/hassio/backup'
# Имя самого последнего созданного файла
file_to_bk=$(ls -t $inf_dir | head -n1)
# Копируем файл на Yandex.Disk
/usr/bin/cp $inf_dir/$file_to_bk $bk_dir/ha_$date_time.tar

Добавляем запуск этих файлов в cron:

sudo nano /etc/crontab
# home assistant backup to yandex.disk
# ежедневно в 3:30
30 3 * * * root /home/drhellp/scripts/backup-ha-day.sh >/dev/null 2>&1
# еженедельно в 4:30 в воскресенье
30 4 * * 0 root /home/drhellp/scripts/backup-ha-week.sh >/dev/null 2>&1
# ежемесячно в 5:30 1-го числа месяца
30 5 1 * * root /home/drhellp/scripts/backup-ha-month.sh >/dev/null 2>&1

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