[Gvozdb/Dumper] PHP библиотека для создания резервных копий сервера

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



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

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

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

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

  6. Там же создаём конфиг-файл приложения config.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
    # Включить
    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, мне будет приятно! :)
Павел Гвоздь
25 ноября 2018, 10:08
modx.pro
8
1 502
+7
Поблагодарить автора Отправить деньги

Комментарии: 14

Василий Наумкин
25 ноября 2018, 10:24
+2
Как насчёт инкрементальных архивов?

Чем не устроили, например, duplicity и rclone?
    Павел Гвоздь
    25 ноября 2018, 10:33
    0
    Как насчёт инкрементальных архивов?
    Внедрение инкрементного архивирования в планах.

    Чем не устроили, например, duplicity и rclone?
    О таком даже не был в курсе. Спасибо, пошёл изучать, чем это может быть полезно в моей библиотеке!
    Иван
    25 ноября 2018, 11:11
    -1
    Заходим на сервер от рута,
    Вот на этой строчке читать перестал (но пробежался). Не для холиваров, а из-за реального интереса — какова цель лайбы (помимо изыскательно-практической, конечно), если есть рут, а на баше это пилится в три тычка и без особых его знаний?
      Павел Гвоздь
      25 ноября 2018, 11:21
      0
      какова цель лайбы
      Делать бекапы.

      а на баше это пилится в три тычка
      Пример, пожалуйста, чтобы не просто слова были.
        Иван
        25 ноября 2018, 11:40
        -1
        Делать бекапы на сервере при помощи php? 0_s
        У Василия подсмотреть можете — modx.pro/hosting/261 (отсюда даже часть убрать можно).
          Павел Гвоздь
          25 ноября 2018, 11:45
          0
          Делать бекапы на сервере при помощи php? 0_s
          Давай начнём с того, что критику я просил только относительно кода библиотеки. Вот к чему приводит ваше «читать перестал но пробежался».

          подсмотреть можете
          Ну и где там тот функционал, который поддерживается моей библиотекой? Опять же «читать перестал но пробежался»…
            Иван
            25 ноября 2018, 11:52
            -2
            Какой именно функционал-то, Павел? Вот это Вы гордо поименовали громким словом функционал:
            mount -t davfs webdav.yandex.ru /mnt/yandex
            cp -r /backups/* /mnt/yandex
            umount /mnt/yandex
            ?
              Павел Гвоздь
              25 ноября 2018, 12:00
              +1
              Я не понял, ты читать не умеешь? Прочти пост вдумчиво, станет понятнее.
                Иван
                25 ноября 2018, 12:11
                -1
                Думаю, это Вам стоит прочесть код простого и внятного бекапера, который я дал по Вашей же просьбе. Про желательно взятие уроков общения вообще промолчу.

                П.С.
                Куда мне до Вас, пожалуй, не буду ТЫкать Вас носом в то, что хорошо бы ещё и некоторые таблицы БД чистить и ещё пару действий совершать.
                  Павел Гвоздь
                  25 ноября 2018, 12:29
                  +1
                  Думаю, это Вам стоит прочесть код простого и внятного бекапера, который я дал по Вашей же просьбе.
                  Ты будешь удивлён, но я читал и даже юзал его в своё время… как видишь, написал свой, и да, на PHP. Если ты не видишь разницы между функционалом моей библиотеки и того, что ты привёл по ссылке, то о чём нам с тобой говорить? Нет там ни отключения бекапа юзера по конфигу, ни вообще поддержки конфигов нет. Я не говорю уже о какой-то простой расширяемости.

                  Про желательно взятие уроков общения вообще промолчу.
                  Научился бы читать, не было бы проблем. Ещё раз для одарённых: я не просил критиковать саму идею и смысл. Я попросил критику по коду. Чувствуешь разницу? Ты в реальной жизни тоже ходишь и всем, без их просьбы, высказываешь то, что тебе не нравится в их внешности, одежде, привычках, манере разговаривать, ходить и т.д.? Может быть ставишь под сомнение их смысл жизни, а к продавщицам в магазинах подходишь и говоришь, что работать надо не так, а вот так?

                  Куда мне до Вас, пожалуй, не буду ТЫкать Вас носом в то, что хорошо бы ещё и некоторые таблицы БД чистить и ещё пару действий совершать.
                  Я тоже не стану тыкать тебя носом в то, что хорошо бы не делать чего-то, когда тебя не просят и делать вместо этого ещё пару вещей.
                    Баха Волков
                    25 ноября 2018, 13:39
                    +1
                    Паша, оставь его пожалуйста, он непонятый гений… или не гений… а просто непонятый…
      Иван
      25 ноября 2018, 19:31
      -1
      Таки придётся тыкать Вас носом…
      Вот Вам отключение директорий:
      --exclude=core/cache/*;
      Вот Вам отключение бд:
      if [[ "$i" != "mysql" && "$i" != "performance_schema" && ! "$i" =~ ^s[0-9] ]]
      modx.pro/hosting/261#comment-36713 — Вы это так и не поняли с тех самых лет?

      А ещё, ну надо же, эти строки можно универсализировать (надеюсь, понятно, что Василий это место под свои нужды писал?). Например, через переменную. И даже можно интерактивом спрашивать, какие в бекапе не нужно (или нужно), например, нумерованным листингом директорий или юзеров (метод не существенен для примера). И всё это пилится в три тычка-полторы строки.
      Что быстрее работать будет подсказать?

      просто «просто добавив такой класс-обработчик в соответствующую папку библиотеки» (а потом ещё, и ещё, и ещё, ага...) — расширяемость, она, порой, такая расширяемость
      просто «версия php нужна» — из последних
      просто «если нет Composer — устанавливаем и его» — для простейшего бекапа прикручивать не нужную для решения данной задачи сущность, это сильно.
      просто файлы типа крон.пых надо порождать — чего стесняться, нехай на серве будет склад, желательно ещё и по разным папкам всё раскидать. Главное же, чтобы «мой любимый PHP».
      просто каждому юзеру надо свой конфиг файл хреначить (и контролировать потом тоже каждый, разумеется)
      просто более 200 строк кода нужно этой беспощадной своей велосипедностью поделке, чтобы хоть как-то заработать простейшим образом

      Хорошо, что в этом монструозном велосипеде, безусловно достойном множества лайков и звёзд, всё просто.

      П.С.
      Я так и не понял в итоге, «если есть рут», что может Ваша поделка, что не может данный мной пример скрипта Василия, расширяемый в три тычка. Не требующий левых для данной задачи приблуд. Нативно, быстрее и гибче решающего задачу Бекапирование сайтов.
        Павел Гвоздь
        25 ноября 2018, 19:34
        0
        А что потанцевать нельзя?
        Видимо это про тебя… даже читать не стал твою простынь.
          Иван
          25 ноября 2018, 19:37
          -1
          Вы даже не поняли, что это не для Вас писалось. Велосипедьте на здоровье.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        14