Files
archivmail/deploy/cron.d/archivmail
T
sysops f3a7dea3cc feat(PROJ-66): CLI-Kommandos archivmail backup/restore
Sichert Store (Hardlinks erhalten, PROJ-65-tauglich ohne Abhängigkeit von
rsync -H), Keyfile, config.yml und PostgreSQL (pg_dump -Fc) konsistent in
ein Zielverzeichnis. Rotation läuft nur nach erfolgreichem Lauf, ein
fehlgeschlagener Backup rotiert nie ein gutes altes Backup weg.

restore ist bewusst konservativ: bricht bei nicht-leerem Store/Keyfile ohne
-force ab, stoppt/startet den Dienst nicht selbst, gibt am Ende die
Pflicht-Verifikationsschritte (reconcile, reindex, Stichprobe) aus.

Ergänzt die vorhandene PBS+Sync-Infrastruktur um einen App-eigenen,
selektiven Restore-Weg. Kein automatischer Cron-Eintrag aktiv (Zielpfad
noch offen), nur als Vorlage in deploy/cron.d/archivmail auskommentiert.
Kein lokaler go build möglich, QA folgt auf Testserver.
2026-07-04 14:09:37 +02:00

88 lines
5.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# /etc/cron.d/archivmail
#
# Zentrale Cron-Datei für archivmail — analog zum mailpiler-Vorbild
# (/etc/cron.d/piler), das ebenfalls alle Wartungs-Jobs in einer Datei
# bündelt. Neue Jobs (Purge, nächtlicher Reindex, Watch-Folder-Import, ...)
# kommen hier als weitere Zeile dazu, statt eigene cron.d-Dateien
# anzulegen.
#
# Format: Minute Stunde Tag Monat Wochentag User Befehl
# ── OCR-Pausenfenster (PROJ-56) ──────────────────────────────────────────
# Steuert paused_hours in /etc/archivmail/config.yml und löst per
# "systemctl reload" (SIGHUP) einen Reload aus, damit die neue Pausenzeit
# sofort greift — ohne den Prozess neu zu starten (kein Verbindungsabbruch
# für SMTP/IMAP/API). Mails gehen dabei nie verloren: ocr_status='pending'
# bleibt in der DB bestehen und wird von der Backfill-Goroutine laufend
# nachgezogen, unabhängig von Pausen oder Neustarts.
#
# Anpassen: einfach die beiden Uhrzeiten unten ändern und an die
# crontab-Syntax halten. Bei wrap-around Fenstern (z.B. 22:0006:00)
# "start" auf den späteren, "stop" auf den früheren Zeitpunkt legen.
# Pause starten um 22:00 Uhr
0 22 * * * root /usr/local/bin/archivmail-ocr-pause.sh start 22 6
# 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
# ── Batch-Modus: Indexierung + OCR per Cron (PROJ-58) ───────────────────
# NUR relevant, wenn in /etc/archivmail/config.yml index.batch_mode: true
# bzw. ocr.batch_mode: true gesetzt ist. In diesem Modus startet der Daemon
# den jeweiligen Dauerbetrieb-Worker NICHT — neue Mails bleiben mit
# indexed_at IS NULL bzw. ocr_status='pending' in der DB stehen und werden
# erst vom nächsten Cron-Lauf hier durchsuchbar / OCR-verarbeitet gemacht.
# Sinn: viele kleine Schreibzugriffe (Manticore, tesseract, DB) werden zu
# geblockten Batches gebündelt, statt sofort bei jedem Mail-Import zu laufen.
#
# Bei index.batch_mode: false / ocr.batch_mode: false (Default) sind diese
# beiden Zeilen WIRKUNGSLOS bzw. redundant — der Worker läuft dann ohnehin
# dauerhaft und arbeitet alles sofort ab. Wer batch_mode nicht nutzt, kann
# die beiden Zeilen einfach auskommentiert lassen.
#
# Die Jobs rufen Wrapper-Skripte auf (archivmail-index-pending.sh /
# archivmail-ocr-reprocess.sh), die per PID-Lockfile unter /var/run/archivmail/
# überlappende Läufe verhindern — analog zum mailpiler-Vorbild
# (indexer.delta.sh mit MAINTMPFILE/DELTATMPFILE). Ohne diesen Schutz könnte
# ein Lauf mit großem Backlog länger dauern als das Intervall und sich mit
# dem nächsten Tick überlappen, was die Last-Glättung wieder aufheben würde.
#
# Anpassen: Intervall/Uhrzeiten unten nach Bedarf ändern (crontab-Syntax).
# Die beiden Jobs sind bewusst leicht versetzt, damit Index- und OCR-Lauf
# nicht exakt zeitgleich starten.
# Index-Backlog (indexed_at IS NULL) alle 15 Minuten verarbeiten
*/15 * * * * root /usr/local/bin/archivmail-index-pending.sh >> /var/log/archivmail/index-pending.log 2>&1
# OCR-Backlog (ocr_status='pending') alle 15 Minuten, um 5 Min versetzt
5,20,35,50 * * * * root /usr/local/bin/archivmail-ocr-reprocess.sh >> /var/log/archivmail/ocr-reprocess.log 2>&1
# ── Vollständigkeits-Reconciliation (PROJ-52) ───────────────────────────
# Berechnet täglich pro Tenant/Quelle (SMTP-Journal, IMAP-Konto, POP3-Konto,
# Datei-Import) die Anzahl archivierter Mails und schreibt einen Report
# nach reconciliation_reports. Bei Abweichung > reconciliation.alert_threshold_pct
# (config.yml, Default 50%) unter dem 7-Tage-Durchschnitt wird ein
# Audit-Log-Eintrag (reconciliation_anomaly) geschrieben. Läuft nachts um
# 04:10 Uhr, also nach Purge (03:40) und außerhalb der OCR-Pause.
10 4 * * * root /opt/archivmail/archivmail reconcile --config /etc/archivmail/config.yml >> /var/log/archivmail/reconcile.log 2>&1
# ── App-Backup (PROJ-66, optional — Ergänzung zur PBS-/Snapshot-Sicherung) ──
# `archivmail backup` sichert Store (Hardlinks erhalten), Keyfile, Config und
# PostgreSQL-Dump konsistent in ein Zielverzeichnis. Standardmäßig NICHT
# aktiviert — auskommentiert lassen, bis ein konkretes -dest-Ziel (idealerweise
# ein von diesem Host getrenntes Mount, z.B. NFS/rsync-Ziel) feststeht, siehe
# features/PROJ-66-backup-strategie.md. -keep begrenzt die Anzahl vorgehaltener
# Backup-Verzeichnisse (Rotation läuft nur nach einem erfolgreichen Lauf, ein
# fehlgeschlagener Backup löscht nie ein älteres gutes Backup).
#
# 0 3 * * * root /opt/archivmail/archivmail backup --config /etc/archivmail/config.yml --dest /mnt/backup/archivmail --keep 14 >> /var/log/archivmail/backup.log 2>&1
# ── Weitere Jobs (geplant, noch nicht implementiert) ────────────────────
# 30 2 * * * archivmail /opt/archivmail/archivmail reindex # nächtlicher Voll-Reindex