TeamVis Self-Host-Bundle v0.31.0

This commit is contained in:
TeamVis Release
2026-06-26 10:12:01 +02:00
parent e056e459ea
commit 330db52145
+29 -1
View File
@@ -144,6 +144,32 @@ create_admin() {
node "$REPO/scripts/create-admin.mjs" "$ADMIN_EMAIL" --name "$ADMIN_NAME" --role admin
}
# SQL-Literal-Escaping (einfache Anführungszeichen verdoppeln).
sqlq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/''/g")"; }
# Admin-Anlage DIREKT in die DB (Modus 2). Vermeidet den Zugriff auf die
# öffentliche URL — die ist auf der Host-Maschine wegen Hairpin-NAT / noch
# nicht gesetztem DNS oft nicht erreichbar. Braucht nur bcryptjs (für den
# Hash, identisch zur App: cost 12) + dbsql.
create_admin_db() {
ensure_node_deps
head "Ersten Admin anlegen ($ADMIN_EMAIL)"
local pw pw2 hash
while :; do
printf 'Passwort (min. 10 Zeichen): '; read -rs pw; printf '\n'
if [ "${#pw}" -lt 10 ]; then warn "Mindestens 10 Zeichen."; continue; fi
printf 'Passwort wiederholen: '; read -rs pw2; printf '\n'
if [ "$pw" != "$pw2" ]; then warn "Passwörter stimmen nicht überein."; continue; fi
break
done
hash="$(node -e "process.stdout.write(require('bcryptjs').hashSync(process.argv[1],12))" "$pw")" \
|| die "Hash-Berechnung fehlgeschlagen."
printf "insert into public.admin_users (email,password_hash,name,role,must_change_password) values (%s,%s,%s,'admin',true);\n" \
"$(sqlq "$ADMIN_EMAIL")" "$(sqlq "$hash")" "$(sqlq "$ADMIN_NAME")" | dbsql \
&& ok "Admin angelegt: $ADMIN_EMAIL" \
|| die "Admin-Anlage fehlgeschlagen (existiert die E-Mail schon?)."
}
#######################################################################
# MODUS 1 — Bestehende/eigene Supabase
#######################################################################
@@ -470,7 +496,9 @@ SQL
( cd "$TARGET" && docker compose up -d )
ok "Stack läuft."
create_admin "$SITE_URL" "$SERVICE_ROLE_KEY"
# Admin direkt in die DB (nicht über die öffentliche URL — die ist auf dem
# Host wegen Hairpin-NAT / noch nicht gesetztem DNS oft nicht erreichbar).
create_admin_db
fi
#######################################################################