managarten/.claude/plans/mana-core-auth-production-readiness.md
Till-JS fe33f4b355 fix(mana-core-auth): complete production readiness with test fixes
- Fix LoggerService mock in better-auth.service.spec.ts
- Fix name assertion in auth.controller.spec.ts (empty string fallback)
- Fix createRemoteJWKSet mock in jwt-auth.guard.spec.ts
- Add Grafana dashboard for Auth Service monitoring
- Add 10 auth-specific Prometheus alert rules
- Update production readiness plan to 100% complete

All 199 unit tests passing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 14:18:58 +01:00

13 KiB

Mana Core Auth - Production Readiness Plan

Status: Abgeschlossen Erstellt: 2026-02-01 Autor: Claude Code Ziel: Auth-Service produktionsreif machen


Übersicht

Dieses Dokument beschreibt alle Änderungen, die vor dem Go-Live des mana-core-auth Services gemacht werden müssen.

Aktueller Stand: ~50% Production-Ready Geschätzter Aufwand: 2-3 Wochen


Phase 1: Security & Stability (Kritisch)

1.1 Debug-Logging entfernen

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🔴 Kritisch
  • Problem: 122x console.log im Code, teils mit sensiblen Daten (Private Key Prefixe, JWT Tokens)
  • Lösung:
    • Winston LoggerService erstellt (src/common/logger/)
    • LoggerModule global in AppModule integriert
    • Alle Service-Dateien auf strukturiertes Logging umgestellt
    • Sensitive Daten (Private Keys, JWT Tokens) werden nicht mehr geloggt
  • Geänderte Dateien:
    • src/common/logger/logger.service.ts - NEU
    • src/common/logger/logger.module.ts - NEU
    • src/main.ts - Logger integriert
    • src/auth/services/better-auth.service.ts - Alle console.logs ersetzt
    • src/auth/oidc.controller.ts - Alle console.logs ersetzt
    • src/auth/better-auth-passthrough.controller.ts - Alle console.logs ersetzt
    • src/common/guards/jwt-auth.guard.ts - Alle console.logs ersetzt
    • src/email/email.service.ts - Alle console.logs ersetzt
  • Verbleibende console.logs (akzeptabel):
    • CLI-Skripte: migrate.ts, seed-dev-user.ts, seed-oidc-clients.ts
    • Test-Utils: silent-error.decorator.ts

1.2 Environment Variable Validierung

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🔴 Kritisch
  • Problem: Service startet ohne kritische Env-Vars, versagt dann später
  • Lösung:
    • Zod-basierte Validierung erstellt (src/config/env.validation.ts)
    • Validierung läuft bei Startup
    • Klare Fehlermeldungen mit Box-Format
    • Production-spezifische Anforderungen (CORS_ORIGINS, BASE_URL)
    • Warnungen für optionale aber empfohlene Vars (Stripe, SMTP, Redis)
    • Default-Credentials entfernt (nur in Development erlaubt)
    • .env.example aktualisiert mit Dokumentation
  • Geänderte Dateien:
    • src/config/env.validation.ts - NEU
    • src/config/configuration.ts - Nutzt Validierung
    • .env.example - Aktualisiert mit Dokumentation

1.3 Health Checks erweitern

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🔴 Kritisch
  • Problem: Health Check gibt nur {status: 'ok'} zurück, prüft nicht DB/Redis
  • Lösung:
    • Drei Endpoints implementiert:
      • /health - Basic health (uptime)
      • /health/live - Liveness probe (ist der Prozess am Leben?)
      • /health/ready - Readiness probe (DB + Redis check)
    • Database connectivity wird geprüft (SELECT 1)
    • Redis connectivity wird geprüft (TCP connection)
    • Latenz-Messung für Diagnose
    • Dockerfile HEALTHCHECK aktualisiert auf /health/ready
  • Geänderte Dateien:
    • src/health/health.controller.ts - Komplett überarbeitet
    • Dockerfile - HEALTHCHECK aktualisiert

1.4 Rate Limiting per Endpoint

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🔴 Kritisch
  • Problem: Nur globales Limit (100 req/min), Auth-Endpoints ungeschützt
  • Lösung:
    • ThrottlerGuard auf AuthController angewendet
    • /auth/register - 5 req/min
    • /auth/login - 10 req/min
    • /auth/forgot-password - 3 req/min
    • /auth/reset-password - 5 req/min
    • /auth/resend-verification - 3 req/min
    • /auth/register/b2b - 3 req/min
  • Geänderte Datei: src/auth/auth.controller.ts

1.5 Default Credentials entfernen

  • Status: [x] Erledigt (2026-02-01) - Teil von 1.2
  • Priorität: 🟠 Hoch
  • Problem: postgresql://manacore:password@localhost:5432/manacore als Fallback
  • Lösung:
    • In Production: Kein Fallback, DATABASE_URL ist required
    • In Development: Fallback zu manacore_auth Database (nicht manacore)
    • Validierung bei Startup verhindert Start ohne Config
  • Datei: src/config/configuration.ts (bereits in 1.2 geändert)

Phase 2: Operations & Monitoring

2.1 Strukturiertes Logging (Winston)

  • Status: [x] Erledigt (2026-02-01) - Teil von 1.1
  • Priorität: 🟠 Hoch
  • Problem: Alle Logs gehen zu console, kein JSON-Format
  • Lösung:
    • Winston Logger in src/common/logger/ implementiert
    • JSON-Format für Production, lesbares Format für Development
    • Log Levels via LOG_LEVEL Env-Var
    • Context pro Service/Controller
  • Dateien: src/common/logger/logger.service.ts, src/common/logger/logger.module.ts

2.2 Production Deployment Guide

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟠 Hoch
  • Problem: Docker-Entrypoint überspringt Migrations, kein Deployment-Guide
  • Lösung:
    • docs/PRODUCTION_DEPLOYMENT.md erstellt
    • Docker, Docker Compose, Kubernetes Beispiele
    • Migration-Strategie dokumentiert
    • Health Check Konfiguration
    • Security Checklist
  • Datei: docs/PRODUCTION_DEPLOYMENT.md

2.3 Grafana Dashboard & Alerts

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟠 Hoch
  • Problem: Prometheus Metrics existieren, aber keine Visualisierung
  • Lösung:
    • Dediziertes Auth-Service Dashboard erstellt (docker/grafana/dashboards/auth-service.json)
    • Service Health (UP/DOWN, Uptime, CPU, Memory, Event Loop)
    • User Statistics (Total, Verified, New Today/Week/Month, Verification Rate)
    • HTTP Traffic (Request Rate, Latency p50/p95/p99, Status Codes, Error Rates)
    • Authentication Endpoints (Login/Register/Logout/Refresh Activity)
    • Prometheus Alert Rules für Auth-Service (docker/prometheus/alerts.yml)
      • AuthServiceDown (kritisch nach 30s)
      • HighLoginFailureRate (>50%)
      • PossibleBruteForce (>100 failed logins/5min)
      • HighRateLimitHits
      • RegistrationSpike
      • TokenRefreshFailures
      • PasswordResetFlood
      • LowVerificationRate
      • AuthServiceSlow (p95 >500ms)
      • OIDCTokenErrors
  • Geänderte Dateien:
    • docker/grafana/dashboards/auth-service.json - NEU
    • docker/prometheus/alerts.yml - Auth-Alerts hinzugefügt

2.4 Disaster Recovery Dokumentation

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟠 Hoch
  • Problem: Keine Backup/Restore Prozeduren dokumentiert
  • Lösung:
    • docs/DISASTER_RECOVERY.md erstellt
    • Database Backup Scripts
    • Recovery Procedures für verschiedene Szenarien
    • JWKS Key Rotation dokumentiert
    • RTO/RPO definiert
  • Datei: docs/DISASTER_RECOVERY.md

2.5 Error Tracking (Grafana Loki)

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟠 Hoch
  • Problem: Keine Fehler-Aggregation in Production
  • Lösung:
    • Winston Logger schreibt strukturierte JSON-Logs (aus 1.1)
    • Logs können via Promtail/Alloy nach Loki gesendet werden
    • Grafana Dashboard zeigt Errors mit Stack Traces
  • Integration: Winston JSON-Logs → Promtail → Loki → Grafana
  • Alternative Self-Hosted: GlitchTip (Sentry-API-kompatibel)

2.6 Stripe Config Validierung

  • Status: [x] Erledigt (2026-02-01) - Teil von 1.2
  • Priorität: 🟠 Hoch
  • Problem: Credit-System versagt still ohne Stripe Keys
  • Lösung:
    • env.validation.ts gibt Warnung in Production wenn STRIPE_SECRET_KEY fehlt
    • Credit-System funktioniert ohne Stripe (nur Free Credits)
    • Stripe-Integration kann später hinzugefügt werden
  • Datei: src/config/env.validation.ts (bereits in 1.2 geändert)

Phase 3: Testing & Polish

3.1 E2E Tests für OAuth2/OIDC

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟡 Mittel
  • Problem: ~35% Test Coverage, OIDC Flows nicht getestet
  • Lösung:
    • E2E Tests mit Supertest erstellt
    • OIDC Authorization Flow Tests (Discovery, JWKS, Authorize, Token, UserInfo)
    • Token Refresh Tests
    • Auth Flow Tests (Registration, Login, Logout, Session, Validation)
    • Rate Limiting Tests
    • Security Tests (redirect_uri validation, token validation)
  • Neue Dateien:
    • test/e2e/oidc.e2e-spec.ts - OIDC Provider Tests
    • test/e2e/auth-flow.e2e-spec.ts - Authentication Flow Tests
  • Hinweis: Tests erfordern DATABASE_URL für Ausführung

3.2 OpenAPI/Swagger Dokumentation

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟡 Mittel
  • Problem: Keine API-Dokumentation
  • Lösung:
    • @nestjs/swagger zu dependencies hinzugefügt
    • Swagger in main.ts konfiguriert
    • /api-docs Endpoint unter http://localhost:3001/api-docs
    • DTOs mit ApiProperty decorators (register, login)
    • Controller mit ApiTags, ApiOperation, ApiResponse (auth, health)
    • JWT Bearer Auth im Swagger UI konfiguriert
  • Geänderte Dateien:
    • package.json - @nestjs/swagger hinzugefügt
    • src/main.ts - Swagger Konfiguration
    • src/auth/auth.controller.ts - API Decorators
    • src/auth/dto/register.dto.ts - ApiProperty
    • src/auth/dto/login.dto.ts - ApiProperty
    • src/health/health.controller.ts - API Decorators

3.3 Docker Optimierung

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟡 Mittel
  • Problem: Source code kopiert, tsx in prod, kein .dockerignore
  • Lösung:
    • .dockerignore erstellt (node_modules, tests, docs, IDE files)
    • tsx aus Production entfernt (Migrations laufen extern)
    • Source code wird nicht mehr kopiert (nur dist/)
    • Multi-stage Build optimiert
  • Geänderte Dateien:
    • .dockerignore - NEU
    • Dockerfile - Optimiert

3.4 Dependency Cleanup

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟡 Mittel
  • Problem: jsonwebtoken UND jose (nur jose nötig laut CLAUDE.md)
  • Lösung:
    • jsonwebtoken aus dependencies entfernt
    • @types/jsonwebtoken aus devDependencies entfernt
    • RS256 Fallback aus better-auth.service.ts entfernt
    • JWT-Tests auf jose Mock umgestellt
    • jose Mock implementiert für Jest (ESM-Kompatibilität)
  • Geänderte Dateien:
    • package.json - jsonwebtoken entfernt
    • src/auth/services/better-auth.service.ts - Fallback entfernt
    • src/auth/jwt-validation.spec.ts - jose statt jsonwebtoken
    • test/__mocks__/jose.ts - NEU (HS256 Mock für Tests)

3.5 Security Scanning in CI/CD

  • Status: [x] Erledigt (2026-02-01)
  • Priorität: 🟡 Mittel
  • Problem: Keine automatische Security-Prüfung
  • Lösung:
    • pnpm audit --audit-level=high in CI (validate job)
    • Dependabot bereits konfiguriert (npm, github-actions, docker)
    • Warnung für bekannte vulnerable Pakete (lodash, axios)
  • Geänderte Datei: .github/workflows/ci.yml
  • Existierende Datei: .github/dependabot.yml (war bereits vorhanden)

Fortschritt

Phase Aufgaben Erledigt Fortschritt
Phase 1 5 5 100%
Phase 2 6 6 100%
Phase 3 5 5 100%
Gesamt 16 16 100%

Status: PRODUCTION READY


Changelog

Datum Änderung
2026-02-01 Plan erstellt
2026-02-01 1.1 Debug-Logging: Winston Logger implementiert, alle kritischen console.logs ersetzt
2026-02-01 1.2 Env-Validierung: Zod-Schema, Production-Requirements, .env.example aktualisiert
2026-02-01 1.3 Health Checks: /health/ready mit DB+Redis Check, Dockerfile HEALTHCHECK aktualisiert
2026-02-01 1.4 Rate Limiting: Per-Endpoint Limits für alle Auth-Endpoints
2026-02-01 1.5 Default Credentials: Nur in Development erlaubt (Teil von 1.2)
2026-02-01 2.1 Strukturiertes Logging: Bereits in 1.1 erledigt
2026-02-01 2.2 Production Deployment Guide erstellt
2026-02-01 2.4 Disaster Recovery Dokumentation erstellt
2026-02-01 2.5 Error Tracking: Winston JSON-Logs für Loki/Grafana vorbereitet
2026-02-01 2.6 Stripe Validierung: Warnung in env.validation.ts (Teil von 1.2)
2026-02-01 3.3 Docker Optimierung: .dockerignore, tsx entfernt, nur dist/ kopiert
2026-02-01 3.4 Dependency Cleanup: jsonwebtoken entfernt, jose Mock für Tests
2026-02-01 3.5 Security Scanning: pnpm audit in CI, Dependabot war bereits aktiv
2026-02-01 3.2 OpenAPI/Swagger: API-Dokumentation unter /api-docs verfügbar
2026-02-01 3.1 E2E Tests: OIDC + Auth Flow Tests erstellt (oidc.e2e-spec.ts, auth-flow.e2e-spec.ts)
2026-02-01 2.3 Grafana Dashboard + Alerts: auth-service.json Dashboard, 10 Auth-spezifische Alert Rules
2026-02-01 Test-Fixes: LoggerService Mock in better-auth.service.spec.ts, name assertion in auth.controller.spec.ts, createRemoteJWKSet Mock in jwt-auth.guard.spec.ts
2026-02-01 PLAN ABGESCHLOSSEN - 100% Production Ready (199/199 Unit Tests bestanden)