Где можно хранить резервную копию бэкапа сайта.

Ранее мы уже разобрались, как сделать простой бэкап сайта. Делаем вручную бэкап, скачиваем его вручную на локальный компьютер и т.д. Этот способ вполне рабочий, если содержимое вашего сайта обновляется не часто. Условно раз в месяц сделать бэкап не станет для вас проблемой. Другое дело если контент обновляется регулярно и при редких бэкапах можно потерять чувствительную информацию.

В таких случаях уже пора настраивать регулярное бэкапирование сайта, но сразу возникает вопрос, где можно хранить резервную копию. Хранить бэкап сайта на том же сервере, что и сам сайт плохая практика. В конечном итоге вы потеряете все данные если с сервером что-нибудь случится. Скачивать каждый раз все на локальный компьютер не очень удобно, для этого нужно постоянно держать его включенным.

Для больших сайтов поднимаются отдельные серверы бэкапа или используются платные внешние хранилища. Но у нас пока маленький сайт и лишние траты нам ни к чему. Думаю многие из вас используют Google диск, а его бесплатного объема достаточно для хранения нескольких бэкапов небольшого сайта.

В прошлый раз мы научились загружать файлы в Google диск используя API. Сегодня мы используем эти знания, чтобы автоматизировать бэкапирование нашего сайта. Первым делом подготовим скрипт, который будет делать бэкап нашего сайта на WordPress. Внимание, мы будем делать бэкап базы прямо в директорию сайта, поэтому убедитесь что вы ограничили доступ к .sql файлам в настройках вашего веб сервера.
Используем текстовый редактор:
vi /usr/local/bin/backup_script.sh

#!/bin/bash

#Путь до корневой директории сайта
site_dir="/usr/share/nginx/waky.ru/"

#Получение названия базы данных
database=`grep "^define( 'DB_NAME'" $site_dir"wp-config.php" | awk '{print $3}' | sed "s|'||g"`

#Бэкап базы в директорию сайта
mariadb-dump --single-transaction $database > /usr/share/nginx/waky.ru/database_backup.sql

#Архивирование директории сайта
tar -czf /usr/share/nginx/backup.tar.gz /usr/share/nginx/waky.ru/

#Удаляем бэкап базы
rm -f /usr/share/nginx/waky.ru/database_backup.sql

#Отправляем архив с бэкапом на Google диск
/usr/bin/php /usr/local/bin/google-api-php-client/backup_upload.php

#Удаляем архив с сервера
rm -f /usr/share/nginx/backup.tar.gz

Делаем наш скрипт исполняемым файлом:
chmod 700 /usr/local/bin/backup_script.sh
Теперь подготовим скрипт загрузки архива на Google диск:
vi /usr/local/bin/google-api-php-client/backup_upload.php

<?php
require_once './vendor/autoload.php';

#Определение параметров и учетных данных клиента
$client = new Google\Client();
$client->setApplicationName("GOOGLE DRIVE integration");
$client->setAuthConfig('./your_key_file.json');
$client->addScope(Google_Service_Drive::DRIVE);
$driveService = new Google_Service_Drive($client);

#Определение мета данных файла
$fileMetadata = new Google_Service_Drive_DriveFile(array(
  'name' => date("Y-m-d").'_backup.tar.gz',
  'mimeType' => 'application/tar+gzip'
));

#Получение содержимого архива с бэкапом
$content = file_get_contents('/usr/share/nginx/backup.tar.gz');

#Создание файла на Google диске
$file = $driveService->files->create($fileMetadata, array(
  'data' => $content,
  'mimeType' => 'application/tar+gzip',
  'uploadType' => 'resumable',
  'fields' => 'id'));

#Параметры нашего Google пользователя
$mail="username@gmail.com";
$type="user";
$role="writer";

#Добавление нашему пользователю прав на файл созданный на Google диске
$newPermission = new Google_Service_Drive_Permission();
$newPermission->setEmailAddress($mail);
$newPermission->setType($type);
$newPermission->setRole($role);
$driveService->permissions->create($file->id, $newPermission);
?>

Оба скрипта готовы, запустим скрипт бэкапа и проверим как все пройдет:
/usr/local/bin/backup_script.sh
Скрипт отработал без ошибок. Если вы получите ошибку PHP Fatal error: Allowed memory size of 123456 bytes exhausted значит PHP уперся в лимит памяти. Поднимите значение memory_limit.
Зайдем в Google диск и проверим загрузился ли наш архив.

Да, все получилось, архив на месте, можете скачать его с диска, разархивировать и проверить содержимое. У нас есть скрипт, который создает архив с бэкапом сайта и загружает его в отдельное место для хранения. Для небольшого сайта это хороший способ бэкапирования. Осталось только автоматизировать запуск скрипта. Используем cron для запуска скрипта каждый день, в 3:45 ночи.
Выполним команду:

[root@waky ~]# printf "#Run backup script \n45 3 * * * /usr/local/bin/backup_script.sh > /dev/null 2>&1\n" >> /var/spool/cron/root