Расскажем нашим дорогим читателям историю о том, если у вас катастрофически не хватает денежных знаков, как можно бесплатно делать бэкап вашего любимого сайта на ресурсы Гугл Диска, любезно предоставленные компанией Google. Всем уже давно известно, что Гугл предоставляет всем желающим бесплатно 15 гигабайт дискового пространства на своих серверах для хранения личной информации граждан разных стран. Если у вас небольшой сайт, то этого объема вполне достаточно для хранения последних 6-и дневных копий, 4-х недельных и одного месячной копии вашего сайта с базой данных.
Если вам этого мало, то можно докупить еще 75 гигабайт пространства всего за 20$ за год у гугла :)
Все это добро будем ставить на Linux подобную машину с дистрибутивом: Debian, Ubuntu или CentOS.
Считаем, что вы уже имеете учетную запись в ГуглДиск (Google® Create your Google Account).
Настройте API Google Диска для своей учетной записи Google. Для этого: Перейдите на веб-сайт Google API Manager. В левом меню навигации выберите «Library». В разделе «API Google Apps» выберите «Drive API». Нажмите «Create Project», а затем нажмите «Create». Появится новое меню.
(Если новое меню не отображается, сделайте следующее: Нажмите «Credentials» в левой панели навигации. Нажмите «Create»)
В это новое меню ведите новое имя проекта и нажмите «Create» и нажмите «Enable».
Осталось создать учетные данные учетной записи для резервного копирования, делаем следующие действия: В боковой панели навигации нажимаем «Credentials». Давим «Create credentials». (Если вы уже ранее создали учетные данные учетной записи Google Диска, нажмите «Create credentials», а затем нажмите «Help me choose») Видим: «From the Which API are you using? !В меню выберите «Google Drive API». -> «From the Where will you be calling the API from?» выберите «Web Server». -> «From the What data will you be accessing?» выберите «User Data». -> Нажмите «What credentials do I need?.». -> В «Create an OAuth 2.0 client ID» в текстовое поле введите нужное имя. -> В текстовом поле «Authorized redirect URI» введите «https: // имя хоста: 2087 / googledriveauth / callback», где имя хоста представляет имя хоста вашего сервера. Затем нажмите «Create», интерфейс отобразит ваш новый идентификатор клиента (client ID) и секрет клиента (client secret), и завершим нажатием «Done».
Загрузите gdrive к себе на сервер. Для этого, выберите нужный вам linux-дистрибутив отсюда https://github.com/prasmussen/gdrive (скопируйте одну из этих, приведенных ниже ссылок). И выполните следующие команды в вашей консоли.
# Загружаем gdrive к себе на сервер
$ wget -O drive https://drive.google.com/uc?id=0B3X9GlR6EmbnMHBMVWtKaEZXdDg
# Перемещаем
$ mv drive /usr/sbin/drive
# Даем права на исполнение
$ chmod +x /usr/sbin/drive
# Запустим команду
$ drive
Откройте предложенную Ссылку в браузере и разрешите приложению Гугл использовать ваши данные в соответствии с пользовательским соглашением. А предложенный код вставьте в консоль («Enter verification code:»
). Проверим его работу:
# Загружаем на ГуглДиск какой-нибудь имеющийся файл
$ drive upload --file namefile
После её выполнения в консоли вы увидите информацию о загруженном файле «namefile».
# Просмотреть весь набор действий команды drive
$ drive -
h
# Например «
drive
list» выводит список последних 30 загруженных ваших файлов,
# опция -
m изменяет это ограничение
J
$
drive
list –
m 1000
(Между прочим, если вы хотите управлять несколькими дисками, вы можете использовать глобальный флаг --config. Пример:
$
drive
–
c
/usr/sbin/drive2
Вам будет предложено ввести новый код подтверждения, если папка не существует.)
Осталось только создать файл баш-скрипта. Дайте ему права на исполнения (chmod +x) и запишите задание в cron:
10 2 * * * /root/client-user/cron-backup/backupGdrive_namefile
>> /root/client-user/cron-backup/backupnamefile
.log 2>&1
Вот сам скрипт файла namefile
:
#!/usr/bin/env bash
#
# Connection settings and date
DATE=`date +%Y-%m-%d`
YEAR=`date +%Y`
MONTH=`date +%m`
MONTH7=`date --date '-7 day' +%m`
MONTH30=`date --date '-30 day' +%m`
DMONTH=$(date +%d)
DAY=`date +%d`
DAY7=`date --date '-7 day' +%d`
DAY30=`date --date '-30 day' +%d`
WDAY=$(date +%u)
HOURS=`date +%H`
MINUTES=`date +%M`
DATEARCH="$MONTH$DAY.$HOURS$MINUTES"
DATEARCH7="$MONTH$DAY7.$HOURS$MINUTES"
DATEARCH30="$MONTH$DAY30.$HOURS$MINUTES"
DATEARCHDEL7="$MONTH7$DAY7"
DATEARCHDEL30="$MONTH30$DAY30"
DIR="/root/client-user/cron-backup/backups"
DIR7="/root/client-user/cron-backup/backupsW"
DIR30="/root/client-user/cron-backup/backupsM"
PROJECT_PATH="/root/client-user/cron-backup"
LIST="/root/client-user/cron-backup/tmp/databases.list"
#
DBUSER="root"
MYSQLPWD="MyPassMSQL"
MYPASSSCRIPT="MyPassScript"
#
ARCHNAME1=backupSites
ARCHNAME2=backupSMysql
ARCHNAME3=backupSModxdir
ARCHNAME4=backupSDrupldir
ARCHNAME=backupSStockraw
#
HOSTNAME="128.179.211.181"
EMAIL=visor@mail.ru
#
# cd $PROJECT_PATH
#
## Удаляем архивы старше 7 дней из локальной директории для бэкапов backups
find $DIR -mtime +7 -delete
## Удаляем архивы старше 29 дней из локальной директории для бэкапов backupsW
find $DIR7 -mtime +29 -delete
## Удаляем архивы старше 33 дней из локальной директории для бэкапов backupsM
find $DIR30 -mtime +33 -delete
#
## Удаляем базы из локальной директории для бэкапов
find $DIR/*.backup.sql -mmin +10 -delete
#
## Создаем дамп-файлы всех баз нашего сервера
echo 'show databases;' | mysql -u $DBUSER -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/$YEAR-$MONTH-$DAY.$HOURS-$MINUTES.$DBNAME.backup.sql
done
## Создаем tar-архив необходимых директорий. В него же включаем дамп-файлы наших баз
tar -czf $DIR/$DATEARCH.$ARCHNAME.tar.gz \
/home/proarend/public_html/stockraw
/home/user/public_html/propendakir
$DIR/$DATEARCH.*.backup.sql
# /home/user/public_html
# /home \
# /var/sites \
# /root \
# /etc \
#
## Зашифруем созданный архив
openssl enc -aes-256-cbc -salt -a -in "$DIR/$DATEARCH.$ARCHNAME.tar.gz" -out "$DIR/$DATEARCH.$ARCHNAME.tar.gz.enc" -pass 'pass:$MYPASSSCRIPT'
#
## Удаляем зашифрованный архив старше 7 дней на Google Drive
DELOLD7="`/usr/sbin/drive list | grep -i $DATEARCHDEL7.*.$ARCHNAME.tar.gz.enc | awk '{print $1}'`"
if [ "$DELOLD7" != 1 ];
then
echo "Oops! Nothing to delete more 7 day!"
else
echo " the backup file more 7 day stockraw of $DATEARCH7.$ARCHNAME.tar.gz.enc deleting --id $DELOLD7."
/usr/sbin/drive delete --id $DELOLD7
for IDFNAME in $DELOLD7
do
echo " delete the $IDFNAME file"
/usr/sbin/drive delete --id $IDFNAME
done
fi
#
echo "$DIR/$DATEARCH.$ARCHNAME.tar.gz.enc"
## Загрузим зашифрованный архив на Google Drive
/usr/sbin/drive upload --parent 1xnE_vyAlF-2J1Hw9s-m0JLwWg95KEjsZ --file $DIR/$DATEARCH.$ARCHNAME.tar.gz.enc
echo " archive day to GoogleDrive loaded"
#
## Удаляем зашифрованный архив из локальной директории для бэкапов
# rm -f $DIR/$DATEARCH.$ARCHNAME.tar.gz.enc
#
## Переименовываем зашифрованный архив в локальной директории для неделных бэкапов
mv $DIR/$DATEARCH.$ARCHNAME.tar.gz.enc $DIR/$DATEARCH.$ARCHNAME-w.tar.gz.enc
## Проверяем дату недельной архивации, удаляем и загружаем новый если нужно
if [ "$WDAY" -ne 7 ];
then
# /usr/sbin/drive delete --id $DELOLD7
echo "Oops! tooday is not Sunday (day of week) for archive !"
else
## Удаляем зашифрованный старый недельный архив на Google Drive
echo "OK! delete Week 7 day archive!"
DELOLDw7="`/usr/sbin/drive list | grep -i $DATEARCHDEL7.*.$ARCHNAME-w.tar.gz.enc | awk '{print $1}'`"
echo $DELOLDw7
#
if [ "$DELOLDw7" != 1 ];
then
echo "Oops! Nothing to delete Week 7 day!"
else
echo " the backup file week 7 day stockraw of $DATEARCH7.$ARCHNAME-w.tar.gz.enc deleting --id $DELOLDw7."
for IDFNAME in $DELOLDw7
do
echo " delete the $IDFNAME file"
/usr/sbin/drive delete --id $IDFNAME
done
fi
cp $DIR/$DATEARCH.$ARCHNAME-w.tar.gz.enc $DIR7/
## Загрузим в недельный архив на Google Drive
/usr/sbin/drive upload --parent 17LmQB7C7EWcnD233OOlVlPNtubhLvym4 --file $DIR/$DATEARCH.$ARCHNAME-w.tar.gz.enc
echo " archive week to GoogleDrive loaded"
fi
#
#
## Переименовываем зашифрованный архив в локальной директории для неделных бэкапов
mv $DIR/$DATEARCH.$ARCHNAME-w.tar.gz.enc $DIR/$DATEARCH.$ARCHNAME-m.tar.gz.enc
## Проверяем дату месячной архивации, удаляем и загружаем новый если нужно
if [ "$DMONTH" -ne 1 ];
then
echo "Oops! tooday is not first day of mounth for archive !"
else
## Удаляем зашифрованный старый месячный архив на Google Drive
echo "OK! delete Mounth 30 day archive!"
DELOLDm30="`drive list | grep -i $DATEARCHDEL30.*.$ARCHNAME-m.tar.gz.enc | awk '{print $1}'`"
if [ "$DELOLDm30" != 1 ];
then
echo "Oops! Nothing to delete mounth 30 day!"
else
echo " the backup file mounth 30 day stockraw of $DATEARCH7.$ARCHNAME-w.tar.gz.enc deleting --id $DELOLDm30."
for IDFNAME in $DELOLDm30
do
echo " delete the $IDFNAME file"
/usr/sbin/drive delete --id $IDFNAME
done
fi
cp $DIR/$DATEARCH.$ARCHNAME-m.tar.gz.enc $DIR30/
## Загрузим в месячный архив на Google Drive
/usr/sbin/drive upload --parent 1M5BByUUv2YvJ6doV7DV3SIvYOc3brkoj --file $DIR/$DATEARCH.$ARCHNAME-m.tar.gz.enc
echo " archive mounth to GoogleDrive loaded"
fi
#
## Удаляем зашифрованный архив из локальной директории для бэкапов
rm -f $DIR/$DATEARCH.$ARCHNAME-m.tar.gz.enc
#
## Проверим наличие резервной копии на Google Drive и отправим отчет о результате на e-mail
RESULT="`/usr/sbin/drive list | awk '{print $2}' | grep -ic $DATEARCH.$ARCHNAME.tar.gz.enc`"
if [ "$RESULT" != 1 ];
then
echo "Oops! Something went wrong! There is no backup stockraw :( " | mutt -s "$HOSTNAME: Backup ERROR at $DATE!" $EMAIL
else
echo "Creating and copying the backup file stockraw of $HOSTNAME at $DATE completed successfully." | mutt -s "$HOSTNAME: Successfull backup at $DATE" $EMAIL
fi
#
# Содзать папку:
# drive folder -t backupSStockraw
#
# просмотреть id всех папок:
# drive list | grep -i "0.0 B"
#
# Для расшифровки архива необходимо выполнить:
# openssl enc -aes-256-cbc -d -a -in "$DIR/$DATEARCH.$ARCHNAME.tar.gz.enc" -out "$DIR/$DATEARCH.$ARCHNAME.tar.gz" -pass 'pass:$MYPASSSCRIPT'
#
Скрипт собирает дамп базы данных и выбранные директории в tar
архив, удаляет старые архивы, загружает в ГуглДиск дневные, недельные и месячный архив и сообщает об успешной работе скрипта на почту администратора.
Про использованный здесь почтовый клиент mutt
. Установка ($ yum install mutt).
Отредактируйте подсебя файл конфигурации ~/.muttrc
.
# Запускаем
$ mutt
# и проверяем
$ echo "This is test message!" | mutt -s "Test message" admin@example.com
Использованные при написании статьи материалы и ресурсы:
- Bash & Tar: скрипт инкрементального бекапа вашего сервера с помощь after-date (ilab.me/howto/bash-tar-vps-backup).
- CentOS 7: Подключение Google Drive (adminbook.click/centos-7-podklyuchenie-google-drive-ili-bekap-dlya-bednyh).
- Использование CRON и команды crontab (codenet.ru/webmast/php/cron.php).
- Настройка mutt для отправки отчетов (adminbook.click/centos-7-nastrojka-mutt-dlya-otpravki-otchetov).
У меня виртуальная машина и самый простой тариф. Дискового пространства при таком раскладе катастрофически не хватает. Докупать дисковое пространство у хостера, переходить на тариф повыше обойдется намного дороже, чем взять у Гугл 100 гигабайт за 20$/год! А надежность хранения данных у Гугл намного выше чем у моего хостера.