fin / user-backup-lib
Библиотека PHP для резервного копирования пользовательских данных из нескольких баз данных.
v2.1.0
2026-04-15 10:52 UTC
Requires
- php: ^8.0
- illuminate/database: ^8.0
- illuminate/support: ^8.0
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.6
This package is auto-updated.
Last update: 2026-04-15 11:10:23 UTC
README
Библиотека для резервного копирования пользовательских данных из нескольких баз данных с потоковой записью, чанковым шифрованием и опциональным удалением исходных данных.
Документация:
Возможности
- Потоковое чтение данных из БД без загрузки всего набора в память.
- Потоковая запись backup JSON в файл.
- Чанковое шифрование больших backup-файлов.
- Потоковое чтение backup-файлов через
streamBackupData(). - Объектный сценарий создания backup через
UserBackupCreateOptions. - Ручной сценарий создания backup-сервиса.
- Контейнерный сценарий через factory.
- Объектный сценарий очистки через
UserDataScope. - Очистка пользовательских данных после backup.
Важные границы
- Пакет ориентирован в первую очередь на MySQL-подобный сценарий.
- Generic restore внутри пакета сейчас не реализован.
- Raw rows таблиц остаются массивами, потому что схема таблиц динамическая.
- Runtime-параметры backup use case не должны резолвиться напрямую из контейнера без явного scope.
Установка
composer require fin/user-backup-lib
Packagist:
Быстрый старт
Ручной сценарий
use App\Services\UserBackupService; use App\ValueObjects\UserBackupCreateOptions; $options = UserBackupCreateOptions::fromLegacy( userId: 42, accountIds: [101, 102], activeIds: [501], ignoredTables: ['temp_logs'], connections: ['mysql', 'replica'], ); $backup = UserBackupService::createFromOptions($options);
Legacy-совместимый вариант:
use App\Services\UserBackupService; $backup = UserBackupService::create( userId: 42, accountIds: [101, 102], activeIds: [501], ignoredTables: ['temp_logs'], connections: ['mysql', 'replica'], ); $backup->fetchAllUserData(); $path = $backup->saveBackupToFile('/tmp/backup_42.json'); // вернется /tmp/backup_42.json.enc
Контейнерный сценарий
use App\Contracts\UserBackupServiceFactoryInterface; use App\ValueObjects\UserDataScope; $factory = app(UserBackupServiceFactoryInterface::class); $backup = $factory->make(new UserDataScope( userId: 42, accountIds: [101, 102], activeIds: [501], ignoredTables: ['temp_logs'], )); $backup->fetchAllUserData(); $path = $backup->saveBackupToFile(storage_path('app/backups/user-42.json'));
Legacy-совместимый вариант:
$backup = $factory->makeForUser( userId: 42, accountIds: [101, 102], activeIds: [501], ignoredTables: ['temp_logs'], );
Очистка данных
use App\Contracts\UserDataDeletionServiceInterface; use App\ValueObjects\UserDataScope; $cleaner = app(UserDataDeletionServiceInterface::class); $cleaner->deleteScope(new UserDataScope( userId: 42, accountIds: [101, 102], activeIds: [501], ignoredTables: ['temp_logs'], ));
Legacy-совместимый вариант:
$cleaner->deleteUserData( userId: 42, accountIds: [101, 102], activeIds: [501], ignoredTables: ['temp_logs'], );
Чтение backup
Полная расшифровка в массив
use App\Services\FileStorageService; $data = FileStorageService::decryptFile('/tmp/backup_42.json.enc');
Потоковое чтение
use App\Services\FileStorageService; $storage = new FileStorageService(); foreach ($storage->streamBackupData('/tmp/backup_42.json.enc') as $entry) { $table = $entry['table']; $row = $entry['row']; }
Совместимость форматов:
.jsonчитается потоково.- новый чанковый
.json.encчитается потоково. - legacy
.encподдерживается по совместимости, но не гарантирует ту же memory-efficiency на очень больших файлах.
Конфигурация
Пакетный конфиг: config/user-backup.php
return [ 'connections' => ['mysql', 'replica'], ];
Правила:
- если
user-backup.connectionsпуст, пакет берет все ключи изdatabase.connections; - для шифрования используется стандартный
APP_KEYLaravel; - путь сохранения backup выбирает приложение, не пакет.
- параметр
accountIdsв текущей интеграции проекта исторический и по факту содержит ids субсчетов.
Тесты
php -d pcov.enabled=1 vendor/bin/phpunit --coverage-text --coverage-html build/coverage
Текущее покрытие пакета: 100%.
Структура
src/Contracts/*— контракты сервисов и factory.src/Services/DatabaseService.php— потоковое чтение из БД.src/Services/FileStorageService.php— запись, шифрование и чтение backup-файлов.src/Services/UserBackupService.php— orchestration backup use case.src/Services/UserBackupServiceFactory.php— factory для container-friendly сценария.src/Services/UserDataDeletionService.php— очистка данных.src/ValueObjects/*— внутренние DTO/value objects.docs/user-backup-guide.md— полная документация.