Add RAID_REFRESH_SECONDS/IO_REFRESH_SECONDS/GPU_REFRESH_SECONDS environment variables with default 5 seconds and minimum 2 seconds. Add graphics_cache_lock and graphics_cache global for thread-safe GPU data access. Add io/io_at fields to datastore_cache. Extract refresh_io_status() to update I/O pressure cache. Add refresh_gpu_status() to update graphics_cache. Implement hardware
203 lines
6.9 KiB
Markdown
203 lines
6.9 KiB
Markdown
# Media Max
|
|
|
|
Media Max ist ein kompaktes Media-Control-Dashboard für Radarr, Sonarr und SABnzbd. Es zeigt Medienqualität, Audio- und Untertitelspuren, fehlende deutsche Spuren, laufende Downloads sowie System-, Speicher- und RAID-Status.
|
|
|
|
## Funktionen
|
|
|
|
- Radarr-Filme mit Qualität, Status, Audio, Untertiteln, Codec und Größe
|
|
- Sonarr-Serien mit Episodenansicht und Kategorien über Tags:
|
|
- `anime` → Anime
|
|
- `kdrama` → K-Dramen
|
|
- alle anderen → Standard
|
|
- Separate Liste „Ohne Deutsch“ für vorhandene oder aktuell geladene Medien
|
|
- Staffel 0 kann in den Einstellungen ein- oder ausgeblendet werden
|
|
- Externe Untertitel (`.srt`, `.ass`, `.ssa`, `.vtt`, `.sub`, `.idx`, `.sup`) werden berücksichtigt
|
|
- SABnzbd-Downloadübersicht mit aktiven Downloads und separater Queue-/Verifying-Tabelle
|
|
- Download-Sprachen aus üblichen Release-Kürzeln wie `Eng`, `Ger`, `Fre`, `Ita` und `Spa`
|
|
- Dashboard mit Diensten, CPU, RAM, Speicher, I/O Pressure und Bibliotheksstatistiken
|
|
- Datastore mit Kategorien, Gesamtauslastung, I/O Pressure und RAID-Status
|
|
- Graphics-Tab mit NVIDIA-GPU-Modell, Treiber, UUID, Seriennummer, Temperatur, Auslastung, VRAM, Leistung, Clocks und GPU-Prozessen
|
|
- RAID-Rebuild-Fortschritt, Geschwindigkeit, Restzeit, Plattenmodell, SMART, Temperatur und Hersteller-Seriennummer
|
|
- Parallele Hintergrundscans mit konfigurierbarer Worker-Anzahl
|
|
- PWA-Unterstützung für HTTPS-fähige Installationen auf Desktop und Android
|
|
|
|
## Konfiguration
|
|
|
|
Persönliche Werte gehören in `.env`. Die Datei ist in `.gitignore` eingetragen. Als Vorlage dient `.env.example`:
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
### Radarr und Medienpfade
|
|
|
|
Radarr kann beispielsweise `/data/filme` verwenden, während Media Max die Dateien im Container unter `/media/filme` sieht:
|
|
|
|
```env
|
|
RADARR_URL=http://radarr:7878
|
|
RADARR_API_KEY=...
|
|
RADARR_MEDIA_PATH=/data/filme
|
|
LOCAL_MEDIA_PATH=/media/filme
|
|
FILM_MEDIA_VOLUME=/nesflix/filme
|
|
```
|
|
|
|
### Sonarr
|
|
|
|
```env
|
|
SONARR_URL=http://sonarr:8989
|
|
SONARR_API_KEY=...
|
|
SONARR_MEDIA_PATH=/data/serien
|
|
LOCAL_SERIES_PATH=/media/serien
|
|
SERIES_MEDIA_VOLUME=/nesflix/serien
|
|
```
|
|
|
|
### SABnzbd
|
|
|
|
```env
|
|
SAB_URL=http://sabnzbd:8080
|
|
SAB_API_KEY=...
|
|
```
|
|
|
|
Der Download-Tab verwendet Queue und History aus SABnzbd. Für laufende Releases werden Sprachen aus dem Dateinamen abgeleitet; die Medienanalyse nach dem Import erfolgt über `ffprobe`.
|
|
|
|
## Dienststatus
|
|
|
|
Der Dashboard-Tab prüft die Dienste parallel mit kurzen Timeouts und aktualisiert sie regelmäßig:
|
|
|
|
```env
|
|
JELLYFIN_URL=http://jellyfin:8096
|
|
SEERR_URL=http://seerr:5055
|
|
PROWLARR_URL=http://prowlarr:9696
|
|
EASYNEWS_INDEXER_URL=http://easynews-as-indexer:8081
|
|
QBITTORRENT_URL=http://host.docker.internal:8080
|
|
BAZARR_URL=http://bazarr:6767
|
|
LINGARR_URL=http://lingarr:9876
|
|
LIBRETRANSLATE_URL=http://libretranslate:5000
|
|
SONARR_PROWLARR_PROXY_URL=http://sonarr-prowlarr-proxy:8080
|
|
RADARR_PROWLARR_PROXY_URL=http://radarr-prowlarr-proxy:8080
|
|
SERVICE_CHECK_TIMEOUT=3
|
|
SERVICE_REFRESH_SECONDS=30
|
|
```
|
|
|
|
Die Container müssen im gemeinsamen Docker-Netzwerk `media-stack_default` erreichbar sein. qBittorrent läuft außerhalb des Compose-Stacks und benötigt deshalb eine erreichbare URL. Bei Bedarf stellt `extra_hosts` den Namen `host.docker.internal` bereit.
|
|
|
|
## Scans und Performance
|
|
|
|
Der Bibliotheks-Sync läuft als serverseitiger Hintergrund-Thread und benötigt keinen geöffneten Browser. Beim Start und anschließend nach `SYNC_INTERVAL_SECONDS` werden Radarr, Sonarr und die Sprachprüfung aktualisiert. Über den Button „Neu scannen“ kann weiterhin manuell zwischen Radarr, Sonarr, allen Quellen und ausschließlich den aktuellen Einträgen der Liste „Ohne Deutsch“ gewählt werden.
|
|
|
|
```env
|
|
SCAN_WORKERS=4
|
|
REQUEST_TIMEOUT=20
|
|
DB_PATH=/data/cache.db
|
|
SYNC_INTERVAL_SECONDS=1800
|
|
RAID_REFRESH_SECONDS=5
|
|
IO_REFRESH_SECONDS=5
|
|
GPU_REFRESH_SECONDS=5
|
|
```
|
|
|
|
`SCAN_WORKERS` steuert die Anzahl paralleler `ffprobe`-Jobs. Höhere Werte beschleunigen große Bibliotheken, erhöhen aber die I/O-Last.
|
|
`SYNC_INTERVAL_SECONDS` steuert den serverseitigen Sync-Takt; `1800` entspricht 30 Minuten, `18000` fünf Stunden und `0` deaktiviert die periodische Wiederholung (der Start-Sync bleibt aktiv).
|
|
RAID, I/O-Pressure und GPU werden unabhängig vom Browser durch eigene Hintergrund-Monitoren aktualisiert. Die Werte werden aus dem Server-Cache geliefert; die drei Intervalle können separat angepasst werden.
|
|
|
|
## Datastore, RAID und SMART
|
|
|
|
Der Datastore ist standardmäßig `/nesflix` und wird read-only eingebunden:
|
|
|
|
```env
|
|
DATASTORE_PATH=/nesflix
|
|
DATASTORE_HOST_PATH=/nesflix
|
|
RAID_DEVICE=/dev/md127
|
|
STORAGE_CACHE_SECONDS=900
|
|
SMART_ENABLED=true
|
|
HOST_SYS_PATH=/host-sys
|
|
```
|
|
|
|
Für SMART, Temperaturen und echte Hersteller-Seriennummern benötigt der Container Zugriff auf `/dev`, `/sys`, `/run/udev`, `SYS_RAWIO` sowie `smartctl` im Image. Die App liest keine RAID-Daten schreibend und führt keinen Rebuild aus.
|
|
|
|
Die I/O Pressure basiert auf Linux PSI (`/proc/pressure/io`). Wenn der Kernel PSI nicht unterstützt, wird die Anzeige als nicht verfügbar markiert.
|
|
|
|
### NVIDIA Graphics
|
|
|
|
Der Graphics-Tab verwendet `nvidia-smi` im Container. Optional kann der Pfad über `NVIDIA_SMI_BIN` gesetzt werden:
|
|
|
|
```env
|
|
NVIDIA_SMI_BIN=nvidia-smi
|
|
```
|
|
|
|
Für NVIDIA Container Toolkit kann der Service zusätzlich mit GPU-Zugriff gestartet werden:
|
|
|
|
```yaml
|
|
deploy:
|
|
resources:
|
|
reservations:
|
|
devices:
|
|
- driver: nvidia
|
|
count: all
|
|
capabilities: [gpu]
|
|
environment:
|
|
NVIDIA_VISIBLE_DEVICES: all
|
|
NVIDIA_DRIVER_CAPABILITIES: compute,utility
|
|
```
|
|
|
|
Wenn `nvidia-smi` nicht erreichbar ist, bleibt der Tab verfügbar und zeigt den Grund an.
|
|
|
|
## Logging
|
|
|
|
```env
|
|
LOG_LEVEL=INFO
|
|
LOG_FILE=/data/media-max.log
|
|
LOG_RETENTION_HOURS=6
|
|
```
|
|
|
|
Erwartbare Verbindungsfehler werden als kurze einzeilige Meldungen protokolliert. Die Logdatei wird standardmäßig alle sechs Stunden rotiert.
|
|
|
|
## Start mit Docker Compose
|
|
|
|
```bash
|
|
docker compose up -d --build
|
|
docker compose logs -f media-max
|
|
```
|
|
|
|
Der Compose-Stack bindet standardmäßig ein:
|
|
|
|
```yaml
|
|
volumes:
|
|
- ${FILM_MEDIA_VOLUME}:/media/filme:ro
|
|
- ${SERIES_MEDIA_VOLUME:-/nesflix/serien}:/media/serien:ro
|
|
- ${DATASTORE_HOST_PATH:-/nesflix}:/nesflix:ro
|
|
- /dev:/host-dev:ro
|
|
- /sys:/host-sys:ro
|
|
- /run/udev:/host-run-udev:ro
|
|
- ./data:/data
|
|
```
|
|
|
|
Für Radarr, Sonarr und die weiteren Container wird das externe Netzwerk `media-stack_default` verwendet.
|
|
|
|
## Fehlersuche
|
|
|
|
Prüfe zuerst, ob Media Max die Medien sieht:
|
|
|
|
```bash
|
|
docker exec -it media-max sh
|
|
ls -lah /media/filme
|
|
ls -lah /media/serien
|
|
find /media/filme -type f | head
|
|
```
|
|
|
|
Teste anschließend `ffprobe` direkt im Container:
|
|
|
|
```bash
|
|
ffprobe -v error \
|
|
-show_entries stream=codec_type,codec_name:stream_tags=language \
|
|
-of json "/media/filme/DEIN/FILM.mkv"
|
|
```
|
|
|
|
Für SMART:
|
|
|
|
```bash
|
|
smartctl -i -d sat /host-dev/sda
|
|
smartctl -A -d sat /host-dev/sda
|
|
```
|
|
|
|
Wenn eine PWA-Installation in Chrome nicht angeboten wird, muss Media Max über gültiges HTTPS aufgerufen werden. Nach Änderungen an Manifest oder Service Worker sollten alte Website-Daten bzw. eine alte Verknüpfung entfernt und die Seite neu geladen werden.
|