Files
tessera-ctl/apps/api/scripts/migrate-and-start.sh
T
schalli a5f99e52e3 feat(quick-260909-dgj): Migrationsverbindung von Laufzeitverbindung trennen (Task 2/4)
- apps/api/scripts/migrate-and-start.sh: TESSERA_MIGRATE_DATABASE_URL fuer
  den Migrationsschritt, DATABASE_URL bleibt unveraendert fuer den
  Laufzeitschritt; leer/nicht gesetzt = bisheriges Verhalten
- Dockerfile kopiert scripts/ und ruft das Skript als CMD auf; exec statt
  &&-Verkettung, damit Signale den Node-Prozess erreichen
- docker-compose.yml/.prod.yml reichen TESSERA_MIGRATE_DATABASE_URL durch
  (leerer Vorgabewert); docker-compose.dev.yml/.ci.yml unveraendert
- .env.example erklaert beide Variablen mit Platzhaltern, Umstellung bleibt
  auskommentiert
- 5 Tests in start-script.spec.ts (rot vor dem Skript, jetzt gruen)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYZcd3SSmo14QTqWx2KKzU
2026-09-09 10:00:45 +02:00

51 lines
2.1 KiB
Bash
Executable File

#!/bin/sh
# WINDOWS #18 — trennt die Verbindung des Migrationsschritts von der
# Verbindung des Laufzeitschritts (T-DGJ-03).
#
# `prisma migrate deploy` braucht die Rechte des Tabelleneigentuemers, um DDL
# auszufuehren. Die Anwendung soll genau diese Rechte NICHT haben — sonst
# waere die Rollentrennung aus Migration 20260909130000_rls_app_role wieder
# verloren. Ohne getrennte Verbindungen fuer Migration und Laufzeit ist eine
# Rollentrennung deshalb nicht moeglich.
#
# Vorgabe (ohne gesetztes TESSERA_MIGRATE_DATABASE_URL): beide Schritte
# nutzen DATABASE_URL — exakt der bisherige Ablauf, unveraendert fuer
# lokale Entwicklung, CI und den Server, bis
# docs/mandantentrennung-datenbankrolle.md abgearbeitet ist.
set -e
if [ -z "$DATABASE_URL" ]; then
echo "FEHLER: DATABASE_URL ist nicht gesetzt." >&2
exit 1
fi
# In sh ersetzt ${VAR:-fallback} auch eine gesetzte, aber leere Variable
# durch den Fallback — Compose reicht nicht belegte Variablen als leere
# Zeichenketten weiter, das soll wie "nicht gesetzt" behandelt werden.
MIGRATE_URL="${TESSERA_MIGRATE_DATABASE_URL:-$DATABASE_URL}"
if [ -n "$TESSERA_MIGRATE_DATABASE_URL" ]; then
MIGRATE_SOURCE="TESSERA_MIGRATE_DATABASE_URL"
else
MIGRATE_SOURCE="DATABASE_URL"
fi
RUNTIME_SOURCE="DATABASE_URL"
if [ "$1" = "--print-plan" ]; then
# Nur Variablennamen ausgeben, niemals Werte — diese Betriebsart existiert
# allein, damit die CI das Verhalten ohne Datenbank pruefen kann.
echo "Migrationsschritt verwendet: $MIGRATE_SOURCE"
echo "Laufzeitschritt verwendet: $RUNTIME_SOURCE"
exit 0
fi
# DATABASE_URL nur fuer diesen einen Aufruf auf die Migrationsverbindung
# setzen (vorangestellte Zuweisung, kein export) — der nachfolgende exec
# erbt die unveraenderte DATABASE_URL aus der Umgebung.
DATABASE_URL="$MIGRATE_URL" apps/api/node_modules/.bin/prisma migrate deploy --schema apps/api/prisma/schema.prisma
# exec statt Aufruf, damit Signale (z. B. SIGTERM bei docker stop) den
# Node-Prozess erreichen. Die bisherige CMD-Zeile hatte dieses Problem
# ebenfalls und loeste es nicht; hier wird es nebenbei mitbehoben.
exec node apps/api/dist/main.js