Restic
restic — система резервного копирования, предоставляет инструменты для сохранения резервных копий в версионированном репозитории, который может размещаться на внешних серверах и в облачных хранилищах. Данные хранятся в зашифрованном виде. Restic позволяет определить правила для включения и исключения файлов и каталогов в резервную копию.
В данной статье рассмотрен процесс создания резервной копии и восстановления данных в локальном каталоге.
Установка
Установить пакет restic:
# apt-get install restic
Создание репозитория
Репозиторий — место, где хранятся резервные копии.
Локальный каталог
Создать репозиторий /tmp/restic-repo (потребуется задать пароль для репозитория):
$ restic init --repo /tmp/restic-repo
enter password for new repository:
enter password again:
created restic repository cbac5dd448 at /tmp/restic-repo
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
Внешний сервер с доступом по SFTP
Для возможности создания резервных копий с использованием sftp, необходимо настроить доступ на сервер ssh по ключу без пароля (т.к. restic не может подключиться к репозиторию, если сервер запрашивает учетные данные).
Создание репозитория:
$ restic -r sftp:user@host:/tmp/restic-repo init
enter password for new repository:
enter password again:
created restic repository 56843cf637 at sftp:user@host:/tmp/restic-repo2
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
Создание резервной копии
Создать резервную копию каталога ~/docs (потребуется ввести пароль, заданный при создании репозитория):
$ restic -r /tmp/restic-repo backup ~/docs
enter password for repository:
repository cbac5dd4 opened successfully, password is correct
created new cache in /home/user/.cache/restic
no parent snapshot found, will read all files
Files: 3 new, 0 changed, 0 unmodified
Dirs: 3 new, 0 changed, 0 unmodified
Added to the repo: 143.979 KiB
processed 3 files, 141.763 KiB in 0:00
snapshot 44e47cf1 saved
В результате создана резервная копия каталога ~/docs. Созданный снимок идентифицируется последовательностью шестнадцатеричных символов, в данном случае 44e47cf1.
Резервное копирование файла:
$ restic -r /tmp/restic-repo backup ~/test/alt-education-10.0.pdf
Исключить файлы типа .mp3 из резервной копии:
$ restic -r /tmp/restic-repo backup --exclude=*.mp3 ~/docs
Можно указать все файлы, которые необходимо исключить, в файле, и указать этот файл при создании резервной копии. Например:
$ cat excludes.txt
# исключить файлы mp3
*.mp3
# исключить foo/x/y/z/bar foo/x/bar foo/bar
foo/**/bar
$ restic -r /tmp/restic-repo backup --exclude-file=excludes.txt ~/docs
Управление снимками
Список всех снимков, доступных в репозитории:
$ restic -r /tmp/restic-repo snapshots
enter password for repository:
repository cbac5dd4 opened successfully, password is correct
ID Time Host Tags Paths
-----------------------------------------------------------------------------------------------------
44e47cf1 2022-03-30 12:54:02 comp2.example.test /home/user/docs
b56aab49 2022-03-30 13:02:13 comp2.example.test /home/user/docs
df13e70c 2022-03-30 13:09:03 comp2.example.test /home/user/test/alt-education-10.0.pdf
9e0a78eb 2022-03-30 13:11:49 comp2.example.test /home/user/docs
-----------------------------------------------------------------------------------------------------
Сравнение снимков:
$ restic -r /tmp/restic-repo diff 44e47cf1 b56aab49
enter password for repository:
repository cbac5dd4 opened successfully, password is correct
comparing snapshot 44e47cf1 to b56aab49:
+ /home/user/docs/alt-education-10.0-ru-RU.pdf
M /home/user/docs/test.txt
Files: 1 new, 0 removed, 1 changed
Dirs: 0 new, 0 removed
Others: 0 new, 0 removed
Data Blobs: 20 new, 1 removed
Tree Blobs: 4 new, 4 removed
Added: 13.437 MiB
Removed: 2.228 KiB
Удалять снимки можно либо вручную (указав идентификатор снимка), либо с помощью политики, описывающей, какие снимки следует удалить.
Удаление одиночного снимка и данных, на которые ссылались файлы в этом снимке:
$ restic -r /tmp/restic-repo forget df13e70c --prune
enter password for repository:
repository cbac5dd4 opened successfully, password is correct
[0:00] 100.00% 1 / 1 files deleted
1 snapshots have been removed, running prune
loading indexes...
loading all snapshots...
finding data that is still in use for 2 snapshots
[0:00] 100.00% 2 / 2 snapshots
searching used packs...
collecting packs for deletion and repacking
[0:00] 100.00% 8 / 8 packs processed
to repack: 0 blobs / 0 B
this removes 0 blobs / 0 B
to delete: 4 blobs / 2.776 KiB
total prune: 4 blobs / 2.776 KiB
remaining: 31 blobs / 13.579 MiB
unused size after prune: 0 B (0.00% of remaining size)
rebuilding index
[0:00] 100.00% 7 / 7 packs processed
deleting obsolete index files
[0:00] 100.00% 1 / 1 files deleted
removing 1 old packs
[0:00] 100.00% 1 / 1 files deleted
done
Удаление снимков вручную чревато ошибками, поэтому restic позволяет указать политику (один или несколько параметров --keep-*), для которой следует сохранять снимки.
Например, удалить все снимки, кроме трёх последних:
$ restic -r /tmp/restic-repo forget --keep-last 3
enter password for repository:
repository cbac5dd4 opened successfully, password is correct
Applying Policy: keep 3 latest snapshots
keep 3 snapshots:
ID Time Host Tags Reasons Paths
---------------------------------------------------------------------------------------------
b56aab49 2022-03-30 13:02:13 comp2.example.test last snapshot /home/user/docs
fdf45ecf 2022-03-30 15:03:55 comp2.example.test last snapshot /home/user/docs
3e587f18 2022-03-30 15:04:03 comp2.example.test last snapshot /home/user/docs
---------------------------------------------------------------------------------------------
3 snapshots
remove 1 snapshots:
ID Time Host Tags Paths
------------------------------------------------------------------------------
44e47cf1 2022-03-30 12:54:02 comp2.example.test /home/user/docs
------------------------------------------------------------------------------
1 snapshots
[0:00] 100.00% 1 / 1 files deleted
Восстановление данных
Восстановить данные из снимка b56aab49 в /tmp/restore:
$ restic -r /tmp/restic-repo restore b56aab49 --target /tmp/restore
enter password for repository:
repository cbac5dd4 opened successfully, password is correct
restoring <Snapshot b56aab49 of [/home/user/docs] at 2022-03-30 13:02:13.947703656 +0200 EET by user@comp2.example.test> to /tmp/restore
Просмотр данных без восстановления
Резервную копию можно исследовать как обычную файловую систему. Для этого необходимо создать точку монтирования (например, ~/restic) и примонтировать в нее репозиторий:
$ mkdir ~/restic
$ restic -r /tmp/restic-repo mount ~/restic
enter password for repository:
repository cbac5dd4 opened successfully, password is correct
Now serving the repository at /home/user/restic
When finished, quit with Ctrl-c or umount the mountpoint.
# control fusermount public
Репозиторий в файловом менеджере:
Проверка репозитория
Проверка структуры репозитория:
$ restic -r /tmp/restic-repo check
…
load indexes
check all packs
check snapshots, trees and blobs
no errors were found
[0:00] 100.00% 4 / 4 snapshots
Проверка структуры репозитория и целостность файлов в репозитории:
$ restic -r /tmp/restic-repo check --read-data
…
load indexes
check all packs
check snapshots, trees and blobs
[0:00] 100.00% 4 / 4 snapshots
read all data
[0:00] 100.00% 9 / 9 packs
no errors were founds
Rest Server
HTTP сервер, реализующий restic's REST backend API.
У сервера есть возможность работать в append-only режиме: можно только дописывать новые резервные копии в репозиторий. В этом режиме удалить или модифицировать данные в репозитории невозможно.
Пакет для P11 не установится в P10, но прекрасно работает бинарник с гитхаба.
$ rest-server --path /temp/restic-repo/ --no-auth --append-only
На клиентских ПК запускаем через:
restic.exe -r rest:http://IP:8000 --verbose backup ~/docs
RESTIC_PASSWORD и RESTIC_REPOSITORY
Чтобы в каждой команде не указывать путь к репозиторию и пароль, их можно указать в переменных окружения в скрипте, либо прямо в ОС.
export RESTIC_PASSWORD=пароль_без_кавычек
export RESTIC_REPOSITORY=путь_без_кавычек
Если указывать в ОС, то можно сразу удалить команду из истории bash:
export RESTIC_PASSWORD=пароль_без_кавычек RESTIC_REPOSITORY=путь_без_кавычек;history -d $(history 1)
На Windows вместо export использовать set.
rest-server не принимает путь из переменной, но принимает пароль.