# Panduan Backup & Pemulihan Bencana (Backup & Restore Runbook) Dokumen ini mendefinisikan prosedur pencadangan rutin (*scheduled backups*), rotasi data, dan pemulihan bencana (*disaster recovery*) untuk database PostgreSQL dan media file KeluargaMart. --- ## 1. Strategi Pencadangan (Backup Strategy) | Target Data | Metode Backup | Frekuensi | Retensi Lokal | Retensi Offsite | |---|---|---|---|---| | **Database PostgreSQL** | `pg_dump` compressed (`.sql.gz`) | Setiap 6 jam (Cron) | 7 hari | 30 hari (S3 / B2) | | **Media Uploads (`/data/uploads`)** | `tar.gz` archive / `rclone` sync | Harian (02:00 WIB) | 3 hari | 90 hari | | **Environment & Configs** | Enkripsi manual (GPG / Bitwarden) | Setiap perubahan | Terarsip aman | Secure Vault | --- ## 2. Skrip Backup Otomatis PostgreSQL (`scripts/backup-db.sh`) Contoh skrip backup yang dijalankan melalui crontab di host VPS: ```bash #!/bin/bash set -euo pipefail BACKUP_DIR="/var/backups/keluargamart" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") FILENAME="km_db_${TIMESTAMP}.sql.gz" CONTAINER_NAME="keluargamart-postgres" DB_USER="${POSTGRES_USER:-erp}" DB_NAME="${POSTGRES_DB:-erp}" mkdir -p "${BACKUP_DIR}" echo "[INFO] Starting database backup: ${FILENAME}..." podman exec "${CONTAINER_NAME}" pg_dump -U "${DB_USER}" -d "${DB_NAME}" | gzip > "${BACKUP_DIR}/${FILENAME}" echo "[INFO] Backup completed successfully. Size: $(du -h "${BACKUP_DIR}/${FILENAME}" | cut -f1)" # Rotasi: Hapus backup lokal yang lebih lama dari 7 hari find "${BACKUP_DIR}" -name "km_db_*.sql.gz" -type f -mtime +7 -delete echo "[INFO] Local rotation completed." ``` --- ## 3. Prosedur Pemulihan Database (Database Restore Procedure) Jika terjadi kerusakan data atau kebutuhan pemulihan: ### 1. Hentikan Akses Tulis Aplikasi Hentikan backend agar tidak ada transaksi baru selama proses restore: ```bash podman stop keluargamart-backend ``` ### 2. Eksekusi Restore dari File Backup ```bash BACKUP_FILE="/var/backups/keluargamart/km_db_20261017_030000.sql.gz" # Masukkan dump SQL ke dalam kontainer database gunzip -c "${BACKUP_FILE}" | podman exec -i keluargamart-postgres psql -U erp -d erp ``` ### 3. Verifikasi Integritas Data Periksa keberadaan tabel dan hitungan transaksi: ```bash podman exec -it keluargamart-postgres psql -U erp -d erp -c "SELECT count(*) FROM orders;" ``` ### 4. Nyalakan Kembali Backend ```bash podman start keluargamart-backend curl http://127.0.0.1:3004/ready ``` --- ## 4. Pencadangan File Media Uploads Media file bukti transfer dan gambar produk disimpan pada volume `km_uploads`: ```bash tar -czf /var/backups/keluargamart/uploads_$(date +"%Y%m%d").tar.gz -C /var/lib/containers/storage/volumes/km_uploads/_data . ``` Gunakan `rclone` untuk menyinkronkan file arsip ke cloud object storage (misal: Cloudflare R2 / AWS S3) secara terjadwal.