Простой скрипт сохранения резервной копии на флешку или удалённый сервер для HomeAssistant

28 сентября 2020, 12:17

В данной статье речь пойдёт о создании бэкапа и копировании его на флешку или на удалённый сервер при помощи утилиты rsync. Мне данный способ показался наиболее простым и, конечно же, рабочим. 

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

Создание резервной копии и перемещение на флешку

В первую очередь, подключаем наше устройство к компьютеру через USB или через другой доступный интерфейс. Далее, при помощи fdisk с ключом -l, получаем список подключённых накопителей.  

pi@hatest:~ $ sudo fdisk -l
....
Device     Boot Start     End Sectors Size Id Type
/dev/sda1        2048 4143103 4141056   2G  b W95 FAT32
pi@hatest:~ $ 

Как видно из листинга, у нас подключено устройство объёмом 2Gb и отформатированное в Fat32, нам же нужен адрес раздела, в данном случае - это /dev/sda1, у вас буквы могут отличаться.

Далее, при помощи команды blkid, получаем уникальный идентификатор устройства (UUID), это нужно для того, чтобы в случае смены буквы диска, система его монтировала и копии создавались там, где это необходимо, а не на диске с вашими любимыми фото котят.

pi@hatest:~ $ sudo blkid /dev/sda1
/dev/sda1: UUID="972B-3F23" TYPE="vfat" PARTUUID="101ce48c-01"

Куда-нибудь записываем UUID, его нужно будет указать в fstab, речь об этом пойдёт чуть ниже.

Далее, при помощи команды mkdir, необходимо создать каталог, к которому будет монтироваться наше устройство. В случае, если Home Assistant установлен в Docker, необходимо, чтобы этот каталог был доступен из контейнера. Следовательно, создаём по адресу /usr/share/hassio/backup/

pi@hatest:~ $ sudo mkdir /usr/share/hassio/backup/remote

Далее необходимо внести изменения в fstab:

pi@hatest:~ $ sudo nano /etc/fstab

Добавляем в конце файла следующую строчку и последовательно нажимаем Ctrl O (записать), Ctrl X (выход).

#Опции монтирования накопителя
UUID=972B-3F23  /usr/share/hassio/backup/remote vfat    defaults,rw     0       0

Где:

  • UUID=972B-3F23 - идентификатор устройства, у вас он, естественно, будет другим.
  • /usr/share/hassio/backup/remote - точка монтирования.
  • vfat - тип файловой системы (для устройств, отформатированных в FAT, для NTFS будет ntfs-3g).
  • defaults - использовать настройки по умолчанию, rw - разрешить чтение и запись, по идее, она не нужна, но мне так спокойней.
  • 0 - сообщаем о том, что данный раздел не должен быть включён в дамп.
  • 0 - сообщаем о том, что нет необходимости выполнять проверку раздела, также можно поставить значение равное 2.

Монтируем при помощи команды mount и опции -a, и на этом всё с хостом.

pi@hatest:~ $ sudo mount -a

Далее в Home Assistant нам понадобится дополнение SSH & Web Terminal от сообщества, так как оно имеет больше возможностей, в отличие от официального. Параметры его настройки есть в документации или в моём видео в начале статьи.

После установки, создаём файл backup.sh, расположенный по следующему пути: /config/scripts/, т.е. в итоге должно получиться:

/config/scripts/backup.sh

Вносим в него скрипт:

#!/bin/bash
date=`date " %F"`
echo $date
STORE_DAYS=3
SRC=/backup/
DST=/backup/remote/
rsync -a \
--delete \
--remove-source-files \
--exclude 'remote' \
$SRC $DST/Processing-$date \
&& cd $DST \
&& mv Processing-$date $date \
&& find . -type d -mtime  $STORE_DAYS -exec rm -rf {} \; \
> /dev/null

Где: 

  • #!/bin/bash - указываем используемый интерпретатор.
  • date=`date " %F"` - создаём переменную вида 2020-09-20, вариант с часами и минутами date=`date " %Y-%m-%d-%H%M%S"`.
  • STORE_DAYS=3 - сколько дней будем хранить резервные копии, можно изменить на свой вкус.
  • SRC=/backup/ - директория, откуда выполняем копирование.
  • DST=/backup/remote/ - директория, куда выполняем копирование.
  • rsync -a \ -  выполняем rsync для всех файлов.
  • --delete \ - удаляем посторонние файлы в директории назначения.
  • --remove-source-files \ - после копирования удаляем файлы в директории источнике, можете убрать.
  • --exclude 'remote' \ - директории, которые исключаем, дабы не было рекурсии и мы не создавали копии сохранённых копий.
  • $SRC $DST/Processing-$date \ - выполняем синхронизацию во временную директорию.
  • && cd $DST \ - переходим в директорию назначения.
  • && mv Processing-$date $date \ - переносим из временной директории в постоянную, также можно прочитать как переименование. 
  • && find . -type d -mtime $STORE_DAYS -exec rm -rf {} \; \ - командой find в директории назначения находим все каталоги старше заданного количества дней и удаляем.
  • > /dev/null - перенаправляем вывод команд. 

Вариант скрипта для копирования на удалённый сервер (Time Machine)

Также необходимо установленное дополнение SSH & Web Terminal, но сам скрипт несколько отличается, листинг и некоторые комментарии к нему будут приведены ниже, так как предполагается, что читатель, использующий данный метод, уже знаком с bash.

NB: Используется авторизация по ключу

Листинг скрипта

#!/bin/bash
date=`date " %Y-%m-%d-%H%M%S"`
STORE_DAYS=3
SRC=/backup/
DST=/backups/ha
rsync -a \
--delete \
--fake-super \
--remove-source-files \
--link-dest=../Latest \
$SRC backup@your_ip:$DST/Processing-$date \
&& ssh -T backup@your_ip \
"cd $DST \
&& mv Processing-$date $date \
&& rm -f Latest \
&& ln -s $date Latest \
&& find . -type d -mtime  $STORE_DAYS -exec rm -rf {} \;"

В данном скрипте, после синхронизации с удалённым сервером, создаётся жёсткая ссылка Latest на последнюю резервную копию, таким образом, можно очень оперативно получить доступ к последней копии. Необходимо, чтобы удалённая файловая система поддерживала такие ссылки.

Пример автоматизации

Ниже приведён пример автоматизации созданной в GUI. Стоит обратить внимание на установленную задержку, это сделано для того, чтобы синхронизация не началась до того, как будет создан снапшот, так как создание занимает некоторое время.

- id: '1600711902170'
  alias: Резервная копия на флешку
  description: ''
  trigger:
  - platform: time
    at: 02:00:00
  condition: []
  action:
  - service: hassio.snapshot_full
    data_template:
      name: hassio_{{now().strftime('%d.%m.%Y')}}
  - delay: 00:01:00
  - service: hassio.addon_stdin
    data:
      addon: a0d7b954_ssh
      input: bash /config/scripts/backup.sh
  mode: single

Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Сергей Исаенков (s.isaenkov)
    Сергей Исаенков (s.isaenkov) 11 месяцев назад

    Также есть дополнение к Hass.io для выгрузки запароленных резервных копий снапшотов на Google Drive.

    • Игнат Вакорин (werewolfe)
      Игнат Вакорин (werewolfe) 11 месяцев назад

      Да, я знаю.

      Но в этом случае, если немного фантазии применить, можно и на GoogleDrive и на Яндекс Диск и на Облако Мэйл и в Nextcloud скидывать и в Дропбокс и куда угодно, достаточно смонтировать по WebDav, единственное, нужно будет сделать мониторинг, что ничего не отвалилось. А также если есть утилита консольная, то использовать её. Я не стал это затрагивать.

  2. Бендер Задунайский (Nathareth)

    И какой смысл регулярно бэкапить если нет изменений в системе ? А если наковырял - тискаем на родную кнопку снапшота, и абсолютно любым стандартным синхронизатором по самбе забираете и кладете куда угодно. Просто, быстро и понятно.

    А то что выше вы называете самым простым... Ну-ну... ))

    • Сергей Исаенков (s.isaenkov)
      Сергей Исаенков (s.isaenkov) 11 месяцев назад

      И выстрелит это в самый неподходящий момент, когда пару раз забыл сделать рукаим бэкап :)

    • Игнат Вакорин (werewolfe)
      Игнат Вакорин (werewolfe) 11 месяцев назад

      Я не сказал, что это самый простой )
      А если завтра выгорает что-то на железке, выходит из строя диск и прочее? Что тогда? Какую кнопку нажимать?

      Старый баян: Администраторы делятся на две категории, на тех кто ещё не делает бэкапы и всех остальных.

      • Бендер Задунайский (Nathareth)

        "Мне данный способ показался наиболее простым".
        Или текст не вы писали ? ))

        • Игнат Вакорин (werewolfe)
          Игнат Вакорин (werewolfe) отредактировано 11 месяцев назад

          Мне показался самым простым != самый простой.

          Я не знаю какой самый простой, он для каждого свой, наверное. 

  3. Александр Жабунин (OXOTH1K)
    Александр Жабунин (OXOTH1K) 11 месяцев назад

    Да чего вы накинулись на парня то? Годная статья. У некоторых кроме ха на малине/минипк ещё другие вещи стоят. Их тоже как бы надо бэкапить. И вот такой вариант как раз для этого.

  4. (sergius_the_black)
    (sergius_the_black) 11 месяцев назад

    Замечание: Вы используете ln -s, так что ссылка мягкая. Ну и можно без аддонов просто в crontab добавить с каким-то зазором, чтобы бекап снялся, но это дело вкуса, конечно.

    • Игнат Вакорин (werewolfe)
      Игнат Вакорин (werewolfe) 11 месяцев назад
      Спасибо за замечание! Глаз замылился :)
      Если кто-то дочитает до сюда, то жесткая ссылка создаётся через ln без ключей.

      Хотелось показать как сделать средствами HA, а так, конечно можно или через крон, или (мой выбор в последнее время) через таймеры системд. 

К списку статей

Тематические чаты

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
25 сентября 2020, 11:49
Сенсорный монитор для управления умным домом. Настройка и использование.
20 октября 2018, 22:57
Теоретические основы протокола MQTT и описание того, как он работает и для чего используется
24 августа 2018, 12:18
Пошаговая установка HomeAssistant
15 ноября 2018, 09:42
Способы автоматизации механических ворот
28 августа 2018, 09:48
От голого Raspbian до веб-интерфейса homebridge за четыре команды в терминале.
27 августа 2018, 10:14
Интегрируем ХА в HomeKit
03 октября 2018, 22:03
Как собрать и настроить Hyperion Ambilight - адаптивную подсветку ТВ.
29 октября 2019, 07:59
Умный домофон на базе nodeMCU с прошивкой ESPHome.
01 ноября 2018, 09:27
Настройка Deconz USB стика ConBee от Dresden Elektronik в Hass.io и некоторые особенности эксплуатации