Skip to main content
RunBook Academy

← All checklists in Linux

Quarterlydisaster-recovery

Checklist: Disaster recovery readiness

20 items ·17 critical ·3 warn ·0 info

Use this checklist quarterly, per service, to verify that DR readiness is intact. Run it before the quarter’s last week, so that a failed item still has time to be fixed inside the quarter it was found in.

How to use this checklist

Run each command from the recovery site, not from production. A dependency that resolves from the primary site tells you nothing about whether it resolves when the primary site is the thing that is gone - which is the only condition this checklist is about. The commands read their targets from environment variables (DR_SERVICE_FQDN, DR_RESOLVER, DR_LDAP_URI, DR_VAULT_ADDR, DR_GATEWAY, DR_PROMETHEUS) so one checklist serves every service; set them from the service’s DR record before you start. DR_REQUIRED_ENDPOINTS is a space-separated host:port list of everything the service must reach once it is running in the recovery site - repository, database, message broker, log sink. Anything missing from that list is a path nobody tested.

A failing critical item means this service does not have a disaster recovery capability today - it has a plan for one. Resolve it before the quarter ends, or escalate it with a named owner and a date. warn items are recorded and tracked, but do not hold the gate.

Evidence is the command output, attached to the quarterly DR record for the service. Two items take their evidence from elsewhere: runbook-tested and rto-met are satisfied only by the drill log produced by linux-checklist-restore-readiness, which is the checklist that actually performs a restore and measures how long it takes. A restore that has not been performed has no measured time, and an unmeasured RTO is a guess.

Sign-off

  • Operator: _________________ Date: ___________
  • Reviewer: ________________ Date: ___________

Critical17 items

  1. borg list "$BORG_REPO" --last 1; restic -r "$RESTIC_REPO" snapshots --latest 1
  2. dig +short "$DR_SERVICE_FQDN" @"$DR_RESOLVER"; dig +noall +answer "$DR_SERVICE_FQDN"
  3. chronyc tracking; chronyc sources -v
  4. ldapsearch -x -H "$DR_LDAP_URI" -b "$LDAP_BASE" -s base '(objectclass=*)' namingContexts
  5. vault status -address="$DR_VAULT_ADDR"
  6. ip route get "$DR_GATEWAY"; ping -c2 -W3 "$DR_GATEWAY"; for hp in $DR_REQUIRED_ENDPOINTS; do nc -zv -w3 "${hp%:*}" "${hp#*:}" || echo "UNREACHABLE $hp"; done

Warning3 items

  1. while read -r h; do echo -n "$h "; echo | openssl s_client -connect "$h:443" -servername "$h" 2>/dev/null | openssl x509 -noout -enddate; done < dr-hosts.txt
  2. curl -sf "http://$DR_PROMETHEUS:9090/-/healthy" && curl -s "http://$DR_PROMETHEUS:9090/api/v1/targets" | jq -r '.data.activeTargets[] | "\(.health) \(.labels.instance)"'