chore: initial commit — spinout from m/otto
Spun out mDMS strategy + tooling from m/otto into its own repo on 2026-05-15. Migrated: - docs/strategy.md (was: m/otto:docs/mdms-strategy.md) - infra/paperless/ (config + audit + migrate scripts) - infra/samba-canon/ (Canon MB5100 SMB1 bridge container) History in m/otto: issues #429–#438. Going forward, all mDMS issues file here. Sibling m/paperless (separate repo) remains the bare Docker Compose for Paperless-ngx itself.
This commit is contained in:
288
docs/strategy.md
Normal file
288
docs/strategy.md
Normal file
@@ -0,0 +1,288 @@
|
||||
# mDMS: Dokumentenmanagement-Strategie
|
||||
|
||||
## Aktueller Stand (nach Cleanup 2026-04-06)
|
||||
|
||||
### Paperless-ngx (mDock)
|
||||
- **129 Dokumente** (PDFs), Storage Path aktiv
|
||||
- **41 Correspondents** — bereinigt (OCR-Duplikate gemergt, Müll entfernt)
|
||||
- **13 Document Types** — Rechnung, Vertrag, Bescheid, Bescheinigung, Brief, Mitteilung, Abrechnung, Protokoll, Urkunde, Vollmacht, Gutachten, Angebot, Medizinisch
|
||||
- **16 Tags** — hierarchisch: Kategorie (Steuer, Versicherung, Gesundheit, Wohnung, Arbeit, Finanzen, Erbschaft, Gewährleistung, Anleitung) + Status (offen, wichtig, Frist) + Kontext (Windscheid33, Paul)
|
||||
- **1 Storage Path**: `{created_year}/{document_type}/{created} - {correspondent} - {title}`
|
||||
- Dateien strukturiert: `2024/Rechnung/2024-03-15 - DAK - Beitragsrechnung.pdf`
|
||||
- API-User: `mAi`
|
||||
- Docker Compose: `~/paperless/` auf mDock, NFS-Mount `/mnt/paperless` von TrueNAS (`mPool/paperless`)
|
||||
|
||||
### Was bereinigt wurde
|
||||
- 68 Webp-Preview-Dokumente gelöscht (keine Originale, nur schlechte Vorschaubilder)
|
||||
- 51 → 41 Correspondents (OCR-Duplikate gemergt: Hogan Lovells, Matthias Siebels, Ammerländer, Schubert, eprimo, Helios, Paul Siebels, Versorgungswerk etc.)
|
||||
- 39 → 13 Document Types (Merge-Mapping umgesetzt)
|
||||
- 172 → 16 Tags (Noise gelöscht, Kategorie-Mapping vor Löschung durchgeführt)
|
||||
- 13 kaputte SynoResource-Dateien aus Consume gelöscht
|
||||
- 126 orphaned flat-PDFs aus Originals gelöscht
|
||||
- 43 Dokumententitel bereinigt (Nummern → beschreibende Titel)
|
||||
- 5 Birthday-Datumsfehler korrigiert (1987-02-22 → korrekte Dokumentdaten)
|
||||
|
||||
### mDocs (Gitea-Repo m/mDocs) — MIGRATION PENDING
|
||||
- **72 Dateien**, 60 MB (Steuer, Versicherungen, Windscheid33)
|
||||
- Wird in Paperless inbox migriert, Repo danach löschen
|
||||
|
||||
### TrueNAS (mtruenas)
|
||||
- Dataset `mPool/paperless` existiert bereits
|
||||
- NFS-Export nach mDock (192.168.178.0/24)
|
||||
- SMB-Share `mStash` als Referenz für mdms-Share
|
||||
|
||||
---
|
||||
|
||||
## Entscheidungen
|
||||
|
||||
### 1. Storage Path Format
|
||||
|
||||
**Format: `{created_year}/{document_type}/{created} - {correspondent} - {title}.pdf`** ✓ Bestätigt
|
||||
|
||||
Beispiele:
|
||||
```
|
||||
2024/Rechnung/2024-03-15 - DAK - Beitragsrechnung Q1.pdf
|
||||
2024/Bescheid/2024-01-20 - Finanzamt - Grundsteuerbescheid.pdf
|
||||
2023/Vertrag/2023-06-01 - Vodafone - GigaTV Vertragsverlängerung.pdf
|
||||
2025/Abrechnung/2025-01-31 - Hogan Lovells - Gehaltsabrechnung Januar.pdf
|
||||
```
|
||||
|
||||
**Warum dieses Format:**
|
||||
- **Jahr als Top-Level**: Chronologisches Browsen, ganzen Jahrgang für Steuerberater kopierbar
|
||||
- **Typ als zweite Ebene**: "Zeig mir alle Rechnungen 2024" = `2024/Rechnung/`
|
||||
- **Datum + Correspondent + Titel im Dateinamen**: Sortierbar, durchsuchbar, kontextreich
|
||||
- **Max 2 Ordnerebenen**: Nicht zu tief, Finder/Explorer-freundlich
|
||||
- **Navigierbar ohne Paperless**: Reiner Dateibrowser funktioniert
|
||||
|
||||
**Verworfene Alternativen:**
|
||||
- `{correspondent}/{year}/...` — zu viele sparse Ordner, schlecht für zeitliche Navigation
|
||||
- `{year}-{month}/...` — zu granular, monatliche Ordner für oft nur 1-2 Dokumente
|
||||
- Flach: `{created}-{correspondent}-{title}.pdf` — bei 500+ Dokumenten unbrauchbar
|
||||
|
||||
### 2. Dataset-Struktur: mPool/mdms
|
||||
|
||||
```
|
||||
/mnt/mPool/mdms/
|
||||
├── paperless/ # Paperless storage (originals, archive, thumbnails)
|
||||
│ ├── documents/
|
||||
│ │ ├── originals/ # Originaldateien
|
||||
│ │ └── archive/ # OCR-Versionen
|
||||
│ └── ...
|
||||
├── inbox/ # Paperless consume — Auto-Import
|
||||
│ # mScan-App, Drag-and-Drop, SFTP
|
||||
├── templates/ # Vertragsvorlagen, Formulare, Muster
|
||||
│ # Nicht in Paperless — statische Referenzdokumente
|
||||
├── archive/ # Dokumente die nicht in Paperless passen:
|
||||
│ # Große Dateien (CAD, Pläne), Sammlungen, Binaries
|
||||
└── export/ # Paperless-Exporte, Backups, Snapshots
|
||||
```
|
||||
|
||||
### 3. Dokumenten-Routing
|
||||
|
||||
| Dokument | Ziel | Begründung |
|
||||
|----------|------|------------|
|
||||
| Rechnungen, Bescheide, Briefe | Paperless (inbox/) | OCR + AI-Klassifikation + Suche |
|
||||
| Verträge, Urkunden | Paperless | Langzeitarchiv mit Volltextsuche |
|
||||
| Steuerunterlagen | Paperless + Tag "Steuer" | Filterbar für Steuerberater-Export |
|
||||
| Gehaltsabrechnungen | Paperless + Tag "Arbeit" | Chronologisch abrufbar |
|
||||
| Arztbriefe, Befunde | Paperless + Tag "Gesundheit" | Suchbar, datiert |
|
||||
| Phone-Scans (mScan) | inbox/ → Paperless auto-import | Scannen → fertig |
|
||||
| Vertragsvorlagen, Formulare | templates/ | Keine OCR nötig, statische Referenz |
|
||||
| Baupläne, CAD, große Dateien | archive/ | Zu groß/speziell für Paperless |
|
||||
| Fotos von Dokumenten | Paperless | OCR funktioniert auch auf Fotos |
|
||||
|
||||
**Nicht in mDMS:**
|
||||
- Fotos generell → Immich
|
||||
- Bücher, eBooks → Calibre (mCalibre)
|
||||
- Arbeitsrechtliche Dokumente (HL) → mWork-Vault (Obsidian, nicht mDMS)
|
||||
|
||||
### 4. Paperless Taxonomy — Aufräumen
|
||||
|
||||
#### Document Types (39 → 15)
|
||||
|
||||
Reduziert auf sinnvolle, stabile Kategorien:
|
||||
|
||||
| Behalten | Zusammenführen aus |
|
||||
|----------|-------------------|
|
||||
| **Rechnung** | Rechnung, Invoice, Beitragsrechnung |
|
||||
| **Vertrag** | (neu — für Verträge, Verlängerungen) |
|
||||
| **Bescheid** | Bescheid, Beitragsbescheid, Versicherungsbescheid |
|
||||
| **Bescheinigung** | Bescheinigung, Lohnsteuerbescheinigung, Spendenbescheinigung |
|
||||
| **Brief** | Brief, Anschreiben, Korrespondenz |
|
||||
| **Mitteilung** | Mitteilung, Benachrichtigung, Information, Erinnerung |
|
||||
| **Abrechnung** | Abrechnung, Entgeltabrechnung |
|
||||
| **Protokoll** | Protokoll |
|
||||
| **Urkunde** | Urkunde |
|
||||
| **Vollmacht** | Vollmacht |
|
||||
| **Gutachten** | Gutachten, Befund |
|
||||
| **Angebot** | Angebot |
|
||||
| **Energieausweis** | Energieausweis |
|
||||
| **Schadenmeldung** | Schadenmeldung, Schadenanzeige |
|
||||
| **Medizinisch** | Arbeitsunfähigkeitsbescheinigung, Aufklärungsbogen |
|
||||
|
||||
Entfernen: Empfehlung, Preisanpassungsschreiben, Kündigungsbestätigung, Eintragungsbekanntmachung, Auftragsbestätigung, Testament (→ Tag), Einladung (→ Brief)
|
||||
|
||||
#### Tags (172 → ~25 manuell kuratierte)
|
||||
|
||||
Die meisten Auto-Tags sind Noise. Ziel: wenige, stabile Kategorie-Tags + manuelle Pflege.
|
||||
|
||||
**Kategorie-Tags (Pflicht, einer pro Dokument):**
|
||||
| Tag | Für |
|
||||
|-----|-----|
|
||||
| `Steuer` | Alles steuerrelevante |
|
||||
| `Versicherung` | Policen, Schäden, Beiträge |
|
||||
| `Gesundheit` | Arzt, Krankenhaus, Krankenkasse |
|
||||
| `Wohnung` | Miete, Eigentum, Nebenkosten, WEG |
|
||||
| `Arbeit` | Gehalt, Arbeitgeber, Kammer |
|
||||
| `Finanzen` | Bank, Kredit, Altersvorsorge |
|
||||
| `Erbschaft` | Testament, Nachlassangelegenheiten |
|
||||
| `Gewährleistung` | Kaufbelege mit Garantie, Reklamationen |
|
||||
| `Anleitung` | Bedienungsanleitungen, Handbücher, Datenblätter |
|
||||
|
||||
**Aktions-Tags (optional):**
|
||||
| Tag | Bedeutung |
|
||||
|-----|-----------|
|
||||
| `wichtig` | Aufbewahrungspflichtig, Schlüsseldokument |
|
||||
| `Frist` | Hat eine Frist — regelmäßig prüfen |
|
||||
| `offen` | Noch Handlung erforderlich |
|
||||
|
||||
**Kontext-Tags (sparsam, bei Bedarf):**
|
||||
| Tag | Für |
|
||||
|-----|-----|
|
||||
| `Windscheid33` | Immobilie Windscheidstr. 33 |
|
||||
| `Paul` | Dokumente bzgl. Paul Siebels |
|
||||
|
||||
**Löschen:**
|
||||
- Jahres-Tags ("2022", "2025") — redundant mit created-Datum
|
||||
- Personen-Tags ("Matthias Siebels") — gehört als Correspondent
|
||||
- Ultra-granulare Tags ("Finger", "Hand", "Shimano", "Oral-B") — kein Nutzen
|
||||
- Duplikate ("Rechtsanwalt" + "Rechtsanwälte" + "Rechtsanwaltschaft")
|
||||
|
||||
#### Correspondents (51 → ~30)
|
||||
|
||||
OCR-Duplikate zusammenführen:
|
||||
- "Hogan Lovells International LLP" + "Hogan Lovells lnternational LLP" → **Hogan Lovells**
|
||||
- "HELIÜS Klinikurn Duisburg" + "Helios Klinikum Duisburg" → **Helios Klinikum Duisburg**
|
||||
- "Herr Matthias Siebels" + "Herrn Matthias Siebels" + "Matthias Siebels" + "Herrn Rechtsanwalt Matthias Siebels" → **Matthias Siebels** (eigene Dokumente)
|
||||
- "Ammerländer Versicherung VVaG" + "Ammerländer Versicherung WaG" → **Ammerländer Versicherung**
|
||||
- "SCHUBERT GmbH" + "Schubert GmbH Haus- und Grundbesitzverwaltung" → **Schubert Hausverwaltung**
|
||||
- "Dr. figegeberH lcankenkas*" → identifizieren oder löschen (OCR-Müll)
|
||||
- "Dr/Heikö Gemmel" → **Dr. Heiko Gemmel**
|
||||
- "eprimo CmbH" + "eprimo GmbH" → **eprimo**
|
||||
- "lndula Shopsystem GmbH" → **Indula Shopsystem**
|
||||
|
||||
### 5. SMB-Share
|
||||
|
||||
**Ja — mdms als SMB-Share wie mStash.**
|
||||
|
||||
Konfiguration auf TrueNAS:
|
||||
- Share-Name: `mdms`
|
||||
- Dataset: `mPool/mdms`
|
||||
- User: `m` (wie mStash)
|
||||
- Mount auf mBreeze/mPebble: `~/mDMS` (LaunchAgent, analog zu mStash)
|
||||
|
||||
Nutzen:
|
||||
- `~/mDMS/inbox/` für Drag-and-Drop-Import (Paperless consumed automatisch)
|
||||
- `~/mDMS/templates/` für schnellen Zugriff auf Vorlagen
|
||||
- `~/mDMS/paperless/documents/originals/` für Dateibrowser-Navigation (via Storage Path)
|
||||
- `~/mDMS/archive/` für große Dateien
|
||||
|
||||
### 6. Vertrauliche Dokumente
|
||||
|
||||
**Kein separates Verschlüsselungssystem nötig.** ✓ Bestätigt
|
||||
- Alles läuft auf HomeServer (mforge/mtruenas), nur via Tailscale erreichbar
|
||||
- SMB mit User-Auth + Paperless-Login reichen aus
|
||||
|
||||
### 7. Obsidian-Integration
|
||||
|
||||
Der Storage Path soll als Teil eines Obsidian-Vaults nutzbar sein. Das bedeutet:
|
||||
- `mdms/paperless/documents/originals/` (oder `archive/`) via SMB als Vault-Ordner einbinden
|
||||
- Obsidian zeigt die Ordnerstruktur (`2024/Rechnung/...`) direkt im Dateibrowser
|
||||
- PDFs sind in Obsidian inline-viewbar und verlinkbar (`![[2024-03-15 - DAK - Beitragsrechnung.pdf]]`)
|
||||
- Keine Sonderzeichen in Dateinamen die Obsidian-Links brechen (Spaces sind ok)
|
||||
|
||||
**Umsetzung:**
|
||||
- Option A: Symlink `~/m2/mDMS/` → `~/mDMS/paperless/documents/originals/` im Obsidian-Vault
|
||||
- Option B: Separater Mini-Vault nur für Dokumente
|
||||
- Option C: mdms als Unterordner im Hauptvault (m2)
|
||||
|
||||
Empfehlung: **Option A (Symlink)** — kein Daten-Overhead, Vault bleibt schlank, Dokumente sind trotzdem verlinkbar. Braucht nur einen Symlink pro Maschine.
|
||||
|
||||
### 8. E-Mail-Inbox
|
||||
|
||||
**docs@msbls.de** — Alias auf mail@msbls.de (Hostinger).
|
||||
|
||||
Paperless pollt mail@msbls.de via IMAP und konsumiert Anhänge aus Emails an docs@msbls.de:
|
||||
- IMAP: `imap.hostinger.com:993` (SSL/TLS), User: `mail@msbls.de`
|
||||
- Mail-Regel: Filter `To: docs@msbls.de`, nur Attachments, Action: als gelesen markieren
|
||||
- Correspondent wird automatisch vom Absender übernommen
|
||||
- Titel vom Dateinamen
|
||||
|
||||
**Workflow:** Dokument als PDF an docs@msbls.de weiterleiten → Paperless importiert automatisch.
|
||||
|
||||
---
|
||||
|
||||
## Paperless-AI Konfiguration
|
||||
|
||||
Paperless-AI (Port 3077) soll die Klassifikation übernehmen. Konfigurieren mit:
|
||||
- **Auto-assign correspondent** basierend auf OCR-Text (Absender-Erkennung)
|
||||
- **Auto-assign document type** aus den 15 reduzierten Typen
|
||||
- **Auto-assign 1-2 Kategorie-Tags** aus der Kurzliste
|
||||
- **Nicht**: Auto-generierte Freitext-Tags (das erzeugt das aktuelle Chaos)
|
||||
|
||||
---
|
||||
|
||||
## Migration: Schritt für Schritt
|
||||
|
||||
### Phase 1: TrueNAS Setup ✓ DONE
|
||||
1. ~~Dataset `mPool/mdms` erstellt~~ (LZ4, 1.24 TiB frei)
|
||||
2. ~~Unterordner angelegt~~ (paperless, inbox, templates, archive, export)
|
||||
3. ~~NFS-Export~~ (id:8, 192.168.178.0/24), Mount auf mDock als `/mnt/mdms`
|
||||
4. ~~SMB-Share `mDMS`~~ (id:3, User `m`)
|
||||
|
||||
### Phase 2: Paperless Migration ✓ DONE
|
||||
5. ~~Paperless auf mDock gestoppt~~
|
||||
6. ~~Media, data, ai kopiert~~; pgdata als lokales Docker Volume (NFS-Ownership inkompatibel mit Postgres uid 999)
|
||||
7. ~~consume → inbox kopiert~~
|
||||
8. ~~SynoResource-Dateien gelöscht~~
|
||||
9. ~~NFS-Mount `/mnt/mdms` auf mDock~~ (fstab via Proxmox agent)
|
||||
10. ~~Docker Compose aktualisiert~~ (`~/paperless/docker-compose.yml`)
|
||||
11. ~~Storage Path konfiguriert~~
|
||||
12. ~~Paperless verifiziert~~ — 129 Docs, alle Metadaten intakt
|
||||
|
||||
**Hinweis:** pgdata lebt als Docker Volume `paperless_pgdata` auf mDock (nicht auf NFS). DB-Backup über `pg_dump` in `mdms/export/` planen.
|
||||
|
||||
### Phase 3: Cleanup ✓ DONE
|
||||
13. ~~Paperless Correspondents zusammenführen~~ → 51 → 41
|
||||
14. ~~Document Types reduzieren~~ → 39 → 13
|
||||
15. ~~Tags aufräumen~~ → 172 → 16 (hierarchisch: Kategorie + Status + Kontext)
|
||||
16. Paperless-AI mit neuer Taxonomy konfigurieren (TODO)
|
||||
|
||||
### Phase 4: mDocs Migration
|
||||
17. mDocs-Repo klonen, alle PDFs nach mdms/inbox/ kopieren
|
||||
18. Paperless konsumiert und klassifiziert automatisch
|
||||
19. Manuell verifizieren: Correspondents, Types, Tags korrekt?
|
||||
20. mDocs-Repo auf Gitea löschen
|
||||
|
||||
### Phase 5: Client-Setup
|
||||
21. SMB-Mount auf mBreeze: `~/mDMS` (LaunchAgent wie mStash)
|
||||
22. SMB-Mount auf mPebble: `~/mDMS`
|
||||
23. mScan-App auf mdms/inbox/ konfigurieren (falls SFTP/SMB-Upload möglich)
|
||||
|
||||
---
|
||||
|
||||
## Offene Punkte
|
||||
|
||||
- [x] Paperless Admin-Credentials — mAi-User auf Paperless angelegt
|
||||
- [x] Paperless Cleanup — Correspondents, Types, Tags bereinigt
|
||||
- [x] Storage Path konfiguriert und Dateien umbenannt
|
||||
- [x] Webp-Previews gelöscht, SynoResource-Müll bereinigt
|
||||
- [x] TrueNAS Dataset `mPool/mdms` erstellt (NFS id:8, SMB `mDMS` id:3)
|
||||
- [x] Paperless media auf mdms/paperless umgestellt (Docker Compose aktualisiert)
|
||||
- [x] SMB-Share `mDMS` eingerichtet auf TrueNAS
|
||||
- [x] mDocs-Migration: 69 PDFs in Paperless inbox, consumption läuft
|
||||
- [x] **docs@msbls.de** — E-Mail-Inbox für Paperless (IMAP-Polling, Alias auf mail@msbls.de, Regel filtert auf To: docs@msbls.de)
|
||||
- [ ] Paperless-AI mit neuer Taxonomy konfigurieren
|
||||
- [ ] Regelmäßiger Export/Backup-Job (Paperless → mdms/export/)
|
||||
- [ ] `m doc` CLI-Subcommand für Paperless-Zugriff? (search, list, tag)
|
||||
- [ ] Obsidian-Vault Symlink-Setup auf mBreeze/mPebble
|
||||
Reference in New Issue
Block a user