Membuat Backup Database Otomatis pada Laravel

Khairu Aqsara Sudirman

Khairu Aqsara Sudirman

Nov 10, 2020 — 4 mins read
Photo by <a href="https://unsplash.com/@markusspiske" target="_blank">Markus Spiske</a> on <a href="https://unsplash.com" target="_blank">Unsplash</a>

Photo by Markus Spiske on Unsplash

Halo semua, kali ini saya ingin berbagi tentang bagaiman cara membuat otomatisasi proses backup database pada aplikasi laravel, mungkin sebagian dari teman-teman sudah sering menggunakannya, buat teman-teman yang belum pernah, mudah-mudahan bisa sedikit membantu.

Pada dasarnya, proses backup merupakan satu workflow yang harus dilakukan dalam pemeliharaan sebuah aplikasi, dengan tujuan untuk menghindari kehilangan data, sejatinya proses ini bisa dilakukan secara manual, semi otomatis maupun full otomatis, tergantung dari sudut mana kita melihat kemudahanya.

Karena kita bekerja dengan laravel, kita akan mencoba memanfaatkan fitur yang sudah disediakan oleh laravel, yaitu fitur artisan console dan scheduler serta sedikit bantuan dari aplikasi cron yang mana sudah secara default ada didalam OS berbasis linux.

Skenario

Seperti yang sudah kita bahas diawal, kita akan memanfaatkan fitur artisan console laravel beserta fitur scheduler-nya, kita akan membuat sebuah command baru untuk menghandle proses backup tersebut, kemudian artisan command akan kita masukan dalam laravel scheduler sehingga nantinya bisa dipanggil oleh cron dan secara otomatis menjalankan proses backup dari database kita, kita akan memanfaatkan Process::class milik Symfony untuk menjalankan executable mysqldump (jika databasenya mysql) melalui artisan command.

Implementasi

Pertama-tama kita harus membuat sebuah artisan command baru dengan perintah php artisan make:command BackupDatabase, dengan begitu akan tercipta sebuah file baru dalam folder app/console/commands dengan beberapa baris kode scaffold hasil dari artisan make:command yang kita jalankan sebelumnya.

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facedes\Log;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
class BackupDatabase extends Command
{
	// command yang akan kita panggil di php artisan nanti
	// ex: php artisan jalankan:backup-db
	protected $signature = 'jalankan:backup-db';

	// untuk menampilkan bantuan dari artisan command
	protected $description = 'Jalankan Proses Backup Database';

	// variable untuk proses dari Process::class symfony
	protected $process;

	public function __construct()
	{
		parent::__construct();
		// Tanggal Backup
		$hari_ini = today()->format('Y-m-d');
		// Cek Folder backups di folder storage/app, jika tidak ada
		// Buat folder backups
		if(!is_dir(storage_path('backups'))) mkdir(storage_path('backups'));

		// persiapkan perintah yang akan kita jalankan
		$this->process = new Process(sprintf(
			'mysqldump --compact --skip-comment -u%s -p%s %s > %s',
			config('database.connections.mysql.username'),
			config('database.connections.mysql.password'),
			config('database.connections.mysql.database'),
			storage_path("backups/{$hari_ini}.sql")
		));

		// jika kode ini di print, hasilnya akan :
		// mysqldump --compact --skip-comment -u 
        // root -proot mydb > storage/app/backups/2020-11-11.sql
	}

	public function handle()
	{
		// Jalankan perintah backup saat artisan command dipanggil
		try{
			$this->process->mustRun();
		}catch(ProcessFailedException $e){
			// Jika gagal, tulis dalam log file beserta 
			// Penyebab kenapa Gagal.
			Log::error('Proses Backup harian gagal', $e);
		}
	}
}

Pada Kode diatas saya lengkapi dengan sedikit komentar, agar teman-teman lebih mudah memahaminya, jika tidak ada masalah, ketika teman-teman menjalankan perintah artisan jalankan:backup-db seharusnya akan ada satu folder dengan nama backups dalam folder storage/app dan didalam folder tersebut akan ada satu file .sql hasil dari kita menjalankan perintah mysqldump melalui kode diatas.

pada tahap ini, semi otomatis dari proses backup database sudah terpenuhi, karena kita cukup menjalankan perintah artisan dan sisanya akan diproses oleh laravel

nah untuk bisa menjadikan-nya full otomatis, kita harus menambahkan atau memanggil perintah artisan ini melalui laravel scheduler, dengan cara menambahkan pada file app/Console/Kernel.php pada bagian protected $commands = [] dan menentukan kapan seharusnya artisan command yang kita buat dipanggil pada bagian schedule(Schedule $schedule), sehingga kira-kira file app/Console/Kernel.php akan menjadi seperti berikut.

<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Console\Commands\BackupDatabase;

class Kernel extends ConsoleKernel
{
	protected $commands = [
		BackupDatabase::class
	];

	protected function schedule(Schedule $schedule)
	{
		// Jalankan database backup setiap hari
		// pada jam 00:00
		$schedule->command('jalanlan:backup-db')
			->daily();
	}

	protected function commands()
	{
		$this->load(__DIR__.'/Commands');
		require base_path('routes/console.php');
	}
}

Dengan demikian kita cukup menjalankan perintah php artisan schedule:run melalui cron dengan cara ketik perintah crontab -e (Edit file Cron Job) pada terminal, kemudian masukan kode seperti bibawah ini

* * * * * cd /var/www/mylarave/ && php artisan schedule:run >> /dev/null 2>&1

dengan begitu, proses backup akan berjalan dengan otomatis setiap harinya, dan tentu saja kita akan memiliki file backup dalam format .sql yang sangat banyak jika setiap hari proses backup berjalan, bagi sebagian orang tentu saja ini tidak masalah, yang penting database terbackup.

seperti kata pepatah programming, selesai satu masalah, pemecahanya akan membawa masalah lain, yaitu storage, ya kalo sqlnya kecil sih tidak masalah, bagaiman jika sql filenya sampau ber-giga-giga ? untuk ukuran server dengan Storage yang pas-pas-an tentu saja ini akan menjadi masalah, 

dilain kesempatan kita akan mencoba membahasa masalah ini secara detail, kita bisa menggunakan beberapa teknik untuk menghapus file sql hasil proses backup yang sudah ber-umur cukup lama atau membackupnya ke AWS/Cloud service seperti Google Drive atau sejenisnya, sehingga Space storage bisa di tetap terjaga, 

laravel php
Read More

Mendeteksi User Online dengan Middleware di Laravel

secara umum, saat proses authentication berhasil, laravel akan menyimpan semua session user yang sedang login, tetapi session tersebut hanya bisa diakses oleh yang berhak saja (yang sedang login) untuk menentukan hak atau akses apa saja yang bisa didapatkan oleh user tersebut.

Read More

Subdomain Routing Pada Laravel

Misalnya, saya punya aplikasi dengan alamat domain beritaku.xyz kemudian saya ingin backend dari aplikasi hanya bisa diakses melalui subdomain backend.berita.xyz, kira-kira begitulah kasusnya ya, saya rasa teman-taman pasti faham maksudnya.