Backup 3-2-1 Praktis untuk VPS dengan Restic dan Object Storage

Foto oleh Glen Carrie

Foto oleh Glen Carrie
Provider VPS itu andal sampai suatu hari tidak. Disk mati, akun tersuspensi gara-gara masalah tagihan, datacenter kebakaran — kebakaran OVH Strasbourg 2021 mengubah banyak strategi backup satu-salinan menjadi postmortem dalam semalam. Pertanyaan tidak nyaman bagi siapa pun yang menjalankan workload production di server sewaan itu sederhana: kalau VPS ini menguap sekarang juga, berapa jam data yang saya hilang, dan berapa lama sampai saya melayani traffic lagi?
Jawaban saya untuk pertanyaan itu adalah aturan 3-2-1 yang diimplementasikan dengan restic dan object storage S3-compatible, dan biayanya hanya beberapa dolar per bulan untuk beberapa server. Artikel ini adalah setup lengkapnya: apa yang sebenarnya dituntut aturan itu, script persis yang saya jalankan tiap malam, kenapa database butuh perlakuan khusus, berapa biayanya, dan latihan restore yang memisahkan sistem backup dari sekadar perasaan aman.
Aturan ini, dipopulerkan Backblaze dan sebelumnya oleh fotografer Peter Krogh, adalah standar minimum, bukan standar emas:
3
Tiga salinan data Anda — data production yang live plus dua backup.
2
Dua media atau sistem penyimpanan berbeda, supaya satu kelas kegagalan tidak bisa mengambil kedua backup sekaligus.
1
Satu salinan off-site — gedung, provider, atau region yang berbeda dari production.
Untuk fleet VPS, terjemahan saya: data live di server, snapshot restic malam hari di object storage pada provider berbeda, dan salinan restic kedua yang disinkronkan ke disk di rumah atau kantor. Penyempurnaan era ransomware seperti 3-2-1-1-0 menambah salinan offline atau immutable dan nol error verifikasi — dan bagian verifikasinya, setidaknya, tidak bisa ditawar di setup saya, seperti akan Anda lihat di script di bawah.
Mem-backup seluruh image VPS adalah default pemalas dan kebanyakan mubazir — OS dan paket bisa direproduksi dari playbook Ansible Anda dalam hitungan menit. Saya hanya mem-backup yang tidak bisa dibangun ulang:
Jangan pernah men-snapshot direktori data database yang sedang berjalan dengan tool level file. File PostgreSQL yang disalin di tengah penulisan itu inkonsisten dan bisa gagal start, dan kegagalannya senyap sampai hari restore. Dump dulu — pg_dump atau pg_dumpall untuk Postgres, mysqldump atau mariadb-dump untuk MySQL — lalu biarkan restic mem-backup dump-nya. Dump itulah backup-nya; restic adalah transport dan arsipnya.
Restic adalah pilihan saya karena mencentang semua kotak sekaligus: enkripsi sisi klien secara default, deduplikasi content-defined yang membuat snapshot inkremental tetap mungil, dan dukungan native untuk backend S3-compatible — AWS S3, Google Cloud Storage, Backblaze B2, MinIO, Wasabi — plus SFTP dan rclone untuk sisanya. Setup-nya adalah init sekali jalan:
# one-time setup: encrypted repo on S3-compatible storage
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
export RESTIC_REPOSITORY=s3:https://storage.googleapis.com/my-backup-bucket
export RESTIC_PASSWORD_FILE=/root/.restic-password
restic initJob malam harilah tempat strategi sesungguhnya hidup. Punya saya adalah shell script pendek yang digerakkan systemd timer, dan setiap barisnya pantas ada di sana:
#!/usr/bin/env bash
# /usr/local/bin/backup.sh — runs nightly via systemd timer
set -euo pipefail
# 1. dump databases to files restic can snapshot
pg_dumpall -U postgres | gzip > /var/backups/pg/all.sql.gz
# 2. snapshot app data + dumps (deduplicated, encrypted)
restic backup /var/backups/pg /srv/app/uploads /etc \
--exclude="*.tmp" --tag nightly
# 3. enforce retention, prune unreferenced data
restic forget --keep-daily 7 --keep-weekly 4 \
--keep-monthly 6 --prune
# 4. verify a sample of the repo actually restores
restic check --read-data-subset=5%
# 5. heartbeat to Uptime Kuma — silence means broken
curl -fsS https://status.example.com/api/push/abc123 > /dev/nullLangkah empat dan lima adalah yang paling sering dilewati. Check dengan read-data-subset mengunduh dan memverifikasi secara kriptografis 5 persen acak data repository tiap malam, jadi korupsi senyap tertangkap dalam hitungan minggu, bukan saat restore. Heartbeat Uptime Kuma di akhir membalik alerting-nya: saya tidak dinotifikasi saat backup sukses, saya di-page saat sinyal sukses berhenti datang — yang juga menangkap mode gagal di mana cron-nya sendiri yang mati.
Begini tiga salinan itu mendarat di provider untuk setup klien tipikal, dengan biaya bulanan untuk kira-kira 50 GB data backup terdeduplikasi:
| Salinan | Tempat tinggalnya | Biaya bulanan (perkiraan) |
|---|---|---|
| Salinan 1 — live | VPS production itu sendiri: PostgreSQL, upload, config. | Sudah termasuk di server yang memang Anda bayar. |
| Salinan 2 — off-site, media berbeda | Repository restic di object storage pada provider dan region berbeda dari VPS. | Beberapa dolar dengan harga object storage tipikal sekitar setengah sen AS per GB. |
| Salinan 3 — media kedua, lokasi kedua | restic copy dari repo yang sama ke disk di kantor, disinkronkan mingguan. | Hardware milik sendiri; praktis gratis setelah dibeli. |
Deduplikasi mengubah ekonominya lebih dari yang orang duga: repository saya menampung berbulan-bulan snapshot malam dari dataset 40 GB dalam kira-kira 55 GB storage, karena blok yang tidak berubah disimpan sekali. Biaya marginal menyimpan enam bulan riwayat dibanding satu bulan nyaris nol — jadi simpan riwayatnya.
Backup yang belum diuji adalah hipotesis. Dua kali setahun, per server, saya menjalankan latihan penuh terhadap VPS sekali pakai dan menghitung waktunya:
Tulis perintah restore ke repo yang sama dengan script backup, sebagai restore.sh yang bisa langsung dijalankan. Saat insiden sungguhan Anda akan stres dan mungkin bukan Anda yang melakukan restore. Script yang bekerja di latihan terakhir mengalahkan dokumentasi, setiap saat.
Setup 3-2-1 sungguhan untuk VPS adalah kerja satu malam: restic init ke bucket object storage, script malam dua puluh baris berisi dump, snapshot, retensi, verifikasi, dan heartbeat, plus salinan kedua di tempat yang Anda kontrol secara fisik. Biayanya dibulatkan jadi secangkir kopi per bulan, dan imbalannya adalah hari infrastruktur terburuk dalam setahun Anda — kebakaran provider, ransomware, rm yang salah ketik — menjadi restore dua jam yang terdokumentasi dan terlatih, bukan peristiwa karier. Backup-lah seolah disk itu sudah mulai rusak, karena di suatu tempat di fleet Anda, memang iya.
Sumber dan bacaan lanjutan