wnx/laravel-backup-restore

一个用于恢复使用spatie/laravel-backup制作的数据库备份的包。

v1.4.1 2024-08-20 18:44 UTC

This package is auto-updated.

Last update: 2024-09-20 19:04:31 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

一个用于恢复由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)。请参阅许可证文件以获取更多信息。