Adds setup/login auth-logo elements that share applyLogo's existence check, so the brand image appears on the unauthenticated screens too when one is configured and quietly stays hidden otherwise. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| public | ||
| src | ||
| webdav | ||
| windows | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| Dockerfile | ||
| README.md | ||
| docker-compose.yml | ||
| entrypoint.sh | ||
| package.json | ||
README.md
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
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 (
readoderwrite). - 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 derdocker-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
- gleiche Read- und Write-User → ein
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:
-
windows/enable-webdav-basicauth.reg per Rechtsklick → Zusammenführen (als Administrator) ausführen.
-
WebClient-Dienst (neu) starten:
sc config WebClient start=auto net stop WebClient net start WebClient -
Verbinden — HTTP-URL ist die saubere Variante (eindeutig WebDAV, keine SMB-Verwechslung). Beispiel mit
karlheinz-Credentials, gemountet alsZ::net use Z: http://HOST:1900/frank-meier /user:karlheinz DEINPW /persistent:yesIm 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\—@1900und\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
DELETEkorrekt mit403ab, aber der Explorer entfernt das Icon optimistisch.F5stellt 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 mit403fehl, 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 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.