Volver al inicio

Servidor de Medios Doméstico en Docker: Transmission + Jellyfin + Telegram

Guía para Crear un Servidor de Medios Doméstico Basado en Docker con Integración de Transmission, Jellyfin y Bot de Telegram. Soporte para NAS, Descargas Automáticas y Notificaciones.

Construye Tu Propio Netflix en Una Tarde: Docker, Transmission, Jellyfin y Bot de Telegram
Advertisement 728x90

Creando un servidor multimedia doméstico: Transmission, Jellyfin y bot de Telegram en Docker

En solo una tarde, puedes montar un servidor multimedia doméstico completo con control práctico mediante Telegram. Olvídate de la interfaz anticuada de Transmission por la moderna Flood UI, evita la copia manual de archivos con indexación automática en Jellyfin, y sustituye el monitoreo constante por notificaciones de finalización de descargas directamente en tu mensajero. Todo funciona sobre almacenamiento conectado a la red (NAS) y se lanza con un solo comando de Docker.

Arquitectura de la solución basada en Docker

En el corazón del sistema hay tres contenedores que comparten un sistema de archivos común mediante un volumen CIFS. Transmission se encarga de las descargas de torrents, Jellyfin indexa los archivos multimedia y proporciona una interfaz de visualización, mientras que el bot de Telegram actúa como interfaz de usuario para el control y las notificaciones. La característica clave es usar un volumen de Docker con el driver CIFS, que permite montar directamente la carpeta de red dentro de los contenedores sin atarse al sistema de archivos local del host.

Un error común de novatos es intentar usar bind mounts para unidades de red en Windows. Debido a las peculiaridades de WSL2, dichas rutas no son visibles dentro de los contenedores. La solución es especificar explícitamente el tipo de volumen como cifs con parámetros de conexión:

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"

Ambos servicios —Transmission y Jellyfin— usan este volumen pero con puntos de montaje diferentes dentro de los contenedores, asegurando rutas consistentes y sin conflictos.

Configuración del bot de Telegram y automatización

El bot está construido en Python usando la librería python-telegram-bot e interactúa con Transmission vía su RPC API. Se ejecuta en modo de pila de red compartida con el contenedor de Transmission (network_mode: "service:transmission"), eliminando el reenvío extra de puertos y minimizando la latencia.

Características clave del bot:

Google AdInline article slot
  • Añadir torrents enviando archivos .torrent o enlaces magnet
  • Notificaciones automáticas de finalización con una barra de progreso Unicode
  • Gestión de descargas activas mediante botones de mensajes inline
  • Filtrado de notificaciones para evitar duplicados al reiniciar

La barra de progreso se implementa con una función simple:

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

Para evitar spam en reinicios del bot, rastrea los torrents completados por ID. Al inicio, el script inicializa un conjunto completed_ids, enviando notificaciones solo para descargas recién finalizadas.

Ajustes finos de Transmission y evadir limitaciones de imágenes

La imagen oficial linuxserver/transmission tiene una peculiaridad: en cada lanzamiento, sobrescribe partes de settings.json, ignorando las variables de entorno. Esto afecta configuraciones como watch-dir, download-dir e incomplete-dir. La solución es el mecanismo custom-cont-init.d, que ejecuta scripts personalizados después de la inicialización pero antes de iniciar el daemon.

Google AdInline article slot

Ejemplo 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

Otro problema es instalar Flood UI. Las versiones más nuevas de la imagen eliminan interfaces de terceros. Debes descargar manualmente el archivo de GitHub y desempaquetarlo en config/flood-ui/. El repositorio incluye un script setup-flood.sh para automatizarlo.

Primer lanzamiento de Jellyfin e integración con TV

Después de iniciar los contenedores, abre la interfaz web de Jellyfin en http://localhost:8096. La configuración inicial implica crear un usuario y añadir una biblioteca de medios. Apunta a /media/Downloads como fuente: así es como se monta la carpeta compartida en el contenedor de Jellyfin.

Jellyfin hace automáticamente:

  • Escanear el contenido de las carpetas
  • Identificar tipos de contenido (películas, series de TV)
  • Obtener metadatos y pósters de TMDB
  • Construir una navegación intuitiva por géneros, años, actores

Para ver en TV, instala la app oficial de Jellyfin (compatible con Android TV, Apple TV, Fire TV, Roku). En el primer lanzamiento, introduce la IP local de tu host y el puerto 8096. Inicia sesión con el usuario que creaste antes.

Preguntas comunes y extensiones de funcionalidad

¿No tienes NAS? Cambia el volumen CIFS por una carpeta local con opción bind:

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

¿Quieres VPN? Usa el contenedor gluetun y mueve Transmission a su namespace de red:

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

¿ Cómo actualizar? Ejecuta:

docker compose pull && docker compose up -d

¿Acceso remoto? Usa Tailscale o Cloudflare Tunnel, más seguro que reenviar puertos en el router.

Puntos clave

  • Los volúmenes CIFS sobre bind mounts son cruciales para unidades de red en Docker Desktop en Windows
  • El mecanismo custom-cont-init.d evade las restricciones de la imagen oficial de Transmission
  • La pila de red compartida entre el bot y Transmission simplifica la configuración y mejora la fiabilidad
  • Jellyfin enriquece automáticamente los medios con metadatos, sin necesidad de ajustes manuales
  • Todos los datos residen en NAS externo, haciendo el sistema resistente a reinstalaciones del SO

— Editorial Team

Advertisement 728x90

Leer después