[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?
Чем не устроили, например, duplicity и rclone?
Как насчёт инкрементальных архивов?Внедрение инкрементного архивирования в планах.
Чем не устроили, например, duplicity и rclone?О таком даже не был в курсе. Спасибо, пошёл изучать, чем это может быть полезно в моей библиотеке!
Заходим на сервер от рута,Вот на этой строчке читать перестал (но пробежался). Не для холиваров, а из-за реального интереса — какова цель лайбы (помимо изыскательно-практической, конечно), если есть рут, а на баше это пилится в три тычка и без особых его знаний?
какова цель лайбыДелать бекапы.
а на баше это пилится в три тычкаПример, пожалуйста, чтобы не просто слова были.
Делать бекапы на сервере при помощи php? 0_s
У Василия подсмотреть можете — modx.pro/hosting/261 (отсюда даже часть убрать можно).
У Василия подсмотреть можете — modx.pro/hosting/261 (отсюда даже часть убрать можно).
Делать бекапы на сервере при помощи php? 0_sДавай начнём с того, что критику я просил только относительно кода библиотеки. Вот к чему приводит ваше «читать перестал но пробежался».
подсмотреть можетеНу и где там тот функционал, который поддерживается моей библиотекой? Опять же «читать перестал но пробежался»…
Какой именно функционал-то, Павел? Вот это Вы гордо поименовали громким словом функционал:
mount -t davfs webdav.yandex.ru /mnt/yandex
cp -r /backups/* /mnt/yandex
umount /mnt/yandex
?
mount -t davfs webdav.yandex.ru /mnt/yandex
cp -r /backups/* /mnt/yandex
umount /mnt/yandex
?
Я не понял, ты читать не умеешь? Прочти пост вдумчиво, станет понятнее.
Думаю, это Вам стоит прочесть код простого и внятного бекапера, который я дал по Вашей же просьбе. Про желательно взятие уроков общения вообще промолчу.
П.С.
Куда мне до Вас, пожалуй, не буду ТЫкать Вас носом в то, что хорошо бы ещё и некоторые таблицы БД чистить и ещё пару действий совершать.
П.С.
Куда мне до Вас, пожалуй, не буду ТЫкать Вас носом в то, что хорошо бы ещё и некоторые таблицы БД чистить и ещё пару действий совершать.
Думаю, это Вам стоит прочесть код простого и внятного бекапера, который я дал по Вашей же просьбе.Ты будешь удивлён, но я читал и даже юзал его в своё время… как видишь, написал свой, и да, на PHP. Если ты не видишь разницы между функционалом моей библиотеки и того, что ты привёл по ссылке, то о чём нам с тобой говорить? Нет там ни отключения бекапа юзера по конфигу, ни вообще поддержки конфигов нет. Я не говорю уже о какой-то простой расширяемости.
Про желательно взятие уроков общения вообще промолчу.Научился бы читать, не было бы проблем. Ещё раз для одарённых: я не просил критиковать саму идею и смысл. Я попросил критику по коду. Чувствуешь разницу? Ты в реальной жизни тоже ходишь и всем, без их просьбы, высказываешь то, что тебе не нравится в их внешности, одежде, привычках, манере разговаривать, ходить и т.д.? Может быть ставишь под сомнение их смысл жизни, а к продавщицам в магазинах подходишь и говоришь, что работать надо не так, а вот так?
Куда мне до Вас, пожалуй, не буду ТЫкать Вас носом в то, что хорошо бы ещё и некоторые таблицы БД чистить и ещё пару действий совершать.Я тоже не стану тыкать тебя носом в то, что хорошо бы не делать чего-то, когда тебя не просят и делать вместо этого ещё пару вещей.
Паша, оставь его пожалуйста, он непонятый гений… или не гений… а просто непонятый…
Таки придётся тыкать Вас носом…
Вот Вам отключение директорий:
А ещё, ну надо же, эти строки можно универсализировать (надеюсь, понятно, что Василий это место под свои нужды писал?). Например, через переменную. И даже можно интерактивом спрашивать, какие в бекапе не нужно (или нужно), например, нумерованным листингом директорий или юзеров (метод не существенен для примера). И всё это пилится в три тычка-полторы строки.
Что быстрее работать будет подсказать?
просто «просто добавив такой класс-обработчик в соответствующую папку библиотеки» (а потом ещё, и ещё, и ещё, ага...) — расширяемость, она, порой, такая расширяемость
просто «версия php нужна» — из последних
просто «если нет Composer — устанавливаем и его» — для простейшего бекапа прикручивать не нужную для решения данной задачи сущность, это сильно.
просто файлы типа крон.пых надо порождать — чего стесняться, нехай на серве будет склад, желательно ещё и по разным папкам всё раскидать. Главное же, чтобы «мой любимый PHP».
просто каждому юзеру надо свой конфиг файл хреначить (и контролировать потом тоже каждый, разумеется)
просто более 200 строк кода нужно этой беспощадной своей велосипедностью поделке, чтобы хоть как-то заработать простейшим образом
Хорошо, что в этом монструозном велосипеде, безусловно достойном множества лайков и звёзд, всё просто.
П.С.
Я так и не понял в итоге, «если есть рут», что может Ваша поделка, что не может данный мной пример скрипта Василия, расширяемый в три тычка. Не требующий левых для данной задачи приблуд. Нативно, быстрее и гибче решающего задачу Бекапирование сайтов.
Вот Вам отключение директорий:
--exclude=core/cache/*;
Вот Вам отключение бд: if [[ "$i" != "mysql" && "$i" != "performance_schema" && ! "$i" =~ ^s[0-9] ]]
modx.pro/hosting/261#comment-36713 — Вы это так и не поняли с тех самых лет?А ещё, ну надо же, эти строки можно универсализировать (надеюсь, понятно, что Василий это место под свои нужды писал?). Например, через переменную. И даже можно интерактивом спрашивать, какие в бекапе не нужно (или нужно), например, нумерованным листингом директорий или юзеров (метод не существенен для примера). И всё это пилится в три тычка-полторы строки.
Что быстрее работать будет подсказать?
просто «просто добавив такой класс-обработчик в соответствующую папку библиотеки» (а потом ещё, и ещё, и ещё, ага...) — расширяемость, она, порой, такая расширяемость
просто «версия php нужна» — из последних
просто «если нет Composer — устанавливаем и его» — для простейшего бекапа прикручивать не нужную для решения данной задачи сущность, это сильно.
просто файлы типа крон.пых надо порождать — чего стесняться, нехай на серве будет склад, желательно ещё и по разным папкам всё раскидать. Главное же, чтобы «мой любимый PHP».
просто каждому юзеру надо свой конфиг файл хреначить (и контролировать потом тоже каждый, разумеется)
просто более 200 строк кода нужно этой беспощадной своей велосипедностью поделке, чтобы хоть как-то заработать простейшим образом
Хорошо, что в этом монструозном велосипеде, безусловно достойном множества лайков и звёзд, всё просто.
П.С.
Я так и не понял в итоге, «если есть рут», что может Ваша поделка, что не может данный мной пример скрипта Василия, расширяемый в три тычка. Не требующий левых для данной задачи приблуд. Нативно, быстрее и гибче решающего задачу Бекапирование сайтов.
А что потанцевать нельзя?Видимо это про тебя… даже читать не стал твою простынь.
Вы даже не поняли, что это не для Вас писалось. Велосипедьте на здоровье.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.