diff --git a/README.md b/README.md index 0b47b0e..0bdc29e 100644 --- a/README.md +++ b/README.md @@ -79,8 +79,8 @@ Ein selbst gehostetes, unternehmenstaugliches Mail-Archiv-System. Empfängt E-Ma | Self-Service Onboarding (Sign-up, Passwort-Reset) | ✅ Deployed | | REST API für externe CRM-Anbindung | ✅ Deployed | | CLI: `archivmail import` / `export` / `reindex` | ✅ Deployed | -| Automatische Archivierungsregeln (SMTP/IMAP-Routing) | 🔄 Planned | -| Vollständigkeits-Reconciliation (Zähl-Report) | 🔄 Planned | +| Automatische Archivierungsregeln (SMTP/IMAP-Routing nach Domain/Absender) | ✅ Deployed | +| Vollständigkeits-Reconciliation (Zähl-Report Mailserver vs. Archiv) | ✅ Deployed | --- @@ -256,8 +256,9 @@ Das Update-Skript: ```yaml server: - api_port: 8080 # HTTP-API Port - smtp_port: 2525 # SMTP-Eingang Port + fqdn: "archivmail.firma.de" # verwendet in SMTP-EHLO, IMAP-Greeting, generierten Links + api_port: 8080 # HTTP-API Port + smtp_port: 2525 # SMTP-Eingang Port database: host: 127.0.0.1 @@ -271,6 +272,9 @@ storage: store_path: /var/archivmail/store # Haupt-Mailspeicher (AES-256-GCM) astore_path: /var/archivmail/astore # Anhang-Speicher keyfile: /etc/archivmail/keyfile # 32-Byte AES-Schlüsseldatei + retention_days: 0 # globale Löschsperre, 0 = kein Lock (GoBD: z.B. 3650 für 10 Jahre) + min_retention_days: 0 # PROJ-51: erzwungenes Minimum — Regeln/Tenants dürfen nur verlängern + compress: true # gzip vor AES-256-GCM (spart ~40-60% Disk) smtp: enabled: true @@ -281,19 +285,49 @@ smtp: max_size_mb: 50 allowed_ips: - 127.0.0.1 + tenant_routing: "domain" # "domain" (tenant_domains/PROJ-43-Regeln) oder "default" + default_tenant_id: 0 # genutzt bei routing "default" oder wenn Domain-Lookup fehlschlägt + +smtp_out: + host: "" # nur nötig für Self-Service-Mails (Passwort-Reset, Sign-up) + port: 587 + user: "" + password: "" + tls: true + from: "archivmail " api: bind: ":8080" - secret: "" # JWT-Signaturschlüssel (mind. 32 Zeichen) + secret: "" # JWT-Signaturschlüssel (mind. 32 Zeichen) + secure_cookies: false # true wenn TLS an diesem Server oder vertrauenswürdigem Proxy terminiert + trusted_proxies: [] # IPs/CIDRs deren X-Forwarded-For vertraut wird (leer = r.RemoteAddr) index: backend: manticore manticore_dsn: "manticore@tcp(127.0.0.1:9306)/" batch_size: 100 - batch_mode: true # Indexierung als Cron-Batch statt Dauerbetrieb + async_queue_size: 0 # 0 = Default + batch_mode: true # Indexierung als Cron-Batch statt Dauerbetrieb ocr: - batch_mode: true # OCR als Cron-Batch statt Dauerbetrieb + batch_mode: true # OCR als Cron-Batch statt Dauerbetrieb (PROJ-58) + paused_hours: [8, 18] # optional (PROJ-56): pausiert Verarbeitung im Zeitfenster (hier 08–18 Uhr) + +imap_scheduler: + jitter_seconds: 240 # PROJ-56: Jitter-Fenster für automatischen Sync-Start, 0 = deaktiviert + +reconciliation: + alert_threshold_pct: 50 # PROJ-52: Warn-Schwelle (% unter 7-Tage-Schnitt), 0 = jede Abweichung + +imap_server: + enabled: false # Read-Only IMAP-Zugriff aufs Archiv (PROJ-26) + bind: ":1143" # plain; für TLS ":993" + tls_cert/tls_key setzen + tls_cert: "" + tls_key: "" + +metrics: + enabled: false # Prometheus /metrics-Endpoint (PROJ-40) + token: "" # optionaler Bearer-Token zum Schutz von /metrics audit: log_path: /var/log/archivmail/audit.log @@ -679,6 +713,35 @@ Mails können Dokumentenarten zugeordnet werden mit unterschiedlichen gesetzlich --- +### Automatische Archivierungsregeln (PROJ-43) + +Erweitert das Domain-basierte SMTP-Routing (`tenant_domains`) um flexiblere Muster-Regeln: + +- Regeln nach `from_domain`, `to_domain`, `from_addr` oder `to_addr` (inkl. Wildcard `*.domain.de`) +- Höhere Priorität gewinnt bei mehreren Treffern +- SMTP-Daemon und IMAP-Import prüfen Regeln vor der Domain-Zuordnung +- Dry-Run: zeigt, welche bereits archivierten Mails eine Regel treffen würde, bevor sie aktiv geschaltet wird +- Verwaltung im Admin-Bereich (Tab „Routing-Regeln“) — CRUD unter `/api/admin/routing-rules` +- Bereits archivierte Mails werden nicht rückwirkend umgeroutet, nur neue Ingests + +--- + +### Vollständigkeits-Reconciliation (PROJ-52) + +Täglicher Zähl-Report als Nachweis, dass keine Mail auf dem Weg ins Archiv verloren geht +(VOI-Grundsatz 2): + +- Cron (`archivmail reconcile`, nachts) zählt pro Quelle (SMTP-Journal, IMAP-Konto, POP3-Konto, + Datei-Import) die täglich archivierten Mails +- Warn-Badge + Audit-Eintrag (`reconciliation_anomaly`) bei >50 % Abweichung vom 7-Tage-Schnitt + (Schwellenwert konfigurierbar über `reconciliation.alert_threshold_pct`) +- Dashboard-Kachel „Vollständigkeits-Check“ mit den letzten 7 Tagen pro Quelle +- CSV-Export für Auditoren (`/api/admin/reconciliation/export.csv`) +- Tage ohne Aktivität werden explizit als `0` ausgewiesen, nicht als fehlender Datensatz — + damit ein ausgefallener Cron-Lauf selbst erkennbar bleibt + +--- + ### Admin-Dashboard Erreichbar unter `/admin`. @@ -872,6 +935,4 @@ Alle Endpunkte erfordern eine gültige Session (Cookie `archivmail_session` oder | Funktion | Beschreibung | |----------|--------------| -| **Automatische Archivierungsregeln** | E-Mails nach Absender/Empfänger/Betreff automatisch Mandanten zuordnen | -| **Vollständigkeits-Reconciliation** | Abgleich zwischen IMAP-Server und Archiv — Zähl-Report mit Lückenanalyse | | **E-Mail als primärer Login** | Tenant-User loggen sich mit E-Mail-Adresse statt Benutzername ein |