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:
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:
- 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.
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
Aún no hay comentarios.