Резервное копирование

Хранение бэкапов - один из распространенных сценариев использования хранилища. Облачное хранилище Selectel можно подружить со многими утилитами для резервного копирования.

Для хранения бэкапов в панели управления в разделе «Облачное хранилище» создайте приватный контейнер (доступ к приватному контейнеру возможен только после авторизации), следуя инструкции.

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

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

После загрузки файла с бэкапом на сервер нужно выполнить распаковку данных:

mkdir backup_files
 # распаковка файлов из архива в папку backup_files
tar xvf backupname_2013-01-26_08h40m.tar.bz2 -C backup_files/
 # восстановление БД (эта операция может затереть текущее состояние базы данных)
bzcat mysql_backupname_ALL_2013-01-26_08h40m.bz2 | mysql

Установка утилиты supload

Supload (GitHub) — утилита, специально созданная, чтобы упростить загрузку файлов в хранилище Selectel. 

Возможности утилиты:

  • загрузка локального файла в хранилище;

  • рекурсивная загрузка всех файлов в указанной папке и подпапках;

  • гарантия загрузки файлов с помощью сверки контрольных сумм;

  • загрузка только изменившихся и новых файлов;

  • настройка авто-удаления файлов в хранилище.

Если у вас есть сайт средних размеров с базой данных MySQL, которую вы хотите регулярно бекапить, то достаточно скачать два специально подготовленных скрипта и указать необходимые настройки. 

 Для установки утилиты выполните команду:

wget https://raw.github.com/selectel/supload/master/supload.sh
mv supload.sh /usr/local/bin/supload
chmod +x /usr/local/bin/supload

Выполнение бэкапа

Для выполнения бэкапа скачайте и настройте скрипт:

wget https://raw.github.com/selectel/storage/master/utils/sbackup.sh
chmod +x sbackup.sh

Откройте скрипт «sbackup.sh» с помощью текстового редактора и поменяйте следующие значения:

  • SS_USER — пользователь для авторизации в хранилище (тот дополнительный пользователь который был создан нами ранее);

  • SS_PWD — пароль для пользователя;

  • SS_CONTAINER — имя контейнера, в который будут загружаться бэкапы;

  • TARGET_DIR — путь, где расположены файлы сайта;

  • BACKUP_DIR — путь на сервере куда временно будут складываться бэкапы;

  • EXCLUDE_LIST — список файлов которые не нужно включать в архив;

  • DB_NAME — имя базы данных MySQL, чтобы бэкапить все имеющиеся базы укажите к качестве значения __ALL__;

  • DB_USER и DB_PWD — пользователь и пароль для подключения к MySQL;

  • EMAIL — email куда будет присылаться отчет о выполнении бекапа (можно указать пустым, чтобы отключить отчет);

  • EMAIL_ONLY_ON_ERROR — если указать yes, то отчет будет отправлен только в случае возникновения проблем/ошибок;

  • DELETE_BACKUPS_AFTER_UPLOAD — если указать yes, то созданные файлы бэкапов будут удалены из временной папки после успешной загрузки в хранилище;

  • STORAGE_EXPIRE — опция позволяет указать сколько дней файл бэкапа должен храниться в хранилище, после чего будет автоматически удален.

Для проверки и выполнения бэкапа запустите скрипт вручную:

./sbackup.sh

Результат выполнения будет выведен в консоль.

Настройте периодичность выполнения бэкапа с помощью cron. Для этого просто переместите скрипт в специальную директорию:

mv sbackup.sh /etc/cron.daily/50_sbackup

После этого cron будет автоматически запускать скрипт архивирования раз в сутки.

Загрузка файла в контейнер

Для загрузки одного локального файла «my.doc» в контейнер «files» хранилища (контейнер должен быть создан заранее) введите команду:

supload -u USERNAME -k USERKEY files my.doc

Можно загружать файлы в конкретную папку внутри контейнера:

supload -u USERNAME -k USERKEY files/docs/ my.doc

При этом перед загрузкой файла вычисляется его контрольная сумма (MD5) и загрузка считается успешной только при совпадении контрольных сумм.

Для загрузки всех файлов из определенной папки нужно использовать опцию -r:

supload -u USERNAME -k USERKEY -r files local/docs/

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

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

Удаление файлов

Хранилище поддерживает автоматическое удаление файлов, «supload» позволяет указать сколько времени нужно хранить файл:

supload -u USERNAME -k USERKEY -d 7d files my.doc

Опция -d указывает после какого времени в минутах (m), часах (h) или днях (d) хранилище автоматически выполнит удаление файла. Эта опция действует также при рекурсивной загрузке файлов. Если файл уже был загружен, то повторный запуск команды не меняет ранее установленный (или вообще не заданный) срок хранения файла.

Допустим ваша система архивирования складывает файлы с бэкапом в папку /var/backups/site/ и контролирует удаление файлов через определенный период времени. Можно настроить периодический запуск «supload» для загрузки всех файлов с ограничением времени хранения, например:

supload -u USERNAME -k USERKEY -d 31d -r backups /var/backups/sites

Тогда каждый новый загруженный файл бэкапа будет храниться в хранилище 31 день, а у ранее загруженных — постепенно будет уменьшаться срок их хранения и они будут автоматически удалены так же через 31 дней с момента их загрузки. Чтобы такая схема правильно работала нужно, чтобы у вашей системы архивирования срок удаления файлов был меньше чем указанный в «supload», иначе старые файлы могут загрузиться заново.

Установка и настройка Duplicity

Duplicity поддерживает различные протоколы для соединения с файловым сервером: SSH/SCP, FTP, HSI, WebDAV, Tahoe-LAFS и Amazon S3, архивирует данные и загружает их на локальный или удаленный файловый сервер, но еще и шифрует их при помощи утилиты GnuPG, обеспечивая тем самым дополнительную защиту.

Программа Duplicity включена в репозитории большинства современных Linux-систем и устанавливается при помощи стандартного менеджера пакетов. Мы рассмотрим пример для Ubuntu:

sudo apt-get install duplicity 

Для работы с облачным хранилищем на клиентской машине должны быть обязательно установлены пакеты python-swiftclient и librsync:

sudo apt-get install python-swiftclient
sudo apt-get install librsync-dev

Теперь нужно установить плагин swiftbackend. Сначала клонируем с launchpad соответствующий репозиторий (для этого на клиентскую машину потребуется также установить систему контроля версий Bazaar — Launchpad использует именно ее):

sudo apt-get install bzr
bzr branch lp:~mhu-s/duplicity/swiftbackend

Затем выполним следующую команду:

cd swiftbackend && sudo python dist/setup.py install

По завершении установки Duplicity будет готова к работе с облачным хранилищем.

Откроем любой текстовый редактор и напишем небольшой скрипт для резервного копирования:

# Авторизационые данные для подключения к хранилищу
export SWIFT_USERNAME="имя пользователя"
export SWIFT_PASSWORD="пароль для входа в хранилище"
export SWIFT_AUTHURL="https://auth.selcdn.ru"

# Выполнение архивирования 
duplicity /путь к папке/на клиентской машине swift://имя контейнера в хранилище

# Очистка авторизационных данных для безопасности
unset SWIFT_USERNAME
unset SWIFT_USERNAME
unset SWIFT_AUTHURL

Сохраним этот файл под именем, например, backup.sh и сделаем его исполняемым:

chmod +x backup.sh

После этого выполним следующую команду:

./backup.sh

Далее GnuPG попросит кодовое слово для доступа к файлам.

После этого начнется резервное копирование. Статистка будет отображена в консоли:

--------------[ Статистика резервного копирования ]--------------
StartTime 1391068911.00 (Thu Jan 30 12:01:51 2014)
EndTime 1391068911.02 (Thu Jan 30 12:01:51 2014)
ElapsedTime 0.02 (0.02 seconds)
SourceFiles 5
SourceFileSize 190210 (186 KB)
NewFiles 5
NewFileSize 190210 (186 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 5
RawDeltaSize 186114 (182 KB)
TotalDestinationSizeChange 185217 (181 KB)
Errors 0
-----------------------------------------------------------------

В указанный контейнер облачного хранилища будут добавлены новые файлы:

duplicity-full-signatures.20140130T073550Z.sigtar.gpg
duplicity-full.20140130T073550Z.manifest.gpg
duplicity-full.20140130T073550Z.vol1.difftar.gpg

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

duplicity swift://имя контейнера /путь/к папке/на локальной/машине

Сохраним этот скрипт под именем restore.sh и сделаем соответствующий файл исполняемым.

При выполнении команды ./restore.sh GnuPG запросит кодовое слово. После ввода кодового слова все файлы из резервной копии будут загружены в указанную директорию на локальной машине.

Установка и первичная настройка rclone

Утилита rclone синхронизирует данные в хранилище и на локальной машине. Её можно использовать и для резервного копирования, и в работе со статическими сайтами.

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

Мы будем описывать особенности работы c rclone на материале ОС Linux. Для установки потребуется скачать необходимый пакет, а далее выполнить:

unzip rclone-current-linux-amd64.zip
cd rclone-v1.36-linux-amd64
sudo cp rclone /usr/sbin/
sudo chown root:root /usr/sbin/rclone
sudo chmod 755 /usr/sbin/rclone
sudo mkdir -p /usr/local/share/man/man1
sudo cp rclone.1 /usr/local/share/man/man1/
sudo mandb

По завершении установки настроим rclone для работы с облачным хранилищем Selectel:

rclone config

На консоли появится такой диалог:

No remotes found - make a new one
n) New remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
n/r/c/s/q>

Выбираем n и нажимаем клавишу Enter. Далее нам нужно будет указать имя подключения к удаленному хранилищу name >. Указываем любое имя (например, Selectel) и переходим к следующему пункту:

name> Selectel
Type of storage to configure.
Choose a number from below, or type in your own value
1 / Amazon Drive
  \ "amazon cloud drive"
2 / Amazon S3 (also Dreamhost, Ceph, Minio)
  \ "s3"
3 / Backblaze B2
  \ "b2"
4 / Dropbox
  \ "dropbox"
5 / Encrypt/Decrypt a remote
  \ "crypt"
6 / Google Cloud Storage (this is not Google Drive)
  \ "google cloud storage"
7 / Google Drive
  \ "drive"
8 / Hubic
  \ "hubic"
9 / Local Disk
  \ "local"
10 / Microsoft OneDrive
  \ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
  \ "swift"
12 / SSH/SFTP Connection
  \ "sftp"
13 / Yandex Disk
  \ "yandex"

Выбираем swift и вводим цифру 11. Нажимаем Enter.

Storage> 11

После этого программа запросит имя пользователя и пароль:

User name to log in.

user> [имя пользователя]
API key or password.
key> [пароль]
Authentication URL for server.
Choose a number from below, or type in your own value
1 / Rackspace US
  \ "https://auth.api.rackspacecloud.com/v1.0"
2 / Rackspace UK
  \ "https://lon.auth.api.rackspacecloud.com/v1.0"
3 / Rackspace v2
  \ "https://identity.api.rackspacecloud.com/v2.0"
4 / Memset Memstore UK
  \ "https://auth.storage.memset.com/v1.0"
5 / Memset Memstore UK v2
  \ "https://auth.storage.memset.com/v2.0"
6 / OVH
  \ "https://auth.cloud.ovh.net/v2.0"

Нашего хранилища в списке нет, поэтому укажем адрес вручную:

auth > https://auth.selcdn.ru/v1.0

Два следующих пункта (tenant и region) являются факультативными, и их можно пропустить. В последнем вопросе диалога нам будет предложено еще раз проверить все настройки:

Remote config
--------------------
[selectel]
user = your_username
key = your_password
auth = https://auth.selcdn.ru/v1.0
tenant =  user 
region = 
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> 

Если всё правильно, выбираем вариант y и нажимаем клавишу Enter.

Синтаксис команд для работы с хранилищем

Просмотр списка контейнеров в хранилище

rclone lsd selectel:

Создание нового контейнера:

rclone mkdir selectel:[имя контейнера]

Просмотр списка файлов в контейнере:

rclone ls selectel:[имя контейнера]

Копирование файлов с локальной машины в хранилище:

rclone copy /home/local/directory

Синхронизация файлов на локальной машине и в хранилище:

rclone sync /home/local/directory selectel:[имя контейнера]

Синхронизация файлов в хранилище с файлами на локальной машине:

rclone selectel:[имя контейнера] sync /home/local/directory

При выполнении операций копирования и синхронизации rclone проверяет все файлы по дате и времени изменения или md5-сумме. Из директории-источника в директорию назначения передаются те файлы, которые были изменены.

Подробное обо всех командах можно прочитать в официальной документации. Также краткую справку можно получить с помощью команды:

rclone --help

Большинство функций rclone — такие же, как у других инструментов для работы с облачными хранилищами. Но есть у него одна уникальная функция, которой нет ни у одного из известных нам инструментов: перенос данных из одного облачного хранилища в другое.

Пример

Рассмотрим следующий практический пример: у нас есть папка с фотографиями на Google Docs, и её содержимое нужно перенести в наше облачное хранилище.

Создаём новое подключение; в списке доступных облачных хранилище выбираем Google Drive. После этого нам будет предложено указать два параметра: client_id и client_secret. В ответ на соответствующие вопросы не ничего не вводим и нажимаем клавишу Enter.

Система задаст следующий вопрос:

Remote config
Use auto config?
* Say Y if not sure
* Say N if you are working on a remote or headless machine or Y didn't work
y) Yes
n) No
y/n>

Выбираем ответ «нет» (n). Rclone сгенерирует ссылку для получения кода:

If your browser doesn't open automatically go to the following link: https://accounts.google.com/o/oauth2/auth?client_id=202264815644.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=ac901aefe97aff8ce65fe593060d0b0c
Log in and authorize rclone for access

Откроем эту ссылку в браузере и дадим rclone разрешение на доступ к файлам.

После этого API Google Drive вернёт код, который нужно будет вставить в ответ на вопрос:

Enter verification code>

Подключение к Google Drive настроено.

Для копирования введите команду:

rclone copy [имя подключения]:[имя директории] [selectel]:[имя контейнера]