Automatiza tu biblioteca multimedia con el stack Arr y Jellyfin en Docker
Si ya tienes Jellyfin funcionando, el siguiente paso natural es automatizar la gestión de tu biblioteca. El stack Arr es un conjunto de herramientas que se integran entre sí para organizar, buscar y descargar contenido de forma automática — todo corriendo en contenedores Docker junto a tu servidor Jellyfin.
En esta guía desplegaremos Sonarr, Radarr, Prowlarr, qBittorrent, Gluetun, Jellyseerr y Maintainerr con un único fichero Docker Compose, y los conectaremos entre sí para que trabajen como un sistema unificado.
Nota: Estas herramientas son agnósticas respecto al contenido que gestionas. Su función es la automatización y organización de la biblioteca. Úsalas siempre con contenido sobre el que tengas derechos legítimos: producciones de dominio público, licencias Creative Commons, contenido propio o descargas autorizadas por el distribuidor.
¿Qué hace cada pieza del stack?
- qBittorrent — el cliente de descargas. Recibe las órdenes del resto del stack y gestiona las descargas
- Gluetun — contenedor VPN que enruta todo el tráfico de qBittorrent a través de tu proveedor VPN comercial, sin afectar al resto de servicios
- Prowlarr — gestiona los indexadores (las fuentes donde se busca el contenido) y los comparte automáticamente con Sonarr y Radarr
- Sonarr — monitoriza y gestiona tu biblioteca de series. Detecta episodios nuevos y los solicita automáticamente
- Radarr — hace lo mismo pero para películas
- Jellyseerr — interfaz de peticiones integrada con Jellyfin. Permite a otros usuarios solicitar contenido sin acceso directo a Sonarr o Radarr
- Maintainerr — gestiona reglas de limpieza automática de la biblioteca: elimina contenido ya visto, con más de X días, o según los criterios que definas
La gracia del stack es que estas herramientas se comunican entre sí: Prowlarr le dice a Sonarr y Radarr dónde buscar, cuando encuentran algo se lo pasan a qBittorrent (cuyo tráfico pasa por Gluetun), Jellyseerr permite que otros usuarios pidan contenido, y Maintainerr se encarga de mantener la biblioteca ordenada.
Requisitos previos
- Ubuntu con Docker y Docker Compose instalados (si no, consulta esta guía)
- Jellyfin ya funcionando (si no, consulta esta guía)
- Al menos 6 GB de RAM libres para el stack completo
- Espacio en disco suficiente para tu biblioteca
1. Estructura de directorios
La organización de carpetas es crítica en este stack. Todos los servicios necesitan acceder a las mismas rutas para que las descargas terminen en el lugar correcto de tu biblioteca Jellyfin.
mkdir -p ~/arr-stack/{qbittorrent,sonarr,radarr,prowlarr,gluetun,jellyseerr,maintainerr}/config
mkdir -p ~/arr-stack/descargas/{completas,incompletas}
mkdir -p ~/arr-stack/media/{series,pelis}
La estructura quedará así:
~/arr-stack/
├── qbittorrent/config/
├── gluetun/config/
├── sonarr/config/
├── radarr/config/
├── prowlarr/config/
├── jellyseerr/config/
├── maintainerr/config/
├── descargas/
│ ├── completas/
│ └── incompletas/
├── media/
│ ├── series/
│ └── pelis/
└── docker-compose.yml
Importante: Si ya tienes Jellyfin apuntando a una carpeta de medios diferente, ajusta las rutas de media/ para que coincidan. Todos los servicios deben ver las mismas carpetas o el stack no funcionará correctamente.2. El fichero docker-compose.yml
cd ~/arr-stack
nano docker-compose.yml
Pega este contenido:
services:
gluetun:
image: qmcgaw/gluetun:latest
container_name: gluetun
restart: unless-stopped
cap_add:
- NET_ADMIN
environment:
- VPN_SERVICE_PROVIDER=mullvad # Cambia por tu proveedor: expressvpn, nordvpn, etc.
- VPN_TYPE=wireguard # o openvpn según tu proveedor
- WIREGUARD_PRIVATE_KEY=TU_CLAVE_AQUI
- WIREGUARD_ADDRESSES=10.x.x.x/32
- SERVER_COUNTRIES=Spain # País del servidor VPN
volumes:
- ./gluetun/config:/gluetun
ports:
- "8080:8080" # qBittorrent WebUI (expuesto a través de Gluetun)
- "6881:6881"
- "6881:6881/udp"
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
network_mode: "service:gluetun" # Todo el tráfico pasa por Gluetun
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
- WEBUI_PORT=8080
volumes:
- ./qbittorrent/config:/config
- ./descargas:/descargas
depends_on:
- gluetun
prowlarr:
image: linuxserver/prowlarr:latest
container_name: prowlarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
volumes:
- ./prowlarr/config:/config
ports:
- "9696:9696"
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
volumes:
- ./sonarr/config:/config
- ./media/series:/series
- ./descargas/completas:/descargas/completas
ports:
- "8989:8989"
radarr:
image: linuxserver/radarr:latest
container_name: radarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
volumes:
- ./radarr/config:/config
- ./media/pelis:/pelis
- ./descargas/completas:/descargas/completas
ports:
- "7878:7878"
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
volumes:
- ./jellyseerr/config:/app/config
ports:
- "5055:5055"
maintainerr:
image: jorenn92/maintainerr:latest
container_name: maintainerr
restart: unless-stopped
environment:
- TZ=Europe/Madrid
volumes:
- ./maintainerr/config:/opt/data
ports:
- "6246:6246"
Guarda y cierra con Ctrl+O, Enter, Ctrl+X.
3. Arrancar el stack
docker compose up -d
Comprueba que todos los contenedores están corriendo:
docker ps
Deberías ver los siete contenedores con estado Up. Si alguno falla, revisa sus logs:
docker compose logs -f qbittorrent
docker compose logs -f prowlarr
4. Configurar Gluetun (VPN para qBittorrent)
Gluetun actúa como pasarela VPN para qBittorrent. Fíjate en el compose: qBittorrent tiene network_mode: "service:gluetun", lo que significa que todo su tráfico de red pasa obligatoriamente por el contenedor Gluetun. Si la VPN cae, qBittorrent se queda sin red — esto es exactamente lo que queremos (kill switch automático).
Credenciales VPN
Las variables de entorno de Gluetun dependen de tu proveedor. El compose de ejemplo usa Mullvad con WireGuard, pero Gluetun soporta decenas de proveedores: NordVPN, ExpressVPN, ProtonVPN, Surfshark, etc. Consulta la documentación oficial de Gluetun para ver las variables exactas de tu proveedor.
Para Mullvad, necesitas:
- Accede a tu cuenta en mullvad.net
- Ve a WireGuard configuration → Generate key
- Copia la clave privada y la dirección IP asignada
- Pégalas en
WIREGUARD_PRIVATE_KEYyWIREGUARD_ADDRESSESdel compose
Verificar que qBittorrent usa la VPN
Una vez arrancado el stack, entra en la consola de qBittorrent y comprueba la IP que ve:
docker exec -it qbittorrent curl ifconfig.me
Debe mostrar una IP diferente a la de tu router. Si muestra tu IP real, Gluetun no está funcionando correctamente — revisa los logs:
docker compose logs -f gluetun
5. Configurar qBittorrent
Accede a la interfaz web en http://localhost:8080.
Las credenciales por defecto son admin / adminadmin. Cámbialas inmediatamente en Tools → Options → Web UI.
Configura las carpetas de descarga en Tools → Options → Downloads:
- Default Save Path:
/descargas/completas - Keep incomplete torrents in:
/descargas/incompletas
Esto es importante: Sonarr y Radarr buscarán los ficheros terminados en la carpeta de completas para moverlos a la biblioteca.
6. Configurar Prowlarr
Accede en http://localhost:9696.
Prowlarr es el centro de indexadores del stack. Su función es buscar en las fuentes que configures y compartir esos resultados con Sonarr y Radarr automáticamente.
Añadir indexadores
Ve a Indexers → Add Indexer. Prowlarr tiene soporte para cientos de indexadores públicos y privados. Para empezar, puedes añadir indexadores públicos de contenido libre como archive.org o cualquier fuente de contenido con licencia abierta que uses habitualmente.
Conectar con Sonarr y Radarr
Ve a Settings → Apps y añade tanto Sonarr como Radarr:
- Sonarr: URL
http://sonarr:8989, necesitarás la API Key de Sonarr (la encuentras en Sonarr en Settings → General) - Radarr: URL
http://radarr:7878, misma operativa con su API Key
Una vez conectados, los indexadores que añadas en Prowlarr se sincronizarán automáticamente a Sonarr y Radarr sin que tengas que configurarlos por separado en cada uno.
7. Configurar Sonarr
Accede en http://localhost:8989.
Añadir el cliente de descargas
Ve a Settings → Download Clients → Add y selecciona qBittorrent:
- Host:
qbittorrent - Port:
8080 - Username / Password: las que configuraste antes
Configurar la carpeta raíz de series
Ve a Settings → Media Management → Root Folders y añade /series. Sonarr moverá aquí las series descargadas una vez completadas.
Añadir una serie
En Series → Add New, busca la serie que quieras añadir a tu biblioteca. Sonarr la monitorizará y, cuando detecte que hay episodios disponibles en los indexadores configurados, los solicitará automáticamente a qBittorrent.
8. Configurar Radarr
Accede en http://localhost:7878. El proceso es idéntico al de Sonarr pero para películas.
Añadir el cliente de descargas
Ve a Settings → Download Clients → Add → qBittorrent con los mismos datos que en Sonarr.
Configurar la carpeta raíz de películas
Ve a Settings → Media Management → Root Folders y añade /pelis.
Añadir una película
En Movies → Add New, busca la película y añádela a tu biblioteca. Radarr buscará en los indexadores y la descargará automáticamente cuando esté disponible.
9. Conectar la biblioteca con Jellyfin
Si Jellyfin ya está corriendo en otro directorio, tienes dos opciones:
Opción A — Apuntar Jellyfin a las carpetas del stack Arr: En el panel de Jellyfin, edita tus bibliotecas de Series y Películas para que apunten a ~/arr-stack/media/series y ~/arr-stack/media/pelis.
Opción B — Usar las mismas carpetas desde el principio: Si aún no has configurado Jellyfin, monta sus volúmenes apuntando directamente a ~/arr-stack/media. Es la opción más limpia.
En cualquier caso, cuando Sonarr o Radarr muevan un fichero a la carpeta de medios, Jellyfin lo detectará en el siguiente escaneo automático de biblioteca.
10. Configurar Jellyseerr
Accede en http://localhost:5055.
Jellyseerr es la interfaz de peticiones del stack. Permite a cualquier usuario de tu Jellyfin solicitar series o películas sin que tengan acceso a Sonarr o Radarr directamente. Tú recibes la petición, la apruebas, y el sistema se encarga del resto.
Configuración inicial
El asistente de primera vez te pedirá:
- Conectar con Jellyfin: introduce la URL de tu servidor (
http://localhost:8096), el usuario administrador y la contraseña. Jellyseerr importará automáticamente los usuarios de Jellyfin - Conectar con Radarr: URL
http://radarr:7878, API Key de Radarr, carpeta raíz/pelisy perfil de calidad - Conectar con Sonarr: URL
http://sonarr:8989, API Key de Sonarr, carpeta raíz/seriesy perfil de calidad
Gestión de peticiones
Una vez configurado, los usuarios de Jellyfin pueden acceder a http://localhost:5055, iniciar sesión con sus credenciales de Jellyfin y solicitar contenido. Tú verás las peticiones en Requests y puedes aprobarlas manualmente o configurar la aprobación automática para usuarios de confianza en Settings → Users.
Consejo: Puedes configurar cuántas peticiones puede hacer cada usuario al mes en Settings → Users → Default Permissions. Útil si compartes el servidor con familia o amigos.
11. Configurar Maintainerr
Accede en http://localhost:6246.
Maintainerr se encarga de mantener la biblioteca limpia de forma automática aplicando reglas que tú defines. Por ejemplo: eliminar películas que llevan más de 30 días vistas, o series canceladas con todos los episodios vistos.
Crear una colección con reglas
- Ve a Collections → Add Collection
- Dale un nombre (por ejemplo, "Películas vistas hace más de 30 días")
- Selecciona la biblioteca de Jellyfin sobre la que actúa
- Define las reglas: Last watched → more than →
30 days ago - Activa Delete from disk si quieres que elimine los ficheros, o déjalo desactivado para solo marcarlos
Programar la limpieza
En Settings → Schedule puedes configurar cada cuánto tiempo Maintainerr evalúa las reglas. Lo recomendable es una vez al día en horario de madrugada para que no interfiera con el uso del servidor.
Importante: Antes de activar el borrado automático, deja Maintainerr en modo dry run unos días para revisar qué contenido marcaría para eliminar. Así evitas sorpresas.
Errores comunes y cómo resolverlos
Sonarr o Radarr no se conectan con qBittorrent Asegúrate de usar gluetun como hostname para qBittorrent, no qbittorrent ni localhost, ya que el contenedor comparte la red de Gluetun. La WebUI de qBittorrent sigue siendo accesible en localhost:8080 desde el host.
qBittorrent no descarga nada y Gluetun muestra errores Revisa que las credenciales VPN en el compose son correctas. Cada proveedor tiene sus propias variables — consulta la documentación de Gluetun para tu proveedor específico:
docker compose logs -f gluetun
Los ficheros descargados no aparecen en la biblioteca Comprueba que las rutas de los volúmenes en el compose coinciden exactamente con las rutas raíz configuradas en Sonarr y Radarr. Una diferencia de una barra o una mayúscula rompe el sistema.
Prowlarr sincroniza los indexadores pero Sonarr no encuentra resultados Ve a Prowlarr → Indexers y usa el botón Test en cada indexador para verificar que están respondiendo correctamente.
Jellyseerr no encuentra usuarios de Jellyfin Asegúrate de que la URL de Jellyfin en la configuración de Jellyseerr es accesible desde dentro de la red Docker. Si Jellyfin corre en otro compose, usa la IP local del servidor en lugar de localhost.
Maintainerr no elimina contenido aunque cumpla las reglas Verifica que Delete from disk está activado en la colección y que Maintainerr tiene acceso a las mismas rutas de medios que Jellyfin. Si los volúmenes no están montados en Maintainerr, puede marcar el contenido pero no eliminarlo.
Cómo actualizar todo el stack
cd ~/arr-stack
docker compose pull
docker compose up -d
Conclusión
Con este stack tienes una solución de autohosting multimedia completa: Gluetun protege el tráfico de descargas, Sonarr y Radarr automatizan la gestión de la biblioteca, Prowlarr centraliza los indexadores, Jellyseerr da una interfaz limpia a otros usuarios y Maintainerr mantiene el servidor ordenado sin intervención manual.
Es una configuración que, una vez puesta en marcha, prácticamente se gestiona sola. El mantenimiento se reduce a actualizar las imágenes de vez en cuando y revisar las peticiones pendientes en Jellyseerr.
Te dejo el vídeo por si quieres ver la guía de forma más visual