media-server
This commit is contained in:
593
media-server/README.md
Normal file
593
media-server/README.md
Normal file
@@ -0,0 +1,593 @@
|
||||
# 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
|
||||
|
||||
1. **Usuario solicita contenido** → Jellyseerr
|
||||
2. **Jellyseerr envía solicitud** → Sonarr (series) o Radarr (películas)
|
||||
3. **Sonarr/Radarr busca contenido** → Prowlarr/Jackett
|
||||
4. **Prowlarr consulta trackers** → Indexers configurados
|
||||
5. **Se descarga el contenido** → Cliente de descargas
|
||||
6. **Sonarr/Radarr organiza archivos** → Directorios de medios
|
||||
7. **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
|
||||
|
||||
1. **Red Docker**: Asegúrate de que la red `proxy` existe
|
||||
2. **Registros DNS**: Configura los registros A para tus dominios de servicios
|
||||
3. **Almacenamiento**: Prepara los directorios para medios y configuraciones
|
||||
|
||||
### Desde Portainer
|
||||
|
||||
1. Ve a **Stacks** → **Add stack**
|
||||
2. Nombre: `media-server`
|
||||
3. Selecciona **Repository** o **Git repository**
|
||||
4. Configura:
|
||||
- Repository URL: `<tu-repositorio>`
|
||||
- Repository reference: `main`
|
||||
- Compose path: `media-server/docker-compose.yml`
|
||||
5. Carga el archivo de variables de entorno: `media-server/stack.env`
|
||||
6. Haz clic en **Deploy the stack**
|
||||
|
||||
### Variables de Entorno Importantes
|
||||
|
||||
Edita el archivo `stack.env`:
|
||||
|
||||
```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=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:
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
1. Accede a `https://prowlarr.tudominio.com`
|
||||
2. Completa el asistente de configuración inicial
|
||||
3. Ve a **Settings** → **Indexers** → **Add Indexer**
|
||||
4. Añade tus trackers preferidos (públicos o privados)
|
||||
5. 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:
|
||||
|
||||
1. Ve a **Settings** → **Apps** → **Add Application**
|
||||
2. Selecciona **Sonarr** o **Radarr**
|
||||
3. 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
|
||||
4. Haz clic en **Test** y luego **Save**
|
||||
5. Sincroniza los indexers automáticamente
|
||||
|
||||
### 4. Configurar Clientes de Descarga
|
||||
|
||||
En **Sonarr** y **Radarr**, configura tu cliente de descargas (qBittorrent, Transmission, etc.):
|
||||
|
||||
1. Ve a **Settings** → **Download Clients** → **Add**
|
||||
2. Selecciona tu cliente
|
||||
3. Configura la conexión (host, puerto, usuario, contraseña)
|
||||
4. Establece las categorías (tv para Sonarr, movies para Radarr)
|
||||
|
||||
### 5. Configurar Perfiles de Calidad
|
||||
|
||||
En **Sonarr** y **Radarr**:
|
||||
|
||||
1. Ve a **Settings** → **Profiles**
|
||||
2. Configura los perfiles de calidad según tus preferencias
|
||||
3. Ajusta el idioma preferido
|
||||
4. Configura el formato preferido (1080p, 4K, etc.)
|
||||
|
||||
### 6. Configurar Jellyfin
|
||||
|
||||
**Jellyfin** es tu servidor de streaming:
|
||||
|
||||
1. Accede a `https://media.tudominio.com`
|
||||
2. Completa el asistente de configuración:
|
||||
- Crea el usuario administrador
|
||||
- Configura las bibliotecas:
|
||||
- **Series**: `/data/tvshows`
|
||||
- **Películas**: `/data/movies`
|
||||
3. Escanea las bibliotecas para detectar contenido
|
||||
4. Configura metadatos (TMDb, TVDb, etc.)
|
||||
|
||||
### 7. Configurar Jellyseerr
|
||||
|
||||
**Jellyseerr** permite a los usuarios solicitar contenido:
|
||||
|
||||
1. Accede a `https://requests.tudominio.com`
|
||||
2. Conecta con Jellyfin:
|
||||
- URL: `http://jellyfin:8096`
|
||||
- API Key: Desde Jellyfin Dashboard → API Keys
|
||||
3. Conecta con Sonarr:
|
||||
- URL: `http://sonarr:8989`
|
||||
- API Key: Desde Sonarr Settings → General
|
||||
4. Conecta con Radarr:
|
||||
- URL: `http://radarr:7878`
|
||||
- API Key: Desde Radarr Settings → General
|
||||
5. Configura permisos de usuario
|
||||
6. Activa notificaciones (opcional)
|
||||
|
||||
### 8. Integración con Authentik (SSO)
|
||||
|
||||
Todos los servicios están protegidos con Authentik por defecto mediante el middleware `authentik@docker`.
|
||||
|
||||
Para personalizar el acceso:
|
||||
|
||||
1. En Authentik, crea aplicaciones para cada servicio
|
||||
2. Configura grupos y permisos según tus necesidades
|
||||
3. Los usuarios autenticados tendrán acceso automático
|
||||
|
||||
Si necesitas acceso público a Jellyfin:
|
||||
|
||||
```env
|
||||
# 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:
|
||||
|
||||
```env
|
||||
PROWLARR_PORT=9696
|
||||
JACKETT_PORT=9117
|
||||
SONARR_PORT=8989
|
||||
RADARR_PORT=7878
|
||||
JELLYSEERR_PORT=5055
|
||||
JELLYFIN_PORT=8096
|
||||
```
|
||||
|
||||
### Personalizar Nombres de Contenedores
|
||||
|
||||
```env
|
||||
PROWLARR_CONTAINER_NAME=prowlarr-prod
|
||||
SONARR_CONTAINER_NAME=sonarr-prod
|
||||
# etc...
|
||||
```
|
||||
|
||||
### Usar Imágenes Específicas
|
||||
|
||||
```env
|
||||
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:
|
||||
|
||||
```env
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
id $USER
|
||||
# uid=1000(usuario) gid=1000(usuario)
|
||||
```
|
||||
|
||||
```env
|
||||
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
|
||||
|
||||
1. Verifica que Prowlarr está conectado correctamente
|
||||
2. Comprueba que los indexers están funcionando en Prowlarr
|
||||
3. Revisa los logs:
|
||||
```bash
|
||||
docker logs sonarr
|
||||
docker logs radarr
|
||||
```
|
||||
|
||||
### FlareSolverr no resuelve captchas
|
||||
|
||||
1. Verifica los logs:
|
||||
```bash
|
||||
docker logs flaresolverr
|
||||
```
|
||||
|
||||
2. Aumenta la memoria compartida si es necesario:
|
||||
```env
|
||||
FLARESOLVERR_SHM_SIZE=2gb
|
||||
```
|
||||
|
||||
3. Prueba la conectividad:
|
||||
```bash
|
||||
docker exec prowlarr curl http://flaresolverr:8191/health
|
||||
```
|
||||
|
||||
### Error de permisos en directorios de medios
|
||||
|
||||
Si usas SELinux, los volúmenes ya tienen `:Z`:
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
# Ajustar permisos
|
||||
sudo chown -R 1000:1000 /opt/media-server
|
||||
sudo chown -R 1000:1000 /mnt/media
|
||||
```
|
||||
|
||||
### Jellyfin no detecta el contenido
|
||||
|
||||
1. Verifica las rutas de las bibliotecas en Jellyfin:
|
||||
- Series: `/data/tvshows`
|
||||
- Películas: `/data/movies`
|
||||
|
||||
2. Escanea manualmente las bibliotecas:
|
||||
- Dashboard → Libraries → Scan All Libraries
|
||||
|
||||
3. Verifica permisos de lectura:
|
||||
```bash
|
||||
docker exec jellyfin-vps ls -la /data/tvshows
|
||||
docker exec jellyfin-vps ls -la /data/movies
|
||||
```
|
||||
|
||||
### Jellyseerr no se conecta con Sonarr/Radarr
|
||||
|
||||
1. Verifica las API Keys en cada servicio
|
||||
2. Usa las URLs internas del contenedor:
|
||||
- Sonarr: `http://sonarr:8989`
|
||||
- Radarr: `http://radarr:7878`
|
||||
- Jellyfin: `http://jellyfin:8096`
|
||||
|
||||
3. Revisa los logs:
|
||||
```bash
|
||||
docker logs jellyseerr
|
||||
```
|
||||
|
||||
### Los servicios no son accesibles vía web
|
||||
|
||||
1. Verifica que Traefik está corriendo
|
||||
2. Comprueba las etiquetas de Traefik en los contenedores:
|
||||
```bash
|
||||
docker inspect prowlarr | grep traefik
|
||||
```
|
||||
|
||||
3. Verifica los certificados SSL:
|
||||
```bash
|
||||
docker logs traefik | grep letsencrypt
|
||||
```
|
||||
|
||||
4. Comprueba los registros DNS:
|
||||
```bash
|
||||
nslookup prowlarr.tudominio.com
|
||||
```
|
||||
|
||||
## 📚 Recursos Adicionales
|
||||
|
||||
- [Documentación oficial de Jellyfin](https://jellyfin.org/docs/)
|
||||
- [Wiki de Sonarr](https://wiki.servarr.com/sonarr)
|
||||
- [Wiki de Radarr](https://wiki.servarr.com/radarr)
|
||||
- [Documentación de Prowlarr](https://wiki.servarr.com/prowlarr)
|
||||
- [Documentación de Jellyseerr](https://docs.jellyseerr.dev/)
|
||||
- [FlareSolverr GitHub](https://github.com/FlareSolverr/FlareSolverr)
|
||||
|
||||
## 🔒 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
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
1. **Backup primero**: Siempre haz backup antes de actualizar
|
||||
2. Actualiza las versiones de imágenes en `stack.env`:
|
||||
```env
|
||||
JELLYFIN_IMAGE=lscr.io/linuxserver/jellyfin:10.9.0
|
||||
SONARR_IMAGE=lscr.io/linuxserver/sonarr:latest
|
||||
RADARR_IMAGE=lscr.io/linuxserver/radarr:latest
|
||||
```
|
||||
3. Actualiza el stack en Portainer o con Docker Compose:
|
||||
```bash
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
```
|
||||
4. Verifica los logs de cada servicio
|
||||
5. Comprueba que todo funciona correctamente
|
||||
|
||||
### Actualizaciones Recomendadas
|
||||
|
||||
- **Jellyfin**: Revisa changelog antes de actualizar versiones mayores
|
||||
- **Sonarr/Radarr**: Usa `latest` para 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
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
1. ✅ FlareSolverr (si es necesario)
|
||||
2. ✅ Prowlarr → Añadir indexers
|
||||
3. ✅ Sonarr/Radarr → Configurar cliente de descargas
|
||||
4. ✅ Prowlarr → Conectar con Sonarr/Radarr
|
||||
5. ✅ Jellyfin → Añadir bibliotecas
|
||||
6. ✅ Jellyseerr → Conectar todo
|
||||
|
||||
## 🤝 Soporte y Contribuciones
|
||||
|
||||
Para problemas o sugerencias:
|
||||
1. Revisa la sección de Troubleshooting
|
||||
2. Consulta la documentación oficial de cada servicio
|
||||
3. 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.
|
||||
167
media-server/docker-compose.yml
Normal file
167
media-server/docker-compose.yml
Normal file
@@ -0,0 +1,167 @@
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
name: ${TRAEFIK_DOCKER_NETWORK:-proxy}
|
||||
media:
|
||||
driver: bridge
|
||||
name: ${MEDIA_NETWORK_NAME:-media}
|
||||
|
||||
services:
|
||||
flaresolverr:
|
||||
image: ${FLARESOLVERR_IMAGE:-ghcr.io/flaresolverr/flaresolverr:latest}
|
||||
container_name: ${FLARESOLVERR_CONTAINER_NAME:-flaresolverr}
|
||||
environment:
|
||||
- LOG_LEVEL=${LOG_LEVEL:-info}
|
||||
- LOG_HTML=${LOG_HTML:-false}
|
||||
- CAPTCHA_SOLVER=${CAPTCHA_SOLVER:-none}
|
||||
- TZ=${TZ:-Europe/Madrid}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- media
|
||||
shm_size: ${FLARESOLVERR_SHM_SIZE:-1gb}
|
||||
|
||||
prowlarr:
|
||||
image: ${PROWLARR_IMAGE:-lscr.io/linuxserver/prowlarr:latest}
|
||||
container_name: ${PROWLARR_CONTAINER_NAME:-prowlarr}
|
||||
environment:
|
||||
- PUID=${PUID:-0}
|
||||
- PGID=${PGID:-0}
|
||||
- TZ=${TZ:-Europe/Madrid}
|
||||
volumes:
|
||||
- ${COMMON_PATH}/configs/prowlarr:/config:Z
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- media
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=${TRAEFIK_ENABLE:-true}
|
||||
- traefik.docker.network=${TRAEFIK_DOCKER_NETWORK:-proxy}
|
||||
- traefik.http.routers.prowlarr.rule=Host(`${PROWLARR_HOST}`)
|
||||
- traefik.http.routers.prowlarr.entrypoints=${TRAEFIK_ENTRYPOINTS:-websecure}
|
||||
- traefik.http.routers.prowlarr.tls=${TRAEFIK_TLS:-true}
|
||||
- traefik.http.routers.prowlarr.tls.certresolver=${TRAEFIK_CERTRESOLVER:-letsencrypt}
|
||||
- traefik.http.routers.prowlarr.middlewares=${AUTH_MIDDLEWARE:-authentik@docker}
|
||||
- traefik.http.services.prowlarr.loadbalancer.server.port=${PROWLARR_PORT:-9696}
|
||||
|
||||
jackett:
|
||||
image: ${JACKETT_IMAGE:-lscr.io/linuxserver/jackett:latest}
|
||||
container_name: ${JACKETT_CONTAINER_NAME:-jackett}
|
||||
environment:
|
||||
- PUID=${PUID:-0}
|
||||
- PGID=${PGID:-0}
|
||||
- TZ=${TZ:-Europe/Madrid}
|
||||
volumes:
|
||||
- ${COMMON_PATH}/configs/jackett:/config:Z
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- media
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=${TRAEFIK_ENABLE:-true}
|
||||
- traefik.docker.network=${TRAEFIK_DOCKER_NETWORK:-proxy}
|
||||
- traefik.http.routers.jackett.rule=Host(`${JACKETT_HOST}`)
|
||||
- traefik.http.routers.jackett.entrypoints=${TRAEFIK_ENTRYPOINTS:-websecure}
|
||||
- traefik.http.routers.jackett.tls=${TRAEFIK_TLS:-true}
|
||||
- traefik.http.routers.jackett.tls.certresolver=${TRAEFIK_CERTRESOLVER:-letsencrypt}
|
||||
- traefik.http.routers.jackett.middlewares=${AUTH_MIDDLEWARE:-authentik@docker}
|
||||
- traefik.http.services.jackett.loadbalancer.server.port=${JACKETT_PORT:-9117}
|
||||
|
||||
sonarr:
|
||||
image: ${SONARR_IMAGE:-lscr.io/linuxserver/sonarr:latest}
|
||||
container_name: ${SONARR_CONTAINER_NAME:-sonarr}
|
||||
environment:
|
||||
- PUID=${PUID:-0}
|
||||
- PGID=${PGID:-0}
|
||||
- TZ=${TZ:-Europe/Madrid}
|
||||
volumes:
|
||||
- ${COMMON_PATH}/configs/sonarr:/config:Z
|
||||
- ${MEDIA_TV:-/mnt/media/tv}:/tv
|
||||
- ${MEDIA_DOWNLOADS:-/mnt/media/downloads}:/downloads
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- media
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=${TRAEFIK_ENABLE:-true}
|
||||
- traefik.docker.network=${TRAEFIK_DOCKER_NETWORK:-proxy}
|
||||
- traefik.http.routers.sonarr.rule=Host(`${SONARR_HOST}`)
|
||||
- traefik.http.routers.sonarr.entrypoints=${TRAEFIK_ENTRYPOINTS:-websecure}
|
||||
- traefik.http.routers.sonarr.tls=${TRAEFIK_TLS:-true}
|
||||
- traefik.http.routers.sonarr.tls.certresolver=${TRAEFIK_CERTRESOLVER:-letsencrypt}
|
||||
- traefik.http.routers.sonarr.middlewares=${AUTH_MIDDLEWARE:-authentik@docker}
|
||||
- traefik.http.services.sonarr.loadbalancer.server.port=${SONARR_PORT:-8989}
|
||||
|
||||
radarr:
|
||||
image: ${RADARR_IMAGE:-lscr.io/linuxserver/radarr:latest}
|
||||
container_name: ${RADARR_CONTAINER_NAME:-radarr}
|
||||
environment:
|
||||
- PUID=${PUID:-0}
|
||||
- PGID=${PGID:-0}
|
||||
- TZ=${TZ:-Europe/Madrid}
|
||||
volumes:
|
||||
- ${COMMON_PATH}/configs/radarr:/config:Z
|
||||
- ${MEDIA_MOVIES:-/mnt/media/movies}:/movies
|
||||
- ${MEDIA_DOWNLOADS:-/mnt/media/downloads}:/downloads
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- media
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=${TRAEFIK_ENABLE:-true}
|
||||
- traefik.docker.network=${TRAEFIK_DOCKER_NETWORK:-proxy}
|
||||
- traefik.http.routers.radarr.rule=Host(`${RADARR_HOST}`)
|
||||
- traefik.http.routers.radarr.entrypoints=${TRAEFIK_ENTRYPOINTS:-websecure}
|
||||
- traefik.http.routers.radarr.tls=${TRAEFIK_TLS:-true}
|
||||
- traefik.http.routers.radarr.tls.certresolver=${TRAEFIK_CERTRESOLVER:-letsencrypt}
|
||||
- traefik.http.routers.radarr.middlewares=${AUTH_MIDDLEWARE:-authentik@docker}
|
||||
- traefik.http.services.radarr.loadbalancer.server.port=${RADARR_PORT:-7878}
|
||||
|
||||
jellyseerr:
|
||||
image: ${JELLYSEERR_IMAGE:-fallenbagel/jellyseerr:latest}
|
||||
container_name: ${JELLYSEERR_CONTAINER_NAME:-jellyseerr}
|
||||
environment:
|
||||
- LOG_LEVEL=${JELLYSEERR_LOG_LEVEL:-debug}
|
||||
- TZ=${TZ:-Europe/Madrid}
|
||||
volumes:
|
||||
- ${COMMON_PATH}/configs/jellyseerr:/app/config:Z
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- media
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=${TRAEFIK_ENABLE:-true}
|
||||
- traefik.docker.network=${TRAEFIK_DOCKER_NETWORK:-proxy}
|
||||
- traefik.http.routers.jellyseerr.rule=Host(`${JELLYSEERR_HOST}`)
|
||||
- traefik.http.routers.jellyseerr.entrypoints=${TRAEFIK_ENTRYPOINTS:-websecure}
|
||||
- traefik.http.routers.jellyseerr.tls=${TRAEFIK_TLS:-true}
|
||||
- traefik.http.routers.jellyseerr.tls.certresolver=${TRAEFIK_CERTRESOLVER:-letsencrypt}
|
||||
- traefik.http.routers.jellyseerr.middlewares=${AUTH_MIDDLEWARE:-authentik@docker}
|
||||
- traefik.http.services.jellyseerr.loadbalancer.server.port=${JELLYSEERR_PORT:-5055}
|
||||
|
||||
jellyfin:
|
||||
image: ${JELLYFIN_IMAGE:-lscr.io/linuxserver/jellyfin:latest}
|
||||
container_name: ${JELLYFIN_CONTAINER_NAME:-jellyfin-vps}
|
||||
environment:
|
||||
- PUID=${PUID:-0}
|
||||
- PGID=${PGID:-0}
|
||||
- TZ=${TZ:-Europe/Madrid}
|
||||
volumes:
|
||||
- ${COMMON_PATH}/configs/jellyfin-vps:/config:Z
|
||||
- ${COMMON_PATH}/jellyfin/cache-vps:/cache:Z
|
||||
- ${MEDIA_TV:-/mnt/media/tv}:/data/tvshows
|
||||
- ${MEDIA_MOVIES:-/mnt/media/movies}:/data/movies
|
||||
- ${MEDIA_DOWNLOADS:-/mnt/media/downloads}:/data/media_downloads
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- media
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=${TRAEFIK_ENABLE:-true}
|
||||
- traefik.docker.network=${TRAEFIK_DOCKER_NETWORK:-proxy}
|
||||
- traefik.http.routers.jellyfin.rule=Host(`${JELLYFIN_HOST}`)
|
||||
- traefik.http.routers.jellyfin.entrypoints=${TRAEFIK_ENTRYPOINTS:-websecure}
|
||||
- traefik.http.routers.jellyfin.tls=${TRAEFIK_TLS:-true}
|
||||
- traefik.http.routers.jellyfin.tls.certresolver=${TRAEFIK_CERTRESOLVER:-letsencrypt}
|
||||
- traefik.http.routers.jellyfin.middlewares=${AUTH_MIDDLEWARE:-authentik@docker}
|
||||
- traefik.http.services.jellyfin.loadbalancer.server.port=${JELLYFIN_PORT:-8096}
|
||||
|
||||
96
media-server/stack.env
Normal file
96
media-server/stack.env
Normal file
@@ -0,0 +1,96 @@
|
||||
# =========================
|
||||
# Global
|
||||
# =========================
|
||||
TZ=
|
||||
LOG_LEVEL=
|
||||
LOG_HTML=
|
||||
CAPTCHA_SOLVER=
|
||||
|
||||
# =========================
|
||||
# Paths (VPS)
|
||||
# =========================
|
||||
COMMON_PATH=
|
||||
|
||||
# =========================
|
||||
# Media mounts (HOST VPS)
|
||||
# =========================
|
||||
MEDIA_MOUNT_BASE=
|
||||
MEDIA_TV=
|
||||
MEDIA_MOVIES=
|
||||
MEDIA_DOWNLOADS=
|
||||
|
||||
# =========================
|
||||
# PUID/PGID
|
||||
# =========================
|
||||
PUID=
|
||||
PGID=
|
||||
|
||||
# =========================
|
||||
# Networks
|
||||
# =========================
|
||||
TRAEFIK_DOCKER_NETWORK=
|
||||
MEDIA_NETWORK_NAME=
|
||||
|
||||
# =========================
|
||||
# Traefik common
|
||||
# =========================
|
||||
TRAEFIK_ENABLE=
|
||||
TRAEFIK_ENTRYPOINTS=
|
||||
TRAEFIK_TLS=
|
||||
TRAEFIK_CERTRESOLVER=
|
||||
AUTH_MIDDLEWARE=
|
||||
|
||||
# =========================
|
||||
# Images (optional override)
|
||||
# =========================
|
||||
FLARESOLVERR_IMAGE=
|
||||
PROWLARR_IMAGE=
|
||||
JACKETT_IMAGE=
|
||||
SONARR_IMAGE=
|
||||
RADARR_IMAGE=
|
||||
JELLYSEERR_IMAGE=
|
||||
JELLYFIN_IMAGE=
|
||||
|
||||
# =========================
|
||||
# Container names (optional override)
|
||||
# =========================
|
||||
FLARESOLVERR_CONTAINER_NAME=
|
||||
PROWLARR_CONTAINER_NAME=
|
||||
JACKETT_CONTAINER_NAME=
|
||||
SONARR_CONTAINER_NAME=
|
||||
RADARR_CONTAINER_NAME=
|
||||
JELLYSEERR_CONTAINER_NAME=
|
||||
JELLYFIN_CONTAINER_NAME=
|
||||
|
||||
# =========================
|
||||
# Service ports (optional override)
|
||||
# =========================
|
||||
PROWLARR_PORT=
|
||||
JACKETT_PORT=
|
||||
SONARR_PORT=
|
||||
RADARR_PORT=
|
||||
JELLYSEERR_PORT=
|
||||
JELLYFIN_PORT=
|
||||
|
||||
# =========================
|
||||
# Jellyseerr extra
|
||||
# =========================
|
||||
JELLYSEERR_LOG_LEVEL=
|
||||
|
||||
# =========================
|
||||
# FlareSolverr resources
|
||||
# =========================
|
||||
FLARESOLVERR_SHM_SIZE=
|
||||
|
||||
# =========================
|
||||
# Domains
|
||||
# =========================
|
||||
DOMAIN=
|
||||
PROWLARR_HOST=
|
||||
JACKETT_HOST=
|
||||
SONARR_HOST=
|
||||
RADARR_HOST=
|
||||
JELLYSEERR_HOST=
|
||||
JELLYFIN_HOST=
|
||||
|
||||
|
||||
Reference in New Issue
Block a user