Backup VPS dengan restic adalah salah satu keputusan paling murah yang bisa kita ambil untuk menghindari bencana data. Bayangkan: disk VPS mati besok, atau kita salah menjalankan rm -rf di direktori yang salah — tanpa backup, semua konfigurasi Nginx, database, dan file aplikasi yang susah payah kita bangun hilang dalam hitungan detik. Provider VPS memang menyediakan snapshot, tapi itu terikat pada satu provider, sering berbayar, dan tidak bisa kita pegang sendiri.
Di artikel ini kita akan memasang restic — alat backup open-source yang sudah dipercaya bertahun-tahun — lengkap dengan jadwal otomatis, kebijakan retensi, dan uji restore. Versi stabil saat tulisan ini dibuat adalah 0.19.1 (rilis Juli 2026, sesuai halaman rilis resminya di GitHub). Oke, lanjuutt..
Kenapa restic, Bukan Sekadar tar dan Cron?
Sebelum masuk ke perintah, kita pahami dulu kenapa restic layak dipasang di VPS:
- Snapshot, bukan salinan file. Setiap backup tercatat sebagai snapshot dengan waktu tertentu. Kita bisa kembali ke kondisi server hari Senin, minggu lalu, atau bulan lalu — tanpa menyimpan banyak salinan penuh.
- Deduplikasi otomatis. restic memecah data jadi blok-blok kecil dan hanya menyimpan blok yang belum ada. Backup harian 1 GB data yang berubah sedikit cuma menambah beberapa MB di repositori.
- Terenkripsi dari awal. Data dienkripsi sebelum meninggalkan server, jadi repositori backup di tempat lain (termasuk storage pihak ketiga) tetap aman dibaca orang.
- Satu binary, tanpa dependensi. Tidak ada daemon yang jalan terus-menerus memakan RAM VPS kecil — restic hanya bekerja saat dipanggil.
Kombinasi ini membuatnya pas untuk backup VPS berkapasitas minim, dan sebagai bonus repositorinya bisa ditaruh di storage S3 self-hosted seperti Garage yang sudah pernah kita bahas.
Langkah 1: Pasang restic di VPS
Untuk Debian/Ubuntu, restic tersedia di repositori distro:
sudo apt update
sudo apt install restic
restic version
Kalau versi di repositori distro terasa jauh tertinggal, unduh binary resmi dari GitHub releases:
sudo bzip2 -d /tmp/restic.bz2
sudo mv /tmp/restic /usr/local/bin/restic
sudo chmod +x /usr/local/bin/restic
Perintah restic version harus menampilkan nomor versi — kalau tidak, binary-nya belum berada di PATH.
Langkah 2: Siapkan Repositori dan Password
Repositori adalah “gudang” tempat semua snapshot disimpan. Untuk pemula, mulai dari disk yang terpasang atau partisi terpisah:
mkdir -p /srv/backup/restic
restic init --repo /srv/backup/restic
restic akan meminta password repositori. Ini kunci enkripsi sekaligus satu-satunya cara membuka data — kalau hilang, backup tidak bisa dipulihkan siapa pun. Simpan password itu di tempat terpisah dari VPS (misalnya password manager), dan simpan salinan file password di server agar cron bisa membacanya:
echo "password-rahasia-anda" | sudo tee /etc/restic-pass
sudo chmod 600 /etc/restic-pass
Untuk mempermudah, set variabel lingkungan di skrip backup nanti:
export RESTIC_REPOSITORY="/srv/backup/restic"
export RESTIC_PASSWORD_FILE="/etc/restic-pass"
Catatan penting: repositori di disk yang sama dengan data asli bukan backup sejati — kalau disk VPS mati, ikut hilang semua. Untuk aman, arahkan repositori ke tempat lain: SFTP ke server kedua (
sftp:user@host:/srv/backup), atau backend S3. Ini inti aturan 3-2-1.
Langkah 3: Backup Pertama
Sekarang jalankan backup pertama untuk direktori penting:
restic backup /etc /var/www /home --tag harian
Yang layak dibackup dari VPS: /etc (semua konfigurasi service), /var/www (file aplikasi), /home, plus dump database — PostgreSQL dan MariaDB tidak cukup dibackup dari file datanya yang sedang aktif. Dump dulu, baru masukkan hasilnya ke backup:
sudo -u postgres pg_dumpall > /tmp/pgdump.sql
restic backup /etc /var/www /home /tmp/pgdump.sql --tag harian
rm /tmp/pgdump.sql
Cek daftar snapshot yang sudah tersimpan:
restic snapshots
Langkah 4: Jadwalkan dengan Cron + Atur Retensi
Backup manual pasti dilupakan, jadi otomatisasi kuncinya. Buat skrip sederhana /usr/local/bin/backup-restic.sh:
#!/bin/bash
set -e
export RESTIC_REPOSITORY="/srv/backup/restic"
export RESTIC_PASSWORD_FILE="/etc/restic-pass"
pg_dumpall > /tmp/pgdump.sql
restic backup /etc /var/www /home /tmp/pgdump.sql --tag harian
rm -f /tmp/pgdump.sql
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 3 --prune
Lalu daftarkan di cron:
sudo chmod +x /usr/local/bin/backup-restic.sh
sudo crontab -e
# tambahkan baris ini (jam 03:00 tiap hari):
0 3 * * * /usr/local/bin/backup-restic.sh >> /var/log/restic.log 2>&1
Perintah restic forget --prune inilah yang mengatur retensi: snapshot lama dihapus dan blok data tak terpakai dibersihkan, sehingga repositori tidak membengkak tanpa batas. Kebijakan 7/4/3 adalah titik awal yang wajar untuk VPS pribadi — silakan sesuaikan dengan kebutuhan.
Satu tips tambahan: kalau backup cron gagal diam-diam, kita tidak akan tahu sampai butuh restore. Kombinasikan dengan layanan pemantau cron seperti Healthchecks supaya tiap gagal backup ada notifikasi.
Langkah 5: Uji Restore — Backup yang Belum Diuji Bukan Backup
Ini bagian yang paling sering dilewati, padahal paling penting. Uji restore ke folder sementara:
mkdir /tmp/tes-restore
restic restore latest --target /tmp/tes-restore
ls /tmp/tes-restore/etc/nginx
rm -rf /tmp/tes-restore
Kalau kita hanya butuh satu file, tidak perlu restore semuanya:
restic dump latest /tmp/pgdump.sql > /tmp/cek-db.sql
head -20 /tmp/cek-db.sql
Lakukan uji ini minimal sekali sebulan. restic restore latest mengembalikan snapshot terbaru; ganti latest dengan ID snapshot dari restic snapshots untuk kondisi waktu tertentu.
Masalah yang Sering Muncul dan Cara Mengatasinya
- “repository is already locked exclusively by PID…” — ada proses restic lain masih berjalan (biasanya backup sebelumnya yang menempel). Cek dengan
ps aux | grep restic; kalau benar-benar macet setelah prosesnya mati, lepas kunci denganrestic unlock. Jangan asal unlock kalau backup masih jalan — dua proses menulis bersamaan bisa merusak repositori. - Prune lambat dan makan CPU. Ini normal: prune memang menulis ulang index. Jalankan saja tidak tiap hari — cukup seminggu sekali di jam sepi, atau pisahkan
backupdanforget --pruneke jadwal berbeda. - “wrong password or key” padahal yakin benar. Kemungkinan besar variabel
RESTIC_PASSWORD_FILEtidak terbaca di cron (environment cron minim). Selaluexportkedua variabel di dalam skrip, bukan mengandalkan profil shell. - Repositori makin besar meski ada retensi. Jalankan
restic checkberkala untuk memverifikasi integritas; opsi--read-datamembaca seluruh data dan lebih teliti tapi berat — cukup sebulan sekali.
Kesimpulan
restic memberi kita tiga hal sekaligus: snapshot berkala, deduplikasi yang hemat ruang, dan enkripsi bawaan — semuanya gratis dan ringan untuk VPS kecil. Alur yang kita bangun di sini (init → backup → cron + retensi → uji restore) bisa diselesaikan dalam satu sore, tapi nilainya terasa bertahun-tahun, yaitu ketika pertama kali kita benar-benar perlu memulihkan sesuatu.
Jangan berhenti di langkah pemasangan — uji restore-nya juga, karena backup yang belum pernah dipulihkan itu cuma harapan. Selamat mencoba, dan semoga VPS-nya awet!

