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

Что умеет:
* Поддерживает MySQL
* Сжимает в Zip
* Выгружает на Яндекс.Диск
Что выгружает:
* Юзеров, у которых есть конфиг dumper.yaml в корне
* Папки /root/ и /etc/
* Логи
Вроде бы, всё так-же, как было в старом древнем YaDiskBackuper на Python, но!
Dumper работает быстрее, стабильнее, устанавливается через Composer. Помимо этих существенных преимуществ, Dumper читает конфиги в корневой директории юзера и если не находит, то юзер не бекапится.
В конфиге юзера нужно указать доступ к БД и можно указать папки, которые исключить из бекапа.
Например, у нас есть большой сайт (10 ГБ) с кучей картинок, которые хранятся в /assets/images/ (9.9 ГБ). Мы просто добавим эту папку в исключения:
Я предусмотрел расширение функциональности приложения.
С удовольствием приму критику относительно кода библиотеки.
И, конечно, ставьте звёздочки на GitHub, мне будет приятно! :)
Хочу поделиться с вами!

Что умеет:
* Поддерживает 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, просто добавив такой класс-обработчик в соответствующую папку библиотеки.
Как использовать
- Заходим на сервер от рута,
- Проверяем версию PHP для консоли (нужно >=7.1.3):
если ниже — устанавливаем требуемую.php -v
- Создаём папку, в которой будет лежать приложение и заходим в неё, например
/root/scripts/dumper/
- Устанавливаем библиотеку:
если нет Composer — устанавливаем и его.composer require gvozdb/dumper
- Создаём файл 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); }
- Там же создаём конфиг-файл приложения 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.
- Заходим в корень каждого юзера, которого хотим бекапить и создаём конфиг-файл dumper.yaml
Настраиваем для каждого юзера отдельно.# Включить enabled: true # Доступ к БД database: type: 'mysql' port: 3306 host: 'localhost' name: 'dbname' user: 'dbuser' pass: 'dbpassword' # Массив папок для исключения # указывается от корня юзера exclude: [ '/www/core/cache/*', ]
- Запускаем
и следим, происходит ли выгрузка в хранилище.php /root/scripts/dumper/cron.php
- Если всё OK — прописываем задание в cron
0 2 * * * php /root/scripts/dumper/cron.php
P.S.
С удовольствием приму критику относительно кода библиотеки.
И, конечно, ставьте звёздочки на GitHub, мне будет приятно! :)
Комментарии: 14
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Чем не устроили, например, duplicity и rclone?
О таком даже не был в курсе. Спасибо, пошёл изучать, чем это может быть полезно в моей библиотеке!
Пример, пожалуйста, чтобы не просто слова были.
У Василия подсмотреть можете — modx.pro/hosting/261 (отсюда даже часть убрать можно).
Ну и где там тот функционал, который поддерживается моей библиотекой? Опять же «читать перестал но пробежался»…
mount -t davfs webdav.yandex.ru /mnt/yandex
cp -r /backups/* /mnt/yandex
umount /mnt/yandex
?
П.С.
Куда мне до Вас, пожалуй, не буду ТЫкать Вас носом в то, что хорошо бы ещё и некоторые таблицы БД чистить и ещё пару действий совершать.
Научился бы читать, не было бы проблем. Ещё раз для одарённых: я не просил критиковать саму идею и смысл. Я попросил критику по коду. Чувствуешь разницу? Ты в реальной жизни тоже ходишь и всем, без их просьбы, высказываешь то, что тебе не нравится в их внешности, одежде, привычках, манере разговаривать, ходить и т.д.? Может быть ставишь под сомнение их смысл жизни, а к продавщицам в магазинах подходишь и говоришь, что работать надо не так, а вот так?
Я тоже не стану тыкать тебя носом в то, что хорошо бы не делать чего-то, когда тебя не просят и делать вместо этого ещё пару вещей.
Вот Вам отключение директорий: Вот Вам отключение бд: modx.pro/hosting/261#comment-36713 — Вы это так и не поняли с тех самых лет?
А ещё, ну надо же, эти строки можно универсализировать (надеюсь, понятно, что Василий это место под свои нужды писал?). Например, через переменную. И даже можно интерактивом спрашивать, какие в бекапе не нужно (или нужно), например, нумерованным листингом директорий или юзеров (метод не существенен для примера). И всё это пилится в три тычка-полторы строки.
Что быстрее работать будет подсказать?
просто «просто добавив такой класс-обработчик в соответствующую папку библиотеки» (а потом ещё, и ещё, и ещё, ага...) — расширяемость, она, порой, такая расширяемость
просто «версия php нужна» — из последних
просто «если нет Composer — устанавливаем и его» — для простейшего бекапа прикручивать не нужную для решения данной задачи сущность, это сильно.
просто файлы типа крон.пых надо порождать — чего стесняться, нехай на серве будет склад, желательно ещё и по разным папкам всё раскидать. Главное же, чтобы «мой любимый PHP».
просто каждому юзеру надо свой конфиг файл хреначить (и контролировать потом тоже каждый, разумеется)
просто более 200 строк кода нужно этой беспощадной своей велосипедностью поделке, чтобы хоть как-то заработать простейшим образом
Хорошо, что в этом монструозном велосипеде, безусловно достойном множества лайков и звёзд, всё просто.
П.С.
Я так и не понял в итоге, «если есть рут», что может Ваша поделка, что не может данный мной пример скрипта Василия, расширяемый в три тычка. Не требующий левых для данной задачи приблуд. Нативно, быстрее и гибче решающего задачу Бекапирование сайтов.