Saltar a contenido

Media Center

Introducción

image.png

Es un ecosistema de software que permite organizar y reproducir contenido multimedia.

  • Servidor Multimedia: Con Plex Media Server, puedes convertir un ordenador o NAS en tu propio "Netflix" personal para ver tus películas, fotos y música en cualquier dispositivo.
  • Contenido Gratuito: Ofrece más de 50,000 títulos bajo demanda y más de 600 canales de TV en vivo gratis con publicidad.
  • Plex Pass (Premium): Suscripción que añade funciones como descarga offline, modo DVR para grabar TV y transcodificación de hardware.

Requisitos

  • Docker funcionando en UGOS Pro ✔
  • Las variables definidas:
    • ${PROJECTS_DIRECTORY} → /volume1/docker
    • ${MEDIA_DIRECTORY} → /volume1/media
    • ${DOWNLOADS_DIRECTORY} → /volume1/downloads
# definicion de variables
sudo vi /etc/environment
# copia al final las líneas
PROJECTS_DIRECTORY="/volume1/docker"
MEDIA_DIRECTORY="/volume1/media"
  • Puertos de firewall redirigidos hacia el servidor (Ugreen NAS IP)
    • Obligatorios:
      • PLEX -> TCP 32400
      • qBittorrent -> TCP/UDP 6881
    • Opcionales:
      • NGINX Proxy Manager -> TCP 80 y TCP 443

Estructura de carpetas

|
├── ${PROJECTS_DIRECTORY} # En Ugreen ->/volume1/docker
│   ├── plex
│   |   └── config
|   |
│   ├── qbittorrent
│   |   └── config
|   |
│   └── servarr
│       ├── radarr
│       |   └── config
│       ├── sonarr
│       |   └── config
│       ├── lidarr
│       |   └── config
│       ├── prowlarr
│       |   └── config
│       ├── flaresolverr
│       |   └── config
│       └── seerr
│           └── config
|
└── ${MEDIA_DIRECTORY} # En Ugreen ->/volume1/media
    ├── movies
    ├── tv
    ├── music
    └── downloads
        ├── complete
        └── incomplete

PLEX

image.png(https://watch.plex.tv/es/me "PLEX")

Es un ecosistema de software que permite organizar y reproducir contenido multimedia.

  • Servidor Multimedia: Con Plex Media Server, puedes convertir un ordenador o NAS en tu propio "Netflix" personal para ver tus películas, fotos y música en cualquier dispositivo.
  • Contenido Gratuito: Ofrece más de 50,000 títulos bajo demanda y más de 600 canales de TV en vivo gratis con publicidad.
  • Plex Pass (Premium): Suscripción que añade funciones como descarga offline, modo DVR para grabar TV y transcodificación de hardware.

https://docs.linuxserver.io/images/docker-plex/

Estructura de carpetas

|
├── ${PROJECTS_DIRECTORY} # En Ugreen ->/volume1/docker
│   └── plex
│       └── config
|
└── ${MEDIA_DIRECTORY} # En Ugreen ->/volume1/media
    ├── movies
    ├── tv
    └── music

Instalación

# Creación de la carpeta del proyecto plex
mkdir -p ${PROJECTS_DIRECTORY}/plex/config
touch ${PROJECTS_DIRECTORY}/plex/.env ${PROJECTS_DIRECTORY}/plex/docker-compose.yaml
chown -R 1000:1000 ${PROJECTS_DIRECTORY}/plex

# Creación de las carpetas para contenido (películas, series, música)
mkdir -p ${MEDIA_DIRECTORY}/{movies,tv,music}
chown -R 1000:1000 ${MEDIA_DIRECTORY}

.env

# Ruta absoluta en el host donde vive tu biblioteca multimedia. Ejemplo Ugreen: /volume1/media
MEDIA_DIRECTORY=/ruta/a/media

docker-compose.yaml

services:
  plex:
    image: lscr.io/linuxserver/plex
    container_name: plex
    network_mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
      - VERSION=docker
      - PLEX_CLAIM=claim-xxxxxxxxxxxxxxxxx # obtener token desde plex.tv/claim
    volumes:
      - ./config:/config
      - ${MEDIA_DIRECTORY}:/media
    restart: unless-stopped
    devices:
      - /dev/dri:/dev/dri

La opción network_mode: host arranca el contenedor en la misma red que el NAS y hace que no sea necesario configurar puertos en el contenedor

La variable PLEX_CLAIM=claim-xxxxxxxxxxxxxxxxx se usa para reclamar el nuevo servidor PLEX desde tu cuenta de PLEX.tv

Puesta en marcha

# Arranca el proyecto
docker compose up -d
# Compureba logs
docker compose logs

El servidor Plex aún no está reclamado (claimed) por tu cuenta.Para reclamarlo desde un PC dentro de la misma LAN abre: http://IP_DEL_NAS:32400/web

Inicia sesión con tu cuenta Plex y te debería aparecer el asistente para “reclamar” el servidor.

Ajustes

  • Usar aceleración de hardware
  • Usar codificación de video acelerada por hardware
  • Habilitar la codificación de video HEVC (experimental) → Nunca
  • Dispositivo de transcodificación de hardware: Automático
  • GPU transcodes → 2
  • CPU transcodes → 1

image.png

  • Carpeta temporal del transcodificador: /config/Library/Application Support/Plex Media Server/Cache
  • Preset de conversión x264 en segundo plano: Muy rápido
  • Habilitar el mapeo de tonos HDR → DESACTIVAR

image.png

Para comprobar que TODO va bien, mientras reproduces algo que transcodifique, ejecuta mediante CLI en la NAS: intel_gpu_top

Descargas

qBittorrent

image.png

Estructura de carpetas

|
├── ${PROJECTS_DIRECTORY} # En Ugreen ->/volume1/docker
|   |
│   └── qbittorrent
|       └── config
|
└── ${MEDIA_DIRECTORY} # En Ugreen ->/volume1/media
    ├── movies
    ├── tv
    ├── music
    └── downloads
        ├── complete
        └── incomplete

Instalación

# Creación de la carpeta del proyecto qbittorrent
mkdir -p ${PROJECTS_DIRECTORY}/qbittorrent/config
touch ${PROJECTS_DIRECTORY}/qbittorrent/.env ${PROJECTS_DIRECTORY}/qbittorrent/docker-compose.yaml
chown -R 1000:1000 ${PROJECTS_DIRECTORY}/qbittorrent

# Creación de la carpeta de descargas
mkdir -p ${MEDIA_DIRECTORY}/downloads/{complete,incomplete}
chown -R 1000:1000 ${MEDIA_DIRECTORY}/downloads/
.env
# Ruta absoluta en el host del cliente de descarga. Ejemplo Ugreen: /volume1/downloads
DOWNLOADS_DIRECTORY=/ruta/a/downloads
docker-compose.yaml
services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
      - WEBUI_PORT=8080
    volumes:
      - ./config:/config
      - ${MEDIA_DIRECTORY}:/media
    ports:
      - 8080:8080 # WEBUI.
      - 6881:6881
      - 6881:6881/udp
    restart: unless-stopped

# anadir estas lineas para proxy inverso
networks:
  default:
    external: true
    name: proxy

Puesta en marcha

# Arranca el proyecto
docker compose up -d
# Compureba logs
docker compose logs

Amule

image.png

aMule es un cliente gratuito y de código abierto para compartir archivos a través de redes P2P (peer-to-peer), diseñado para funcionar con los protocolos eDonkey (ed2k) y Kademlia (Kad).

A diferencia de su predecesor eMule (que es exclusivo de Windows), aMule es multiplataforma, lo que permite su uso en Linux, macOS, Windows y otros sistemas como FreeBSD o Solaris.

Características principales

  • Gestión remota: Permite controlar las descargas desde cualquier lugar a través de una interfaz web (aMuleWeb) o mediante línea de comandos (aMuleCMD).
  • Arquitectura modular: Puede ejecutarse como un "demonio" (amuled) en segundo plano sin interfaz gráfica, ideal para servidores o dispositivos como Raspberry Pi.
  • Seguridad: No contiene software publicitario (adware) ni espía (spyware).
  • Compatibilidad: Los archivos temporales y los créditos acumulados en eMule pueden importarse directamente a aMule.

Estructura de carpetas

|
├── ${PROJECTS_DIRECTORY} # En Ugreen ->/volume1/docker
│   └── amule
|       └── config

└── ${MEDIA_DIRECTORY} # En Ugreen ->/volume1/media
    ├── movies
    ├── tv
    ├── music
    └── downloads
        ├── complete
        └── incomplete
        └── ed2k
            ├── incoming
            └── temp

Instalación

# Creación de la carpeta del proyecto qbittorrent
mkdir -p ${PROJECTS_DIRECTORY}/amule
touch ${PROJECTS_DIRECTORY}/amule/.env ${PROJECTS_DIRECTORY}/amule/docker-compose.yaml
chown -R 1000:1000 ${PROJECTS_DIRECTORY}/amule

# Creación de la carpeta de descargas
mkdir -p ${MEDIA_DIRECTORY}/downloads/ed2k/{incoming,temp}
chown -R 1000:1000 ${MEDIA_DIRECTORY}/downloads/ed2k
.env
# Ruta absoluta en el host del cliente de descarga. Ejemplo Ugreen: /volume1/downloads
MEDIA_DIRECTORY=/ruta/a/media
docker-compose.yaml
services:
  amule:
    image: ngosang/amule:latest
    container_name: amule
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
      - WEBUI_PWD=TU_PASSWORD
    volumes:
      - ./config:/home/amule/.aMule
      - ${MEDIA_DIRECTORY}/downloads/ed2k/incoming:/incoming
      - ${MEDIA_DIRECTORY}/downloads/ed2k/temp:/temp
    ports:
      - 4711:4711      # WebUI. Eliminar si se publica con traefik
      - 4662:4662/tcp  # eDonkey TCP
      - 4662:4662/udp
      - 4672:4672/udp  # Kad UDP
    restart: unless-stopped

# anadir estas lineas para proxy inverso
networks:
  default:
    external: true
    name: proxy

Puesta en marcha

# Arranca el proyecto
docker compose up -d
# Compureba logs
docker compose logs

aMule -> Plex

Cuando termine una descarga, todo estará en:${DOWNLOADS_DIRECTORY}/ed2k/incoming

# Mueve el contenido de incoming -> movies.
mv ${MEDIA_DIRECTORY}/ed2k/incoming/* ${MEDIA_DIRECTORY}/movies/

# Mueve el contenido de incoming -> series.
mv ${MEDIA_DIRECTORY}/ed2k/incoming/* ${MEDIA_DIRECTORY}/tv/

Luego en Plex: Scan Library Files (o auto-scan si lo tienes).

Gestión de contenido

image.png

Servarr es el nombre que recibe un ecosistema de aplicaciones de software de código abierto diseñadas para automatizar la descarga, organización y gestión de contenido multimedia en servidores domésticos o sistemas Self-Hosted (autohospedados).

Componentes principales de la suite

  • Sonarr: Especializado en la automatización y seguimiento de series de televisión y anime.
  • Radarr: Diseñado exclusivamente para la búsqueda y organización de películas.
  • Lidarr: Enfocado en la gestión y descarga de música y álbumes de tus artistas favoritos.
  • Prowlarr: Centraliza y sincroniza los indexadores (páginas de torrents/Usenet) con el resto de las aplicaciones.
Sonarr Radarr Lidarr Prowlarr
image.png image.png image.png image.png

Componentes adicionales

  • Seerr: gestor de descubrimiento de contenido y administración de peticiones multimedia

image.png

Funcionamiento

[Usuario] solicita una película o serie en SEERR
                      │
                      ▼
               (Aprobación)
                      │
                      ▼
          Envía la orden a RADARR / SONARR
                      │
                      ▼
           (Prowlarr ➔ Cliente de descarga)
                      │
                      ▼
   El contenido aparece en PLEX listo para ver
  1. [Usuario] solicita una película o serie en SEERR
  2. SEERR envía la orden a RADARR / SONARR
  3. PROWLARR busca con los indexadores y ordena la descarga a qBittorrent
  4. Cuando qBittorrent termina:

    • hardlink al destino final (sin duplicar espacio)
    • nombre correcto
    • estructura correcta
    • Plex detecta el nuevo contenido

Estructura de carpetas

|
├── ${PROJECTS_DIRECTORY} # En Ugreen ->/volume1/docker
|   |
│   └── servarr
│       ├── radarr
│       |   └── config
│       ├── sonarr
│       |   └── config
│       ├── lidarr
│       |   └── config
│       ├── prowlarr
│       |   └── config
│       ├── flaresolverr
│       |   └── config
│       └── seerr
│           └── config
|
└── ${MEDIA_DIRECTORY} # En Ugreen ->/volume1/media
    ├── movies
    ├── tv
    ├── music
    └── downloads
        ├── complete
        └── incomplete

Instalación

# Creación de la carpeta del proyecto
mkdir -p ${PROJECTS_DIRECTORY}/servarr/{radarr,sonarr,lidarr,prowlarr,flaresolverr,seerr}/config
touch ${PROJECTS_DIRECTORY}/servarr/.env ${PROJECTS_DIRECTORY}/servarr/docker-compose.yaml
chown -R 1000:1000 ${PROJECTS_DIRECTORY}/servarr

.env

# Ruta absoluta en el host donde vive tu biblioteca multimedia. Ejemplo Ugreen: /volume1/media
MEDIA_DIRECTORY=/ruta/a/media

docker-compose.yaml

services:
  # Busqueda y organizacion de peliculas
  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
    volumes:
      - ./radarr/config:/config
      - ${MEDIA_DIRECTORY}:/media
    # Puertos expuestos para acceso directo (opcional, se recomienda usar proxy inverso)
    ports:
      - 7878:7878
    restart: unless-stopped

  # Automatizacion y seguimiento de series de television
  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
    volumes:
      - ./sonarr/config:/config
      - ${MEDIA_DIRECTORY}:/media
    # Puertos expuestos para acceso directo (opcional, se recomienda usar proxy inverso)
    ports:
      - 8989:8989
    restart: unless-stopped

  # Gestion y descarga de musica
  lidarr:
    image: lscr.io/linuxserver/lidarr:latest
    container_name: lidarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
    volumes:
      - ./lidarr/config:/config
      - ${MEDIA_DIRECTORY}:/media
    # Puertos expuestos para acceso directo (opcional, se recomienda usar proxy inverso)
    ports:
      - 8686:8686
    restart: unless-stopped

  # Centraliza y sincroniza los indexadores de busqueda
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
    volumes:
      - ./prowlarr/config:/config
    # Puertos expuestos para acceso directo (opcional, se recomienda usar proxy inverso)
    ports:
      - 9696:9696
    restart: unless-stopped

  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    environment:
      - LOG_LEVEL=info
      - LOG_HTML=false
      - CAPTCHA_SOLVER=none
      - TZ=Europe/Madrid
    volumes:
      - ./flaresolverr/config:/config
    restart: unless-stopped

  # Aplicacion para gestionar las solicitudes de su biblioteca multimedia
  seerr:
    image: ghcr.io/seerr-team/seerr:latest
    init: true
    container_name: seerr
    environment:
      - LOG_LEVEL=debug
      - TZ=Europe/Madrid
      - PORT=5055
    # Puertos expuestos para acceso directo (opcional, se recomienda usar proxy inverso)
    ports:
      - 5055:5055
    volumes:
      - ./seerr/config:/app/config
    healthcheck:
      test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/settings/public || exit 1
      start_period: 20s
      timeout: 3s
      interval: 15s
      retries: 3
    restart: unless-stopped

# anadir estas lineas para proxy inverso
networks:
  default:
    external: true
    name: proxy

Puesta en Marcha

# Arranca el proyecto
docker compose up -d
# Compureba logs
docker compose logs

Acceso

Desde tu navegador (LAN):

  • Prowlarr→ http://IP_DEL_NAS:9696
  • Radarr → http://IP_DEL_NAS:7878
  • Sonarr → http://IP_DEL_NAS:8989
  • Lidarr→ http://IP_DEL_NAS:8686
  • Seerr→http://IP_DEL_NAS:5055

En el primer acceso de cada aplicación sugerirá establecer un modo de validación y la creación de un usuario

Configuración

Prowlarr

En Prowlarr → Settings → Apps:

  • Radarr:

    • Prowlarr Server: http://prowlarr:7878
    • Radarr Server: http://radarr:7878
    • API Key: (de Radarr)
    • Sonarr:

    • Prowlarr Server: http://prowlarr:7878

    • Sonarr Server: http://sonarr:8989
    • API Key: (de Sonarr)
  • Lidarr:

    • Prowlarr Server: http://prowlarr:7878
    • Lidarr Server: http://lidarr:8686
    • API Key: (de Lidarr)

En Prowlarr → Settings → Indexer Proxy:

  • FlareSolverr:

    • Name: FlareSolverr
    • Tag: cloudflare
    • Host: http://flaresolverr:8191/

Los contenedores deberán estar en la misma red Docker


Radarr/Sonarr/Lidarr

Root folders

Radarr: Settings → Media Management → Root Folders: /movies

Sonarr: Settings → Media Management → Root Folders: /series

Lidarr: Settings → Media Management → Root Folders: /music

Conectar con qBittorrent

En Settings → Download Clients → Add → qBittorrent:

  • Host: qbittorrent
  • Port: 8080
  • API o Usuario / contraseña

Conectar con Plex

En Settings → Connect → Add → Plex Media Server:

  • Host: plex
  • Port: 32400
  • Token: (sácalo de Plex)
  • ✔ On Import
  • ✔ On Upgrade

Reverse Proxy

image.png

Nginx Proxy Manager (NPM) es una interfaz de administración de Nginx que permite exponer servicios de una manera sencilla y segura usando certificados de Let's Encrypt.

Referencia oficial: https://nginxproxymanager.com/

Caracteristicas

Referencia

  • Gestion web de hosts, redirecciones y reglas.
  • Emision de certificados SSL con Let's Encrypt.
  • Panel administrativo en puerto dedicado.
  • Persistencia de configuracion y certificados en volumenes Docker.

Estructura de carpetas

|
├── ${PROJECTS_DIRECTORY} # En Ugreen ->/volume1/docker
    └── npm
        ├── data
        └── letsencrypt

Instalación

# Creación de la carpeta del proyecto nginx-proxy-manager
mkdir -p ${PROJECTS_DIRECTORY}/npm/{data,letsencrypt}
touch ${PROJECTS_DIRECTORY}/npm/.env ${PROJECTS_DIRECTORY}/npm/docker-compose.yaml
chown -R 1000:1000 ${PROJECTS_DIRECTORY}/npm

docker-compose.yaml

services:
  app:
    container_name: nginx-proxy-manager
    image: jc21/nginx-proxy-manager:latest
    restart: unless-stopped
    environment:
      TZ: "Europe/Madrid"
    ports:
      - "80:80"      # HTTP
      - "81:81"      # Admin UI
      - "443:443"    # HTTPS
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

networks:
  default:
    external: true
    name: proxy
# Crea la red en caso de que no exista
docker network create proxy
# levanta el contenedor
docker compose up -d
# Verifica el arranque
docker compose ps
docker compose logs

Acceso Inicial

Referencia

  • Panel de administracion: http://IP_DEL_SERVIDOR:81
  • Entrada HTTP de proxys: puerto 80
  • Entrada HTTPS de proxys: puerto 443

Credenciales iniciales:

  • Email: admin@example.com
  • Password: changeme

Cambia estas credenciales en el primer inicio.

Email: [email protected]
Password: changeme

Inmediatamente después de iniciar sesión con este usuario predeterminado se le pedirá que modifique sus datos y cambie su contraseña.

DuckDNS

image.png

DuckDNS es un servicio gratuito de DNS dinámico (DDNS) diseñado para apuntar un subdominio personalizado (ejemplo: tu-nombre.duckdns.org) hacia la dirección IP pública de tu hogar o servidor. Su principal objetivo es permitirte acceder a tus dispositivos locales desde cualquier parte del mundo, eliminando la necesidad de recordar secuencias numéricas complejas o lidiar con los cambios constantes de IP

linuxserver/duckdns

services:
  duckdns:
    image: lscr.io/linuxserver/duckdns:latest
    container_name: duckdns
    network_mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
      - SUBDOMAINS=subdomain1,subdomain2
      - TOKEN=token
      - UPDATE_IP=ipv4
      - LOG_FILE=false
    restart: unless-stopped

Tailscale

compose.yaml

services:
  tailscale:
    image: tailscale/tailscale:latest
    container_name: tailscale
    hostname: mediacenter
    network_mode: host
    environment:
      - TS_AUTHKEY=${TS_AUTHKEY}
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_USERSPACE=false
      - TS_HOSTNAME=mediacenter
      - TS_DEBUG_FIREWALL_MODE=nftables
      - TS_ROUTES=${TS_ROUTES}
    volumes:
      - ./state:/var/lib/tailscale
    devices:
      - /dev/net/tun:/dev/net/tun
    cap_add:
      - NET_ADMIN
      - NET_RAW
    restart: unless-stopped

.env

TS_AUTHKEY= tskey-YOUR-AUTH-KEY # 🔑 Reemplaza con tu clave real
TS_ROUTES=192.168.X.X/24 # Reemplaza con tu red local real

Crear una Auth Key de Tailscale

Entra en la consola de Tailscale:

Tailscale - Auth Keys

Crea una Auth key. Para esta instalación no necesitas que el nodo sea ephemeral, porque queremos conservarlo como un servidor permanente.

Tailscale permite que los contenedores se registren automáticamente mediante TS_AUTHKEY