4.2 KiB
4.2 KiB
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:
- Verify from app1-bu:
hermes cron listorcat /var/log/hermes-standby-watchdog.log - If Hermes stopped and didn't fail over:
hermes gateway start - Or reboot app1-bu — boot restore script runs S3 sync and starts Hermes
Emergency failover (manual) — 2 min
- SSH into app1-bu:
ssh -i ~/.ssh/wisp_rsa root@5.161.114.8 - 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/*" - Start Hermes:
hermes gateway start
AI/Apps server dies (app2) — 2-4 hr recovery
- Order new RS 2000/4000 in Manassas
- Install Docker + base software
- Restore each app from
s3://hermes-vps-backups/apps/<app-name>/latest/ - Restart each Docker compose stack
- Update Cloudflare DNS per subdomain
Total loss — 4-6 hr recovery
- Provision two new Netcup servers
- Recover Hermes first:
aws s3 sync s3://hermes-vps-backups/live/ ~/.hermes/ --endpoint-url https://s3.us-east-1.wasabisys.com --exclude "*.lock" - Recover app2 second
- Restore VPN, router backup jobs
- 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 failoverhermes-standby.service— systemd unit for boot-time restoreDR-PLAN.md— This documentrecovery-bundle-2026-07-05.md— Full data dump (configs, credentials, conversation history)