Backup Project Laravel-mu dengan Bantuan Package spatie/laravel-backup
Halo teman-teman, kembali lagi pada series ngoding Laravel. Okay, kali ini aku bakal ngenalin salah satu package keren dari spatie yang bernama laravel-backup. Package ini dapat mempermudah developer untuk menjalankan proses backup project, baik itu dari sisi source code maupun database dump. Melakukan backup project dan database secara berkala sangat penting untuk memastikan keamanan dan kelangsungan data.
Dengan backup, kalian dapat menghindari kerugian data akibat gangguan seperti kegagalan perangkat keras, serangan malware, atau kesalahan manusia. Selain itu, backup memungkinkan pemulihan cepat setelah insiden, membantu mempertahankan kelancaran operasional dan mengurangi downtime. Backup juga penting untuk kepatuhan terhadap regulasi dan standar industri yang mewajibkan penyimpanan data yang aman dan teratur.
Baik, langsung saja kita mulai dari instalasi package spatie/laravel-backup.
composer require spatie/laravel-backup
Setelah itu, kita akan publish config file dari package yang sudah kita install. Jalankan command di bawah ini.
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
Setelah menjalankan command diatas, kalian akan mendapatkan 1 file di folder config
yang bernama backup.php
, 1 folder vendor
di dalam folder lang
yang berisikan banyak folder dengan file bahasa masing-masing untuk alih bahasa notifikasi yang akan dikirimkan oleh package ini sesuai action yang ada. Default content dari file backup.php
adalah sebagai berikut.
return [
'backup' => [
/*
* The name of this application. You can use this name to monitor
* the backups.
*/
'name' => env('APP_NAME', 'laravel-backup'),
'source' => [
'files' => [
/*
* The list of directories and files that will be included in the backup.
*/
'include' => [
base_path(),
],
/*
* These directories and files will be excluded from the backup.
*
* Directories used by the backup process will automatically be excluded.
*/
'exclude' => [
base_path('vendor'),
base_path('node_modules'),
],
/*
* Determines if symlinks should be followed.
*/
'follow_links' => false,
/*
* Determines if it should avoid unreadable folders.
*/
'ignore_unreadable_directories' => false,
/*
* This path is used to make directories in resulting zip-file relative
* Set to `null` to include complete absolute path
* Example: base_path()
*/
'relative_path' => null,
],
/*
* The names of the connections to the databases that should be backed up
* MySQL, PostgreSQL, SQLite and Mongo databases are supported.
*
* The content of the database dump may be customized for each connection
* by adding a 'dump' key to the connection settings in config/database.php.
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'excludeTables' => [
* 'table_to_exclude_from_backup',
* 'another_table_to_exclude'
* ]
* ],
* ],
*
* If you are using only InnoDB tables on a MySQL server, you can
* also supply the useSingleTransaction option to avoid table locking.
*
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'useSingleTransaction' => true,
* ],
* ],
*
* For a complete list of available customization options, see https://github.com/spatie/db-dumper
*/
'databases' => [
'mysql',
],
],
/*
* The database dump can be compressed to decrease diskspace usage.
*
* Out of the box Laravel-backup supplies
* Spatie\DbDumper\Compressors\GzipCompressor::class.
*
* You can also create custom compressor. More info on that here:
* https://github.com/spatie/db-dumper#using-compression
*
* If you do not want any compressor at all, set it to null.
*/
'database_dump_compressor' => null,
/*
* The file extension used for the database dump files.
*
* If not specified, the file extension will be .archive for MongoDB and .sql for all other databases
* The file extension should be specified without a leading .
*/
'database_dump_file_extension' => '',
'destination' => [
/*
* The filename prefix used for the backup zip file.
*/
'filename_prefix' => '',
/*
* The disk names on which the backups will be stored.
*/
'disks' => [
'local',
],
],
/*
* The directory where the temporary files will be stored.
*/
'temporary_directory' => storage_path('app/backup-temp'),
/*
* The password to be used for archive encryption.
* Set to `null` to disable encryption.
*/
'password' => env('BACKUP_ARCHIVE_PASSWORD'),
/*
* The encryption algorithm to be used for archive encryption.
* You can set it to `null` or `false` to disable encryption.
*
* When set to 'default', we'll use ZipArchive::EM_AES_256 if it is
* available on your system.
*/
'encryption' => 'default',
],
/*
* You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'.
* For Slack you need to install laravel/slack-notification-channel.
*
* You can also use your own notification classes, just make sure the class is named after one of
* the `Spatie\Backup\Notifications\Notifications` classes.
*/
'notifications' => [
'notifications' => [
\Spatie\Backup\Notifications\Notifications\BackupHasFailedNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFoundNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\CleanupHasFailedNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\BackupWasSuccessfulNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\HealthyBackupWasFoundNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\CleanupWasSuccessfulNotification::class => ['mail'],
],
/*
* 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',
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
],
'slack' => [
'webhook_url' => '',
/*
* If this is set to null the default channel of the webhook will be used.
*/
'channel' => null,
'username' => null,
'icon' => null,
],
'discord' => [
'webhook_url' => '',
/*
* 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' => '',
],
],
/*
* Here you can specify which backups should be monitored.
* If a backup does not meet the specified requirements the
* UnHealthyBackupWasFound event will be fired.
*/
'monitor_backups' => [
[
'name' => env('APP_NAME', 'laravel-backup'),
'disks' => ['local'],
'health_checks' => [
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1,
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000,
],
],
/*
[
'name' => 'name of the second app',
'disks' => ['local', 's3'],
'health_checks' => [
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1,
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000,
],
],
*/
],
'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,
'default_strategy' => [
/*
* The number of days for which backups must be kept.
*/
'keep_all_backups_for_days' => 7,
/*
* The number of days for which daily backups must be kept.
*/
'keep_daily_backups_for_days' => 16,
/*
* The number of weeks for which one weekly backup must be kept.
*/
'keep_weekly_backups_for_weeks' => 8,
/*
* The number of months for which one monthly backup must be kept.
*/
'keep_monthly_backups_for_months' => 4,
/*
* The number of years for which one yearly backup must be kept.
*/
'keep_yearly_backups_for_years' => 2,
/*
* After cleaning up the backups remove the oldest backup until
* this amount of megabytes has been reached.
*/
'delete_oldest_backups_when_using_more_megabytes_than' => 5000,
],
],
];
Kalian bisa kustomisasi file diatas sesuai kebutuhan kalian. Opsi penyimpanan backup dapat kalian sesuaikan juga sesuai kebutuhan kalian, bisa menggunakan default local storage atau integrasi ke s3 (pada tulisan ini saya menggunakan penyimpanan local pada project). Package ini juga sudah mendukung notification channel selain mail (Slack dan Discord).
Langkah berikutnya adalah menambahkan kode di bawah ini pada file database.php
.
...
'mysql' => [
'driver' => 'mysql',
...
'dump' => [
'dump_binary_path' => '/path/to/local/bin/mysql', // only the path, so without `mysqldump` or `pg_dump`
'use_single_transaction',
'timeout' => 60 * 5, // 5 minute timeout
]
],
...
mysqldump
digunakan untuk mem-backup database MySQL. pg_dump
digunakan untuk men-dump database PostgreSQL. Jika binary ini tidak terinstal di lokasi default, kalian dapat menambahkan kunci bernama dump.dump_binary_path
di file konfigurasi database.php
milik Laravel . Isi hanya dengan path ke binary tersebut. Jangan sertakan nama binary-nya
Jika dump database kalian memakan waktu yang lama, kalian mungkin melebihi batas waktu default selama 60 detik. Kalian dapat mengatur batas waktu yang lebih tinggi (atau lebih rendah) dengan menyediakan kunci konfigurasi dump.timeout
yang menentukan, dalam detik, berapa lama perintah dapat berjalan.
Langkah berikutnya adalah kita coba jalankan command untuk melakukan backup. Berikut merupakan command dan hasil menjalankan command.
php artisan backup:run
Jika berhasil, kalian juga akan mendapatkan notifikasi email seperti di bawah ini.
Hasil dari backup dapat kalian lihat di folder storage/app
.
Keren banget bukan? Oiya kalian juga bisa melakukan monitoring terhadap jumlah backup yang kalian buat dengan menjalankan command di bawah ini.
php artisan backup:list
Hasilnya akan terlihat seperti di bawah ini.
Beberapa command opsional antara lain:
Jika kalian ingin melakukan backup ke disk tertentu saja, bukan ke semua disk, jalankan:
php artisan backup:run --only-to-disk=nama-disk
Jika kalian hanya perlu mem-backup database, jalankan:
php artisan backup:run --only-db
Jika kalian hanya perlu mem-backup file dan ingin melewatkan dumping database, jalankan:
php artisan backup:run --only-files
Terakhir, kita akan setup scheduler untuk mengeksekusi command secara berkala untuk membuat dan menghapus backup. Pada file App\Console\Kernel.php
, tambahkan kode di bawah ini.
...
protected function schedule(Schedule $schedule)
{
//tambahkan yang di bawah ini
$schedule->command('backup:clean')->daily()->at('01:00');//24-hour format
$schedule->command('backup:run')->daily()->at('01:30');//24-hour format
}
...
Command diatas akan tereksekusi setiap hari di jam 1 malam dan setengah 2 malam (mempertimbangkan cut-off time product/service yang kalian kembangkan, bisa disesuaikan sesuai kebutuhan). Kondisi penghapusan backup dapat kalian temukan di file backup.php
bagian cleanup
.
Okee sip, jadi sekian dulu pembahasan kali ini. Semoga bermanfaat bagi teman-teman dan terimakasih sudah membaca!
Refrensi:
[1] https://spatie.be/docs/laravel-backup/v7/introduction
=========================
Backup Aplikasi Laravel Dan Database Menggunakan Package Spatie Laravel backup Dan Jalankan Schedule Otomatis Backup Di Laravel Forge Menggunakan Cronjob
Ketika aplikasi yang sudah kita develop sudah di tahap production tentu backup merupakan hal yang sangat penting baik itu melakukan backup di level aplikasi ataupun di level database, Untuk melakukan backup pada aplikasi yang kita deploy menggunakan laravel kita dapat menggunakan package dari spatie yaitu laravel backup silahkan anda baca dokumentasinya klik disini
Pada tutorial kali ini kita akan mengkombinasikan laravel backup + laravel Forge ya kali ini saya menggunakan laravel forge untuk deployment dan salah satu fitur yang terdapat pada laravel forge yaitu fitur schedule dimana kita dapat membuat schedule cronjob dengan mudah, Bagi anda yang tidak terbiasa dengan crontab parameter anda dapat menggunakan bantuan cronjob generate dari crontab guru silahkan cek disini
instalasi Package Laravel Backup
composer require spatie/laravel-backup
setelah anda install package ini akan otomatis melakukan register di service provider namun jika tidak anda dapat menambahkannya sendiri sbb
//config/app.php 'providers' => [ /* * Laravel Framework Service Providers... */ Spatie\Backup\BackupServiceProvider::class,
lalu kita publish backupo confignya dengan cara sbb
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
lalu buka file config/backup.php dan silahkan anda config storagenya disini saya menggunakan s3 storage dari amazon webservices
'destination' => [ /* * The filename prefix used for the backup zip file. */ 'filename_prefix' => '', /* * The disk names on which the backups will be stored. */ 'disks' => [ 's3-backup', ], ],
Dikarenakan kita menyimpan backup di s3 amazon web service maka disk monitornya harus kita arahkan ke s3 amazon web service juga sbb
'monitor_backups' => [ [ 'name' => env('APP_NAME', 'laravel-backup'), 'disks' => ['s3-backup'], 'health_checks' => [ \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1, \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000, ], ], ],
Konfigurasi Amazon S3
Jika anda menyimpan backup ke amazon s3 storage maka anda harus menginstall package league/flysystem-aws-s3-v3 ~1.0
composer require league/flysystem-aws-s3-v3 ~1.0
Setelah Itu Setting Di File .ENV beberapa parameter sbb
AWS_ACCESS_KEY_ID_BACKUP=AKIAVJO3TM21232132 AWS_SECRET_ACCESS_KEY_BACKUP=1cX21321DTFGWWwGe43ZV1r1xkSu AWS_DEFAULT_REGION_BACKUP=ap-southeast-1 AWS_BUCKET_BACKUP=novalio-id-backup
Nilai dari Parameter di atas anda dapatkan dari amazon web service anda silahkan anda setup IAM untuk s3 Storagenya di AWS Console
Tahap Pengujian
setelah kita melakukan config seperti diatas maka tahap selanjutnya adalah kita menjalankan command yang tersedia di laravel backup beberapa command yang sangat sering di jalankan antara lain :
php artisan backup:clean
Command diatas berfungsi untuk melakukan cleanup backup di server
php artisan backup:run
Command diatas berfungsi untuk melakukan backup dan menyimpannya ke media penyimpanan yang telah kita tentukan di backup config di artikel ini kita menyimpan ke S3 Storage Amazon Web Service
php artisan backup:monitor
Command diatas berfungsi untuk melakukan monitor apakah ada kendala di backup yang kita jalankan misal proses backup gagal ataupun berhasil dan kita bisa setup notifikasi ke email ataupun ke provider lain seperti slack
Proses Menjalankan backup Clean
Proses Menjalankan backup Run
Proses Menjalankan Backup Monitor
Cek backup Di Amazon S3
Notifikasi Backup
Untuk Mendapatkan Notifikasi dari proses backup yang di jalankan kita dapat melakukan konfigrurasi notifikasi via email silahkan anda bukan backup config yang berada di config/backup.php dan lakukan konfigurasi sbb
'notifications' => [ 'notifications' => [ \Spatie\Backup\Notifications\Notifications\BackupHasFailed::class => ['mail'], \Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFound::class => ['mail'], \Spatie\Backup\Notifications\Notifications\CleanupHasFailed::class => ['mail'], \Spatie\Backup\Notifications\Notifications\BackupWasSuccessful::class => ['mail'], \Spatie\Backup\Notifications\Notifications\HealthyBackupWasFound::class => ['mail'], \Spatie\Backup\Notifications\Notifications\CleanupWasSuccessful::class => ['mail'], ],'mail' => [ 'to' => 'backup@adinata.id', 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'backup@adinata.id'), 'name' => env('MAIL_FROM_NAME', 'Backup Novalio'), ], ],
Agar Notifikasi Ini berjalan anda perlu melakukan konfigurasi SMTP pada File .ENV sbb
MAIL_MAILER=smtp MAIL_HOST=mail.adinata.id MAIL_PORT=465 MAIL_USERNAME=email anda MAIL_PASSWORD=password email anda MAIL_ENCRYPTION=SSL MAIL_FROM_ADDRESS=backup@adinata.id MAIL_FROM_NAME="${APP_NAME}"
Maka ketika anda menjalankan backup akan muncul notifkasi ke email anda sbb
Notifikasi Clean Up Backup
Notifikasi Backup Run
Notifikasi Backup Monitor
Notifikasi Gagal Backup
Otomatis Jalankan Backup Dengan Schedule
Tentu kita tidak akan menjalankan backup ini secara manual maka kita perlu melakukan schedule pada aplikasi kita dan untuk membuat schedule command di laravel sangat mudah sekali pertama kita tambahkan dulu command yang akan di jalankan pada file app/Console/Kernel.php sbb
protected function schedule(Schedule $schedule) { $schedule->command('backup:clean')->dailyAt('01:00'); $schedule->command('backup:run')->dailyAt('01:30'); $schedule->command('backup:monitor')->dailyAt('03:00'); }
Jika Server anda di deploy di satu negara saja maka anda dapat menambahkan method Schedule Timezone sbb
/** * Get the timezone that should be used by default for scheduled events. * * @return \DateTimeZone|string|null */ protected function scheduleTimezone() { return 'Asia/Jakarta'; }
Setelah kita berhasil menambahkan schedule command selanjutnya kita tambahkan cronjob dan kali ini kita menggunakan platform Laravel Forge bagi anda yang ingin menggunakan laravel forge silahkan cek
Pada Laravel Forge Kita dapat membuat cronjob sesuai dengan jadwal di jalankannya schedule backup sbb
Bagi anda yang bingung dengan parameter crontab anda dapat mengenerate crontab dengan bantuan Crontab Guru Silahkan Cek
Agar Jadwal Cronjob berjalan sesuai dengan waktu di negara anda maka jangan lupa seting timezone server anda di laravel forge ke timezone negara anda contohnya disini saya set ke Asia/Jakarta anda dapat melakukan setting di menu sbb
Command Untuk Menjalankan backup Di Laravel Forge ( Menggunakan PHP 8 )
php8.0 /home/forge/novalio.id/artisan schedule:run
Demikian Tutorial ini semoga bermanfaat
Salam,
Adinata
Referensi Terkait
Spatie Laravel backup klik disini
Laravel Forge Scheduler klik disini
Mattstaufer Forge Schedule klik disini
Tidak ada komentar:
Posting Komentar