From e8f0bd4f55cae43a123587cb166a179e594c8ce0 Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Mon, 14 Sep 2026 22:48:13 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Ingress=20auf=20Traefik=20umstellen=20?= =?UTF-8?q?=E2=80=94=20die=20nginx-Annotationen=20waren=20wirkungslos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Zielcluster nutzt Traefik, nicht ingress-nginx. Saemtliche Annotationen der Form nginx.ingress.kubernetes.io/* ignoriert Traefik ersatzlos und still: sie erzeugen keinen Fehler, wirken aber auch nicht. Das betraf das Upload-Limit (proxy-body-size) ebenso wie die Zeitlimits, und ingressClassName zeigte auf "nginx". Damit aendert sich auch die Diagnose des fehlgeschlagenen Video-Uploads. Belegt aus Traefiks Quelltext (pkg/config/static/static_config.go, SetDefaults) und der Referenzdokumentation: - readTimeout des EntryPoints: Default 60s, beschrieben als "maximum duration for reading the entire request, including the body". Er umfasst also die gesamte Uebertragung des Uploads. Bei 20-100 MB ueber eine normale Upload-Leitung ist das schnell ueberschritten — 80 MB bei 10 Mbit/s sind rund 64 Sekunden. Laeuft er ab, kappt Traefik die Verbindung und antwortet mit einer eigenen HTML-Fehlerseite. Das ist die wahrscheinlichste Quelle des "Unexpected token '<'" im Browser. - responseHeaderTimeout: von SetDefaults NICHT gesetzt, bleibt 0, und "If zero, no timeout exists". Die Dauer des ffmpeg-Transcodings ist bei Traefik also NICHT begrenzt — anders als zuvor angenommen. - Body-Groesse: Traefik erzwingt keine Obergrenze (begrenzt ist nur maxHeaderBytes mit 1 MB fuer die Header). Ein Gegenstueck zu nginx' proxy-body-size wird nicht gebraucht. readTimeout gehoert zur statischen EntryPoint-Konfiguration und laesst sich nicht per Ingress-Annotation setzen. Das Manifest dokumentiert deshalb ausfuehrlich, welche Einstellung in der Traefik-Installation noetig ist (Helm: ports.websecure.transport.respondingTimeouts.readTimeout: 600s). Weiter angepasst: ingressClassName auf "traefik", HTTPS-Umleitung ueber eine Traefik-Middleware statt der nginx-Annotation, und der Hinweis zu X-Forwarded-For nennt jetzt Traefiks forwardedHeaders.trustedIPs — davon haengt ab, ob lib/rate-limit.ts dem Header trauen darf. Die Kommentare in lib/uploads.ts und lib/csrf.ts verwiesen auf die entfernten nginx-Einstellungen und sind entsprechend berichtigt. --- k8s/06-ingress.yaml | 124 +++++++++++++++++++++++++++++--------------- src/lib/csrf.ts | 9 ++-- src/lib/uploads.ts | 12 +++-- 3 files changed, 98 insertions(+), 47 deletions(-) diff --git a/k8s/06-ingress.yaml b/k8s/06-ingress.yaml index 402970d..ae9f962 100644 --- a/k8s/06-ingress.yaml +++ b/k8s/06-ingress.yaml @@ -1,54 +1,83 @@ -# Setzt einen bereits im Cluster laufenden Ingress-Controller voraus (z.B. -# ingress-nginx) sowie optional cert-manager fuer automatisches TLS. Host -# unten anpassen (muss zu NEXT_PUBLIC_SITE_URL in 01-configmap.yaml passen). +# Ingress fuer Traefik (der im Zielcluster eingesetzte Ingress-Controller), +# optional zusammen mit cert-manager fuer automatisches TLS. Host unten +# anpassen (muss zu NEXT_PUBLIC_SITE_URL in 01-configmap.yaml passen). # -# X-Forwarded-For: ingress-nginx setzt den Header standardmaessig korrekt -# (verwirft einen vom Client mitgeschickten Wert), lib/rate-limit.ts vertraut -# genau darauf — bei einem ANDEREN Ingress-Controller/zusaetzlichen Proxy -# davor unbedingt pruefen, dass er sich genauso verhaelt, siehe Kommentar in -# lib/rate-limit.ts. +# ============================================================================ +# WICHTIG fuer die Admin-Uploads: eine Einstellung fehlt hier zwangslaeufig +# ============================================================================ +# Der Video-Upload (bis 100 MB, MAX_UPLOAD_VIDEO_BYTES in lib/uploads.ts) +# scheitert mit Traefiks Standardeinstellung, sobald die Uebertragung laenger +# als 60 Sekunden dauert. Das ist bei 20-100 MB ueber eine normale +# Upload-Leitung schnell erreicht: 80 MB bei 10 Mbit/s sind rund 64 Sekunden. +# +# Verantwortlich ist "readTimeout" des EntryPoints. Traefik beschreibt ihn als +# "maximum duration for reading the entire request, including the body" — er +# umfasst also die gesamte Uebertragung des Uploads, nicht nur die Header. +# Der Standardwert ist 60s. Laeuft er ab, kappt Traefik die Verbindung und +# antwortet mit einer eigenen HTML-Fehlerseite; im Browser erschien davon nur +# "Unexpected token '<', "