simple-web-file-upload/README.md

124 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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: <http://localhost:3500/>
- 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`. Der App-Container startet kurz
als root, korrigiert die Eigentümer der `./data/`-Mountpunkte auf `1000:1000`
und droppt dann via `gosu` die Privilegien — fresh deploys laufen also ohne
manuellen `chown` durch.
## 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 `<Location>`-Block:
- gleiche Read- und Write-User → ein `Require user …`
- unterschiedliche → `<Limit GET PROPFIND OPTIONS HEAD>` + `<LimitExcept …>` 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://<user>@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 3060 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.