Laravel自动备份到阿里云OSS

背景

之前做备份时,主要是拿一台备份机对生产机做数据库做主备,用rsync同步上传的图片,文件。随着项目的增多,许多小项目都这样做感觉太过繁琐,每次都要在2台机器之间配置,同时单独拿一台机器做备份成本也挺高。后来发现阿里云OSS的冷冻OSS一年100G也不过几十块,用它备份更便宜也更便捷,于是对于小项目便改用更简单的方法:Laravel定期将数据库和文件打包备份到阿里云OSS(其他的云存储比如亚马逊家的也可以)

刚好Laravel都有直接支持的包,于是接下来的工作就是安装好包,做下配置即可。

配置过程

配置阿里云OSS驱动

先安装jacobcyl/ali-oss-storage,确保文件系统可以直接访问阿里云OSS

composer require jacobcyl/ali-oss-storage

修改config/filesystems.php,在disks下面增加oss的配置

// config/filesystems.php
        'oss' => [
            'driver' => 'oss',
            'access_id' => env('OSS_ACCESS_ID'),
            'access_key' => env('OSS_ACCESS_KEY'),
            'bucket' => env('OSS_BUCKET'),
            'endpoint' => env('OSS_ENDPOINT'),
            'ssl' => true,
            'isCName' => false,
            'debug' => false
        ],

然后在.env中配置好实际的OSS参数

OSS_ACCESS_ID=LTAIgon****** # 测试参数,请替换成自己的实际参数
OSS_ACCESS_KEY=k6JDKL6vmz*************** # 浿参数,请替换成自己的实际参数
OSS_BUCKET=my-backup
OSS_ENDPOINT="oss-us-west-1.aliyuncs.com"

在命令行下,测试下OSS是否正常工作

$php artisan tinker # 进入tinker,将出现如下命令行
>>> Storage::disk('oss')->put('temp.txt', 'ok');
=> true # 表示成功
>>>

如果测试成功,在阿里云的控制面板下也应该能找到该文件。如果测试不成功,请调整下自己的参数,重新php artisan tinker测试下。

备份配置

安装spatie/laravel-backup(官方出到6.x版本,但实测只能列出本地备份,无法列出oss备份,原因不明,故仍然使用5.x版本)

composer require "spatie/laravel-backup:^5.0.0"

生成配置文件config/backup.php

php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"

修改config/backup.php,为避免冗长,只列出建议修改的地方,重点关注注释说明

<?php  
 
return [
    'backup' => [
        'name' => config('app.name') . '-' .  config('app.url'), // 名称建议按这样改,免得布署多个同样项目时相互覆盖
        // 省略其他配置...
        'destination' => [
            'filename_prefix' => '',
            'disks' => [
                'local', // local可以删除不要
                'oss', // 重点:在此处添加oss
            ],
        ],
    ],
    'monitorBackups' => [
        [
            'name' => config('app.name') . '-' .  config('app.url'), // 名字与backup一致
            'disks' => ['local', 'oss'], // 配置与backup的disks一致
            // ...
        ],
    ],
    // 下面配置直接照抄即可,执行backup:cleanup时清空旧备份的配置
    'cleanup' => [
        'defaultStrategy' => [
            'keepAllBackupsForDays' => 3,
            'keepDailyBackupsForDays' => 5,
            'keepWeeklyBackupsForWeeks' => 2,
            'keepMonthlyBackupsForMonths' => 1,
            'keepYearlyBackupsForYears' => 1,
        ],
    ]
];

然后执行php artisan backup:run备份,看到对应的输出就知道备份成功了.

$php artisan backup:run
php artisan backup:run                       
Starting backup...                          
Dumping database paygw...                    
Determining files to backup...              
Zipping 316 files...                        
Created zip containing 316 files. Size is 15.72 MB                                        
Copying zip to disk named local...          
Successfully copied zip to disk named local. 
Copying zip to disk named oss...            
Successfully copied zip to disk named oss.

同时在storage/app/可以找到对应的备份文件。平时想自己备份,执行下该命令就行了。

不过,我们的目标是自动备份,还需要修改app/Console/Kernel.php,修改schedule函数,配置为每天自动备份一次,并删除旧的备份.

class Kernel extends ConsoleKernel
{
    // ...
     protected function schedule(Schedule $schedule)
    {
        // ...
        $schedule->command('backup:run')->daily()->at('02:00');
        $schedule->command('backup:clean')->daily()->at('03:00');
    }
}

请确保php artisan schedule:run有在crontab中定期执行。

这样子就配置完了。

在备份过程中,总是想了解下备份情况,除了直接登陆OSS去看文件在不在以外,还可以直接通过php artisan backup:list了解备份情况,它会列出不同磁盘的备份情况,由下图所示。
关于下图有2个注意点:

  1. 需要特别注意,下图的Reachable一定要是绿色的打勾状态,
  2. Disk那一列,要能看到oss。其他的字段有兴趣的自行了解。

扩展配置:通过Nova在WEB管理备份

通过命令行已经可以很好地了解备份状态,不过对于非开发者,有时需要提供他们WEB界面管理这些备份。这时spatie/nova-backup-tool就派上用场了。
不过这个包对依赖要求很高,必须是php 7.2以上,以及spatie/laravel-backup的版本在v6以上,前面已经提到v6版本测试有些问题,所以目前在生产环境中我也没用上这个管理后台。有兴趣的可以自己试下能否正常工作。

参考资料

nova backup tool
spatie/laravel-backup

posted @ 2019-08-11 20:25  枫叶落一地  阅读(805)  评论(0编辑  收藏  举报