Laravel Backup dengan Spatie
Starter kit ini sudah terintegrasi dengan spatie/laravel-backup untuk membuat backup file aplikasi dan database secara otomatis ke:
- filesystem lokal pada disk
backups - filesystem
s3
Konfigurasi ini sekarang mengikuti pendekatan default dokumentasi Spatie untuk v10: disk lokal backup boleh dipisah, tetapi S3 cukup memakai disk s3 biasa tanpa filesystem tambahan.
Secara bawaan, konfigurasi backup disimpan di config/backup.php dan lokasi backup lokal ada di config/filesystems.php.
Ringkasan Default
- Frekuensi backup: harian (
daily) - Jam backup:
01:00 - Cleanup backup lama:
01:30 - Monitoring kesehatan backup:
06:00 - Retensi: hapus backup yang lebih tua dari 30 hari
- Arsip zip terenkripsi dengan password
- Disk tujuan:
backups,s3 - Notifikasi: email
Jika Anda ingin tetap memakai pola harian, cukup isi .env lalu aktifkan Laravel Scheduler di server.
1. Konfigurasi .env
Tambahkan atau sesuaikan nilai berikut di file .env:
BACKUP_DESTINATION_DISKS=backups,s3
[email protected]
BACKUP_ARCHIVE_PASSWORD=change-this-backup-password
BACKUP_ENCRYPTION=aes256
BACKUP_SCHEDULE_FREQUENCY=daily
BACKUP_SCHEDULE_TIME=01:00
BACKUP_CLEANUP_TIME=01:30
BACKUP_MONITOR_TIME=06:00
BACKUP_MONITOR_MAX_AGE_DAYS=2
BACKUP_MAX_STORAGE_MB=10240
BACKUP_KEEP_ALL_DAYS=30
BACKUP_KEEP_DAILY_DAYS=0
BACKUP_KEEP_WEEKLY_WEEKS=0
BACKUP_KEEP_MONTHLY_MONTHS=0
BACKUP_KEEP_YEARLY_YEARS=0
Penjelasan penting:
BACKUP_DESTINATION_DISKS=backups,s3artinya satu file backup akan disalin ke local dan S3.BACKUP_ARCHIVE_PASSWORDwajib diisi jika Anda ingin file zip benar-benar terenkripsi.BACKUP_ENCRYPTION=aes256membuat isi zip backup dienkripsi dengan AES-256.BACKUP_NOTIFICATION_EMAILadalah email tujuan notifikasi berhasil/gagal backup.BACKUP_KEEP_ALL_DAYS=30berarti backup lebih tua dari 30 hari akan dibersihkan.- Nilai
0pada daily/weekly/monthly/yearly retention membuat backup tidak disimpan melewati 30 hari.
2. Lokasi Backup Lokal
Backup lokal disimpan pada disk backups dengan root:
storage/app/backups
Ini sengaja dipisah dari disk local biasa supaya file backup tidak bercampur dengan file aplikasi lain.
3. Konfigurasi S3
Backup remote memakai disk s3 bawaan Laravel. Isi variabel berikut:
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_DEFAULT_REGION=ap-southeast-1
AWS_BUCKET=your-backup-bucket
AWS_URL=
AWS_ENDPOINT=
AWS_USE_PATH_STYLE_ENDPOINT=false
Catatan:
- Bisa dipakai untuk AWS S3 asli.
- Bisa juga dipakai untuk layanan kompatibel S3 seperti MinIO, Cloudflare R2, DigitalOcean Spaces, dan lainnya dengan menyesuaikan
AWS_ENDPOINT. - Karena memakai disk
s3default, backup akan masuk ke root bucket, bukan ke folderbackups/khusus. - Jika S3 belum siap, sementara ubah
BACKUP_DESTINATION_DISKS=backupsagar backup lokal tetap jalan.
Lokasi Backup di S3
Dengan konfigurasi default package, backup akan tersimpan di bucket dengan pola seperti ini:
s3://your-bucket/{APP_NAME}/2026-04-01-01-00-00.zip
Artinya:
- nama folder level pertama mengikuti
APP_NAME - file zip backup ada di dalam folder itu
- jika
APP_NAME="filament-starter-kit", contoh lokasinya menjadi:
s3://your-bucket/filament-starter-kit/2026-04-01-01-00-00.zip
Kalau suatu hari Anda ingin backup masuk ke folder backups/ juga, itu bisa dilakukan, tetapi perlu custom disk atau custom path lagi. Untuk saat ini saya kembalikan ke pola default Spatie sesuai permintaan Anda.
3a. Enkripsi Arsip Backup
Arsip zip backup sekarang disiapkan untuk terenkripsi. Agar aktif, isi password berikut di .env:
BACKUP_ARCHIVE_PASSWORD=ganti-dengan-password-backup-yang-kuat
BACKUP_ENCRYPTION=aes256
Catatan penting:
- Jika
BACKUP_ARCHIVE_PASSWORDkosong, package tidak akan mengenkripsi zip. - Gunakan password yang berbeda dari password database atau password akun admin.
- Simpan password backup ini di password manager.
- Saat restore nanti, Anda membutuhkan password ini untuk membuka arsip backup.
4. Support SQLite
Jika aplikasi memakai SQLite, pastikan .env seperti ini:
DB_CONNECTION=sqlite
DB_DATABASE=database/database.sqlite
Untuk proses dump SQLite, package membutuhkan binary sqlite3 pada server.
Jika sqlite3 tidak ada di PATH, isi:
SQLITE_DUMP_BINARY_PATH=/usr/bin/
Contoh cek di VPS:
which sqlite3
Lalu jalankan backup manual:
php artisan backup:run
5. Support PostgreSQL
Jika aplikasi memakai PostgreSQL, pastikan .env seperti ini:
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=filament_starter_kit
DB_USERNAME=postgres
DB_PASSWORD=secret
Untuk PostgreSQL, package membutuhkan binary pg_dump pada server.
Jika pg_dump tidak ada di PATH, isi:
PG_DUMP_BINARY_PATH=/usr/bin/
Contoh cek di VPS:
which pg_dump
Lalu jalankan backup manual:
php artisan backup:run
6. Menjalankan Backup Manual
Perintah yang paling sering dipakai:
php artisan backup:run
php artisan backup:list
php artisan backup:monitor
php artisan backup:clean
Kegunaan:
backup:runmembuat backup barubackup:listmelihat daftar backup yang tersediabackup:monitormengecek apakah backup masih sehatbackup:cleanmenghapus backup lama sesuai retensi
7. Notifikasi Email dengan Mailtrap
Untuk uji notifikasi email, Anda bisa memakai Mailtrap dengan mailer SMTP Laravel yang sudah ada.
Contoh konfigurasi:
MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your-mailtrap-username
MAIL_PASSWORD=your-mailtrap-password
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"
[email protected]
BACKUP_ARCHIVE_PASSWORD=ganti-dengan-password-backup-yang-kuat
Cara uji:
- Simpan konfigurasi Mailtrap di
.env. - Jalankan
php artisan config:clear. - Jalankan
php artisan backup:run. - Cek inbox Mailtrap Anda.
Yang akan Anda terima:
- email sukses jika backup berhasil
- email gagal jika backup atau upload ke S3 gagal
- email cleanup dan health monitor sesuai event
Jika Anda ingin menguji notifikasi tanpa menunggu scheduler, cukup pakai php artisan backup:run dan php artisan backup:monitor.
8. Scheduler Harian, Mingguan, Bulanan
Starter kit ini memakai scheduler Laravel dari bootstrap/app.php. Frekuensinya diatur lewat .env.
Harian
BACKUP_SCHEDULE_FREQUENCY=daily
BACKUP_SCHEDULE_TIME=01:00
BACKUP_MONITOR_MAX_AGE_DAYS=2
Ini opsi yang direkomendasikan dan sesuai preferensi Anda.
Mingguan
BACKUP_SCHEDULE_FREQUENCY=weekly
BACKUP_SCHEDULE_WEEKLY_DAY=1
BACKUP_SCHEDULE_TIME=01:00
BACKUP_MONITOR_MAX_AGE_DAYS=8
Keterangan BACKUP_SCHEDULE_WEEKLY_DAY:
0= Minggu1= Senin2= Selasa3= Rabu4= Kamis5= Jumat6= Sabtu
Bulanan
BACKUP_SCHEDULE_FREQUENCY=monthly
BACKUP_SCHEDULE_MONTHLY_DAY=1
BACKUP_SCHEDULE_TIME=01:00
BACKUP_MONITOR_MAX_AGE_DAYS=32
Untuk bulanan, BACKUP_SCHEDULE_MONTHLY_DAY=1 berarti berjalan setiap tanggal 1.
9. Menjalankan Scheduler di VPS
Backup otomatis tidak akan jalan kalau scheduler Laravel belum dijalankan di server.
Tambahkan cron berikut di VPS:
* * * * * cd /path/to/project && php artisan schedule:run >> /dev/null 2>&1
Kalau Anda deploy ke server Linux dengan Supervisor atau systemd, yang penting php artisan schedule:run berjalan tiap menit.
10. Menghapus Backup Lama yang Tidak Terpakai
Kebutuhan Anda adalah backup lebih dari 30 hari tidak terlalu berguna. Konfigurasi default project ini sudah disiapkan untuk itu:
BACKUP_KEEP_ALL_DAYS=30
BACKUP_KEEP_DAILY_DAYS=0
BACKUP_KEEP_WEEKLY_WEEKS=0
BACKUP_KEEP_MONTHLY_MONTHS=0
BACKUP_KEEP_YEARLY_YEARS=0
Artinya:
- semua backup disimpan maksimal 30 hari
- setelah lewat 30 hari, backup lama dihapus
- backup terbaru tetap dipertahankan oleh strategi cleanup Spatie
Untuk menjalankan pembersihan manual di VPS:
php artisan backup:clean
Untuk melihat hasil pembersihan:
php artisan backup:list
11. Rekomendasi Operasional
- Untuk kebutuhan normal, pakai backup harian.
- Simpan backup ke
backupsdans3sekaligus agar ada salinan lokal dan off-site. - Gunakan bucket private.
- Pahami bahwa dengan disk
s3default, backup tersimpan di root bucket pada folderAPP_NAME. - Selalu isi
BACKUP_ARCHIVE_PASSWORDagar arsip zip terenkripsi. - Pastikan
pg_dumpatausqlite3tersedia di server sesuai database yang dipakai. - Uji notifikasi dengan Mailtrap sebelum memakai SMTP produksi.
- Biarkan
backup:cleantetap aktif agar storage VPS tidak penuh.
12. Checklist Cepat
- Install binary database sesuai kebutuhan:
sqlite3ataupg_dump. - Isi
.envuntuk database, S3, Mailtrap, dan password enkripsi backup. - Jalankan
php artisan config:clear. - Uji
php artisan backup:run. - Uji
php artisan backup:list. - Uji
php artisan backup:monitor. - Aktifkan cron
php artisan schedule:rundi VPS.