Retour à l'accueil

Serveur Multimédia Domestique sur Docker : Transmission + Jellyfin + Telegram

Guide pour Créer un Serveur Multimédia Domestique Basé sur Docker avec Intégration de Transmission, Jellyfin et Bot Telegram. Support NAS, Téléchargements Automatiques et Notifications.

Construisez Votre Propre Netflix en Une Soirée : Docker, Transmission, Jellyfin et Bot Telegram
Advertisement 728x90

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 :

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"

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 :

Google AdInline article slot
  • 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.

Google AdInline article slot

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

Advertisement 728x90

Lire ensuite