Бесплатный Бекап сайта для нищих

Расскажем нашим дорогим читателям историю о том, если у вас катастрофически не хватает денежных знаков, как можно бесплатно делать бэкап вашего любимого сайта на ресурсы Гугл Диска, любезно предоставленные компанией Google. Всем уже давно известно, что Гугл предоставляет всем желающим бесплатно 15 гигабайт дискового пространства на своих серверах для хранения личной информации граждан разных стран. Если у вас небольшой сайт, то этого объема вполне достаточно для хранения последних 6-и дневных копий, 4-х недельных и одного месячной копии вашего сайта с базой данных.

Если вам этого мало, то можно докупить еще 75 гигабайт пространства всего за 20$ за год у гугла :)

И так, приступим! Компания Google предоставляет нам сервис для загрузки файлов в Гугл Диск (Google Drive™) с нашего домашнего компьютера, но не дает нам никаких инструментов для такой работы от серверной части нашего сайта. Сообщество давно предложило утилиту командной строки для взаимодействия с Google Диском - gdrive.

Все это добро будем ставить на 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

 

Использованные при написании статьи материалы и ресурсы:

  1. Bash & Tar: скрипт инкрементального бекапа вашего сервера с помощь after-date (ilab.me/howto/bash-tar-vps-backup).
  2. CentOS 7: Подключение Google Drive (adminbook.click/centos-7-podklyuchenie-google-drive-ili-bekap-dlya-bednyh).
  3. Использование CRON и команды crontab (codenet.ru/webmast/php/cron.php).
  4. Настройка mutt для отправки отчетов (adminbook.click/centos-7-nastrojka-mutt-dlya-otpravki-otchetov).
19 января 2018, 00:29    Вечерний Минск Блог 0    0 0
backup, cron

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

  1. blogphp-trn 20 января 2018, 14:25 # 0
    Спасибо, помогло! Я новичок в этой системе, но разобрался. Дам несколько советов тем, кто не сталкивался linux. 1. Чтобы разобраться поверхностно с командами линукса из консоли вам потребуется день. 2. Когда редактируете скрипт в редакторе – смотрите, чтобы он сохранялся в кодировке UTF-8, иначе к концам строк цепляются переводы строки и скрипт выдаст ошибку команды. 3. Прописывайте полный путь к командам или PATH в скрипте. Потому что команда отработает при запуске из консоли, а при запуске через cron выдаст ошибку. 4. Частая ошибка права на файл и исполнение. Если вы под root работаете размещайте файл в директории root, если из под юзера – в директории юзера. Иначе надо права доступа на файл дополнительные устанавливать.

    У меня виртуальная машина и самый простой тариф. Дискового пространства при таком раскладе катастрофически не хватает. Докупать дисковое пространство у хостера, переходить на тариф повыше обойдется намного дороже, чем взять у Гугл 100 гигабайт за 20$/год! А надежность хранения данных у Гугл намного выше чем у моего хостера.