Der E2E-Lauf belegt im gebauten Stand, was die Unit- und DB-Tests nur einzeln zeigen: ein Admin speichert SMTP, die Testnachricht kommt ueber den Worker in Mailpit an, das Passwort kehrt nie in die Seite zurueck, und ein Leser sieht keine Aendern-Knoepfe. Die Screenshots (1440/390 px) halten das Layout der neuen Seite fuer die Anleitung fest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.5 KiB
4.5 KiB
#028 Benachrichtigungen
Status: erledigt Meilenstein: v0.5.0 Labels: backend Geschätzt: 2 h Tatsächlich: 0,5 h
Ziel
E-Mail (M365 SMTP) und Webhook bei Drift und Ablauf.
Aufgaben
- Einstellungsseite
/einstellungenstatt Platzhalter: lesen alle Rollen, ändern nureinstellungenVerwalten(Admin). Abschnitte „Benachrichtigungen“, „Abgleich“ (Zeitpläne ausSSHKV_SYNC_CRON/SSHKV_MELDUNG_CRON, nur Anzeige) und „Instanz“ (Version, Deployment-Key-Fingerprint, OIDC-Anbieter, TOTP des Notfall-Admins). Platz für „Syslog“ markiert. - Kanal E-Mail (SMTP): Vorbelegung Microsoft 365 (
smtp.office365.com:587, STARTTLS), wahlweise TLS (465) oder unverschlüsselt (nur internes Relay, mit Warnung); Absender, Benutzer, Passwort, Empfängerliste. - Kanal Webhook: JSON per POST, optional
X-Sshkv-Signatur: sha256=<HMAC>über den Body; nurhttps://,http://nur per Häkchen mit Warnung; keine Weiterleitungen, Zeitlimit 15 s. - Geheimnisse (SMTP-Passwort, Webhook-Geheimnis) mit
verschluesseln()inEinstellung; die Oberfläche bekommt nur „gesetzt“, leeres Feld behält, Häkchen entfernt. - „Testnachricht senden“ je Kanal als Vorgang
BENACHRICHTIGUNG_TESTim Worker. - Anlässe (je einzeln schaltbar): neue Abweichungen je Host, Ablauf in 30/14/7 Tagen,
abgelaufen aber ausgerollt, Host nicht erreichbar – gesammelt in der täglichen Zusammenfassung
(
SSHKV_MELDUNG_CRON, Standard0 7 * * *); geänderter Host-Key sofort (Takt alle 5 Minuten). - Versandprotokoll
Zustellung(Migration20261012161000_benachrichtigungen) mit Anlass-Fingerabdruck, Kanal, Ergebnis, Fehler, Versuchen; Prüfung vor jedem Versand, Wiederholung nach 5/10/20/40 Minuten (höchstens 5 Versuche); „Letzte Zustellungen“ auf der Seite. - Jede Zustellung in
protokollieren()alsbenachrichtigung.gesendet/…fehlgeschlagen(Empfänger nur gezählt, Webhook nur Schema und Host). - Zeitpläne in
src/worker/index.ts;.env.exampleunddocker-compose.ymlergänzt. - Tests: Unit (Nachrichtenaufbau, Signatur, Stufen, Deduplizierung, Prüfungen), DB
(Einstellungen, Versandprotokoll), Integration gegen Mailpit und lokalen HTTP-Empfänger,
E2E
tests/e2e/einstellungen.spec.ts; Screenshotseinstellungen-desktop/-mobil.
Akzeptanzkriterien
- Admin speichert SMTP-Einstellungen, die Testnachricht kommt in Mailpit an (E2E).
- Das Passwort steht nie im Klartext in Datenbank, Protokoll oder Seite; das Feld zeigt nur „gesetzt“.
- Leser sieht die Seite ohne Ändern- und Test-Knöpfe.
- Dieselbe Abweichung, dieselbe Ablaufstufe und derselbe Ausfall werden je Kanal genau einmal gemeldet.
- Fehlgeschlagene Zustellungen werden begrenzt wiederholt und sind in der Oberfläche sichtbar.
- Ein geänderter Host-Key wird innerhalb von fünf Minuten gemeldet, ohne den Abgleich-Ablauf zu ändern.
Abhängigkeiten
#021
Notizen / Entscheidungen
- Versand im Worker, auch für die Testnachricht: der Webprozess braucht so keinen Weg zu
Mailserver oder Webhook-Ziel, und regulärer Versand und Test laufen über denselben Code. Die
Oberfläche verfolgt den Test wie andere Vorgänge über
VorgangsKnopf. - Anlässe aus der Datenbank, nicht aus dem Abgleich:
src/worker/ablaeufe/abgleich.tsbleibt unverändert; der Sammler liest offeneAbweichung,Host.erreichbar = falseund Ablaufdaten. Ein verpasster Lauf holt sich der nächste. - Fingerabdrücke:
drift:<abweichungId>,hostkey:<abweichungId>,ablauf:<schluesselId>:<stufe>:<ablaufdatum>(mit Datum, damit ein verlängerter Schlüssel neu erinnert wird),abgelaufen:<schluesselId>:<ablaufdatum>,unerreichbar:<hostId>:<letzterAbgleichAm>(ändert sich nur bei gelungenem Abgleich → eine Meldung je Ausfall). Statt „seit der letzten Meldung“ zählt das Versandprotokoll – wer Benachrichtigungen erstmals einschaltet, bekommt die offenen Abweichungen einmal gemeldet. - Hosts mit offenem
HOSTKEY_GEAENDERTerscheinen nicht zusätzlich als „nicht erreichbar“. - Der Fünf-Minuten-Takt verschickt dringende Host-Key-Meldungen und fällige Wiederholungen; Neues aus (a)–(d) wartet auf die Zusammenfassung. Läufe im selben Worker laufen nacheinander.
- Leser sehen statt der Webhook-Adresse nur Schema und Host (Tokens im Pfad).
- Mailpit für Tests mit
MP_SMTP_DISABLE_RDNS=truestarten, sonst wartet es je Verbindung 5 s. nodemailer@10.0.10wie in ProxLedger, exakt gepinnt.