Lewati ke konten utama

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

ObjekFrekuensiPrioritas
Database MySQLSetiap hariKritis
File upload penggunaSetiap hariTinggi
QR code meetingSetiap hariSedang
Log filesSetiap mingguSedang
Konfigurasi sistemSetiap mingguTinggi
Source codeSetiap commitGit (otomatis)

Jadwal Backup

WaktuJenis BackupDeskripsi
00:00Full Database BackupDump lengkap semua tabel
06:00IncrementalPerubahan sejak 00:00
12:00IncrementalPerubahan sejak 06:00
18:00IncrementalPerubahan sejak 12:00

Retensi Backup

JenisDurasi Retensi
Backup harian30 hari
Backup mingguan12 minggu
Backup bulanan12 bulan

Recovery Objective

ParameterTargetPenjelasan
RPO (Recovery Point Objective)< 1 jamMaksimum data yang boleh hilang
RTO (Recovery Time Objective)< 2 jamMaksimum 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"]