restic_backup это скрипт для бэкапа файлов и баз данных с помощью утилиты restic.
Ссылки:
Скрипт выполняет инкрементальные резервные копии в репозиторий для бэкапов. В качестве репозитория может использоваться S3-севместимое хранилище или другой диск. Все варианты описаны здесь.
Инкрементальный бэкап означает, что первый бэкап содержит полную копию всех данных, а все последующие копии содержат только изменённые файлы. Поэтому первая резервная копия будет выполняться значительно дольше последующих.
Бэкап запускается ежедневно по таймеру systemd restic_backup.timer, таймер запускает юнит systemd restic_backup.service из которого происходит непосредственнй запуск скрипта restic_backup.
Просмотреть список таймеров можно командой:
systemctl list-timers
Уведомления на электронную почту при падении бэкапа могут быть настроены по инструкции systemd Timers.
Как альтернатива вместо таймеров systemd можно использовать cron. Пример cron-задачи:
0 1 * * * /usr/local/bin/restic_backup
Общий алгоритм работы скрипта такой:
restic init
.restic forget
. В скрипте используется опция
--keep-last
, однако можно переписать
/usr/local/bin/restic_backup на использование другой
опции. Сохраняется то количество резервных копий, которое указано в
переменной RESTIC_KEEP
в файле
/etc/restic_backup/settings.sh.retic backup
. В репозиторий
загружаются файлы и дампы баз данных.Подробный отладочный лог (xtrace) работы скрипта сохраняется в файл /var/log/restic_backup.log. Если запуск бэкапа производится по таймеру systemd, то логи также будут доступны через утилиту journalctl:
journalctl -u restic_backup.service
Список файлов входящих в скрипт restic_backup:
Makefile это файл для утилиты GNU make, помогающий автоматически выполнять некоторые действия по коротким командам.
В процессе эксплуатации restic_backup Makefile не используется, однако он помогает в установке скрипта. Доступные команды:
Последние две команды требуют установки утилиты pandoc.
Будет рассмотрена настройка S3-бакета в качестве репозитория для бэкапов.
Фрагмент файла /etc/restic_backup/settings.sh:
# --------------------------- НАСТРОЙКИ RESTIC ---------------------------- #
# Ключ доступа к бакету S3. Совпадает с логином аккаунта
export AWS_ACCESS_KEY_ID=<MY_ACCESS_KEY>
# Секретный ключ доступа к бакету. Можно скопировать из ПУА.
export AWS_SECRET_ACCESS_KEY=<MY_SECRET_ACCESS_KEY>
# Адрес репозитория, куда будут сохраняться резервные копии
export RESTIC_REPOSITORY="s3:https://s3.timeweb.com/restic-demo"
# Пароль для доcтупа к бэкапам. Все бэкапы шифруются. В случае утраты этого
# пароля получить доступ к резрвным копиям будет невозможно!
export RESTIC_PASSWORD="tiwfBM4i3jDvMA6ah1AIs2HdoJ9w66OS"
# Количество бэкпов, которые нужно хранить в репозитории
RESTIC_KEEP=2
# ------------------ СПИСОК ФАЙЛОВ И ДИРЕКТОРИЙ ДЛЯ БЭКАПА ---------------- #
# Пути к файлам и директориям обязательно должны быть абсолютными.
# Абсолютный путь содержит полный путь до файла/директории начиная от
# корневого каталога системы.
#
# Переменная `files` ниже содержит перечень путей. Обратите внимание, что
# пути, которые содержат пробелы должны быть обязательно включены в кавычки.
# Пример: '/home/user/some dir'
files=(
/etc
/home)
# ---------------------- СПИСОК БАЗ ДАННЫХ ДЛЯ БЭКАПА --------------------- #
# Ниже необходимо указать реквизиты подключения к базам данных в формате URI
# (DSN). Запись должна иметь следующий вид:
#
# mysql://пользователь:пароль@хост:порт/имя_базы_данных
#
# Обратите внимание на разделители между частями URI: ":", "@", "/". Порт
# можно опустить, если используется стандартный 3306.
#
# Ниже дан записи для БД bitrix_db и именем пользователя bitrix_usr и
# паролем boRpBnhGn7ue.
#
# mysql://bitrix_usr:boRpBnhGn7ue@localhost/bitrix_db
#
# Если пароль пользователя базы данных содержит специальные символы, то такой
# пароль обязательно надо закодировать в percent code. Это можно сделать
# следующей командой в терминале:
#
# echo 'ваш_пароль' | perl -MURI::Escape -wlne 'print uri_escape $_'
#
# или через онлайн-сервис https://meyerweb.com/eric/tools/dencoder/
#
# Ниже введите URI с реквизитами баз данных так как это показано. Обратите
# внимание, что знак равно не должен юыть отделён пробелами. Формат записи
# строго такой как есть.
databases=(
mysql://пользователь:пароль@хост/база_данных
mysql://пользователь:пароль@хост/другая_база_данных)
Запустить резервное копирование прямо сейчас можно командой:
/usr/local/bin/restic_backup
Выполнение бэкапа заблокирует ввод в темнал. Желательно запускать команду в сессии tmux или screen. Пример запуска сессии tmux:
tmux new -s restic_backup
Весь вывод скрипта отправляется в отладочный лог /var/log/restic_backup.log.
Отслеживать проесс можно командой:
tail -f /var/log/restic_backup.log
Для удобства работы перед вызовом команд restic следует импортировать файл с настройками.
Это делается командой:
source /etc/restic_backup/settings.sh
После чего можно выполнять команды restic без надобности вручную указывать адрес репозитория и пароль.
Воспользуйтесь инструкцией из официальной документации утилиты: https://restic.readthedocs.io/en/stable/050_restore.html
Сперва вам потребуется узнать ID снапшота (так в restic называются бэкапы). Для этого запустите команду:
restic snapshots
В терминал будет напечатана таблица со списком всех имеющихся снапшотов.
Вы можете восстанавливать снапшоты целиком командой вида:
restic restore 79766175 --target /tmp/restore-work
где 79766175 это ID снапшота, а /tmp/restore-work директория, куда будут восстанавливаться файлы.
Другой вариант восстановления — через монтирование репозитория в качестве сетевого диска. Документация: https://restic.readthedocs.io/en/stable/050_restore.html#restore-using-mount
С примонтированного диска вы можете скопировать как все файлы, так и отдельные.
Команды для монтирования:
mkdir -p /mnt/restic
restic mount /mnt/restic
restic при помощи FUSE создаст виртуальную файловую систему. При этом
терминал будет заблокирован. Можно запустить команду на монтирвоание в
сессии tmux или screen и работать с примонтирвоанным диском в другом
окне. Либо открыть новую сессию SSH и работать в ней. После можно
прервать restic сочетанием клавиш Ctrl+C
или выполнить
команду:
fusermount -u /mnt/restic
чтобы отмонтировать бэкапы.
Восстановление баз данных почти ничем не отличается от восстановления обычных файлов.
zcat имя_дампа.sql.gz | mysql -u'пользователь' имя_базы_данных -p'пароль'
Удаление производится командой restic forget
. Смотрите
подробное описание в документации
https://restic.readthedocs.io/en/stable/060_forget.html