Remaining development work for the SIAAS infrastructure on the main VPS, prioritised by impact.
A full provisioning workflow UI has been built. See summary below of what's done and what remains.
✅ What's been built (2026-07-02):
FasthostsAccount, ClientVPS (with status lifecycle: pending → provisioning → active/failed), ProvisioningLoginfrastructure/provisioning_service.py): Pure-Python SSH automation using sshpass. Executes the 7-step blueprint: connect → system update → UFW lockdown → WireGuard → PostgreSQL 16 → app user → client admin → handover package. Runs in a background thread with real-time log streaming via Server-Sent Events (SSE).| URL | Purpose |
|---|---|
/infrastructure/system/ |
System Overview — multi-client dashboard |
/infrastructure/ |
Per-tenant infrastructure dashboard |
/infrastructure/accounts/ |
Fasthosts account management |
/infrastructure/vps/ |
Client VPS list with status filter |
/infrastructure/vps/request/ |
Create pending VPS request |
/infrastructure/vps/<pk>/provision/ |
Enter IP + temp password, start setup |
/infrastructure/vps/<pk>/provision/stream/ |
Live provisioning log viewer |
/infrastructure/vps/<pk>/provision/sse/ |
SSE streaming endpoint |
/infrastructure/vps/<pk>/ |
VPS detail + handover package (printable) |
/infrastructure/vps/<pk>/reprovision/ |
Retry failed provisioning |
test-client ClientVPS record created in database (status: pending, tenant: VeriPath GP)❌ What remains:
77.68.97.101) has UFW blocking SSH from the main VPS IP (88.208.212.211) — needs ufw allow from 88.208.212.211 to any port 22 added via remote consolesystem_dashboard.html template was previously orphaned (no URL or view) — now wired up as the System Overviewinfrastructure_dashboard.html had {% load humanize %} which isn't in INSTALLED_APPS — removed and |intcomma references replacedReference: infrastructure/SIAAS/client_vps_setup wiki page for the full blueprint.
On 2026-06-30, three core containers (PostgreSQL, Redis, Keycloak) exited simultaneously, causing a 4-hour outage. The root cause is unknown.
3ff9c011e629_gp_booking_postgres, redis, and keycloak from the exit time/var/log/syslog and /var/log/kern.log around the timedmesg | grep oom)Currently, client VPS backups are logged but not alerted on failure.
ClientBackupLog for failures in the last 24 hoursReference: infrastructure/SIAAS/client_vps/client_vps_backup wiki page.
Client VPS backups are currently stored locally only (/var/backups/practice/). A disk failure loses both data and backups.
rsync or scp step in the backup script to send encrypted backups to the principal VPS172.18.0.6:9000) as an S3-compatible backup targetThe script currently has hardcoded container IPs for PostgreSQL host and Wiki.js API URL. These are fragile — the IPs change on container restart.
/opt/wiki-manage.conf or environment variables)3ff9c011e629_gp_booking_postgres for DB, wikijs for API) instead of IPs where possibleSeveral wiki pages may reference stale IPs, wrong URLs, or outdated configurations after the 2026-07-01 infrastructure fixes.
A billing module for client VPS subscriptions. Not yet started.
/dashboard/accounts/) already exists and can serve as the entry pointReference: existing InvoiceGenerationView, ContractRenewalView in dashboards/views/dashboards.py.
| # | Task | Priority | Est. Effort | Dependencies |
|---|---|---|---|---|
| 1 | Client VPS Provisioning UI | High | 3-5 days | End-to-end test against target VPS needed |
| 2 | Container Exit Root Cause | Medium | 1-2 days | Access to historical logs |
| 3 | Backup Monitoring & Alerting | Medium | 1-2 days | Existing Celery infra |
| 4 | Off-site Backup Transfer | Medium | 2-3 days | MinIO or rsync target |
| 5 | Wiki-Manage.py Config File | Low | 0.5 day | — |
| 6 | Documentation Audit | Low | 1-2 days | — |
| 7 | Billing App | Low/Future | 2-3 weeks | Stripe integration exists |