【Laravel】LaravelのソースもDBも簡単にバックアップが取れる「spatie/laravel-backup」

# LaravelのソースもDBもバックアップを取る

毎日、DBのバックアップが取りたかったのでLaravel用のライブラリで何かないかなーとを探していたら
[spatie/laravel-backup](https://github.com/spatie/laravel-backup/)というのを見つけたので使ってみました。

# インストール

## composerからインストール

最新版の`v6`をインストールするには以下のコマンドを実行

```
$ composer require spatie/laravel-backup
```

ただ、最新版の`v6`は、**PHP7.2**以上かつ**Laravel5.8**以上を要求してくるので、もしLTSの**Laravel5.5**系のサービスに入れる場合は`v5`を指定するようにします。

`v5`をインストールする場合は以下のように指定

```
$ composer require "spatie/laravel-backup:5.*"
```

ここでは基本的に`v5`を入れた状態で書いていきます

https://github.com/spatie/laravel-backup/tree/v5

## `config/backup.php`生成

以下のコマンドを実行

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

すると、`config`ディレクトリ以下に`backup.php`が生成される


# バックアップコマンドを実行する

## まるっとソースごと全部バックアップ

```
$ php artisan backup:run
```

**※この状態で特に通知先の設定をしていないとエラーがでます。**

## 通知機能無効オプション

```
$ php artisan backup:run --disable-notifications
```

## DBのみバックアップ

```
$ php artisan backup:run --only-db
```

## DBのみバックアップ（通知機能無効）

```
$ php artisan backup:run --only-db --disable-notifications
```

# バックアップ時の通知先（メール）設定

メールの設定をする場合は`mail`の`to`に通知先のメールアドレスを設定すれば毎回バックアップコマンドを実行した際にメールが飛ぶようになります。
（※メール送信設定している前提）

```config/backup.php
        /*
         * Here you can specify the notifiable to which the notifications should be sent. The default
         * notifiable will use the variables specified in this config file.
         */
        'notifiable' => \Spatie\Backup\Notifications\Notifiable::class,

        'mail' => [
            'to' => 'your@example.com',
        ],
```

通知先に複数のメールアドレスを設定する場合は以下のように書いて、メールアドレスを`.env`に書くようにすれば後々の追加も楽かなと

```config/backup.php
        'mail' => [
            'to' => array_map('trim', explode(',', env('NOTIFICATIONS_MAIL_ADDRESS'))),
        ],
```

`.env`ファイルに`,`区切りで記述

```.env
NOTIFICATIONS_MAIL_ADDRESS=hoge@example.com,test@example.com
```

# 古いバックアップのクリーンアップ

```
$ php artisan backup:clean
```

## 詳細設定

以下の部分を適切に設定する

```config/backup.php
    'cleanup' => [
        /*
         * The strategy that will be used to cleanup old backups. The default strategy
         * will keep all backups for a certain amount of days. After that period only
         * a daily backup will be kept. After that period only weekly backups will
         * be kept and so on.
         *
         * No matter how you configure it the default strategy will never
         * delete the newest backup.
         */
        'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,

        'defaultStrategy' => [

            /*
             * The number of days for which backups must be kept.
             * （バックアップを保持する必要がある日数）
             */
            'keepAllBackupsForDays' => 31,

            /*
             * The number of days for which daily backups must be kept.
             * （日次バックアップを保持する必要がある日数）
             */
            'keepDailyBackupsForDays' => 31,

            /*
             * The number of weeks for which one weekly backup must be kept.
             * （週1回のバックアップを保持する必要がある週数）
             */
            'keepWeeklyBackupsForWeeks' => 8,

            /*
             * The number of months for which one monthly backup must be kept.
             * （毎月1回のバックアップを保存する月数）
             */
            'keepMonthlyBackupsForMonths' => 4,

            /*
             * The number of years for which one yearly backup must be kept.
             * （年1回のバックアップを保持する必要がある年数）
             */
            'keepYearlyBackupsForYears' => 2,

            /*
             * After cleaning up the backups remove the oldest backup until
             * this amount of megabytes has been reached.
             * （バックアップをクリーンアップした後、このメガバイト数に達しています（？））
             */
            'deleteOldestBackupsWhenUsingMoreMegabytesThan' => 5000,
        ],
    ],
```

クリーンアップのルールとしては以下の通りです。

```
This package provides an opinionated method to determine which old backups should be deleted. We call this the DefaultStrategy. This is how it works:

Rule #1: it will never delete the latest backup regardless of its size or age
Rule #2: it will keep all backups for the number of days specified in keepAllBackupsForDays
Rule #3: it will only keep daily backups for the number of days specified in keepDailyBackupsForDays for all backups older than those covered by rule #2
Rule #4: it will only keep weekly backups for the number of months specified in keepMonthlyBackupsForMonths for all backups older than those covered by rule #3
Rule #5: it'll only keep yearly backups for the number of years specified in keepYearlyBackupsForYears for all backups older than those covered by rule #4
Rule #6: it will start deleting old backups until the volume of storage used is lower than the amount specified in deleteOldestBackupsWhenUsingMoreMegabytesThan.

Of course the numbers used in the default configuration can be adjusted to suit your own needs.
```

以下[みらい翻訳](https://miraitranslate.com/trial/)

```
このパッケージには、削除する必要のある古いバックアップを判断するための独自の方法が用意されています。これをDefaultStrategyと呼びます。その仕組みは次のとおりです。

ルール1:サイズや経過時間にかかわらず、最新のバックアップを削除しない
ルール#2:keepAllBackupsForDaysで指定された日数の間、すべてのバックアップを保持します。
ルール#3:ルール#2の対象よりも古いすべてのバックアップについて、keepDailyBackupsForDaysで指定された日数の日次バックアップのみが保持されます。
ルール#4:ルール#3の対象よりも古いすべてのバックアップについて、keepMonthlyBackupsForMonthsで指定された月数の間だけ週単位のバックアップを保持する
ルール#5:ルール#4の対象よりも古いすべてのバックアップについて、keepYearlyBackupsForYearsで指定された期間だけ毎年バックアップを保持します。
ルール6:使用されるストレージのボリュームがd e l e O l d e stBackupsWhenUsingMoreMegabytesThanで指定された量より少なくなるまで、古いバックアップの削除を開始します。

もちろん、デフォルト設定で使用されている数値は、必要に応じて調整できます。
```


（正直この設定に関してはよくわかっていないので詳しい方教えてください。。）

# 定期的にバックアップを実行する（cronの設定）

`app\Console\Kernel.php`以下の`schedule`メソッドへコマンドを実行するように記述し、サーバー側でcronの設定を行えば定期的にバックアップを実行するようにできます

```app\Console\Kernel.php
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('backup:clean');
        $schedule->command('backup:run --only-db');
    }
```

以下cron設定（実行間隔はサーバーによって設定可否が異なるので省略）

```cron
php /your-project-path/artisan schedule:run >> /dev/null 2>&1
```

以下等参考にしてください。

- [タスクスケジュール 5.5 Laravel](https://readouble.com/laravel/5.5/ja/scheduling.html)

**※レンタルサーバーによってはシェルスクリプトしか実行できなかったりするので注意してください。**

# 参考URL

- [Laravel Backupを使う | つくるログ](http://shingaki.me/web/laravel-backup%E3%82%92%E4%BD%BF%E3%81%86/)
- [Cleaning up old backups | Laravel Backup Docs](https://docs.spatie.be/laravel-backup/v5/cleaning-up-old-backups/overview)
- [Laravel 数据库及项目文件自动备份指北 (spatie/Laravel-backup) | Laravel China 社区 - 高品质的 Laravel 开发者社区](https://learnku.com/articles/16185/laravel-database-and-project-code-automatic-backup-spatielaravel-backup)
- [Laravel5.4でバックアップ「spatie/laravel-backup」 一言多いプログラマーの独り言](https://programmer-jobs.blogspot.com/2017/02/laravel-5-4-spatie-laravel-backup.html)
- [Laravelの.envでArrayを使う方法 - Qiita](https://qiita.com/lara_bell/items/925a1b67ba658652d37c)