Библиотека для создания резервных копий сервераDumper

Библиотека для создания резервных копий сервера

Я тут написал библиотеку для создания резервных копий сервера на моём любимом PHP. Хочу поделиться с вами!

Что умеет:

  • Поддерживает MySQL
  • Сжимает в Zip
  • Выгружает на Яндекс.Диск

Что выгружает:

  • Юзеров, у которых есть конфиг dumper.yaml в корне
  • Папки /root/ и /etc/
  • Логи

Вроде бы, всё так-же, как было в старом древнем YaDiskBackuper на Python, но!
Dumper работает быстрее, стабильнее, устанавливается через Composer. Помимо этих существенных преимуществ, Dumper читает конфиги в корневой директории юзера и если не находит, то юзер не бекапится.

В конфиге юзера нужно указать доступ к БД и можно указать папки, которые исключить из бекапа.
Например, у нас есть большой сайт (10 ГБ) с кучей картинок, которые хранятся в /assets/images/ (9.9 ГБ). Мы просто добавим эту папку в исключения:

yaml
...
exclude: [
    '/www/assets/images/*',
  ]

и в хранилище будет выгружаться 0.1 ГБ + база данных.

Что ещё?

Я предусмотрел расширение функциональности приложения.

  • Помимо Яндекс.Диск можно добавить любое другое хранилище. Делается это довольно просто для посвящённого в программирование на PHP.
  • Кроме MySQL можно добавить поддержку ещё чего угодно!
  • А архивирование в Zip легко можно заменить на какой-нибудь GZip, просто добавив такой класс-обработчик в соответствующую папку библиотеки.

Как использовать

  1. Заходим на сервер от рута,
  2. Проверяем версию PHP для консоли (нужно >=7.1.3) php -v, если ниже - устанавливаем требуемую.
  3. Создаём папку, в которой будет лежать приложение и заходим в неё, например: /root/scripts/dumper/
  4. Устанавливаем библиотеку: composer require gvozdb/dumper, если нет Composer - устанавливаем и его.
  5. Создаём файл cron.php:
php
<?php
use Gvozdb\Dumper;
require __DIR__ . '/vendor/autoload.php';
try {
    $config = new Dumper\Config\Load(__DIR__ . '/config.yaml');
    $backup = new Dumper\Backup($config);
    $backup->run();
} catch (Exception $e) {
    print_r($e->getMessage() . PHP_EOL);
}
  1. Там же создаём конфиг-файл приложения config.yaml
yaml
main:
    prefix: "%Y%m%d-" # префикс для названия архивов
    expires: &main.expires 4 # сколько дней хранить
    clean_logs: true # чистить старые логи
path:
    tmp: '/tmp/dumper/%Y%m%d/' # временная папка на сервере
    users: '/var/www/' # директория с юзерами
    root: '/root/' # директория root
    log: '/var/log/' # директория логов
    etc: '/etc/' # директория etc

# Хранилища
storages:
    YandexDisk:
        token: 'AQAAAAABEJ2-AAVH0ERr79Yz4E5dpd-7nhV1W18' # токен хранилища
        path: 'disk:/Dumper/%Y%m%d/' # где хранить
        expires: *main.expires # сколько дней хранить для конкретного хранилища

Настраиваем конфиг под свой сервер. Как получить токен Яндекс.Диск, описано в шапке класса YandexDisk.
7. Заходим в корень каждого юзера, которого хотим бекапить и создаём конфиг-файл dumper.yaml

yaml
# Включить
enabled: true

# Доступ к БД
database:
    type: 'mysql'
    port: 3306
    host: 'localhost'
    name: 'dbname'
    user: 'dbuser'
    pass: 'dbpassword'

# Массив папок для исключения, указывается от корня юзера
exclude: [
    '/www/core/cache/*',
  ]

Настраиваем для каждого юзера отдельно.
8. Запускаем php /root/scripts/dumper/cron.php и следим, происходит ли выгрузка в хранилище.
9. Если всё OK - прописываем задание в cron: 0 2 * * * php /root/scripts/dumper/cron.php

P.S.

С удовольствием приму критику относительно кода библиотеки. И, конечно, ставьте звёздочки на GitHub, мне будет приятно!

Павел Гвоздь

Поддерживается **жирный**, *курсив*, `код`, ```блок кода```, > цитата, ссылки и переносы строк

Михаил
Отличный инструмент! Настроил очень быстро и легко, сэнкс.
Игорь
Спасибо огромное! Библиотека на питоне ни в какую не хотела работать через крон. Эта работает идеально.