Files
coding-starter/docs/decisions/2026-04-17-redis-pii.md

33 lines
1.5 KiB
Markdown

# ADR: recipientEmail in BullMQ-Jobs
**Datum:** 2026-04-17
**Status:** Akzeptiert
## Kontext
BullMQ-Jobs im `email-send`-Queue enthalten `recipientEmail` im Klartext. SMTP benötigt die Klartext-E-Mail-Adresse als Empfängeradresse — ohne sie kann keine E-Mail zugestellt werden.
## Entscheidung
`recipientEmail` verbleibt im Klartext in den Job-Daten. Redis läuft ausschließlich intern (kein öffentlicher Port, Docker-internes Netzwerk, Hetzner DE).
Risikominimierung durch bestehende Maßnahmen:
- `removeOnComplete: 100` — abgeschlossene Jobs werden nach 100 Einträgen bereinigt
- `removeOnFail: { count: 500 }` — fehlgeschlagene Jobs werden begrenzt
- `recipientHash` (SHA256) wird für alle Analytics-Events genutzt — kein Klartext in ClickHouse
## Abgelehnete Alternativen
**E-Mail-Adresse zur Laufzeit aus DB laden:** Worker enthält nur `subscriberId`, lädt E-Mail aus PostgreSQL. Nachteil: zusätzliche DB-Abfrage pro Job, komplexerer Fehlerfall bei DB-Ausfall während des Versands.
**Redis Encryption-at-rest:** Technisch möglich (Redis 7 + verschlüsselte RDB-Snapshots). Infra-Aufgabe, nicht im Anwendungscode lösbar.
## Akzeptiertes Risiko
Bei einem Redis-Dump-Leak wären E-Mail-Adressen sichtbar. Wahrscheinlichkeit gering (internes Netz, kein öffentlicher Zugriff).
## Offene Maßnahmen
- Infra-Ticket erstellen: Redis-Encryption-at-rest auf Hetzner konfigurieren
- Redis-Port darf nie in `docker-compose.yml` nach außen exponiert werden