From 365c7994d54be2b49e8116db005510d7f11666fc Mon Sep 17 00:00:00 2001 From: duffyduck Date: Thu, 7 May 2026 19:41:16 +0200 Subject: [PATCH] factory-defaults: builtin-Werkseinstellungen beim Auto-Seed einspielen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neue VMs sollen direkt mit den im Repo abgelegten Stammdaten + Auftragsvorlagen + HTML-Templates hochkommen, ohne dass man jedes Mal manuell ein ZIP hochlädt. - Dockerfile: kopiert backend/factory-defaults nach /app/factory-defaults-builtin und backend/scripts nach /app/scripts - seed-factory-defaults.ts: ROOT-Pfad über FACTORY_DEFAULTS_DIR überschreibbar - entrypoint.sh: nach erfolgreichem Auto-Seed läuft `tsx scripts/seed-factory-defaults.ts` mit FACTORY_DEFAULTS_DIR auf den builtin-Pfad. Trigger NUR bei frischer DB (RAN_SEED=true), bestehende Installs werden nie nachträglich überschrieben. `backend/factory-defaults/*` bleibt gitignored – Inhalte legt jeder Operator-User selbst lokal ab (z.B. via Export-ZIP entpacken), sie landen beim nächsten Container-Build im Image. Live verifiziert: frischer Container mit RUN_SEED=true zieht 10 Anbieter, 4 Tarife, 18 Kündigungsfristen, 18 Laufzeiten, 8 Kategorien, 2 PDF-Vorlagen und 2 HTML-Templates ein; PDFs landen mit eindeutigem Suffix in uploads/. Co-Authored-By: Claude Opus 4.7 (1M context) --- backend/Dockerfile | 6 ++++++ backend/docker-entrypoint.sh | 17 +++++++++++++++-- backend/scripts/seed-factory-defaults.ts | 6 +++++- docs/todo.md | 11 +++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 85d5d55b..207646bd 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -50,6 +50,12 @@ COPY backend/prisma ./prisma # Frontend-Build ins public/-Verzeichnis (wird in production-Mode statisch ausgeliefert) COPY --from=frontend-builder /build/frontend/dist ./public +# Eingebaute Werkseinstellungen ins Image: bei Erstinstallation (leerer DB) zieht +# der Entrypoint sie via tsx scripts/seed-factory-defaults.ts ein. Liegt in einem +# eigenen Pfad – `factory-defaults/` selbst kann über Bind-Mount überlagert werden. +COPY backend/factory-defaults /app/factory-defaults-builtin +COPY backend/scripts /app/scripts + # Daten-Verzeichnisse (werden via Bind-Mount überlagert; hier nur als Fallback) RUN mkdir -p uploads factory-defaults prisma/backups diff --git a/backend/docker-entrypoint.sh b/backend/docker-entrypoint.sh index 471113bf..90197313 100755 --- a/backend/docker-entrypoint.sh +++ b/backend/docker-entrypoint.sh @@ -99,15 +99,28 @@ USER_COUNT=$(node -e " .catch(() => { process.stdout.write('-1'); process.exit(0); }); " 2>/dev/null) +RAN_SEED=false if [ "${RUN_SEED:-false}" = "true" ]; then echo "[entrypoint] RUN_SEED=true – seede DB (Force)" - npx prisma db seed || echo "[entrypoint] Seed fehlgeschlagen oder schon gelaufen – ignoriert" + if npx prisma db seed; then RAN_SEED=true; else echo "[entrypoint] Seed fehlgeschlagen oder schon gelaufen – ignoriert"; fi elif [ "$USER_COUNT" = "0" ]; then echo "[entrypoint] DB ist leer (User-Count=0) – Auto-Seed wird ausgeführt" - npx prisma db seed || echo "[entrypoint] Auto-Seed fehlgeschlagen – ignoriert" + if npx prisma db seed; then RAN_SEED=true; else echo "[entrypoint] Auto-Seed fehlgeschlagen – ignoriert"; fi else echo "[entrypoint] DB enthält $USER_COUNT User – kein Seed nötig" fi +# Eingebaute Factory-Defaults nach Erstinstallation einspielen. +# Das ist die Werkseinstellung für neue VMs: PDF-Vorlagen, Anbieter, Tarife, +# HTML-Templates – alles aus /app/factory-defaults-builtin/. Erfolgt nur wenn +# der Auto-Seed gerade lief (= frische DB), sonst werden Updates auf +# bestehenden Installationen nicht ungewollt überschrieben. +if [ "$RAN_SEED" = "true" ] && [ -d /app/factory-defaults-builtin ] \ + && [ -n "$(ls -A /app/factory-defaults-builtin 2>/dev/null | grep -v -E '^(README\.md|\.gitkeep)$')" ]; then + echo "[entrypoint] Spiele eingebaute Factory-Defaults ein…" + FACTORY_DEFAULTS_DIR=/app/factory-defaults-builtin npx tsx scripts/seed-factory-defaults.ts \ + || echo "[entrypoint] Factory-Defaults-Seed fehlgeschlagen – ignoriert" +fi + echo "[entrypoint] Starte Backend…" exec "$@" diff --git a/backend/scripts/seed-factory-defaults.ts b/backend/scripts/seed-factory-defaults.ts index 50e1b43f..38d51f8d 100644 --- a/backend/scripts/seed-factory-defaults.ts +++ b/backend/scripts/seed-factory-defaults.ts @@ -15,7 +15,11 @@ import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); -const ROOT = path.join(process.cwd(), 'factory-defaults'); +// ROOT kann via FACTORY_DEFAULTS_DIR überschrieben werden (Container-Bootstrap +// mit eingebauten Defaults aus dem Image). +const ROOT = process.env.FACTORY_DEFAULTS_DIR + ? path.resolve(process.env.FACTORY_DEFAULTS_DIR) + : path.join(process.cwd(), 'factory-defaults'); const UPLOADS_ROOT = path.join(process.cwd(), 'uploads'); const PDF_UPLOAD_DIR = path.join(UPLOADS_ROOT, 'pdf-templates'); diff --git a/docs/todo.md b/docs/todo.md index 574d8ec9..d95c6207 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,17 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **🚀 Auto-Seed: Werkseinstellungen beim Erst-Deploy** + - Inhalt von `backend/factory-defaults/` wird via Dockerfile als + `/app/factory-defaults-builtin/` ins Image gebrannt. + - Entrypoint spielt sie nach erfolgreichem Auto-Seed (frische DB) automatisch + via `tsx scripts/seed-factory-defaults.ts` ein – steuerbar über + `FACTORY_DEFAULTS_DIR`. + - Damit bringen neue VMs sofort Anbieter, Tarife, PDF-Auftragsvorlagen + + Datenschutzerklärung/Impressum mit, ohne manuelles UI-/CLI-Import. + - Bestehende Installs werden NIE überschrieben (Trigger nur wenn der + Auto-Seed im selben Start-Lauf gelaufen ist). + - [x] **📦 Factory-Defaults: HTML-Templates + Import via UI** - Datenschutzerklärung, Impressum, Vollmacht-Vorlage und Website-Datenschutz werden jetzt mit ins Factory-Defaults-ZIP gepackt (`app-settings/`-Ordner,