Skip to content

Feat: backup restore#1086

Open
pandigresik wants to merge 5 commits into
rilis-devfrom
feat/backup_restore
Open

Feat: backup restore#1086
pandigresik wants to merge 5 commits into
rilis-devfrom
feat/backup_restore

Conversation

@pandigresik

@pandigresik pandigresik commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Pull Request: Fitur Backup & Restore Database dan Storage

Description

Menambahkan fitur backup dan restore database serta file asset (storage) pada halaman Pengaturan Aplikasi. Fitur ini memudahkan proses migrasi server atau instalasi ulang dengan tetap menjaga data lama dapat sepenuhnya dipindahkan ke aplikasi baru. Menggunakan package spatie/laravel-backup untuk proses backup, dan menyediakan mekanisme restore dari file backup yang tersimpan maupun upload file backup.

Changes made:

  1. New Controller (app/Http/Controllers/BackupController.php): Controller untuk mengelola backup — index, run, download, delete, restore, dan upload+restore. Menggunakan trait UploadedFile untuk upload file.
  2. New FormRequest (app/Http/Requests/RestoreBackupRequest.php): Validasi upload file backup (required, file, mimes:zip, max 50MB).
  3. New View (resources/views/backup/index.blade.php): Halaman manajemen backup dengan tabel daftar backup, tombol Backup Sekarang, Upload & Restore, serta aksi download/restore/hapus per file.
  4. New Routes (routes/web.php): 6 route untuk backup (index, store, show, update, upload, destroy) di prefix pengaturan/backup.
  5. New Migrations: Menu navigasi Database di modul Pengaturan Aplikasi + 4 permission (pengaturan-database-{read,write,edit,delete}) yang diberikan ke role administrator.
  6. New Package (composer.json): Menambahkan spatie/laravel-backup ^10.3.
  7. New Config (config/backup.php): Konfigurasi backup — sumber (database + storage/app), tujuan (disk backups), notifikasi, dan strategi pembersihan.
  8. Modified Config (config/filesystems.php): Menambahkan disk backups dengan root storage/app/backups/{APP_NAME}.
  9. Modified Menu (app/Enums/Modul.php): Menambahkan submenu "Database" di grup Pengaturan.
  10. Modified Middleware (app/Http/Middleware/EasyAuthorize.php): Menambahkan mapping 'upload' => 'write' untuk permission.
  11. Modified Breadcrumbs (routes/breadcrumbs.php): Menambahkan breadcrumb untuk halaman backup.
  12. New Tests (tests/Feature/BackupControllerTest.php): 11 test cases mencakup index, run, download, delete, dan edge cases.
  13. Translation Files (lang/vendor/backup/*/notifications.php): 24 file notifikasi dari Spatie Backup untuk berbagai bahasa, termasuk bahasa Indonesia.

Reason for change:

  • Kebutuhan migrasi: Saat server perlu dipindah atau diinstal ulang, data lama harus bisa dipindahkan sepenuhnya.
  • Belum ada fitur backup/restore: OpenKab sebelumnya tidak memiliki mekanisme backup dan restore database maupun file asset.
  • Kemudahan pemulihan: Dengan fitur ini, administrator dapat dengan mudah membuat backup rutin, mendownload, merestore dari backup yang ada, atau upload file backup dari server lain.

Impact of change:

Fitur baru: Admin dapat membuat, melihat, mengunduh, dan menghapus backup database + storage.
Restore fleksibel: Bisa restore dari backup yang tersimpan di sistem, maupun upload file backup.zip untuk skenario pindah server.
Keamanan: Validasi server-side (mimes:zip, max size), proteksi Zip Slip, file dipindah dari public path sebelum diproses.
Pengaturan permission: 4 permission terintegrasi dengan sistem EasyAuthorize yang sudah ada.

Related Issue

Steps to Reproduce

Sebelum fitur:

  1. Buka menu Pengaturan
  2. Tidak ada submenu Backup Database
  3. ❌ Tidak ada cara untuk backup/restore data

Setelah fitur:

  1. Buka menu Pengaturan → Backup Database
  2. Klik "Backup Sekarang" untuk membuat backup baru
  3. Backup muncul di tabel dengan info nama file, ukuran, dan tanggal
  4. Klik icon Download untuk mengunduh file backup
  5. Klik icon Restore untuk mengembalikan data dari backup tertentu
  6. Klik icon Hapus untuk menghapus backup
  7. Klik "Upload & Restore" untuk upload file backup dari server lain
  8. ✅ Data berhasil dibackup dan direstore

Checklist

  • I have complied with script writing rules
  • I have followed pull request review process
  • I have created unit test/integration test to verify the fix
  • Manual testing has been done in development environment
  • No console errors or warnings

Technical Details

Arsitektur Backup

  • Backup menggunakan spatie/laravel-backup via php artisan backup:run
  • Sumber backup: semua koneksi database (default mysql) + storage/app/
  • Tujuan backup: disk backupsstorage/app/backups/{APP_NAME}/
  • File backup: ZIP berisi SQL dump + folder storage/app/

Arsitektur Restore

  • Restore dari backup yang tersimpan: Buka ZIP → ekstrak ke temp → restore SQL via DB::unprepared() → copy storage/app/ dari backup
  • Restore dari upload: Upload file → validasi mimes:zip dengan FormRequest → simpan via trait UploadedFile → pindah ke temp non-public → ekstrak → restore
  • Dilengkapi proteksi Zip Slip dengan validasi entry path sebelum ekstraksi
  • File upload dihapus setelah restore selesai

Permission Mapping

Route Permission
backup.index pengaturan-database-read
backup.store pengaturan-database-write
backup.show pengaturan-database-read
backup.update pengaturan-database-edit
backup.upload pengaturan-database-write
backup.destroy pengaturan-database-delete

Configuration changes

  • config/filesystems.php: Menambahkan disk backups
  • config/backup.php: File konfigurasi baru untuk Spatie Backup

Dependencies added

  • spatie/laravel-backup: ^10.3

Testing

Manual Testing

  • Membuat backup via tombol "Backup Sekarang"
  • Melihat daftar backup di tabel
  • Mendownload file backup
  • Restore dari backup yang ada
  • Upload file backup dan restore
  • Menghapus backup
  • Validasi error untuk file non-zip
  • Validasi error untuk filename tidak valid (path traversal)
  • Permission check untuk setiap aksi

Automated Testing

  • 11 unit test di tests/Feature/BackupControllerTest.php
  • Test mencakup: index page, run backup success/failure, download (valid/nonexistent/invalid filename), delete (success/nonexistent/invalid filename), index menampilkan file, index mengabaikan non-zip

Breaking Changes

None. Fitur baru, tidak mengubah perilaku existing.

Migration Guide

Tidak diperlukan migrasi khusus. Jalankan php artisan migrate untuk menambahkan menu dan permission. Jalankan composer install untuk menginstall package baru.

Video

simplescreenrecorder-2026-07-04_05.57.52.mp4

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1086

@pandigresik pandigresik requested a review from vickyrolanda July 3, 2026 23:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant