Créer un serveur multimédia domestique : Transmission, Jellyfin et bot Telegram dans Docker
En une seule soirée, vous pouvez monter un serveur multimédia domestique complet avec un contrôle pratique via Telegram. Remplacez l'interface dépassée de Transmission par l'UI moderne Flood, évitez la copie manuelle des fichiers grâce à l'indexation automatique dans Jellyfin, et troquez la surveillance constante contre des notifications de fin de téléchargement directement dans votre messager. Tout repose sur un stockage connecté au réseau (NAS) et se lance d'une seule commande Docker.
Architecture de la solution basée sur Docker
Au cœur du système, trois conteneurs partagent un système de fichiers commun via un volume CIFS. Transmission gère les téléchargements torrent, Jellyfin indexe les fichiers multimédias et fournit une interface de visionnage, tandis que le bot Telegram sert d'interface utilisateur pour le contrôle et les notifications. La fonctionnalité clé est l'utilisation d'un volume Docker avec le pilote CIFS, qui permet de monter directement le partage réseau dans les conteneurs sans le lier au système de fichiers local de l'hôte.
Une erreur courante chez les débutants est d'essayer d'utiliser des montages bind pour les disques réseau sur Windows. À cause des particularités de WSL2, ces chemins ne sont pas visibles dans les conteneurs. La solution est de spécifier explicitement le type de volume comme cifs avec les paramètres de connexion :
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"
Les deux services — Transmission et Jellyfin — utilisent ce volume mais avec des points de montage différents dans les conteneurs, garantissant des chemins cohérents et évitant les conflits.
Mise en place du bot Telegram et de l'automatisation
Le bot est développé en Python avec la bibliothèque python-telegram-bot et interagit avec Transmission via son RPC API. Il s'exécute en mode pile réseau partagée avec le conteneur Transmission (network_mode: "service:transmission"), éliminant le besoin de redirection de ports supplémentaire et minimisant la latence.
Fonctionnalités clés du bot :
- Ajout de torrents en envoyant des fichiers .torrent ou des liens magnet
- Notifications automatiques de fin avec une barre de progression Unicode
- Gestion des téléchargements actifs via des boutons de message inline
- Filtrage des notifications pour éviter les doublons au redémarrage
La barre de progression est implémentée avec une fonction simple :
def progress_bar(pct, width=12):
filled = round(pct * width)
return "█" * filled + "░" * (width - filled)
Pour éviter le spam au redémarrage du bot, il suit les torrents terminés par ID. Au démarrage, le script initialise un ensemble completed_ids et n'envoie des notifications que pour les nouveaux téléchargements achevés.
Ajustements fins de Transmission et contournement des limitations d'images
L'image officielle linuxserver/transmission a une particularité : à chaque lancement, elle écrase des parties de settings.json, ignorant les variables d'environnement. Cela concerne des paramètres comme watch-dir, download-dir et incomplete-dir. La solution est le mécanisme custom-cont-init.d, qui exécute des scripts personnalisés après l'initialisation mais avant le démarrage du démon.
Exemple de script 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
Un autre problème est l'installation de Flood UI. Les versions récentes de l'image suppriment les interfaces tierces. Il faut télécharger manuellement l'archive depuis GitHub et la décompresser dans config/flood-ui/. Le dépôt inclut un script setup-flood.sh pour l'automatisation.
Premier lancement de Jellyfin et intégration TV
Après le démarrage des conteneurs, ouvrez l'interface web de Jellyfin à http://localhost:8096. La configuration initiale consiste à créer un utilisateur et à ajouter une bibliothèque multimédia. Pointez vers /media/Downloads comme source — c'est ainsi que le dossier partagé est monté dans le conteneur Jellyfin.
Jellyfin gère automatiquement :
- Scan du contenu des dossiers
- Identification des types de contenu (films, séries TV)
- Récupération des métadonnées et affiches depuis TMDB
- Construction d'une navigation intuitive par genres, années, acteurs
Pour regarder la TV, installez l'application officielle Jellyfin (compatible Android TV, Apple TV, Fire TV, Roku). Au premier lancement, saisissez l'IP locale de votre hôte et le port 8096. Connectez-vous avec l'utilisateur créé précédemment.
Questions courantes et extensions de fonctionnalités
Pas de NAS ? Remplacez le volume CIFS par un dossier local avec l'option bind :
volumes:
downloads:
driver: local
driver_opts:
type: none
device: /absolute/path/to/folder
o: bind
Envie d'un VPN ? Utilisez le conteneur gluetun et basculez Transmission dans son espace de noms réseau :
transmission:
network_mode: "service:gluetun"
depends_on:
- gluetun
Comment mettre à jour ? Exécutez :
docker compose pull && docker compose up -d
Accès distant ? Optez pour Tailscale ou Cloudflare Tunnel — plus sûr que l'ouverture de ports sur le routeur.
Points clés
- Les volumes CIFS priment sur les bind mounts pour les disques réseau dans Docker Desktop sur Windows
- Le mécanisme custom-cont-init.d contourne les restrictions de l'image officielle Transmission
- La pile réseau partagée entre le bot et Transmission simplifie la configuration et améliore la fiabilité
- Jellyfin enrichit automatiquement les médias de métadonnées — pas besoin d'ajustements manuels
- Toutes les données résident sur un NAS externe, rendant le système résistant à une réinstallation d'OS
— Editorial Team
Aucun commentaire pour le moment.