- Multi-stage Dockerfile: builds frontend, packages with Python backend - admin.py serves frontend/dist as StaticFiles in production - docker-entrypoint.sh runs proxy + admin-api, exits cleanly if either dies - .dockerignore excludes .env, venv, tests, node_modules - Split requirements.txt (prod) / requirements-dev.txt (dev+test) - aiofiles added for StaticFiles support - start.sh: port checks before startup, venv auto-activation, trap cleanup - vite.config.js: clearScreen disabled - README rewritten to reflect current architecture Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
82 lines
1.7 KiB
Bash
Executable File
82 lines
1.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# .env laden
|
|
if [ -f .env ]; then
|
|
set -a
|
|
source .env
|
|
set +a
|
|
fi
|
|
|
|
# Virtuelle Umgebung aktivieren falls vorhanden
|
|
if [ -f .venv/bin/activate ]; then
|
|
source .venv/bin/activate
|
|
elif [ -f venv/bin/activate ]; then
|
|
source venv/bin/activate
|
|
fi
|
|
|
|
if [ -z "$ADMIN_PASSWORD" ]; then
|
|
echo "Fehler: ADMIN_PASSWORD ist nicht gesetzt. Bitte .env befüllen."
|
|
exit 1
|
|
fi
|
|
|
|
PROXY_HOST=${PROXY_HOST:-0.0.0.0}
|
|
PROXY_PORT=${PROXY_PORT:-8000}
|
|
ADMIN_PORT=${ADMIN_PORT:-8001}
|
|
FRONTEND_PORT=5173
|
|
|
|
PIDS=()
|
|
|
|
cleanup() {
|
|
echo "Beende alle Prozesse..."
|
|
for pid in "${PIDS[@]}"; do
|
|
kill "$pid" 2>/dev/null
|
|
done
|
|
wait 2>/dev/null
|
|
}
|
|
|
|
port_in_use() {
|
|
lsof -iTCP:"$1" -sTCP:LISTEN -t &>/dev/null
|
|
}
|
|
|
|
# Ports prüfen bevor irgendetwas gestartet wird
|
|
for port in "$PROXY_PORT" "$ADMIN_PORT" "$FRONTEND_PORT"; do
|
|
if port_in_use "$port"; then
|
|
echo "Fehler: Port $port ist bereits belegt."
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
trap cleanup EXIT INT TERM
|
|
|
|
# Datenbank initialisieren
|
|
echo "Initialisiere Datenbank..."
|
|
cd backend
|
|
python3 init_db.py
|
|
cd ..
|
|
|
|
# Backend starten
|
|
echo "Starte Backend (Proxy) auf ${PROXY_HOST}:${PROXY_PORT}..."
|
|
cd backend
|
|
python3 -m uvicorn main:app --reload --host "$PROXY_HOST" --port "$PROXY_PORT" &
|
|
PIDS+=($!)
|
|
|
|
# Admin-API immer nur lokal erreichbar (Host nicht konfigurierbar)
|
|
echo "Starte Admin-API auf 127.0.0.1:${ADMIN_PORT}..."
|
|
python3 -m uvicorn admin:app --reload --host 127.0.0.1 --port "$ADMIN_PORT" &
|
|
PIDS+=($!)
|
|
cd ..
|
|
|
|
# Frontend starten
|
|
echo "Starte Frontend..."
|
|
cd frontend
|
|
npm install --silent
|
|
npm run dev &
|
|
PIDS+=($!)
|
|
cd ..
|
|
|
|
echo "Backend läuft (Port $PROXY_PORT)"
|
|
echo "Admin-API läuft (Port $ADMIN_PORT, nur lokal)"
|
|
echo "Admin-Oberfläche: http://localhost:$FRONTEND_PORT"
|
|
|
|
wait
|