Zum Inhalt

Live-Tail/SSE zeigt nichts hinter eigenem Proxy

Der Live-Tail unter Logs — und jede andere Stelle, die per Server-Sent-Events (SSE) live aktualisiert — bleibt leer oder aktualisiert nur alle paar Minuten in einem Schwall, statt laufend. Das Symptom tritt fast ausschließlich auf, wenn ein eigener Reverse-Proxy vor Vesana steht (siehe TLS / Reverse-Proxy) — direkt gegen den Vesana-Stack ohne zusätzlichen Proxy funktioniert SSE ohne weitere Konfiguration.

Ursache: Response-Buffering

SSE hält eine HTTP-Verbindung offen und schickt einzelne Events, sobald sie anfallen. Ein Reverse-Proxy puffert Antworten standardmäßig, bis ein Puffer voll ist oder die Verbindung endet — bei einem Stream, der stundenlang offen bleibt und nur gelegentlich ein paar Bytes schickt, heißt das: der Client sieht nichts, bis der Proxy den Puffer irgendwann doch flusht (oder gar nicht).

Fix in nginx: proxy_buffering off; für die betroffene Location.

location /api/v1/logs/stream {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Connection '';
    proxy_buffering off;
    proxy_cache off;
    chunked_transfer_encoding off;
    proxy_read_timeout 3600s;
}

Bei Traefik entspricht das der Standardeinstellung (kein Response-Buffering für normale Proxy-Requests) — meist reicht dort ein ausreichend hoher Timeout. Bei HAProxy: option http-buffer-request NICHT setzen und timeout server großzügig wählen. Bei Caddy ist SSE ohne zusätzliche Direktiven i. d. R. unproblematisch.

Zwei nginx-Schichten — beide brauchen das Flag

Läufst du im Split-Container-Modus vor-nginx (dein eigenes nginx/Caddy/Traefik terminiert TLS vor dem Vesana-Stack, siehe Admin-Zugriff & Split-Container), gibt es zwei nginx-Schichten zwischen Browser und Backend: dein eigenes nginx davor und das nginx im Vesana-Stack selbst dahinter. Beide müssen Buffering für den Stream-Pfad deaktiviert haben — reicht es nur an einer Stelle, bleibt das Problem bestehen, weil die jeweils andere Schicht weiter puffert.

Prüfe also:

  1. Dein eigenes Reverse-Proxy-Config — proxy_buffering off für /api/v1/logs/stream (und jede andere Stream-Route)
  2. Das interne nginx im Compose-Stack — sollte SSE-Routen standardmäßig bereits korrekt konfiguriert haben; bei eigenen Anpassungen an dieser Config prüfen, ob Buffering versehentlich wieder aktiviert wurde

Diagnose: Liegt es wirklich am Proxy?

# Direkt gegen den Vesana-Stack testen (am Server selbst, Proxy umgehen):
curl -N -H "Authorization: Bearer <JWT>" \
  "http://127.0.0.1:8080/api/v1/logs/stream?host=<host-id>"

Kommen hier laufend Events an, aber über den öffentlichen Domain-Namen nicht — ist die Ursache zu 100 % der Reverse-Proxy, nicht Vesana selbst. -N (--no-buffer) ist hier wichtig, sonst puffert schon curl selbst.

Verwandtes Symptom: Auto-Update-Overlay hängt

Der „Vesana wird gestartet …"-Splash beim Update (siehe UI-Probleme nach Update) pollt normale HTTP-Requests, keine SSE — von Buffering nicht betroffen. Hängt er trotzdem, ist das eine andere Ursache.

Checkliste

  • [ ] proxy_buffering off auf jeder Proxy-Schicht zwischen Browser und Vesana für die Stream-Route
  • [ ] proxy_read_timeout ausreichend hoch (Stream bleibt lange offen)
  • [ ] Direkter curl -N-Test gegen den Stack zeigt laufende Events?
  • [ ] Bei Split-Container vor-nginx: beide nginx-Schichten geprüft, nicht nur die eigene

Anschluss