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

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

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

Требования

  • Компьютер на UNIX. Клиент Restic доступен для Mac, Linux и Windows, но команды в данном мануале подойдут только системам MacOS и Linux.
  • 1 Гб RAM минимум.
  • Данные о сервисе хранения объектов: Access Key и Secret Key, URL сервера, имя корзины.

Установка клиента Restic

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

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

Для 64-битной системы Linux нужен файл, имя которого заканчивается на _linux_amd64.bz2.

Для MacOS найдите файл, имя которого заканчивается на _darwin_amd64.bz2.

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

Затем в сеансе терминала на компьютере, на котором вы настраиваете бэкап (если это удаленный компьютер, вам может потребоваться сначала войти в систему через SSH), убедитесь, что вы находитесь в своем домашнем каталоге, а затем загрузите файл с помощью curl:

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

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

Переменные среды – это биты информации, которые определяются в оболочке и передаются вместе с запускаемыми программами. Например, каждая программа, запущенная в командной строке, может видеть переменную $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.my-object-storage.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.my-object-storage.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 сравнивает пакеты и выполняет дедупликацию данных при резервном копировании. Это означает, что первая резервная копия будет полной копией всех файлов, а последующие операции бэкапа будут затрагивать только новые файлы и изменения. Кроме того, программа будет искать дубликаты данных и – в случае обнаружения – не будет копировать их на бэкэнд, что экономит место.

Для работы создайте простой текстовый файл в своем домашнем каталоге:

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

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

Столбец 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

Вы должны увидеть восстановленный каталог. Откройте его и просмотрите его содержимое:

cd 8host
ls
facts.txt  restic_0.7.3_linux_amd64

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

cat facts.txt

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

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

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

Restic предлагает команду forget, чтобы поддерживать текущий архив снапшотов. Вы можете использовать restic forget —prune для установки политики резервного копирования (это позволяет указать, сколько резервных копий нужно хранить за день, за час, за неделю и т. д.). Резервные копии, не соответствующие политике, будут удалены из репозитория.

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

crontab -e

Возможно, вам будет предложено выбрать текстовый редактор. Выберите любой редактор и продолжайте работу, нажав Enter. Таблица 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, которую ранее вы использовали для загрузки ключей и паролей в среду оболочки. Это имеет тот же эффект в crontab: последующие команды в этой строке будут иметь доступ к этой информации.

Фрагмент «/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 ежедневных снапшотов. Существуют также другие опции.

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

Заключение

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

Здесь вы ознакомились с базовыми функциями Restic. Чтобы узнать о Restic больше, читайте документацию проекта или посетите его сайт.

Tags: , , , , ,