ADR-0062: Dateiablage über StorageBackend, Nextcloud (WebDAV) als Projektarchiv
- Status: proposed — teilweise abgelöst durch ADR-0063 (Linetra ist Index und Quelle der Wahrheit, Nextcloud wird einseitiger Spiegel; Volltextsuche liegt in Linetra). SharePoint und Google Drive werden in ADR-0064 (geplant; opt-in je Mandant als zusätzlicher Auftragsverarbeiter) neu bewertet. Der Inhalt unten bleibt als Ausgangslage stehen.
- Datum: 2026-10-02
- Phase: Prozessmanagement
- Bezug: ADR-0005, ADR-0059, ADR-0060
Kontext
Fotos und Dokumente aus dem Feld sollen zur Aufgabe im Tracker und in eine nachvollziehbare Ordnerstruktur in der Cloud. Heute liegen Uploads (entity_files) auf dem Compose-Volume FILE_STORAGE_DIR; Jira-Anhänge sind in Jira gefangen (Kunde ohne Jira-Account sieht sie nicht, Export ist mühsam). Die Betreiberfirma nutzt Nextcloud.
Entscheidung
StorageBackend-Protocol instorage/(put(path, bytes, content_type),exists,delete,share_linkoptional). Adapter:LocalVolumeBackend(heutiges Verhalten) undWebDavBackend(Nextcloud, App-Passwort). S3/MinIO später, kein Umbau.- Volume bleibt Primärablage für
entity_files(Download-Endpunkt, Idempotenz, Thumbnails). Nextcloud ist das Projektarchiv, Tracker-Anhang die Zweitkopie am Issue. Reihenfolge: Volume (sofort beim Eingang) → Freigabe durch das Backoffice (ADR-0061, Aktionattach) → Tracker → Nextcloud; jeder Schritt idempotent übermedia_sha256. Vor der Freigabe liegt die Datei nur auf dem Volume und ist in der Freigabe-Queue sichtbar; der Reviewer kann Issue und Dateiname ändern oder die Datei abweisen. - Ordner-Policy (konfigurierbar, Default):
{root}/{kunde}/{projekt}/{issue_key}/{yyyymmdd}_{hhmm}_{absender}_{originalname}
{root}/{kunde}/{projekt}/_unzugeordnet/{yyyymmdd}_{hhmm}_{absender}_{originalname}
kunde = Organisation des Projekts, projekt = Projektname (slugifiziert). _unzugeordnet nutzt nur der Reviewer, wenn er eine Datei bewusst ohne Issue freigibt (Projektdokument); abgewiesene Dateien werden nicht archiviert und fallen unter die Löschfrist aus ADR-0060.
4. Metadaten stehen in message_attachments.storage_path und tracker_attachment_id; Nextcloud selbst ist kein Index. Volltextsuche über Dateien ist nicht Teil dieser Entscheidung.
5. Zugangsdaten in integration_connections(provider='nextcloud'): base_url, config.root_path, App-Passwort verschlüsselt. Ein technischer Nextcloud-Benutzer, Freigaben an Kunden erfolgen in Nextcloud, nicht aus Linetra.
6. Fehlerverhalten: Nextcloud nicht erreichbar → Celery-Retry mit Backoff (max. 24 h), Datei bleibt auf dem Volume und am Issue; Status in der Inbox sichtbar. Kein Verlust, keine stille Lücke.
Begründung
Das Volume ist bereits die verlässliche Ablage mit Download-Endpunkt und Rechteprüfung; es zu ersetzen hätte keinen Nutzen. Nextcloud löst das eigentliche Problem: Kunden und Buchhaltung finden Fotos nach Projekt und Aufgabe, ohne Jira zu öffnen. WebDAV ist in Nextcloud Standard, braucht keine App-Installation und läuft auf der vorhandenen NAS. Die Abstraktion ist eine Datei und verhindert, dass webdav in der Pipeline hart verdrahtet wird.
Verworfene Alternativen
| Alternative | Warum verworfen |
|---|---|
| Nextcloud als Primärablage (kein Volume) | Download-Pfad, Rechteprüfung und Idempotenz hängen dann an einem externen Dienst |
| Nur Jira-Anhänge | Kunde ohne Jira-Account sieht nichts; kein Archiv, kein Export |
| S3/MinIO zuerst | Keine Ordnersicht für Menschen; Nextcloud ist schon im Haus. S3 bleibt als Adapter möglich |
| Nextcloud-API (OCS) statt WebDAV | OCS für Shares nötig, nicht für Upload; WebDAV reicht und ist stabil |
| Ordner nach Datum statt Projekt/Issue | Niemand sucht Fotos nach Datum; Projekt → Aufgabe ist die Frage im Alltag |
| Externer Cloud-Dienst (SharePoint, Drive) | Zusätzlicher Auftragsverarbeiter; NAS ist vorhanden |
Folgen
- Bestehende
entity_files-Uploads bleiben unverändert; nur Nachrichten-Anhänge laufen zusätzlich nach Nextcloud. - Celery-Task
storage.archive_attachment(attachment_id, tenant_id), idempotent, Retry. - Settings-Route
/settings/integrationszeigt Nextcloud-Verbindung mit Test („Ordner anlegen/löschen“). - Löschfrist aus ADR-0060 betrifft Volume und Nachrichtentext; das Nextcloud-Archiv und die Tracker-Anhänge bleiben (Projektdokumentation).