From 9f879759d8b738ba9aec07f496338d13cf6420c9 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Tue, 8 Sep 2026 14:23:58 +0200 Subject: [PATCH] CLI-Skripte: DATABASE_URL wieder aufbaubar machen Die drei neuen Wartungsskripte bauten sich einen eigenen PrismaClient und gingen damit an src/lib/prisma.ts vorbei. Dort wird DATABASE_URL aus den DB_*-Teilen zusammengesetzt, falls sie fehlt - und genau das ist bei `docker compose exec npx tsx prisma/.ts` der Fall: Der Entrypoint exportiert sie nur in den Serverprozess, eine neue Shell erbt sie nicht. Ergebnis war "Environment variable not found: DATABASE_URL". Der Kommentar in src/lib/prisma.ts beschreibt genau diesen Fall; die Loesung war da, ich habe sie nur umgangen. Betroffen war auch rolle-zuweisen.ts. Das ist der Weg, den die Startwache im Klartext nennt, wenn kein Konto mehr die Pflichtrechte haelt - er haette in dem Moment versagt, fuer den er gebaut ist. Geprueft mit entzogener DATABASE_URL und nur DB_*-Teilen in der Umgebung: rechte-report, rolle-zuweisen --liste und sync-roles laufen. Co-Authored-By: Claude Opus 5 (1M context) --- backend/prisma/rechte-report.ts | 9 +++++++-- backend/prisma/rolle-zuweisen.ts | 9 +++++++-- backend/prisma/sync-roles.ts | 9 +++++++-- docs/todo.md | 8 ++++++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/backend/prisma/rechte-report.ts b/backend/prisma/rechte-report.ts index ec537de3..3ee2b07b 100644 --- a/backend/prisma/rechte-report.ts +++ b/backend/prisma/rechte-report.ts @@ -12,10 +12,15 @@ * etwas Lesbares ausgibt. */ -import { PrismaClient } from '@prisma/client'; +// Ueber src/lib/prisma.js, NICHT ueber einen eigenen PrismaClient: Dort wird +// DATABASE_URL aus den DB_*-Teilen zusammengesetzt, falls sie fehlt. Bei +// `docker compose exec npx tsx prisma/.ts` ist genau das der +// Fall - der Entrypoint exportiert sie nur in den Serverprozess, eine neue +// Shell erbt sie nicht. Ein eigener Client scheitert dort mit +// "Environment variable not found: DATABASE_URL". +import prisma from '../src/lib/prisma.js'; import { ALLE_RECHTE, SYSTEMROLLEN_NAMEN } from '../src/config/rechte-katalog.js'; -const prisma = new PrismaClient(); /** * Liest isSystem/isHidden, sofern die Spalten existieren. diff --git a/backend/prisma/rolle-zuweisen.ts b/backend/prisma/rolle-zuweisen.ts index 92f1c724..c570b5f9 100644 --- a/backend/prisma/rolle-zuweisen.ts +++ b/backend/prisma/rolle-zuweisen.ts @@ -25,10 +25,15 @@ * Aenderung sofort wirkt und nicht spurlos bleibt. */ -import { PrismaClient } from '@prisma/client'; +// Ueber src/lib/prisma.js, NICHT ueber einen eigenen PrismaClient: Dort wird +// DATABASE_URL aus den DB_*-Teilen zusammengesetzt, falls sie fehlt. Bei +// `docker compose exec npx tsx prisma/.ts` ist genau das der +// Fall - der Entrypoint exportiert sie nur in den Serverprozess, eine neue +// Shell erbt sie nicht. Ein eigener Client scheitert dort mit +// "Environment variable not found: DATABASE_URL". +import prisma from '../src/lib/prisma.js'; import { createAuditLog } from '../src/services/audit.service.js'; -const prisma = new PrismaClient(); async function main(): Promise { const args = process.argv.slice(2); diff --git a/backend/prisma/sync-roles.ts b/backend/prisma/sync-roles.ts index 77e12beb..50015f01 100644 --- a/backend/prisma/sync-roles.ts +++ b/backend/prisma/sync-roles.ts @@ -14,10 +14,15 @@ * Produktionsdatenbanken sicher. */ -import { PrismaClient } from '@prisma/client'; +// Ueber src/lib/prisma.js, NICHT ueber einen eigenen PrismaClient: Dort wird +// DATABASE_URL aus den DB_*-Teilen zusammengesetzt, falls sie fehlt. Bei +// `docker compose exec npx tsx prisma/.ts` ist genau das der +// Fall - der Entrypoint exportiert sie nur in den Serverprozess, eine neue +// Shell erbt sie nicht. Ein eigener Client scheitert dort mit +// "Environment variable not found: DATABASE_URL". +import prisma from '../src/lib/prisma.js'; import { synchronisiereRechteUndRollen } from '../src/services/rollen-sync.service.js'; -const prisma = new PrismaClient(); synchronisiereRechteUndRollen(prisma) .catch((e) => { diff --git a/docs/todo.md b/docs/todo.md index 53d7f2c2..5ce86074 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -165,6 +165,14 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung noch in der Datenbank und bewachen nichts. Nicht gelöscht, sondern am Lesezugriff gefiltert – ein Filter ist die kleinere Behauptung als ein DELETE. + - **Nachtrag (Staging-Deploy)**: Die drei CLI-Skripte bauten sich einen + eigenen `PrismaClient` und gingen damit an `src/lib/prisma.ts` vorbei – dort + wird `DATABASE_URL` aus den `DB_*`-Teilen zusammengesetzt, wenn sie fehlt. + Genau das ist bei `docker compose exec` der Fall: Der Entrypoint exportiert + sie nur in den Serverprozess. Folge: „Environment variable not found". + Betroffen war auch `rolle-zuweisen.ts` – der Aussperr-Ausweg hätte in dem + Moment versagt, für den er gebaut ist. Jetzt nutzen alle drei den + gemeinsamen Client. - **Beim Deploy**: Die Migration beendet alle Sitzungen einmalig (`tokenInvalidatedAt`). Nötig, weil die Rechte im Token stehen – sonst liefen bis zu 15 Minuten 403er. Alle müssen sich einmal neu anmelden.