Backup dan Monitoring Server Otomatis: Setup Sekali, Tenang Selamanya
Ada dua hal yang selalu saya sesali kalau tidak disiapkan dari awal: backup dan monitoring. Keduanya terasa tidak perlu sampai benar-benar dibutuhkan β dan saat dibutuhkan, biasanya sudah terlambat untuk menyiapkannya.
Saya pernah kehilangan beberapa hari data karena tidak ada backup. Saya juga pernah tidak tahu server down selama beberapa jam karena tidak ada monitoring. Dua pengalaman itu yang mengubah cara saya setup server. Sekarang, backup dan monitoring adalah hal pertama yang saya setup β bahkan sebelum deploy aplikasinya sendiri.
Backup Database: Otomatis Setiap Hari
Script backup yang saya pakai sekarang sudah cukup matang setelah beberapa iterasi perbaikan. Ini versi lengkapnya:
#!/bin/bash
# /home/user/scripts/backup_db.sh
# ===== Konfigurasi =====
DB_USER="userbackup"
DB_PASS="password_backup"
DATABASES=("database1" "database2") # bisa lebih dari satu
BACKUP_DIR="/home/user/backups/database"
LOG_FILE="/home/user/logs/backup.log"
RETENSI_HARI=14 # simpan backup selama 14 hari
# ===== Fungsi Log =====
log() {
echo "[$(date "+%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
# ===== Buat direktori kalau belum ada =====
mkdir -p "$BACKUP_DIR" "$(dirname "$LOG_FILE")"
log "=== Mulai proses backup ==="
# ===== Backup setiap database =====
TANGGAL=$(date +%Y-%m-%d)
SUKSES=0
GAGAL=0
for DB in "${DATABASES[@]}"; do
NAMA_FILE="${DB}_${TANGGAL}.sql.gz"
PATH_FILE="${BACKUP_DIR}/${NAMA_FILE}"
mysqldump -u "$DB_USER" -p"$DB_PASS"
--single-transaction
--routines
--triggers
"$DB" | gzip > "$PATH_FILE"
if [ $? -eq 0 ] && [ -s "$PATH_FILE" ]; then
UKURAN=$(du -sh "$PATH_FILE" | cut -f1)
log "OK: $DB -> $NAMA_FILE ($UKURAN)"
((SUKSES++))
else
log "GAGAL: backup $DB tidak berhasil atau file kosong"
rm -f "$PATH_FILE"
((GAGAL++))
fi
done
# ===== Hapus backup lama =====
TERHAPUS=$(find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENSI_HARI -delete -print | wc -l)
[ "$TERHAPUS" -gt 0 ] && log "Hapus $TERHAPUS backup lama (> $RETENSI_HARI hari)"
log "Selesai: $SUKSES sukses, $GAGAL gagal"
Beri permission eksekusi dan jadwalkan dengan cron:
chmod +x /home/user/scripts/backup_db.sh
crontab -e
# Tambahkan baris ini: backup setiap hari jam 2 pagi
0 2 * * * /home/user/scripts/backup_db.sh
Perhatikan flag --single-transaction di mysqldump β ini penting untuk database yang aktif dipakai agar backup konsisten tanpa harus lock tabel.
Backup File: Sinkronisasi ke Lokasi Lain
Backup yang hanya ada di server yang sama itu setengah solusi. Kalau servernya yang bermasalah, backup ikut hilang. Saya pakai rclone untuk sync ke cloud:
# Install rclone
curl https://rclone.org/install.sh | sudo bash
# Konfigurasi (ikuti wizard interaktif)
rclone config
# Tambahkan ke script backup, setelah mysqldump selesai
rclone copy "$BACKUP_DIR" gdrive:backups/server1/ --log-file="$LOG_FILE"
Monitoring: Tahu Masalah Sebelum Pengguna Complain
Ada dua layer monitoring yang saya setup: monitoring dari dalam server (resource usage) dan monitoring dari luar (uptime check).
Monitoring dari Dalam:
#!/bin/bash
# /home/user/scripts/monitor.sh
NOTIF_EMAIL="admin@namadomain.com"
HOST=$(hostname)
cek_dan_notif() {
local METRIK=$1
local NILAI=$2
local THRESHOLD=$3
local PESAN=$4
if [ "$NILAI" -gt "$THRESHOLD" ]; then
echo "$PESAN: $NILAI%" | mail -s "[$HOST] Alert: $METRIK Tinggi" "$NOTIF_EMAIL"
fi
}
# Cek CPU (rata-rata 5 menit terakhir)
CPU=$(awk "{print $1}" /proc/loadavg | awk -F. "{print $1}")
CORE=$(nproc)
CPU_PCT=$((CPU * 100 / CORE))
cek_dan_notif "CPU" "$CPU_PCT" 85 "CPU usage tinggi"
# Cek disk
DISK=$(df / | awk "NR==2 {print $5}" | tr -d "%")
cek_dan_notif "Disk" "$DISK" 85 "Disk hampir penuh"
# Cek memory
MEM=$(free | awk "/^Mem:/ {printf "%.0f", $3/$2 * 100}")
cek_dan_notif "Memory" "$MEM" 90 "Memory usage tinggi"
# Cek service penting
for SERVICE in nginx mysql php8.3-fpm; do
if ! systemctl is-active --quiet "$SERVICE"; then
echo "Service $SERVICE tidak berjalan di $HOST" |
mail -s "[$HOST] Alert: $SERVICE Down" "$NOTIF_EMAIL"
# Coba restart otomatis
systemctl restart "$SERVICE"
fi
done
# Jadwalkan setiap 15 menit
*/15 * * * * /home/user/scripts/monitor.sh
Monitoring dari Luar (Uptime):
Script di atas tidak bisa mendeteksi kalau server mati total. Untuk itu perlu layanan eksternal. Saya pakai UptimeRobot β gratis untuk monitor hingga 50 URL dengan interval 5 menit, dan bisa kirim notifikasi ke email atau Telegram.
Setupnya mudah: daftar di uptimerobot.com, tambahkan URL yang mau dimonitor, dan set notifikasi. Selesai.
Tes Backup Secara Berkala
Ini yang paling sering dilupakan. Backup yang tidak pernah dicoba restore itu belum tentu bisa dipulihkan. Minimal sebulan sekali, lakukan test restore ke environment terpisah:
# Buat database test
mysql -u root -p -e "CREATE DATABASE test_restore;"
# Restore dari backup
gunzip < /home/user/backups/database/database1_2025-06-01.sql.gz |
mysql -u root -p test_restore
# Verifikasi
mysql -u root -p test_restore -e "SHOW TABLES; SELECT COUNT(*) FROM tabel_utama;"
# Hapus setelah selesai
mysql -u root -p -e "DROP DATABASE test_restore;"
Penutup
Setup backup dan monitoring itu butuh waktu beberapa jam di awal. Tapi setelah berjalan, keduanya akan bekerja sendiri tanpa perlu intervensi β kecuali saat ada yang perlu direspons.
Ketenangan pikiran yang didapat setelah setup ini selesai itu tidak ternilai. Tidak perlu khawatir data hilang, tidak perlu terus-menerus cek apakah server masih hidup. Semuanya berjalan otomatis, dan notifikasi akan datang kalau memang ada yang perlu diperhatikan. π
Belum ada komentar. Jadilah yang pertama menulis.
Tulis Komentar