Backup yang tidak pernah diuji restore nilainya nol. Dan backup yang disimpan di server yang sama dengan datanya bukan backup — itu salinan yang akan hilang bersama-sama saat disk rusak atau akun disusupi.

Ringkasan singkat
- restic: snapshot, deduplikasi, enkripsi sebelum upload.
- Frasa sandi disimpan di luar server, bukan hanya di VPS.
- Timer systemd +
flockmencegah tumpang tindih. - Restore harus diuji, bukan diasumsikan berhasil.
Panduan ini memasang backup otomatis VPS ke object storage S3-compatible memakai restic: terenkripsi, terdeduplikasi, dan menyimpan riwayat beberapa versi.
Yang perlu disiapkan
- Bucket S3-compatible (Wasabi, Backblaze B2, IDCloudHost, MinIO, atau AWS S3).
- Access key dan secret key dengan izin hanya ke bucket tersebut.
- Perkiraan ukuran data: minimal 2× ukuran data untuk riwayat.
1. Pasang restic
sudo apt update
sudo apt install -y restic
2. Simpan kredensial dengan aman
sudo install -d -m 700 /etc/restic
sudo tee /etc/restic/env > /dev/null <<'EOF'
AWS_ACCESS_KEY_ID=ISI_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=ISI_SECRET_KEY
RESTIC_REPOSITORY=s3:https://ENDPOINT/BUCKET/vps
RESTIC_PASSWORD=FRASA_SANDI_PANJANG
EOF
sudo chmod 600 /etc/restic/env
RESTIC_PASSWORD adalah kunci enkripsi. Tanpa frasa ini, data di bucket tidak bisa dibuka — termasuk oleh kamu. Simpan salinannya di tempat lain (password manager), bukan hanya di server.
3. Inisialisasi repositori
sudo bash -c 'set -a; . /etc/restic/env; set +a; restic init'
Perintah ini hanya dijalankan sekali. Kalau diulang, restic akan menolak karena repositori sudah ada.
4. Menentukan apa yang dibackup
Yang perlu diselamatkan biasanya konfigurasi, data aplikasi, dan dump database — bukan seluruh sistem operasi:
/etc
/var/www
/home
/var/lib/docker/volumes
Sistem operasi bisa dipasang ulang; datanya tidak. Untuk database, buat dump konsisten lebih dulu:
mysqldump --single-transaction --all-databases | gzip > /var/backups/mysql-$(date +%F).sql.gz
pg_dump -Fc -U postgres appdb > /var/backups/appdb-$(date +%F).dump
5. Skrip backup
sudo nano /usr/local/bin/vps-backup.sh
#!/usr/bin/env bash
set -euo pipefail
set -a; . /etc/restic/env; set +a
export RESTIC_CACHE_DIR=/var/cache/restic
exec 9>/var/lock/vps-backup.lock
flock -n 9 || { echo "backup lain sedang berjalan"; exit 0; }
restic backup /etc /var/www /home /var/backups \
--exclude-caches --exclude '*.tmp' --tag harian
restic forget --tag harian --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
sudo chmod 750 /usr/local/bin/vps-backup.sh
flock mencegah dua backup berjalan bersamaan saat proses sebelumnya belum selesai. --prune membuang data yang tidak lagi dirujuk snapshot supaya biaya penyimpanan tidak terus naik.
6. Jadwalkan dengan systemd timer
sudo tee /etc/systemd/system/vps-backup.service > /dev/null <<'EOF'
[Unit]
Description=Backup VPS ke object storage
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/vps-backup.sh
EOF
sudo tee /etc/systemd/system/vps-backup.timer > /dev/null <<'EOF'
[Unit]
Description=Jadwal backup harian
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=15m
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now vps-backup.timer
systemctl list-timers | grep vps-backup
Persistent=true menjalankan backup yang terlewat saat server mati. RandomizedDelaySec menyebar beban agar tidak menumpuk tepat pukul 02.30 bersama server lain.
7. Uji restore — langkah yang sering dilewatkan
export RESTIC_REPOSITORY=... RESTIC_PASSWORD=...
restic snapshots
restic restore latest --target /tmp/restore
ls -la /tmp/restore/etc | head
Kalau langkah ini belum pernah berhasil, kamu belum punya backup. Lakukan sebulan sekali, dan catat hasilnya.
8. Pantau kegagalan
systemctl status vps-backup.service
journalctl -u vps-backup.service -n 50 --no-pager
Backup yang gagal diam-diam adalah kegagalan paling berbahaya. Kirim status ke layanan healthcheck (misal ping URL setelah sukses) atau email, supaya kamu tahu dalam 24 jam, bukan saat butuh restore.
9. Kebijakan retensi dan biaya
Tanpa kebijakan, snapshot akan menumpuk dan tagihan naik terus. Contoh di atas menyimpan 7 harian, 4 mingguan, dan 6 bulanan. Dengan deduplikasi, snapshot tambahan biasanya hanya menambah data yang berubah.
restic stats --mode raw-data
restic snapshots --compact
Periksa stats sebulan sekali. Kalau ukuran repositori tumbuh jauh lebih cepat daripada pertumbuhan data asli, ada berkas besar yang berubah setiap hari — biasanya log atau cache yang seharusnya dikecualikan.
10. Menguji kecepatan restore
time restic restore latest --target /tmp/uji --include /etc
du -sh /tmp/uji/etc
Ukur waktunya. Kalau restore 5 GB butuh berjam-jam, itu masalah yang harus diketahui sebelum insiden, bukan saat insiden. Catat angka ini di dokumentasi internal dan ulangi setelah perubahan besar.
11. Prinsip 3-2-1
Tiga salinan, dua media berbeda, satu di luar lokasi. Panduan ini baru memenuhi satu salinan off-site. Untuk melengkapinya, tambahkan salinan lokal (misal ke disk eksternal dengan restic) dan uji keduanya bergantian, karena backup yang tidak pernah dipulihkan hanya asumsi.
12. Checklist bulanan
- Restore satu direktori ke
/tmpdan bandingkan ukurannya. systemctl status vps-backup.servicetanpa kegagalan.- Frasa sandi restic masih tersimpan di luar server.
- Pertumbuhan repositori wajar menurut
restic stats.
Masalah yang sering muncul
| Gejala | Penyebab | Solusi |
|---|---|---|
| 403 Forbidden saat init | Access key salah atau bucket beda region | Cek endpoint dan izin key pada bucket |
| SignatureDoesNotMatch | Jam server melenceng | timedatectl set-ntp true |
| Backup sangat lambat | Upload kecil-kecil, cache di disk lambat | RESTIC_CACHE_DIR di SSD, jalankan saat sepi |
| Disk penuh saat backup | Dump database menumpuk di /var/backups | Hapus dump lama, atau tulis ke /tmp lalu bersihkan |
| Restore gagal: password salah | RESTIC_PASSWORD berbeda | Gunakan frasa dari password manager, bukan menebak |
Pertanyaan yang sering diajukan
restic atau rclone?
rclone bagus untuk sinkronisasi file apa adanya, tanpa riwayat. restic memberi snapshot, deduplikasi, dan enkripsi. Untuk backup, restic lebih tepat.
Apakah data terenkripsi di sisi penyedia?
Ya. Enkripsi terjadi sebelum upload, jadi penyedia hanya melihat blob terenkripsi.
Berapa biaya penyimpanannya?
Bergantung penyedia, umumnya puluhan ribu rupiah per bulan untuk data puluhan GB. Deduplikasi membuat snapshot harian jauh lebih murah daripada menyalin ulang seluruh data.
Apakah aman terhadap ransomware?
Lebih aman selama kredensial backup tidak bisa dihapus oleh proses yang terinfeksi. Gunakan key dengan izin tulis saja, aktifkan object lock bila penyedia mendukung.
Baca juga:
0 comments:
Post a Comment