cms.c2sgmbh/docs/anleitungen/TODO.md
Martin Porwoll 63b97c14f2 feat(security): enhance CSRF, IP allowlist, and rate limiter with strict production checks
- CSRF: Require CSRF_SECRET in production, throw error on missing secret
- IP Allowlist: TRUST_PROXY must be explicitly set to 'true' for proxy headers
- Rate Limiter: Add proper proxy trust handling for client IP detection
- Login: Add browser form redirect support with safe URL validation
- Add custom admin login page with styled form
- Update CLAUDE.md with TRUST_PROXY documentation
- Update tests for new security behavior

BREAKING: Server will not start in production without CSRF_SECRET or PAYLOAD_SECRET

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 05:06:15 +00:00

9.7 KiB

To-Do-Liste - Payload CMS Multi-Tenant Projekt

Server: sv-payload (LXC 700) - 10.10.181.100 Frontend-Tasks: Siehe FRONTEND.md (sv-frontend, LXC 704)


Zusammenfassung: Offene Tasks (Payload-Server)

Hohe Priorität

Status Task Bereich
[ ] SMTP-Credentials in .env konfigurieren E-Mail

Mittlere Priorität

Status Task Bereich
[ ] Media-Backup zu S3/MinIO Backup
[ ] CDN-Integration (Cloudflare) Caching
[x] CI/CD Pipeline erweitern (Lint/Test/Build) DevOps
[x] Security Scanning (CodeQL, Dependency Audit) DevOps
[x] Staging-Deployment DevOps
[x] Memory-Problem lösen (Swap) Infrastruktur
[ ] PM2 Cluster Mode testen Infrastruktur
[ ] Payload/Next Releases auf Next.js 16 Support beobachten (siehe framework-monitoring.md) Tech Debt

Niedrige Priorität

Status Task Bereich
[ ] Monitoring: Sentry, Prometheus, Grafana Monitoring
[x] AuditLogs Retention (90 Tage Cron) Data Retention
[x] Email-Log Cleanup Cron Data Retention
[x] Media-Orphan-Cleanup Data Retention
[x] Consent-Logs Archivierung Data Retention
[ ] Dashboard-Widget für Email-Status Admin UX
[ ] TypeScript Strict Mode Tech Debt
[x] E2E Tests für kritische Flows Testing

Dokumentation

Status Task
[ ] DEPLOYMENT.md erstellen

Legende

  • Offen
  • Erledigt
  • [~] In Bearbeitung
  • [!] Hohe Priorität
  • [→] Ausgelagert (siehe FRONTEND.md)

Offene Aufgaben

Hohe Priorität

  • SMTP-Credentials in .env konfigurieren
    • Echte SMTP-Zugangsdaten für Produktion hinterlegen

Mittlere Priorität

Analytics Integration

  • Umami Analytics (cookieless, ohne Consent)

    • Umami-Server auf sv-analytics (10.10.181.103) einrichten
    • Website-IDs für alle 4 Tenants in Umami erstellen
    • src/config/analytics.ts mit Website-IDs anlegen
    • src/components/analytics/UmamiScript.tsx implementieren
    • Umami Script in Root Layout einbinden (Multi-Tenant)
    • src/hooks/useAnalytics.ts Hook für Custom Events
    • src/lib/analytics.server.ts für Server-Side Events
    • Event-Tracking in Newsletter-Formular integrieren
    • Event-Tracking in CTA-Buttons integrieren
    • TrackedButton & TrackedDownload Komponenten erstellen
  • Google Ads Conversion (mit Consent)

    • src/components/analytics/GoogleConsentMode.tsx implementieren
    • Google Consent Mode v2 mit Orestbida Cookie-Banner integrieren
    • src/hooks/useGclid.ts Hook für GCLID-Erfassung
    • src/lib/google-ads.ts Client-Side Conversion Tracking
    • src/lib/google-ads.server.ts Server-Side Conversion API
    • Enhanced Conversions mit gehashten E-Mails
  • Cookie Inventory

    • Google Ads Cookies (_gcl_au, _gcl_aw, IDE) zur Cookie Inventory Collection hinzufügen
  • Environment Variables

    • NEXT_PUBLIC_UMAMI_HOST in .env.local
    • NEXT_PUBLIC_GOOGLE_ADS_ID in .env.local (pro Tenant)
    • UMAMI_HOST, UMAMI_WEBSITE_ID in Backend .env
    • Google Ads API Credentials in Backend .env
  • CDN-Integration (Cloudflare)

  • [~] Backup-System

    • Media-Backup zu S3/MinIO
    • Disaster Recovery Plan

Niedrige Priorität

  • Monitoring & Logging
    • Sentry Error Tracking
    • Prometheus Metrics
    • Grafana Dashboard

Build & Infrastructure

  • Memory-Problem lösen (erledigt: 4GB Swap via ZFS ZVOL auf Proxmox Host)

    • Swap auf Server aktivieren (4GB)
    • Container Swap-Limit konfiguriert (pct set 700 -swap 4096)
  • PM2 Cluster Mode

    • Multi-Instanz Konfiguration testen
    • Shared State via Redis sicherstellen

Testing & CI/CD

  • CI/CD Pipeline (erledigt: .github/workflows/ci.yml)

    • Automatisches Lint/Test/Build Workflow
    • Staging-Deployment (erledigt: .github/workflows/deploy-staging.yml)
  • E2E Tests für kritische Flows (erledigt: tests/e2e/)


Data Retention

  • Automatische Datenbereinigung (erledigt: src/lib/retention/)
    • Cron-Job für Email-Log Cleanup (90 Tage default)
    • AuditLogs Retention Policy (90 Tage)
    • Consent-Logs Archivierung (3 Jahre, expiresAt-basiert)
    • Media-Orphan-Cleanup (30 Tage Mindestalter)

Tenant-spezifische Features

Hinweis: Backend-Collections hier, Frontend-Komponenten in FRONTEND.md

porwoll.de

  • Immobilien-Collection (falls benötigt) (Backend)
  • [→] Objektsuche (Frontend)
  • [→] Kontaktformular mit Objekt-Referenz (Frontend)

complexcaresolutions.de (C2S)

  • [→] Leistungs-Übersicht (Frontend)
  • [→] Karriere-Seite mit Stellenangeboten (Frontend)

gunshin.de / Fotografin-Portfolio

  • [→] Projekt-Galerie Frontend (Frontend)
  • [→] Referenzen-Slider (Frontend)

zweitmein.ng

  • Produkt-Collection (falls E-Commerce) (Backend)
  • [→] Preistabellen (Frontend)

Technische Schulden

  • TypeScript Strict Mode aktivieren
  • E2E Tests für kritische Flows
  • Code-Review für Security-relevante Bereiche (erledigt: 17.12.2025)
  • Performance-Audit der Datenbank-Queries

Dokumentation

  • DEPLOYMENT.md (Deployment-Prozess)

Regelmäßige Wartung

Wöchentlich

  • PM2 Logs prüfen
  • Datenbank-Größe überwachen
  • Media-Storage prüfen

Monatlich

  • Dependencies aktualisieren (pnpm update)
  • Sicherheitsupdates prüfen (pnpm audit)
  • Backup-Restore testen

Quartalsweise

  • Performance-Review
  • Security-Audit
  • Dokumentation aktualisieren

Notizen

Bekannte Probleme

  1. Tenant-Isolation bei localhost: API gibt 403 zurück, wenn kein Tenant zur Domain passt. Das ist gewolltes Verhalten für Multi-Tenant-Sicherheit.

  2. GraphQL Playground deaktiviert: Route wurde entfernt. Bei Bedarf wieder aktivieren.

  3. PM2 Cluster Mode: Aktuell 1 Instanz. Für Skalierung instances: "max" setzen.

Nächste Schritte (Priorisiert)

  1. [MITTEL] Media-Backup zu S3 einrichten
  2. [NIEDRIG] Monitoring (Sentry/Prometheus)
  3. [NIEDRIG] Analytics Integration (Umami)

Kontakte & Ressourcen


Letzte Aktualisierung: 17.12.2025


Changelog

17.12.2025

  • Security Code-Review abgeschlossen:
    • IP Header Spoofing behoben: X-Forwarded-For/X-Real-IP werden nur bei TRUST_PROXY=true vertraut
    • CSRF Secret-Fallback behoben: Server startet nicht ohne CSRF_SECRET oder PAYLOAD_SECRET in Production
    • IP-Allowlist Warnungen: Startup-Warnungen wenn Allowlists leer und allowAllIfEmpty=true
    • Neue Umgebungsvariable: TRUST_PROXY=true (Pflicht hinter Reverse-Proxy)
    • Dateien: src/lib/security/rate-limiter.ts, src/lib/security/ip-allowlist.ts, src/lib/security/csrf.ts
    • Unit Tests und Integration Tests aktualisiert (177 Tests passed)
    • CLAUDE.md Dokumentation aktualisiert

16.12.2025

  • CI/CD Pipeline stabilisiert:
    • Job-Level Timeouts (30 Minuten) für Tests und E2E hinzugefügt
    • Step-Level Timeouts: Unit Tests (10min), Integration Tests (15min), E2E Tests (15min)
    • Vitest testTimeout (30s) und hookTimeout (30s) konfiguriert
    • Verhindert 6-Stunden-Hänger bei fehlgeschlagenen DB-Verbindungen
    • drizzle-kit als Dev-Dependency hinzugefügt (früherer Commit)
    • drizzle-kit push statt Migrations für CI (früherer Commit)

15.12.2025

  • Data Retention System implementiert:
    • Automatische Datenbereinigung für DSGVO-Compliance
    • Email-Logs Cleanup (90 Tage default)
    • AuditLogs Retention (90 Tage default)
    • Consent-Logs Archivierung (3 Jahre, expiresAt-basiert)
    • Media-Orphan-Cleanup (unreferenzierte Dateien)
    • Scheduler: Täglich um 03:00 Uhr via BullMQ
    • API-Endpoint /api/retention für manuellen Trigger
    • Dateien: src/lib/retention/, src/lib/queue/workers/retention-worker.ts
  • E2E Tests stabilisiert:
    • Rate-Limit Handling (429) zu allen API-Tests hinzugefügt
    • networkidle durch domcontentloaded + explizite Waits ersetzt
    • Status-Code-Erwartungen für protected APIs erweitert
    • 105 Tests passed, 7 skipped (vorher 28 failures)
  • Security Scanning Pipeline repariert:
    • CodeQL im GitHub Repository aktiviert (Advanced Setup)
    • Gitleaks durch GitHub Native Secret Scanning ersetzt (423 Patterns)
    • CodeQL Action v3 → v4 aktualisiert
    • 0 Security Vulnerabilities gefunden

14.12.2025

  • Tenant-spezifische Collections implementiert:
    • Bookings Collection für porwoll.de (Fotografie-Buchungen)
    • Certifications Collection für C2S (Zertifizierungen)
    • Projects Collection für gunshin.de (Game-Development-Projekte)
    • BeforeAfterBlock für porwoll.de (Vorher/Nachher Bildvergleich)
    • Migration: 20251214_010000_tenant_specific_collections.ts
    • 28 neue Datenbank-Tabellen erstellt
  • TODO.md bereinigt: Alle erledigten Tasks entfernt

12.12.2025

  • PgBouncer Connection Pooling eingerichtet
  • Unit Tests für Access Control implementiert
  • Rate-Limits auf Redis migriert

11.12.2025

  • Automatisierte Datenbank-Backups eingerichtet
  • Offsite-Backup zu Hetzner Object Storage
  • Dokumentierter Restore-Prozess

10.12.2025

  • Newsletter Double Opt-In implementiert
  • OpenAPI-Dokumentation hinzugefügt
  • Audit-Fixes durchgeführt

09.12.2025

  • Full-Text-Search aktiviert
  • BullMQ Queue-System implementiert
  • PDF-Queue-System implementiert
  • Index-Audit durchgeführt