Бекап сайта и базы данных на VPS в Яндекс.Диск

Опубликовано 0 комментариев 328 просмотров
Бекап сайта и базы данных на VPS в Яндекс.Диск

Привет.

Каждый хоть раз задумывался о том, как и куда бекапить свои проекты. Многие хостинги автоматически создают бекапы сайтов клиентов и хранят их на своих серверах. Но как быть, если ты - владелец виртуального или выделенного сервера?

Мое решение - хранение бекапов в облаке. Так как на моей VPS стоит Ubuntu, при выборе облака важно было наличие консольного клиента. Яндекс.Диск подошел для этих целей идеально.

Установка и настройка клиента Яндекс.Диск

Делается элементарным вводом команд в консоль. В процессе настройки вы укажете логин и пароль от учетной записи Яндекс, а так же конечную папку для хранения файлов. Запомните ее расположение.

$ wget https://repo.yandex.ru/yandex-disk/yandex-disk_latest_amd64.deb
$ sudo dpkg -i yandex-disk_latest_amd64.deb
$ sudo apt-get install -f
$ yandex-disk setup

Настройка бекапирования

Скрипт получился очень компактным, всего ~75 строк кода. Он создает бекап базы данных в папке с сайтом, архивирует папку и перемещает ее в папку облака. Имеется возможность ограничивать максимальное количество хранимых копий.

<?php
/**
 * Дамп папки с сайтом + бд
 * В итоге получается архив с файлами + sql
 * Используется в связке с облаком
 * 
 * by GTXTYMT - https://gtxtymt.xyz
 */

if(php_sapi_name() !== 'cli') {
    exit();
}

set_time_limit(0);

$maxDumpsCount = 3; // Максимальное количество дампов, 0 - без ограничений
$dumpName = 'site'; // Название дампа
$sitePath = '/home/site'; // Полный путь до папки с сайтом
$cloudPath = '/home/cloud'; // Полный путь до папки, где будут храниться дампы
$mysqlUser = 'user'; // Имя пользоваться mysql
$mysqlPassword = 'password'; // Пароль пользователя mysql
$mysqlDatabase = 'site'; // Название базы данных mysql
$timestamp = time();
$tmpDir = __DIR__.'/tmp';

$mysqlDump = "mysqldump -u $mysqlUser -p$mysqlPassword $mysqlDatabase > $sitePath/database_dump.sql";
$archiveDump = "cd $tmpDir && zip -r $timestamp-$dumpName.zip $sitePath/*";

echo "Started...\n";

if(!file_exists($tmpDir)) {
    echo "Create temporary folder.\n";
    mkdir($tmpDir, 0644);
}

if(!file_exists($cloudPath)) {
    echo "Create cloud folder.\n";
    mkdir($cloudPath);
}

echo "Create database dump.\n";
exec($mysqlDump);

echo "Create final archive.\n";
exec($archiveDump);

echo "Moving archive to cloud folder.\n";
rename(
    "$tmpDir/$timestamp-$dumpName.zip",
    "$cloudPath/$timestamp-$dumpName.zip"
);

if($maxDumpsCount > 0) {
    $dumps = glob("$cloudPath/*.zip");
    $dumps = array_filter($dumps, function($i) use ($dumpName) {
        return preg_match("/[0-9]{10}-$dumpName.zip$/", $i);
    });
    $dumpsCount = count($dumps);

    if($dumpsCount > $maxDumpsCount) {
        echo "Remove old backups.\n";
        sort($dumps, SORT_STRING);

        for($i = 0; $i < $dumpsCount - $maxDumpsCount; $i++) {
            unlink($dumps[$i]);
        }

        echo "Removed $i backups.\n";
    }
}

unlink("$sitePath/database_dump.sql");

echo "Success.\n";

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

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

Для запуска скрипта добавим задание в крон. Периодичность выбирайте сами, я например запускаю его раз в день.

0 0 * * * php /path_to_script/dump.php >> /dev/null 2>&1

В ответ на сообщение

Доступна разметка Markdown. А еще вы можете использовать крутой пак эмоций.

Нажимая на кнопку «Отправить» вы даете свое согласие на обработку персональных данных в соответствии с законом №152-ФЗ «О персональных данных» от 27.07.2006 и принимаете условия Политики конфеденциальности.