CluPilotCloud/resources/views/livewire/admin
nexxo 71ca0e1394 feat(admin): VPN access management with live peer state
The console can now create, block and remove VPN accesses, and shows who is
actually connected — traffic counters, source endpoint and last handshake.

Design notes:
- The web container has no wg0, so the page never talks to WireGuard. Live
  state is copied in by SyncVpnPeers on the provisioning queue (the only worker
  whose container owns the interface); the page polls the database and merely
  nudges that job, throttled so many open tabs cannot flood the queue.
- enabled (operator intent) and present (observed on the hub) are stored
  separately, so a sync can never quietly undo a block and drift stays visible
  as "wird angewendet".
- The sync adopts peers the host pipeline registered, naming them after their
  host — otherwise "who is on the VPN" would have blind spots.
- Keypairs are generated in PHP via libsodium rather than shelling out to
  wg genkey (no interface in this container, and it keeps generation testable).
  The private key is shown once and never stored.
- allocateIp() now also considers vpn_peers, which would otherwise be handed a
  tunnel address a host already holds.
- vpn.manage is a new capability held by Owner/Admin only, and it hides the nav
  entry too — a VPN access reaches the management network.

Verified end to end against the real hub, not just mocks: created an access in
the browser, connected with the generated config, watched the console flip to
"Verbunden" with real counters, then blocked it and confirmed the peer was
gone from wg0 and the client could no longer handshake.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 21:38:12 +02:00
..
confirm-delete-datacenter.blade.php fix(ui): make modal cancel buttons work; serve the app over the HTTPS domains 2026-07-25 21:24:03 +02:00
confirm-delete-vpn-peer.blade.php feat(admin): VPN access management with live peer state 2026-07-25 21:38:12 +02:00
confirm-remove-host.blade.php fix(ui): make modal cancel buttons work; serve the app over the HTTPS domains 2026-07-25 21:24:03 +02:00
customers.blade.php fix: seat limit + suspend guard per Codex; harden factory email uniqueness 2026-07-25 14:53:15 +02:00
datacenters.blade.php fix(admin): no admin lockout (is_admin fallback); centered modal width; datacenter edit modal + country dropdown 2026-07-25 18:09:17 +02:00
edit-datacenter.blade.php fix(ui): make modal cancel buttons work; serve the app over the HTTPS domains 2026-07-25 21:24:03 +02:00
host-create.blade.php feat(admin): datacenters management (create + select) 2026-07-25 13:25:17 +02:00
host-detail.blade.php feat(admin): host reserve edit + maintenance drain; customer suspend/reactivate 2026-07-25 14:30:21 +02:00
hosts.blade.php feat(admin): scalable host list (search/filter/health) + host detail redesign 2026-07-25 14:27:53 +02:00
instances.blade.php feat(admin): dark Tactical-Terminal operator console 2026-07-25 08:35:03 +02:00
maintenance.blade.php fix(portal): no silent no-ops without a customer; maintenance visible per instance; maintenance form redesign 2026-07-25 19:10:44 +02:00
overview.blade.php feat(admin): datacenter edit+delete (guarded); MRR chart fills card; host-load as meters 2026-07-25 14:22:15 +02:00
provisioning.blade.php feat(admin): provisioning liveness — per-run progress bar, last-activity, stale warning 2026-07-25 18:11:17 +02:00
revenue.blade.php feat(admin): dark Tactical-Terminal operator console 2026-07-25 08:35:03 +02:00
settings.blade.php fix(admin): shown-once temp password for invited staff; suppress announcements for cancelled windows at send time 2026-07-25 16:23:21 +02:00
vpn.blade.php feat(admin): VPN access management with live peer state 2026-07-25 21:38:12 +02:00