[Laravel]Gitを使わずアプリケーションを簡単にバックアップする

#はじめに
パッケージ**「`laravel-backup`」**を使用すれば、ソースファイルやDBのバックアップが可能になるという記事を見て面白そうだと思い、バックアップするまでの一連の流れを記事にしました。デフォルトでは、バックアップの保存先はローカルに設定されていますが任意の場所に保存も可能なため、おまけとしてS3での保存方法も記載しています。

#環境
* PHP 7.3
* Laravel 8.27

※PHPやLaravelのバージョンによって使用するlaravel-backupのバージョンが異なってきます。
詳しくは[こちら](https://github.com/spatie/laravel-backup)を参照してください。


#インストールとセットアップ
ここではlaravel-backupをインストールした後に、バックアップの設定を行います。

##インストール
laravel-backupをインストールします。

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

##設定ファイル作成
設定ファイル`config/backup.php`を作成するために、下記コマンドを実行してください。

```
$ php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
Copied File [/vendor/spatie/laravel-backup/config/backup.php] To [/config/backup.php]
Copied Directory [/vendor/spatie/laravel-backup/resources/lang] To [/resources/lang/vendor/backup]
Publishing complete.
```

実行結果として
`config/backup.php`と`resources/lang/vendor/backup`が生成されます。
ちなみに`resources/lang/vendor/backup`配下にはバックアップ失敗などで通知メッセージを送る際の言語ファイルが用意されています。言語ファイルは20カ国以上あり、日本語翻訳バージョンも用意されています。

##バックアップ保存先の変更
バックアップの保存先は`config/backup.php`の`disks`で設定されています。
今回はデフォルトのlocalで進めます。

```:config/backup.php
<?php
return [
    'backup' => [
        (省略)
        'destination' => [
            (省略)
            /*
             * The disk names on which the backups will be stored.
             */
            'disks' => [
                'local', //ここで設定
            ],
        ],
        (省略)
    ],
];
```

disksに設定のlocalは`config/filesystems.php`のdisksと対応しています。

```:config/filesystems.php
<?php
return [
    (省略)
    'disks' => [
        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],
        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],
        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
            'endpoint' => env('AWS_ENDPOINT'),
        ],
        (省略)
    ],
];
```

##通知先の設定
バックアップ実行時に通知あり/なしを指定できます(コマンドにて)。通知を指定した際に送信元、通知先が未設定だとエラーが発生しますので必ず設定する必要があります。設定ファイルは`config/backup.php`になります。

```config/backup.php
'notifications' => [

    // 省略

    'mail' => [
        // 通知先のメールアドレス
        'to' => 'your@example.com',

        // 送信元
        'from' => [
            'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
            'name' => env('MAIL_FROM_NAME', 'Example'),
        ],
    ],
```

通知設定についてはこちらの記事が参考になると思います。
参考：[Laravelメール送信機能の実装でmailtrapやGmailのSMTPサーバーを使ってみる](https://qiita.com/KZ-taran/items/ffa60ac6353bc4dcc759)

#バックアップ実行
バックアップのコマンドを確認したあとに、実行したいと思います。

##バックアップのコマンドの確認

```
$ php artisan list

backup
  backup:clean         Remove all backups older than specified number of days in config.
  backup:list          Display a list of all backups.
  backup:monitor       Monitor the health of all backups.
  backup:run           Run the backup.
```

##バックアップ（全て）

```
$ php artisan backup:run

Starting backup...
Dumping database LaravelBackup...
Determining files to backup...
Zipping 228 files and directories...
Created zip containing 228 files and directories. Size is 618.99 KB
Copying zip to disk named local...
Successfully copied zip to disk named local.
Backup completed!
```
成功していれば、`storage/app/〇〇`にzipファイルが作成されています。（〇〇は`.env`ファイルのAPP_NAMEが入るはず）

##バックアップ（DBのみ）

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

##バックアップ（ファイルのみ）

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

##バックアップ（通知無効）

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

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

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

##バックアップ（ファイルのみ通知無効）

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

#おまけ
ローカル(storage/app/)に長期で保存すると容量の問題等から、別の場所に保存する方が良いかもしれません。今回、新しい保存先としてAWSのS3で設定する方法も紹介します。

※AWS,S3バケットの準備方法は省略しています。
詳しく知りたい方はこちらを参照すると良いと思います。
参考：[Laravelをバックアップ！定期的にDBやファイルをAWSへ保存する](https://blog.capilano-fw.com/?p=8045)

##AWS情報を設定ファイルに記載
AWSで取得した情報を`.env`ファイルに下記を追加

```:.env
AWS_DEFAULT_REGION=****** // リージョンを記載
AWS_BUCKET=****** // バケット名を記載
AWS_ACCESS_KEY_ID=****** //アクセスキーを記載
AWS_SECRET_ACCESS_KEY=****** //シークレットアクセスキーを記載

```

##ストレージパッケージをインストール
S3へアップロードできるようにパッケージをインストールします。

```
composer require league/flysystem-aws-s3-v3:"^1.0"
```

##保存先の変更
localからs3に変更してあげます。

```:config/backup.php
'destination' => [
            (省略)
            /*
             * The disk names on which the backups will be stored.
             */
            'disks' => [
                // 'local',
                's3',
            ],
        ],
```

##バックアップ実行

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

Determining files to backup...
Zipping 231 files and directories...
Created zip containing 231 files and directories. Size is 2.29 MB
Copying zip to disk named s3...
Successfully copied zip to disk named s3.
Backup completed!
```

S3を確認すると・・・
![スクリーンショット 2021-02-13 21.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554111/be1a5665-1c14-33ce-6502-2f05aaf2f37e.png)
きちんとバックアップ取れていました！

#参考先
* [laravel-backup](https://github.com/spatie/laravel-backup)
* [Laravelメール送信機能の実装でmailtrapやGmailのSMTPサーバーを使ってみる](https://qiita.com/KZ-taran/items/ffa60ac6353bc4dcc759)
* [Laravelをバックアップ！定期的にDBやファイルをAWSへ保存する](https://blog.capilano-fw.com/?p=8045)
* [laravel-backupを利用して、DBのバックアップを生成](https://www.wakuwakubank.com/posts/558-laravel-backup/)
* [【Laravel】LaravelのソースもDBも簡単にバックアップが取れる「spatie/laravel-backup」](https://qiita.com/sola-msr/items/87205c592c47d12df1b0)