Блог о программировании на PHP, Yii2, 1C-Bitrix, а так же о фотографии как хобби и путешествиях.

Бэкап сайта в Яндекс.Диск с информированием через sms.

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

Аккаунт Яндекс,Диска у меня уже был, поэтому было решено делать интеграцию с ним. А также для Яндекс.Диска есть удобный консольный клиент под linux, который упрощает саму интеграцию, иначе пришлось бы использовать webdav api.

Консольный клиент

Для начала установим консольный клиент ( я устанавливал через yum, через другие менеджеры описано здесь ):

  1. Создаем файлик yandex.repo в /etc/yum.repos.d/yandex.repo с содержанием:
    [yandex]
    name=Yandex
    failovermethod=priority
    baseurl=http://repo.yandex.ru/yandex-disk/rpm/stable/$basearch/
    enabled=1
    metadata_expire=1d
    gpgcheck=1
    gpgkey=http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
  2. И устанавливаем:
    nano /etc/yum.repos.d/yandex.repo
    rpm --import http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
    yum install yandex-disk
  3. Импортируем GPG ключ:
    wget -O YANDEX-DISK-KEY.GPG http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
    sudo apt-key add YANDEX-DISK-KEY.GPG
  4. И запускаем мастер настройки, он запросит название каталога для хранения данных, прокси, параметры автозагрузки, а также логин и пароль для доступа в Яндекс.Диск:
    yandex-disk setup

SMS информирование

Для отслеживания создания бэкапов и работоспособности сервера было добавлено sms информирование о создании бэкапа. Для рассылки мне приглянулся сервис sms.ru, т.к. он поддерживает бесплатную рассылку для отладки на указанные в договоре телефоны. О нем уже писали на хабре.

Регистрируемся в сервисе, и берем из личного кабинета api_key.

Для работы с сервисом есть php класс, взять его можно здесь.

Ну и собственно скрипт отправки sms:

require_once 'smsru.php';
$sms = new \Zelenin\smsru( api_key );
$result = $sms->sms_send( phone_number, 'backup success created' );

Скрипт бэкапа

В bash скрипт создания бэкапа был добавлен перенос в Яндекс.Диск и отправка sms:

# Доступы до БД
MYSQL_USER=mysql_user
MYSQL_PASSWORD=mysql_password
MYSQL_DB=mysql_db
MYSQLDUMP=/usr/bin/mysqldump

SERVER_PATH="public_html/"

$MYSQLDUMP --user=$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DB > db.sql
# Архвируем БД
if [ -f db.sql ]; then
    echo "db dump created"
    
    tar -cjf db.tar.bz2 db.sql
    
    if [ -f db.tar.bz2 ]; then
	echo "db packed"
	
	rm db.sql
	mv db.tar.bz2 $SERVER_PATH
    fi
fi
# Путь до темы сайта
THEME_PATH=$SERVER_PATH"theme/"

cur_date=`date +%Y-%m-%d`

filename="backup-"$cur_date".tar.bz2"

# Архивируем, исключая не нужные файлы.

tar \
--exclude=$SERVER_PATH".git" \
--exclude=$THEME_PATH"bower_components" \
--exclude=$THEME_PATH"node_modules" \
-cjf $filename $SERVER_PATH

if [ -f $filename ]; then
# Отправляем sms
    php sms.ru/send.php
# Удаляем архив бд
    rm $SERVER_PATH"db.tar.bz2"
# Перемещаем бэкап в Яндекс.Диск
    mv $filename Yandex.Disk/backups/
# Синхронизируем копии
    yandex-disk sync
fi

Скрипт добавлен в crontab на запуск 1 раз в день. Удаление старых копий осуществляется вручную, вдруг что пойдет не так.