
- MODX 2
- MODX 3
- PHP 7.4
- PHP 8.1


mxBackup умеет разворачивать архив обратно: файлы, базу данных или и то и другое. Операция необратима, поэтому она разделена на два шага — проверка и собственно восстановление — и защищена кодом подтверждения, отдельным правом доступа и обязательной страховочной копией.
Перед запуском
Восстановление изменяет файлы сайта и выполняет DROP TABLE для таблиц из дампа. Откатить это одной транзакцией MySQL не позволяет.
Зачем закрывать сайт
Восстановление идёт не мгновенно: пока файлы и таблицы заменяются, сайт живёт с наполовину старым кодом и наполовину новой базой. Запросы в этот момент могут как отдать ошибку, так и записать в базу данные, которые тут же будут затёрты импортом дампа.
php core/components/mxbackup/cli/mxbackup.php restore-check --archive=/srv/backups/mxbackup-prod-20260805-031500.tar.gzЧто проверяется:
tar.gz;mxbackup-manifest.json и database.sql;payload_ready и контрольная сумма database.sql;..), повторяющиеся имена и символические ссылки отклоняются;--checksum — контрольная сумма архива совпадает с ожидаемой (её удобно взять из истории запусков).В ответе — состав архива, манифест, предупреждения и код подтверждения:
{
"archive_name": "mxbackup-prod-20260805-031500.tar.gz",
"archive_checksum": "3f7a…",
"confirmation": "3f7a1c9d0e2b",
"format": "tar.gz",
"encrypted": false,
"site_files": 12483,
"warnings": []
}Код подтверждения — первые 12 символов SHA-256 архива. Он привязан к конкретному файлу: подменённый или повреждённый архив даст другой код, и восстановление не начнётся.
Типичные предупреждения: версия MODX в архиве отличается от текущей в пределах одной основной версии; архив снят профилем dev и содержит обезличенную базу.
php core/components/mxbackup/cli/mxbackup.php restore \
--archive=/srv/backups/mxbackup-prod-20260805-031500.tar.gz \
--scope=all \
--confirm=3f7a1c9d0e2bЕсли запустить restore без --confirm, команда выполнит проверку, напечатает нужный код и завершится с кодом возврата 2 — ничего не изменив.
--scope | Что восстанавливается |
|---|---|
all | файлы и база данных |
files | только файлы |
database | только база данных |
database.sql из манифеста и то, что сам архив не изменился по ходу проверки.pre-restore: почта выключена, ротация не применяется, чтобы копию не удалило собственными правилами хранения. Если копия не создалась, восстановление отменяется.warning — восстановление всегда остаётся заметным событием.Ход выполнения виден в консоли: стадии, счётчики и длительность — см. Ход выполнения. Страховочная копия печатает свои стадии отдельной лентой с отступом.
Появилось в 1.7.0-rc / 2.4.0-rc
Распаковка большого архива занимает минуты, и всё это время соединение с базой простаивает. Сервер закрывает такое соединение по wait_timeout — на shared- хостинге это бывает 60–120 секунд, — и первый же запрос после распаковки падал с «MySQL server has gone away», а восстановление отменялось на записи страховочной копии в историю.
Теперь соединение пингуется по ходу долгих стадий и поднимается заново, если всё-таки оборвалось; обращения к истории запусков после переподключения повторяются. Отдельно ничего настраивать не нужно.
Исключение — согласованный снимок базы внутри backup: транзакция живёт в соединении и умирает вместе с ним, поэтому там переподключения нет. Обрыв прерывает дамп явной ошибкой — иначе архив собрался бы из разных состояний базы.
Архив сначала распаковывается целиком, и только затем каждый файл заменяется через временный файл и атомарное переименование. Наполовину записанного файла на сайте не появится даже при обрыве процесса.
Режим — merge: файлы из архива перезаписывают одноимённые, недостающие каталоги создаются, а файлы, которых в архиве нет, остаются на месте.
Merge не убирает лишнее
Если сайт взломан и в нём появились посторонние файлы, восстановление их не удалит — они не описаны в архиве. Для такого случая нужна чистая выкладка, а mxBackup даст файлы и базу для неё.
Отдельные ограничения безопасности: элемент, которого нет в каталоге site/ архива, не восстанавливается; заменять каталог или символическую ссылку обычным файлом пакет не станет — вместо этого остановится с ошибкой.
Импортёр принимает только тот синтаксис, который порождает сам mxBackup:
DROP TABLE IF EXISTS для таблицы из дампа;CREATE TABLE;INSERT INTO.Любое другое выражение прерывает импорт с ошибкой. Это защита от подсунутого файла: чужой дамп с триггерами, процедурами или GRANT через восстановление mxBackup не проедет.
Восстанавливаются только таблицы, которые есть в дампе. Таблицы, появившиеся после снятия копии, останутся нетронутыми — это важно помнить при частичном восстановлении.
Для архива с AES-256 нужен пароль:
MXBACKUP_ARCHIVE_PASSWORD='…' php core/components/mxbackup/cli/mxbackup.php restore-check --archive=/srv/backups/backup.zipили файлом:
php core/components/mxbackup/cli/mxbackup.php restore-check --archive=/srv/backups/backup.zip --password-file=/root/.mxbackup-passwordВ аргументах командной строки пароль не принимается. В интерактивном терминале его запросят с отключённым эхом ввода, если он не передан иначе.
Во вкладке «История» у успешной копии есть действие восстановления: пункт контекстного меню в MODX 2, кнопка в строке — в MODX 3. Порядок тот же: сначала проверка архива, затем ввод кода подтверждения и выбор области восстановления. В MODX 3 диалог проходит эти шаги явно, и кнопка запуска остаётся недоступной, пока введённый код не совпадёт с выданным. Действие доступно только при праве mxbackup_restore — см. Права и безопасность.
Через веб — только небольшие сайты
Восстановление выполняется синхронно, в одном запросе, и включает создание страховочной копии. На сколько-нибудь крупном сайте запрос оборвётся по таймауту — используйте CLI.
core/cache нельзя.Восстанавливайте только доверенные архивы
Контрольная сумма защищает от случайной порчи файла, но не является цифровой подписью: тот, кто подменил архив, мог пересчитать и её. Архив из непроверенного источника разворачивать нельзя.