#!/usr/bin/env bash # Startet einen ZWEITEN GoTrue-Container neben der Supabase CLI (Spec #1 D2/T3, F11). # # Profile # throttle (Standard) AUTH-CFG-13: GOTRUE_RATE_LIMIT_HEADER=X-Forwarded-For, Port 9998. # Fuer das Playwright-Projekt `throttle` (THROTTLE_GOTRUE_URL=http://127.0.0.1:9998). # smtp-down SMTP-Spike (Issue #37): wie die CLI, aber SMTP-Port 1 (Verbindung abgelehnt), Port 9997. # Fuer das Playwright-Projekt `spike` (SPIKE_GOTRUE_URL=http://127.0.0.1:9997). # # Aufruf # e2e/support/start-throttle-gotrue.sh start [throttle|smtp-down] # e2e/support/start-throttle-gotrue.sh stop [throttle|smtp-down] # # Der Container nutzt dasselbe Image, dieselbe DB und dasselbe Docker-Netz wie der Auth-Container # der CLI; die Umgebung wird per `docker inspect` uebernommen (Version nicht hart kodiert). Die # Rate-Limit-Buckets liegen im Speicher und sind damit von der CLI getrennt (R13). # Docker-in-Docker (CI, DOCKER_HOST=tcp://...): Der Port wird im dind veroeffentlicht, nicht im Job-Container. # Dann BIND_ADDR=0.0.0.0 und HEALTH_HOST= setzen (siehe .forgejo/workflows/ci.yml, Job e2e); # die Tests erreichen den Container ueber e2e/support/tcp-forward.mjs auf 127.0.0.1. # Bindung: lokal nur 127.0.0.1. Unter dind muss 0.0.0.0 gelten (der Job-Container erreicht den dind nur ueber # das Gateway; eine feinere Bindung ist dort nicht moeglich). Der Port ist dann im Netz des Runners sichtbar. # Nur lokal/CI benutzen: Die kopierte Umgebung enthaelt die lokalen Demo-Secrets der CLI. set -euo pipefail BIND_ADDR="${BIND_ADDR:-127.0.0.1}" HEALTH_HOST="${HEALTH_HOST:-127.0.0.1}" ACTION="${1:-start}" PROFILE="${2:-throttle}" # Auth-Container gezielt ueber die Projekt-ID (project_id in supabase/config.toml), nicht "erster Treffer" PROJECT_ID="${SUPABASE_PROJECT_ID:-shuffle}" SOURCE="${SOURCE_CONTAINER:-supabase_auth_${PROJECT_ID}}" case "$PROFILE" in throttle) NAME="${CONTAINER_NAME:-shuffle_auth_throttle}"; HOST_PORT="${HOST_PORT:-9998}" ;; smtp-down) NAME="${CONTAINER_NAME:-shuffle_auth_smtp_down}"; HOST_PORT="${HOST_PORT:-9997}" ;; *) echo "Unbekanntes Profil: $PROFILE (throttle|smtp-down)" >&2; exit 2 ;; esac if [ "$ACTION" = "stop" ]; then docker rm -f "$NAME" >/dev/null 2>&1 || true echo "Container $NAME entfernt." exit 0 fi [ "$ACTION" = "start" ] || { echo "Aktion: start|stop" >&2; exit 2; } if ! docker inspect "$SOURCE" >/dev/null 2>&1; then echo "Container $SOURCE nicht gefunden. Zuerst 'supabase start' (oder SUPABASE_PROJECT_ID setzen)." >&2 exit 1 fi IMAGE="$(docker inspect "$SOURCE" --format '{{.Config.Image}}')" NETWORK="$(docker inspect "$SOURCE" --format '{{range $k, $v := .NetworkSettings.Networks}}{{$k}}{{end}}')" docker rm -f "$NAME" >/dev/null 2>&1 || true ENV_ARGS=() while IFS= read -r -d '' entry; do case "$entry" in GOTRUE_RATE_LIMIT_HEADER=*) continue ;; # wird unten gezielt gesetzt API_EXTERNAL_URL=*) continue ;; # wird unten explizit gesetzt GOTRUE_SMTP_PORT=*) [ "$PROFILE" = "smtp-down" ] && continue ;; esac ENV_ARGS+=(-e "$entry") done < <(docker inspect "$SOURCE" --format '{{json .Config.Env}}' | jq -j '.[] + "\u0000"') case "$PROFILE" in throttle) ENV_ARGS+=(-e "GOTRUE_RATE_LIMIT_HEADER=X-Forwarded-For") ;; smtp-down) ENV_ARGS+=(-e "GOTRUE_SMTP_PORT=1") ;; # Host bleibt Mailpit, Port 1 lehnt die Verbindung ab esac # API_EXTERNAL_URL explizit (Spec D2): Kong-URL der CLI, nur Basis fuer Links in Mails/Redirects. ENV_ARGS+=(-e "API_EXTERNAL_URL=${API_EXTERNAL_URL:-http://127.0.0.1:54321}") docker run -d --name "$NAME" --network "$NETWORK" -p "${BIND_ADDR}:${HOST_PORT}:9999" \ "${ENV_ARGS[@]}" "$IMAGE" auth >/dev/null for _ in $(seq 1 40); do if curl -fsS "http://${HEALTH_HOST}:${HOST_PORT}/health" >/dev/null 2>&1; then echo "Container $NAME ($IMAGE, Profil $PROFILE) laeuft auf http://${HEALTH_HOST}:${HOST_PORT}" exit 0 fi sleep 0.5 done echo "Container $NAME wurde nicht gesund. Log:" >&2 docker logs --tail 30 "$NAME" >&2 exit 1