nessi 7313eb96c3 feat: add nvidia-smi pmon integration to detect NVENC/NVDEC processes and display GPU process activity with auto-refresh status
Add graphics_process_log_state global to track GPU process changes. Query nvidia-smi pmon with 1-count sample to detect video encode/decode processes missed by compute-apps query. Parse pmon output for SM/ENC/DEC utilization percentages and process types. Merge pmon results with compute-apps by PID, preferring pmon data when available. Log GPU process detection with PID/name
2026-08-21 21:26:09 +02:00

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:

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:

RADARR_URL=http://radarr:7878
RADARR_API_KEY=...
RADARR_MEDIA_PATH=/data/filme
LOCAL_MEDIA_PATH=/media/filme
FILM_MEDIA_VOLUME=/nesflix/filme

Sonarr

SONARR_URL=http://sonarr:8989
SONARR_API_KEY=...
SONARR_MEDIA_PATH=/data/serien
LOCAL_SERIES_PATH=/media/serien
SERIES_MEDIA_VOLUME=/nesflix/serien

SABnzbd

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:

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

Scans laufen nach dem Laden der Bibliotheksdaten im Hintergrund. Über den Button „Neu scannen“ kann zwischen Radarr, Sonarr, allen Quellen und ausschließlich den aktuellen Einträgen der Liste „Ohne Deutsch“ gewählt werden. Die automatische Scan-Häufigkeit wird in den Einstellungen festgelegt.

SCAN_WORKERS=4
REQUEST_TIMEOUT=20
DB_PATH=/data/cache.db

SCAN_WORKERS steuert die Anzahl paralleler ffprobe-Jobs. Höhere Werte beschleunigen große Bibliotheken, erhöhen aber die I/O-Last.

Datastore, RAID und SMART

Der Datastore ist standardmäßig /nesflix und wird read-only eingebunden:

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:

NVIDIA_SMI_BIN=nvidia-smi

Für NVIDIA Container Toolkit kann der Service zusätzlich mit GPU-Zugriff gestartet werden:

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

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

docker compose up -d --build
docker compose logs -f media-max

Der Compose-Stack bindet standardmäßig ein:

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:

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:

ffprobe -v error \
  -show_entries stream=codec_type,codec_name:stream_tags=language \
  -of json "/media/filme/DEIN/FILM.mkv"

Für SMART:

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.

S
Description
No description provided
Readme
2.8 MiB
Languages
HTML 65.4%
Python 33.8%
JavaScript 0.6%
Dockerfile 0.2%