Proxmox VEXIV · Disaster RecoveryDR exercise
DR runbook exercise: restoring a fictional business
What you'll learn
- Apply RPO/RTO to a realistic business scenario
- Build a complete recovery runbook
- Identify gaps in the recovery plan
- Rehearse the runbook with a tabletop exercise
Prerequisites
Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
Why this matters in production
A runbook you have never executed will fail when you need it. This lesson walks through building and rehearsing a runbook for a realistic business.
The fictional business
“ExampleCorp Inc” — 150 employees, B2B SaaS, headquartered in Datacenter East.
Critical systems:
| System | RPO | RTO | Notes |
|---|---|---|---|
| Customer-facing API | 5 min | 30 min | Fronted by load balancer |
| PostgreSQL primary | 1 min | 15 min | Streaming replication to secondary |
| Identity (AD + Keycloak) | 15 min | 30 min | Two AD DCs |
| File server (Windows) | 1 h | 4 h | NFS for some VMs |
| Internal wiki | 4 h | 8 h | |
| Monitoring (Prometheus + Grafana) | 1 h | 1 h | Must come up early |
Architecture
Primary site:
- 5-node Proxmox cluster.
- Ceph RBD for VM storage.
- PBS primary, syncing hourly to off-site PBS.
DR site:
- 3-node Proxmox cluster (cold standby).
- PBS DR receiving hourly sync.
- Public IPs allocated but not in DNS.
Runbook: declare disaster
00:00 - On-call engineer is paged by monitoring (or a customer).
00:05 - Engineer confirms the failure is real (not a false alarm).
00:15 - Engineer declares disaster. Calls incident commander.
00:30 - IC assembles response team. Decision: activate DR?
00:45 - Decision: yes. Activate DR.
Runbook: activate DR
01:00 - Power on DR cluster nodes.
01:15 - Verify network connectivity to off-site PBS.
01:30 - Attach off-site PBS as PVE storage.
01:45 - Restore critical VMs in dependency order:
- DNS (external resolver)
- Identity (AD, Keycloak)
- Database (PostgreSQL primary)
- Application servers
- Load balancers
- Monitoring
02:30 - Update DNS records (TTL was 10 min).
02:40 - Verify end-to-end: customer can log in.
03:00 - All critical systems restored. RTO 3 h.
The activation steps, as commands rather than prose
A runbook step that says “attach the off-site PBS as PVE storage” is a paragraph the reader has to turn into commands at 01:30. Write the commands.
set -euo pipefail
PBS_HOST=pbs-dr.example.com
FPRINT='REPLACE_WITH_PRINTED_FINGERPRINT'
# --password with no value makes pvesm prompt, so the secret is not in
# shell history or in this runbook.
pvesm add pbs pbs-dr \
--server "$PBS_HOST" \
--datastore dr-main \
--username 'restore@pbs' \
--password \
--fingerprint "$FPRINT"
# Prove it before anyone waits on a restore that cannot start.
pvesm status --storage pbs-dr
pvesm list pbs-dr --content backup | head -20set -euo pipefail
STORE=local-zfs
# Tier 1: identity and DNS. Nothing else works until these do.
for SNAP in \
'pbs-dr:backup/vm/101/2026-08-12T02:00:00Z' \
'pbs-dr:backup/vm/102/2026-08-12T02:05:00Z'
do
VMID=$(printf '%s' "$SNAP" | sed 's#.*/vm/\([0-9]*\)/.*#\1#')
qmrestore "$SNAP" "$VMID" --storage "$STORE"
qm start "$VMID"
done
# Verify tier 1 before moving on. This is the step that gets skipped.
getent hosts idp.example.com || echo 'TIER 1 NOT READY - STOP'
# Tier 2: databases. Then applications. Same shape, same verification.The --fingerprint line is the one that earns the printed page. The
fingerprint is verified when the storage is added, and taking it from the
server you are connecting to defeats the check - so it has to come from
documentation that survived the site, which means it must have been printed
before the site was lost.
Runbook: communicate
Throughout: status updates to stakeholders every 30 min.
At declare: notify leadership, customer support, security team.
At decision: notify customers (status page).
At restore: notify customers (status page) of restored services.
At complete: post-incident review scheduled within 7 days.
Tabletop exercise
A tabletop exercise walks through the runbook without actually performing actions. The team discusses each step, identifies gaps, and refines.
flowchart LR
A[Read scenario] --> B[Walk through steps]
B --> C[Realistic?]
C -->|yes| D[Refine]
C -->|no| E[Identify gap]
E --> D
D --> F[Document]
Common gaps found in tabletops:
- Credentials are not at the DR site.
- DNS TTL is too long.
- The DR cluster nodes cannot reach the off-site PBS without primary-site routing.
- The team does not know who the incident commander is.
Post-incident review
After every real incident or drill:
- What worked?
- What didn’t?
- What surprised us?
- What should change?
Document the review and update the runbook.
Production considerations
Common mistakes
- Long DNS TTLs.
- DR site without credentials.
- “We’ll figure it out when it happens.”
- Tabletop exercises that don’t include the people who will execute.
Key takeaways
- Per-system RPO/RTO.
- DR runbook must be short and rehearsed.
- Tabletop quarterly, live drill annually.
Knowledge check
Knowledge check · 5 questions
Q1. What is the first thing to do when a disaster is suspected?
Q2. DR runbooks should be 50 pages long to be thorough.
Q3. How often should DR tabletops be run?
Q4. In the ExampleCorp timeline, 45 minutes elapse before any technical recovery step. What is the most effective way to reduce that?
Q5. Which of these belong in a printed, off-site DR document rather than only in the runbook system? Select all that apply.
Passing score: 75%. Answers are checked in this browser.