339 lines
11 KiB
Markdown
339 lines
11 KiB
Markdown
# U-Navigator - Machbarkeitsstudie
|
|
|
|
Stand: 2026-06-22
|
|
|
|
## Kurzfazit
|
|
|
|
U-Navigator ist machbar.
|
|
|
|
Ein Unraid-Plugin kann eine optische Dateiverwaltung direkt im Unraid-WebGUI bereitstellen. Der sinnvollste Ansatz ist aber nicht, die komplette Synology File Station als reines PHP-Plugin nachzubauen. Besser ist eine kleine Unraid-Integration, die eine moderne Web-App einbettet und einen klar begrenzten lokalen Backend-Dienst für Dateioperationen nutzt.
|
|
|
|
Empfohlene Zielarchitektur:
|
|
|
|
- Unraid-Plugin fuer Installation, WebGUI-Menueintrag, Konfiguration und Rechte-/Pfadgrenzen.
|
|
- Lokaler Backend-Dienst fuer Dateioperationen, Suche, Upload/Download, Vorschau und lange Jobs.
|
|
- Frontend als moderne Single Page App im Unraid-WebGUI.
|
|
- Zugriff standardmaessig nur auf erlaubte Unraid-Pfade wie `/mnt/user`, optional `/mnt/disk*`, `/mnt/cache`, `/mnt/poolname`.
|
|
|
|
## Was Unraid dafuer hergibt
|
|
|
|
Unraid laesst sich durch Plugins erweitern. Existierende reale Plugins zeigen das Muster:
|
|
|
|
- Plugin-Definition als `.plg`-Datei.
|
|
- Plugin-Dateien werden unter `/usr/local/emhttp/plugins/<plugin>` installiert.
|
|
- Persistente Plugin-Konfiguration liegt typischerweise unter `/boot/config/plugins/<plugin>`.
|
|
- WebGUI-Erweiterungen bestehen in der Praxis aus PHP, JavaScript, CSS, Shell-Skripten und paketierten Archivdateien.
|
|
|
|
Beispiele aus bestehenden Projekten:
|
|
|
|
- `community.applications` enthaelt ein Plugin-Verzeichnis unter `source/.../usr/local/emhttp/plugins/community.applications` und ist ueberwiegend PHP/JavaScript/HTML.
|
|
- `unassigned.devices` installiert Dateien nach `/usr/local/emhttp/plugins`, nutzt Shell-Skripte, Mountpoints und WebGUI-Seiten und zeigt, dass komplexere Storage-nahe Unraid-Plugins realistisch sind.
|
|
- `dynamix` ist bzw. war die WebGUI-Basisfamilie von Unraid; das alte Repository verweist auf die heutige Codebasis unter `github.com/unraid/dynamix`.
|
|
|
|
## Funktionsumfang nach Risikostufen
|
|
|
|
### MVP - realistisch
|
|
|
|
Ziel: Sicherer Dateibrowser fuer Unraid-Shares.
|
|
|
|
- Baumansicht fuer Shares und Ordner.
|
|
- Tabellen-/Listenansicht mit Name, Typ, Groesse, Datum, Besitzer/Rechten.
|
|
- Navigation in `/mnt/user`.
|
|
- Suchen nach Dateiname.
|
|
- Download einzelner Dateien.
|
|
- Upload in aktuellem Ordner.
|
|
- Ordner anlegen.
|
|
- Umbenennen.
|
|
- Kopieren/Verschieben innerhalb erlaubter Pfade.
|
|
- Loeschen mit Sicherheitsabfrage.
|
|
- Text-/Bildvorschau fuer einfache Dateitypen.
|
|
- Konfigurierbare erlaubte Root-Pfade.
|
|
|
|
Das ist technisch gut machbar.
|
|
|
|
### Erweiterter Umfang - machbar, aber mehr Aufwand
|
|
|
|
- Mehrfachauswahl mit Batch-Aktionen.
|
|
- Fortschrittsanzeige fuer lange Kopier-/Verschiebe-Jobs.
|
|
- Hintergrundjobs mit Queue.
|
|
- Archiv erstellen/entpacken.
|
|
- Medienvorschau fuer Video/Audio.
|
|
- Dateirechte bearbeiten.
|
|
- Owner/Group anzeigen oder aendern.
|
|
- Share-uebergreifende Suche mit Index.
|
|
- Papierkorb oder Undo-Logik.
|
|
- Drag and Drop Upload.
|
|
- Kontextmenues wie in Synology File Station.
|
|
|
|
Das ist machbar, braucht aber einen sauberen Job-Runner und robuste Fehlerbehandlung.
|
|
|
|
### Kritischer Umfang - nur mit klaren Grenzen
|
|
|
|
- Root-Dateisystem durchsuchen.
|
|
- Systemdateien bearbeiten.
|
|
- Dateien als root beliebig schreiben/loeschen.
|
|
- Direkte Bearbeitung von Docker-/VM-Images.
|
|
- Rekursive Massenoperationen ohne Quota, Dry-Run oder Abbruchmechanik.
|
|
- Oeffentliche Webfreigaben oder externe Links.
|
|
|
|
Diese Funktionen sind gefaehrlich und sollten nicht in den ersten Versionen enthalten sein.
|
|
|
|
## Architekturvorschlag
|
|
|
|
### Variante A: Reines Unraid-PHP-Plugin
|
|
|
|
Beschreibung:
|
|
Die Dateioperationen laufen direkt ueber PHP-Seiten und Shell-Kommandos im Unraid-WebGUI.
|
|
|
|
Vorteile:
|
|
|
|
- Nahe am klassischen Unraid-Plugin-Modell.
|
|
- Wenig Runtime-Abhaengigkeiten.
|
|
- Einfaches Installationspaket.
|
|
|
|
Nachteile:
|
|
|
|
- Moderne UI und lange Jobs werden schnell unhandlich.
|
|
- Shell-Aufrufe muessen extrem sauber abgesichert werden.
|
|
- Uploads, Streaming, Suche und Fortschritt sind schwieriger wartbar.
|
|
- PHP-Versionen und Unraid-WebGUI-Aenderungen koennen brechen.
|
|
|
|
Bewertung:
|
|
Machbar fuer einen einfachen Dateibrowser. Nicht ideal fuer eine File-Station-artige Anwendung.
|
|
|
|
### Variante B: Plugin + lokaler Backend-Dienst
|
|
|
|
Beschreibung:
|
|
Das Plugin installiert die WebGUI-Integration und startet einen lokalen Dienst. Das Frontend spricht diesen Dienst ueber HTTP oder Unix-Socket an.
|
|
|
|
Backend-Optionen:
|
|
|
|
- Go: sehr gut fuer statische Binary, Dateisystemoperationen, Performance.
|
|
- Rust: sehr robust, aber mehr Entwicklungsaufwand.
|
|
- Node.js: gute Web-Entwicklung, aber Runtime-Abhaengigkeit auf Unraid unschoener.
|
|
- Python: schnell fuer Prototyp, fuer Distribution auf Unraid weniger ideal.
|
|
|
|
Vorteile:
|
|
|
|
- Saubere API-Grenze.
|
|
- Bessere Kontrolle ueber Jobs, Streaming, Uploads und Suche.
|
|
- Moderne SPA moeglich.
|
|
- Backend kann strikt erlaubte Pfade erzwingen.
|
|
- Tests sind einfacher als bei reinem PHP/Shell.
|
|
|
|
Nachteile:
|
|
|
|
- Dienst-Lifecycle muss geloest werden.
|
|
- Binary-Builds fuer Unraid x86_64 noetig.
|
|
- Mehr Paketierungsaufwand.
|
|
|
|
Bewertung:
|
|
Beste technische Variante fuer U-Navigator.
|
|
|
|
### Variante C: Docker-App statt Plugin
|
|
|
|
Beschreibung:
|
|
U-Navigator laeuft als Docker-Container und wird ueber Community Applications installiert.
|
|
|
|
Vorteile:
|
|
|
|
- Saubere Isolation.
|
|
- Einfache Runtime-Abhaengigkeiten.
|
|
- Updates leichter.
|
|
- Weniger Risiko fuer das Unraid-WebGUI.
|
|
|
|
Nachteile:
|
|
|
|
- Fuehlt sich weniger nativ an.
|
|
- Integration ins Unraid-WebGUI nur indirekt.
|
|
- Rechte und Pfad-Mappings muessen sauber dokumentiert werden.
|
|
|
|
Bewertung:
|
|
Gut als Alternative oder spaeterer Parallelweg. Wenn das Ziel aber ein echtes Unraid-Plugin im WebGUI ist, ist Variante B passender.
|
|
|
|
## Sicherheitsmodell
|
|
|
|
Ein Dateimanager auf einem NAS ist sicherheitskritisch. Das Sicherheitsmodell sollte von Anfang an feststehen.
|
|
|
|
Mindestregeln:
|
|
|
|
- Keine frei uebergebenen Shell-Kommandos.
|
|
- Alle Pfade canonicalisieren und gegen erlaubte Root-Pfade pruefen.
|
|
- Symlinks bewusst behandeln, standardmaessig nicht aus erlaubten Roots ausbrechen lassen.
|
|
- Kein Zugriff auf `/boot`, `/etc`, `/usr`, `/var`, `/root` im MVP.
|
|
- Aktionen mit Schreibzugriff getrennt absichern.
|
|
- CSRF-Schutz fuer mutierende Requests.
|
|
- Upload-Limits.
|
|
- Maximalgroessen und Timeouts fuer Vorschauen.
|
|
- Lange Operationen als Jobs mit Abbruchmoeglichkeit.
|
|
- Audit-Log fuer Schreib-/Loeschoperationen.
|
|
- Optionaler Read-only-Modus.
|
|
|
|
Wichtig:
|
|
Unraid-WebGUI-Authentifizierung darf nicht blind als vollstaendige Autorisierung fuer alle Dateioperationen reichen. U-Navigator braucht zusaetzliche eigene Pfad- und Aktionsregeln.
|
|
|
|
## Technische Hauptfragen
|
|
|
|
### 1. WebGUI-Integration
|
|
|
|
Machbar. Bestehende Plugins installieren Seiten und Assets unter `/usr/local/emhttp/plugins/<plugin>`. U-Navigator kann dort eine Page registrieren und die SPA laden.
|
|
|
|
Offen zu pruefen auf echter Unraid-Instanz:
|
|
|
|
- Aktuelle Page-Konventionen unter Unraid 7.x.
|
|
- Theme-Kompatibilitaet.
|
|
- Auth-/CSRF-Mechanismen.
|
|
- Reverse-Proxy-Verhalten des WebGUI.
|
|
|
|
### 2. Dateioperationen
|
|
|
|
Machbar. Linux/Unraid stellt alle noetigen Dateisystemoperationen bereit.
|
|
|
|
Risiken:
|
|
|
|
- User Shares unter `/mnt/user` koennen ueber mehrere Disks/Pools verteilt sein.
|
|
- Move-Operationen koennen je nach Quelle/Ziel echte Kopien plus Delete sein.
|
|
- Sparse Files, Hardlinks, Symlinks und Dateirechte muessen korrekt behandelt werden.
|
|
- Sehr grosse Ordner duerfen das WebGUI nicht blockieren.
|
|
|
|
### 3. Suche
|
|
|
|
Zwei Stufen sind sinnvoll:
|
|
|
|
- MVP: nicht-indexierte Namenssuche unter dem aktuellen Root mit Limits.
|
|
- Spaeter: Indexdienst mit SQLite, `inotify`/periodischem Scan und Ausschlussregeln.
|
|
|
|
Volltextsuche in Dokumenten sollte nicht Teil des MVP sein.
|
|
|
|
### 4. Vorschau
|
|
|
|
Einfach machbar:
|
|
|
|
- Textdateien mit Groessenlimit.
|
|
- Bilder ueber Browser oder Backend-Thumbnails.
|
|
- PDF optional spaeter.
|
|
|
|
Aufwendig:
|
|
|
|
- Office-Dokumente.
|
|
- Video-Transcoding.
|
|
- Exif/Metadatenindex.
|
|
|
|
### 5. Paketierung
|
|
|
|
Machbar als `.plg` plus Paketarchiv.
|
|
|
|
Wichtige Bestandteile:
|
|
|
|
- `u-navigator.plg`
|
|
- Paket mit `usr/local/emhttp/plugins/u-navigator/...`
|
|
- Frontend-Build
|
|
- Backend-Binary
|
|
- Start-/Stop-Skripte
|
|
- Konfiguration unter `/boot/config/plugins/u-navigator/`
|
|
- Logs unter `/var/log` oder Plugin-spezifisch mit Rotation
|
|
|
|
## Empfohlener MVP-Schnitt
|
|
|
|
Version `0.1` sollte klein bleiben:
|
|
|
|
- Nur `/mnt/user` als Standardroot.
|
|
- Read-only-Modus als globale Option.
|
|
- Browse, Suche nach Name, Download.
|
|
- Schreibaktionen optional aktivierbar: Upload, Rename, Mkdir, Delete.
|
|
- Keine Rechte-/Owner-Aenderungen.
|
|
- Keine Archivfunktionen.
|
|
- Keine Volltextsuche.
|
|
- Keine externen Freigabelinks.
|
|
|
|
Damit laesst sich die technische Basis pruefen, ohne das NAS unnoetig zu gefaehrden.
|
|
|
|
## Prototyp-Plan
|
|
|
|
### Phase 1: Technischer Spike
|
|
|
|
Dauer: 1-2 Tage.
|
|
|
|
- Minimalen Unraid-Plugin-Skeleton bauen.
|
|
- Page im Unraid-WebGUI anzeigen.
|
|
- Statische SPA ausliefern.
|
|
- API-Endpunkt `GET /api/list?path=...` anbinden.
|
|
- Nur read-only Zugriff auf `/mnt/user`.
|
|
|
|
Erfolgskriterium:
|
|
U-Navigator erscheint im WebGUI und listet Share-Inhalte.
|
|
|
|
### Phase 2: Sicherer Dateibrowser
|
|
|
|
Dauer: 3-5 Tage.
|
|
|
|
- Pfad-Sandbox implementieren.
|
|
- Datei-/Ordnerdetails anzeigen.
|
|
- Download.
|
|
- Upload mit Limit.
|
|
- Rename/Mkdir/Delete hinter Feature-Flag.
|
|
- Fehlerfaelle sauber anzeigen.
|
|
|
|
Erfolgskriterium:
|
|
Alltaegliche Dateioperationen funktionieren in erlaubten Shares ohne Shell-Injection- oder Path-Traversal-Risiko.
|
|
|
|
### Phase 3: UX Richtung File Station
|
|
|
|
Dauer: 1-2 Wochen.
|
|
|
|
- Zwei-Pane-Layout oder Baum + Liste.
|
|
- Kontextmenues.
|
|
- Mehrfachauswahl.
|
|
- Drag and Drop.
|
|
- Fortschrittsdialoge.
|
|
- Bild-/Textvorschau.
|
|
- Suchpanel.
|
|
|
|
Erfolgskriterium:
|
|
Die Anwendung fuehlt sich wie ein nativer NAS-Dateimanager an.
|
|
|
|
## Risiken
|
|
|
|
### Hoch
|
|
|
|
- Sicherheit bei Schreib-/Loeschoperationen.
|
|
- Unraid-WebGUI-API und Plugin-Konventionen sind weniger stabil dokumentiert als bei grossen Frameworks.
|
|
- Operationen auf `/mnt/user` koennen unerwartete Disk-/Pool-Grenzen beruehren.
|
|
|
|
### Mittel
|
|
|
|
- Paketierung und Updates.
|
|
- Kompatibilitaet mit Unraid 6.12 vs. 7.x.
|
|
- Rechte/Owner/ACL-Verhalten.
|
|
- Performance bei sehr grossen Ordnern.
|
|
|
|
### Niedrig
|
|
|
|
- Reine UI-Anzeige.
|
|
- Namenssuche.
|
|
- Download einzelner Dateien.
|
|
- Text-/Bildvorschau mit Limits.
|
|
|
|
## Entscheidung
|
|
|
|
U-Navigator ist als Unraid-Plugin technisch machbar.
|
|
|
|
Die beste Umsetzung ist ein hybrides Plugin:
|
|
|
|
- Unraid-Plugin fuer Installation und Einbettung.
|
|
- Go-Backend als lokale Binary.
|
|
- SPA-Frontend fuer die File-Station-artige Bedienung.
|
|
- Striktes Sicherheitsmodell mit erlaubten Roots und Feature-Flags.
|
|
|
|
Nicht empfohlen ist ein grosses reines PHP/Shell-Plugin, weil Wartbarkeit, Sicherheit und moderne Bedienung dabei zu schnell gegenlaeufig werden.
|
|
|
|
## Quellen und Referenzen
|
|
|
|
- Unraid Dokumentation: https://docs.unraid.net/
|
|
- Unraid Dynamix Repository: https://github.com/unraid/dynamix
|
|
- Altes Dynamix Repository mit Verweis auf heutige Codebasis: https://github.com/bergware/dynamix
|
|
- Community Applications Plugin: https://github.com/Squidly271/community.applications
|
|
- Unassigned Devices Plugin: https://github.com/dlandon/unassigned.devices
|
|
- Beispiel `.plg` Unassigned Devices: https://raw.githubusercontent.com/dlandon/unassigned.devices/master/unassigned.devices.plg
|
|
- Beispiel `.plg` Community Applications: https://raw.githubusercontent.com/Squidly271/community.applications/master/plugins/community.applications.plg
|