Building a DR pipeline for self-hosted services — Part 1
Self-hosting on a VPS is wonderful right up until the day it isn’t. Your password manager is on it. Your git server is on it. Your photos, your calendars, your invoices, your “the family will need this if I’m unavailable” docs are on it. And then your provider goes silent for a week, or sends an automated suspension email at 3 a.m., or simply vanishes.
This post is the first in a short series on the disaster-recovery (DR) protocol I now run for every public-facing service in my homelab. The whole pipeline rests on two boring, dependable tools — Ansible for the configuration and orchestration side, Restic for the encrypted snapshot side. Together they answer two questions that should keep every self-hoster up at night: “can I survive losing this VPS today?” and “can I prove it in under an hour?”
The thing nobody likes admitting about VPS hosting
Section titled “The thing nobody likes admitting about VPS hosting”Cloud-on-someone-else’s-hardware is fantastic for uptime, latency, and “I’d like a public IPv4 by 2 p.m. please.” It’s not a backup story. It’s not even close to one. Here are the failure modes I’ve stopped pretending are imaginary:
- Provider goes bankrupt. Smaller VPS providers — and even some of the bigger budget ones — have folded with weeks of notice (or none). Your data is on their disks; “we’ll be in touch about export windows” is a sentence that has been said.
- Account suspension. Wrong country flag, mismatched billing address, an automated abuse system mistaking you for a botnet, an expired card the renewal email never reached. Your VM stops responding overnight.
- Data center fire / flood / regional outage. Cloudflare’s 2024-era post-mortems, OVHCloud’s Strasbourg fire in 2021 — these are not hypotheticals.
- Operator error. An
rm -rfyou wish you could un-type. A failed in-place OS upgrade. A botched migration. This one’s free, comes with the territory, and is the only failure mode that matters statistically.
Note: this is the ported sample post — the full version with all sections, code blocks, and the architecture diagram lives at
docs/blog/posts/2026-05-06-dr-with-ansible-and-restic-01.mdin the mkdocs source tree. Showing this excerpt here is just the proof-of-port for the Astro/Starlight scaffold. The full migration is mechanical: copy the file, update the frontmatter as shown above, and the body markdown ports verbatim.