E-Mail (M365 SMTP) und Webhook bei Drift und Ablauf.
Aufgaben
Einstellungsseite /einstellungen statt Platzhalter: lesen alle Rollen, ändern nur einstellungenVerwalten (Admin). Abschnitte „Benachrichtigungen“, „Abgleich“ (Zeitpläne aus SSHKV_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; nur https://, http:// nur per Häkchen mit Warnung; keine Weiterleitungen, Zeitlimit 15 s.
Geheimnisse (SMTP-Passwort, Webhook-Geheimnis) mit verschluesseln() in Einstellung;
die Oberfläche bekommt nur „gesetzt“, leeres Feld behält, Häkchen entfernt.
„Testnachricht senden“ je Kanal als Vorgang BENACHRICHTIGUNG_TEST im 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, Standard 0 7 * * *); geänderter Host-Key sofort (Takt alle 5 Minuten).
Versandprotokoll Zustellung (Migration 20261012161000_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() als benachrichtigung.gesendet/…fehlgeschlagen
(Empfänger nur gezählt, Webhook nur Schema und Host).
Zeitpläne in src/worker/index.ts; .env.example und docker-compose.yml ergä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; Screenshots einstellungen-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.
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.ts bleibt
unverändert; der Sammler liest offene Abweichung, Host.erreichbar = false und 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_GEAENDERT erscheinen 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=true starten, sonst wartet es je Verbindung 5 s.
nodemailer@10.0.10 wie in ProxLedger, exakt gepinnt.
Quelle: docs/issues/028-benachrichtigungen.md – dort wird dieses Issue gepflegt.
## Ziel
E-Mail (M365 SMTP) und Webhook bei Drift und Ablauf.
## Aufgaben
- [x] Einstellungsseite `/einstellungen` statt Platzhalter: lesen alle Rollen, ändern nur
`einstellungenVerwalten` (Admin). Abschnitte „Benachrichtigungen“, „Abgleich“ (Zeitpläne aus
`SSHKV_SYNC_CRON`/`SSHKV_MELDUNG_CRON`, nur Anzeige) und „Instanz“ (Version,
Deployment-Key-Fingerprint, OIDC-Anbieter, TOTP des Notfall-Admins). Platz für „Syslog“ markiert.
- [x] 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.
- [x] Kanal Webhook: JSON per POST, optional `X-Sshkv-Signatur: sha256=<HMAC>` über den Body; nur
`https://`, `http://` nur per Häkchen mit Warnung; keine Weiterleitungen, Zeitlimit 15 s.
- [x] Geheimnisse (SMTP-Passwort, Webhook-Geheimnis) mit `verschluesseln()` in `Einstellung`;
die Oberfläche bekommt nur „gesetzt“, leeres Feld behält, Häkchen entfernt.
- [x] „Testnachricht senden“ je Kanal als Vorgang `BENACHRICHTIGUNG_TEST` im Worker.
- [x] 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`, Standard `0 7 * * *`); geänderter Host-Key sofort (Takt alle 5 Minuten).
- [x] Versandprotokoll `Zustellung` (Migration `20261012161000_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.
- [x] Jede Zustellung in `protokollieren()` als `benachrichtigung.gesendet`/`…fehlgeschlagen`
(Empfänger nur gezählt, Webhook nur Schema und Host).
- [x] Zeitpläne in `src/worker/index.ts`; `.env.example` und `docker-compose.yml` ergänzt.
- [x] 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`; Screenshots `einstellungen-desktop/-mobil`.
## Akzeptanzkriterien
- [x] Admin speichert SMTP-Einstellungen, die Testnachricht kommt in Mailpit an (E2E).
- [x] Das Passwort steht nie im Klartext in Datenbank, Protokoll oder Seite; das Feld zeigt nur „gesetzt“.
- [x] Leser sieht die Seite ohne Ändern- und Test-Knöpfe.
- [x] Dieselbe Abweichung, dieselbe Ablaufstufe und derselbe Ausfall werden je Kanal genau einmal gemeldet.
- [x] Fehlgeschlagene Zustellungen werden begrenzt wiederholt und sind in der Oberfläche sichtbar.
- [x] 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.ts` bleibt
unverändert; der Sammler liest offene `Abweichung`, `Host.erreichbar = false` und 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_GEAENDERT` erscheinen 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=true` starten, sonst wartet es je Verbindung 5 s.
- `nodemailer@10.0.10` wie in ProxLedger, exakt gepinnt.
---
Quelle: `docs/issues/028-benachrichtigungen.md` – dort wird dieses Issue gepflegt.
florian.wilde
added this to the v0.5.0 milestone 2026-10-12 15:12:49 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ziel
E-Mail (M365 SMTP) und Webhook bei Drift und Ablauf.
Aufgaben
/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.
smtp.office365.com:587, STARTTLS), wahlweiseTLS (465) oder unverschlüsselt (nur internes Relay, mit Warnung); Absender, Benutzer, Passwort,
Empfängerliste.
X-Sshkv-Signatur: sha256=<HMAC>über den Body; nurhttps://,http://nur per Häkchen mit Warnung; keine Weiterleitungen, Zeitlimit 15 s.verschluesseln()inEinstellung;die Oberfläche bekommt nur „gesetzt“, leeres Feld behält, Häkchen entfernt.
BENACHRICHTIGUNG_TESTim Worker.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).Zustellung(Migration20261012161000_benachrichtigungen) mitAnlass-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.
protokollieren()alsbenachrichtigung.gesendet/…fehlgeschlagen(Empfänger nur gezählt, Webhook nur Schema und Host).
src/worker/index.ts;.env.exampleunddocker-compose.ymlergänzt.(Einstellungen, Versandprotokoll), Integration gegen Mailpit und lokalen HTTP-Empfänger,
E2E
tests/e2e/einstellungen.spec.ts; Screenshotseinstellungen-desktop/-mobil.Akzeptanzkriterien
Abhängigkeiten
#021
Notizen / Entscheidungen
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.src/worker/ablaeufe/abgleich.tsbleibtunverändert; der Sammler liest offene
Abweichung,Host.erreichbar = falseund Ablaufdaten.Ein verpasster Lauf holt sich der nächste.
drift:<abweichungId>,hostkey:<abweichungId>,ablauf:<schluesselId>:<stufe>:<ablaufdatum>(mit Datum, damit ein verlängerter Schlüssel neuerinnert wird),
abgelaufen:<schluesselId>:<ablaufdatum>,unerreichbar:<hostId>:<letzterAbgleichAm>(ändert sich nur bei gelungenem Abgleich → eine Meldungje Ausfall). Statt „seit der letzten Meldung“ zählt das Versandprotokoll – wer Benachrichtigungen
erstmals einschaltet, bekommt die offenen Abweichungen einmal gemeldet.
HOSTKEY_GEAENDERTerscheinen nicht zusätzlich als „nicht erreichbar“.Neues aus (a)–(d) wartet auf die Zusammenfassung. Läufe im selben Worker laufen nacheinander.
MP_SMTP_DISABLE_RDNS=truestarten, sonst wartet es je Verbindung 5 s.nodemailer@10.0.10wie in ProxLedger, exakt gepinnt.Quelle:
docs/issues/028-benachrichtigungen.md– dort wird dieses Issue gepflegt.