Как настроить резервное копирование в объектное хранилище с помощью Restic
В 2007 многие администраторы настраивали бэкапы с помощью утилиты rsync, но для этого нужно было выделять отдельный хост для хранилища. И одной из частых проблем было резервирование этого сервера для бэкапов, которое увеличивало накладные расходы. Также хост бэкапирования располагался рядом с устройствами, для которых нужно было выполнить резервное копирование, настроить мониторинг и другое. Это нарушало правило 3–2–1, поэтому для построения действительно надежной системы нужно располагать хосты в разных дата-центрах.
Сегодня можно прибегнуть к услугам облачного хранения данных — например, использовать объектное хранилище Selectel. В этой инструкции рассмотрим, как работать с ним с помощью утилиты Restic.
Restic — это система резервного копирования, предоставляющая инструменты для сохранения резервных копий в версионированном репозитории, который может быть расположен на внешних серверах и в облачных хранилищах. Также Restic позволяет определить правила для включения и исключения файлов и каталогов в резервную копию.
Создание контейнера
Для начала переходим в панель управления и открываем раздел Объектное хранилище. Теперь создадим отдельный контейнер для хранения данных и пользователя, связанного с этим контейнером.
Во время создания пользователя нужно установить галочку у пункта Использовать эти данные для доступа по протоколу S3.
Затем необходимо привязать созданного пользователя к контейнеру с правами Чтение и запись.
Утилита Restic поддерживает разнообразные бэкенды для хранения данных — локальные директории, удаленные серверы через протокол SFTP/SSH, Swift, S3 и другие, а также работает на операционных системах Linux, MacOS и Windows.Одна из приятных особенностей — поддержка политик удаления старых бэкапов, с помощью которых можно настроить настроить «классическое хранение»: семь ежедневных бэкапов, четыре — еженедельных и 12 — ежемесячных. Это упрощает поддержку и администрирование систем.
Установка Restic и подключение к хранилищу
В данном примере будем использовать дистрибутив Ubuntu 22.04 с установкой Restic из репозитория. Если вам нужна более свежая версия, можно воспользоваться страницей с релизами для самостоятельной установки.
Шаг 1. Подключитесь к своему серверу и установите необходимые зависимости.
$ sudo apt update
$ sudo apt install -y restic
Шаг 2. Обновите Restic и проверьте, установилась ли необходимая версия.
restic self-update
$ restic version
restic 0.15.2 compiled with go1.20.3 on linux/amd64
Шаг 3. Экспортируйте переменные окружения и инициализируйте репозиторий, использующий S3 Selectel в качестве бэкенда.
$ export AWS_ACCESS_KEY_ID=<имя_пользователя_контейнера>
$ export AWS_SECRET_ACCESS_KEY=<пароль_пользователя_контейнера>
$ restic -r s3:s3.storage.selcloud.ru/<название_контейнера> init
После ввода команды и вывода сообщения в терминале задайте пароль для репозитория. Его важно запомнить, иначе вы не сможете получить доступ к данным из хранилища.
Пример работы с хранилищем через Restic
Резервное копирование
Для примера создадим директорию с файлом, которую будем бэкапировать. Если у вас уже есть директория с данными для будущего бэкапа, этот шаг можно пропустить.
$ mkdir dir
$ echo line1 > dir/file1.txt
$ cat dir/file1.txt
line1
Запустим создание бэкапа в режиме dry-run, чтобы убедиться, что все будет работать корректно. Во время выполнения команды нужно будет ввести пароль от репозитория, который вы установили ранее.
restic -r s3:s3.storage.selcloud.ru/<название_контейнера> backup -vv --dry-run <директория>
В результате терминал выведет похожее сообщение:
repository e4218f76 opened (version 1)
created new cache in /root/.cache/restic
lock repository
no parent snapshot found, will read all files
load index files
start scan on [/root/dir]
start backup on [/root/dir]
scan finished in 0.243s: 1 files, 6 B
new /root/dir/file1.txt, saved in 0.007s (6 B added)
new /root/dir/, saved in 0.008s (0 B added, 0 B stored, 425 B metadata)
new /root/, saved in 0.008s (0 B added, 0 B stored, 419 B metadata)
Files: 1 new, 0 changed, 0 unmodified
Dirs: 2 new, 0 changed, 0 unmodified
Data Blobs: 1 new
Tree Blobs: 3 new
Would add to the repository: 1.034 KiB (1.304 KiB stored)
processed 1 files, 6 B in 0:00
Теперь можно убрать ключ –dry-run и выполнить первый бэкап:
restic -r s3:s3.storage.selcloud.ru/<название_контейнера> backup <директория>
repository e4218f76 opened (version 1)
no parent snapshot found, will read all files
Files: 1 new, 0 changed, 0 unmodified
Dirs: 2 new, 0 changed, 0 unmodified
Added to the repository: 1.034 KiB (1.304 KiB stored)
processed 1 files, 6 B in 0:00
snapshot a7d06fa4 saved
Просмотреть список бэкапов или снапшотов в терминалогии Restic можно с помощью специальной команды snapshots. А чтобы каждый раз не вводить пароль, можно записать его в файл и использовать ключ -p.
$ echo 'pass' > backup_password
$ restic -r s3:s3.storage.selcloud.ru/<название_контейнера> -p backup_password snapshots
enter password for repository:
repository e4218f76 opened (version 1)
ID Time Host Tags Paths
----------------------------------------------------------------
a7d06fa4 2023-06-14 16:49:09 www /root/dir
----------------------------------------------------------------
1 snapshots
Теперь внесем изменения в директорию, повторим процесс бэкапа и посмотрим, как это будет выглядеть.
$ echo line2 >> dir/file1.txt
$ echo line1 >> dir/file2.txt
$ ls -l dir/
total 8
-rw-r--r-- 1 root root 12 Jun 14 16:52 file1.txt
-rw-r--r-- 1 root root 6 Jun 14 16:52 file2.txt
$ restic -r s3:s3.storage.selcloud.ru/<название_контейнера> -p backup_password backup ~/dir
repository e4218f76 opened (version 1)
using parent snapshot a7d06fa4
Files: 1 new, 1 changed, 0 unmodified
Dirs: 0 new, 2 changed, 0 unmodified
Added to the repository: 1.377 KiB (1.646 KiB stored)
processed 2 files, 18 B in 0:00
snapshot e0f0801e saved
$ restic -r s3:s3.storage.selcloud.ru/restic_backup -p backup_password snapshots
repository e4218f76 opened (version 1)
ID Time Host Tags Paths
----------------------------------------------------------------
a7d06fa4 2023-06-14 16:49:09 www /root/dir
e0f0801e 2023-06-14 16:53:02 www /root/dir
----------------------------------------------------------------
2 snapshots
Супер — после бэкапирования измененной директории появилось новая копия в объектном хранилище.
Восстановление резервной копии
В общем виде восстановление бэкапов с помощью Restic выглядит следующим образом:
restic -r s3:s3.storage.selcloud.ru/<название_контейнера> restore --target <директория_для_восстановления>
Попробуем восстановить копию a7d06fa4 из хранилища restic_backup:
$ restic -r s3:s3.storage.selcloud.ru/restic_backup restore -p backup_password a7d06fa4 --target /tmp/restore-dir
repository e4218f76 opened (version 1)
restoring to /tmp/restore-dir
$ ls -l /tmp/restore-dir/root/dir/
total 4
-rw-r--r-- 1 root root 6 Jun 14 16:32 file1.txt
$ cat /tmp/restore-dir/root/dir/file1.txt
line1
Готово — данные восстановились на момент до внесения изменений.
Политика удаления старых копий
Для удаления старых бэкапов можно использовать команду forget. Более подробно с ней можно ознакомиться в документации.
Остановимся на примере, когда нужно сохранять ежедневные копии за последнюю неделю, еженедельные за последний месяц, ежемесячные за последний год и ежегодные за последние 75 лет. Тогда можно передать аргументы вида:
forget --keep-within-daily 7d --keep-within-weekly 1m --keep-within-monthly 1y --keep-within-yearly 75y
Рассмотрим пример работы с командой forget:
$ restic -r s3:s3.storage.selcloud.ru/restic_backup -p backup_password forget --keep-within-daily 7d --keep-within-weekly 1m --keep-within-monthly 1y --keep-within-yearly 75y
repository e4218f76 opened (version 1)
Applying Policy: keep daily snapshots within 7d, weekly snapshots within 1m, monthly snapshots within 1y, yearly snapshots within 75y
keep 1 snapshots:
ID Time Host Tags Reasons Paths
-----------------------------------------------------------------------------------
e0f0801e 2023-06-14 16:53:02 www daily within 7d /root/dir
weekly within 1m
monthly within 1y
yearly within 75y
-----------------------------------------------------------------------------------
1 snapshots
remove 1 snapshots:
ID Time Host Tags Paths
----------------------------------------------------------------
a7d06fa4 2023-06-14 16:49:09 www /root/dir
----------------------------------------------------------------
1 snapshots
[0:00] 100.00% 1 / 1 files deleted
Автоматизация
Соединив команды для создания и удаления (ротации) бэкапов, можно автоматизировать процесс. Например, поместив в cron следующее задание:
export AWS_ACCESS_KEY_ID=<имя_пользователя_контейнера>
export AWS_SECRET_ACCESS_KEY=<пароль_пользователя_контейнера>
restic -r s3:s3.storage.selcloud.ru/<название_контейнера> -p backup_password backup <директория> 2>&1 | systemd-cat -t restic-cron-backup
restic -r s3:s3.storage.selcloud.ru/<название_контейнера> -p backup_password forget --keep-within-daily 7d --keep-within-weekly 1m --keep-within-monthly 1y --keep-within-yearly 75y 2>&1 | systemd-cat -t restic-cron-backup
Логирование через systemctl-cat позволит при необходимости обратиться к логам бэкапа:
$ journalctl -t restic-cron-backup
Jun 14 17:05:57 www restic-cron-backup[9390]: using parent snapshot 25f3eb23
Jun 14 17:05:57 www restic-cron-backup[9390]: Files: 0 new, 0 changed, 2 unmodified
Jun 14 17:05:57 www restic-cron-backup[9390]: Dirs: 0 new, 0 changed, 2 unmodified
Jun 14 17:05:57 www restic-cron-backup[9390]: Added to the repository: 0 B (0 B stored)
Jun 14 17:05:57 www restic-cron-backup[9390]: processed 2 files, 18 B in 0:00
Jun 14 17:05:57 www restic-cron-backup[9390]: snapshot 5bfd0c72 saved
Jun 14 17:06:10 www restic-cron-backup[9458]: Applying Policy: keep daily snapshots within 7d, weekly snapshots within 1m, monthly snapshots within 1>
Jun 14 17:06:10 www restic-cron-backup[9458]: keep 1 snapshots:
Jun 14 17:06:10 www restic-cron-backup[9458]: ID Time Host Tags Reasons Paths
Jun 14 17:06:10 www restic-cron-backup[9458]: -----------------------------------------------------------------------------------
Jun 14 17:06:10 www restic-cron-backup[9458]: 5bfd0c72 2023-06-14 17:05:56 www daily within 7d /root/dir
Jun 14 17:06:10 www restic-cron-backup[9458]: weekly within 1m
Jun 14 17:06:10 www restic-cron-backup[9458]: monthly within 1y
Jun 14 17:06:10 www restic-cron-backup[9458]: yearly within 75y
Jun 14 17:06:10 www restic-cron-backup[9458]: -----------------------------------------------------------------------------------
Jun 14 17:06:10 www restic-cron-backup[9458]: 1 snapshots
Jun 14 17:06:10 www restic-cron-backup[9458]: remove 2 snapshots:
Jun 14 17:06:10 www restic-cron-backup[9458]: ID Time Host Tags Paths
Jun 14 17:06:10 www restic-cron-backup[9458]: ----------------------------------------------------------------
Jun 14 17:06:10 www restic-cron-backup[9458]: e0f0801e 2023-06-14 16:53:02 www /root/dir
Jun 14 17:06:10 www restic-cron-backup[9458]: 25f3eb23 2023-06-14 17:05:51 www /root/dir
Jun 14 17:06:10 www restic-cron-backup[9458]: ----------------------------------------------------------------
Jun 14 17:06:10 www restic-cron-backup[9458]: 2 snapshots
Jun 14 17:06:10 www restic-cron-backup[9458]: [0:00] 100.00% 2 / 2 files deleted
Заключение
С помощь Restic и объектного хранилища Selectel мы получили удобный и надежный инструмент для работы с резервными копиями, обеспечив необходимую глубину хранения. Использование облачного хранилища Selectel позволяет снизить затраты на настройку и эксплуатацию собственной системы и получить доступ к архивам из любой точки.