Webhook-Infrastruktur: Cloudflare Tunnel für HTTPS-Webhook-Empfang #65
Labels
No labels
agent:done
agent:ready
agent:working
area:analytics
area:chatbot
area:community
area:content
area:hardware
area:health
area:media
area:monetization
area:overlays
area:productivity
area:streaming
bug
duplicate
effort:large
effort:medium
effort:small
enhancement
good-first-issue
help wanted
invalid
priority:backlog
priority:critical
priority:high
priority:low
priority:medium
question
quick-win
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frank/streamertool#65
Loading…
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?
Kontext
Streamertool benötigt eine Möglichkeit, Webhooks von externen Diensten zu empfangen:
All diese Dienste senden Webhooks an eine öffentliche HTTPS-URL. Da streamertool lokal auf dem Rechner des Streamers läuft (Tauri 2 Desktop-App), gibt es keinen öffentlich erreichbaren Server.
Entscheidung
Cloudflare Tunnel (
cloudflared) wird als Tunnel-Lösung eingesetzt, um den lokalen Webserver über HTTPS im Internet verfügbar zu machen.Begründung
webhooks.streamertool.app)Verworfen
Aufgaben
1. Cloudflare Tunnel Setup
cloudflaredals dev-Dependency oder Bundle-Option für macOSbrew install cloudflaredoder Bundlecloudflared tunnel login(öffnet Browser für Cloudflare-Login)webhooks.streamertool.app)localhost:3443(dedizierter Webhook-Port)2. macOS Integration (Launchd Service)
~/Library/LaunchAgents/)localhost:3443)3. Dashboard Konfiguration
cloudflaredVersion anzeigen4. Sicherheit
Technische Leitplanken
3443(dediziert, nicht der Overlay-Server-Port):3443) → Cloudflare Tunnel → Webhook-Registrierung bei Dienstensettings.json→webhooks.tunnel/wiki/ADR-001-Cloudflare-Tunnel)Abhängigkeiten
cloudflared(brew / manuelle Installation).trycloudflare.com-Subdomain)Akzeptanzkriterien
localhost:3443mit öffentlicher HTTPS-URLVerwandte Issues
Cloudflare Tunnel Integration im Tool
🚨 Korrektur & Neuspezifikation
Dieses Issue wurde ursprünglich als "Webhook-Infrastruktur: Cloudflare Tunnel für HTTPS-Webhook-Empfang" angelegt. Nach Analyse der Projektarchitektur und der Nutzeranforderungen wird die Spezifikation grundlegend überarbeitet:
Der Cloudflare Tunnel muss vollständig in das Tool integriert sein — mit einem Einrichtungsassistenten, automatischem Start/Stopp und ohne dass der Nutzer zusätzliche Abhängigkeiten installieren muss. Die meisten Streamer nutzen Windows (AMD64), daher ist Windows der primäre Fokus.
🎯 Ziel
Streamertool integriert Cloudflare Tunnel (
cloudflared) als eingebautes Feature:cloudflaredBinary wird im Bundle mitgeliefert oder automatisch heruntergeladen📐 Architektur
Neues Rust-Modul:
src-tauri/src/tunnel/Integration in bestehende Struktur
AppStatetunnel: Arc<RwLock<TunnelManager>>Lifecyclelifecycle.spawn("tunnel", ...)Secretssecrets.set("cloudflare.tunnelToken", ...)tunnel.enabled,tunnel.port(default 3443),tunnel.hostnamein SQLite settingsget_tunnel_status,start_tunnel,stop_tunnel,open_tunnel_login,get_tunnel_logsGET /api/tunnel(Status),POST /api/tunnel/start,POST /api/tunnel/stopState Machine (TunnelManager)
🔧 Setup-Assistent (Wizard)
Schritt 1: Cloudflare-Login
cloudflared tunnel logincert.pem(Cloudflare API Token)Schritt 2: Tunnel erstellen
streamertool-webhooks(voreingestellt)webhooks.streamertool.app).trycloudflare.comSubdomainSchritt 3: Port konfigurieren
3443(dedizierter Webhook-Port)Schritt 4: Autostart
📦 Bundling-Strategie
Windows (AMD64) — Primär
cloudflared.exe(~15 MB) als Tauri-Resource inbundle.resourceshttps://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exenach%APPDATA%/streamertool/bin/%APPDATA%\io.hildebrandt.streamertool\bin\cloudflared.exemacOS (ARM64/AMD64) — Sekundär
cloudflaredals Bundle-Resource inbundle.resourcescurl -Lvon Cloudflare GitHub Releases~/Library/Application Support/io.hildebrandt.streamertool/bin/cloudflaredVerifikation
cloudflared versionzur Laufzeit prüfen🖥️ Dashboard-Integration
Neue Seite: "Tunnel" (in der Settings-Navigation)
cloudflaredOutputDashboard-Übersicht
🔄 Lifecycle-Integration
App-Start
AppState::bootstrap()→TunnelManager::load()(Config aus DB + Secrets)tunnel.enabled == trueund Token vorhanden:lifecycle.spawn("cloudflare-tunnel", tunnel_manager.run())App-Shutdown
AppState::shutdown()→TunnelManager::stop()cloudflaredProzess bekommt SIGTERM (odertaskkillauf Windows)Bei Fehlern
tunnel.error→ Event-Bus (für Alarme)📝 cloudflared Konfiguration
Tunnel-Konfiguration (
~/.cloudflared/config.yml— automatisch generiert)Alternativ: Quick-Tunnel (ohne eigene Domain)
→ Gibt
https://<random>.trycloudflare.comzurück⚙️ Implementierungsschritte
Phase 1: Grundstruktur (Rust Backend)
tunnel/mod.rs— TunnelManager Struct + State Machinetunnel/binary.rs— Binary-Suche (Bundle/DataDir/System-PATH), Auto-Download, SHA-256 Verifytunnel/config.rs— Config-Generierung, Credential-File-Managementtunnel/platform.rs— Windows:%APPDATA%, macOS:~/Library/Application SupportAppState(neues Feld, Shutdown-Reihenfolge)get_tunnel_status,start_tunnel,stop_tunnelPhase 2: Setup-Wizard
tunnel/wizard.rs— OAuth-Flow viacloudflared tunnel logincloudflared tunnel createcloudflared tunnel route dnsPhase 3: Dashboard & API
GET /api/tunnel,POST /api/tunnel/start,POST /api/tunnel/stopPhase 4: Bundling & Build
cloudflaredDownload-Script für CI/CD (scripts/download-cloudflared.sh)tauri.conf.json+Makefilecloudflared.execloudflaredBinarytunnel/binary.rsPhase 5: Autostart & Lifecycle
🔐 Sicherheit
SecretStorevia OS-Keychain (bereits vorhanden)~/.cloudflared/3443— nur localhost, nicht im LAN erreichbar🌐 Plattform-Strategie
📊 Legacy-API
Die bestehenden API-Endpunkte aus
server/mod.rsbleiben unverändert. Neue Tunnel-Endpunkte werden separat unter/api/tunnel/*hinzugefügt, geschützt durch den existierendenadmin_auth_middleware.🔗 Abhängigkeiten & Verwandte Issues
:3443, Tunnel leitet dorthin❌ Verworfen
cloudflaredist erprobt und von Cloudflare maintained