- Add AuditLogs collection for tracking critical system actions - User changes (create, update, delete) - Tenant changes with sensitive data masking - Login events tracking - Add Alert Service with multi-channel support - Email, Slack, Discord, Console channels - Configurable alert levels (info, warning, error, critical) - Environment-based configuration - Add Email failure alerting - Automatic alerts on repeated failed emails - Per-tenant failure counting with hourly reset - Add Email-Logs API endpoints - GET /api/email-logs/export (CSV/JSON export) - GET /api/email-logs/stats (statistics with filters) - Add audit hooks for Users and Tenants collections - Update TODO.md with completed monitoring tasks 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
14 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)
- GitHub CLI Installation
- Repository erstellt: https://github.com/c2s-admin/cms.c2sgmbh.git
- GitHub Authentifizierung konfiguriert
- .gitignore für sensible Dateien
- Git Remote (HTTPS) konfiguriert
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
- Feld
- 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
Consent Management
- 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-emailmit:- 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
.envkonfigurieren (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
- Sitemap-Generator (
-
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
- Volltextsuche für Posts (
-
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
_localesTabellen in PostgreSQL - Search API mit
localeParameter - Frontend Locale Routing (
/[locale]/...) - Hinweis: Datenbank wurde zurückgesetzt (war leer)
- Admin UI: Deutsch & Englisch (
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.tsmit Website-IDs anlegensrc/components/analytics/UmamiScript.tsximplementieren- Umami Script in Root Layout einbinden (Multi-Tenant)
src/hooks/useAnalytics.tsHook für Custom Eventssrc/lib/analytics.server.tsfü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.tsximplementieren- Google Consent Mode v2 mit Orestbida Cookie-Banner integrieren
src/hooks/useGclid.tsHook für GCLID-Erfassungsrc/lib/google-ads.tsClient-Side Conversion Trackingsrc/lib/google-ads.server.tsServer-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
- 1. Umami Analytics (cookieless, ohne Consent)
-
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
- Hook bei wiederholten
- 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
- Globales Rate-Limiting für alle öffentlichen Endpoints
- IP-Allowlist Option für
/api/send-email - CSRF-Schutz für Browser-basierte API-Calls
- Sensitive Data Masking
- Email-Error-Logs maskieren (keine Secrets in Admin UI)
- SMTP-Passwörter in Logs redacten
- Secrets Scanning
- Pre-commit Hook für Secret-Detection
- GitHub Secret Scanning aktivieren
Mittlere Priorität - Performance & Skalierung
Search Performance
- Full-Text-Search aktivieren
USE_FTS=truein 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
-
Tenant-Isolation bei localhost: API gibt 403 zurück, wenn kein Tenant zur Domain passt. Das ist gewolltes Verhalten für Multi-Tenant-Sicherheit.
-
GraphQL Playground deaktiviert: Route wurde entfernt. Bei Bedarf wieder aktivieren.
-
PM2 Cluster Mode: Aktuell 1 Instanz. Für Skalierung
instances: "max"setzen.
Nächste Schritte (Priorisiert)
- [KRITISCH] AuditLogs Collection implementieren
- [KRITISCH] Automatisierte Backups einrichten
- [HOCH] Full-Text-Search aktivieren (USE_FTS=true)
- [HOCH] Rate-Limits auf Redis migrieren
- [MITTEL] CI/CD Pipeline mit GitHub Actions
- [MITTEL] Frontend-Entwicklung starten
- [NIEDRIG] Admin UX Verbesserungen
Kontakte & Ressourcen
- Payload CMS Docs: https://payloadcms.com/docs
- GitHub Issues: https://github.com/payloadcms/payload/issues
- Discord Community: https://discord.com/invite/payload
Letzte Aktualisierung: 07.12.2025 (Monitoring & Alerting implementiert)