Docker: interner nginx statt socat (Host-Header -> localhost)
Ursache des 404 bei Zugriff über IP/Proxy: .NET-HttpListener bedient den Prefix http://localhost:8077/ nur bei Host: localhost. socat (L4) reicht den originalen Host-Header durch -> 404. Jetzt sitzt ein winziger nginx im Container davor, der den Host-Header auf localhost umschreibt (Upstream [::1]:8077, IPv4 als Fallback). App-Code bleibt unverändert. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+12
-18
@@ -1,36 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
# Startet die App unveraendert (bindet auf localhost:APP_PORT) und leitet externe
|
||||
# Verbindungen per socat-Bridge dorthin - so bleibt der App-Code unangetastet.
|
||||
# Startet die App unveraendert (bindet auf localhost:APP_PORT) und stellt einen
|
||||
# internen nginx davor, der den Host-Header auf "localhost" umschreibt.
|
||||
#
|
||||
# HINWEIS: .NET-HttpListener bindet den Prefix "localhost" je nach System auf IPv4
|
||||
# ODER IPv6. Deshalb ermitteln wir zur Laufzeit, welche Loopback-Familie antwortet,
|
||||
# und richten socat darauf aus (sonst "Connection refused").
|
||||
# WARUM nginx statt socat: .NET-HttpListener bedient den Prefix
|
||||
# http://localhost:APP_PORT/ NUR bei Host: localhost. socat (reiner TCP-Proxy)
|
||||
# reicht den originalen Host-Header durch -> von aussen 404. nginx schreibt den
|
||||
# Host-Header um -> jeder Zugriffsweg funktioniert, ohne den App-Code zu aendern.
|
||||
set -e
|
||||
|
||||
: "${APP_PORT:=8077}"
|
||||
: "${BRIDGE_PORT:=8080}"
|
||||
|
||||
# App im Hintergrund starten. -NoBrowser: im Container kein Desktop/open.
|
||||
pwsh -NoProfile -File /app/Start.ps1 -NoBrowser -Port "${APP_PORT}" &
|
||||
APP_PID=$!
|
||||
|
||||
# Warten bis der Listener antwortet und dabei IPv4 vs. IPv6 erkennen.
|
||||
# Default = IPv6 (haeufigster Fall im Container); IPv4 wird bevorzugt, wenn erreichbar.
|
||||
SOCAT_TARGET="TCP6:[::1]:${APP_PORT}"
|
||||
# Best-effort warten, bis der App-Listener antwortet (IPv6 oder IPv4).
|
||||
# nginx wuerde sonst kurz 502 liefern, bis die App oben ist.
|
||||
for i in $(seq 1 30); do
|
||||
if (exec 3<>"/dev/tcp/127.0.0.1/${APP_PORT}") 2>/dev/null; then
|
||||
exec 3>&-; SOCAT_TARGET="TCP4:127.0.0.1:${APP_PORT}"; break
|
||||
fi
|
||||
if (exec 3<>"/dev/tcp/::1/${APP_PORT}") 2>/dev/null; then
|
||||
exec 3>&-; SOCAT_TARGET="TCP6:[::1]:${APP_PORT}"; break
|
||||
fi
|
||||
# App unerwartet beendet? Dann mit deren Exit-Code aussteigen.
|
||||
if (exec 3<>"/dev/tcp/::1/${APP_PORT}") 2>/dev/null; then exec 3>&-; break; fi
|
||||
if (exec 3<>"/dev/tcp/127.0.0.1/${APP_PORT}") 2>/dev/null; then exec 3>&-; break; fi
|
||||
kill -0 "$APP_PID" 2>/dev/null || { echo "[entrypoint] App-Prozess beendet - Abbruch."; wait "$APP_PID"; exit $?; }
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "[entrypoint] Bridge: 0.0.0.0:${BRIDGE_PORT} -> ${SOCAT_TARGET}"
|
||||
socat "TCP-LISTEN:${BRIDGE_PORT},fork,reuseaddr" "${SOCAT_TARGET}" &
|
||||
echo "[entrypoint] Starte nginx (Host-Rewrite -> localhost) auf :8080"
|
||||
nginx -g 'daemon off;' &
|
||||
|
||||
# Am Leben des App-Prozesses haengen (Container endet, wenn die App endet).
|
||||
wait "$APP_PID"
|
||||
|
||||
Reference in New Issue
Block a user