Media Center¶
Introducción¶

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
- PLEX -> TCP
- Opcionales:
- NGINX Proxy Manager -> TCP
80y TCP443
- NGINX Proxy Manager -> TCP
- Obligatorios:
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¶
(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: hostarranca el contenedor en la misma red que el NAS y hace que no sea necesario configurar puertos en el contenedorLa variable PLEX_CLAIM=claim-xxxxxxxxxxxxxxxxx se usa para reclamar el nuevo servidor PLEX desde tu cuenta de PLEX.tv
Puesta en marcha¶
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

- 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

Para comprobar que TODO va bien, mientras reproduces algo que transcodifique, ejecuta mediante CLI en la NAS:
intel_gpu_top
Descargas¶
qBittorrent¶
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¶
Amule¶

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¶
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¶
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 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Componentes adicionales¶
- Seerr: gestor de descubrimiento de contenido y administración de peticiones multimedia
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
- [Usuario] solicita una película o serie en SEERR
- SEERR envía la orden a RADARR / SONARR
- PROWLARR busca con los indexadores y ordena la descarga a qBittorrent
-
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¶
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)
- Prowlarr Server:
-
Lidarr:
- Prowlarr Server:
http://prowlarr:7878 - Lidarr Server:
http://lidarr:8686 - API Key: (de Lidarr)
- Prowlarr Server:
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¶

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¶
- 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¶
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¶
- 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¶
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
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:
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







