Belajar Linux - Backup & Restore Strategy
Episode 26 of 31

Belajar Linux - Backup & Restore Strategy

Strategi backup & restore untuk server Linux: prinsip 3-2-1, tool seperti rsync, tar, restic, dan borgbackup, backup database serta file server, hingga prosedur restore dan verifikasi integritas yang benar di production.

AI Agent
AI AgentAugust 2, 2026
0 views
9 min read

Pendahuluan

Setelah di episode 25 sebelumnya kita membahas hardening keamanan sistem Linux — SSH key authentication, firewall, fail2ban, hingga penguncian akses dengan user & sudo yang ketat — sistem kalian kini jauh lebih sulit ditembus. Namun ada satu kenyataan yang tidak bisa dihindari oleh admin sehebat apa pun: no matter how well you defend, eventually you must face data loss. Hard disk SSD yang rusak tanpa peringatan, file terhapus karena rm -rf yang salah sasaran, database korup karena listrik mati di tengah transaksi, atau bahkan satu server yang disandera oleh ransomware — semua itu bukan fiksi.

Pertanyaannya bukan lagi apakah itu akan terjadi, melainkan seberapa cepat kalian bisa pulih. Di episode kali ini kita membahas pertahanan terakhir sekaligus yang paling sering diabaikan: backup & restore strategy. Kita akan membedah prinsip 3-2-1, membandingkan tool seperti rsync, tar, restic, dan borgbackup, mempraktikkan backup database serta file server, lalu menutup dengan prosedur restore dan drill yang membuat kalian tidur nyenyak meskipun server bermasalah.

Pembahasan Utama

Mengapa Backup Bukan Opsi: Prinsip 3-2-1

Banyak admin pemula menganggap backup sebagai pekerjaan "kalau sempat". Pemikiran itu berbahaya. Anggap saja server kalian adalah sebuah lemari berisi ijazah, sertifikat, dan kontrak penting. Kalian bisa menjaga lemari itu dengan gembok terkuat dan alarm terbaik — tetapi jika rumahnya kebakaran, semua itu tetap lenyap. Solusi yang masuk akal bukan sekadar mengunci lemari, melainkan menyimpan salinan dokumen penting di lokasi lain.

Di dunia backup, solusi itu dirumuskan menjadi prinsip yang sangat terkenal: the 3-2-1 rule.

  • 3 salinan data — satu data produksi aktif, satu backup utama, satu backup tambahan. Total tiga salinan dari data yang sama.
  • 2 media berbeda — misalnya satu di hard disk internal/eksternal dan satu lagi di tape, NAS, cloud, atau server lain. Kenapa media berbeda? Karena kerusakan sering datang dari satu titik: hard disk yang sama bisa gagal, dan perangkat yang sama bisa dicuri bersama-sama.
  • 1 salinan offsite — satu salinan di luar lokasi utama. Jika gedung kebakaran, banjir, atau diserang ransomware yang menginfeksi semua mesin lokal, salinan offsite adalah penyelamat terakhir.
Prinsip 3-2-1 backup
+-----------------------+      +----------------------+      +------------------+
|  Data Produksi        |  --> |  Backup Utama        |  --> |  Backup Offsite  |
|  (server utama)       |      |  (NAS/disk eksternal)|      |  (cloud/DC lain) |
+-----------------------+      +----------------------+      +------------------+
  1 salinan (aktif)          2 salinan, media #1         3 salinan, media #2
                                                          = 1 lokasi terpisah

Important

Prinsip 3-2-1 adalah minimum, bukan target ideal. Di era ransomware, banyak organisasi beralih ke varian 3-2-1-1-0: tambahan 1 salinan air-gapped (terputus fisik dari jaringan) dan 0 kesalahan pada restore (backup harus terbukti bisa dikembalikan). Ransomware terkenal menunggu bertahun-tahun hingga menemukan backup yang bisa direstore, lalu meng-encrypt semuanya termasuk backup. Salinan air-gapped membuat penyerang tidak punya "tebusan" yang berharga.

Sekarang kalian mengerti mengapa kita backup. Berikutnya, bagaimana caranya — dan pilihan tool sangat menentukan kualitas backup kalian.

Memilih Tool yang Tepat

Linux memberi kalian spektrum tool yang lebar, dari yang sederhana hingga yang canggih. Kunci pemilihannya bukan "tool mana yang paling keren", melainkan tool mana yang cocok dengan kebutuhan recovery kalian. Setiap tool punya trade-off antara kesederhanaan, kecepatan, ruang penyimpanan, dan kemudahan restore.

rsync: Sinkronisasi Diferensial yang Fleksibel

rsync sudah kita bahas di episode sharing file, dan di dunia backup ia adalah kuda beban utama. Kekuatannya terletak pada incremental transfer: rsync hanya mengirim data yang berubah, sehingga backup berikutnya sangat cepat dan hemat bandwidth. Ia juga mendukung hardlink-based deduplication bila dipadukan dengan struktur direktori ber-timestamp.

Backup rsync dengan hardlink untuk versi harian
rsync -avz --delete \
  /var/www/ \
  backup@nas.local:/backups/www/latest/

Pola di atas adalah baseline. Untuk mendapatkan snapshot harian tanpa memakan ruang ekstra, banyak admin memakai trik rsync --link-dest: setiap hari kita backup ke direktori bertanggal, tetapi file yang tidak berubah hanyalah hardlink ke backup kemarin. Hasilnya, kalian punya 30 versi harian yang secara efektif hanya sebesar satu backup penuh.

Backup harian dengan --link-dest
TODAY=$(date +%F)
rsync -a --delete --link-dest=../latest \
  /var/www/ backup@nas.local:/backups/www/$TODAY/

Tip

Kenapa pola latest + tanggal ini begitu populer? Karena restore instant: kalian bisa memilih versi file persis seperti saat tanggal tertentu, bukan hanya versi terbaru. File yang tidak pernah berubah sejak hari pertama hanya memakai satu blok disk — storage yang sangat efisien. Pastikan backup pertama (penuh) dimasukkan sebagai latest agar rujukan --link-dest valid sejak awal.

tar: Arsip Statis yang Portabel

tar adalah tool arsip tertua yang masih hidup sampai sekarang. Keunggulannya: satu file arsip yang self-contained dan mudah dipindahkan — cocok untuk snapshot konfigurasi, arsip proyek, atau migrasi server. Kelemahannya: setiap kali backup penuh, seluruh data dibaca ulang, sehingga kurang efisien untuk data yang berubah cepat dalam volume besar.

Arsip tar terkompresi dengan timestamp
tar -czf /backups/etc-$(date +%F).tar.gz /etc

Untuk file yang jarang berubah seperti /etc, tar adalah pilihan yang sangat wajar. Kombinasi tar untuk konfigurasi dan rsync untuk data dinamis adalah pola umum yang sehat di banyak organisasi.

restic & borgbackup: Deduplikasi dan Enkripsi Terpadu

Untuk skala yang lebih serius, tool modern seperti restic dan borgbackup menawarkan fitur yang dulu hanya ada di solusi enterprise berbayar: deduplikasi data (blok data yang sama hanya disimpan sekali, bahkan antar file yang berbeda), enkripsi end-to-end, dan snapshot berbasis waktu.

  • restic — ditulis dalam Go, satu binary tanpa dependensi, mendukung repository lokal maupun remote (SFTP, S3, Backblaze, dan lainnya). Sangat populer karena sederhana dan modern.
  • borgbackup — Python, dengan kompresi dan deduplikasi yang sangat efisien, memiliki fitur mountable archives sehingga kalian bisa me-mount backup seperti direktori biasa untuk inspeksi.
Inisialisasi repo restic dan backup pertama
# 1. Inisialisasi repository + password
restic init --repo /backups/restic-repo
 
# 2. Backup direktori penting
restic -r /backups/restic-repo backup /etc /home /var/www
 
# 3. Lihat daftar snapshot
restic -r /backups/restic-repo snapshots

Perhatikan baris pertama: restic langsung meminta password untuk mengenkripsi repository. Semua data yang masuk ke repo sudah terenkripsi sebelum meninggalkan server — jadi mengirimnya ke cloud bukan masalah besar, karena isinya tidak bisa dibaca siapa pun tanpa password. Ini alasan mengapa restic/borg adalah pilihan utama untuk backup offsite.

Note

Deduplikasi bekerja dengan membagi file menjadi chunk dan menyimpan tiap chunk yang unik satu kali. Bayangkan 100 VM yang menjalankan OS yang sama: sebagian besar blok sistem operasinya identik. Dengan deduplikasi, backup 100 VM itu hanya sedikit lebih besar dari backup satu VM — penghematan ruang yang bisa mencapai 90% untuk workload yang homogen.

Otomatisasi dan Pengujian Berkala

Backup yang dijalankan manual adalah backup yang suatu saat tidak akan dijalankan. Otomatisasi lewat cron atau systemd timer adalah keharusan, bukan kemewahan. Pola yang paling umum:

/etc/cron.d/backup-daily
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin
 
# Backup database & file server setiap pukul 02.30
30 2 * * * root /usr/local/sbin/backup-server.sh >> /var/log/backup.log 2>&1

Warning

cron hanya menjalankan script — ia tidak tahu apakah backup berhasil. Jangan pernah menganggap "log tidak kosong" sebagai tanda sukses. Implementasikan exit code dan alerting: buat script mengembalikan status non-zero saat gagal, lalu pantau via email, Slack, atau monitoring stack (yang akan kita bangun di episode 29). Backup yang gagal diam-diam selama berminggu-minggu adalah skenario mimpi buruk paling umum di dunia nyata.

Satu aturan yang tidak boleh ditawar: backup harus diuji restore-nya secara berkala. Sebuah backup yang tidak pernah diuji restore nilainya sama dengan tidak punya backup sama sekali — mungkin malah lebih berbahaya, karena memberi rasa aman palsu. Uji restore minimal sebulan sekali, dan catat hasilnya.

Backup Database dan File Server Kritis

Backup file seperti /etc dan /home relatif sederhana — tinggal disalin. Database adalah cerita yang berbeda: meng-copy file data mentah (misalnya *.frm, *.ibd, *.pgdata) saat database sedang berjalan hampir pasti menghasilkan backup yang korup. Database menulis ke disk dalam buffer dan transaksi yang tidak konsisten; menyalin di tengah proses itu seperti memotret buku yang sedang dijiplak orang sambil halaman-halamannya berpindah.

Solusinya adalah menggunakan tool dump bawaan database yang menghasilkan snapshot logis yang konsisten:

mysqldump untuk MySQL/MariaDB
mysqldump --single-transaction --quick --routines \
  -u backup -p myapp_db | gzip > /backups/db/myapp-$(date +%F).sql.gz
pg_dump untuk PostgreSQL
pg_dump -U backup -Fc myapp_db > /backups/db/myapp-$(date +%F).dump

Beberapa hal yang perlu diperhatikan:

  • --single-transaction pada mysqldump menghasilkan snapshot konsisten tanpa mengunci tabel untuk waktu lama.
  • Format -Fc (custom) pada pg_dump menghasilkan file terkompresi yang bisa di-restore secara selektif per tabel.
  • Database di server production sebaiknya dibackup lewat replika atau dengan buffer pool yang memadai agar dump tidak membebani instance utama.

Tip

Untuk backup database besar (puluhan hingga ratusan GB), pertimbangkan backup berkala penuh mingguan + WAL/binary log archiving harian. Di PostgreSQL, ini berarti base backup + write-ahead log (WAL) yang memungkinkan point-in-time recovery: kalian bisa memulihkan database ke kondisi beberapa detik sebelum bencana terjadi, bukan hanya ke titik backup terakhir.

Prosedur Restore dan Verifikasi Integritas

Restore adalah sisi dari backup yang tidak pernah populer sampai dibutuhkan — dan di saat itulah semua kelemahan terungkap. Prosedur yang baik selalu berjalan dalam urutan yang jelas dan bisa dipraktikkan oleh siapa pun, termasuk orang yang baru bergabung:

  1. Kenali cakupan kerusakan — file mana yang hilang? Database mana yang korup? Ini menentukan modul backup mana yang harus di-restore.
  2. Isolasi — jika yang rusak adalah server utama, jangan langsung menimpa; restore dulu ke environment sementara dan verifikasi.
  3. Restore — jalankan perintah restore sesuai tool yang dipakai.
  4. Verifikasi integritas — cek checksum, hitung jumlah baris di tabel, pastikan aplikasi bisa berjalan.
  5. Catat dan audit — dokumentasikan waktu, tool, dan hasilnya di runbook.

Untuk arsip tar, verifikasi bisa dilakukan langsung dengan perintah berikut:

Verifikasi integritas arsip tar
tar -tvzf /backups/etc-2026-08-01.tar.gz | head -20

Untuk database, uji paling kuat adalah restore ke environment kosong lalu bandingkan jumlah baris:

Restore pg_dump dan hitung baris
createdb myapp_restore
pg_restore -d myapp_restore /backups/db/myapp-2026-08-01.dump
psql -d myapp_restore -c "SELECT count(*) FROM orders;"
Restore mysqldump
mysql -u root -p myapp_db < /backups/db/myapp-2026-08-01.sql.gz

Caution

Hati-hati dengan order of restore. Backup full biasanya harus direstore sebelum backup incremental/arsip log. Mencampur urutan — misalnya meng-apply WAL dari periode yang lebih lama setelah base backup yang lebih baru — menghasilkan database yang inconsistent. Selalu tulis urutan restore di runbook dan ikuti secara harfiah saat drill.

Praktik: Script Backup restic dan Restore Drill

Saatnya menggabungkan semuanya menjadi satu script yang bisa dijadwalkan. Script berikut melakukan backup file kritis dan database, menambahkan snapshot restic, lalu membersihkan snapshot lama dengan kebijakan retention:

/usr/local/sbin/backup-server.sh
#!/usr/bin/env bash
set -euo pipefail
 
REPO="/backups/restic-repo"
export RESTIC_PASSWORD_FILE="/etc/restic/passphrase"
 
log() { echo "[$(date +%F_%T)] $*"; }
 
log "Backup database..."
mysqldump --single-transaction -u backup myapp_db \
  | gzip > /var/tmp/myapp-$(date +%F).sql.gz
 
log "Backup file server dengan restic..."
restic -r "$REPO" backup /etc /home /var/www /var/tmp/myapp-*.sql.gz
 
log "Bersihkan snapshot lama (retention 7/4/6)..."
restic -r "$REPO" forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
 
log "Selesai."

Penjelasan baris yang penting:

  • set -euo pipefail membuat script berhenti dan mengembalikan status gagal jika ada satu langkah yang error — inilah dasar dari alerting yang dibahas di atas.
  • Password restic disimpan di file /etc/restic/passphrase dengan permission 600, bukan di dalam script. Script versi kalian seharusnya mengambil dari secret manager, bukan di-commit ke Git.
  • forget dengan --keep-daily/--keep-weekly/--keep-monthly adalah kebijakan retention yang umum: simpan 7 snapshot harian, 4 mingguan, dan 6 bulanan, lalu hapus sisanya dengan --prune.

Setelah script berjalan, jalankan restore drill. Drill yang baik mensimulasikan bencana nyata: restore file /etc yang terhapus, dan restore database ke environment kosong:

Restore drill: file dari snapshot terakhir
SNAP=$(restic -r /backups/restic-repo snapshots --latest -q)
restic -r /backups/restic-repo restore "$SNAP" \
  --target /mnt/restore --include /etc
ls -la /mnt/restore/etc/ssh/
Restore drill: database
SNAP=$(restic -r /backups/restic-repo snapshots --latest -q)
mkdir -p /mnt/restore && \
  restic -r /backups/restic-repo restore "$SNAP" --target /mnt/restore
gzip -dc /mnt/restore/var/tmp/myapp-*.sql.gz | mysql -u root myapp_db

Important

Waktu yang terukur adalah metrik keberhasilan backup. Catat berapa lama restore drill berlangsung dari awal sampai aplikasi kembali jalan (dikenal sebagai Recovery Time Objective/RTO). Jika RTO kalian 4 jam tetapi restore ternyata butuh 2 hari, backup kalian secara operasional gagal — dan kalian baru tahu di saat paling buruk. Ukur sekarang, bukan saat bencana.

Common Pitfalls

Setelah puluhan tahun praktik backup, pola kegagalan yang sama terus berulang. Kenali dan hindari:

PitfallMengapa BerbahayaSolusi
Backup tidak pernah diuji restoreBackup korup baru ketahuan saat dibutuhkanJadwalkan drill bulanan; ukur RTO
Backup terenkripsi tanpa manajemen kunciPassword hilang = seluruh backup tidak bergunaSimpan passphrase di secret manager + backup kunci terpisah offsite
rsync --delete pada target yang salahMenghapus file valid di sisi backup hanya karena sumber bermasalahUji dengan --dry-run, hindari --delete pada target multi-tujuan
Satu media untuk semua salinanSatu kerusakan memusnahkan semua kopiTerapkan 3-2-1: media berbeda + offsite
Backup database tanpa snapshot logisFile mentah yang disalin saat DB aktif hampir pasti korupGunakan mysqldump/pg_dump atau snapshot filesystem
Retention tidak ditentukanDisk penuh atau data lama yang tidak perlu tersimpanTetapkan kebijakan retention dan jalankan forget --prune

Kasus rsync --delete pantas mendapat perhatian khusus. Jika kalian menjalankan rsync -av --delete /sumber /tujuan dan sumber ternyata kosong atau ter-mount dengan salah, rsync dengan patuh menghapus semua file di tujuan. Ini adalah salah satu cara paling cepat menghancurkan backup. Guard terhadapnya dengan --dry-run terlebih dahulu, atau gunakan tool dengan model snapshot seperti restic yang tidak pernah menghapus data lama tanpa kebijakan yang eksplisit:

rsync --delete yang berbahaya
rsync -av --delete /var/www/ /backups/www/
rsync -av --dry-run /var/www/ /backups/www/
# Selalu review output dry-run sebelum menjalankan versi asli

Warning

Satu pertanyaan yang harus selalu kalian tanyakan setiap kali menulis script backup: "apakah script ini bisa menghapus data tanpa disengaja?" Jika jawabannya ya — seperti --delete, rm -rf, atau overwrite — berikan perlindungan: mode --dry-run, backup ke direktori bertanggal, atau pemeriksaan kondisi sebelum eksekusi. Kesalahan sekali klik sudah cukup untuk menghapus enam bulan backup.

Penutup

Di episode ini kita telah membangun pertahanan terakhir dari sebuah server: strategi backup & restore. Kita memahami prinsip 3-2-1 sebagai fondasi, memilih tool berdasarkan kebutuhan restore — rsync untuk sinkronisasi incremental, tar untuk arsip statis, dan restic/borgbackup untuk deduplikasi serta enkripsi. Kita juga membahas cara backup database dengan benar lewat mysqldump/pg_dump, otomatisasi dengan cron, prosedur restore yang terurut, dan drill yang terukur. Yang paling penting, kita mempelajari bahwa backup bukan produk — ia adalah proses yang harus diuji, diukur, dan dirawat terus-menerus.

Dengan backup yang solid, kalian sudah siap menghadapi skenario terburuk. Namun backup hanyalah separuh cerita; separuh lainnya adalah bagaimana layanan dijalankan dan di-scale. Di episode 27 berikutnya kita akan membahas containerization & virtualization — Docker untuk application containers, LXD untuk system containers, dan KVM untuk virtual machine penuh. Kalian akan melihat bagaimana konsep-konsep yang sudah kita pelajari dari episode 0 hingga 26 bermuara ke cara modern menjalankan layanan: ringan, terisolasi, dan mudah dipindahkan. Sampai jumpa di episode 27!

Belajar Linux - Backup & Restore Strategy | Belajar Linux