Zurück zur Startseite

Heim-Medienserver auf Docker: Transmission + Jellyfin + Telegram

Anleitung zum Erstellen eines Heim-Medienservers auf Docker-Basis mit Integration von Transmission, Jellyfin und Telegram Bot. NAS-Unterstützung, automatische Downloads und Benachrichtigungen.

Baue deinen eigenen Netflix in einem Abend: Docker, Transmission, Jellyfin und Telegram Bot
Advertisement 728x90

# Einen Heimmediaserver aufbauen: Transmission, Jellyfin und Telegram-Bot in Docker

In nur einem Abend können Sie einen vollwertigen Heimmediaserver mit praktischer Telegram-Steuerung zusammenstellen. Verabschieden Sie sich von der veralteten Transmission-Oberfläche zugunsten der modernen Flood UI, ersparen Sie sich manuelles Dateikopieren durch automatische Indizierung in Jellyfin und ersetzen Sie ständiges Überwachen durch Benachrichtigungen über abgeschlossene Downloads direkt in Ihrer Messaging-App. Alles läuft auf Network-Attached Storage (NAS) und startet mit einem einzigen Docker-Befehl.

Docker-basierte Lösungsarchitektur

Im Kern des Systems stehen drei Container, die ein gemeinsames Dateisystem über ein CIFS-Volume teilen. Transmission kümmert sich um Torrent-Downloads, Jellyfin indexiert Mediendateien und stellt eine Wiedergabeoberfläche bereit, während der Telegram-Bot als Benutzeroberfläche für Steuerung und Benachrichtigungen dient. Das Schlüsselmerkmal ist die Nutzung eines Docker-Volumes mit dem CIFS-Treiber, der das direkte Einbinden des Netzwerkfreigabes in den Containern ermöglicht, ohne an das lokale Dateisystem des Hosts gebunden zu sein.

Ein häufiger Anfängerfehler ist der Versuch, Bind-Mounts für Netzlaufwerke unter Windows zu verwenden. Wegen Eigenarten von WSL2 sind solche Pfade in Containern nicht sichtbar. Die Lösung besteht darin, den Volumentyp explizit als cifs mit Verbindungsoptionen anzugeben:

Google AdInline article slot
volumes:
  downloads:
    driver: local
    driver_opts:
      type: cifs
      device: ${SMB_HOST}
      o: "username=${SMB_USER},password=${SMB_PASSWORD},vers=3.0,uid=1000,gid=1000,file_mode=0777,dir_mode=0777"

Beide Dienste – Transmission und Jellyfin – nutzen dieses Volume, aber mit unterschiedlichen Mount-Punkten innerhalb der Container, was konsistente Pfade und keine Konflikte gewährleistet.

Einrichtung des Telegram-Bots und Automatisierung

Der Bot ist in Python mit der Bibliothek python-telegram-bot aufgebaut und interagiert mit Transmission über dessen RPC API. Er läuft im gemeinsamen Netzwerk-Stack-Modus mit dem Transmission-Container (network_mode: "service:transmission"), was zusätzliches Port-Forwarding überflüssig macht und die Latenz minimiert.

Wichtige Bot-Funktionen:

Google AdInline article slot
  • Hinzufügen von Torrents durch Senden von .torrent-Dateien oder Magnet-Links
  • Automatische Abschlussbenachrichtigungen mit Unicode-Fortschrittsbalken
  • Verwalten aktiver Downloads über Inline-Nachrichten-Buttons
  • Filterung von Benachrichtigungen, um Duplikate nach Bot-Neustarts zu vermeiden

Der Fortschrittsbalken wird mit einer einfachen Funktion umgesetzt:

def progress_bar(pct, width=12):
    filled = round(pct * width)
    return "█" * filled + "░" * (width - filled)

Um Spam bei Bot-Neustarts zu vermeiden, verfolgt er abgeschlossene Torrents per ID. Beim Start initialisiert das Skript eine completed_ids-Menge und sendet Benachrichtigungen nur für neu abgeschlossene Downloads.

Feinabstimmung von Transmission und Umgehung von Bildbeschränkungen

Das offizielle Image linuxserver/transmission hat eine Eigenart: Bei jedem Start überschreibt es Teile der settings.json und ignoriert Umgebungsvariablen. Das betrifft Einstellungen wie watch-dir, download-dir und incomplete-dir. Die Lösung ist der Mechanismus custom-cont-init.d, der benutzerdefinierte Skripte nach der Initialisierung, aber vor dem Start des Daemons ausführt.

Google AdInline article slot

Beispielskript 01-fix-settings.sh:

#!/bin/sh
mkdir -p /downloads/Downloads
mkdir -p /downloads/.incomplete
mkdir -p /downloads/watch

SETTINGS=/config/settings.json
if [ -f "$SETTINGS" ]; then
    sed -i 's|"watch-dir": ".*"|"watch-dir": "/downloads/watch"|' $SETTINGS
    sed -i 's|"watch-dir-enabled": false|"watch-dir-enabled": true|' $SETTINGS
    sed -i 's|"download-dir": ".*"|"download-dir": "/downloads/Downloads"|' $SETTINGS
    sed -i 's|"incomplete-dir": ".*"|"incomplete-dir": "/downloads/.incomplete"|' $SETTINGS
    sed -i 's|"incomplete-dir-enabled": false|"incomplete-dir-enabled": true|' $SETTINGS
fi

Ein weiteres Problem ist die Installation der Flood UI. Neuere Image-Versionen entfernen Drittanbieter-Oberflächen. Sie müssen das Archiv manuell von GitHub herunterladen und in config/flood-ui/ entpacken. Das Repo enthält ein Skript setup-flood.sh für die Automatisierung.

Erster Jellyfin-Start und TV-Integration

Nach dem Start der Container öffnen Sie die Jellyfin-Weboberfläche unter http://localhost:8096. Die Ersteinrichtung umfasst die Erstellung eines Benutzers und das Hinzufügen einer Medienbibliothek. Zeigen Sie auf /media/Downloads als Quelle – so ist der gemeinsame Ordner im Jellyfin-Container gemountet.

Jellyfin erledigt automatisch:

  • Scannen des Ordnerinhalts
  • Erkennen von Inhaltstypen (Filme, Serien)
  • Holen von Metadaten und Postern von TMDB
  • Aufbau einer intuitiven Navigation nach Genres, Jahren, Schauspielern

Für TV-Wiedergabe installieren Sie die offizielle Jellyfin-App (unterstützt Android TV, Apple TV, Fire TV, Roku). Beim ersten Start geben Sie die lokale IP und den Port 8096 des Hosts ein. Melden Sie sich mit dem zuvor erstellten Benutzer an.

Häufige Fragen und Funktionserweiterungen

Kein NAS? Ersetzen Sie das CIFS-Volume durch einen lokalen Ordner mit bind-Option:

volumes:
  downloads:
    driver: local
    driver_opts:
      type: none
      device: /absolute/path/to/folder
      o: bind

VPN gewünscht? Nutzen Sie den gluetun-Container und verschieben Sie Transmission in dessen Netzwerk-Namespace:

transmission:
  network_mode: "service:gluetun"
  depends_on:
    - gluetun

Wie aktualisieren? Führen Sie aus:

docker compose pull && docker compose up -d

Fernzugriff? Verwenden Sie Tailscale oder Cloudflare Tunnel – sicherer als Portfreigabe am Router.

Wichtige Punkte

  • CIFS-Volumes statt Bind-Mounts sind entscheidend für Netzlaufwerke in Docker Desktop unter Windows
  • Der Mechanismus custom-cont-init.d umgeht Einschränkungen des offiziellen Transmission-Images
  • Gemeinsamer Netzwerk-Stack zwischen Bot und Transmission vereinfacht die Einrichtung und erhöht die Zuverlässigkeit
  • Jellyfin bereichert Medien automatisch mit Metadaten – keine manuellen Anpassungen nötig
  • Alle Daten liegen auf externem NAS, das System ist betriebssystemunabhängig neu installierbar

— Editorial Team

Advertisement 728x90

Weiterlesen