77 lines
3.3 KiB
Bash
Executable file
77 lines
3.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).
|
|
# 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=<dind-Gateway> setzen (siehe .forgejo/workflows/ci.yml, Job e2e);
|
|
# die Tests erreichen den Container ueber e2e/support/tcp-forward.mjs auf 127.0.0.1.
|
|
# 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}"
|
|
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 "${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
|