Tutorial
30 min read
32 views

Moderne Entwickler-Workflows & Erweiterte Infrastruktur-Integrationen

Erfahren Sie, warum Standard-HTTP-Proxies Next.js 15+ Server Actions und Vite WebSocket HMR-Verbindungen fallen lassen und wie Sie sub-millisekundliches Hot-Reloading über Remote-Tunnel aufrechterhalten.

IT
InstaTunnel Team
Published by the InstaTunnel team | Editorial policy
Moderne Entwickler-Workflows & Erweiterte Infrastruktur-Integrationen

Quick answer

Tunneling von Vite 6 & Next.js Server Actions: HMR beheben: webhook testing answer

For local webhook testing, run your app locally, expose it with a public HTTPS tunnel, and paste the stable callback URL into the provider dashboard.

How do I test webhooks on localhost?

Start your local server, open a public HTTPS tunnel to that port, configure the provider webhook URL, and inspect events in your local logs.

Why does a stable webhook URL matter?

Stable URLs prevent provider dashboards from needing manual callback updates every time you restart a tunnel.

Moderne Full-Stack-Architekturen balancieren entfernte Cloud-Laufzeiten mit sofortigem Feedback auf Entwicklermaschinen. Schnelle Iterationen—sei es in Next.js-Frontend-Anwendungen oder verteilten Microservices—erfordern das Routing von Live-Datenverkehr zwischen Cloud-Grenzen und lokalen Entwicklerumgebungen.

Dieses Handbuch bietet technische Strategien zum Proxying lokaler Entwicklungsserver, Weiterleitung von Telemetrie-Spans, Routing von Multi-Tenant-Webhooks und Anbindung von Cloud-Previews an ephemeral Datenbank-Instanzen.

1. Hot-Reload über Grenzen hinweg: Tunneling von Vite 6 und Next.js Server Actions über HMR-fähige Proxies

Traditionelle HTTP-Reverse-Proxies (wie Standard-Nginx oder einfache SSH-Tunnel) brechen zustandsbehaftete Webanwendungen, weil sie den Traffic stateless evaluieren. Moderne Entwicklungstools wie Vite 6 und Next.js 15+ setzen auf bidirektionale, latenzarme Verbindungen, um Client-Zustände zu synchronisieren, serverseitige Module zu kompilieren und Server Actions zu verarbeiten.

+-------------------------------------------------------------------------------+
|                             PUBLIC CLOUD TUNNEL                               |
|                     https://dev-tenant.app.example.com                        |
+-------------------------------------------------------------------------------+
                                       |
                                       | TLS Terminal & WSS Upgrade
                                       v
+-------------------------------------------------------------------------------+
|                       HMR-AWARE REVERSE TUNNEL PROXY                          |
|  - Host Header Rewriting (Origin Verification)                                |
|  - HTTP/1.1 Upgrade Handling (101 Switching Protocols)                        |
|  - Keep-Alive Pings & Dynamic Client Port Mapping                             |
+-------------------------------------------------------------------------------+
                                       |
            +--------------------------+--------------------------+
            | (gRPC / Multiplexed TCP)                            | (HTTP/2 Server Actions)
            v                                                     v
+-----------------------+                             +-----------------------+
|  Vite Dev Server      |                             | Next.js App Router    |
|  (Localhost:5173)     |                             | (Localhost:3000)      |
|                       |                             |                       |
| - HMR WebSocket Path: |                             | - CSRF Allowed Host:  |
|   /_vite_hmr          |                             |   dev-tenant.example  |
+-----------------------+                             +-----------------------+

Warum traditionelle Proxies HMR und Server Actions unterbrechen

  1. WebSocket-Frameing wird fallengelassen: Standard-HTTP-Proxies behandeln eingehenden Traffic als kurze Request/Response-Paare. Wenn Vite einen HTTP/1.1 Upgrade: websocket-Handshake versucht, um den HMR-Kanal aufzubauen, können stateless Proxies die persistente TCP-Verbindung nicht aufrechterhalten. Das führt zu kontinuierlichen Fallback-Reloads.
  2. Next.js 15+ Host Header & CSRF-Checks: Next.js Server Actions werden via HTTP POST mit versteckten Endpoint-IDs ausgeführt. Um Cross-Site Request Forgery (CSRF) zu verhindern, prüft Next.js die Origin- und Host-Header. Wenn ein Tunnel Host: localhost:3000 umschreibt, ohne den öffentlichen Tunnel-URL zu entsprechen, blockiert Next.js den Aufruf.
  3. Nicht übereinstimmende WebSocket-Ports: Vite injiziert ein Client-Side-Script, das eine WebSocket-Verbindung zum HMR-Port öffnet. Wenn der Browser sich mit [https://app.example.com](https://app.example.com) (Port 443) verbindet, Vite aber den Client anweist, ws://localhost:5173 zu öffnen, blockiert die Same-Origin-Policy im Browser die Verbindung.

Architektur für Vite 6: Erhaltung der HMR-Sub-Millisekunden-Performance

Um sub-millisekondisches HMR über öffentliche Tunnel (wie Cloudflare Tunnels, frp oder ngrok) zu gewährleisten, konfigurieren Sie den internen WebSocket-Server von Vite so, dass er den internen Listening-Port vom öffentlichen Client-Port trennt.

// vite.config.ts
import { defineConfig } from 'vite';

export default defineConfig({
  server: {
    host: '0.0.0.0',
    port: 5173,
    strictPort: true,
    hmr: {
      // Öffentlicher Hostname, der durch Ihren Tunnel exponiert wird
      host: 'vite-tunnel.dev.example.com',
      // Erzwingt die Nutzung von HTTPS/WSS anstelle des internen Ports
      clientPort: 443,
      protocol: 'wss',
      path: '/_vite_hmr',
    },
    // Verhindert HMR-Verbindungsabbrüche durch Host-Mismatch
    cors: true,
  },
});

Next.js 15+ Server Action Tunnel-Konfiguration

Für Next.js 15 aktualisieren Sie next.config.ts, um die Ausführung von Server Actions durch öffentliche Dev-Tunnel zu erlauben.

// next.config.ts
import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
  experimental: {
    serverActions: {
      // Whitelist der Tunnel-Origins für CSRF-Checks
      allowedOrigins: [
        'next-tunnel.dev.example.com',
        '*.tunnel.dev.example.com',
      ],
    },
  },
};

export default nextConfig;

2. Verteilung von Distributed Traces vom Cloud-Staging zu Ihrer lokalen Jaeger UI

Beim Debuggen von Microservices in Staging-Umgebungen ist das Nachverfolgen asynchroner Requests durch mehrere Dienste essenziell. Das Senden von Telemetriedaten an ein zentrales Backend erzeugt jedoch Rauschen und erschwert die Isolierung.

Mit OpenTelemetry (OTLP) Collectors können Backend-Entwickler Telemetrie-Streams an eine lokale Jaeger UI weiterleiten, ohne die Remote-Speicherung zu belasten.

+-----------------------------------------------------------------------------------+
|                              CLOUD STAGING CLUSTER                                |
|                                                                                   |
|  +---------------------+      +---------------------+      +-------------------+  |
|  |  Auth Microservice  | --- | Order Microservice  | --- | Payment Service   |  |
|  +---------------------+      +---------------------+      +-------------------+  |
|                                          |                                        |
|                                          | OTLP / gRPC (Port 4317)                |
|                                          v                                        |
|                      +---------------------------------------+                    |
|                      |   Cloud Staging OTLP Collector     |                    |
|                      +---------------------------------------+                    |
+------------------------------------------|----------------------------------------+
                                           |
                                           | Routing via Tailscale/SSH Reverse Tunnel
                                           v
+-----------------------------------------------------------------------------------+
|                             LOCAL DEVELOPER WORKSTATION                           |
|                                                                                   |
|  +-----------------------------------------------------------------------------+  |
|  | Local OpenTelemetry Collector                                               |  |
|  | - Empfängt: OTLP / gRPC auf 127.0.0.1:4317                                   |  |
|  | - Filtert: attributes["x-developer-id"] == "dev-alice"                       |  |
|  +-----------------------------------------------------------------------------+  |
|                                          |                                        |
|                                          v OTLP / gRPC (unsicher)                 |
|  +-----------------------------------------------------------------------------+  |
|  | Local Jaeger UI Container                                                   |  |
|  | - Ingestion Port: 4317                                                      |  |
|  | - Web UI: http://localhost:16686                                          |  |
|  +-----------------------------------------------------------------------------+  |
+-----------------------------------------------------------------------------------+

Das Trace-Hijacking-Problem

Das direkte Senden von Spans an Cloud-Storage wie Datadog, Honeycomb oder eine geteilte AWS OpenSearch-Instanz bringt zwei Probleme:

  • Index-Kontamination: Debug-Logs und fehlerhafte Payloads verschmutzen Produktiv- und Staging-Dashboards.
  • Latenz & Rate Limits: Hochvolumige Spans über Internet zu exportieren, erhöht die Cloud-Importkosten und das Risiko, die Vendor-Rate-Limits zu überschreiten.

Architektur: Selektives OTLP Reverse Routing

Entwickler können gezielt Spuren isolieren und weiterleiten, indem sie kontextuelle Header (wie x-developer-id: dev-alice) verwenden, die von einem OpenTelemetry Collector-Routing-Connector verarbeitet werden.

Schritt 1: Konfiguration des Staging-OTLP-Collectors

Konfigurieren Sie den Staging-OTLP-Collector so, dass er eingehende Trace-Attribute auswertet und getaggte Spans durch eine Reverse-gRPC-Pipeline zurück an eine lokale Maschine routet.

# otel-collector-staging.yaml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317

processors:
  batch:
    timeout: 1s
    send_batch_size: 256

exporters:
  # Standard-Ziel für Cloud-Speicherung
  otlp/staging_backend:
    endpoint: "tempo-staging.internal.net:4317"
    tls:
      insecure: true

  # Reverse-Tunnel-Ziel, das auf die Entwicklermaschine zeigt
  otlp/dev_alice_local:
    endpoint: "host.docker.internal:14317"
    tls:
      insecure: true

connector:
  routing:
    default_exporters: [otlp/staging_backend]
    from_attribute: "x-developer-id"
    table:
      - value: "dev-alice"
        exporters: [otlp/dev_alice_local]

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [routing]

Schritt 2: Reverse-Tunnel und lokale Ingestion einrichten

Etablieren Sie einen Reverse-SSH-Tunnel von Ihrer Entwickler-Arbeitsstation zum Staging-Gateway, der Port 14317 auf dem Staging-Knoten auf Port 4317 lokal abbildet.

# Reverse SSH gRPC-Tunnel aufbauen
ssh -R 14317:localhost:4317 developer@staging-gateway.internal.net -N

Starten Sie einen leichten lokalen Jaeger-Container (mit native OTLP-Ingestion):

docker run -d --name jaeger-local \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 16686:16686 \
  -p 4317:4317 \
  jaegertracing/all-in-one:latest

Wenn eine HTTP-Anfrage mit dem Header x-developer-id: dev-alice die Staging-Umgebung erreicht, verzweigt sich der gesamte Trace-Baum und streamt direkt zu Ihrer lokalen Jaeger UI unter http://localhost:16686.

3. Lokale Stripe Connect Webhooks mit dynamischen Multi-Tenant-Subdomains testen

Das Testen von Multi-Tenant-SaaS-Plattformen erfordert die Isolierung von Events für unterschiedliche Organisationen. Beim Aufbau von Multi-Tenant-Architekturen mit Stripe Connect (bei denen eine Plattform mehrere verbundene Konten verwaltet) verschleiert das Debuggen von Webhooks über einen einzigen Endpunkt dynamische Tenant-Auflösungsprobleme.

                                  STRIPE CLOUD
                                        |
                 +----------------------+----------------------+
                 | Connect Webhook Event                       |
                 | Konto: acct_tenant_A                      | Konto: acct_tenant_B
                 v                                             v
  +------------------------------+             +------------------------------+
  | https://tenant-a.tunnel.dev  |             | https://tenant-b.tunnel.dev  |
  +------------------------------+             +------------------------------+
                 |                                             |
                 +----------------------+----------------------+
                                        |
                                        v
                        +-------------------------------+
                        | WILDCARD INGRESS PROXY        |
                        | *.tunnel.dev - localhost:8080|
                        +-------------------------------+
                                        |
                                        v
                        +-------------------------------+
                        | LOCAL MULTI-TENANT ROUTER     |
                        | Liest Host-Header aus        |
                        | Ordnet Tenant A vs Tenant B |
                        +-------------------------------+

Multi-Tenant Webhook Routing Setup

Verwenden Sie einen Wildcard-Reverse-Proxy (wie frp oder caddy), um *.tunnel.yourdomain.dev auf Ihren lokalen Application-Router zu zeigen.

1. Caddy Reverse Proxy Konfiguration (Lokaler Ingress Router)

# Caddyfile - Multi-Tenant Wildcard Local Proxy
*.tunnel.dev.localhost {
    tls internal
    
    @tenant_a header_regexp host Host ^([a-zA-Z0-9-]+)\.tunnel\.dev\.localhost$
    
    handle {
        reverse_proxy localhost:3000 {
            header_up Host {http.request.host}
            header_up X-Forwarded-Host {http.request.host}
        }
    }
}

4. Fortgeschrittenes Multi-Tenant Webhook Forwarding Script

Anstelle einzelner stripe listen-Befehle pro Tenant verwenden Sie dieses Node.js-Multi-Tenant-CLI-Proxy-Skript. Es hört Stripe-Events ab und leitet sie dynamisch an die entsprechende lokale Subdomain basierend auf der account-ID weiter.

// scripts/stripe-multitenant-proxy.ts
import Stripe from 'stripe';
import axios from 'axios';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
  apiVersion: '2026-01-28',
});

// Mapping von Stripe Connected Account IDs zu lokalen Subdomains
const TENANT_MAPPING: Record<string, string> = {
  'acct_1N01AAA000000000': 'acme',
  'acct_1N02BBB000000000': 'globex',
};

async function handleWebhookEvent(event: Stripe.Event) {
  const connectedAccountId = event.account;
  const tenantSlug = connectedAccountId ? TENANT_MAPPING[connectedAccountId] : 'app';

  if (!tenantSlug) {
    console.warn(`[WARN] Nicht zugeordnete Konto-ID: ${connectedAccountId}`);
    return;
  }

  const targetUrl = `http://${tenantSlug}.tunnel.dev.localhost:3000/api/webhooks/stripe`;

  try {
    console.log(`[FORWARD] Event ${event.type} - ${targetUrl}`);
    await axios.post(targetUrl, event, {
      headers: {
        'Stripe-Signature': 'simulierte_local_sig',
        'Content-Type': 'application/json',
        'Host': `${tenantSlug}.tunnel.dev.localhost`,
      },
    });
  } catch (err: any) {
    console.error(`[ERROR] Webhook-Weiterleitung fehlgeschlagen: ${err.message}`);
  }
}

4. Lokale Supabase- und Postgres-Instanzen für Cloud-Vercel/Netlify Preview Deployments freigeben

Feature-Branch-Workflows starten automatisch ephemeral Frontend-Previews auf Plattformen wie Vercel oder Netlify. Das Bereitstellen isolierter Backend-Datenbanken für jeden PR-Preview ist jedoch schwierig.

Mit Layer-4-TCP-Reverse-Tunneling (wie ngrok tcp, bore oder frp) können Sie Ihre lokale PostgreSQL- oder Docker-basierte Supabase-Instanz sicher direkt für Cloud-Previews freigeben.

+-----------------------------------------------------------------------------+
|                        VERCEL / NETLIFY PREVIEW PR #42                      |
|                     https://app-git-feature-pr42.vercel.app                 |
|                                                                             |
|   DATABASE_URL = postgresql://postgres:pass@tcp.tunnel.dev:19432/postgres   |
+-----------------------------------------------------------------------------+
                                       |
                                       | Verschlüsseltes TCP (Port 19432)
                                       v
+-----------------------------------------------------------------------------+
|                            TCP REVERSE PROXY                                |
|  - Pass-Through TLS / Reine L4 TCP Pipeline                                |
+-----------------------------------------------------------------------------+
                                       |
                                       | Sicherer Reverse-Tunnel
                                       v
+-----------------------------------------------------------------------------+
|                        Lokale Entwickler-Arbeitsstation                     |
|                                                                             |
|  +-----------------------------------------------------------------------+  |
|  | Lokale Postgres-Firewall / PgBouncer-Proxy                               |  |
|  | - Lauscht auf 127.0.0.1:5432                                              |  |
|  | - Beschränkt SSL / Validiert Session-Limits                                |  |
|  +-----------------------------------------------------------------------+  |
|                                      |                                      |
|                                      v                                      |
|  +-----------------------------------------------------------------------+  |
|  | Dockerisierte Supabase-Instanz                                            |  |
|  | - PostgreSQL-Engine (Port 5432)                                              |  |
|  | - PostgREST API (Port 54321)                                                  |  |
|  | - GoTrue Auth-System (Port 9999)                                                 |  |
|  +-----------------------------------------------------------------------+  |
+-----------------------------------------------------------------------------+

Protokollvergleich: Layer 4 (TCP) vs Layer 7 (HTTP)

  • HTTP-Proxies (Layer 7): Nicht geeignet für Datenbank-Engines. Sie erwarten reines HTTP/WebSockets, brechen Wire-Protokolle wie Postgres StartupMessage und droppen Nicht-HTTP-Verbindungen.
  • TCP-Tunnel (Layer 4): Weiterleitung roher TCP-Pakete auf Transportschicht, wodurch Wire-Protokolle intakt bleiben.

Lokale Supabase-Stack via FRP (Fast Reverse Proxy) freigeben

Um Ihren lokalen Supabase-Stack zu tunneln, konfigurieren Sie frp, um lokale PostgreSQL (Port 5432) und PostgREST (Port 54321) über L4 TCP freizugeben.

Server-Konfiguration (frps.ini auf Remote-Gateway)

[common]
bind_port = 7000
vhost_extra_db_port = 19432

Client-Konfiguration (frpc.ini auf Entwickler-Arbeitsstation)

[common]
server_addr = gateway.yourdomain.dev
server_port = 7000

[supabase-postgres-tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 54322
remote_port = 19432

[supabase-postgrest-http]
type = http
local_ip = 127.0.0.1
local_port = 54321
custom_domains = api-pr42.tunnel.yourdomain.dev

Automatisierung mit GitHub Actions & Vercel API

Automatisieren Sie Ihre Pull-Request-Workflows, indem Sie Umgebungsvariablen auf ephemeral Preview-Deployments dynamisch setzen, mittels einer GitHub Action.

# .github/workflows/preview-environment.yml
name: Preview Environment Database Injector

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  attach-local-db:
    runs-on: ubuntu-latest
    steps:
      - name: Dynamische DB-Tunnel-URL in Vercel Preview injizieren
        env:
          VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
          VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
        run: |
          PR_NUM=${{ github.event.number }}
          # Dynamische Datenbank-URL, die auf den TCP-Tunnel-Port des Entwicklers zeigt
          TUNNEL_DB_URL="postgresql://postgres:postgres@gateway.yourdomain.dev:19432/postgres?sslmode=require"

          # Zuweisung der Datenbank-Verbindung an die Vercel-Preview-Umgebung
          curl -X POST "https://api.vercel.com/v10/projects/${VERCEL_PROJECT_ID}/env" \
            -H "Authorization: Bearer ${VERCEL_TOKEN}" \
            -H "Content-Type: application/json" \
            -d '{
              "key": "DATABASE_URL",
              "value": "'"${TUNNEL_DB_URL}"'",
              "type": "encrypted",
              "target": ["preview"],
              "gitBranch": "${{ github.head_ref }}"
            }'

Architektursummen: Reverse Proxies & Integrationsmuster

Muster Protokollschicht Beste Verwendung Wichtige Randfälle & Hinweise
HMR Proxying Layer 7 (HTTP/WSS) Vite 6 / Next.js 15+ Hot Reload über entfernte Tunnel Erfordert allowedOrigins Whitelist in Next.js und explizites Überschreiben von clientPort in Vite.
OTLP Trace Routing Layer 7 (gRPC / HTTP/2) Isolierung von Microservice-Trace-Spans lokal via OpenTelemetry Erfordert Header-Propagation Middleware (x-developer-id) über Service-Grenzen hinweg.
Dynamische Subdomains Layer 7 (HTTP/SNI) Multi-Tenant SaaS Webhook & Checkout-Route-Simulation Erfordert Wildcard-SSL-Zertifikate (*.domain.dev) oder lokale CA-Installation.
L4 Datenbank-Reverse-Tunnel Layer 4 (Reines TCP) Verbindung von Vercel/Netlify Cloud-Previews zu lokalen Datenbanken Hohe Verbindungsanzahl kann lokale Datenbank-Pools erschöpfen; nutzen Sie PgBouncer lokal.

Continue from this article into the most relevant product guides and workflows.

Related Topics

#vite 6 hmr#nextjs server actions#websocket proxy#hmr over proxy#hot module replacement#vite tunnel#nextjs 15 tunneling#localhost tunnel#reverse proxy hmr#websocket drops proxy#nextjs server actions debug#local developer environment#vite dev server proxy#hmr websocket reconnect#server action proxy#tunnel localhost#local dev tunneling#remote hmr debugging#web sockets over reverse proxy#sub millisecond hmr#vite HMR configuration#nextjs server actions deployment#developer workflow optimization#modern frontend frameworks#local dev environment tools#web development proxies#tunneling tools for developers#nextjs preview local database#remote webhook debugging#local dev setup#web development workflow#fullstack local debugging#software development tools#devops local environment#local proxy configuration#developer networking tools#frontend developer environment#backend developer environment#fullstack developer tools#real time hot reload#continuous development workflow#local dev server port forwarding#local port tunnel#secure localhost exposure#web development productivity#server action execution#websocket connection handling#developer tooling 2026#remote development server#web dev tunneling solutions

Keep building with InstaTunnel

Read the docs for implementation details or compare plans before you ship.

Share this article

More InstaTunnel Insights

Discover more tutorials, tips, and updates to help you build better with localhost tunneling.

Browse All Articles