- 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>
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 |
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
.envkonfigurieren- 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.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
-
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
-
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
-
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)
- [MITTEL] Media-Backup zu S3 einrichten
- [NIEDRIG] Monitoring (Sentry/Prometheus)
- [NIEDRIG] Analytics Integration (Umami)
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: 17.12.2025
Changelog
17.12.2025
- Security Code-Review abgeschlossen:
- IP Header Spoofing behoben:
X-Forwarded-For/X-Real-IPwerden nur beiTRUST_PROXY=truevertraut - CSRF Secret-Fallback behoben: Server startet nicht ohne
CSRF_SECREToderPAYLOAD_SECRETin 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
- IP Header Spoofing behoben:
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/retentionfü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
networkidledurchdomcontentloaded+ 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