Files
itpp-infrastructure/backup-plan.md
T

5.8 KiB

Backup Plan — All Servers

Last Updated: July 16, 2026 S3 Provider: Wasabi (s3.us-east-1.wasabisys.com) Buckets: hermes-vps-backups, itpropartner-backups, mikrotik-ccr-backups Versioning: ON (all buckets)


Schedule (ET timezone)

Time Server Script What
Every 15 min Core hermes-live-sync Hermes session state → S3 live/
1:00 AM Core hermes-backup.sh Full Hermes backup
1:30 AM Core core-services-backup.sh Vaultwarden, Twenty CRM, SearXNG, Komodo, Prometheus, Grafana, Uptime Kuma
2:00 AM Core backup-audit-check.sh Verify all backups
2:00 AM app1 /root/.hermes/scripts/app1-backup.sh LiteLLM, Open WebUI, n8n, MCP configs, Mattermost
2:30 AM app2 /root/.hermes/scripts/app2-backup.sh Traccar, Gitea, Hudu, UNMS, UniFi
3:00 AM Core root-essentials-backup.sh /root essentials
3:00 AM app3 /root/.hermes/scripts/app3-backup.sh CloudPanel, MySQL, WordPress, Nginx configs
5:00 AM Core wphost02-backup (cron) wphost02 webapps + databases → S3
1:00 AM + 1:00 PM app3 /opt/backup-restore/snapshot.sh Per-site WordPress snapshots (files + DB), 60-day retention
3:00 AM Core docker-volume-sync.sh Docker volumes
4:00 AM Core system-config-sync.sh System configs
6:00 AM Core run-wisp-backup.sh MikroTik CCR config (via wisp-backup.py)
Every 10 min core-bu warm-standby-sync Pull from S3 live/ → standby readiness

Coverage by Server

Core (152.53.192.33)

Service Method RPO
Hermes Agent tar.gz → S3 (daily) + live sync (15 min) 15 min
Vaultwarden SQLite dump → S3 (daily) 24 hr
Twenty CRM Postgres pg_dump → S3 (daily) 24 hr
SearXNG settings.yml → S3 (daily) 24 hr
Komodo config dir → S3 (daily) 24 hr
Prometheus TSDB snapshot → S3 (daily) 24 hr
Grafana SQLite DB → S3 (daily) 24 hr
Uptime Kuma SQLite DB → S3 (daily) 24 hr
DocuSeal Covered by docker-volume-sync 24 hr
Caddy config system-config-sync (daily) 24 hr
/root essentials root-essentials-backup (daily) 24 hr

app1 (152.53.36.131)

Service Method RPO
LiteLLM Postgres pg_dump + config.yaml → S3 (daily) 24 hr
Open WebUI /app/backend/data → S3 (daily) 24 hr
n8n Postgres pg_dump → S3 (daily) 24 hr
MCP servers Configs in Git + Docker volumes 24 hr
Mattermost Postgres DB + data volume → S3 (daily) 24 hr

app2 (152.53.39.202)

Service Method RPO
Traccar H2 database + conf → S3 (daily) 24 hr
Gitea Repos + DB → S3 (daily) 24 hr
Hudu Docker volume → S3 (daily, 30-day retention) 24 hr
UNMS S3 sync (daily) 24 hr
UniFi Autobackup → S3 (daily) 24 hr

app3 (152.53.241.111)

Service Method RPO
CloudPanel CE SQLite DB → S3 (daily) 24 hr
MySQL All databases mysqldump → S3 (daily) 24 hr
WordPress Files + wp-config → S3 (daily) 24 hr
Nginx /etc/nginx + /etc/cloudpanel → S3 (daily) 24 hr
WordPress Snapshots Per-site tarball + MySQL dump (2x daily, 60-day retention) 12 hr
Backup Restore UI Flask app port 8090 at my.itpropartner.com/backups Instant
voipsimplicity.com Covered by MySQL + WordPress file backup 24 hr
my.voipsimplicity.com Covered by Git (static HTML) N/A

S3 Bucket Structure

s3://hermes-vps-backups/
├── live/                          # 15-min Hermes state sync
├── live-sync/                     # Live sync artifacts
├── hermes-full-backup/            # Daily full Hermes backups
├── snapshots/                     # Hermes snapshots
├── standby/                       # Warm standby scripts
├── root-backup/                   # /root essentials
├── core/
│   ├── vaultwarden/
│   ├── twenty/
│   ├── searxng/
│   └── komodo/
├── app1/
│   ├── litellm/
│   ├── openwebui/
│   ├── n8n/
│   ├── mcp/
│   └── ollama/
├── app2/
│   ├── traccar/
│   ├── gitea/
│   ├── hudu/
│   ├── unms-backups/
│   └── unifi-backups/
├── app3/
│   ├── cloudpanel/
│   ├── mysql/
│   ├── wordpress/
│   └── config/
├── volumes/                       # Docker volume syncs
├── caddy/                         # Caddy configs
├── env/                           # Environment files
└── assets/                        # Static assets

s3://itpropartner-backups/
├── home-router/                   # MikroTik CCR configs
└── shonuff/                       # Personal backups

s3://mikrotik-ccr-backups/         # Home CCR2004 configs

Restoration

Single Service Restore

# Example: restore LiteLLM database
SERVICE=litellm; DATE=2026-07-16
aws s3 cp s3://hermes-vps-backups/app1/$SERVICE/$SERVICE-$DATE.sql.gz . \
  --endpoint-url https://s3.us-east-1.wasabisys.com
gunzip $SERVICE-$DATE.sql.gz
# Load into Postgres

Full Server Restore

Each server's backup directory contains everything needed to rebuild that server from scratch.

Warm Standby (Core only)

core-bu (5.161.225.131) automatically syncs from S3 every 10 minutes. To activate:

  1. Power on via Hetzner Cloud API
  2. Hermes starts from latest S3 state

Known Gaps

Gap Impact Plan
No WAL archiving RPO is 24 hours for most databases Add WAL-G for Postgres services
No restore testing Don't know if backups actually restore Schedule quarterly restore drill
core-bu not tested since upgrade Standby might not work Schedule failover test
wphost02 S3 upload in progress First backup running now Monitor completion