feat(PROJ-56c): GoBD-Retention-Purge als Cron-Job + Delete()-Konsistenzfix

archivmail purge ist ein neuer CLI-Befehl, der Mails mit abgelaufener
retain_until löscht, aus dem Suchindex entfernt und pro Mail einen
Audit-Eintrag (mail_purged) schreibt — analog zu Pilers purge.sh, nachts
03:40 Uhr über deploy/cron.d/archivmail. Nur Mails mit explizit gesetztem
und abgelaufenem retain_until werden angefasst; ohne retain_until bleibt
alles unberührt, die Löschsperre (PROJ-34) greift weiterhin.

Beim Testen aufgedeckt: Store.Delete() entfernte die Datei vor dem
DB-Delete und verschluckte den Fehler, wenn email_refs/email_attachments
per Fremdschlüssel die Löschung blockierten — Ergebnis war ein DB-Eintrag
ohne zugehörige Datei. Jetzt läuft die DB-Löschung (inkl. abhängiger
Zeilen) zuerst in einer Transaktion, die Datei wird erst nach
erfolgreichem Commit entfernt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-06-24 16:00:41 +02:00
co-authored by Claude Sonnet 4.6
parent d826fe1da7
commit 586af2478c
5 changed files with 198 additions and 16 deletions
+6 -1
View File
@@ -26,6 +26,11 @@
# Pause beenden um 06:00 Uhr
0 6 * * * root /usr/local/bin/archivmail-ocr-pause.sh stop
# ── GoBD-Retention-Purge (PROJ-56c) ─────────────────────────────────────
# Löscht Mails mit abgelaufener Aufbewahrungsfrist (retain_until < NOW()),
# entfernt sie aus dem Suchindex und schreibt pro Mail einen Audit-Eintrag
# ("mail_purged") — analog zu Pilers purge.sh, nachts um 03:40 Uhr.
40 3 * * * root /opt/archivmail/archivmail purge --config /etc/archivmail/config.yml >> /var/log/archivmail/purge.log 2>&1
# ── Weitere Jobs (geplant, noch nicht implementiert) ────────────────────
# 40 3 * * * archivmail /usr/local/bin/archivmail-purge.sh # GoBD-Retention-Purge
# 30 2 * * * archivmail /opt/archivmail/archivmail reindex # nächtlicher Voll-Reindex