Shuffle/e2e/support/start-throttle-gotrue.sh
cschlaefke f302c56904 test(auth): add Playwright project with api tests for KTO-01 (GoTrue, Mailpit, db helper)
Refs #38

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-03 10:29:18 +01:00

72 lines
3 KiB
Bash
Executable file

#!/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