#!/usr/bin/env bash # Mailvorlagen unter einem entfernten Docker-Daemon (dind) bereitstellen (Issue #38, CI-Lauf 27). # # Ursache: Die Supabase CLI bindet supabase/templates/*.html per Bind-Mount (Host-Pfad des Job-Containers) # in einen ihrer Container ein; GoTrue holt die Vorlage per URL von dort (/email/.html). Im dind # existiert der Host-Pfad nicht, Docker legt stattdessen ein leeres VERZEICHNIS an, der Webserver liefert # "Index of /email/confirmation.html/" und GoTrue verschickt diese Seite statt der Vorlage (stiller Fallback, # der Betreff kommt weiter aus der config.toml). Dieses Skript ersetzt solche Verzeichnisse im dind durch die # echten Dateien (per Helfer-Container, Inhalt ueber stdin) und startet den betroffenen Container neu. # Die Auslieferung bleibt eine URL, wie in Staging/Prod geplant (GOTRUE_MAILER_TEMPLATES_*). # Keine Secrets: es werden nur Container-, Pfad- und Dateinamen ausgegeben. set -euo pipefail PROJECT_ID="${SUPABASE_PROJECT_ID:-shuffle}" TEMPLATE_DIR="${TEMPLATE_DIR:-supabase/templates}" fixed=0 for c in $(docker ps --format '{{.Names}}' | grep -E "_${PROJECT_ID}\$"); do while IFS='|' read -r type src dst; do [ "$type" = bind ] || continue name=$(basename "$src") [ -f "$TEMPLATE_DIR/$name" ] || continue echo "Mount in $c: $src -> $dst" image=$(docker inspect "$c" --format '{{.Config.Image}}') # Exit 3 = Quelle ist schon eine Datei (alles in Ordnung) set +e docker run --rm -i --user 0 --entrypoint sh -v "$(dirname "$src"):/t" "$image" \ -c "[ -d '/t/$name' ] || exit 3; rmdir '/t/$name' && cat > '/t/$name'" < "$TEMPLATE_DIR/$name" rc=$? set -e case "$rc" in 0) echo " $name war ein leeres Verzeichnis, durch Datei ersetzt"; fixed=$((fixed + 1)); restart="${restart:-} $c" ;; 3) echo " $name ist bereits eine Datei" ;; *) echo "Fehler beim Ersetzen von $name (Exit $rc)" >&2; exit 1 ;; esac done < <(docker inspect "$c" --format '{{range .Mounts}}{{.Type}}|{{.Source}}|{{.Destination}}{{"\n"}}{{end}}') done for c in $(printf '%s\n' ${restart:-} | sort -u); do echo "Neustart $c" docker restart "$c" >/dev/null done echo "Vorlagen-Mounts korrigiert: $fixed" if [ "$fixed" -eq 0 ]; then echo "Hinweis: kein Verzeichnis-Mount ersetzt. Bind-Mounts der Projekt-Container (nur Typ, Quelle, Ziel):" for c in $(docker ps --format '{{.Names}}' | grep -E "_${PROJECT_ID}\$"); do docker inspect "$c" --format '{{range .Mounts}}{{if eq .Type "bind"}}'"$c"' {{.Source}} -> {{.Destination}}{{"\n"}}{{end}}{{end}}' done fi