В 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=<значение поля Access key из S3-ключа>
$ export AWS_SECRET_KEY=<значение поля Secret key из S3-ключа> 

$ 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/<название контейнера> -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 <id_снапшота> --target <директория_для_восстановления>

Попробуем восстановить копию a7d06fa4 из хранилища restic_backup:

$ restic -r s3:s3.<пул, в котором находится объектное хранилище>.storage.selcloud.ru/<название_контейнера> restore -p backup_password a7d06fa4 --target /tmp/restore-dir
repository e4218f76 opened (version 1)
restoring <Snapshot a7d06fa4 of [/root/dir] at 2023-06-14 16:49:09.447334528 +0000 UTC by root@www> 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/<название_контейнера> -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_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 позволяет снизить затраты на настройку и эксплуатацию собственной системы и получить доступ к архивам из любой точки.

Другие материалы по теме


Комментарии (1)


  1. Ryav
    18.10.2023 18:04

    В принципе, кроме forget ничего нового не узнал — давно пользуюсь утилитой для бэкапа системы. :)

    Стоило бы упомнять, что для освобождения места после forget так же требуется prune.