Backup dengan rsync
Cara mengatur penyalinan file ke server lain melalui SSH, membuat riwayat versi menggunakan hard link, dan menghindari penghapusan berlebihan dengan opsi --delete yang berbahaya.
Diperbarui 23 Agustus 2026
rsync adalah cara paling sederhana yang berfungsi untuk membuat salinan: tersedia di mana-mana, hanya mentransfer bagian file yang berubah, dan bekerja melalui SSH. Untuk dataset kecil, itu sudah cukup.
Perintah dasar
rsync -avz --delete \
-e "ssh -i /root/.ssh/backup_key -p 22" \
/var/www/ backup@backup.example.com:/srv/backup/vds/www/
Penjelasan flag:
-a— mempertahankan permission, owner, waktu, dan link;-v— menampilkan apa yang sedang terjadi;-z— kompresi selama transfer (berguna pada bandwidth hingga 500 Mbps jika datanya banyak);--delete— menghapus di penerima apa yang sudah tidak ada di sumber.
Garis miring di akhir path sumber berarti "isi direktori"; tanpa itu, direktorinya sendiri yang disalin.
/var/www/dan/var/wwwmenghasilkan hasil berbeda, dan jika dipasangkan dengan--delete, perbedaan itu menghapus hal yang salah. Selalu jalankan dengan--dry-runterlebih dahulu.
rsync -avzn --delete /var/www/ backup@backup.example.com:/srv/backup/vds/www/
Flag -n adalah dry run.
Kunci akses tanpa kata sandi
Penyalinan terjadwal memerlukan login tanpa memasukkan kata sandi:
ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub backup@backup.example.com
Di penerima, batasi kunci ini ke satu perintah saja — dengan begitu kunci yang dicuri tidak akan memberikan shell. Di ~/.ssh/authorized_keys milik penerima:
command="rrsync -wo /srv/backup",restrict ssh-ed25519 AAAA... backup
Riwayat versi dengan hard link
rsync biasa hanya menyimpan keadaan saat ini: jika Anda menghapus file kemarin dan baru menyadarinya hari ini, tidak ada tempat untuk memulihkannya. --link-dest memberi Anda riwayat: file yang tidak berubah tidak disalin ulang melainkan di-link, sehingga tiga puluh salinan hanya memakan sedikit lebih dari satu.
#!/bin/bash
set -euo pipefail
DEST=/srv/backup/vds
TODAY=$(date +%F)
rsync -a --delete \
--link-dest="$DEST/latest" \
/var/www/ "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -mtime +30 -name "20*" -exec rm -rf {} +
Jalankan skrip sesuai jadwal pada malam hari, dan selalu dengan logging.
Pengecualian
rsync -avz --exclude-from=/root/backup-exclude.txt / backup@host:/srv/backup/vds/root/
/proc/
/sys/
/dev/
/run/
/tmp/
/var/lib/docker/
/var/cache/
*.log
Menyalin seluruh root jarang diperlukan: lebih berguna menyusun daftar yang tepat dari artikel apa saja yang perlu di-backup.
Kapan rsync tidak cocok
- Jika Anda memerlukan enkripsi penyimpanan dan deduplikasi, gunakan Restic.
- Jika data berubah terus-menerus dan integritas penting, dump database terlebih dahulu, lalu rsync file hasilnya.
- Penerima adalah penyimpanan milik orang lain yang tidak Anda percayai: rsync menulis file apa adanya, tanpa enkripsi di sisi klien.
Kesalahan umum
--deletedengan path sumber yang salah. Direktori sumber yang kosong menghapus isi penerima. Dry run wajib dilakukan.- Salinan di disk yang sama. Itu bukan backup, melainkan target kedua untuk kegagalan yang sama. Lihat salinan offsite.
- Kompresi untuk data yang sudah terkompresi.
-zhanya memperlambat arsip dan gambar. - Proses malam hari menabrak bottleneck disk. Batas throughput tulis bergantung pada tier: lihat kecepatan disk.
--bwlimit=20000dan menjalankannya di luar jam sibuk membantu. - Tidak ada yang memeriksa hasilnya. Catat return code dan pantau:
rsync ... || echo "backup failed" | mail -s alert you@example.com.