#!/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). # Nur lokal/CI benutzen: Die kopierte Umgebung enthaelt die lokalen Demo-Secrets der CLI. set -euo pipefail ACTION="${1:-start}" PROFILE="${2:-throttle}" SOURCE="${SOURCE_CONTAINER:-$(docker ps --format '{{.Names}}' | grep -E '^supabase_auth_' | head -n1 || true)}" 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 [ -z "$SOURCE" ]; then echo "Kein laufender supabase_auth_*-Container gefunden. Zuerst 'supabase start'." >&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 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 docker run -d --name "$NAME" --network "$NETWORK" -p "127.0.0.1:${HOST_PORT}:9999" \ "${ENV_ARGS[@]}" "$IMAGE" auth >/dev/null for _ in $(seq 1 40); do if curl -fsS "http://127.0.0.1:${HOST_PORT}/health" >/dev/null 2>&1; then echo "Container $NAME ($IMAGE, Profil $PROFILE) laeuft auf http://127.0.0.1:${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