# Disaster Recovery Plan — IT Pro Partner **Author:** ShoNuff (Hermes AI Agent) **Date:** July 4, 2026 **Keep this document in:** Password manager (Bitwarden/Hudu), printed copy, and anywhere reachable without server access. ## Architecture | Box | Provider | Location | Specs | Monthly | Runs | |-----|----------|----------|-------|---------|------| | app1 | Netcup | Manassas, VA | RS 2000 G12 (8c, 16GB, 512GB) | ~$27 | Portal, Hermes, VPN | | app2 | Netcup | Manassas, VA | RS 4000 G12 (12c, 32GB, 1TB) | ~$43 | AI, Docker apps, WordPress | | app1-bu | Hetzner | EU | CPX11 (2c, 2GB, 40GB) | ~$5 | Standby Hermes only — auto-failover | ## Failover architecture (app1 → app1-bu) ``` app1 (netcup, live) app1-bu (Hetzner, standby) ┌─────────────────────┐ ┌──────────────────────────┐ │ Hermes (running) │ ping │ Hermes (off) │ │ S3 sync every 15m │◄───────►│ Cron watchdog every 10m│ │ Telegram connected │ 152.53 │ Checks live box health │ └─────────────────────┘ └──────────────────────────┘ │ │ ▼ ▼ s3://hermes-vps-backups/live/ (15-min checkpoint — state.db, config, skills, cron, profiles) ``` **If app1 dies:** - app1-bu watchdog detects 3 failed pings over ~60s - Syncs latest state from `s3://hermes-vps-backups/live/` (RPO <15 min) - Starts Hermes gateway on app1-bu - Telegram reconnects automatically (same bot token) - Total failover: ~2 min ## Critical Credentials (store externally, NOT on servers) - Netcup CCP login → password manager - Wasabi IAM keys → password manager - Hetzner API token → password manager - Hermes setup token → password manager - Cloudflare API token → Cloudflare dashboard - wisp_rsa SSH key → password manager backup - S3 buckets: hermes-vps-backups, mikrotik-ccr-backups, itpropartner-backups (Wasabi us-east-1) ## Recovery Scenarios ### Hermes dies (app1) — auto-failover ~2 min (manual: 30 min) **Auto:** app1-bu detects outage, syncs S3, starts Hermes. No action needed. **Manual fallback if auto-failover didn't trigger:** 1. Verify from app1-bu: `hermes cron list` or `cat /var/log/hermes-standby-watchdog.log` 2. If Hermes stopped and didn't fail over: `hermes gateway start` 3. Or reboot app1-bu — boot restore script runs S3 sync and starts Hermes ### Emergency failover (manual) — 2 min 1. SSH into app1-bu: `ssh -i ~/.ssh/wisp_rsa root@5.161.114.8` 2. Sync latest state: `aws s3 sync s3://hermes-vps-backups/live/ ~/.hermes/ --endpoint-url https://s3.us-east-1.wasabisys.com --exclude "*.lock" --exclude "node/*" --exclude "bin/*" --exclude "cache/*" --exclude "sandboxes/*"` 3. Start Hermes: `hermes gateway start` ### AI/Apps server dies (app2) — 2-4 hr recovery 1. Order new RS 2000/4000 in Manassas 2. Install Docker + base software 3. Restore each app from `s3://hermes-vps-backups/apps//latest/` 4. Restart each Docker compose stack 5. Update Cloudflare DNS per subdomain ### Total loss — 4-6 hr recovery 1. Provision two new Netcup servers 2. Recover Hermes first: `aws s3 sync s3://hermes-vps-backups/live/ ~/.hermes/ --endpoint-url https://s3.us-east-1.wasabisys.com --exclude "*.lock"` 3. Recover app2 second 4. Restore VPN, router backup jobs 5. Point all Cloudflare DNS records ### Data recovery (any scenario) - 15-min checkpoint in `s3://hermes-vps-backups/live/` for Hermes state - Router configs: 365-day retention in `mikrotik-ccr-backups` - S3 versioning on all buckets prevents accidental overwrite/deletion - Lifecycle policy: 365-day retention, then expire ## DR scripts on S3 All in `s3://hermes-vps-backups/standby/`: - `hermes-standby-restore.sh` — Boot-time restore (for Hetzner rescue mode deployment) - `hermes-standby-watchdog.sh` — 10-min cron health check, triggers failover - `hermes-standby.service` — systemd unit for boot-time restore - `DR-PLAN.md` — This document - `recovery-bundle-2026-07-05.md` — Full data dump (configs, credentials, conversation history)