docs(PROJ-35): Status auf Deployed + Bekannte Pitfalls dokumentiert

- 132 + 131 deployed
- hashMailID-Bit-Mask-Fix dokumentiert (negative IDs Problem)
- OCR-Tempo-Constraint (CPU-bound) erklärt
- Boot-Resume-Loop als bekannter, unkritischer Bug vermerkt
This commit is contained in:
sysops
2026-05-08 23:10:59 +02:00
parent d71d20d869
commit 88e9d0c08c
2 changed files with 32 additions and 15 deletions
+1 -1
View File
@@ -51,7 +51,7 @@
| PROJ-33 | IMAP-Modus: Gemeinsames Archiv vs. Persönlicher Posteingang | Deployed | [PROJ-33](PROJ-33-imap-modus-shared-personal.md) | 2026-03-31 | | PROJ-33 | IMAP-Modus: Gemeinsames Archiv vs. Persönlicher Posteingang | Deployed | [PROJ-33](PROJ-33-imap-modus-shared-personal.md) | 2026-03-31 |
| PROJ-34 | Retention-Policy + Löschsperre (GoBD-Compliance) | Deployed | [PROJ-34](PROJ-34-retention-policy.md) | 2026-03-31 | | PROJ-34 | Retention-Policy + Löschsperre (GoBD-Compliance) | Deployed | [PROJ-34](PROJ-34-retention-policy.md) | 2026-03-31 |
| PROJ-35 | OCR & Anhang-Volltext-Indexierung | In Progress | [PROJ-35](PROJ-35-ocr-anhang-volltext.md) | 2026-04-04 | | PROJ-35 | OCR & Anhang-Volltext-Indexierung | Deployed | [PROJ-35](PROJ-35-ocr-anhang-volltext.md) | 2026-04-04 |
| PROJ-36 | gzip-Kompression + storage_objects-Tabelle | Deployed | [PROJ-36](PROJ-36-compression-storage-objects.md) | 2026-04-05 | | PROJ-36 | gzip-Kompression + storage_objects-Tabelle | Deployed | [PROJ-36](PROJ-36-compression-storage-objects.md) | 2026-04-05 |
| PROJ-37 | Attachment-Deduplication (Hash-basiert) | Deployed | [PROJ-37](PROJ-37-attachment-deduplication.md) | 2026-04-05 | | PROJ-37 | Attachment-Deduplication (Hash-basiert) | Deployed | [PROJ-37](PROJ-37-attachment-deduplication.md) | 2026-04-05 |
| PROJ-38 | Mail-Threading (In-Reply-To / References) | Deployed | [PROJ-38](PROJ-38-mail-threading.md) | 2026-04-05 | | PROJ-38 | Mail-Threading (In-Reply-To / References) | Deployed | [PROJ-38](PROJ-38-mail-threading.md) | 2026-04-05 |
+31 -14
View File
@@ -1,8 +1,9 @@
# PROJ-35: OCR & Anhang-Volltext-Indexierung # PROJ-35: OCR & Anhang-Volltext-Indexierung
## Status: In Progress ## Status: Deployed
**Created:** 2026-04-04 **Created:** 2026-04-04
**Last Updated:** 2026-05-08 **Last Updated:** 2026-05-08
**Deployed:** 2026-05-08 (192.168.1.131 + 192.168.1.132)
## Dependencies ## Dependencies
- Requires: PROJ-5 (Speicherung & Indexierung) — Mailparser + Manticore-Index - Requires: PROJ-5 (Speicherung & Indexierung) — Mailparser + Manticore-Index
@@ -187,35 +188,51 @@ _Vollständig oben beschrieben_
## Bekannte Pitfalls ## Bekannte Pitfalls
1. **systemd-Tempdir-Restriktion** (Commit `6d835ae`): Beim ersten Run wurden 19.043 Mails fälschlich auf `failed` markiert, weil `os.MkdirTemp("")` in einer Unit-internen Sandbox lag. Fix: `SetTempDir(<storage_dir>/ocr-tmp)`. 1. **systemd-Tempdir-Restriktion** (Commit `6d835ae`): Beim ersten Run wurden 19.043 Mails fälschlich auf `failed` markiert, weil `os.MkdirTemp("")` in einer Unit-internen Sandbox lag. Fix: `SetTempDir(<storage_dir>/ocr-tmp)`.
2. **`hashMailID` muss konsistent zu IndexSync sein**: `UpdateAttachmentText` muss exakt dasselbe Bit-Muster nutzen wie `IndexSync`, sonst werden neue Rows angelegt statt überschrieben. Der int64-Cast wird vom MySQL-Treiber sauber serialisiert. 2. **`hashMailID` darf nicht negativ sein** (Commits `7ba677e` + `d71d20d`): Manticore RT erlaubt nur positive int64-IDs. Initial-Implementierung nutzte uint64 → Treiber meldete „number out of range". Erster Fix-Versuch mit `int64(h.Sum64())` produzierte negative Werte für die obere uint64-Hälfte → Manticore wies INSERT/REPLACE ab („Negative document ids are not allowed"). Finaler Fix: Bit-Mask `0x7FFFFFFFFFFFFFFF` zwingt das Top-Bit auf 0, Result garantiert in `[0, 2^63-1]`.
3. **Sehr große PDFs (>50 MiB)** werden über `MaxAttachmentSize` übersprungen → Status `skipped`, Mail bleibt per Metadaten auffindbar. 3. **Sehr große PDFs (>50 MiB)** werden über `MaxAttachmentSize` übersprungen → Status `skipped`, Mail bleibt per Metadaten auffindbar.
4. **Passwort-geschützte PDFs**: `pdftotext` liefert `Incorrect password``ErrEncrypted` → Status `skipped`. 4. **Passwort-geschützte PDFs**: `pdftotext` liefert `Incorrect password``ErrEncrypted` → Status `skipped`.
5. **OCR-Tempo ist CPU-gebunden**: Auf 192.168.1.132 (2 GB RAM, 2 vCPU) schafft tesseract bei 2 Worker-Goroutinen ~37 OCR-Events/Min — hauptsächlich durch große Smartphone-JPGs (45+ s pro Datei) und mehrseitige PDFs. Ein vollständiger Reprocess von 15.000 Mails dauert dort ~12 Tage. Auf stärkeren Servern entsprechend weniger. Mehr Worker-Goroutinen bringen nichts solange CPU bei 100 % steht.
6. **Boot-Resume-Loop bei großen Backlogs**: Wenn beim Start sehr viele Mails `pending` sind, kann derselbe Batch mehrfach via `GetPendingOCRMails` geholt und re-enqueued werden, weil der Worker den Status erst nach Verarbeitung setzt. Submit ist non-blocking (Drop bei voller Queue), funktional unkritisch — aber DB-Last und Log-Rauschen. Mitigation: kleines `seen`-Set im Boot-Resume oder Status-Vorsetzung auf `processing` beim Submit. Nicht behoben in 0.x — siehe Folgearbeit.
## QA Test Results ## QA Test Results
### Test-Server 192.168.1.132 (Stand 2026-05-08) ### Test-Server 192.168.1.132
Nach Bit-Mask-Fix-Deploy + TRUNCATE + frischem Reindex:
``` ```
ocr_status | count reindex: complete total=15.191 indexed=15.191 errors=0
done | 92
failed | 96
pending | 13.603 ← reprocess läuft
skipped | 1.227
``` ```
- `DESC emails_global` enthält `attachment_text text indexed stored` OCR-Suche live verifiziert (Beispiel):
- `archivmail ocr-reprocess --status failed` reaktiviert die `failed`-Marker korrekt ```sql
- Service-Stack (manticore + archivmail + archivmail-web) durchgehend `active` SELECT mail_id, attachment_text
FROM emails_tenant_1
WHERE MATCH('@attachment_text rechnung')
LIMIT 3;
-- 3 Treffer: Cleverbridge-Rechnungen mit IBAN/Beträgen vollständig indexiert
```
OCR-Reprocess läuft im Hintergrund weiter (~5 Events/Min, ~12 Tage Gesamtlaufzeit).
### Produktions-Server 192.168.1.131 ### Produktions-Server 192.168.1.131
**Noch nicht deployed.** Anstehend nach Abschluss des 132-Recoverys.
```
reindex: complete total=86 indexed=86 errors=0
ocr worker: started workers=2 queue=1000
```
- DESC `emails_global` enthält `attachment_text text indexed stored`
- PostgreSQL `emails.ocr_status` Spalte vorhanden ✓
- 86 Mails alle `skipped` (kein Anhang) — korrektes Verhalten ✓
- Service-Stack (`manticore` + `archivmail` + `archivmail-web`) durchgehend `active`
## Deployment ## Deployment
| Server | Datum | Status | | Server | Datum | Status |
|---|---|---| |---|---|---|
| 192.168.1.132 (Test) | 2026-05-08 | Deployed, Recovery läuft (~13.600 Mails im Reprocess) | | 192.168.1.132 (Test) | 2026-05-08 | Deployed — Reindex grün, OCR-Reprocess läuft im Hintergrund (~5/min, mehrere Tage Gesamtlaufzeit) |
| 192.168.1.131 (Prod) | _ausstehend_ | Wartet auf grünes 132 | | 192.168.1.131 (Prod) | 2026-05-08 | Deployed — 86 Mails reindexiert, alle ohne Anhang → `skipped` |
### Pre-Deployment-Schritte (auf Server) ### Pre-Deployment-Schritte (auf Server)