ehsandevs/laravel-backup-restore

用于恢复由 spatie/laravel-backup 创建的数据库备份的软件包。

dev-master 2024-09-03 11:31 UTC

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

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

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