Setup Auto Backup Database Aplikasi Laravel
Berikut alur proses setup auto backup database aplikasi laravel menggunakan package spatie/laravel-backup.
1. Siapkan storage S3 atau sejenisnya
Gunakan layanan storage eksternal seperti AWS S3 atau Cloudflare R2.
Install package
league/flysystem-aws-s3-v3composer require league/flysystem-aws-s3-v3Siapkan pilihan disk baru pada
config/filesystems.php, bisa diberikan namar2_backup.php'r2_backup' => [ 'driver' => 's3', 'key' => env('R2_BACKUP_ACCESS_KEY_ID'), 'secret' => env('R2_BACKUP_SECRET_ACCESS_KEY'), 'region' => env('R2_BACKUP_REGION', 'auto'), 'bucket' => env('R2_BACKUP_BUCKET'), 'url' => env('R2_BACKUP_URL'), 'endpoint' => env('R2_BACKUP_ENDPOINT'), 'use_path_style_endpoint' => env('R2_BACKUP_USE_PATH_STYLE_ENDPOINT', false), 'visibility' => env('R2_BACKUP_VISIBILITY', 'private'), 'retries' => (int) env('R2_BACKUP_RETRIES', 10), 'http' => [ 'connect_timeout' => 30, 'timeout' => 600, ], 'throw' => true, ],.env disk
r2_backupenvR2_BACKUP_ACCESS_KEY_ID= R2_BACKUP_SECRET_ACCESS_KEY= R2_BACKUP_BUCKET="backup-db" R2_BACKUP_ENDPOINT=
2. Install spatie/laravel-backup
Ini poin pentingnya.
install package, dengan run:
bashcomposer require spatie/laravel-backuppublish config dengan run:
bashphp artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider" --tag=backup-configuntuk terjemahan notifikasi backup, bisa publish dengan run (opsional):
bashphp artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider" --tag=backup-translations
Sesuaikan config/backup.php, edit yang dibutuhkan saja, berikut beberapa config key yang dibutuhkan untuk penyesuaian.
timestamp file dump
php'database_dump_file_timestamp_format' => 'Y-m-d-H-i-s'extenstion file hasil dump
php'database_dump_file_extension' => 'backup',prefix file
php'filename_prefix' => env('DB_DATABASE').'_'.env('APP_ENV').'_'disk, tempat dimana backup akan disimpan, bisa multi disk.
php'disks' => [ 'r2_backup', //local, //s3_aws ],Monitoring Backup, sesuaikan disknya.
php'monitor_backups' => [ [ 'name' => env('APP_NAME', 'laravel-backup'), 'disks' => ['r2_backup'], 'health_checks' => [ MaximumAgeInDays::class => 1, MaximumStorageInMegabytes::class => 5000, // 5GB ], ], ],Notifikasi via email (default), direkomendasikan pakai env value.
php'mail' => [ 'to' => env('BACKUP_NOTIFICATION_EMAIL', '[email protected]'), 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', '[email protected]'), 'name' => env('MAIL_FROM_NAME', 'Example'), ], ],
Tambahkan route di routes/console.php
// backup database
Schedule::command('backup:clean')->daily()->at('01:00')->withoutOverlapping();
Schedule::command('backup:run --only-db')->daily()->at('01:30')->withoutOverlapping();
Schedule::command('backup:monitor')->daily()->at('02:00')->withoutOverlapping();3. Notifikasi
Secara default notifikasi via email, melalui config
mail.Opsional, tambahkan channel
discorddengan install package spatie/laravel-discord-alerts.phpcomposer require spatie/laravel-discord-alertssetup variable
DISCORD_ALERT_WEBHOOKpada .env, isinya berupawebhook_urldari aplikasi discord.setup channel
discordpadaconfig/backup.php.php'discord' => [ 'webhook_url' => env('DISCORD_ALERT_WEBHOOK'), /* * If this is an empty string, the name field on the webhook will be used. */ 'username' => '', /* * If this is an empty string, the avatar on the webhook will be used. */ 'avatar_url' => '', ],tambahkan channel notifikasi
discord
'notifications' => [
'notifications' => [
// config lama
BackupHasFailedNotification::class => ['mail'],
UnhealthyBackupWasFoundNotification::class => ['mail'],
CleanupHasFailedNotification::class => ['mail'],
BackupWasSuccessfulNotification::class => ['mail'],
HealthyBackupWasFoundNotification::class => ['mail'],
CleanupWasSuccessfulNotification::class => ['mail'],
// sesuaikan menjadi:
BackupHasFailedNotification::class => ['mail', 'discord'],
UnhealthyBackupWasFoundNotification::class => ['mail', 'discord'],
CleanupHasFailedNotification::class => ['mail', 'discord'],
BackupWasSuccessfulNotification::class => ['mail', 'discord'],
HealthyBackupWasFoundNotification::class => ['mail', 'discord'],
CleanupWasSuccessfulNotification::class => ['mail', 'discord'],
],
].env untuk notifikasi
envBACKUP_NOTIFICATION_EMAIL="[email protected]" DISCORD_ALERT_WEBHOOK="webhook url..."
Testing local
php artisan backup:run --only-dbSelamat mencoba.