chore(infra): Backend-Docker-Image von unnoetigen Dateien befreien #276

Merged
niboer merged 5 commits from issue-266 into main 2026-07-08 23:52:07 +02:00
Owner

Allgemein

Altes Verhalten

Das Backend-Docker-Image ist 633 MB gross und wird in ~50s gebaut.
Der Runner-Stage kopiert node_modules mit allen devDependencies (483 MB)
und das gesamte prisma/-Verzeichnis (seed.ts + schema.prisma werden zur
Laufzeit nicht benoetigt).

Neues Verhalten

Image-Groesse reduziert auf 173 MB (73% Reduktion), Build-Time ~45s.

  • npm ci --omit=dev --ignore-scripts installiert nur Production-Dependencies
  • Generierter Prisma-Client (node_modules/.prisma/) wird aus dem Builder kopiert — kein prisma generate zur Laufzeit noetig
  • Aus prisma/ wird schema.prisma (fuer prisma migrate deploy), seed.ts (fuer DB-Seeding beim ersten Start) und migrations/ kopiert

COPY-Uebersicht im Runner-Stage

Quelle (Builder) Ziel (Runner) Zweck
package.json, package-lock.json, prisma.config.ts /app/ Dependencies + Prisma-Konfig
node_modules/.prisma/ /app/node_modules/.prisma/ Generierter Prisma-Client (PrismaClient-Export)
prisma/schema.prisma /app/prisma/schema.prisma Wird von prisma migrate deploy benoetigt
prisma/seed.ts /app/prisma/seed.ts DB-Seeding beim ersten Start
prisma/migrations/ /app/prisma/migrations/ Migrationen fuer prisma migrate deploy
dist/ /app/dist/ Kompilierte App
openapi.yaml /app/openapi.yaml API-Spec (zur Laufzeit referenziert)

Nachbesserungen (3 Commits nach Erst-Implementierung)

Nach dem ersten Build wurden folgende Laufzeitfehler behoben:

  1. package-lock.json fehltenpm ci im Runner braucht zwingend die Lock-Datei (EUSAGE-Fehler)
  2. PrismaClient-Export fehltenpm ci --ignore-scripts ueberspringt prisma generate, daher node_modules/.prisma/ aus Builder kopiert
  3. schema.prisma fehlteprisma migrate deploy braucht das Schema
  4. seed.ts fehlteindex.ts ruft beim ersten Start npx tsx prisma/seed.ts auf

Messung Vorher / Nachher

Metrik Vorher Nachher Aenderung
Image-Groesse 633 MB 173 MB -460 MB (73%)
Build-Time (--no-cache) 49.6 s ~45 s -5 s (10%)

Begruendung

Reduziert Speicherverbrauch, schnellere Deployments, kleinere
Angriffsflaeche durch Wegfall unnoetiger Tools (TypeScript, ESLint, etc.).

Test-Hinweise

  1. npm --prefix backend run build (tsc) → erfolgreich
  2. npm --prefix backend run test → 31 Test-Dateien, 550 Tests bestanden
  3. podman build --no-cache -f backend/Dockerfile backend → Image 173 MB
  4. Container-Start mit leerer DB → prisma migrate deploy + Seeding + Keycloak-Provisioning laufen durch

Checkliste

  • N/A — reine Infra-Aenderung, kein UI-Code betroffen
### Allgemein - closes #266 ### Altes Verhalten Das Backend-Docker-Image ist 633 MB gross und wird in ~50s gebaut. Der Runner-Stage kopiert `node_modules` mit allen devDependencies (483 MB) und das gesamte `prisma/`-Verzeichnis (seed.ts + schema.prisma werden zur Laufzeit nicht benoetigt). ### Neues Verhalten Image-Groesse reduziert auf **173 MB** (73% Reduktion), Build-Time ~45s. - `npm ci --omit=dev --ignore-scripts` installiert nur Production-Dependencies - Generierter Prisma-Client (`node_modules/.prisma/`) wird aus dem Builder kopiert — kein `prisma generate` zur Laufzeit noetig - Aus `prisma/` wird `schema.prisma` (fuer `prisma migrate deploy`), `seed.ts` (fuer DB-Seeding beim ersten Start) und `migrations/` kopiert ### COPY-Uebersicht im Runner-Stage | Quelle (Builder) | Ziel (Runner) | Zweck | |---|---|---| | `package.json`, `package-lock.json`, `prisma.config.ts` | `/app/` | Dependencies + Prisma-Konfig | | `node_modules/.prisma/` | `/app/node_modules/.prisma/` | Generierter Prisma-Client (`PrismaClient`-Export) | | `prisma/schema.prisma` | `/app/prisma/schema.prisma` | Wird von `prisma migrate deploy` benoetigt | | `prisma/seed.ts` | `/app/prisma/seed.ts` | DB-Seeding beim ersten Start | | `prisma/migrations/` | `/app/prisma/migrations/` | Migrationen fuer `prisma migrate deploy` | | `dist/` | `/app/dist/` | Kompilierte App | | `openapi.yaml` | `/app/openapi.yaml` | API-Spec (zur Laufzeit referenziert) | ### Nachbesserungen (3 Commits nach Erst-Implementierung) Nach dem ersten Build wurden folgende Laufzeitfehler behoben: 1. **`package-lock.json` fehlte** — `npm ci` im Runner braucht zwingend die Lock-Datei (EUSAGE-Fehler) 2. **`PrismaClient`-Export fehlte** — `npm ci --ignore-scripts` ueberspringt `prisma generate`, daher `node_modules/.prisma/` aus Builder kopiert 3. **`schema.prisma` fehlte** — `prisma migrate deploy` braucht das Schema 4. **`seed.ts` fehlte** — `index.ts` ruft beim ersten Start `npx tsx prisma/seed.ts` auf ### Messung Vorher / Nachher | Metrik | Vorher | Nachher | Aenderung | |--------|--------|---------|-----------| | Image-Groesse | 633 MB | 173 MB | **-460 MB (73%)** | | Build-Time (--no-cache) | 49.6 s | ~45 s | **-5 s (10%)** | ### Begruendung Reduziert Speicherverbrauch, schnellere Deployments, kleinere Angriffsflaeche durch Wegfall unnoetiger Tools (TypeScript, ESLint, etc.). ### Test-Hinweise 1. `npm --prefix backend run build` (tsc) → erfolgreich 2. `npm --prefix backend run test` → 31 Test-Dateien, 550 Tests bestanden 3. `podman build --no-cache -f backend/Dockerfile backend` → Image 173 MB 4. Container-Start mit leerer DB → `prisma migrate deploy` + Seeding + Keycloak-Provisioning laufen durch ### Checkliste - [x] N/A — reine Infra-Aenderung, kein UI-Code betroffen
chore(infra): Backend-Docker-Image von unnoetigen Dateien befreien
Some checks failed
CI Backend / lint-backend (pull_request) Successful in 53s
CI Docs Only / lint-backend (pull_request) Successful in 1s
CI Docs Only / test-backend (pull_request) Successful in 1s
CI Docs Only / lint-frontend (pull_request) Successful in 1s
CI Docs Only / test-frontend (pull_request) Successful in 1s
CI Docs Only / e2e (pull_request) Successful in 0s
CI Frontend / lint-frontend (pull_request) Successful in 1m12s
CI Meta / conventional-commit (pull_request) Successful in 1s
E2E / e2e (pull_request) Failing after 15s
CI Backend / test-backend (pull_request) Successful in 2m54s
CI Frontend / test-frontend (pull_request) Failing after 1m14s
95f2285395
refs #266

Aktuelles: Runner-Stage kopiert node_modules mit allen devDependencies
(483 MB) und das komplette prisma/ inkl. seed.ts/schema.prisma.
Image-Groesse: 633 MB, Build-Time: ~50s.

Neu: Im Runner-Stage werden nur Production-Dependencies via
npm ci --omit=dev installiert (~170 MB statt 483 MB). Aus prisma/
wird nur migrations/ kopiert (seed.ts + schema.prisma unnoetig).
Image-Groesse: 173 MB (Reduktion um 73%), Build-Time: ~45s.

Dokumentation in docs/design/01-backend-architektur.md aktualisiert
(Dockerfile + node 22->24 Angleichung).
niboer force-pushed issue-266 from 95f2285395
Some checks failed
CI Backend / lint-backend (pull_request) Successful in 53s
CI Docs Only / lint-backend (pull_request) Successful in 1s
CI Docs Only / test-backend (pull_request) Successful in 1s
CI Docs Only / lint-frontend (pull_request) Successful in 1s
CI Docs Only / test-frontend (pull_request) Successful in 1s
CI Docs Only / e2e (pull_request) Successful in 0s
CI Frontend / lint-frontend (pull_request) Successful in 1m12s
CI Meta / conventional-commit (pull_request) Successful in 1s
E2E / e2e (pull_request) Failing after 15s
CI Backend / test-backend (pull_request) Successful in 2m54s
CI Frontend / test-frontend (pull_request) Failing after 1m14s
to 13f4d11274
Some checks failed
CI Backend / lint-backend (pull_request) Successful in 53s
CI Docs Only / lint-backend (pull_request) Successful in 1s
CI Docs Only / test-backend (pull_request) Successful in 1s
CI Docs Only / lint-frontend (pull_request) Successful in 1s
CI Docs Only / test-frontend (pull_request) Successful in 1s
CI Docs Only / e2e (pull_request) Successful in 0s
CI Frontend / lint-frontend (pull_request) Successful in 1m14s
CI Meta / conventional-commit (pull_request) Successful in 1s
E2E / e2e (pull_request) Failing after 6s
CI Backend / test-backend (pull_request) Successful in 2m54s
CI Frontend / test-frontend (pull_request) Successful in 1m56s
2026-07-08 23:20:36 +02:00
Compare
fix(backend): package-lock.json im Runner-Stage ergaenzt
Some checks failed
CI Backend / lint-backend (pull_request) Successful in 53s
CI Docs Only / lint-backend (pull_request) Successful in 1s
CI Docs Only / test-backend (pull_request) Successful in 1s
CI Docs Only / lint-frontend (pull_request) Successful in 1s
CI Docs Only / test-frontend (pull_request) Successful in 1s
CI Docs Only / e2e (pull_request) Successful in 0s
CI Frontend / lint-frontend (pull_request) Successful in 1m13s
CI Meta / conventional-commit (pull_request) Successful in 1s
E2E / e2e (pull_request) Failing after 3m24s
CI Backend / test-backend (pull_request) Successful in 2m54s
CI Frontend / test-frontend (pull_request) Has been cancelled
cac3420d72
refs #266

Aktuelles: Im Runner-Stage fehlt package-lock.json, daher schlaegt
npm ci mit 'EUSAGE' fehl.

Neu: COPY-Befehl im Runner-Stage kopiert auch package-lock.json aus
dem Builder-Stage. Dokumentation synchron aktualisiert.
fix(backend): generierten Prisma-Client und schema.prisma im Runner ergaenzt
Some checks failed
CI Backend / lint-backend (pull_request) Successful in 54s
CI Docs Only / lint-backend (pull_request) Successful in 1s
CI Docs Only / test-backend (pull_request) Successful in 1s
CI Docs Only / lint-frontend (pull_request) Successful in 1s
CI Docs Only / test-frontend (pull_request) Successful in 1s
CI Docs Only / e2e (pull_request) Successful in 0s
CI Frontend / lint-frontend (pull_request) Successful in 1m14s
CI Meta / conventional-commit (pull_request) Successful in 1s
CI Backend / test-backend (pull_request) Has been cancelled
CI Frontend / test-frontend (pull_request) Has been cancelled
E2E / e2e (pull_request) Has been cancelled
7298ced121
refs #266

Aktuelles: Maintenance-Container erhaelt PrismaClient-Export-Fehler,
Backend-Container findet schema.prisma nicht.

Ursache: npm ci --omit=dev --ignore-scripts im Runner-Stage
ueberspringt prisma generate, daher fehlt der generierte Client
in node_modules/.prisma/. Zudem fehlt schema.prisma fuer
prisma migrate deploy.

Neu:
- Generierten Prisma-Client aus Builder kopiert (COPY .prisma/)
- schema.prisma fuer migrate deploy kopiert
- COPY dist ans Ende verschoben (Layer-Caching-Optimierung)
- Doku synced
fix(backend): seed.ts im Runner-Stage ergaenzt
All checks were successful
CI Backend / lint-backend (pull_request) Successful in 1m9s
CI Docs Only / lint-backend (pull_request) Successful in 1s
CI Docs Only / test-backend (pull_request) Successful in 1s
CI Docs Only / lint-frontend (pull_request) Successful in 1s
CI Docs Only / test-frontend (pull_request) Successful in 1s
CI Docs Only / e2e (pull_request) Successful in 0s
CI Frontend / lint-frontend (pull_request) Successful in 1m16s
CI Meta / conventional-commit (pull_request) Successful in 1s
E2E / e2e (pull_request) Successful in 2m36s
CI Backend / test-backend (pull_request) Successful in 2m54s
CI Frontend / test-frontend (pull_request) Successful in 1m56s
d4fe0637f3
refs #266

Aktuelles: Bei leerer DB ruft index.ts npx tsx prisma/seed.ts auf,
aber seed.ts fehlt im Docker-Image (ERR_MODULE_NOT_FOUND).

Neu: seed.ts aus dem Builder in den Runner kopiert.
Doku synced.
niboer scheduled this pull request to auto merge when all checks succeed 2026-07-08 23:49:33 +02:00
niboer merged commit e18b4bdfc8 into main 2026-07-08 23:52:07 +02:00
niboer deleted branch issue-266 2026-07-08 23:52:07 +02:00
Sign in to join this conversation.
No description provided.