Backup-Restore — my.itpropartner.com/backups/¶
Architecture¶
- Server: app3 (152.53.241.111, netcup RS 4000)
- Backend: Flask Python app at
/opt/backup-restore/app/app.py(port 8090) - Proxy: Caddy on Core → reverse_proxy to 152.53.241.111:8090 with 300s timeouts
- Snapshots:
/opt/backup-restore/snapshots/<domain>/<timestamp>/ - Scheduled:
0 1,13 * * * /opt/backup-restore/snapshot.sh— 1 AM and 1 PM daily - Systemd:
backup-restore.service - Retention: 30 days (auto-cleanup)
Sites Backed Up (9 domains)¶
apextrackexperience.com, boxpilotlogistics.com, debtrecoveryexperts.com, iamgmb.com, katiewattdesign.com, katiewattsdesign.com, mainwp.itpropartner.com, vigilanttac.com, voipsimplicity.com
Snapshot Contents¶
Each snapshot directory contains:
- files.tar.gz — WordPress document root tarball
- database.sql — MySQL dump
- size.txt — Total backup size in bytes
- note.txt — Optional manual backup note
API Endpoints¶
| Method | Path | Auth | Description |
|---|---|---|---|
| GET | /backups/ | No | Backup dashboard page |
| POST | /api/backup | No | Trigger manual backup |
| POST | /api/restore | No | Restore a snapshot |
| POST | /api/delete | No | Delete a snapshot |
| GET | /api/download/ |
No | Download snapshot archive |
| GET | /api/log | No | Restore history |
Caddy Routes (on Core)¶
handle /api/backup → app3:8090
handle /api/restore → app3:8090 (flush_interval -1, 300s timeouts)
handle /api/download/* → app3:8090
handle /api/log → app3:8090
handle_path /backups/* → app3:8090 (300s timeouts)
Recovery¶
systemctl restart backup-restore
# Manual snapshot:
/opt/backup-restore/snapshot.sh
# Manual restore via curl:
curl -X POST https://my.itpropartner.com/api/restore \
-H "Content-Type: application/json" \
-d '{"domain":"katiewattdesign.com","snapshot":"2026-07-20_130001"}'