3.3 KiB
3.3 KiB
Infrastructure Migration Plan (Jul 2026)
Target Architecture
| Server | Provider | Model | Cost/mo | Role |
|---|---|---|---|---|
| Core | netcup RS 2000 | 8C/16G/512GB | ~$24 (paid) | Hermes, Docker (Vaultwarden, Docuseal, SearXNG, Twenty), Portal, Prometheus, Uptime-Kuma, Caddy, VPN |
| app2 | netcup RS 4000 | 12C/32G/1TB | ~$44 | UNMS/UISP, UniFi Controller, Hudu, Traccar |
| app3 | netcup RS 2000 | 8C/16G/512GB | ~$24 | WordPress/Apex, web apps |
| app1-bu | Hetzner CPX11 (2C/2G) | Staying | Paid | Warm standby for Core. Keep in place. |
Migration rules
- Zero downtime for admin-ai.itpropartner.com — LiteLLM (deepseek-chat proxy for Sho'Nuff) must stay live during migration. Set up new LiteLLM on Core first, test via alternate URL, switch DNS.
- Admin-ai uses PostgreSQL for model configs — DB dump/restore, not config file.
- Open WebUI conversations are in SQLite — stop container, copy
/app/backend/data/(1.9 GB), restore on new box. - Migration order: AI stack first (most critical), then UNMS/UniFi, then web apps.
- app1-bu stays warm at Hetzner — do not migrate. It's the safety net.
- New boxes follow Docker install standard —
/root/docker/<service>/, healthchecks, resource limits, internal networks, named volumes, .env chmod 600. - SSH key for new boxes: Deploy
itpp-infrakey during provisioning. - New boxes provisioned via netcup SCP (no API for provisioning — use web UI at servercontrolpanel.de).
- app2 needs RS 4000 — UNMS (10 containers + Java/PostgreSQL/RabbitMQ) + UniFi (Java + MongoDB + MariaDB) + Hudu (5 containers) + Traccar (Java + 26 ports) needs 12C/32G to avoid contention.
- Billing: Monthly (not annual), Virginia (Manassas) location.
admin-ai migration — critical path
admin-ai.itpropartner.com (LiteLLM on ai box at Hetzner) serves the deepseek-chat model that powers Sho'Nuff. It is the most critical service. Sequential steps:
- Set up new LiteLLM + PostgreSQL on Core (or Monitor box)
- Dump old PostgreSQL:
docker exec litellm_postgres pg_dump -U litellm litellm_db > litellm-dump.sql - Restore on new PostgreSQL
- Test new proxy:
curl http://new-box:4000/v1/models— should show all models - Update Hermes config to point at new proxy for testing
- Switch admin-ai DNS record to new IP
- Keep old ai box running for 7 days as fallback
Cron after migration
- Core retains:
hermes-live-sync,hermes-system-config-sync,hermes-docker-sync,ops-data-collector,shark-scraper,home-router-daily-backup(via WG to 10.77.0.2),vps-threshold-check - app2 gets: local UNMS/UniFi/etc. cron jobs, node_exporter for Prometheus scraping
- app3 gets: WordPress cron, node_exporter
- app1-bu keeps:
hermes-standby-watchdog,hermes-standby-sync
Cost comparison
| Current (Hetzner) | Target (netcup) | |
|---|---|---|
| Servers | 9 + app1-bu | Core + app2 + app3 + app1-bu |
| Monthly | ~$150-160 | ~$68 (app2 + app3) + Core (paid) |
| Savings | — | ~$82-92/mo |
Unchanged services
- Nginx Proxy Manager (stays on docker Hetzner box — remaining services there still need reverse proxy)
- RustDesk (stays on docker Hetzner box)
- StrongSwan Docker (stays on docker Hetzner box)
- RunCloud MariaDB instances on decommissioned Hetzner boxes — not migrated, databases stay with their apps