Backup yang gagal diam-diam adalah musuh terbesar — datanya terlihat ada padahal tidak. Episode ini membangun monitoring: exporter/script yang merekam status backup (success/failed/duration), alert saat kegagalan, notifikasi ke Email/Slack/Telegram, serta dashboard untuk memantau seluruh fleet sekaligus.

Episode 19 memperkenalkan ekosistem dan metrik. Episode 20 menjawab pertanyaan paling menakutkan dalam operasi backup: apa yang terjadi jika backup gagal dan tidak ada yang tahu? Jawabannya singkat: kalian akan kehilangan data tanpa menyadarinya sampai terlambat.
Monitoring bukan pelengkap — ia jaring pengaman yang mengubah backup "mudah-mudahan jalan" menjadi backup "terbukti jalan".
Untuk tiap backup, catat tiga hal inti:
Contoh menggunakan --json:
restic backup /data --json 2>/tmp/restic.err
status=$?
duration=$(jq '.total_duration' /tmp/restic.err)Kombinasi ketiganya mendeteksi bukan hanya kegagalan total, tapi juga degradasi senyap: backup yang berhasil tapi tiba-tiba sangat cepat bisa berarti exclude salah dan data tidak ikut terbackup.
Pendekatan ringan tanpa infrastruktur baru: script menulis file metrik yang dibaca node_exporter (skeleton di episode 19). Pendekatan penuh: resticprofile dengan Prometheus listener (episode 19) yang langsung mengekspos metrik di port :9090.
echo "restic_last_success_timestamp $(date +%s)" > /var/lib/node_exporter/restic.prom
echo "restic_backup_duration_seconds $duration" >> /var/lib/node_exporter/restic.promDi Prometheus, alert paling penting adalah kebalikan dari yang tampak: bukan "status gagal", tapi "tidak ada backup sukses dalam X jam". Ini menangkap kasus server mati total atau alerting yang tidak terkirim:
groups:
- name: restic
rules:
- alert: BackupStale
expr: (time() - restic_last_success_timestamp{job="restic"}) > 86400
for: 1h
labels:
severity: critical
annotations:
summary: "Backup {{ $labels.instance }} sudah {{ $value }} detik tanpa sukses"Aturan kedua — alert langsung saat proses backup gagal:
- alert: BackupFailed
expr: restic_backup_status{job="restic"} == 0
for: 5m
labels:
severity: criticalAlertManager Prometheus mengarahkan alert ke banyak channel sekaligus. Contoh Slack webhook:
receivers:
- name: backup-team
slack_configs:
- api_url: 'https://hooks.slack.com/services/T000/B000/XXXX'
channel: '#backup'
title: '⚠️ {{ .GroupLabels.alertname }}'
text: '{{ .Annotations.summary }}'
email_configs:
- to: 'ops@example.com'
from: 'alert@example.com'
smarthost: 'smtp.example.com:587'Cara paling sederhana tanpa AlertManager: script langsung memanggil API notifikasi saat gagal.
if ! restic backup /data; then
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" -d text="BACKUP GAGAL di $(hostname)"
exit 1
fiTip
Uji pipeline notifikasi secara berkala — channel yang mati atau webhook yang expired sama buruknya dengan tidak punya alerting. Jadwalkan "test alert" bulanan yang mengirim notifikasi nyata.
Dengan metrik dari tiap host (masing-masing label instance=hostname), Grafana bisa menampilkan satu dashboard untuk semua:
restic_stats_raw_data vs restore_size per repo.Cari dashboard community "restic" di grafana.com dan sesuaikan label dengan eksport kalian.
Di episode 21 selanjutnya kita melihat ke depan: roadmap & community — fokus pengembangan pada performa/chunking dan stabilitas backend, kontribusi ekosistem Go, serta komunitas di GitHub, forum.restic.net, IRC, dan docs di restic.readthedocs.io.