diff --git a/Website/launch.sh b/Website/launch.sh index f29c69c..39b8f9d 100755 --- a/Website/launch.sh +++ b/Website/launch.sh @@ -180,6 +180,27 @@ build_website_image() { TARGET_SYSTEM_DIR="/opt/Inventarsystem" TARGET_SCRIPT="$TARGET_SYSTEM_DIR/manage-tenant.sh" +get_free_port() { + local requested_port="${1:-10002}" + local used_ports + + # Belegte Ports aus manage-tenant.sh list auslesen + used_ports=$( (cd "$TARGET_SYSTEM_DIR" && "$TARGET_SCRIPT" list 2>/dev/null) | grep -oE '[0-9]{4,5}' || true ) + + local check_port="$requested_port" + if ! [[ "$check_port" =~ ^[0-9]+$ ]]; then + check_port=10002 + fi + + # Falls der Port schon vergeben ist, schrittweise erhöhen bis ein freier Port gefunden wird + while echo "$used_ports" | grep -q -w "$check_port"; do + echo "[INFO] Port $check_port ist belegt. Prüfe $(($check_port + 1))..." >&2 + check_port=$((check_port + 1)) + done + + echo "$check_port" +} + watcher_loop() { local trigger_dir="$1" echo "[INFO] Tenant Watcher gestartet. Lausche in $trigger_dir..." @@ -199,7 +220,6 @@ watcher_loop() { PASS=$(jq -r '.password // empty' "$file" 2>/dev/null || true) MODULES=$(jq -r '.module_config // empty' "$file" 2>/dev/null || true) else - # Fallback, falls jq nicht installiert ist ACTION=$(grep -o '"action": *"[^"]*"' "$file" | cut -d'"' -f4 || echo "add") [ -z "$ACTION" ] && ACTION="add" SLUG=$(grep -o '"slug": *"[^"]*"' "$file" | cut -d'"' -f4 || true) @@ -216,16 +236,18 @@ watcher_loop() { case "$ACTION" in "add") - if [ -n "$PORT" ] && [ -n "$PASS" ]; then + if [ -n "$PASS" ]; then + # Freien Port über `manage-tenant.sh list` ermitteln + ACTUAL_PORT=$(get_free_port "$PORT") + echo "[INFO] Verwende Port $ACTUAL_PORT für Tenant $SLUG" + # 1. Tenant erstellen - if (cd "$TARGET_SYSTEM_DIR" && "$TARGET_SCRIPT" add "$SLUG" "$PORT" "$PASS"); then - echo "[SUCCESS] Tenant bereitgestellt: $SLUG" + if (cd "$TARGET_SYSTEM_DIR" && "$TARGET_SCRIPT" add "$SLUG" "$ACTUAL_PORT" "$PASS"); then + echo "[SUCCESS] Tenant bereitgestellt: $SLUG (Port: $ACTUAL_PORT)" # 2. Wenn Module übergeben wurden, diese im Anschluss konfigurieren if [ -n "$MODULES" ]; then echo "[INFO] Konfiguriere Module für $SLUG: $MODULES" - # Hinweis: $MODULES wird hier bewusst ohne Anführungszeichen übergeben, - # damit "inventory=on library=on" in separate Parameter aufgeteilt wird. # shellcheck disable=SC2086 if (cd "$TARGET_SYSTEM_DIR" && "$TARGET_SCRIPT" module "$SLUG" $MODULES); then echo "[SUCCESS] Module für $SLUG erfolgreich konfiguriert." @@ -237,7 +259,7 @@ watcher_loop() { echo "[ERROR] Fehler beim Bereitstellen von: $SLUG" >&2 fi else - echo "[ERROR] Fehlende Port/Passwort-Daten für add in $file" >&2 + echo "[ERROR] Fehlendes Passwort für add in $file" >&2 fi ;; "remove") @@ -259,7 +281,7 @@ watcher_loop() { ;; esac - # Nach Verarbeitung Datei restlos löschen + # Nach Verarbeitung Trigger-Datei löschen rm -f "$file" done sleep 2 @@ -271,13 +293,11 @@ start_tenant_watcher() { local pid_file="$SCRIPT_DIR/.watcher.pid" local log_file="$SCRIPT_DIR/watcher.log" - # Erstelle Trigger-Verzeichnis, falls es nicht existiert if [ ! -d "$trigger_dir" ]; then mkdir -p "$trigger_dir" chmod 777 "$trigger_dir" fi - # Beende alten Watcher, falls dieser noch läuft if [ -f "$pid_file" ]; then local old_pid old_pid=$(cat "$pid_file") @@ -287,11 +307,9 @@ start_tenant_watcher() { fi fi - # Starte den Watcher im Hintergrund echo "Starte asynchronen Tenant-Watcher im Hintergrund..." watcher_loop "$trigger_dir" >> "$log_file" 2>&1 & - # Speichere die PID echo $! > "$pid_file" echo "Watcher läuft! Logs findest du in: $log_file" } @@ -311,7 +329,6 @@ echo " DEV_HOSTS_REFRESH_INTERVAL=$DEV_HOSTS_REFRESH_INTERVAL" ensure_mongo_secrets -# Ensure required runtime files exist before building if [ ! -f "$SCRIPT_DIR/gunicorn.conf.py" ]; then echo "[FEHLER] gunicorn.conf.py fehlt in $SCRIPT_DIR. Bitte prüfen." >&2 exit 2 @@ -327,7 +344,6 @@ wait_for_mongo_ready ensure_mongo_app_user compose up -d --no-deps website -# Wait for website to become healthy check_url="http://localhost:4999" timeout_seconds=60 interval=2 @@ -355,5 +371,4 @@ fi echo "Website stack is running on http://localhost:4999" echo "Provisioning creates self-signed certs per subdomain when needed." -# STARTET DEN WATCHER DIREKT HIER IM SCRIPT start_tenant_watcher \ No newline at end of file