ehsandevs / laravel-backup-restore
用于恢复由 spatie/laravel-backup 创建的数据库备份的软件包。
Requires
- php: ^7.3|^8.0
- ext-zip: *
- illuminate/contracts: ^8.0|^9.0|^10.0
- spatie/laravel-backup: ^7.8
- spatie/laravel-package-tools: ^1.12.0|^1.14.0
- spatie/temporary-directory: ^2.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.0 || ^7.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0 || ^8.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- pestphp/pest-plugin-watch: 1.x-dev
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.6 || ^10.0
This package is auto-updated.
Last update: 2024-09-03 11:33:07 UTC
README
由于与 composer 依赖冲突,从 v1.0.2 的 stefanzweifel/laravel-backup-restore 分支进行分支,stefanzweifel/laravel-backup-restore
用于恢复由 spatie/laravel-backup 包创建的数据库备份的软件包。
安装
您可以通过 composer 安装此软件包。
composer require ehsandevs/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' => [ \Ehsandevs\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
健康检查
在备份已恢复后,该软件包将运行一系列健康检查以确保数据库已正确导入。默认情况下,该软件包将检查恢复后数据库是否有表。
您可以通过创建扩展 Ehsandevs\LaravelBackupRestore\HealthChecks\HealthCheck
类的类来添加自己的健康检查。
namespace App\HealthChecks; use Ehsandevs\LaravelBackupRestore\PendingRestore; use Ehsandevs\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' => [ \Ehsandevs\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。
变更日志
请参阅变更日志以获取有关最近更改的更多信息。
贡献
请参阅贡献指南以获取详细信息。
安全漏洞
请审查我们的安全策略,了解如何报告安全漏洞。
鸣谢
许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。