00dffc59eb
- web/main.py: Session-basierte REST-API um den GA-Kern (POST /sitzung, .../tische, .../tische-datei, .../personen, .../berechnen, GET .../ergebnis[.svg]); Sessions in-memory mit 24h-TTL - web/static/index.html: einfache Browser-Testoberflaeche (Tisch-Tabelle mit Presets, tische.ini-Upload, CSV-Gaesteliste, Kennzahlen, SVG) - bin/run_web.bat/.sh + run_web_helper.ps1: start/stop/status inkl. Aufraeumen verwaister uvicorn-Reload-Kindprozesse (Zombie-Sockets) - work/hochzeit: 120 Hochzeitsgaeste, Ehrentafel, Kindertisch/Teenager- Tisch fest gesetzt, Kinderalter normalverteilt, ~85% Auslastung - work/innenhoefe: 300 Gaeste in zwei trapezfoermigen Innenhoefen mit 4er-Tischen, 12 VIPs vor der Buehne, Umfeld.svg mit Tanzflaeche/Band - Roadmap: Konzeptentscheidungen 1-11 (Zielgruppe, Einmalzahlung, MoR, Hetzner, Zwei-Marken-Strategie Sitz&Platz/SeatWonder), Namensrecherche im Anhang, M1-Fortschritt und GA-Lasttest-Datenpunkt dokumentiert Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
96 lines
3.2 KiB
Bash
96 lines
3.2 KiB
Bash
#!/bin/bash
|
|
# ================================================================
|
|
# Verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn, M1)
|
|
#
|
|
# run_web.sh start - startet den Server im Hintergrund
|
|
# run_web.sh stop - beendet den Server (inkl. Reload-Kindprozesse)
|
|
# run_web.sh status - zeigt ob und unter welcher PID er laeuft
|
|
# run_web.sh - startet im Vordergrund (Strg+C zum Beenden)
|
|
#
|
|
# http://localhost:8000 Testoberflaeche
|
|
# http://localhost:8000/docs interaktive API-Doku (Swagger)
|
|
# ================================================================
|
|
|
|
source "$(dirname "${BASH_SOURCE[0]}")/setenv.sh" > /dev/null
|
|
|
|
WEB_PORT=8000
|
|
PIDDATEI="$PLATZ/log/run_web.pid"
|
|
LOGDATEI="$PLATZ/log/run_web.log"
|
|
|
|
venv_pruefen() {
|
|
if [ -f "$PLATZ/.venv/bin/activate" ]; then
|
|
source "$PLATZ/.venv/bin/activate"
|
|
else
|
|
echo "FEHLER: kein .venv gefunden - bitte zuerst bin/install_py.sh ausfuehren"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
lauft_pid() {
|
|
# gibt die PID des Servers aus, wenn er laeuft (Rueckgabe 0), sonst 1
|
|
if [ -f "$PIDDATEI" ]; then
|
|
local pid
|
|
pid=$(cat "$PIDDATEI")
|
|
if kill -0 "$pid" 2> /dev/null; then
|
|
echo "$pid"
|
|
return 0
|
|
fi
|
|
rm -f "$PIDDATEI"
|
|
fi
|
|
# Fallback: nach dem Prozess suchen (z.B. PID-Datei verloren)
|
|
pgrep -f "uvicorn main:app.*--port $WEB_PORT" | head -1 && return 0
|
|
return 1
|
|
}
|
|
|
|
case "${1:-}" in
|
|
start)
|
|
venv_pruefen || exit 1
|
|
if pid=$(lauft_pid); then
|
|
echo "Server laeuft bereits (PID $pid) - erst 'run_web.sh stop'."
|
|
exit 1
|
|
fi
|
|
mkdir -p "$PLATZ/log"
|
|
echo "Starte Web-Testinstanz im Hintergrund ..."
|
|
nohup python -m uvicorn main:app --reload \
|
|
--app-dir "$PLATZ/web" --port "$WEB_PORT" \
|
|
> "$LOGDATEI" 2>&1 &
|
|
echo $! > "$PIDDATEI"
|
|
sleep 3
|
|
if pid=$(lauft_pid); then
|
|
echo "Server laeuft: http://localhost:$WEB_PORT (PID $pid, Log: log/run_web.log)"
|
|
else
|
|
echo "FEHLER: Server ist nicht gestartet - siehe $LOGDATEI"
|
|
exit 1
|
|
fi
|
|
;;
|
|
stop)
|
|
gestoppt=0
|
|
if pid=$(lauft_pid); then
|
|
# ganze Prozessgruppe beenden (uvicorn-Reloader + Kindprozesse)
|
|
pkill -TERM -P "$pid" 2> /dev/null && gestoppt=1
|
|
kill "$pid" 2> /dev/null && gestoppt=1
|
|
fi
|
|
# Nachzuegler, deren Elternprozess schon weg ist
|
|
pkill -f "uvicorn main:app.*--port $WEB_PORT" 2> /dev/null && gestoppt=1
|
|
rm -f "$PIDDATEI"
|
|
if [ "$gestoppt" = "1" ]; then echo "Beendet."; else echo "Es lief nichts."; fi
|
|
;;
|
|
status)
|
|
if pid=$(lauft_pid); then
|
|
echo "LAEUFT: http://localhost:$WEB_PORT (PID $pid)"
|
|
else
|
|
echo "GESTOPPT: kein Server auf Port $WEB_PORT"
|
|
fi
|
|
;;
|
|
"")
|
|
venv_pruefen || exit 1
|
|
echo "Starte Web-Testinstanz im Vordergrund (Strg+C zum Beenden) ..."
|
|
exec python -m uvicorn main:app --reload \
|
|
--app-dir "$PLATZ/web" --port "$WEB_PORT"
|
|
;;
|
|
*)
|
|
echo "Unbekannter Parameter '$1' - erlaubt: start | stop | status"
|
|
exit 1
|
|
;;
|
|
esac
|