diff --git a/create_pod_finance.sh b/create_pod_finance.sh index 096669e..2ae15c6 100755 --- a/create_pod_finance.sh +++ b/create_pod_finance.sh @@ -211,6 +211,29 @@ podman exec "$DB_CTR_NAME" psql -U finance -d finance -c \ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO finance_read;" echo "Role 'finance_read' is ready." +# --- Reverse-Proxy-Betrieb (optional) ---------------------------------------- +# FB_GRAFANA_PUBLIC_URL wird nur gesetzt, wenn das Tool hinter einem Reverse +# Proxy unter einem Sub-Pfad laufen soll (z.B. +# 'https://fb.example.de/grafana/'). Ist sie leer (Default, +# Direktbetrieb auf 127.0.0.1), bleibt alles wie bisher: Grafana serviert an +# der Wurzel, Health-Check und Passwort-Sync sprechen /api/... ohne Praefix. +# Muss VOR dem API-Container berechnet werden, da FB_GRAFANA_URL (unten) den +# Praefix schon dort braucht - nicht erst vor dem Grafana-Container. +GF_SUBPATH='' +GRAFANA_SUBPATH_ARGS=() +if [ -n "${FB_GRAFANA_PUBLIC_URL:-}" ]; then + # Pfadanteil der oeffentlichen URL extrahieren, Slash(es) am Ende entfernen: + # 'https://host/grafana/' -> '/grafana'. Dieser Praefix wird sowohl fuer den + # internen Health-Check als auch fuer die interne Grafana-API-URL + # (FB_GRAFANA_URL, Passwort-Sync in der GUI) gebraucht, weil + # serve_from_sub_path ALLE Grafana-Routen unter den Sub-Pfad haengt. + GF_SUBPATH=$(printf '%s' "$FB_GRAFANA_PUBLIC_URL" | sed -E 's#^[a-z]+://[^/]+##; s#/+$##') + GRAFANA_SUBPATH_ARGS=( + -e "GF_SERVER_ROOT_URL=$FB_GRAFANA_PUBLIC_URL" + -e "GF_SERVER_SERVE_FROM_SUB_PATH=true" + ) +fi + # API container (runs alembic upgrade head on start via entrypoint.sh) # The extra "-v $ENV_FILE:/data/.env:Z" below (Ausbaustufe 4 Task 2, Admin # password change) is a SINGLE-FILE bind mount. Unlike a directory mount, @@ -226,6 +249,9 @@ podman run -d --name "$API_CTR_NAME" --pod "$POD_NAME" \ -e FB_GUI_PASSWORD_HASH \ -e FB_INBOX_DIR=/data/inbox \ -e FB_UPLOADS_DIR=/data/uploads \ + -e FB_GRAFANA_PUBLIC_URL="${FB_GRAFANA_PUBLIC_URL:-}" \ + -e FB_SESSION_COOKIE_SECURE="${FB_SESSION_COOKIE_SECURE:-}" \ + -e FB_GRAFANA_URL="http://localhost:3000${GF_SUBPATH}" \ -v "$DATA_DIR:/data:Z" \ -v "$ENV_FILE:/data/.env:Z" \ "$API_IMAGE" @@ -240,6 +266,7 @@ podman run -d --name "$GRAFANA_CTR_NAME" --pod "$POD_NAME" \ -e GF_SECURITY_ADMIN_PASSWORD="$FB_PASSWORD" \ -e GF_SECURITY_ALLOW_EMBEDDING=true \ -e GF_SECURITY_COOKIE_SAMESITE=lax \ + "${GRAFANA_SUBPATH_ARGS[@]}" \ -e GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/finanzen.json \ -e FINANCE_READ_PASSWORD \ -v "$GRAFANA_PROVISIONING_DIR:/etc/grafana/provisioning:Z,ro" \ @@ -326,7 +353,7 @@ echo "To view logs: journalctl --user -u pod-${POD_NAME}.service -f" # Wait for API and Grafana readiness CHECK_URL_API="http://$HOST_LOCAL_IP:$API_HOST_PORT/login" -CHECK_URL_GRAFANA="http://$HOST_LOCAL_IP:$GRAFANA_HOST_PORT/api/health" +CHECK_URL_GRAFANA="http://$HOST_LOCAL_IP:$GRAFANA_HOST_PORT${GF_SUBPATH}/api/health" for attempt in $(seq 1 30); do API_CODE=$(curl -s -o /dev/null -w '%{http_code}' "$CHECK_URL_API" || true) GRAFANA_CODE=$(curl -s -o /dev/null -w '%{http_code}' "$CHECK_URL_GRAFANA" || true)