BAB 53. BACKUP STRATEGY
Tujuan
Menjamin ketersediaan dan integritas data apabila terjadi kegagalan sistem, kesalahan pengguna, atau bencana. Strategi backup TemuBelajar dirancang dengan prinsip 3-2-1: 3 salinan, 2 media berbeda, 1 offsite.
Objek Backup
| Objek | Frekuensi | Prioritas |
|---|---|---|
| Database MySQL | Setiap hari | Kritis |
| File upload pengguna | Setiap hari | Tinggi |
| QR code meeting | Setiap hari | Sedang |
| Log files | Setiap minggu | Sedang |
| Konfigurasi sistem | Setiap minggu | Tinggi |
| Source code | Setiap commit | Git (otomatis) |
Jadwal Backup
| Waktu | Jenis Backup | Deskripsi |
|---|---|---|
| 00:00 | Full Database Backup | Dump lengkap semua tabel |
| 06:00 | Incremental | Perubahan sejak 00:00 |
| 12:00 | Incremental | Perubahan sejak 06:00 |
| 18:00 | Incremental | Perubahan sejak 12:00 |
Retensi Backup
| Jenis | Durasi Retensi |
|---|---|
| Backup harian | 30 hari |
| Backup mingguan | 12 minggu |
| Backup bulanan | 12 bulan |
Recovery Objective
| Parameter | Target | Penjelasan |
|---|---|---|
| RPO (Recovery Point Objective) | < 1 jam | Maksimum data yang boleh hilang |
| RTO (Recovery Time Objective) | < 2 jam | Maksimum waktu pemulihan |
Alur Backup
flowchart TD
S["⏰ Scheduler\n(Laravel Cron)"] --> J["🔄 BackupDatabaseJob"]
J --> DUMP["📦 mysqldump\n(Full/Incremental)"]
DUMP --> COMP["🗜️ Compress (gzip)"]
COMP --> ENC["🔒 Encrypt (AES-256)"]
ENC --> LOC["💾 Local Storage\n(VM disk)"]
ENC --> CLD["☁️ Cloud Storage\n(S3/GCS)"]
LOC --> MON["✅ Verify Integrity"]
CLD --> MON
style S fill:#4f63d2,color:#fff
style ENC fill:#dc2626,color:#fff
style CLD fill:#059669,color:#fff
Implementasi Laravel
// app/Console/Commands/BackupDatabaseCommand.php
class BackupDatabaseCommand extends Command
{
protected $signature = 'backup:database {--type=full}';
public function handle(): void
{
$filename = 'backup_' . now()->format('Ymd_His') . '.sql.gz';
// mysqldump → gzip → encrypt → upload
$this->dumpDatabase($filename);
$this->compressAndEncrypt($filename);
$this->uploadToCloud($filename);
$this->cleanOldBackups();
ActivityLogger::log('backup_completed', 'system', ['file' => $filename]);
}
}
Restore Procedure
flowchart TD
A["🚨 Insiden Terjadi"] --> B["📋 Identifikasi Titik Pemulihan"]
B --> C["☁️ Download Backup dari Cloud"]
C --> D["🔓 Decrypt File"]
D --> E["🗜️ Decompress"]
E --> F["🔄 Restore ke MySQL"]
F --> G["✅ Verifikasi Data"]
G --> H["🌐 Restart Layanan"]