docs: Final UI refactor — Dashboard + Services, 6 items

Dashboard: infrastructure health (router, cloudflare, DDNS, daemons).
Services: every registered service with full status (DNS, proxy, TLS,
DDNS) in expandable rows + custom TCP routes section.

9 sidebar items → 6. Seven old pages eliminated — their content lives
in the two new pages where it belongs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-09 22:16:31 +00:00
parent 0646abb9af
commit 2e6fce54e3

View File

@@ -6,141 +6,183 @@ Everything flows from the **service**. When a service is registered, Central lig
This creates two clear sections:
- **Services section** — the service-driven system. Everything here exists because services were registered (or because services need it to function). This is what Wild Cloud and Wild Works interact with.
- **Central section** — the device itself. Firewall, VPN, security, DHCP. These exist whether or not any services are registered. This is the appliance config.
- **Services section** — the service-driven system. Infrastructure health + registered services with their full status.
- **Central section** — the device itself. Firewall, VPN, security, DHCP. These exist whether or not any services are registered.
## Navigation
```
Services
├── Dashboard (default landing — health, warnings, at-a-glance status)
├── Cloudflare (THE setup page — token, zones, tunnel. Prerequisite for everything)
├── Services (registered services — the primary config surface)
├── DNS (complete DNS picture — internal + external resolution per service)
└── Certificates (TLS status per service — what's provisioned, what's missing)
├── Dashboard (infrastructure health: router, cloudflare, DDNS, daemons)
├── Services (registered services + custom TCP routes)
Central
├── Firewall (nftables rules)
├── VPN (WireGuard server + peers)
├── CrowdSec (intrusion detection)
└── DHCP (IP address assignment + leases)
├── Firewall
├── VPN
├── CrowdSec
└── DHCP
```
## Page Designs
6 sidebar items (down from 9). Two labeled groups with clear separation.
### Dashboard
---
The landing page. At-a-glance system health:
- Daemon statuses: dnsmasq ✓, haproxy ✓, wireguard ✓, crowdsec ✓
- Registered services: 9 services (7 public, 2 internal)
- Certificates: 2 valid, 1 missing — ⚠ warning
- DDNS: synced, public IP 216.243.55.15
- Cloudflare: token valid ✓
- Warnings/actions: "wild-cloud.payne.io needs a TLS cert → Provision"
## Dashboard
If Cloudflare isn't configured, the dashboard shows a prominent setup prompt directing the user there first.
The "is everything working" page. Shows the health of the infrastructure that Central depends on. If anything here is red, services won't work properly.
### Gateway Router
- Is the router forwarding DNS to Central (192.168.8.151)?
- Are the required ports forwarded? (443, 80, 51820/UDP)
- Instructions for common routers if not configured
### Cloudflare
- Is the API token configured and valid?
- What zones are accessible?
- Token setup inline if missing (don't send user to another page)
The prerequisite page. Everything public depends on this:
- API token management (set, verify, show accessible zones)
- Tunnel status (cloudflared connection, connected services)
- DDNS provider config (which records to sync, current public IP, last sync)
### Dynamic DNS
- Is the public IP current? When was it last checked?
- Are all A records synced?
- Record list with status (cloud.payne.io ✓, dev.payne.io ✓, etc.)
- These are infrastructure records, not per-service — they exist to make the public IP reachable
This is the first page a new user configures. Without the token, public DNS and TLS certs don't work — the UI should make this dependency obvious.
### Daemon Status
- dnsmasq: running ✓ (listening on 192.168.8.151)
- haproxy: running ✓ (pid 12345)
- wireguard: running ✓ (2 peers connected)
- crowdsec: running ✓
- nats: running ✓
### Services
### Warnings
- "wild-cloud.payne.io needs a TLS cert → [Provision]"
- "Cloudflare token not set → [Configure]"
- "Port 443 not forwarded on router → [How to fix]"
THE primary interaction surface. Every registered service in one table:
---
| Domain | Backend | Type | Reach | DNS | TLS | DDNS |
|--------|---------|------|-------|-----|-----|------|
| cloud.payne.io | 192.168.8.240:443 | L4 passthrough | public | ✓ resolves | ✓ passthrough | ✓ A record |
| *.cloud.payne.io | (same) | L4 wildcard | public | ✓ resolves | ✓ passthrough | — |
| central.payne.io | 127.0.0.1:15055 | L7 proxy | internal | ✓ resolves | ✓ 88d left | — (internal) |
| wild-cloud.payne.io | 127.0.0.1:5055 | L7 proxy | internal | ✓ resolves | ⚠ missing | — (internal) |
| payne.io | 192.168.8.240:443 | L4 exact | public | ✓ resolves | ✓ passthrough | ✓ A record |
## Services
Each row shows the **complete status** of one service — every effect Central provides for it. The user sees immediately: "wild-cloud.payne.io is missing a TLS cert." Click a row to see details or take action.
THE page. Everything about every service in one place.
Central's own domain (from config) appears in this table too — it's just another service from the user's perspective.
### Service List
The service detail view shows:
- All the effects (DNS entry, proxy route, TLS cert, DDNS record)
- The registration source (wild-cloud, wild-works, config)
- Actions: provision cert, change reach, deregister
Each service is a collapsed row showing summary status. Expand for full details.
HAProxy raw config, stats, and generate/restart move to a collapsible "Advanced" section at the bottom.
**Collapsed row:**
```
cloud.payne.io L4 passthrough public *.subdomains ✓✓✓✓
wild-cloud.payne.io L7 proxy internal ✓✓⚠—
payne.io L4 exact public ✓✓✓✓
```
### DNS
The four indicators are: DNS, Proxy, TLS, DDNS. Green/warning/missing/not-applicable.
The **complete DNS picture** for all services. Not a configuration page — a status view showing how every domain resolves, from both inside and outside the network.
**Expanded row for cloud.payne.io:**
```
┌─────────────────────────────────────────────────────────────────────┐
│ cloud.payne.io wild-cloud public│
│ L4 passthrough → 192.168.8.240:443 *.subdomains │
├─────────────────────────────────────────────────────────────────────┤
│ DNS (LAN) address=/cloud.payne.io/192.168.8.240 ✓ │
│ DNS (Public) A record cloud.payne.io → 216.243.55.15 ✓ │
│ Proxy HAProxy L4 SNI + wildcard *.cloud.payne.io ✓ │
│ TLS passthrough (k8s traefik handles) ✓ │
│ │
│ Source: wild-cloud Registered: 2h ago │
│ [Change Reach] [Deregister] │
└─────────────────────────────────────────────────────────────────────┘
```
For each service domain:
| Domain | Internal (LAN) | External (Internet) |
|--------|---------------|---------------------|
| cloud.payne.io | 192.168.8.240 (direct to k8s LB) | 216.243.55.15 (via DDNS) |
| central.payne.io | 192.168.8.151 (Central) | — (internal only) |
| internal.cloud.payne.io | 192.168.8.240 (with local=/) | — (never forwarded) |
**Expanded row for wild-cloud.payne.io:**
```
┌─────────────────────────────────────────────────────────────────────┐
│ wild-cloud.payne.io wild-cloud internal│
│ L7 reverse proxy → 127.0.0.1:5055 │
├─────────────────────────────────────────────────────────────────────┤
│ DNS (LAN) local=/ + address=.../192.168.8.151 ✓ │
│ DNS (Public) (internal only — no public DNS record) — │
│ Proxy HAProxy L7 Host header routing ✓ │
│ TLS Central terminates — cert MISSING ⚠ │
│ └─ [Provision Certificate] │
│ │
│ Source: wild-cloud Registered: 2h ago │
│ [Change Reach] [Deregister] │
└─────────────────────────────────────────────────────────────────────┘
```
Plus DNS server infrastructure status:
- dnsmasq: running ✓, listening on 192.168.8.151
- Upstream forwarders: 1.1.1.1, 8.8.8.8
- DDNS sync: last checked 2m ago, public IP 216.243.55.15
Central's own domain (from config) appears here too — it's just another row. Source shows "config" instead of a consumer name.
This replaces the three overlapping DNS pages (dns, lan-dns, ddns) with one coherent view.
### Custom TCP Routes
### Certificates
Below the service list, a separate section for manual TCP proxy rules that aren't domain-based service registrations:
TLS cert status for every service that needs Central to terminate TLS:
```
Custom TCP Routes
┌────────────────────────────────────────────────┐
│ civil_ssh port 2222 → 192.168.8.10:22 │
│ [Remove] │
├────────────────────────────────────────────────┤
│ [+ Add Custom Route] │
└────────────────────────────────────────────────┘
```
| Domain | Status | Expires | Issuer | Action |
|--------|--------|---------|--------|--------|
| central.payne.io | ✓ valid | 88 days | Let's Encrypt | Renew |
| wild-cloud.payne.io | ⚠ missing | — | — | Provision |
These are from `cloud.haproxy.customRoutes` in the global config.
Services with TLS passthrough (k8s instances) don't appear here — their backend handles TLS.
### Actions
"Provision" and "Renew All" buttons. "Add Wildcard" for opt-in wildcard certs.
- **Register new service** (manual registration form)
- **Provision certificate** (per-service, inline)
- **Change reach** (internal ↔ public, per-service)
- **Deregister** (per-service)
- **Add wildcard cert** (covers multiple services under same domain)
- **Generate & Apply HAProxy** (advanced, collapsed)
- **View raw HAProxy config** (advanced, collapsed)
Requires Cloudflare token — if not configured, shows a prompt directing to Cloudflare page.
---
### Firewall, VPN, CrowdSec, DHCP
## Central Section
These are Central's own infrastructure config. Not service-driven. Each is its own page under the "Central" sidebar section. No changes needed to their content — just the grouping.
These pages are unchanged in content. They're Central's own infrastructure config — not driven by service registrations.
## Key Design Principles
### Firewall
nftables rules. Ports opened for HAProxy (443, 80), VPN (51820), SSH (22), plus any custom.
1. **Services are the entrypoint.** Every page in the Services section answers: "what did Central do (or need to do) because of the services registered with it?"
### VPN
WireGuard server config + peer management. Add/remove peers, view configs, QR codes.
2. **Status over configuration.** DNS and Certificates pages are primarily status views — they show the effects of service registrations. The user configures services, not DNS entries directly.
### CrowdSec
Intrusion detection. Alerts, decisions, machines, bouncers.
3. **Dependencies are visible.** Dashboard warns if Cloudflare isn't configured. Certificates page warns if token is missing. Services page shows which effects are green vs red.
### DHCP
dnsmasq DHCP config. IP ranges, lease times, static leases, active leases.
4. **Two sections, two concerns.** Services = outward-facing (what Central does for consumers). Central = inward-facing (what the device does for itself).
---
## Migration
## What Disappeared
### Pages to delete
- `LanDnsPage.tsx` — duplicate
- `DdnsPage.tsx` — folded into Cloudflare
- `LanDnsComponent.tsx` — duplicate
The following pages are eliminated — their content lives elsewhere:
### Pages to rename
- `CentralPage.tsx``DashboardPage.tsx`
- `IngressProxyPage.tsx``ServicesPage.tsx`
- `IngressProxyComponent.tsx``ServicesComponent.tsx`
- `CentralComponent.tsx``DashboardComponent.tsx`
| Old Page | Where It Went |
|----------|---------------|
| Overview | → Dashboard (completely rewritten as infrastructure health) |
| Cloudflare | → Dashboard (Cloudflare section) |
| DNS | → Services (per-service DNS status in expanded rows) |
| LAN DNS | → Services (per-service LAN DNS entries) |
| DDNS | → Dashboard (Dynamic DNS section — infrastructure health) |
| Ingress Proxy | → Services (proxy status in expanded rows, custom routes section) |
| Certificates | → Services (TLS status in expanded rows, provision inline) |
### Pages to rewrite
- `DashboardComponent` — new status dashboard (currently just operator email)
- `ServicesComponent` — new service table with per-service effect status
- `DnsComponent` — unified DNS view (internal + external per service)
- `CloudflareComponent` — add DDNS management and tunnel status
---
### Sidebar changes
- Two labeled groups: "Services" and "Central"
- "Overview" → "Dashboard"
- "Ingress Proxy" → "Services"
- Remove DNS/LAN DNS/DDNS → replace with single "DNS"
- Add DDNS content to Cloudflare page
## Design Principles
1. **Services are the entrypoint.** The Services page is where you see, configure, and troubleshoot everything about what Central serves.
2. **Dashboard is about infrastructure.** Is the foundation healthy? Router, Cloudflare, DDNS, daemons. If something here is red, fix it before worrying about individual services.
3. **Everything about a service is in one place.** DNS, proxy, TLS, DDNS — all visible in the expanded service row. No hopping between pages to understand one service's status.
4. **Two sections, two concerns.** Services = what Central does for consumers. Central = what the device does for itself.
5. **6 items, not 9.** Less navigation, less confusion. The information isn't lost — it's better organized.