16 KiB
Media Server - Stack Completo de Gestión de Medios
Stack completo para gestión y streaming de contenido multimedia con automatización de descargas.
🎯 Flujo de Trabajo
- Usuario solicita contenido → Jellyseerr
- Jellyseerr envía solicitud → Sonarr (series) o Radarr (películas)
- Sonarr/Radarr busca contenido → Prowlarr/Jackett
- Prowlarr consulta trackers → Indexers configurados
- Se descarga el contenido → Cliente de descargas
- Sonarr/Radarr organiza archivos → Directorios de medios
- Jellyfin detecta nuevo contenido → Disponible para streaming
📋 Descripción
Este stack despliega un servidor multimedia completo con:
| Servicio | Descripción | Puerto | Propósito |
|---|---|---|---|
| Jellyfin | Servidor de streaming de medios | 8096 | Reproducir contenido multimedia |
| Jellyseerr | Sistema de solicitudes | 5055 | Permitir solicitudes de usuarios |
| Sonarr | Gestor de series TV | 8989 | Automatizar descargas de series |
| Radarr | Gestor de películas | 7878 | Automatizar descargas de películas |
| Prowlarr | Gestor de indexers | 9696 | Centralizar trackers |
| Jackett | Proxy de trackers | 9117 | Alternativa a Prowlarr |
| FlareSolverr | Resolver Cloudflare | 8191 | Bypasear protecciones |
Características:
- ✅ Automatización completa de descargas
- ✅ Gestión de calidad y formatos
- ✅ Sistema de solicitudes para usuarios
- ✅ Protección con SSO (Authentik)
- ✅ Certificados SSL automáticos (Let's Encrypt)
- ✅ Red aislada para servicios internos
🚀 Despliegue
Prerequisitos
- Red Docker: Asegúrate de que la red
proxyexiste - Registros DNS: Configura los registros A para tus dominios de servicios
- Almacenamiento: Prepara los directorios para medios y configuraciones
Desde Portainer
- Ve a Stacks → Add stack
- Nombre:
media-server - Selecciona Repository o Git repository
- Configura:
- Repository URL:
<tu-repositorio> - Repository reference:
main - Compose path:
media-server/docker-compose.yml
- Repository URL:
- Carga el archivo de variables de entorno:
media-server/stack.env - Haz clic en Deploy the stack
Variables de Entorno Importantes
Edita el archivo stack.env:
# Global
TZ=Europe/Madrid
PUID=0
PGID=0
# Paths - Directorio base para configuraciones
COMMON_PATH=/opt/media-server
# Media mounts - Rutas del servidor donde están los archivos de medios
MEDIA_TV=/mnt/media/tv
MEDIA_MOVIES=/mnt/media/movies
MEDIA_DOWNLOADS=/mnt/media/downloads
# Networks
TRAEFIK_DOCKER_NETWORK=proxy
MEDIA_NETWORK_NAME=media
# Traefik & SSL
TRAEFIK_ENABLE=true
TRAEFIK_ENTRYPOINTS=websecure
TRAEFIK_TLS=true
TRAEFIK_CERTRESOLVER=letsencrypt
AUTH_MIDDLEWARE=ths-authentik@docker
# Dominios - Personaliza según tu dominio
DOMAIN=tudominio.com
PROWLARR_HOST=prowlarr.tudominio.com
JACKETT_HOST=jackett.tudominio.com
SONARR_HOST=sonarr.tudominio.com
RADARR_HOST=radarr.tudominio.com
JELLYSEERR_HOST=requests.tudominio.com
JELLYFIN_HOST=media.tudominio.com
⚙️ Configuración Post-Instalación
1. Preparar Directorios
Antes de desplegar, crea las estructuras de directorios necesarias:
# Directorio base de configuraciones
sudo mkdir -p /opt/media-server/configs/{prowlarr,jackett,sonarr,radarr,jellyseerr,jellyfin-vps}
sudo mkdir -p /opt/media-server/jellyfin/cache-vps
# Directorios de medios
sudo mkdir -p /mnt/media/{tv,movies,downloads}
# Ajustar permisos
sudo chown -R $USER:$USER /opt/media-server
sudo chown -R $USER:$USER /mnt/media
2. Configurar Prowlarr (Indexers)
Prowlarr es el gestor centralizado de indexers/trackers:
- Accede a
https://prowlarr.tudominio.com - Completa el asistente de configuración inicial
- Ve a Settings → Indexers → Add Indexer
- Añade tus trackers preferidos (públicos o privados)
- Si algún tracker requiere FlareSolverr para Cloudflare:
- Ve a Settings → Indexers → FlareSolverr
- URL:
http://flaresolverr:8191
3. Conectar Sonarr y Radarr con Prowlarr
En Prowlarr, añade las aplicaciones:
- Ve a Settings → Apps → Add Application
- Selecciona Sonarr o Radarr
- Configura:
- Prowlarr Server:
http://prowlarr:9696 - Sonarr Server:
http://sonarr:8989 - Radarr Server:
http://radarr:7878 - API Key: Cópiala desde Settings → General en cada aplicación
- Prowlarr Server:
- Haz clic en Test y luego Save
- Sincroniza los indexers automáticamente
4. Configurar Clientes de Descarga
En Sonarr y Radarr, configura tu cliente de descargas (qBittorrent, Transmission, etc.):
- Ve a Settings → Download Clients → Add
- Selecciona tu cliente
- Configura la conexión (host, puerto, usuario, contraseña)
- Establece las categorías (tv para Sonarr, movies para Radarr)
5. Configurar Perfiles de Calidad
En Sonarr y Radarr:
- Ve a Settings → Profiles
- Configura los perfiles de calidad según tus preferencias
- Ajusta el idioma preferido
- Configura el formato preferido (1080p, 4K, etc.)
6. Configurar Jellyfin
Jellyfin es tu servidor de streaming:
- Accede a
https://media.tudominio.com - Completa el asistente de configuración:
- Crea el usuario administrador
- Configura las bibliotecas:
- Series:
/data/tvshows - Películas:
/data/movies
- Series:
- Escanea las bibliotecas para detectar contenido
- Configura metadatos (TMDb, TVDb, etc.)
7. Configurar Jellyseerr
Jellyseerr permite a los usuarios solicitar contenido:
- Accede a
https://requests.tudominio.com - Conecta con Jellyfin:
- URL:
http://jellyfin:8096 - API Key: Desde Jellyfin Dashboard → API Keys
- URL:
- Conecta con Sonarr:
- URL:
http://sonarr:8989 - API Key: Desde Sonarr Settings → General
- URL:
- Conecta con Radarr:
- URL:
http://radarr:7878 - API Key: Desde Radarr Settings → General
- URL:
- Configura permisos de usuario
- Activa notificaciones (opcional)
8. Integración con Authentik (SSO)
Todos los servicios están protegidos con Authentik por defecto mediante el middleware ths-authentik@docker.
Para personalizar el acceso:
- En Authentik, crea aplicaciones para cada servicio
- Configura grupos y permisos según tus necesidades
- Los usuarios autenticados tendrán acceso automático
Si necesitas acceso público a Jellyfin:
# En stack.env, para Jellyfin
AUTH_MIDDLEWARE= # Deja vacío para acceso público
🔧 Configuración Avanzada
Personalizar Puertos de Servicios
Por defecto los servicios usan sus puertos estándar:
PROWLARR_PORT=9696
JACKETT_PORT=9117
SONARR_PORT=8989
RADARR_PORT=7878
JELLYSEERR_PORT=5055
JELLYFIN_PORT=8096
Personalizar Nombres de Contenedores
PROWLARR_CONTAINER_NAME=prowlarr-prod
SONARR_CONTAINER_NAME=sonarr-prod
# etc...
Usar Imágenes Específicas
JELLYFIN_IMAGE=lscr.io/linuxserver/jellyfin:10.8.13
SONARR_IMAGE=lscr.io/linuxserver/sonarr:4.0
RADARR_IMAGE=lscr.io/linuxserver/radarr:5.2
Configurar FlareSolverr para Trackers Protegidos
FlareSolverr ayuda a resolver protecciones de Cloudflare:
# Recursos de memoria
FLARESOLVERR_SHM_SIZE=1gb
# Nivel de logs
LOG_LEVEL=info
LOG_HTML=false
# Solucionador de captchas (none, hcaptcha-solver)
CAPTCHA_SOLVER=none
Configurar PUID/PGID Personalizado
Para evitar problemas de permisos, usa tu usuario del sistema:
id $USER
# uid=1000(usuario) gid=1000(usuario)
PUID=1000
PGID=1000
Notificaciones Personalizadas
Configura notificaciones en cada aplicación:
Sonarr/Radarr:
- Ve a Settings → Connect → Add Notification
- Opciones: Discord, Telegram, Email, Slack, etc.
Jellyseerr:
- Ve a Settings → Notifications
- Configura Discord, Email, Telegram, etc.
🛠️ Troubleshooting
Sonarr/Radarr no encuentra series/películas
- Verifica que Prowlarr está conectado correctamente
- Comprueba que los indexers están funcionando en Prowlarr
- Revisa los logs:
docker logs sonarr docker logs radarr
FlareSolverr no resuelve captchas
-
Verifica los logs:
docker logs flaresolverr -
Aumenta la memoria compartida si es necesario:
FLARESOLVERR_SHM_SIZE=2gb -
Prueba la conectividad:
docker exec prowlarr curl http://flaresolverr:8191/health
Error de permisos en directorios de medios
Si usas SELinux, los volúmenes ya tienen :Z:
# Si persisten problemas
sudo chcon -Rt svirt_sandbox_file_t /opt/media-server
sudo chcon -Rt svirt_sandbox_file_t /mnt/media
Si usas PUID/PGID personalizado:
# Ajustar permisos
sudo chown -R 1000:1000 /opt/media-server
sudo chown -R 1000:1000 /mnt/media
Jellyfin no detecta el contenido
-
Verifica las rutas de las bibliotecas en Jellyfin:
- Series:
/data/tvshows - Películas:
/data/movies
- Series:
-
Escanea manualmente las bibliotecas:
- Dashboard → Libraries → Scan All Libraries
-
Verifica permisos de lectura:
docker exec jellyfin-vps ls -la /data/tvshows docker exec jellyfin-vps ls -la /data/movies
Jellyseerr no se conecta con Sonarr/Radarr
-
Verifica las API Keys en cada servicio
-
Usa las URLs internas del contenedor:
- Sonarr:
http://sonarr:8989 - Radarr:
http://radarr:7878 - Jellyfin:
http://jellyfin:8096
- Sonarr:
-
Revisa los logs:
docker logs jellyseerr
Los servicios no son accesibles vía web
-
Verifica que Traefik está corriendo
-
Comprueba las etiquetas de Traefik en los contenedores:
docker inspect prowlarr | grep traefik -
Verifica los certificados SSL:
docker logs traefik | grep letsencrypt -
Comprueba los registros DNS:
nslookup prowlarr.tudominio.com
📚 Recursos Adicionales
- Documentación oficial de Jellyfin
- Wiki de Sonarr
- Wiki de Radarr
- Documentación de Prowlarr
- Documentación de Jellyseerr
- FlareSolverr GitHub
🔒 Seguridad
- SSO con Authentik: Todos los servicios protegidos por defecto
- API Keys: Protege las API keys de cada servicio
- VPN: Considera usar VPN para clientes de descarga
- Trackers Privados: Usa credenciales seguras para trackers privados
- Certificados SSL: Let's Encrypt mediante Traefik
- Backups: Realiza backups regulares de configuraciones y bases de datos
💾 Backups
Backup de Configuraciones
# Backup de todas las configuraciones
sudo tar -czf media-server-configs-$(date +%Y%m%d).tar.gz /opt/media-server/configs
# Restaurar
sudo tar -xzf media-server-configs-YYYYMMDD.tar.gz -C /
Backup de Bases de Datos Internas
Cada servicio *arr tiene su propia base de datos SQLite:
# Sonarr
docker exec sonarr cp /config/sonarr.db /config/sonarr.db.backup
# Radarr
docker exec radarr cp /config/radarr.db /config/radarr.db.backup
# Prowlarr
docker exec prowlarr cp /config/prowlarr.db /config/prowlarr.db.backup
Backup Completo del Stack
# Script de backup completo
#!/bin/bash
BACKUP_DIR=/backups/media-server
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
# Configuraciones
sudo tar -czf $BACKUP_DIR/configs-$DATE.tar.gz /opt/media-server/configs
# Lista de contenido (opcional)
sudo tar -czf $BACKUP_DIR/media-structure-$DATE.tar.gz \
--exclude='*' \
--include='*/' \
/mnt/media
echo "Backup completado: $BACKUP_DIR"
🔄 Actualizaciones
- Backup primero: Siempre haz backup antes de actualizar
- Actualiza las versiones de imágenes en
stack.env:JELLYFIN_IMAGE=lscr.io/linuxserver/jellyfin:10.9.0 SONARR_IMAGE=lscr.io/linuxserver/sonarr:latest RADARR_IMAGE=lscr.io/linuxserver/radarr:latest - Actualiza el stack en Portainer o con Docker Compose:
docker compose pull docker compose up -d - Verifica los logs de cada servicio
- Comprueba que todo funciona correctamente
Actualizaciones Recomendadas
- Jellyfin: Revisa changelog antes de actualizar versiones mayores
- Sonarr/Radarr: Usa
latestpara recibir actualizaciones automáticas - Prowlarr: Mantén sincronizado con Sonarr/Radarr
- FlareSolverr: Actualiza cuando haya cambios en Cloudflare
📊 Monitoreo
Ver Estadísticas de Uso
Jellyfin:
- Dashboard → Activity → Ver reproducciones activas
- Dashboard → Users → Estadísticas por usuario
Sonarr/Radarr:
- System → Status → Ver actividad de descargas
- Queue → Ver cola de descargas
Prowlarr:
- System → Status → Estadísticas de indexers
Logs de Servicios
# Ver logs en tiempo real
docker logs -f prowlarr
docker logs -f jackett
docker logs -f sonarr
docker logs -f radarr
docker logs -f jellyseerr
docker logs -f jellyfin-vps
docker logs -f flaresolverr
# Ver últimas 100 líneas
docker logs --tail 100 sonarr
Salud del Sistema
Cada servicio *arr tiene una página de salud:
- Sonarr: Settings → General → System Status
- Radarr: Settings → General → System Status
- Prowlarr: System → Status
Monitoreo de Recursos
Usa docker stats para ver uso de recursos:
docker stats prowlarr sonarr radarr jellyfin-vps jellyseerr
Notificaciones de Estado
Configura notificaciones en Sonarr/Radarr para:
- Descargas completadas
- Fallos en descargas
- Problemas con indexers
- Actualizaciones de aplicaciones
📝 Referencia Rápida
URLs de Servicios (Por Defecto)
Prowlarr: https://prowlarr.tudominio.com
Jackett: https://jackett.tudominio.com
Sonarr: https://sonarr.tudominio.com
Radarr: https://radarr.tudominio.com
Jellyseerr: https://requests.tudominio.com
Jellyfin: https://media.tudominio.com
URLs Internas (Entre Contenedores)
Prowlarr: http://prowlarr:9696
Jackett: http://jackett:9117
Sonarr: http://sonarr:8989
Radarr: http://radarr:7878
Jellyseerr: http://jellyseerr:5055
Jellyfin: http://jellyfin:8096
FlareSolverr: http://flaresolverr:8191
Rutas de Montaje en Contenedores
Configuraciones: /config
Series TV: /tv (Sonarr), /data/tvshows (Jellyfin)
Películas: /movies (Radarr), /data/movies (Jellyfin)
Descargas: /downloads
Comandos Útiles
# Ver todos los contenedores del stack
docker ps --filter "name=prowlarr|sonarr|radarr|jellyfin|jellyseerr|jackett|flaresolverr"
# Reiniciar un servicio específico
docker restart sonarr
# Ver uso de recursos
docker stats --no-stream prowlarr sonarr radarr jellyfin-vps
# Backup rápido de configuración
docker exec sonarr tar czf /config/backup-$(date +%Y%m%d).tar.gz /config/*.db
# Limpiar logs antiguos
docker exec sonarr find /config/logs -type f -mtime +30 -delete
Orden de Configuración Recomendado
- ✅ FlareSolverr (si es necesario)
- ✅ Prowlarr → Añadir indexers
- ✅ Sonarr/Radarr → Configurar cliente de descargas
- ✅ Prowlarr → Conectar con Sonarr/Radarr
- ✅ Jellyfin → Añadir bibliotecas
- ✅ Jellyseerr → Conectar todo
🤝 Soporte y Contribuciones
Para problemas o sugerencias:
- Revisa la sección de Troubleshooting
- Consulta la documentación oficial de cada servicio
- Verifica los logs del contenedor específico
📄 Licencia
Este stack utiliza software de código abierto. Consulta las licencias individuales de cada proyecto.
Nota: Este stack está diseñado para uso personal. Asegúrate de cumplir con las leyes de copyright de tu región al descargar contenido.