# 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:
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:
- 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.
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
Noch keine Kommentare.