Files
Wabenhain/k8s/06-ingress.yaml
T
Nick SzaunigandClaude Sonnet 5 d0c1d0840c
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m29s
fix: Admin-Uploads auf dem Live-Server (Berechtigung, Persistenz, Body-Size-Limit)
Uploads (Bilder + Hero-Video) schlugen live fehl, lokal aber nicht: der
Container laeuft als non-root "nextjs", /app/uploads existierte nirgends
vorbereitet und gehoert root -> mkdir() scheiterte mit EACCES, unbehandelt
als HTML-500 statt JSON, der Client zeigte nur einen haengenden
"wird hochgeladen"-Zustand ohne Fehlermeldung.

- Dockerfile legt /app/uploads jetzt vor dem User-Wechsel an und
  uebereignet es dem nextjs-Nutzer
- docker-compose.yml persistiert Uploads jetzt ueber ein eigenes Volume
  (vorher gingen sie bei jedem Redeploy verloren) und setzt UPLOAD_DIR
  explizit
- Beide Upload-Routen fangen Dateisystemfehler jetzt ab und liefern eine
  echte JSON-Fehlermeldung statt eine unbehandelte Exception
- k8s-Manifeste vorsorglich mitgefixt (fsGroup fuer den Volume-Mount,
  Ingress-Body-Size-Limit) fuer den Fall eines spaeteren
  Kubernetes-Wechsels

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-09-11 15:48:14 +02:00

47 lines
1.9 KiB
YAML

# 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).
#
# 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.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wabenhain
namespace: wabenhain
annotations:
# Nur relevant, falls cert-manager installiert ist — sonst diese beiden
# Zeilen und den "tls:"-Block unten entfernen und Host per HTTP betreiben
# oder TLS auf andere Weise terminieren.
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/ssl-redirect: "true"
# ingress-nginx laesst ohne diese Annotation standardmaessig nur 1 MB pro
# Request durch — weit unter dem Bild- (8 MB, lib/uploads.ts
# MAX_UPLOAD_BYTES) und erst recht dem Video-Limit (40 MB, lib/uploads.ts
# MAX_UPLOAD_VIDEO_BYTES) der Admin-Uploads. Ohne diese Zeile bricht
# nginx jeden Upload jenseits von 1 MB vor der App ab (Verbindungsabbruch
# ohne verwertbare Fehlermeldung im Browser) — 45m deckt das groessere der
# beiden Limits (40 MB) plus etwas Spielraum fuer den multipart/form-data-
# Overhead ab.
nginx.ingress.kubernetes.io/proxy-body-size: "45m"
spec:
ingressClassName: nginx
tls:
- hosts:
- shop.example.com
secretName: wabenhain-tls
rules:
- host: shop.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wabenhain-app
port:
number: 80