- Add BullMQ-based job queue with Redis backend - Implement email worker with tenant-specific SMTP support - Add PDF worker with Playwright for HTML/URL-to-PDF generation - Create /api/generate-pdf endpoint with job status polling - Fix TypeScript errors in Tenants, TenantBreadcrumb, TenantDashboard - Fix type casts in auditAuthEvents and audit-service - Remove credentials from ecosystem.config.cjs (now loaded via dotenv) - Fix ESM __dirname issue with fileURLToPath for PM2 compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
22 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 (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
- Zentraler Rate-Limiter Service (
- IP-Allowlist Option für
/api/send-email- Konfiguration via
SEND_EMAIL_ALLOWED_IPSenv - Unterstützt IPs, CIDRs und Wildcards
- Globale Blocklist via
BLOCKED_IPSenv
- Konfiguration via
- CSRF-Schutz für Browser-basierte API-Calls
- Double Submit Cookie Pattern
- Origin-Header-Validierung
- Token-Endpoint:
GET /api/csrf-token
- Globales Rate-Limiting für alle öffentlichen Endpoints
- 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
- Zentraler Data-Masking-Service (
- 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
- Pre-commit Hook für Secret-Detection (
Mittlere Priorität - Performance & Skalierung
Search Performance
- Full-Text-Search aktivieren (Erledigt: 09.12.2025)
USE_FTS=truein Production gesetzt- PostgreSQL
to_tsvector-Indices erstellt:posts_locales_fts_title_idx(GIN auf title)posts_locales_fts_excerpt_idx(GIN auf excerpt)posts_locales_fts_combined_idx(GIN auf title + excerpt)pages_locales_fts_title_idx(GIN auf title)categories_locales_fts_name_idx(GIN auf name)
- Deutsche Sprachkonfiguration (
germanconfig) - Relevanz-Ranking mit
ts_rank() - Prefix-Suche mit
:*Operator - Fallback auf ILIKE bei
USE_FTS=false
- 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 (Erledigt: 09.12.2025)
- BullMQ oder Agenda.js evaluieren → Empfehlung: BullMQ
- E-Mail-Versand über Queue (non-blocking)
- Queue-Service:
src/lib/queue/queue-service.ts - Email-Job:
src/lib/queue/jobs/email-job.ts - Email-Worker:
src/lib/queue/workers/email-worker.ts - API-Integration:
queued: trueOption in/api/send-email
- Queue-Service:
- PDF-Generierung über Queue (Erledigt: 09.12.2025)
- PDF-Job:
src/lib/queue/jobs/pdf-job.ts - PDF-Service:
src/lib/pdf/pdf-service.ts(Playwright-basiert) - PDF-Worker:
src/lib/queue/workers/pdf-worker.ts - API-Endpoint:
/api/generate-pdf(POST für Generierung, GET für Job-Status) - Unterstützt HTML-zu-PDF und URL-zu-PDF
- PM2-Integration mit konfigurierbaren Workern
- PDF-Job:
- Job-Dashboard im Admin
- Queue-Status:
GET /api/admin/queues(SuperAdmin only) - Queue-Jobs:
GET /api/admin/queues/[name]/jobs - Queue-Actions:
POST /api/admin/queues(pause, resume, clean, drain)
- Queue-Status:
Evaluation BullMQ vs Agenda.js:
Kriterium BullMQ Agenda.js Database Redis ✅ (bereits vorhanden) MongoDB ❌ (neue Dependency) TypeScript Native ✅ Begrenzt ⚠️ Priority Jobs Ja ✅ Nein ❌ Rate Limiting Ja ✅ Nein ❌ Delayed Jobs Ja ✅ Ja ✅ Repeatable Jobs Ja ✅ Ja ✅ UI Dashboard @bull-board ✅ Keine Built-in ❌ Weekly Downloads 1.6M 120K Maintenance Aktiv Weniger aktiv Entscheidung: BullMQ wegen:
- Redis bereits im Stack (keine neue DB)
- Native TypeScript-Unterstützung
- Priority Jobs & Rate Limiting für Multi-Tenant
- @bull-board für Admin-Dashboard
- Höhere Aktivität und Downloads
Implementierungsplan:
pnpm add bullmq @bull-board/api @bull-board/express- Queue-Service (
src/lib/queue/queue-service.ts) - Job-Definitionen (
src/lib/queue/jobs/) - Worker-Script (
scripts/run-queue-worker.ts) - PM2-Integration (separater Prozess)
- Admin-Dashboard Route (
/admin/jobs)
Betroffene Dateien für E-Mail-Queue:
src/lib/email/tenant-email-service.tssrc/app/(payload)/api/send-email/route.tssrc/app/(payload)/api/test-email/route.tssrc/lib/alerting/alert-service.tssrc/hooks/sendFormNotification.ts
Database Optimization
- Index-Audit (Erledigt: 09.12.2025)
- Composite-Indices für lokalisierte Felder (slug + locale)
posts_locales_slug_locale_idxpages_locales_slug_locale_idxcategories_locales_slug_locale_idx
- Query-Performance-Analyse
- EXPLAIN ANALYZE für häufige Queries
- Zusätzliche Performance-Indexes erstellt:
posts_status_tenant_idx(status + tenant)posts_type_tenant_idx(type + tenant)posts_published_at_idx(chronologische Sortierung)posts_is_featured_tenant_idx(partial index)email_logs_status_tenant_idx,email_logs_status_created_at_idxaudit_logs_action_created_at_idxnewsletter_subscribers_status_tenant_idxconsent_logs_created_at_desc_idx
- Composite-Indices für lokalisierte Felder (slug + locale)
- 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
- Security Test Suite (Erledigt: 08.12.2025)
- Unit Tests für Rate-Limiter (
tests/unit/security/rate-limiter.unit.spec.ts) - Unit Tests für CSRF Protection (
tests/unit/security/csrf.unit.spec.ts) - Unit Tests für IP-Allowlist (
tests/unit/security/ip-allowlist.unit.spec.ts) - Unit Tests für Data-Masking (
tests/unit/security/data-masking.unit.spec.ts) - API Integration Tests (
tests/int/security-api.int.spec.ts) - Test Utilities (
tests/helpers/security-test-utils.ts) - Dedicated Script:
pnpm test:security - CI Integration in
.github/workflows/security.yml
- Unit Tests für Rate-Limiter (
- Test-Suite erweitern (Erledigt: 09.12.2025)
- Test-DB mit Migrationen aufsetzen (Locale-Tabellen bereits vorhanden)
- Skipped Tests aktivieren (search, i18n) - alle 9 Tests nun aktiv
- Coverage-Report generieren (
pnpm test:coverage)- Vitest v8 Coverage Provider konfiguriert
- HTML/LCOV/Text Reports in
./coverage/ - Thresholds: 35% lines, 50% functions, 65% branches
- Aktuell: 37.29% lines, 55.55% functions, 71.61% branches
- Audit-Fixes (Erledigt: 10.12.2025)
- Vitest auf 3.2.4 aktualisiert (Version-Warnung entfernt)
payload.create/payload.updateMock intests/int/security-api.int.spec.tsergänzt- 205 Tests laufen fehlerfrei, Coverage-Report ohne Abbrüche
- Kein "
payload.create is not a function" Hinweis mehr im Test-Output
- CI/CD Pipeline
- GitHub Actions Workflow erstellt (security.yml)
- Automatisches Lint/Test/Build Workflow
- Secrets-Scanning in Pipeline
- Staging-Deployment
Admin UX
- Tenant-Wechsel UI (Erledigt: 08.12.2025)
- Dropdown in Admin-Leiste für schnellen Tenant-Wechsel (Multi-Tenant Plugin integriert)
- Tenant-Kontext in Breadcrumbs anzeigen (Custom TenantBreadcrumb Komponente)
- Deutsche Übersetzungen für Tenant-Selector hinzugefügt
- Email-Konfiguration UX (Erledigt: 08.12.2025)
- Formularvalidierung für SMTP-Settings (Host-Format, Port-Bereich, Pflichtfelder)
- Tooltips für SPF/DKIM-Hinweise (aufklappbare Info-Komponente mit Beispielen)
- "Test-Email senden" Button (Custom UI-Komponente + API-Endpoint)
- Tenant Self-Service (Erledigt: 08.12.2025)
- API für Tenant-Admins zum Testen der SMTP-Settings (
/api/test-email) - Email-Logs Einsicht für eigenen Tenant (Tenant-basierter Zugriff bereits vorhanden)
- Eigene Statistiken Dashboard (
/admin/tenant-dashboard)
- API für Tenant-Admins zum Testen der SMTP-Settings (
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)
- SECURITY.md (Sicherheitsrichtlinien) (Erledigt: 08.12.2025)
- DEPLOYMENT.md (Deployment-Prozess)
- FRONTEND_INTEGRATION.md (Next.js Guide)
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✅ Erledigt- [KRITISCH] Automatisierte Backups einrichten
[HOCH] Full-Text-Search aktivieren (USE_FTS=true)✅ Erledigt- [HOCH] Rate-Limits auf Redis migrieren (In-Memory-Fallback funktioniert)
[MITTEL] CI/CD Pipeline mit GitHub Actions✅ security.yml erstellt- [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: 09.12.2025
Changelog
09.12.2025
- Admin Login Fix: Custom Login-Route unterstützt nun
_payloadJSON-Feld aus multipart/form-data (Payload Admin Panel Format) - Dokumentation bereinigt: Obsolete PROMPT_*.md Instruktionsdateien gelöscht
- CLAUDE.md aktualisiert: Security-Features, Test Suite, AuditLogs dokumentiert
- Index-Audit: 12 neue Performance-Indexes für PostgreSQL erstellt
- Composite-Indexes für slug+locale auf posts_locales, pages_locales, categories_locales
- Status/Tenant-Indexes für posts, email_logs, newsletter_subscribers
- Partial Index für Featured Posts
- Chronologische Sortierung für published_at, created_at
10.12.2025
- Audit-Fixes: Vitest auf 3.2.4 aktualisiert, Payload-Mocks im Security-Test ergänzt
09.12.2025 (Fortsetzung)
- Full-Text-Search: PostgreSQL FTS mit GIN-Indexes aktiviert
- 5 FTS-Indexes auf posts_locales, pages_locales, categories_locales
- Deutsche Sprachkonfiguration (
germanconfig) - Relevanz-Ranking mit
ts_rank() - Feature-Flag
USE_FTS=truein .env
- Queue-System Evaluation: BullMQ vs Agenda.js evaluiert
- Empfehlung: BullMQ (Redis-basiert, TypeScript-native, @bull-board UI)
- Implementierungsplan dokumentiert
- Betroffene Dateien identifiziert
- BullMQ Implementation: Vollständiges Queue-System implementiert
- Queue-Service mit Redis-Connection und Job-Optionen
- Email-Job mit Priority, Delay und Batch-Support
- Email-Worker für asynchrone Verarbeitung
- Worker-Script für PM2 (
scripts/run-queue-worker.ts) - PM2-Konfiguration für separaten Worker-Prozess
- Admin-API für Queue-Monitoring (
/api/admin/queues) - Send-Email API mit
queued: trueOption
- Audit-Fixes (BullMQ): FTS und Dependencies bereinigt
- FTS SQL-Fix:
p.published_atzu SELECT hinzugefügt (PostgreSQL DISTINCT-Regel) - Guard für fehlende
payload.db.drizzlein Tests - Ungenutzte
@bull-board/*Packages entfernt (53 Dependencies weniger)
- FTS SQL-Fix:
- PDF-Queue-System: Vollständige PDF-Generierung über BullMQ
- PDF-Job-Definition mit Priority, Delay und Batch-Support
- PDF-Service mit Playwright (HTML-zu-PDF, URL-zu-PDF)
- PDF-Worker für asynchrone Verarbeitung
- REST-API
/api/generate-pdfmit Auth, CSRF, Rate-Limiting - PM2-Integration mit konfigurierbaren Workern (
QUEUE_ENABLE_PDF)