larikmc/yii2-db-backup

Low-load MySQL/MariaDB backup module for Yii2 with async web trigger and console worker.

Maintainers

Package info

github.com/larikmc/yii2-db-backup

Type:yii2-extension

pkg:composer/larikmc/yii2-db-backup

Statistics

Installs: 5

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.3 2026-02-16 09:20 UTC

This package is auto-updated.

Last update: 2026-03-16 10:31:08 UTC


README

Переиспользуемый модуль бэкапа MySQL/MariaDB для Yii2:

  • запуск из web (POST /dbbackup/backup/start)
  • выполнение в фоне через console worker
  • щадящий dump (--single-transaction --quick --skip-lock-tables)
  • .sql.gz, checksum, manifest, lock от параллельного запуска, ротация

Установка

Добавьте пакет в composer.json проекта (path repo или git):

{
  "repositories": [
    {
      "type": "path",
      "url": "extensions/yii2-db-backup"
    }
  ],
  "require": {
    "larikmc/yii2-db-backup": "*"
  }
}

Затем:

composer update larikmc/yii2-db-backup

Конфигурация

Подключите модуль в web и console приложениях под ID dbbackup.

Готовая вставка для backend/config/main.php

<?php

$params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

$defaultDumpBinary = DIRECTORY_SEPARATOR === '\\'
    ? 'D:\\OpenServer646\\modules\\MariaDB-11.8\\bin\\mysqldump.exe'
    : '';
$dumpBinary = getenv('DBBACKUP_DUMP_BINARY') ?: $defaultDumpBinary;

$config = [
    // ...
    'modules' => [
        // ...
        'dbbackup' => [
            'class' => larikmc\yii2dbbackup\Module::class,
            'controllerNamespace' => 'larikmc\\yii2dbbackup\\web\\controllers',
            'backupDir' => '@runtime/backups/db',
            'dumpBinary' => $dumpBinary,
            'retentionDays' => 14,
            'minFreeSpaceGb' => 2,
            'maxConcurrent' => 1,
            'accessRole' => '@',
            'consoleRoute' => 'dbbackup/backup/run',
            'autoCreateTable' => true,
        ],
    ],
    'components' => [
        // ...
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                'db-backup/<action:\w+>' => 'dbbackup/backup/<action>',
            ],
        ],
    ],
];

return $config;

Готовая вставка для console/config/main.php

<?php

$params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

$defaultDumpBinary = DIRECTORY_SEPARATOR === '\\'
    ? 'D:\\OpenServer646\\modules\\MariaDB-11.8\\bin\\mysqldump.exe'
    : '';
$dumpBinary = getenv('DBBACKUP_DUMP_BINARY') ?: $defaultDumpBinary;

return [
    'id' => 'app-console',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'controllerNamespace' => 'console\\controllers',
    'modules' => [
        'dbbackup' => [
            'class' => larikmc\yii2dbbackup\Module::class,
            'controllerNamespace' => 'larikmc\\yii2dbbackup\\console\\controllers',
            'backupDir' => '@runtime/backups/db',
            'dumpBinary' => $dumpBinary,
            'retentionDays' => 14,
            'minFreeSpaceGb' => 2,
            'maxConcurrent' => 1,
            'consoleRoute' => 'dbbackup/backup/run',
            'autoCreateTable' => true,
        ],
    ],
    'params' => $params,
];

Пример backend (web)

'modules' => [
    'dbbackup' => [
        'class' => larikmc\yii2dbbackup\Module::class,
        'controllerNamespace' => 'larikmc\\yii2dbbackup\\web\\controllers',
        'backupDir' => '@runtime/backups/db',
        'dumpBinary' => '', // путь к mariadb-dump/mysqldump, если нужен явный
        'retentionDays' => 14,
        'minFreeSpaceGb' => 2,
        'maxConcurrent' => 1,
        'accessRole' => '@',
        'consoleRoute' => 'dbbackup/backup/run',
        'autoCreateTable' => true,
    ],
],

Пример console

'modules' => [
    'dbbackup' => [
        'class' => larikmc\yii2dbbackup\Module::class,
        'controllerNamespace' => 'larikmc\\yii2dbbackup\\console\\controllers',
        'backupDir' => '@runtime/backups/db',
        'dumpBinary' => '',
        'retentionDays' => 14,
        'minFreeSpaceGb' => 2,
        'maxConcurrent' => 1,
        'consoleRoute' => 'dbbackup/backup/run',
        'autoCreateTable' => true,
    ],
],

Разные dumpBinary для локалки и прода

$defaultDumpBinary = DIRECTORY_SEPARATOR === '\\'
    ? 'D:\\OpenServer646\\modules\\MariaDB-11.8\\bin\\mysqldump.exe'
    : '';
$dumpBinary = getenv('DBBACKUP_DUMP_BINARY') ?: $defaultDumpBinary;

И в модуле:

'dumpBinary' => $dumpBinary,

Хранилище (таблица backup_job)

По умолчанию таблица создается автоматически при первом запуске (autoCreateTable = true).

Если хотите управлять схемой только через миграции:

  • отключите автосоздание: 'autoCreateTable' => false
  • примените миграцию larikmc\yii2dbbackup\migrations\m260216_000001_create_backup_job_table

API

  • GET /dbbackup/backup/index — встроенная web-страница управления
  • POST /dbbackup/backup/start — создать и запустить задачу
  • GET /dbbackup/backup/status?id=... — статус одной задачи
  • GET /dbbackup/backup/list?limit=50 — список задач
  • GET /dbbackup/backup/download?id=... — скачать .sql.gz
  • POST /dbbackup/backup/delete?id=... — удалить задачу и файл

index отдает HTML-страницу, download отдает файл, служебные endpoints возвращают JSON.

Ссылка в админке (готовый HTML)

Если админка одинаковая на всех проектах, можно вставить ссылку прямо в шаблон меню.

Вариант 1: простая ссылка

<a href="<?= \yii\helpers\Url::to(['/dbbackup/backup/index']) ?>">Бэкап БД</a>

Вариант 2: под ваш sidebar-стиль (полный блок с submenu)

<li class="sz-nav__item">
    <a href="<?= \yii\helpers\Url::to(['/dbbackup/backup/index']) ?>" class="sz-nav__link">
        <span class="material-symbols-rounded">backup</span>
        <span class="sz-nav__label">Бэкап БД</span>
    </a>
    <ul class="sz-submenu">
        <li class="sz-submenu__item"><span class="sz-submenu__title">Бэкап БД</span></li>
    </ul>
</li>

Если хотите URL вида /admin/db-backup/index

Добавьте правило в urlManager backend:

'rules' => [
    'db-backup/<action:\w+>' => 'dbbackup/backup/<action>',
]

Тогда ссылка будет:

<a href="<?= \yii\helpers\Url::to(['/db-backup/index']) ?>">Бэкап БД</a>

Примечания

  • Для Linux используются nice/ionice (если доступны).
  • Если gzip binary отсутствует, включается fallback: dump в .sql и потоковое сжатие через zlib.
  • Имя файла включает домен: example_com_YYYYmmdd_HHMMSS_jN.sql.gz.
  • Лог конкретной задачи пишется в @runtime/logs/db-backup-{jobId}.log.