Backup dan maintenance adalah alasan paling umum orang memakai cron. Episode ini menjadwalkan rsync, restic, dan pg_dump dengan benar, memverifikasi hasil backup agar tidak asal jalan, lalu menangani logrotate, cleanup tmp, dan update paket yang perlu kehati-hatian.

Di episode 9 kita membangun fondasi keandalan: lock, retry, idempotency, timeout. Sekarang kita terapkan pada penggunaan cron yang paling khas: backup dan maintenance.
Penting untuk luruskan ekspektasi dulu: menjadwalkan backup hanyalah setengah pekerjaan. Backup yang tidak pernah diverifikasi bukanlah backup — ia hanya harapan. Episode ini membahas cara menjadwalkan backup dengan benar sekaligus memastikannya benar-benar bisa dipulihkan.
rsync sempurna untuk backup file ke disk lokal atau server lain — dan idempotent secara alami:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
30 2 * * * flock -n /var/lock/rsync.lock rsync -avz --delete /data/ backup@nas:/backup/data/ >> /var/log/backup.log 2>&1--delete membuat target mencerminkan source (operasi idempotent). Tambahkan timeout bila koneksi sering melambat.
restic adalah tool backup modern dengan deduplikasi, enkripsi, dan snapshot:
30 2 * * * flock -n /var/lock/restic.lock \
restic -r s3:s3.amazonaws.com/bucket backup /data >> /var/log/backup.log 2>&1Secrets restic (repo password) jangan ditaruh di crontab — simpan di env file dengan permission 600 (kita bahas di episode 14):
RESTIC_REPOSITORY=s3:s3.amazonaws.com/bucket
RESTIC_PASSWORD=very-strong-secretBackup PostgreSQL memerlukan pg_dump (dump logis) atau pg_basebackup (fisik). Untuk database kecil-menengah, dump logis cukup:
30 3 * * * pg_dump -h localhost -U backup_user -Fc mydb > /backup/mydb-$(date +%F).dump 2>> /var/log/backup.logPerhatikan 2>> — stderr di-append ke log sementara stdout (file dump) ditulis dengan >.
Warning
Saat mengotomasi pg_dump, pertimbangkan retention: file mydb-2026-08-13.dump menumpuk selamanya tanpa pembersihan. Tambahkan aturan hapus otomatis, misalnya find /backup -name "*.dump" -mtime +14 -delete, atau gunakan tool dengan retention bawaan seperti restic.
Backup perlu dibuktikan, bukan diasumsikan. Tiga tingkat verifikasi:
# Di dalam script backup
if [ $? -ne 0 ] || [ ! -s /backup/mydb.dump ]; then
echo "Backup gagal!" >> /var/log/backup.log
exit 1
fi-s memastikan file tidak kosong. Exit code non-0 berarti dump tidak lengkap.
restic punya perintah verifikasi bawaan — jadwalkan secara berkala:
0 4 * * 0 restic -r s3:s3.amazonaws.com/bucket check --read-data >> /var/log/restic-check.log 2>&1Langkah terakhir yang paling penting: restore test berkala — pulihkan backup ke database/file sementara, idealnya bulanan. Jika restore tidak pernah diuji, kalian tidak tahu backup itu berfungsi sampai terlambat.
logrotate dijalankan secara harian oleh cron di hampir semua distro:
cat /etc/cron.d/logrotateKonfigurasi ada di /etc/logrotate.conf dan /etc/logrotate.d/. Pastikan log job cron kalian punya aturan sendiri (contohnya di episode 5).
File /tmp dan cache bisa mengisi disk tanpa disadari:
0 5 * * * find /tmp -type f -mtime +7 -delete >> /var/log/cleanup.log 2>&1Berhati-hatilah: jangan hapus file yang masih dipakai proses lain — batasi umur (-mtime +7) dan folder spesifik.
Mengotomasi apt upgrade atau dnf update penuh risiko: update bisa merusak dependensi atau memicu restart layanan. Praktik yang lebih aman:
0 6 * * * apt-get update >> /var/log/apt.log 2>&1Caution
Jangan pernah menjadwalkan apt upgrade -y, dnf upgrade -y, atau yum update -y tanpa proses staging. Upgrade otomatis di server produksi adalah penyebab paling umum downtime yang "tanpa penyebab" — layanan restart, kernel berubah, dependensi patah, dan tidak ada yang menyaksikan.
| Jenis | Contoh | Frekuensi | Perhatian |
|---|---|---|---|
| Backup file | rsync | Harian | --delete, lock |
| Backup snapshot | restic | Harian | Enkripsi, retention |
| Backup DB | pg_dump | Harian | Restore test |
| Verifikasi | restic check | Mingguan | --read-data |
| Rotasi log | logrotate | Otomatis | Aturan per-log |
| Cleanup | find /tmp | Harian | Jangan hapus aktif |
| Update | apt-get update | Harian | Hanya index |
Inti yang harus dibawa pulang:
Di episode 11 selanjutnya kita akan membahas randomisasi dan avoid peak load — bagaimana sleep $((RANDOM % 300)) menyebarkan beban, memilih jam sepi 02.00-04.00, dan mencegah banyak host backup serentak menjatuhkan server!