# Simple File Upload Kunden laden Dateien/Ordner über einen individuellen Link hoch (ohne Login). Admin + Sachbearbeiter verwalten Kunden im Adminportal und greifen per WebDAV zu. ## Start ```bash cp .env.example .env # optional: Ports anpassen docker compose up -d --build ``` - Adminportal: - WebDAV: `webdav://HOST:1900/` (Basic Auth, dieselben Benutzer wie im Adminportal) **Beim ersten Start** öffnet sich ein **Setup-Wizard** — dort legst du den ersten Admin an. ## Rollen - **Admin**: legt Kunden + weitere Benutzer (Admins / Sachbearbeiter) an, verwaltet Upload-Links und pro-Kunde-Zugriffe. Hat WebDAV-Vollzugriff auf alles. - **Sachbearbeiter (Staff)**: sieht im Adminportal nur die Kunden, auf die ihm der Admin Zugriff erteilt hat. Per WebDAV greift er auf die zugeteilten Kundenordner zu (`read` oder `write`). - **Kunde**: kein Login; Upload via individuellem Token-Link (optional mit Passwort + Ablaufdatum). Sieht keine Dateiliste. ## Konfiguration ### `.env` (Ports) | Variable | Default | Zweck | |---------------|---------|--------------------------------------| | `APP_PORT` | `3500` | Host-Port für Adminportal + Upload | | `WEBDAV_PORT` | `1900` | Host-Port für WebDAV | ### Admin-GUI → Einstellungen - **Öffentliche Basis-URL**: wird in generierten Upload-Links verwendet. Leer = aus Request ableiten. - **Cron-Intervall (Minuten)**: periodischer DB/FS-Abgleich (entfernt verwaiste DB-Einträge von via WebDAV gelöschten Dateien und erfasst direkt per WebDAV hochgeladene Dateien). ### Volumes - `./data/db/` → SQLite-Datei neben der `docker-compose.yml` - `./data/uploads/` → ein Unterordner pro Kunde (Slug) - Named Volume `webdav-config` → dynamisch generierte Apache-Config Beide Container laufen als UID `1000:1000`. Falls vorhandene Daten root gehören: ```bash sudo chown -R 1000:1000 data/ ``` ## Wie die WebDAV-ACLs funktionieren Der App-Container erzeugt bei jeder Benutzer-/Kundenänderung: - `/webdav-config/htpasswd` — alle Benutzer (bcrypt-Hashes direkt aus DB) - `/webdav-config/access.conf` — pro Kundenordner ein ``-Block: - gleiche Read- und Write-User → ein `Require user …` - unterschiedliche → `` + `` für saubere Trennung Der WebDAV-Container (Debian Apache) beobachtet das Verzeichnis via `inotifywait` und ruft `apachectl graceful` auf → Änderungen sind in ~2 Sek. wirksam. ## Kunden-Upload - Datei-Button, Ordner-Button oder Drag & Drop (Dateien **und** Ordner — Struktur bleibt erhalten). - Optional Passwortabfrage, optional Ablaufdatum. - Kunde sieht keine Dateiliste, nur eigenes Upload-Feedback. ## WebDAV-Zugriff - **macOS Finder**: `Gehe zu → Mit Server verbinden → http://HOST:1900/` - **Linux / KDE Dolphin**: `webdav://@HOST:1900/` - **Windows**: siehe Abschnitt unten (einmalige Einrichtung nötig) Write-Rechte umfassen: `PUT`, `DELETE`, `MKCOL`, `MOVE`, `COPY`, `PROPPATCH`, `LOCK`, `UNLOCK`. In Dolphin löscht **Shift+Entf** direkt (umgeht den nicht existierenden WebDAV-Papierkorb). ### Windows als Netzlaufwerk verbinden Windows verweigert standardmäßig WebDAV via Basic Auth über HTTP und limitiert Dateien auf 50 MB. Beides per Registry erlauben: 1. [windows/enable-webdav-basicauth.reg](windows/enable-webdav-basicauth.reg) per Rechtsklick → **Zusammenführen** (als Administrator) ausführen. 2. WebClient-Dienst (neu) starten: ```cmd sc config WebClient start=auto net stop WebClient net start WebClient ``` 3. Verbinden — **HTTP-URL ist die saubere Variante** (eindeutig WebDAV, keine SMB-Verwechslung). Beispiel mit `karlheinz`-Credentials, gemountet als `Z:`: ```cmd net use Z: http://HOST:1900/frank-meier /user:karlheinz DEINPW /persistent:yes ``` Im Explorer **„Netzlaufwerk verbinden"** → Adresse: `http://HOST:1900/` bzw. `http://HOST:1900/frank-meier/`. Alternativ mit UNC-Syntax (intern dasselbe, etwas hakeliger): `\\HOST@1900\DavWWWRoot\frank-meier\` — `@1900` und `\DavWWWRoot\` sind dabei Pflicht, sonst landest du bei SMB Port 445. Wenn weiterhin „Ordner nicht gefunden" → meist ist der WebClient-Dienst nicht gestartet oder das Registry-Merge wurde nicht als Administrator ausgeführt. #### Bekannte Windows-Eigenheiten bei Read-Only-Zugriff Hat ein Sachbearbeiter nur **Leserechte**, zeigt der Windows-Explorer gelegentlich seltsames Verhalten: - **Entf-Taste „löscht" die Datei optisch** — der Server lehnt das `DELETE` korrekt mit `403` ab, aber der Explorer entfernt das Icon optimistisch. `F5` stellt die echte Sicht wieder her. - **Beim Doppelklick: „Datei existiert nicht, neu erstellen?"** — Office & Editoren senden vor dem Öffnen ein `LOCK`. Bei Read-Only schlägt das mit `403` fehl, das Programm denkt die Datei sei weg. Nach 30–60 Sek. (WebClient Negative-Cache läuft aus) klappt es dann meist direkt. Wenn dich das stört: [windows/disable-webdav-locking.reg](windows/disable-webdav-locking.reg) ausführen — schaltet WebDAV-Locking systemweit ab. Read-Only-Viewing läuft dann sofort und ohne Wartezeit. Trade-off: gemeinsames Bearbeiten ohne Konflikte kann nicht mehr über WebDAV-Locks koordiniert werden.