Резервное копирование данных в хранилище объектов с помощью Restic

Restic – безопасный и эффективный клиент резервного копирования, написанный на языке Go. Он может копировать локальные файлы в несколько разных репозиториев – в локальный каталог, на SFTP-сервер или S3-совместимый сервис хранения объектов.

В этом мануале вы узнаете, как установить Restic и инициализировать репозиторий на сервисе хранения объектов. Затем вы научитесь создавать резервные копии некоторых файлов в репозитории и автоматизировать копирование.

Требования

Для работы вам понадобится машина на UNIX и несколько файлов, резервные копии которых вы  хотите создать. Restic поддерживает Mac, Linux и Windows, но перечисленные в мануале команды подойдут только системам MacOS и Linux.

Restic требуется довольно большой объем RAM. На машине должен быть минимум 1 Гб доступной памяти.

Также нужны:

  • Access Key
  • Secret Key
  • URL сервера
  • Имя корзины

Установка клиента резервного копирования Restic

Клиент Restic доступен как предварительно скомпилированный исполняемый файл для многих платформ. Это означает, что вы можете просто загрузить один файл и запустить его без менеджера пакетов или зависимостей.

Чтобы найти нужный для загрузки файл, сначала используйте веб-браузер и откройте страницу Restic на GitHub. В разделе Downloads вы найдете список файлов.

Файл для 64-битной системы Linux (наиболее распространенной серверной среды) заканчивается на _linux_amd64.bz2.

MacOS использует файл, название которого заканчивается на _darwin_amd64.bz2.

Щелкните правой кнопкой мыши по нужному файлу, затем выберите Copy Link Address (формулировка может немного отличаться в зависимости от браузера), чтобы скопировать URL файла в буфер обмена.

На машине, которой нужно резервное копирование, перейдите в домашний каталог и загрузите файл:

cd ~
curl -LO https://github.com/restic/restic/releases/download/v0.7.3/restic_0.7.3_linux_amd64.bz

Распакуйте полученный архив:

bunzip2 restic*

Затем скопируйте файл в /usr/local/bin и обновите права на него, чтобы сделать его исполняемым. Для этого нужно использовать sudo, так как обычный пользователь не имеет права на запись в /usr/local/bin:

sudo cp restic* /usr/local/bin/restic
sudo chmod a+x /usr/local/bin/restic

Чтобы убедиться, что установка прошла успешно, запустите команду restic:

restic

На экране появится короткая справка. Если это так, двоичный файл restic был установлен правильно. Теперь нужно создать конфигурационный файл для Restic и инициализировать репозиторий хранилища объектов.

Создание конфигурационного файла

Клиент Restic должен знать access key, secret key, сведения о соединении с хранилищем объектов и пароль репозитория, чтобы инициализировать свой репозиторий. Чтобы сделать эту информацию доступной для Restic, используйте переменные среды.

Переменные среды – это фрагменты информации в оболочке, которые передаются вместе с запускаемыми вами программами. Например, каждая программа, запущенная в командной строке, может видеть переменную среды $PWD, которая содержит путь к текущему каталогу.

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

Откройте файл:

nano ~/.restic-env

Команда откроет пустой файл в текстовом редакторе. Конфигурационный файл будет состоять из четырех команд export. Они определяют переменные среды и делают их доступными для любых программ, которые вы запускаете в дальнейшем:

export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export RESTIC_REPOSITORY="s3:server-url/bucket-name"
export RESTIC_PASSWORD="a-strong-password"

Access Key и Secret Key предоставляет сервис хранения объектов. Вы можете создать уникальный набор ключей только для Restic, чтобы в случае потери или взлома ключей можно было быстро восстановить доступ.

В качестве RESTIC_REPOSITORY будет использоваться условное значение s3:nyc3.examle.com/example-bucket. Если вам нужно подключиться к серверу по нестандартному порту или через незащищенный HTTP, добавьте эту информацию в URL-адрес:

s3:http://example-server:3000/example-bucket

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

Здесь нужно указать надежный пароль и скопировать его в безопасное место. Одним из способов генерации надежного случайного пароля является команда openssl:

openssl rand -base64 24
j8CGOSdz8ibUYK137wtdiD0SJiNroGUp

Эта команда выводит 24-значную случайную строку, которую можно скопировать и вставить в конфигурационный файл.

Теперь все переменные содержат необходимые данные, сохраните и закройте файл.

Инициализация репозитория

Чтобы загрузить конфигурацию в среду оболочки, запустите команду source:

source ~/.restic-env

Убедитесь, что все работает, запросив одну из переменных:

echo $RESTIC_REPOSITORY

На экране должен появиться URL репозитория. Теперь можно инициализировать репозиторий с помощью команды restic:

restic init
created restic backend 57f73c1afc at s3:nyc3.example.com/example-bucket
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.

Теперь репозиторий готов к хранению данных резервного копирования.

Резервное копирование каталога

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

Прежде чем создать копию, создайте простой текстовый файл в своем домашнем каталоге:

echo "sharks have no organs for producing sound" >> ~/facts.txt

Это создаст простой файл facts.txt для тестового резервного копирования. Теперь скопируйте его вместе с остальным содержимым домашнего каталога:

restic backup ~
scan [/home/8host]
scanned 4 directories, 14 files in 0:00
[0:04] 100.00%  2.558 MiB/s  10.230 MiB / 10.230 MiB  18 / 18 items  0 errors  ETA 0:00
duration: 0:04, 2.16MiB/s
snapshot 427696a3 saved

Работа Restic займет некоторое время. Вы увидите обновления текущего состояния, а затем – идентификатор нового снапшота (выделено красным).

Примечание: Если вы хотите создать резервную копию другого каталога, замените ~ в команде на путь к этому каталогу. Возможно, вам придется использовать sudo, если целевой каталог не принадлежит текущему пользователю. Используя sudo для резервного копирования, не забудьте снова использовать эту команду при восстановлении снапшота, иначе конфликт прав вызовет ошибку.

Список доступных снапшотов

Чтобы просмотреть список доступных снапшотов в репозитории, используйте подкоманду snapshots:

restic snapshots
ID        Date                 Host         Tags        Directory
----------------------------------------------------------------------
427696a3  2017-10-23 16:37:17  restic-test              /home/8host

Вы увидите ID снапшота, который получили в первой резервной копии, метку времени создания снапшота, имя хоста, теги и имя скопированного каталога.

Столбец Tags пуст, потому что в этом примере он не был использован. Вы можете добавить теги к снапшоту с помощью флага -tag, за которым следует имя тега. Вы можете указать несколько тегов, добавив несколько флагов –tag.

Теги нужны для быстрой фильтрации снапшотов при настройке политик хранения или для поиска конкретного снапшота вручную.

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

Восстановление снапшотов

Теперь попробуйте восстановить весь список снапшотов во временный каталог, чтобы убедиться, что все работает правильно.

Используйте ID снапшота и отправьте восстановленные файлы в новый каталог /tmp/restore:

restic restore 427696a3 --target /tmp/restore
restoring <Snapshot 427696a3 of [/home/8host] at 2017-10-23 16:37:17.573706791 +0000 UTC by 8host@restic-test> to /tmp/restore

Перейдите в этот каталог и просмотрите его содержимое:

cd /tmp/restore
ls

Вы должны увидеть скопированный каталог. В этом примере это домашний каталог пользователя 8host. Войдите в восстановленный каталог и просмотрите файлы:

cd 8host
ls
facts.txt  restic_0.7.3_linux_amd64

В этом каталоге находится файл facts.txt, а также бинарный файл restic. Выведите содержимое файла facts.txt:

cat facts.txt

Вы должны увидеть содержимое файла.

Примечание: Если вы не хотите восстанавливать все файлы из этого снапшота, используйте опции —include и —exclude, чтобы включить или исключить из процесса отдельные файлы. Больше информации вы найдете по ссылке.

Автоматизация резервного копирования

Restic предоставляет команду forget, которая поддерживает архив снапшотов. Используйте команду:

restic forget --prune

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

Сервис cron будет запускать ежедневное резервное копирование каждый час. Откройте crontab:

crontab -e

Возможно, вам будет предложено выбрать текстовый редактор. Выберите редактор и нажмите ENTER. Откроется crontab по умолчанию текущего пользователя. Он может содержать некоторые комментарии, объясняющие синтаксис crontab. В конце файла добавьте новую строку:

. . .
42 * * * * . /home/8host/.restic-env; /usr/local/bin/restic backup -q /home/8host; /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7

Рассмотрим эту команду подробнее. 42 * * * * определяет, когда cron должен выполнить задачу. В этом случае он будет запускать задачу в 42-ю минуту каждого часа, дня, месяца и дня недели. Дополнительную информацию об этом синтаксисе вы найдете в мануале Автоматизация задач с помощью Cron.

Фрагмент «/home/8host/.restic-env;» эквивалентен команде source ~/.restic-env, которая использовалась ранее для загрузки ключей и паролей в среду оболочки. Этот фрагмен имеет тот же эффект: последующие команды в этой строке будут иметь доступ к этой информации.

Фрагмент «/usr/local/bin/restic backup -q /home/8host;» — это команда для запуска резервного копирования Restic. В ней указан полный путь к бинарному файлу restic, поскольку сервис cron не читает команды в /usr/local/bin автоматически. Аналогично, нужно явно указать путь к домашней папке /home/8host вместо символа ~. При написании команды для cron лучше быть максимально ясными. Флаг -q используется для подавления вывода состояния Restic, поскольку никто не будет его читать.

Фрагмент «/usr/local/bin/restic forget -q —prune —keep-hourly 24 —keep-daily 7» удаляет старые снапшоты. В данном случае репозиторий будет хранить 24 ежечасных снапшота и 7 ежедневных снапшотов.

Когда команда будет соответствовать вашим потребностям, сохраните и закройте файл. Через пару часов проверьте наличие новых снапшотов с помощью команды restic snapshots.

В этом мануале описаны только основные функции и возможности Restic. Чтобы узнать больше о Restic, ознакомьтесь с официальной документацией или веб-сайтом проекта.

Tags: , ,