From c4eb8844956bcfa182688630ebd0c163e6f5dae8 Mon Sep 17 00:00:00 2001 From: GuavaPopper Date: Thu, 4 Jun 2026 14:26:04 +0700 Subject: [PATCH] feat: add database backup download via mysqldump (admin-only) Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile | 29 ++++++++++++++++ app/Http/Controllers/BackupController.php | 41 +++++++++++++++++++++++ resources/views/admin/users.blade.php | 11 ++++-- routes/web.php | 3 ++ 4 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 Dockerfile create mode 100644 app/Http/Controllers/BackupController.php diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6ea2a3d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM php:8.3-cli-bookworm + +WORKDIR /var/www/html + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + default-mysql-client \ + git \ + libicu-dev \ + libzip-dev \ + unzip \ + && docker-php-ext-install \ + intl \ + pdo_mysql \ + zip \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +COPY docker/app/php.ini /usr/local/etc/php/conf.d/99-webgis.ini +COPY docker/app/entrypoint.sh /usr/local/bin/webgis-entrypoint + +RUN chmod +x /usr/local/bin/webgis-entrypoint + +ENTRYPOINT ["webgis-entrypoint"] +CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"] diff --git a/app/Http/Controllers/BackupController.php b/app/Http/Controllers/BackupController.php new file mode 100644 index 0000000..36fc3f3 --- /dev/null +++ b/app/Http/Controllers/BackupController.php @@ -0,0 +1,41 @@ + $db['password']]); + + $process->setTimeout(120); + $process->run(); + + if (!$process->isSuccessful()) { + ActivityLog::record('backup', 'Gagal membuat backup database'); + return response()->json(['message' => 'Backup gagal: ' . $process->getErrorOutput()], 500); + } + + ActivityLog::record('backup', 'Mengunduh backup database'); + + $filename = 'backup-webgis-' . now()->format('Ymd-His') . '.sql'; + return response($process->getOutput(), 200, [ + 'Content-Type' => 'application/sql', + 'Content-Disposition' => "attachment; filename=\"{$filename}\"", + ]); + } +} diff --git a/resources/views/admin/users.blade.php b/resources/views/admin/users.blade.php index af8a12b..71d3a42 100644 --- a/resources/views/admin/users.blade.php +++ b/resources/views/admin/users.blade.php @@ -91,9 +91,14 @@

Kelola akun pengguna dan hak akses sistem.

- +
+ + Backup Database + + +
diff --git a/routes/web.php b/routes/web.php index 3270bb2..9029310 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,6 +2,7 @@ use App\Http\Controllers\AdminUserController; use App\Http\Controllers\AuthController; +use App\Http\Controllers\BackupController; use App\Http\Controllers\ExportController; use App\Http\Controllers\IbadahController; use App\Http\Controllers\ImportController; @@ -64,6 +65,8 @@ Route::middleware('auth')->group(function () { Route::post('/import/ibadah', [ImportController::class, 'ibadah']); Route::post('/import/miskin', [ImportController::class, 'miskin']); + + Route::get('/backup', [BackupController::class, 'download'])->name('admin.backup'); }); }); });