wnx / laravel-backup-restore
一个用于恢复使用spatie/laravel-backup制作的数据库备份的包。
Requires
- php: ^8.2
- ext-zip: *
- illuminate/contracts: ^10.17.0 || ^11.0
- laravel/prompts: ^0.1.11
- spatie/laravel-backup: ^9.0
- spatie/laravel-package-tools: ^1.14.0
- spatie/temporary-directory: ^2.0
Requires (Dev)
- larastan/larastan: ^2.0.1
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.0 || ^7.0 || ^8.0
- orchestra/testbench: ^8.13 || ^9.0
- pestphp/pest: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- pestphp/pest-plugin-watch: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
README
一个用于恢复由spatie/laravel-backup包创建的数据库备份的包。
此包需要Laravel v10.17或更高版本和PHP 8.2或更高版本。
安装
您可以通过composer安装此包
composer require wnx/laravel-backup-restore
可选,您可以使用以下命令发布配置文件:
php artisan vendor:publish --tag="backup-restore-config"
这是发布配置文件的内容
return [ /** * Health checks are run after a given backup has been restored. * With health checks, you can make sure that the restored database contains the data you expect. * By default, we check if the restored database contains any tables. * * You can add your own health checks by adding a class that extends the HealthCheck class. * The restore command will fail, if any health checks fail. */ 'health-checks' => [ \Wnx\LaravelBackupRestore\HealthChecks\Checks\DatabaseHasTables::class, ], ];
使用方法
要恢复备份,请运行以下命令。
php artisan backup:restore
您将提示选择要恢复的备份以及是否应使用配置中的加密密码来解密备份。
此包依赖于现有的config/backup.php
-文件来查找您的备份、加密/解密密钥和数据库连接。
注意
默认情况下,备份的名称等于APP_NAME-env变量的值。恢复命令在具有该备份名称的文件夹中查找备份。请确保在运行命令的环境中APP_NAME的值是正确的。
可选命令选项
您可以直接传递磁盘、备份、数据库连接和解密密码到Artisan命令,以加快速度。
php artisan backup:restore --disk=s3 --backup=latest --connection=mysql --password=my-secret-password --reset
注意,我们使用了latest
作为--backup
的值。该命令将自动下载最新可用的备份并恢复其数据库。
--disk
查找备份的文件系统磁盘。默认为config/backup.php
中配置的第一个目标磁盘。
--backup
要恢复的备份文件的相对路径。使用latest
自动选择最新备份。
--connection
用于恢复备份的数据库连接。默认为config/backup.php
中配置的第一个源数据库连接。
--password
用于解密可能的加密备份的密码。默认为config/backup.php
中设置的加密密码。
--reset
在恢复备份之前重置数据库。默认为false
。
命令在开始恢复过程之前会要求确认。如果您在一个无法确认过程的环境(例如通过cronjob)中运行backup:restore
命令,则可以使用--no-interaction
选项来跳过问题。
php artisan backup:restore --disk=s3 --backup=latest --connection=mysql --password=my-secret-password --reset --no-interaction
健康检查
备份恢复后,此包将运行一系列健康检查以确保数据库已正确导入。默认情况下,此包将检查恢复后数据库是否有表。
您可以通过创建扩展Wnx\LaravelBackupRestore\HealthChecks\HealthCheck
类的类来添加您自己的健康检查。
namespace App\HealthChecks; use Wnx\LaravelBackupRestore\PendingRestore; use Wnx\LaravelBackupRestore\HealthChecks\HealthCheck; class MyCustomHealthCheck extends HealthCheck { public function run(PendingRestore $pendingRestore): Result { $result = Result::make($this); // We assume that your app generates sales every day. // This check ensures that the database contains sales from yesterday. $newSales = \App\Models\Sale::query() ->whereBetween('created_at', [ now()->subDay()->startOfDay(), now()->subDay()->endOfDay() ]) ->exists(); // If no sales were created yesterday, we consider the restore as failed. if ($newSales === false) { return $result->failed('Database contains no sales from yesterday.'); } return $result->ok(); } }
将您的健康检查添加到config/laravel-backup-restore.php
文件中的health-checks
-数组中。
'health-checks' => [ \Wnx\LaravelBackupRestore\HealthChecks\Checks\DatabaseHasTables::class, \App\HealthChecks\MyCustomHealthCheck::class, ],
使用GitHub Actions自动检查备份完整性
除了手动运行backup:restore
命令外,您还可以使用此包通过GitHub Actions定期测试备份的完整性。
下面的GitHub Actions工作流程可以通过GitHub UI手动触发(workflow_dispatch
触发)或按照计划自动运行(schedule
触发)。该工作流程启动一个空的MySQL数据库,克隆您的Laravel应用程序,设置PHP,安装composer依赖,并设置Laravel应用程序。然后,它将下载、解密并将最新可用的备份恢复到GitHub Actions工作流程运行中可用的MySQL数据库。在工作流程完成之前,数据库将被清除。
请注意,我们将几个环境变量传递给backup:restore
命令。其中大部分值已声明为GitHub Action机密。通过使用机密,我们的AWS密钥不会在工作流程日志中泄露。
如果恢复命令失败,整个工作流程将失败,您将收到GitHub的通知。这显然只是一个起点。您可以为工作流程添加更多步骤,例如,如果恢复成功或失败,则通过Slack通知您。
name: Validate Backup Integrity on: # Allow triggering this workflow manually through the GitHub UI. workflow_dispatch: schedule: # Run workflow automatically on the first day of each month at 14:00 UTC # https://crontab.guru/#0_14_1_*_* - cron: "0 14 1 * *" jobs: restore-backup: name: Restore backup runs-on: ubuntu-latest services: # Start MySQL and create an empty "laravel"-database mysql: image: mysql:latest env: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: laravel ports: - 3306:3306 options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - name: Checkout code uses: actions/checkout@v3 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: 8.2 - uses: ramsey/composer-install@v2 - run: cp .env.example .env - run: php artisan key:generate # Download latest backup and restore it to the "laravel"-database. # By default the command checks, if the database contains any tables after the restore. # You can write your own Health Checks to extend this feature. - name: Restore Backup run: php artisan backup:restore --backup=latest --no-interaction env: APP_NAME: 'Laravel' DB_PASSWORD: 'password' AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }} AWS_BACKUP_BUCKET: ${{ secrets.AWS_BACKUP_BUCKET }} BACKUP_ARCHIVE_PASSWORD: ${{ secrets.BACKUP_ARCHIVE_PASSWORD }} # Wipe database after the backup has been restored. - name: Wipe Database run: php artisan db:wipe --no-interaction env: DB_PASSWORD: 'password'
测试
该软件包附带一个全面的测试套件。要运行它,您需要在您的系统上安装MySQL、PostgreSQL和sqlite。
composer test
对于MySQL和PostgreSQL,该软件包期望存在一个名为laravel_backup_restore
的数据库,并且它可以无密码访问root
用户。
您可以通过传递ENV变量到运行测试的shell命令来更改用户、密码和数据库名称……或者根据需要更改本地的设置。有关详细信息,请参阅TestCase。
使用Testbench进行测试
您可以使用testbench
调用backup:restore
命令来测试命令,就像在Laravel应用程序中测试一样。
vendor/bin/testbench backup:restore --disk=remote
变更日志
请参阅变更日志以获取有关最近更改的更多信息。
贡献
请参阅贡献指南以获取详细信息。
安全漏洞
请参阅我们的安全策略以了解如何报告安全漏洞。
鸣谢
许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。