Записки системного администратора

Ещё один блог о системном администрировании, операционных системах, СУБД, сетях, костылях-велосипедах и пр.

CentOS 7: Подключение Google Drive или бэкап для бедных

Однажды я озадачился вопросом резервного копирования нескольких сайтов, бэкапы которых некуда было складывать. И тут в голову пришла прекрасная идея использовать в качестве хранилища резервных копий GoogleDrive. По запросу "centos 7 google drive" в поисковиках выводится большое количество статей по его подключению. В этих статьях в основном фигурируют два проекта - google-drive-ocamlfuse (ссылка на github https://github.com/astrada/google-drive-ocamlfuse) и gdrive (ссылка на github https://github.com/prasmussen/gdrive). Установка gdrive на CentOS 7 для работы с гугл-диском мне показалась намного проще. Об его настройке я и напишу в этой заметке. Также оставлю здесь пример bash-скрипта для создания резервной копии с блэк джеком и ш... шифрованием, копированием на Google Drive, и отправкой оповещения на e-mail.

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

# wget -O drive https://drive.google.com/uc?id=0B3X9GlR6EmbnMHBMVWtKaEZXdDg  
# mv drive /usr/sbin/drive  
# chmod +x /usr/sbin/drive

Всё, gdrive установлен. Ну очень просто)

Теперь запустим drive для запуска процесса авторизации.

# drive

Появится следующее сообщение:

Go to the following link in your browser:
https://accounts.google.com/o/oauth2/authclient_id=367116221053-7n0vf5akeru7on6o2fjdfsadoe99eg.apps.googleusercontent.com&redirect_uri=ur%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com2Fauth%2Fdrive&state=state

Enter verification code: 

Необходимо скопировать и открыть эту ссылку в браузере. После авторизации появится следующая страница:

Жмем кнопку "Разрешить", после чего откроется страница с нашим кодом для проверки:

Копипастим этот код в консоль и подтверждаем:

Enter verification code: 5/8r1pjcEwaRzIpF88QdA0CTwV0lacGXAE6x8czOFK6k9

Все gdrive настроен.

Проверим его работу. Создадим простой текстовый файл и скопируем его на гугл-диск:

# echo test > test.txt
# drive upload --file test.txt 

где

  • --file test.txt - файл, который нужно скопировать.

После выполнения команды drive upload в консоль выводится информация о загруженном файле.

Id: 0B4KhH190NxVwZ0VQRzlFbXhkVHM
Title: test.txt
Size: 5.0 B
Created: 2016-08-26 12:58:04
Modified: 2016-08-26 12:58:04
Owner: Test Account
Md5sum: d8e8fca2dc0f896fd7cb4cb0031ba249
Shared: False
Parents: 0AIKhH190NxVwUk9PVA
MIME Type: text/plain; charset=utf-8
Uploaded 'test.txt' at 5.0 B/s, total 5.0 B

Для просмотра содержимого диска используется команда drive list:

# drive list
Id                             Title      Size    Created               
0B4KhH190NxVwZ0VQRzlFbXhkVHM   test.txt   5.0 B   2016-08-26 12:58:04   

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

Для удаления файла необходимо использовать следующую команду:

# drive delete --id 0B4KhH190NxVwZ0VQRzlFbXhkVHM
Removed file 'test.txt'

где

  • 0B4KhH190NxVwZ0VQRzlFbXhkVHM - Id файла, который нужно удалить.

Скрипт резервного копирования

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

  • mysqldump всех баз данных web-сервера
  • создаёт tar.gz архив необходимых директорий (в этот же архив включены и дамп-файлы баз)
  • зашифровывает полученный архив с помощью OpenSSL
  • отправляет зашифрованый архив на Google Drive (после завершения удаляет зашифрованный архив из локальной директории)
  • отправляет отчет о результате на e-mail
  • на всякий случай, храним последние копии за 7 дней локально на сервере для быстрого разворачивания.

Листинг:

#!/bin/bash

DATE=`date +%Y-%m-%d`
DIR=/backup
LIST=/tmp/db.list
MYSQLPWD=r00tpa55w0r9
ARCHNAME=backup_sites
HOSTNAME=Web-server-57
EMAIL=cojuhar.vadim@gmail.com

## Удаляем архивы старше 7 дней из локальной директории для бэкапов
find $DIR -mtime +7 -delete

## Создаем дамп-файлы всех баз нашего сервера
echo 'show databases;' | mysql -u root -p$MYSQLPWD | grep -v -e Database -e information_schema -e performance_schema -e mysql > $LIST 
for DBNAME in `cat $LIST`
do
      mysqldump -u root -p$MYSQLPWD $DBNAME > $DIR/$DBNAME-$DATE.sql
done

## Создаем tar-архив необходимых директорий. В него же включаем дамп-файлы наших баз
tar -czf $DIR/$ARCHNAME-$DATE.tar.gz \
/var/sites \
/root \
/etc \
/home \
$DIR/*-$DATE.sql

## Зашифруем созданный архив
openssl enc -aes-256-cbc -salt -a -in "$DIR/$ARCHNAME-$DATE.tar.gz" -out "$DIR/$ARCHNAME-$DATE.tar.gz.enc" -pass 'pass:veRyStr0ngpa55w0r9'

## Загрузим зашифрованный архив на Google Drive
drive upload --file $DIR/$ARCHNAME-$DATE.tar.gz.enc

## Удаляем зашифрованный архив из локальной директории для бэкапов
rm -f $DIR/$ARCHNAME-$DATE.tar.gz.enc

## Проверим наличие резервной копии на Google Drive и отправим отчет о результате на e-mail
RESULT="$(drive list | awk '{print $2}' | grep -ic $ARCHNAME-$DATE.tar.gz.enc)"
if [ "$RESULT" != 1 ]; then
        echo "Oops! Something went wrong! There is no backup :( " | mutt -s "$HOSTNAME: Backup ERROR at $DATE!" $EMAIL
else
        echo "Creating and copying the backup file of $HOSTNAME at $DATE completed successfully." | mutt -s "$HOSTNAME: Successfull backup at $DATE" $EMAIL
fi

Как я писал выше, перед отправкой на Google Drive архив резервной копии шифруется с помощью openssl. Для расшифровки архива необходимо выполнить:

$ openssl enc -aes-256-cbc -d -a -in "archive-name.tar.gz.enc" -out "archive-name.tar.gz" -pass 'pass:veRyStr0ngpa55w0r9'

где

  • archive-name.tar.gz.enc - зашифрованный архив
  • archive-name.tar.gz - архив, который мы хотим получить
  • veRyStr0ngpa55w0r9 - пароль, который использовался для шифрования

А о том, как настроить mutt для отправки писем можете прочитать в этой статье - CentOS 7: Настройка mutt для отправки отчетов.

Теперь осталось создать назначенное задание в cron и ждать бэкапов на свой Google Drive.

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

Отличная статья, как я понял - перевод. Но не полный. Не сказано что делать с листингом этим. Как я понял из оригинала, нужно сделать баш скрипт dokuwiki-backup.sh и поместить его в эту директорию /usr/sbin/ и уже на это файл настраивать cron Для меня так же важно было помещать архивы не в корень, а в конкретную папку. В комментариях к англоязычной статье написали вариант - это в скрипт идет

drive upload --file my_backup-$(date +%F).tar.gz -p 0B2MhubpEBeV6fHrPU0t1Z1Y5Vnc

где 0B2MhubpEBeV6fHrPU0t1Z1Y5Vnc идентификатор папки из ссылки

Ответить Отменить ответ

Да, для того чтобы скинуть файл в определенную папку на Google Drive необходимо воспользоваться ключом -p:

vadim@vadim-pc:~$ drive --help
.......
-p, --parent Parent Id of the folder

Сам скрипт резервного копирования можно поместить в любую директорию. Главное сделать его исполняемым и правильно указать путь до этого скрипта в cron'е.

P.S. Оригинальную статью действительно нашел на каком-то англоязычном ресурсе. Идею взял оттуда и немного поправил для своих нужд. Откуда взял уже и не вспомню))

Ответить Отменить ответ

Каким образом можно скачать папку из google drive?

Ответить Отменить ответ

По всей видимости скачивать папки он не умеет. Проверял на версии gdrive v1.8.0. Если найдете как, напишите здесь, пожалуйста.

Ответить Отменить ответ

$ gdrive help sync download или $ gdrive help sync upload

Ответить Отменить ответ

HTML Preview:

Коротко о себе:

Привет! Меня зовут Вадим. В этом блоге я пишу об интересующих меня вещах, о проблемах, с которыми сталкиваюсь во время работы, и о путях их решения.

Связаться со мной можно, написав письмо на адрес vadim@adminbook.click