Backup & Disaster Recovery

Automated, multi-tier, encrypted where it matters, with off-site replication. Everything backs up to the NAS Host (ZFS); critical data also goes off-site.


Design principles


VM image backups (weekly)

All four Hyper-V VMs on the Desktop Host are backed up as full VM images weekly:

VM VHDX type Approximate size
nginx VM Dynamic ~20 GB
Docker VM Differencing ~124 GB
Minecraft VM Differencing ~46 GB
Stoat VM Differencing ~118 GB

Application data backups (nightly)

What Method Retention
Vaultwarden (database + attachments) Automated backup to NAS 7 daily + 4 weekly
Minecraft (world + database) Automated backup to NAS 7 daily + 4 weekly
Stoat Chat (database + files + config) Automated backup to NAS 7 daily + 4 weekly
Proxy Host (proxy config, certs, DNS) Automated backup to NAS 7 daily + 4 weekly
Docker VM services (Pi-hole, Paperless, Mealie, etc.) Automated backup to NAS 7 daily + 4 weekly

Sensitive service data is GPG-encrypted (AES-256) before writing to the NAS. Passphrases are stored on the source hosts only. Each backup script handles its own rotation — new backup writes first, then old copies beyond retention are pruned.


Off-site backup (Restic → Backblaze B2)

Personal media and documents from the NAS Host replicate off-site:


Backup tree layout (NAS Host)

All backups land in a single tree on the NAS Host with per-service subdirectories, separated by daily and weekly retention tiers.


Verification


What’s protected vs. what’s not

Data Protected by Recovery time
VM state (OS, packages, config) Weekly VHDX image Import VM (~30 min)
Application databases (Vaultwarden, Minecraft, Stoat, Paperless) Nightly backup to NAS Restore from latest backup (<1 hour)
Proxy Host (nginx, certs, Pi-hole) Nightly GPG backup to NAS Rebuild from backup or re-provision from repo + restore data
Personal media + documents ZFS on NAS + off-site (Restic → B2) Pull from B2 if NAS fails
Docker images Re-pull from registries; locally-built images re-built from source repos Minutes to hours depending on bandwidth
Configuration (nginx, keepalived, fail2ban, Docker Compose) Homelab repo (source of truth) make generate-configs + deploy

← Monitoring | Back to index | Next: Security →