diff --git a/media-server/README.md b/media-server/README.md new file mode 100644 index 0000000..19e57ac --- /dev/null +++ b/media-server/README.md @@ -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: `` + - 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. diff --git a/media-server/docker-compose.yml b/media-server/docker-compose.yml new file mode 100644 index 0000000..9cca1a3 --- /dev/null +++ b/media-server/docker-compose.yml @@ -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} + diff --git a/media-server/stack.env b/media-server/stack.env new file mode 100644 index 0000000..cf15652 --- /dev/null +++ b/media-server/stack.env @@ -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= + +