cms.c2sgmbh/docs/anleitungen/TODO.md
Martin Porwoll fc94531931 feat: implement security hardening module
Security Features:
- Central rate-limiter service with Redis support and memory fallback
  - Predefined limiters: publicApi, auth, email, search, form, strict
  - Automatic cleanup of stale entries
- IP allowlist/blocklist for sensitive endpoints
  - CIDR and wildcard support
  - Configurable via SEND_EMAIL_ALLOWED_IPS, BLOCKED_IPS env vars
- CSRF protection with Double Submit Cookie pattern
  - Token endpoint: GET /api/csrf-token
  - Origin header validation
- Data masking service for sensitive data
  - Automatic redaction of passwords, tokens, API keys
  - Safe logger factory for consistent logging
  - Recursive object masking for audit logs

Secret Scanning:
- Pre-commit hook for local secret detection
- GitHub Actions workflow with Gitleaks and CodeQL
- Gitleaks configuration file
- Dependency vulnerability scanning

Updated:
- /api/send-email now uses central rate-limiter and IP allowlist
- Redis lib exports getRedisClient and isRedisAvailable

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-07 23:04:14 +00:00

15 KiB

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

Legende

  • Offen
  • Erledigt
  • [~] In Bearbeitung
  • [!] Hohe Priorität
  • [?] Klärungsbedarf

Phase 1: Grundlagen (Abgeschlossen)

Infrastruktur

  • Payload CMS 3.x Installation
  • PostgreSQL-Datenbank eingerichtet
  • PM2 Process Manager konfiguriert
  • Caddy Reverse Proxy mit SSL
  • Multi-Tenant Plugin aktiviert
  • Git & GitHub Repository Setup (05.12.2025)

Basis-Collections

  • Users Collection
    • isSuperAdmin Feld hinzugefügt (05.12.2025)
    • Migration erstellt: 20251202_081830_add_is_super_admin_to_users
  • Media Collection
  • Tenants Collection
  • Pages Collection

Globals

  • SiteSettings
  • Navigation

Phase 2: Universal Features (Abgeschlossen)

Collections

  • Posts Collection (Blog, News, Presse, Ankündigungen)
    • Feld type (blog, news, press, announcement)
    • Feld isFeatured
    • Feld excerpt
  • Categories Collection
  • Testimonials Collection
  • Newsletter Subscribers Collection
    • Double Opt-In Support
    • DSGVO-konforme Felder (IP, Timestamps)
  • Social Links Collection

Blocks

  • Hero Block
  • Text Block
  • Image Text Block
  • Card Grid Block
  • Quote Block
  • CTA Block
  • Contact Form Block
  • Video Block
  • Divider Block
  • Timeline Block
  • Posts List Block
  • Testimonials Block
  • Newsletter Block
  • Process Steps Block
  • Cookie Configurations Collection
  • Cookie Inventory Collection
  • Consent Logs Collection
  • Privacy Policy Settings Collection

Phase 3: Offene Aufgaben

Hohe Priorität

  • Tenant-Domains konfigurieren (Erledigt: 07.12.2025)

    • Domains in Tenants Collection eingetragen
    • DNS-Einträge konfiguriert
    • Caddy-Konfiguration (nicht benötigt im Tech-Stack)
  • E-Mail-System (Erledigt: 06.12.2025)

    • Multi-Tenant Email Adapter für Payload CMS
    • Tenant-spezifische SMTP-Konfiguration in Tenants Collection
    • EmailLogs Collection für Protokollierung aller E-Mails
    • REST-Endpoint /api/send-email mit:
      • Authentifizierung & Tenant-Zugriffskontrolle
      • Rate-Limiting (10 E-Mails/Minute pro User)
    • Form-Submission Notifications
    • Cache-Invalidierung bei Config-Änderungen
    • SMTP-Passwort-Schutz (nie in API-Responses)
    • SMTP-Credentials in .env konfigurieren (TODO)
    • Newsletter Double Opt-In E-Mails (TODO)
  • [!] Frontend-Komponenten entwickeln

    • React/Next.js Komponenten für alle Blocks
    • Newsletter-Anmelde-Formular
    • Cookie-Banner implementieren

Mittlere Priorität

  • Bild-Optimierung (Erledigt: 30.11.2025)

    • Sharp Plugin konfiguriert
    • 11 Responsive Image Sizes definiert (thumbnail, small, medium, large, xlarge, 2k, og + AVIF-Varianten)
    • WebP/AVIF Format aktiviert
    • Fokuspunkt-Support
    • Zusätzliche Felder (caption, credit, tags)
    • Dokumentation: docs/anleitungen/BILDOPTIMIERUNG.md
  • SEO-Erweiterungen (Erledigt: 30.11.2025)

    • Sitemap-Generator (/sitemap.xml)
    • robots.txt (/robots.txt)
    • Structured Data (JSON-LD) Helpers
    • SEO Settings Global im Admin-Panel
    • Dokumentation: docs/anleitungen/SEO_ERWEITERUNG.md
  • Suche implementieren (Erledigt: 30.11.2025)

    • Volltextsuche für Posts (/api/search)
    • Filterbare Kategorie-Ansichten (/api/posts?category=...)
    • Auto-Complete Funktion (/api/search/suggestions)
    • Rate Limiting (30 Requests/Minute)
    • TTL-Caching (60 Sekunden)
    • Dokumentation: src/lib/search.ts
  • Mehrsprachigkeit (i18n) (Erledigt: 30.11.2025)

    • Admin UI: Deutsch & Englisch (@payloadcms/translations)
    • Content Localization: DE (default), EN mit Fallback
    • Alle Collections lokalisiert (Pages, Posts, Categories, Testimonials)
    • Alle 14 Blocks lokalisiert
    • Alle Globals lokalisiert (SiteSettings, Navigation, SEOSettings)
    • 36 _locales Tabellen in PostgreSQL
    • Search API mit locale Parameter
    • Frontend Locale Routing (/[locale]/...)
    • Hinweis: Datenbank wurde zurückgesetzt (war leer)

Niedrige Priorität

  • Analytics Integration

    • 1. 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
    • 2. 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
    • 3. Cookie Inventory
      • Google Ads Cookies (_gcl_au, _gcl_aw, IDE) zur Cookie Inventory Collection hinzufügen
    • 4. 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
    • Dokumentation: docs/anleitungen/ANALYTICS_IMPLEMENTATION_GUIDE.md
  • Redis Caching (Erledigt: 05.12.2025)

    • Redis-Cache für API-Responses
    • TTL-basierte Invalidierung
    • Pattern-basierte Cache-Invalidierung
    • CDN-Integration (Cloudflare) (TODO)
  • [~] Backup-System

    • Manuelle Datenbank-Backups (pg_dump)
    • SQL-Dateien in .gitignore
    • Backup via Git (temporär für Migration)
    • Automatische Datenbank-Backups (Cron)
    • Media-Backup zu S3/MinIO
    • Disaster Recovery Plan
    • Backup-Rotation (30 Tage Retention)
  • Monitoring & Logging (→ siehe Phase 4: Produktionsreife)

    • Sentry Error Tracking
    • Prometheus Metrics
    • Grafana Dashboard

Phase 4: Produktionsreife (Audit-basiert)

Basierend auf Audit-Analyse vom 07.12.2025

[!] Hohe Priorität - Stabilität & Sicherheit

Monitoring & Alerting

  • AuditLogs Collection (Erledigt: 07.12.2025)
    • Collection erstellen für: Tenant-Änderungen, Admin-Login, kritische Aktionen
    • Automatisches Logging via Collection Hooks (Users, Tenants)
    • Sensitive Data Masking (Passwörter, Secrets)
    • Retention Policy (90 Tage) - Cron-Job TODO
  • Email-Fehler Alerting (Erledigt: 07.12.2025)
    • Hook bei wiederholten failed-Status in EmailLogs
    • Multi-Channel Alert Service (E-Mail, Slack, Discord, Console)
    • Konfigurierbare Alert-Level (info, warning, error, critical)
    • Dashboard-Widget für Email-Status im Admin
  • Email-Logs Admin-Verbesserungen (Erledigt: 07.12.2025)
    • Filter nach Status (pending/sent/failed) im Admin
    • Export-Endpoint für Email-Logs (CSV/JSON) - /api/email-logs/export
    • Statistik-Endpoint (letzte 24h/7d/30d) - /api/email-logs/stats

Backup & Recovery

  • Automatisierte Datenbank-Backups
    • Cron-Job für tägliche pg_dump
    • Offsite-Storage (S3/MinIO)
    • Backup-Rotation (30 Tage Retention)
    • Dokumentierter Restore-Prozess
  • Media-Backup
    • S3/MinIO Integration für Media-Uploads
    • Versionierung aktivieren
    • Sync-Script für Offsite-Backup

Security Hardening

  • API-Schutz erweitern (Erledigt: 07.12.2025)
    • Globales Rate-Limiting für alle öffentlichen Endpoints
      • Zentraler Rate-Limiter Service (src/lib/security/rate-limiter.ts)
      • Vordefinierte Limiter: publicApi (60/min), auth (5/15min), email (10/min), search (30/min), form (5/10min)
      • Redis-Support für verteilte Systeme mit In-Memory-Fallback
    • IP-Allowlist Option für /api/send-email
      • Konfiguration via SEND_EMAIL_ALLOWED_IPS env
      • Unterstützt IPs, CIDRs und Wildcards
      • Globale Blocklist via BLOCKED_IPS env
    • CSRF-Schutz für Browser-basierte API-Calls
      • Double Submit Cookie Pattern
      • Origin-Header-Validierung
      • Token-Endpoint: GET /api/csrf-token
  • Sensitive Data Masking (Erledigt: 07.12.2025)
    • Zentraler Data-Masking-Service (src/lib/security/data-masking.ts)
    • Automatische Maskierung von Passwörtern, Tokens, API-Keys
    • Safe-Logger-Factory für konsistentes Logging
    • Rekursive Object-Maskierung für Audit-Logs
  • Secrets Scanning (Erledigt: 07.12.2025)
    • Pre-commit Hook für Secret-Detection (scripts/detect-secrets.sh)
    • GitHub Actions Workflow für Gitleaks und CodeQL
    • Gitleaks-Konfiguration (.gitleaks.toml)
    • Dependency Vulnerability Scanning

Mittlere Priorität - Performance & Skalierung

Search Performance

  • Full-Text-Search aktivieren
    • USE_FTS=true in Production setzen
    • PostgreSQL to_tsvector-Indices erstellen
    • Performance-Test mit Produktionsdaten
  • Redis-Migration für Caches
    • Search-Cache von In-Memory auf Redis migrieren
    • Rate-Limit-Maps auf Redis migrieren
    • Suggestions-Cache auf Redis

Background Jobs

  • Queue-System implementieren
    • BullMQ oder Agenda.js evaluieren
    • E-Mail-Versand über Queue (non-blocking)
    • PDF-Generierung über Queue
    • Job-Dashboard im Admin

Database Optimization

  • Index-Audit
    • Composite-Indices für lokalisierte Felder (slug + locale)
    • Query-Performance-Analyse
    • EXPLAIN ANALYZE für häufige Queries
  • Connection Pooling
    • PgBouncer evaluieren für Multi-Instanz-Betrieb

Build & Infrastructure

  • Memory-Problem lösen
    • Swap auf Server aktivieren (2-4GB)
    • Alternativ: Build auf separatem Runner
  • PM2 Cluster Mode
    • Multi-Instanz Konfiguration testen
    • Shared State via Redis sicherstellen

Niedrige Priorität - Developer Experience & UX

Testing & CI/CD

  • Test-Suite reparieren
    • Test-DB mit Migrationen aufsetzen
    • Skipped Tests aktivieren (email-logs, i18n)
    • Coverage-Report generieren
  • CI/CD Pipeline
    • GitHub Actions Workflow erstellen
    • Automatisches Lint/Test/Build
    • Secrets-Scanning in Pipeline
    • Staging-Deployment

Admin UX

  • Tenant-Wechsel UI
    • Dropdown in Admin-Leiste für schnellen Tenant-Wechsel
    • Tenant-Kontext in Breadcrumbs anzeigen
  • Email-Konfiguration UX
    • Formularvalidierung für SMTP-Settings
    • Tooltips für SPF/DKIM-Hinweise
    • "Test-Email senden" Button
  • Tenant Self-Service
    • API für Tenant-Admins zum Testen der SMTP-Settings
    • Email-Logs Einsicht für eigenen Tenant
    • Eigene Statistiken Dashboard

Data Retention

  • Automatische Datenbereinigung
    • Cron-Job für Email-Log Cleanup (älter als X Tage)
    • Consent-Logs Archivierung
    • Media-Orphan-Cleanup

Phase 5: Tenant-spezifische Features

porwoll.de

  • Immobilien-Collection (falls benötigt)
  • Objektsuche
  • Kontaktformular mit Objekt-Referenz

complexcaresolutions.de (C2S)

  • Team-Collection
  • Leistungs-Übersicht
  • Karriere-Seite mit Stellenangeboten

gunshin.de / Fotografin-Portfolio

  • Portfolio-Categories Collection (Erledigt: 06.12.2025)
    • Name, Slug, Beschreibung (lokalisiert)
    • Cover-Bild, Reihenfolge, Aktiv-Status
  • Portfolios Collection (Erledigt: 06.12.2025)
    • Titel, Beschreibung, Excerpt (lokalisiert)
    • Kategorie-Beziehung
    • Cover-Bild + Galerie-Bilder mit Captions
    • Projekt-Details (Kunde, Ort, Datum, Ausrüstung)
    • Status (draft/published/archived)
    • isFeatured, SEO-Felder
  • Projekt-Galerie Frontend
  • Referenzen-Slider

zweitmein.ng

  • Produkt-Collection (falls E-Commerce)
  • FAQ-Collection
  • Preistabellen

Technische Schulden

  • TypeScript Strict Mode aktivieren
  • Unit Tests für Access Control
  • E2E Tests für kritische Flows
  • API-Dokumentation automatisch generieren (OpenAPI)
  • Code-Review für Security-relevante Bereiche
  • Performance-Audit der Datenbank-Queries

Dokumentation

  • CLAUDE.md (Projekt-Übersicht)
  • UNIVERSAL_FEATURES.md (Collections & Blocks)
  • API_ANLEITUNG.md (REST API Guide)
  • TODO.md (Diese Datei)
  • BILDOPTIMIERUNG.md (Sharp & Image Sizes)
  • SEO_ERWEITERUNG.md (SEO Features)
  • ANALYTICS_IMPLEMENTATION_GUIDE.md (Umami & Google Ads)
  • Techstack_Dokumentation_12_2025.md (Infrastruktur & Deployment)
  • DEPLOYMENT.md (Deployment-Prozess)
  • FRONTEND_INTEGRATION.md (Next.js Guide)
  • SECURITY.md (Sicherheitsrichtlinien)

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. [KRITISCH] AuditLogs Collection implementieren
  2. [KRITISCH] Automatisierte Backups einrichten
  3. [HOCH] Full-Text-Search aktivieren (USE_FTS=true)
  4. [HOCH] Rate-Limits auf Redis migrieren
  5. [MITTEL] CI/CD Pipeline mit GitHub Actions
  6. [MITTEL] Frontend-Entwicklung starten
  7. [NIEDRIG] Admin UX Verbesserungen

Kontakte & Ressourcen


Letzte Aktualisierung: 07.12.2025 (Security Hardening implementiert)