# 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/<app-name>/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)
