# 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///` - **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"}' ```