All Newbie, Semua Tentang Ilmu

Recent

Cara Backup Otomatis VPS ke Object Storage dengan restic

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.

Hard disk drive terbuka memperlihatkan piringan dan head pembaca, ilustrasi media penyimpanan backup
Foto: Gunnar Wolf, CC BY-SA 4.0, via Wikimedia Commons

Ringkasan singkat

  • restic: snapshot, deduplikasi, enkripsi sebelum upload.
  • Frasa sandi disimpan di luar server, bukan hanya di VPS.
  • Timer systemd + flock mencegah 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
Alur backup: VPS, restic, object storage, dan jalur restoreVPS/etc /var/wwwdump databaseresticenkripsi + dedupObject storagebucket /vpstimer 02.30 harianrestore diuji rutin
Diagram: Alur backup: VPS, restic, object storage, dan jalur restore

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 /tmp dan bandingkan ukurannya.
  • systemctl status vps-backup.service tanpa kegagalan.
  • Frasa sandi restic masih tersimpan di luar server.
  • Pertumbuhan repositori wajar menurut restic stats.

Masalah yang sering muncul

GejalaPenyebabSolusi
403 Forbidden saat initAccess key salah atau bucket beda regionCek endpoint dan izin key pada bucket
SignatureDoesNotMatchJam server melencengtimedatectl set-ntp true
Backup sangat lambatUpload kecil-kecil, cache di disk lambatRESTIC_CACHE_DIR di SSD, jalankan saat sepi
Disk penuh saat backupDump database menumpuk di /var/backupsHapus dump lama, atau tulis ke /tmp lalu bersihkan
Restore gagal: password salahRESTIC_PASSWORD berbedaGunakan 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.





0 comments:

Post a Comment