Одного разу я перейнявся питанням резервного копіювання декількох сайтів, бекапи яких не було куди складати. І тут в голову прийшла чудова ідея використовувати в якості сховища резервних копій 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.