Maskot beruang kutub NordBastion berdiri di dalam vault batu Nordik yang gelap di samping rak server, mengangkat sebuah kunci cyan yang menyala, sementara rantai lima blok holografik cyan bertanda gembok melengkung melewati gerbang lengkung berukir rune menuju rak server kedua di kejauhan di bawah aurora yang samar
How-to · Opsec·16 menit baca · 45 menit hands-on

Backup VPS terenkripsi.
Tersimpan offsite, terdeduplikasi, dan di luar jangkauan.

Backup VPS terenkripsi dalam enam langkah: dari server yang tidak terlindungi sampai repository terenkripsi yang terverifikasi di mesin kedua pada yurisdiksi kedua — perbandingan restic dan Borg, database dump yang pulih bersih, systemd timer, dan repository append-only yang tidak bisa dihapus server yang sudah disusupi. Mesin kedua ini hanya $3.90 per bulan. Diuji di Debian 12.

Enam langkah
  1. 01

    Inventaris

    Apa yang tidak bisa dibangun ulang

  2. 02

    Pasang

    restic atau Borg

  3. 03

    Tujuan

    Bastion kedua

  4. 04

    Inisialisasi

    Repository + run pertama

  5. 05

    Otomatiskan

    Dump, timer, retensi

  6. 06

    Latihan

    Pulihkan, dan catat waktunya

Sebelum Anda mulai · Untuk apa panduan ini

Empat cara data bisa mati. Hanya satu di antaranya yang berupa disk rusak.

Hampir setiap perdebatan soal backup sudah salah arah sejak menit pertama, karena kedua pihak yang bicara membayangkan kegagalan yang berbeda. Yang satu membayangkan drive yang mati. Yang lain membayangkan suatu Selasa pagi di mana akunnya lenyap. Keduanya butuh jawaban yang berbeda, dan setup yang hanya bertahan dari yang pertama terasa aman — sampai diuji oleh yang kedua.

Ada empat mode kegagalan yang layak diantisipasi sejak desain, dan semuanya bukan sekadar variasi dari satu tema — masing-masing mengalahkan pertahanan yang berbeda.

Perangkat keras. NVMe gagal, host node mati, array kehilangan dua anggota sekaligus. Ini kegagalan yang selalu direncanakan semua orang, dan justru yang paling jarang terjadi pada infrastruktur virtualisasi modern. Penyimpanan redundan mengatasinya. Penyimpanan redundan tidak mengatasi hal lain, itulah sebabnya RAID bukan backup dan tidak pernah menjadi backup: ia menyalin setiap penulisan dengan setia, termasuk penulisan yang berbunyi "hapus semuanya".

Manusia. Skrip migrasi yang dijalankan terhadap sistem produksi. DROP TABLE di terminal yang salah. rsync dengan argumen yang terbalik. Ini, dengan selisih jauh, adalah penyebab paling umum dari kehilangan data yang sesungguhnya, dan satu-satunya pertahanan terhadapnya adalah riwayat — salinan dari sebelum kesalahan terjadi, disimpan di tempat yang tidak terjangkau oleh kesalahan itu. Waktu adalah bahan utamanya: jika satu-satunya salinan adalah mirror yang tertinggal tiga puluh detik, salinan itu sudah memuat kesalahan tersebut.

Jahat. Seseorang mendapatkan akses root, atau ransomware masuk lewat aplikasi yang belum ditambal. Hal pertama yang dilakukan ransomware modern adalah mencari konfigurasi backup — kredensial, shares yang ter-mount, kunci cloud — lalu menghancurkan apa pun yang ditemukannya, justru karena pemulihan yang berhasil mengubah bencana menjadi urusan satu sore saja. Kredensial backup yang bisa menghapus adalah kredensial backup yang diwarisi penyerang. Inilah kegagalan yang membuat bab append-only pada panduan ini ada.

Kustodial. Tidak ada yang rusak dan tidak ada yang diserang; Anda hanya kehilangan akses. Akun yang ditangguhkan karena sinyal penipuan otomatis, kartu yang gagal saat Anda sedang bepergian, sengketa, tinjauan kepatuhan, perintah hukum yang dilayangkan ke penyedia. Mesinnya utuh tapi tidak terjangkau, dan setiap snapshot di dalam akun itu ikut tidak terjangkau. Inilah kegagalan yang tidak bisa dijawab oleh redundansi sebanyak apa pun selama masih berada dalam satu penyedia, dan inilah alasan mengapa backup yang serius harus berada di bawah atap yang berbeda.

Pertahanan Perangkat keras Kesalahan manusia Ransomware Akun hilang
RAID / penyimpanan redundanYaTidakTidakTidak
Snapshot penyedia, akun yang samaYaSebagianTidakTidak
Repositori offsite, kunci yang bisa menulisYaYaTidakYa
Repositori offsite, append-only, yurisdiksi lainYaYaYaYa

Baris terakhir adalah yang dibangun oleh sisa panduan ini. Baris ini tidak lebih mahal dari baris di atasnya — pengaturan append-only gratis dan yurisdiksi kedua berbiaya sama, $3.90, seperti yang pertama.

Aturan 3-2-1, dirumuskan ulang untuk satu VPS. Tiga salinan data, pada dua jenis penyimpanan yang berbeda, salah satunya offsite. Rumusan klasik ini berasal dari era tape dan server kantor, dan semangatnya bertahan lebih baik daripada bunyi literalnya. Untuk satu mesin self-hosted, bunyinya jadi: data live di VPS, satu repository di mesin kedua di tempat lain, dan — untuk apa pun yang benar-benar tidak tergantikan — satu salinan ketiga yang bisa kamu pegang sendiri, di disk di rumah atau di dalam laci. Angka yang sebenarnya penting bukanlah tiga. Yang penting adalah berapa banyak hal independen yang harus sama-sama gagal sebelum data itu benar-benar hilang. Dua adalah jumlah minimum yang layak dimiliki.

Sebelum Anda mulai · Pilihan alat

restic, Borg, atau rsync. Dua di antaranya adalah backup.

Kategori yang kamu cari disebut alat snapshot yang melakukan deduplikasi dan enkripsi. Alat ini memecah setiap file menjadi chunk berbasis konten, mengenkripsi setiap chunk di mesin pemilik data, dan menyimpannya hanya sekali berapa pun banyaknya snapshot yang merujuknya. Itu memberimu tiga sifat sekaligus: banyak titik pemulihan dengan ruang yang nyaris tidak lebih besar dari satu titik saja, plaintext yang tidak pernah meninggalkan sumber, dan transfer yang hanya memindahkan apa yang berubah.

Dua program mendominasi ranah ini dan keduanya sama-sama unggul. restic adalah satu binary Go statis dengan beragam storage backend. BorgBackup adalah program Python yang berbicara lewat SSH ke salinan dirinya sendiri di sisi jauh. Semua yang di bawah ini adalah perbedaan jujur di antara keduanya.

Properti restic BorgBackup rsync / rclone
Enkripsi sisi klienSelalu aktif, bukan opsionalSelalu aktif, bukan opsionalHanya lewat rclone crypt remote
DeduplikasiChunk berbasis kontenChunk berbasis kontenTidak ada, atau hardlink tree
Riwayat snapshotYa, dengan kebijakan retensiYa, dengan kebijakan retensiMirror dari saat ini
Persyaratan tujuanTidak ada — SFTP, S3, REST, rcloneBorg terpasang di kedua ujungAkun SSH atau API
Penerapan append-onlyLewat rest-server atau object lockBawaan, lewat SSH biasaTidak ada
Cocok untukHampir semua orang, sebagian besar backendMesin SSH milik Anda sendiri, append-onlyMirroring, bukan backup

rsync ada di tabel ini karena itulah yang paling dulu diraih kebanyakan orang, dan karena rsync memang bukan alat yang tepat: mirror mereproduksi penghapusan dengan setia, dan mirror dari disk yang terenkripsi-saat-diam itu sendiri sama sekali tidak terenkripsi di mana pun. Tempatnya yang wajar di dalam sebuah backup adalah sebagai alat yang memindahkan arsip yang sudah jadi, bukan sebagai arsipnya sendiri.

Panduan ini menampilkan restic maupun Borg untuk setiap perintah yang berbeda, jadi kamu bisa mengikutinya dengan salah satu dari keduanya. Di bagian yang harus memilih satu — contoh kerja, timer, script — panduan ini memakai restic, karena dengan begitu sisi tujuan hanya butuh satu akun SSH dan itu membuat mesin kedua tetap sederhana.

Langkah 01 · Inventaris

Apa yang tidak bisa dibangun ulang. Tuliskan sebelum kamu mengotomatiskannya.

Membackup seluruh filesystem adalah pilihan yang bisa dipertahankan sekaligus pilihan yang boros. Sebagian besar isi server hanya berjarak satu package manager dari bisa dibuat ulang, dan setiap gigabyte yang Anda bawa membuat repositori makin lambat untuk di-prune, makin mahal untuk disimpan, dan makin lambat untuk dicari saat Anda sedang terburu-buru. Latihan yang lebih berguna justru sebaliknya: daftar apa saja yang tidak akan dikembalikan oleh instalasi baru.

Untuk VPS self-hosted yang umum, daftar itu pendek, dan selalu berisi lima hal berikut:

  • 01Isi database. Bukan direktori data — melainkan dump-nya. Langkah 05 menjelaskan alasannya.
  • 02File yang diunggah pengguna. Volume Docker, direktori uploads atau media, mail store. Biasanya inilah yang memakan sebagian besar byte.
  • 03Konfigurasi dan data rahasia. File Compose, file .env, kunci enkripsi, token API. Kecil, tapi menjadi pembeda antara pemulihan dua jam dan pemulihan dua hari.
  • 04Status sistem yang sudah kamu ubah. /etc secara keseluruhan cukup kecil untuk diambil sepenuhnya — konfigurasi sshd, aturan firewall, unit systemd, entri cron, routing email yang Anda habiskan satu malam untuk menyiapkannya.
  • 05Apa pun yang memiliki identitas yang melekat. Kunci hidden-service Tor, kunci penandatanganan Matrix, kunci privat WireGuard, dompet node. Kehilangan salah satu dari kunci ini dan layanan tidak akan kembali — yang kembali adalah layanan berbeda dengan nama yang sama.

Ubah daftar itu menjadi dua file di server sumber. Daftar include membuat maksudnya tetap terlihat jelas; daftar exclude menjaga agar noise tidak ikut masuk. Keduanya dibaca oleh perintah backup, dan keduanya sendiri juga harus ikut dibackup.

/etc/backup/include.txt

/etc
/opt
/root
/var/backups
/var/lib/docker/volumes
/home

/etc/backup/exclude.txt

# Caches and rebuildable artefacts
**/node_modules
**/.cache
**/*.tmp
/var/lib/docker/volumes/*/_data/cache
# Log noise — keep the config, drop the volume
/var/log/journal
# Never back up the mount point you restore into
/mnt/restore

Dua catatan soal baris Docker itu, karena sering membuat orang keliru. Named volume berada di bawah /var/lib/docker/volumes dan itulah yang kamu inginkan; bind mount berada di mana pun kamu menaruhnya, biasanya di sebelah file Compose, dan sudah tercakup oleh /opt. Image container bukan data — ia bisa kembali hanya dengan pull, dan backup yang ikut membawanya hanya membawa gigabyte yang tidak dibutuhkan.

Terakhir, ukur dulu hasilnya sebelum Anda membangun apa pun di sekitarnya. Angka itu memberi tahu tier repositori mana yang perlu dipesan dan apakah proses pertama akan memakan waktu empat menit atau empat puluh menit:

du -sh --exclude=/var/lib/docker/overlay2 /etc /opt /root /home /var/lib/docker/volumes
Langkah 02 · Pasang

Satu binary di sisi sumber. Tidak ada lagi yang berubah.

Pasang alatnya di mesin yang menyimpan data itu. Di Debian dan Ubuntu keduanya sudah tersedia sebagai paket, dan untuk restic paket dari distribusi sering kali tertinggal satu atau dua rilis — ini penting, karena fitur repositori dan perbaikan performa justru muncul di point release. Pasang paketnya, lalu biarkan restic memperbarui dirinya sendiri di tempat:

apt update && apt install -y restic
restic self-update
restic version

Untuk Borg, paket dari distribusi adalah pilihan yang tepat, karena versi di sumber dan versi di tujuan harus saling memahami, dan pasangan yang cocok dari rilis distribusi yang sama adalah cara paling tidak merepotkan untuk mendapatkannya:

apt install -y borgbackup
borg --version

Satu catatan soal versi mayor sebelum Anda mempercayakan riwayat bertahun-tahun ke sebuah repositori: format repositori Borg berubah antar-lini mayornya, dan memindahkan repositori melewati batas itu adalah konversi, bukan upgrade. Baca release notes dari versi yang Anda pasang, dan jaga agar tujuan berada di lini mayor yang sama dengan sumber. restic bersifat forward-compatible di seluruh rilisnya dan menambahkan fitur di balik versi repositori yang eksplisit, sehingga kekhawatiran serupa di sini jauh lebih kecil.

Tidak satu pun dari kedua alat ini butuh daemon, agent, atau port terbuka di sisi sumber. Ini layak ditegaskan: sistem backup yang Anda pasang tidak menambahkan layanan yang mendengarkan (listening) dan tidak menambah attack surface baru pada mesin yang dilindunginya. Semua yang dilakukannya bersifat outbound, terjadwal, lewat SSH.

Langkah 03 · Tujuan

Bastion kedua, dan kunci yang tidak bisa menghapus. Inilah langkah yang benar-benar penting.

Host repository punya satu tugas dan nyaris tanpa persyaratan. Ia tidak butuh core CPU, karena tidak pernah membaca datamu — ia hanya menyimpan blob terenkripsi yang tidak bisa dibukanya. Ia tidak butuh memori, karena kerja deduplikasi terjadi di sisi sumber. Yang ia butuhkan hanyalah disk, alamat yang stabil, dan berada di suatu tempat yang tidak ikut terseret masalah mesin sumber.

Di panel: Order → VPS → Sentinel, image Debian 12, dan — inilah inti persoalannya — bastion yang berbeda dari tempat sumber berjalan. Helsinki untuk kerja, Reykjavík untuk menyimpan. Tidak perlu alamat email untuk membuka akun dan tagihannya bisa dilunasi dengan Monero, Bitcoin, Lightning, atau aset lain yang didukung, yang berarti mesin kedua ini tidak memunculkan kembali identitas yang sudah dijaga hati-hati oleh mesin pertama.

Target repository Bulanan Penyimpanan Working set yang ditampungnya Biaya untuk memulihkan
Sentinel$3.90120 GB NVMe~30 GBTidak ada — tanpa meteran
Garrison$7.90240 GB NVMe~70 GBTidak ada — tanpa meteran
Ravelin$16.90480 GB NVMe~150 GBTidak ada — tanpa meteran
Bulwark$32.90960 GB NVMe~300 GBTidak ada — tanpa meteran
Object storage kelas S3~$0.023/GBElastisApa sajaEgress termeteran

Kolom working set mengasumsikan snapshot harian yang disimpan selama satu tahun dengan tingkat perubahan normal; repository yang sebagian besar berisi file yang jarang berubah bisa bertahan jauh lebih lama, sedangkan yang penuh binary besar yang sering ditulis ulang bertahan lebih singkat. Baris terakhir ada untuk skala, dan untuk detail yang sering dilupakan orang sampai hari buruk itu tiba: object storage juga membebankan biaya untuk download, dan download adalah hal yang kamu lakukan saat keadaan darurat.

Di sisi tujuan — user tanpa privilese dan sebuah direktori.

adduser --disabled-password --gecos "" backup
install -d -m 0700 -o backup -g backup /srv/restic/web01

Pengguna backup ini tidak punya password, tidak punya akses sudo, dan tidak ada apa pun untuk di-login. Ia ada hanya untuk memiliki satu direktori. Beri direktori tersendiri untuk setiap mesin sumber jika kamu membackup beberapa mesin — satu repository per sumber menjaga agar penyusupan di satu mesin tidak menyentuh riwayat mesin lain.

Di sisi sumber — kunci yang tidak dipakai untuk hal lain apa pun.

ssh-keygen -t ed25519 -f /root/.ssh/id_backup -N "" -C "backup:web01"
cat /root/.ssh/id_backup.pub

Jangan pakai ulang kunci login Anda. Kunci ini disimpan tidak terenkripsi di disk karena timer tanpa pengawasan harus memakainya pukul tiga pagi, dan itu justru jenis kunci yang seharusnya Anda batasi ruang lingkupnya hanya untuk satu tujuan dan satu keperluan.

Kembali ke tujuan — batasi apa yang boleh dilakukan kunci itu. Tempelkan kunci publik ke /home/backup/.ssh/authorized_keys dengan prefix di depannya. Untuk restic lewat SFTP:

restrict,from="198.51.100.7" ssh-ed25519 AAAAC3NzaC1lZDI1... backup:web01

Opsi restrict mematikan port forwarding, agent forwarding, X11, dan alokasi PTY hanya dengan satu kata, hanya menyisakan transfer file dan tidak ada yang lain. Klausa from= mengunci kunci itu ke alamat sumber, sehingga salinannya yang dicuri dari server tidak berguna di tempat lain mana pun. Untuk Borg, maju satu langkah lagi dan paksa perintahnya (force command), di sanalah mode append-only-nya berada:

command="borg serve --append-only --restrict-to-path /srv/borg/web01",restrict ssh-ed25519 AAAAC3NzaC1lZDI1... borg:web01

Baris itu adalah keseluruhan pertahanan ransomware dalam satu tempat: apa pun yang dikirim sumber, tujuan hanya akan pernah menjalankan borg serve, hanya di dalam path itu, dan hanya dalam mode yang menambahkan (append). Root shell di sisi sumber tidak bisa memakai kunci ini untuk menghapus data bulan lalu.

Beri nama tujuan sekali saja, di sisi sumber. Taruh di /root/.ssh/config agar setiap perintah berikutnya singkat dan alamatnya hanya hidup di satu file:

Host rkv-repo
    HostName 198.51.100.42
    User backup
    IdentityFile /root/.ssh/id_backup
    IdentitiesOnly yes

Lalu sambungkan sekali secara manual — ssh rkv-repo — untuk menerima kunci host. Timer yang berjalan tanpa pengawasan tidak akan menjawab prompt fingerprint, dan backup pertama yang menggantung diam-diam selama seminggu adalah kejadian klasik. Selagi kamu berada di sisi tujuan, perlakukan ia sama seperti mesin lain yang kamu miliki: jalankan juga checklist pengerasan jam pertama di sana. Mesin ini menyimpan salinan segalanya, dan pantas mendapatkan satu jam penuh itu.

Langkah 04 · Inisialisasi

Passphrase, lalu snapshot pertama. Dalam urutan itu, dan di luar mesin itu sendiri.

Buat passphrase yang tidak akan pernah Anda ketik sendiri. Passphrase ini dibaca dari file oleh skrip, jadi panjangnya tidak jadi soal dan tidak ada alasan untuk membuatnya mudah diingat:

openssl rand -base64 32 > /root/.restic-pass
chmod 600 /root/.restic-pass
cat /root/.restic-pass

Sekarang berhenti sejenak dan salin string itu ke suatu tempat yang bukan server ini. Pengelola kata sandi, catatan kertas di laci, mesin kedua — di mana pun yang tetap bertahan meski sumbernya hilang. Ini adalah kegagalan yang sama yang menghancurkan vault self-hosted dan mesin automasi: kunci yang mendekripsi segalanya disimpan tepat di sebelah segalanya, dan keduanya hilang bersama-sama. Repositori yang passphrase-nya hanya ada di mesin yang dilindunginya bukanlah backup; itu hanyalah tumpukan noise yang rapi.

Tulis file environment yang akan dibaca oleh setiap perintah berikutnya:

/etc/backup/restic.env

RESTIC_REPOSITORY=sftp:rkv-repo:/srv/restic/web01
RESTIC_PASSWORD_FILE=/root/.restic-pass
chmod 600 /etc/backup/restic.env
set -a; . /etc/backup/restic.env; set +a
restic init

Pasangan yang setara untuk Borg — mode repokey menyimpan kunci enkripsi di dalam repository, dilindungi oleh passphrase, yang memang praktis dan justru karena itulah kamu juga perlu mengekspor salinannya:

export BORG_REPO=ssh://borg@rkv-repo/srv/borg/web01
export BORG_PASSCOMMAND="cat /root/.restic-pass"
borg init --encryption=repokey-blake2
borg key export ::  /root/borg-key.txt   # copy this off the server too

Snapshot pertama. Jalankan secara manual, awasi prosesnya, dan biarkan selesai sebelum kamu mengotomatiskan apa pun. Ini yang paling lambat — setiap chunk masih baru — dan run inilah yang menunjukkan apakah daftar include sudah benar:

restic backup \
  --files-from /etc/backup/include.txt \
  --exclude-file /etc/backup/exclude.txt \
  --tag nightly --one-file-system --verbose

Jika sumber sedang melayani traffic dan upload-nya memenuhi link, batasi kecepatannya. Flag ini memakai satuan kibibyte per detik, jadi 20000 kira-kira setara 20 MB/s:

restic backup --limit-upload 20000 --files-from /etc/backup/include.txt

Setelah selesai, lihat apa yang sebenarnya kamu dapatkan. Tiga perintah ini yang perlu dijalankan sekarang, dan lagi enam bulan ke depan saat kamu sudah berhenti memikirkan semua ini:

restic snapshots                    # the list, with dates and tags
restic stats latest                 # what the newest snapshot contains
restic ls latest /etc/backup        # confirm a path you expected is in there

Perintah ketiga itu layak diperhatikan sejenak. Separuh dari semua backup yang "rusak" sebenarnya tidak rusak sama sekali — itu adalah repository yang lengkap dan sehat, tapi dari direktori yang salah. Menampilkan path yang kamu harapkan ada, tepat pada snapshot pertama, menangkap masalah itu selagi file include masih segar di ingatanmu.

Langkah 05 · Otomatisasi

Dump dulu, baru snapshot. Satu skrip, satu timer, satu kebijakan retensi.

Aturan database, dinyatakan sekali. Mesin database yang sedang berjalan menyimpan state di memori dan menuliskannya ke disk sesuai waktunya sendiri. Baca filenya saat proses itu berlangsung dan Anda mendapatkan sekumpulan halaman dari beberapa momen yang berbeda — file yang mungkin bisa dipulihkan, mungkin pulih dalam keadaan rusak, atau mungkin pulih menjadi sesuatu yang terbuka dengan baik namun diam-diam kehilangan data satu jam terakhir. Tidak ada cara untuk mengetahui yang mana dari luar. Karena itu backup tidak pernah menyentuh file live: dump ditulis ke disk terlebih dahulu, dan backup mengambil dump tersebut.

Semuanya masuk ke dalam satu skrip. Letakkan di /usr/local/sbin/nb-backup.sh, jadikan executable, dan simpan skrip itu di dalam backup itu sendiri:

#!/bin/sh
set -eu

# ---- 1. Consistent dumps, written where the include list will find them.
install -d -m 0700 /var/backups/db

# PostgreSQL in a container:
docker exec -t app-db pg_dumpall -U postgres | gzip -9 > /var/backups/db/postgres.sql.gz

# MariaDB / MySQL, InnoDB tables:
# docker exec -t mail-db mariadb-dump --single-transaction --all-databases \
#   | gzip -9 > /var/backups/db/mariadb.sql.gz

# SQLite — never a plain file copy:
# sqlite3 /opt/app/data/app.db ".backup '/var/backups/db/app.db'"

# ---- 2. The snapshot.
restic backup \
  --files-from /etc/backup/include.txt \
  --exclude-file /etc/backup/exclude.txt \
  --tag nightly --one-file-system

# ---- 3. Retention, then reclaim the space it freed.
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune

# ---- 4. Structural check every night; read 5% of the data on Sundays.
restic check
[ "$(date +%u)" = "7" ] && restic check --read-data-subset=5%

echo "backup ok: $(date -u +%FT%TZ)"

Tiga detail dalam script itu bekerja lebih keras daripada yang terlihat. Set -eu di bagian atas berarti dump yang gagal akan membatalkan run, alih-alih diam-diam menyimpan snapshot dari dump kemarin selama enam bulan ke depan. Forget dan prune dijadikan satu perintah, karena kebijakan retensi yang tidak pernah membebaskan ruang sama saja dengan disk yang terus penuh. Dan pemeriksaan hari Minggu membaca sebagian data yang sebenarnya, bukan hanya indeksnya — korupsi repository itu jarang terjadi, dan diam-diam, dan satu-satunya cara menemukannya adalah dengan membaca.

Timer-nya. Dua file unit kecil. systemd adalah scheduler yang tepat di sini, bukan cron, karena timer memberimu Persistent — run yang terlewat saat mesin mati akan dijalankan pada boot berikutnya, bukannya dilewatkan begitu saja tanpa suara — dan karena journalctl kemudian menyimpan riwayat setiap run.

/etc/systemd/system/nb-backup.service

[Unit]
Description=Nightly encrypted offsite backup
Wants=network-online.target
After=network-online.target docker.service

[Service]
Type=oneshot
EnvironmentFile=/etc/backup/restic.env
ExecStart=/usr/local/sbin/nb-backup.sh
Nice=10
IOSchedulingClass=idle

/etc/systemd/system/nb-backup.timer

[Unit]
Description=Nightly encrypted offsite backup

[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=45m
Persistent=true

[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now nb-backup.timer
systemctl list-timers nb-backup.timer
systemctl start nb-backup.service && journalctl -u nb-backup.service -n 40 --no-pager

Jeda acak itu bukan hiasan. Setiap server self-hosted di internet menjalankan maintenance-nya tepat pukul 03:00, dan backup yang mulai di detik yang sama dengan rotasi log, perpanjangan sertifikat, dan update container akan menghabiskan malamnya berebut I/O dengan mereka. Menyebarkan waktu mulai dalam rentang empat puluh lima menit tidak memakan biaya apa pun dan menghilangkan seluruh kategori malam-malam lambat yang misterius.

Lalu buat kegagalan itu bersuara keras. Ini langkah yang selalu dilewatkan semua orang, padahal langkah inilah yang menentukan apakah semua yang di atas tadi ada gunanya. Backup yang berhenti bekerja tidak memberi tahu apa pun: timer tetap menyala, layanan tetap gagal, dan snapshot baik terakhir semakin mundur ke masa lalu sementara dashboard tetap hijau. Tambahkan unit OnFailure= ke layanan itu yang mengirimimu sesuatu yang benar-benar akan kamu lihat, dan sebulan sekali lirik bagian atas daftar snapshot. Satu baris, satu kebiasaan.

restic snapshots --latest 3        # is the newest one from last night?
systemctl list-timers nb-backup.timer   # is the timer still armed?
Langkah 06 · Latihan

Pulihkan sekarang, selagi tidak ada yang terbakar. Backup yang belum diuji hanyalah rumor.

Ada dua latihan, dan keduanya menjawab pertanyaan yang berbeda. Yang kecil bertanya "apakah datanya benar-benar ada di sana dan bisa dibaca?" dan hanya butuh sembilan puluh detik. Yang besar bertanya "berapa lama sebenarnya waktu yang dibutuhkan untuk mengembalikan layanan?" dan butuh satu sore, setahun sekali. Lakukan yang kecil setiap bulan. Lakukan yang besar setidaknya sekali, karena jawabannya nyaris tidak pernah sesuai dugaan orang.

Latihan kecil. Tarik satu direktori dan satu dump ke path sementara, lalu bandingkan dengan yang live:

install -d -m 0700 /mnt/restore
restic restore latest --target /mnt/restore --include /etc/backup
restic restore latest --target /mnt/restore --include /var/backups/db

diff -r /etc/backup /mnt/restore/etc/backup && echo "config identical"
gzip -t /mnt/restore/var/backups/db/postgres.sql.gz && echo "dump readable"

Lebih baik lagi, kalau alatnya mendukung: mount repositori dalam mode read-only dan jelajahi seperti filesystem biasa. Setiap snapshot muncul sebagai direktori bertanggal, dan Anda bisa menelusuri riwayatnya dengan ls dan cat tanpa perlu memulihkan apa pun sama sekali. Ini butuh FUSE pada mesin yang melakukan mounting:

restic mount /mnt/snapshots      # then: ls /mnt/snapshots/snapshots/latest/
borg mount ::  /mnt/snapshots     # the Borg equivalent

Latihan besar. Pesan VPS sementara per jam, lalu bangun ulang layanan itu di atasnya hanya dari repository — tanpa catatan dari ingatan, tanpa file yang disalin dari mesin live. Kerjakan berdasarkan runbook tertulis dan perbaiki runbook itu sambil berjalan, karena celah yang kamu temukan adalah inti dari latihan ini. Temuan yang biasa muncul, berurutan dari yang paling sering: passphrase hanya ada di mesin yang sudah mati; catatan DNS tidak pernah ditulis; direktori bind-mounted berada di luar semua include path; pemulihan membutuhkan versi paket yang sudah bukan default lagi; tidak ada yang tahu container mana yang harus dijalankan lebih dulu.

Catat waktunya. Tulis angka itu di bagian atas runbook beserta tanggalnya. Angka itu — bukan ukuran repository, bukan jumlah snapshot — adalah satu-satunya ukuran jujur seberapa terlindungi layanan itu sebenarnya.

Dan sesekali baca datanya. Pemeriksaan setiap malam memverifikasi struktur: bahwa indeks konsisten dengan dirinya sendiri dan tidak ada blob yang hilang. Ia tidak membaca isi blob-nya. Sebulan sekali, atau pada run hari Minggu, baca sebagian darinya — lima persen yang bergiliran mencakup seluruh repository dalam beberapa bulan tanpa pernah memakan waktu semalaman penuh:

restic check --read-data-subset=5%
borg check --verify-data              # the Borg equivalent, slower and thorough
Bagian yang sulit · Append-only

Kunci yang bisa menulis, dan tidak bisa menghapus. Perbedaan antara seminggu yang buruk dan bisnis yang tutup.

Semua yang dibahas sampai di sini melindungi dari kecelakaan. Bab ini melindungi dari pihak yang mengancam, dan masalah desainnya terasa tidak nyaman begitu Anda menyadarinya: mesin sumber harus menjangkau repositori setiap malam, yang berarti mesin sumber menyimpan kredensial aktif untuk repositori itu. Siapa pun yang menguasai sumber, menguasai kredensial itu. Jika kredensial itu bisa menghapus, penyerang akan menghapus — dan ransomware modern justru melakukan ini dengan sengaja, sebelum mengenkripsi apa pun, karena korban yang masih bisa dipulihkan tidak akan membayar.

Solusinya bukan password yang lebih baik. Solusinya adalah izin asimetris: sumber boleh menambahkan data dan tidak boleh menghapus apa pun. Tiga cara untuk membangunnya, diurutkan dari yang paling mudah dilakukan dengan benar.

Satu — append-only paksa lewat SSH. Ini wilayah utama Borg dan jawaban paling bersih yang tersedia di mesin milikmu sendiri. Entri authorized_keys dari langkah 03 memaksa borg serve --append-only, sehingga sisi jauh menolak penghapusan apa pun yang diminta sisi dekat. Pruning tetap harus dilakukan, tapi terjadi dari sisi tujuan, dengan jadwal yang tidak bisa dipengaruhi sumber, dijalankan oleh akun yang tidak bisa dijangkau sumber. Penyerang dengan akses root di sisi sumber bisa memenuhi repository dengan sampah; ia tidak bisa menghapus arsip dari malam sebelum ia datang.

Dua — REST endpoint append-only. rest-server, pendamping restic, memiliki mode --append-only dengan sifat yang sama: blob baru diterima, yang sudah ada tidak bisa dihapus. Jalankan di sisi tujuan di balik TLS, arahkan RESTIC_REPOSITORY ke URL https:// alih-alih sftp:, dan bentuk pertahanannya identik. Ini hanya menambah satu layanan lagi di sisi tujuan dan memberikan jaminan yang sama.

Tiga — object lock. Pada storage yang kompatibel S3, versioning ditambah periode retensi object-lock membuat penghapusan mustahil dilakukan sampai periode itu berakhir, dan ini dipaksakan oleh lapisan storage itu sendiri, bukan oleh sebuah program. Ini yang paling kuat di antara ketiganya dan juga paling mahal, dan ini memunculkan lagi akun penyedia — yang membawa kembali risiko custodial yang justru coba disebar oleh seluruh panduan ini. Masuk akal sebagai salinan ketiga, tapi janggal kalau dijadikan satu-satunya.

Jika tidak ada satu pun dari itu yang cocok — SFTP biasa, kunci yang bisa menulis dan karenanya bisa menghapus — jangan berpura-pura sebaliknya; tambahkan salinan kedua yang independen dan sama sekali tidak bisa disentuh oleh sumber. Gunakan pull, bukan push: biarkan tujuan yang login ke sumber, membaca apa yang dibutuhkan, lalu menyimpannya. Kredensialnya pun kini berada di mesin yang tidak terekspos, dan penyerang di sisi sumber tidak akan menemukan apa pun yang mengarah ke backup. Ini memang sedikit lebih merepotkan untuk disiapkan, tapi membalik risiko ke arah yang justru tepat.

Apa pun yang kamu pilih, verifikasi dengan cara yang sama seperti memverifikasi kontrol keamanan lainnya — dengan mencoba mematahkannya. Dari sisi sumber, dengan kunci backup, coba lakukan penghapusan. Hasil yang benar adalah penolakan.

borg delete ::name-of-an-old-archive
# → Remote: Repository is in append-only mode. Refusing to delete.
Catatan lapangan · Per layanan

Satu file yang tanpanya setiap layanan tidak bisa kembali. Jarang sekali itu adalah file yang besar.

Setiap layanan memiliki bagian kecil dari state yang bukan data dan bukan konfigurasi, dan kehilangannya tidak merusak layanan itu — melainkan menggantinya dengan layanan berbeda yang kebetulan memiliki nama yang sama. Tautan lama menjadi rusak, peer terfederasi menolak identitas baru, klien melakukan re-key. Inilah bagian-bagian itu, per stack, untuk hal-hal yang situs ini punya panduannya.

Lapisan di bawah penyimpanan

Jarak adalah jawaban teknis. Yurisdiksi adalah separuh lainnya.

Tanyakan pada kebanyakan orang mengapa backup harus berada di tempat lain, dan jawabannya adalah kebakaran, banjir, atau datacenter yang kehilangan daya. Semuanya benar, semuanya makin jarang terjadi, dan semuanya bisa dijawab dengan jarak seratus kilometer. Kegagalan yang benar-benar meruntuhkan bisnis pada 2026 bersifat administratif, dan jarak semata tidak berbuat apa-apa terhadapnya.

Satu akun adalah satu titik kegagalan. Penangguhan akibat sinyal penipuan otomatis, chargeback saat Anda sedang di pesawat, tinjauan kepatuhan, takedown yang ditujukan ke perusahaan dan bukan ke satu mesin — semua ini menjangkau setiap server di bawah akun tersebut pada saat yang sama, termasuk server yang menyimpan snapshot. Redundansi teknis yang sempurna pun jadi tidak relevan. Dua penyedia, atau minimal dua akun di bawah dua payung hukum yang berbeda, adalah satu-satunya struktur yang menjawab masalah ini.

Satu yurisdiksi adalah satu kerangka hukum. Keempat bastion Nordik ini tidak bisa saling dipertukarkan begitu saja — Swedia, Finlandia, Norwegia, dan Islandia masing-masing melindungi hal yang sedikit berbeda, dan Norwegia serta Islandia sepenuhnya berada di luar Uni Eropa. Memisahkan mesin kerja dan repository-nya ke dua negara berbeda berarti salinannya bukan sekadar berada di tempat lain; ia berada di bawah seperangkat aturan kedua yang independen. Referensi yurisdiksi Nordik membahas undang-undangnya satu per satu.

Dan tujuan tidak mempelajari apa pun. Inilah yang membuat pemisahan ini murah, bukan sebuah kompromi. Baik restic maupun Borg melakukan enkripsi sebelum apa pun meninggalkan sumber, sehingga host repository menyimpan blob yang kuncinya tidak ia miliki. Ia tidak tahu file apa saja yang disimpannya, berapa banyak, atau apa namanya. Kamu tidak sedang memberi kepercayaan pada pihak kedua; kamu hanya menyewa disk yang tidak bisa membaca dirinya sendiri. Itu juga jawaban jujur untuk pertanyaan "haruskah aku memakai penyedia yang tidak sepenuhnya kupercayai sebagai target backup?" — untuk repository terenkripsi, kepercayaan nyaris tidak berperan sama sekali.

Latensi bukan faktor penentu. Helsinki ke Reykjavík berjarak 30 ms di backbone, Helsinki ke Stockholm 8 ms, Stockholm ke Oslo 11 ms. Backup malam hari tidak peduli dengan angka-angka itu, begitu juga proses restore yang dibatasi oleh throughput disk. Pilih pasangan lokasi berdasarkan jarak hukum, bukan jarak jaringan — jarak jaringan di kawasan Nordik cuma selisih pembulatan.

Satu hal lagi yang layak dikatakan terus terang, karena inilah alasan panduan ini ada di situs ini dan bukan di blog sysadmin generik: mesin kedua membuka kembali setiap pertanyaan yang sudah dijawab oleh mesin pertama. Jika VPS kerja dipesan tanpa dokumen identitas dan dibayar dengan Monero, lalu mesin backup-nya justru dipesan dengan kartu perusahaan dan scan paspor, maka pasangan ini akan sama mudah diidentifikasi seperti bagian yang paling lemah. Panduan utama tentang hosting VPS anonim membahas tiga lapisan itu — pendaftaran, pembayaran, jaringan — dan semuanya berlaku sama persis untuk target backup seperti halnya untuk web server.

Catatan lapangan · Enam jebakan

Enam cara backup ternyata bukan backup sungguhan. Semuanya ditemukan tepat di hari buruk itu.

Jebakan 01 · Tak Bisa Dibalikkan

Passphrase hanya ada di mesin yang sudah mati

Repository-nya utuh, terenkripsi, dan tidak bisa dibaca secara permanen. Simpan passphrase-nya — dan untuk Borg, kunci yang sudah diekspor — di password manager dan di atas kertas, sebelum snapshot pertama.

Jebakan 02 · Konsistensi

Database berhasil dipulihkan, lalu gagal pada query pertama

File data live disalin begitu saja, bukan di-dump. Tulis dump pada tahap pre-backup dan backup dump itu; jangan pernah arahkan include list ke direktori data mesin database yang sedang berjalan.

Jebakan 03 · Radius Dampak

Penyusup menghapus backup terlebih dahulu

Kredensial yang bisa menulis pada mesin yang sudah disusupi adalah kredensial yang bisa menulis bagi penyerang. Paksakan append-only pada tujuan, atau ambil salinan kedua dengan cara pull, bukan push.

Jebakan 04 · Kapasitas

Repository lebih besar daripada servernya

forget tanpa prune hanya menandai snapshot dan tidak membebaskan ruang sama sekali. Jalankan keduanya bersamaan, jaga ruang kosong di sisi tujuan, dan jangan pernah membackup image container atau node_modules.

Jebakan 05 · Keheningan

Snapshot baik terakhir sudah berusia lima bulan

Timer-nya gagal setelah upgrade dan tidak ada yang memberitahu. Tambahkan unit OnFailure=, dan periksa bagian atas daftar snapshot sebulan sekali — hanya butuh sepuluh detik.

Jebakan 06 · Cakupan

Semuanya berhasil dipulihkan kecuali satu direktori itu

Bind mount di luar /opt, volume yang dipindahkan saat migrasi, pola exclude yang mencocokkan lebih banyak dari yang dimaksud. Cantumkan path yang sudah diketahui pada setiap snapshot baru, dan baca ulang file include setelah ada perubahan apa pun pada stack.

FAQ · Backup VPS

Pertanyaan, dijawab.

Sepuluh pertanyaan yang muncul saat menyiapkan ini — dan dua yang baru muncul setelahnya, sekali saja.

Apakah snapshot dari penyedia VPS sudah termasuk backup?

Tidak — itu adalah rollback, dan berguna, tapi gagal justru pada momen-momen yang seharusnya dijawab oleh backup. Snapshot hidup di dalam akun penyedia yang sama dengan server yang disalinnya. Jika akun itu ditangguhkan, jika ada sengketa pembayaran, jika agen support salah pencet menghapus sesuatu, atau jika penyerang mendapatkan kredensial panel Anda, snapshot itu ikut lenyap bersama mesinnya. Snapshot juga tidak memberi Anda apa pun yang granular: Anda tidak bisa menarik satu file yang terhapus kemarin, hanya bisa mengembalikan seluruh disk dan kehilangan semua yang terjadi sejak itu. Pertahankan snapshot — itu cara tercepat untuk membatalkan upgrade yang buruk — tapi jangan mengiranya sama dengan salinan yang berada di tempat yang tidak terjangkau masalah aslinya. Aturan praktisnya: jika satu kredensial yang disusupi bisa menghancurkan kedua salinan, berarti Anda cuma punya satu salinan.

restic atau Borg, sebaiknya pakai yang mana?

Keduanya mengenkripsi di sisi klien, keduanya melakukan deduplikasi di level chunk, keduanya sudah matang, dan keduanya akan menyelesaikan tugasnya. Pilih restic jika Anda menginginkan satu binary statis, repositori yang bisa hidup di SFTP, object storage yang kompatibel S3, server REST, atau apa pun yang bisa dijangkau rclone, dan sama sekali tidak ada yang perlu dipasang di tujuan. Pilih Borg jika tujuannya adalah mesin SSH yang Anda kendalikan sendiri, Anda ingin penerapan append-only paling kuat yang tersedia tanpa object-lock storage, dan Anda menyukai kompresinya yang sedikit lebih rapat. Perbedaan praktis yang menentukan pilihan: Borg butuh borg terpasang di kedua ujung dan hanya berbicara lewat SSH atau path lokal; restic butuh proses prune yang sebentar mengambil exclusive lock pada repositori. Jika Anda tidak bisa memutuskan, pakai restic — lebih sedikit bagian bergerak di tujuan lebih berharga daripada benchmark apa pun.

Berapa banyak disk yang dibutuhkan mesin backup?

Mulailah dari ukuran data yang sebenarnya kamu backup — bukan ukuran disk tempatnya berada. Stack self-hosted yang umum hanya berisi beberapa gigabyte database dan konfigurasi, ditambah apa pun yang diunggah pengguna. Di sinilah deduplikasi dan kompresi menunjukkan manfaatnya: snapshot harian dari working set 20 GB dengan kebijakan retensi dua belas bulan biasanya berujung pada repository berukuran antara 40 dan 80 GB, karena hanya chunk yang berubah yang pernah disimpan dua kali. Satu Sentinel ($3.90/bln, 120 GB NVMe) sudah cukup lega untuk itu. Naik ke Garrison (240 GB, $7.90) saat beberapa server melakukan backup ke host repository yang sama, dan ke Bulwark (960 GB, $32.90) saat working set itu sendiri mencapai ratusan gigabyte. Tentukan ukuran berdasarkan repository, lalu gandakan — repository tanpa ruang kosong tidak bisa melakukan prune, dan repository yang tidak bisa prune hanya akan terus membesar.

Bolehkah database live dibackup dengan cara menyalin filenya begitu saja?

Kamu bisa menyalinnya. Belum tentu kamu bisa memulihkannya. Database yang sedang menulis ke disk saat kamu membacanya memberimu kumpulan file dari beberapa momen yang berbeda-beda, dan itulah definisi backup yang robek (torn) — hasilnya pulih sebagai database yang korup, atau lebih buruk lagi, sebagai database yang terbuka dengan baik tapi diam-diam kehilangan sejumlah baris data. Solusinya adalah dump: pg_dump atau pg_dumpall untuk PostgreSQL, mariadb-dump --single-transaction untuk MariaDB dan MySQL pada tabel InnoDB, dan sqlite3 db .backup out.db atau VACUUM INTO untuk SQLite. Tulis dump itu ke sebuah file, baru kemudian backup file itu. Jika database-nya terlalu besar untuk di-dump setiap malam, alternatifnya adalah snapshot filesystem yang diambil saat engine-nya sesaat dijeda (quiesced), atau alat physical backup milik engine itu sendiri — tapi untuk apa pun yang dijalankan satu VPS saja, dump adalah pilihan yang tepat dan sederhana.

Bagaimana jika saya lupa passphrase repository backup?

Backup-nya hilang. Baik restic maupun Borg melakukan enkripsi di sisi klien, dan keduanya tidak punya jalur pemulihan, master key, atau tiket dukungan yang bisa membuka repository untukmu. Itulah intinya: host tujuan — termasuk host yang bukan milikmu — tidak pernah melihat plaintext-mu. Ini juga berarti passphrase kini menjadi sekeping data yang nilainya sama persis dengan segala yang dilindunginya, dan ia tidak boleh hanya hidup di mesin yang sedang dibackup. Simpan di password manager-mu, dan simpan satu salinan di tempat fisik. Untuk Borg, ekspor juga kunci repository dengan borg key export dan simpan berdampingan dengannya; dalam mode repokey, kunci itu hidup di dalam repository, jadi repository yang sudah tidak bisa kamu jangkau membawa kunci itu bersamanya.

Bagaimana cara mencegah server yang disusupi menghapus backup-nya sendiri?

Kamu memberinya kredensial yang bisa menambah tapi tidak bisa menghapus. Ini keputusan desain paling penting di seluruh latihan ini, karena ransomware modern mencari konfigurasi backup terlebih dahulu dan mengikutinya sampai ke sumbernya. Tiga cara untuk mewujudkannya. Append-only lewat SSH: di authorized_keys sisi tujuan, paksa perintah borg serve --append-only --restrict-to-path /srv/borg — sumber bisa menulis arsip baru dan tidak bisa menghapus yang lama. Append-only lewat REST: jalankan rest-server milik restic dengan --append-only dan arahkan repository ke sana lewat HTTPS. Object lock: bucket yang kompatibel S3 dengan versioning dan retention lock. SFTP biasa tidak memberimu satu pun dari ini — kunci yang bisa menulis repository juga bisa menghapusnya — jadi jika SFTP adalah transportmu, pasangkan dengan salinan kedua berbasis pull yang diambil dari sisi tujuan, tempat kredensial yang berhasil dicuri penyerang dari sumber tidak bisa menjangkaunya.

Seberapa sering backup harus dijalankan, dan berapa lama harus disimpan?

Tanyakan dari arah sebaliknya: berapa banyak pekerjaan yang bersedia Anda ulangi? Angka itu adalah recovery point objective Anda, dan itu yang menentukan intervalnya. Setiap malam sudah tepat untuk hampir semua layanan self-hosted — server email, Nextcloud, homeserver Matrix, mesin workflow. Setiap jam baru sepadan ketika datanya transaksional dan entri ulang tidak mungkin dilakukan. Untuk retensi, pola yang tahan diuji kenyataan adalah --keep-daily 7 --keep-weekly 4 --keep-monthly 12: seminggu undo yang granular, sebulan checkpoint mingguan, setahun checkpoint bulanan, untuk kira-kira 23 snapshot. Ekor panjang ini lebih penting dari yang biasa diduga orang, karena kegagalan yang ditangkapnya bukan disk yang mati — melainkan korupsi data atau penghapusan yang tidak disadari siapa pun selama enam minggu.

Apakah salinan kedua backup benar-benar harus disimpan di negara lain?

Gedung yang berbeda adalah syarat teknis minimum; yurisdiksi yang berbeda adalah bagian yang paling sering dilewatkan orang dan kemudian disesali. Kebakaran, banjir, atau kegagalan di level rak sudah cukup dijawab dengan jarak semata. Yang tidak dijawab oleh jarak adalah persoalan hukum atau komersial: akun yang ditangguhkan oleh satu penyedia, sengketa pembayaran, takedown yang menjangkau setiap mesin di bawah atap korporat yang sama, perintah hukum yang dilayangkan ke satu perusahaan. Jika kedua salinan berada di penyedia yang sama, satu surat saja bisa menjangkau keduanya. Memisahkan pasangan ini ke dua bastion Nordik — mesin kerja di Helsinki, repositori di Reykjavík, berjarak 30 ms di backbone — tidak menambah biaya latensi apa pun dan memberi Anda kerangka hukum kedua. Data tetap terenkripsi sebelum meninggalkan sumber, apa pun yang terjadi, sehingga tujuan tidak mempelajari apa pun dari menyimpannya.

Berapa lama backup pertama berlangsung, dan apakah enkripsi memperlambatnya?

Enkripsi bukanlah bottleneck-nya — CPU modern menjalankan AES lebih cepat daripada kecepatan yang bisa dibawa oleh link gigabit, dan kedua alat ini memakai akselerasi hardware jika tersedia. Bottleneck-nya ada pada upload pertama, karena semuanya masih baru: pada uplink 1 Gbps, working set sebesar 20 GB memakan waktu beberapa menit pada kecepatan penuh, dan lebih lama lagi jika tujuannya dibatasi (throttled) atau filenya banyak dan kecil-kecil. Setiap proses berikutnya hanya mentransfer chunk yang berubah, yang untuk stack biasa hanya puluhan megabyte dan selesai dalam waktu kurang dari satu menit. Jika proses pertama ini bersaing dengan beban kerja produksi, batasi kecepatannya — restic memakai --limit-upload dalam KiB/s, Borg memakai --upload-ratelimit — dan jalankan dengan nice dan ionice.

Apakah restore backup benar-benar perlu diuji?

Ya, dan alasannya bukan paranoia — melainkan karena kegagalan yang paling umum justru diam-diam. Timer yang berhenti menyala setelah upgrade paket. Pola exclude yang diam-diam menelan direktori uploads. Database dump yang ditulis ke path yang tidak pernah tercakup backup. Repository yang sudah gagal pemeriksaan integritasnya selama berminggu-minggu, tercatat di log yang tidak pernah dibaca siapa pun. Tidak satu pun dari ini memberi tahu dirinya sendiri; semuanya bisa ditemukan dalam sembilan puluh detik dengan memulihkan satu file dan melihatnya. Lakukan pemulihan kecil setiap bulan — tarik satu database dump dan satu direktori data ke path sementara lalu bandingkan (diff) — dan pembangunan ulang penuh setahun sekali, di VPS baru, dengan waktu yang dicatat. Angka yang keluar dari pembangunan ulang itu adalah waktu pemulihan sesungguhnya, dan itu jarang sekali sesuai dugaanmu.

Dapatkan mesin kedua

Bastion repositori di yurisdiksi Nordik kedua. Bebas KYC, berbayar kripto.

Sentinel — 120 GB NVMe seharga $3.90 per bulan, di Helsinki, Stockholm, Oslo, atau Reykjavík. Bandwidth tanpa batas ukur, jadi memulihkan data tidak memakan biaya apa pun. Tanpa email saat mendaftar, tanpa dokumen identitas, dan sebuah tujuan yang tidak bisa membaca satu byte pun dari apa yang disimpannya.

Terakhir ditinjau · 2026-08-24 · Sumber · Dokumentasi restic dan BorgBackup, manual backup PostgreSQL dan MariaDB, sshd authorized_keys(5), systemd.timer(5) · Kadence · tahunan