Node-Transport: UI-Toggle 'Verbindung über VPN' → setzt Klartext-Opt-in im Install-Script (Default https/wss) #189
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ziel
Beim Hinzufuegen/Bearbeiten eines Nodes in der UI ein Schalter "Verbindung ueber VPN" (Default: aus). Ist er an, setzt das Install-Script den Transport-Trust-Schalter in die
agent.conf→ der Agent erlaubt fuer diesen Host Klartext-Transport (ws:///http://), weil VPN den Transport bereits absichert. Jederzeit revidierbar (Toggle aendern → neu enrollen/Script neu ausrollen).Hintergrund
Default ist
wss:///https://-Zwang (public-sicher, #113 Phase 1 + #187). VPN-Hosts (NetBird/WireGuard) haben oft kein gueltiges oeffentliches Zert fuer die interne Adresse → der Zwang wuerde sie aussperren. Ueber VPN ist Klartext aber unkritisch (Transport schon verschluesselt+authentifiziert). Loesung: explizites, UI-gesteuertes Opt-in pro Host — nie stiller Klartext-Default.Backend / Modell
Node.vpn_transport(Boolean, default False) — Migration konsistent zur Kette (aktueller Head 0025 → 0026).server/main.py, agent.conf-Block ~:882): wennnode.vpn_transport→ ZeileTRUSTED_TRANSPORT=vpn(Name final mit #187 abstimmen) in die agent.conf schreiben; sonst weglassen.SERVER_URLauchhttp(s)/ws(s)zur internen Adresse sein — das Install-Script soll dann NICHT den https-Pflicht-400er (#113 Phase 1) werfen.Frontend
Abgrenzung / Bezug
Akzeptanz
Branch
feat/vpn-transport-toggleERWEITERUNG — welche SERVER_URL das Install-Script ausliefert (Kern!)
Heute packt das Script eine globale
SERVER_URLin jede agent.conf (main.py:30). Fuer Mischbetrieb (manche public, manche VPN) reicht das nicht — der Toggle muss auch die richtige Erreichbarkeit waehlen, nicht nur das Klartext-Flag.Backend kennt zwei Basis-Adressen
SERVER_URL_PUBLIC(ENV) — oeffentliche Domain, z. B.https://agent.example.com→ wird zuwss://+https://.SERVER_URL_VPN(ENV) — VPN-interne Default-Adresse, z. B.http://172.16.1.10:8765(NetBird-IP) → bleibtws:///http://.SERVER_URLals Legacy/Fallback fuer Public weiter erlaubt.)Pro-Node-Override (Entscheidung: "beides")
Node.vpn_server_url(nullable). Ist es gesetzt UND Toggle an → diese Adresse nutzen; sonst der globaleSERVER_URL_VPN. Erlaubt Hosts in abweichendem Subnetz/Standort.Auswahl-Logik beim Install-Script-Abruf (pro Node)
SERVER_URL_PUBLIC→wss://…/ws/agent+https://…-Download. https-Zwang greift (kein TRUSTED_TRANSPORT).node.vpn_server_urlfalls gesetzt, sonstSERVER_URL_VPN→ws://<vpn>/ws/agent+http://<vpn>-Download +TRUSTED_TRANSPORT=vpnin die agent.conf. Der https-Pflicht-400er (#113 Phase 1) wird fuer diesen Fall NICHT geworfen.vpn_server_urlnochSERVER_URL_VPNgesetzt → klare Fehlermeldung beim Script-Abruf (nicht still public-URL ausliefern).UI
vpn_server_url.Modell/Migration
Node.vpn_transport(Bool) +Node.vpn_server_url(String, nullable). Migration Head 0025 → 0026.Akzeptanz (ergaenzt)
.env / Doku
SERVER_URL_PUBLIC+SERVER_URL_VPNin.env.example+ Deployment-Public.md dokumentieren.ERWEITERUNG — auch in den Einstellungen bestehender Nodes
Der VPN-Toggle (+ optionales
vpn_server_url-Feld) muss nicht nur beim Anlegen, sondern auch nachtraeglich umschaltbar sein:NodeSettingsModal.svelte(Bestands-Node bearbeiten) bekommt denselben Toggle "Verbindung ueber VPN" + Adressfeld wie der Anlegen-Dialog (neben den bestehenden Feldern scan_range/internal_network).PATCH /nodes/{node_name}(update_node, admin_router.py:263) +NodeUpdateRequestumvpn_transport(Bool) undvpn_server_url(str|null) erweitern — analog zum bestehendeninternal_network-Handling (:272).WICHTIG — Umschalten wirkt nicht "magisch" (klar kommunizieren)
Der Transport-Modus steht in der
agent.confauf dem Host (TRUSTED_TRANSPORT + SERVER_URL). Ein DB-Toggle aendert den laufenden Agent NICHT von selbst. Nach dem Umschalten muss der Agent neu konfiguriert / per neuem Install-Script ausgerollt werden (bzw. der Wert in agent.conf angepasst + Agent-Restart). Daher:Akzeptanz (ergaenzt)
Bearbeitet zusammen mit #187 (gemeinsamer TRUSTED_TRANSPORT-Vertrag, auf Agent- und Backend-Seite identisch). Issue bleibt offen.
Commits: Agent `
0416d9f` · Backend `198f8b5` · Frontend `b1a8a10` · Doku `727f25f`Geteilter Vertrag: agent.conf-Schlüssel `TRUSTED_TRANSPORT=vpn` — Backend schreibt ihn bei VPN-Nodes, Agent liest ihn. Default ohne Schlüssel = scharf (wss/https, außer localhost).
b1a8a10`): VPN-Toggle + Adress-Feld in ProvisionModal (anlegen) + NodeSettingsModal (bearbeiten, Hinweis „erst nach erneutem Ausrollen wirksam"); Badge 🌐 public / 🔒 VPN (+Adresse).Live smoke-getestet: VPN+Pro-Node-Adresse → `ws://172.16.1.99:8765/ws/agent` + `SERVER_HTTP=http://…` + `TRUSTED_TRANSPORT=vpn`; Pro-Node-Override schlägt globalen Default; VPN an ohne jede Adresse → 400 (kein stilles Public-Fallback).
Akzeptanz: Schalter Agent+Backend identisch; Scheme/Adresse je Toggle korrekt; Override > Default; 400 statt Fallback; Toggle in Anlegen UND Bearbeiten, PATCH persistiert, Re-Ausroll-Hinweis.
⚠️ Deploy: `alembic upgrade head` (Migration 0026) + ENV `SERVER_URL_PUBLIC`/`SERVER_URL_VPN` setzen; Node-Agent neu bauen/ausrollen.
Verifiziert @
727f25f→ erfüllt, wird geschlossen.Node.vpn_transport+Node.vpn_server_url, Migration 0026 (1 Head, Kette OK) ✓SERVER_URL_PUBLIC/SERVER_URL_VPN; geteilter VertragTRUSTED_TRANSPORT=vpnBackend↔Agent identisch (main.py:962 ↔ config.rs:39) ✓vpn_server_urlsonstSERVER_URL_VPN→ ws/http + Flag; beide leer → 400 (kein stilles Public-Fallback, main.py) ✓Deploy:
alembic upgrade head(0026),SERVER_URL_PUBLIC/SERVER_URL_VPNsetzen, Node-Agent lokal neu bauen (jetzt mit ureq-json-Fix903ea4f) + ausrollen.