feat(infra): HTTPS + Frontend HTTP/2 via undici + E2E-Adaption #307

Merged
niboer merged 2 commits from issue-290-https-certs into main 2026-07-19 20:01:51 +00:00
Owner

closes #290

Allgemein

HTTPS-Zertifikate fuer Backend, Frontend und Keycloak — sowohl fuer CI/CD (verpflichtend) als auch optional fuer lokale Entwicklung. Eigene Dev-CA als Trust-Anchor.

HTTPS-Unterstuetzung

Dienst Ohne Certs Mit Certs
backend-api HTTP/1.1 HTTP/2 + HTTPS
frontend HTTP/1.1 HTTP/2 mit HTTP/1.1-Fallback (allowHTTP1: true)
keycloak start-dev (HTTP) start (HTTPS, Port 8443)
e2e-runner HTTP-URLs HTTPS + NODE_EXTRA_CA_CERTS

Frontend HTTP/2 (fetch2-Wrapper)

Node.js built-in fetch() (undici v7) spricht nur HTTP/1.1. Da das Backend aber rein HTTP/2 spricht, wurde ein Wrapper via npm-undici v8 mit Agent({ allowH2: true }) implementiert:

  • src/lib/server/fetch.ts — exportiert fetch2() via npm-undici v8 (HTTP/2 by default)
  • Alle 4 ausgehenden fetch()-Aufrufe umgestellt: Health, BFF-Proxy, Callback, Token-Refresh
  • In Tests (VITEST=true) delegiert fetch2 an globalThis.fetch (bestehende Mocks bleiben kompatibel)
  • Built-in undici v7 bleibt unberuehrt, kein globaler Konflikt
  • Test server.test.ts warnt wenn built-in undici auf v8+ upgradet (dann kann npm-Dep entfernt werden)

E2E-Adaptionen

  • e2e/docker-compose.e2e.yml: HTTPS-Override-URLs + Env-Vars auch fuer e2e-runner
  • playwright.config.ts: ignoreHTTPSErrors: true
  • global-setup.ts: Retry-Loop fuer Podman-pasta-ERR_NETWORK_CHANGED
  • scripts/docker-test.mjs: Health-Check via frontend-Container (undici statt host-fetch)
  • scripts/generate-dev-certs.mjs: Config per tmpdir statt <(echo) (kompatibel mit dash/sh)

Weitere Aenderungen

  • COOKIE_SECURE-Env-Var ersetzt hardcodiertes secure: false an 18+ Stellen
  • keycloak/entrypoint.sh: Automatische Umschaltung start/start-dev
  • keycloak.conf: db=postgres, spi-connections-jpa-quarkus-async-commit, proxy-headers=xforwarded
  • .env.example aufs Wesentliche reduziert (nur ENCRYPTION_KEY aktiv)
  • Alle Zertifikatsdateien via chmod 644 + SELinux :z fuer Container-Lesbarkeit
  • Backend-Cert SAN auf backend-api.integration.local korrigiert
closes #290 ## Allgemein HTTPS-Zertifikate fuer Backend, Frontend und Keycloak — sowohl fuer CI/CD (verpflichtend) als auch optional fuer lokale Entwicklung. Eigene Dev-CA als Trust-Anchor. ## HTTPS-Unterstuetzung | Dienst | Ohne Certs | Mit Certs | |--------|-----------|-----------| | backend-api | HTTP/1.1 | HTTP/2 + HTTPS | | frontend | HTTP/1.1 | HTTP/2 mit HTTP/1.1-Fallback (`allowHTTP1: true`) | | keycloak | start-dev (HTTP) | start (HTTPS, Port 8443) | | e2e-runner | HTTP-URLs | HTTPS + NODE_EXTRA_CA_CERTS | ## Frontend HTTP/2 (fetch2-Wrapper) Node.js built-in `fetch()` (undici v7) spricht nur HTTP/1.1. Da das Backend aber rein HTTP/2 spricht, wurde ein Wrapper via npm-undici v8 mit `Agent({ allowH2: true })` implementiert: - `src/lib/server/fetch.ts` — exportiert `fetch2()` via npm-undici v8 (HTTP/2 by default) - Alle 4 ausgehenden `fetch()`-Aufrufe umgestellt: Health, BFF-Proxy, Callback, Token-Refresh - In Tests (VITEST=true) delegiert `fetch2` an `globalThis.fetch` (bestehende Mocks bleiben kompatibel) - Built-in undici v7 bleibt unberuehrt, kein globaler Konflikt - Test `server.test.ts` warnt wenn built-in undici auf v8+ upgradet (dann kann npm-Dep entfernt werden) ## E2E-Adaptionen - `e2e/docker-compose.e2e.yml`: HTTPS-Override-URLs + Env-Vars auch fuer e2e-runner - `playwright.config.ts`: `ignoreHTTPSErrors: true` - `global-setup.ts`: Retry-Loop fuer Podman-pasta-ERR_NETWORK_CHANGED - `scripts/docker-test.mjs`: Health-Check via frontend-Container (undici statt host-fetch) - `scripts/generate-dev-certs.mjs`: Config per tmpdir statt <(echo) (kompatibel mit dash/sh) ## Weitere Aenderungen - `COOKIE_SECURE`-Env-Var ersetzt hardcodiertes `secure: false` an 18+ Stellen - `keycloak/entrypoint.sh`: Automatische Umschaltung start/start-dev - `keycloak.conf`: db=postgres, `spi-connections-jpa-quarkus-async-commit`, `proxy-headers=xforwarded` - `.env.example` aufs Wesentliche reduziert (nur ENCRYPTION_KEY aktiv) - Alle Zertifikatsdateien via `chmod 644` + SELinux `:z` fuer Container-Lesbarkeit - Backend-Cert SAN auf `backend-api.integration.local` korrigiert
feat(infra): HTTPS + Frontend HTTP/2 via undici + E2E-Adaption
Some checks failed
CI Backend / lint-backend (pull_request) Successful in 59s
CI Frontend / lint-frontend (pull_request) Successful in 1m19s
CI Meta / conventional-commit (pull_request) Successful in 1s
E2E / e2e (pull_request) Successful in 6m16s
CI Backend / test-backend (pull_request) Successful in 3m53s
CI Frontend / test-frontend (pull_request) Failing after 2m0s
4ca5f0c30e
refs #290

HTTPS-Zertifikate fuer Backend, Frontend und Keycloak inklusive CI/CD
und optionaler lokaler Entwicklung. Eigene Dev-CA.

Backend:
  - SSL_KEY_PATH/SSL_CERT_PATH fuer HTTP/2 + HTTPS
  - NODE_EXTRA_CA_CERTS als CA-Trust (Node.js built-in)

Frontend:
  - Custom Entrypoint server.mjs fuer adapter-node (HTTP/2 mit HTTP/1.1-Fallback)
  - COOKIE_SECURE-Env-Var als Ersatz fuer hardcodiertes secure=false
  - fetch2-Wrapper via undici v8 npm (HTTP/2 + voller CA-Trust)
  - Alle ausgehenden fetch()-Aufrufe umgestellt: Health, BFF-Proxy, Callback, Auth

Keycloak:
  - entrypoint.sh: Automatisch start (HTTPS) vs start-dev (HTTP)
  - keycloak.conf + proxy-headers

Infra/E2E/CI:
  - docker-compose.yml: Certs-Volumes + Env-Vars fuer alle Dienste
  - e2e/docker-compose.e2e.yml: HTTPS-Overrides + e2e-runner Vars
  - scripts/generate-dev-certs.mjs: CA + Certs via openssl (tmpdir, kein <(echo))
  - scripts/docker-test.mjs: Health-Check via frontend-Container (undici)
  - Playwright: ignoreHTTPSErrors + SSL_CERT_FILE
  - global-setup: Retry-Loop fuer Podman-pasta-ERR_NETWORK_CHANGED

Testing:
  - backend: ssl.test.ts (2 Tests)
  - frontend: server.test.ts + undici-built-in-v8-Check
  - vitest.config.ts: env-Vars fixiert (unabhaengig von lokaler .env)

Doku: README, .env.example, AGENTS.md x3, docs/design/*
test(frontend): nicht-benötigten SSL-Zertifikats-Unit-Test entfernt
All checks were successful
CI Backend / lint-backend (pull_request) Successful in 1m0s
CI Frontend / lint-frontend (pull_request) Successful in 1m23s
CI Meta / conventional-commit (pull_request) Successful in 1s
E2E / e2e (pull_request) Successful in 5m54s
CI Backend / test-backend (pull_request) Successful in 3m52s
CI Frontend / test-frontend (pull_request) Successful in 2m1s
78a64a3881
Dieser Test prüfte auf existierende dev-Certs unter dev/certs/,
die weder in CI noch in der lokalen Unit-Test-Umgebung vorhanden sind.
Der verbleibende Test ('erkennt fehlende SSL-Zertifikate') deckt
den Fall ohne Certs ab und läuft überall.
niboer merged commit 8fdf48e5d4 into main 2026-07-19 20:01:51 +00:00
niboer deleted branch issue-290-https-certs 2026-07-19 20:01:51 +00:00
Sign in to join this conversation.
No description provided.