Objetivo
Estedocker-compose.ymllevanta un ecosistema completo para multimedia (Jellyfin, *arr, Tdarr, Komga/Kavita, Audiobookshelf, Navidrome…), descargas/índices (qBittorrent, Prowlarr, Jackett, Autobrr), monitorización (Netdata, Dozzle, Uptime Kuma), automatización (n8n + Postgres), UI/gestión (Heimdall/Homarr/Organizr/Portainer), buscador (SearXNG), reverse proxy (Nginx Proxy Manager), IA local (Ollama + Open WebUI + Qdrant), docs (OnlyOffice), y utilidades varias (CloudBeaver, Filebrowser, Threadfin, TVHeadend, jfa-go, Jellystat…).
Incluye perfiles GPU para aceleración HW (NVIDIA/AMD), healthchecks, y ejemplos de comandos Docker para operar el stack.
- Docker + Docker Compose v2 actualizados.
- Windows (WSL2) o Linux. En Windows con WSL2 conviene revisar compatibilidad de rutas y permisos.
- GPU opcional (NVIDIA/AMD) si usarás transcodificación o IA acelerada. Compose permite reservar GPUs con
deploy.resources.reservations.devices(driver, capabilities, count/device_ids). Requiere NVIDIA Container Toolkit (en Linux) o Docker Desktop con WSL2 (en Windows) y drivers al día. citeturn22search0turn22search2turn24search3 - Puertos del host disponibles (ver tabla más abajo).
El compose declara volúmenes nombrados para config/cache/datos (p. ej. jellyfin_data, media_data, netdata_*, npm_*, ollama_storage, qdrant_storage, etc.).
Algunos servicios montan rutas absolutas del host Windows (F:/..., D:/..., C:/...) que debes ajustar a tu entorno (o a rutas Linux si lo ejecutas en WSL/Ubuntu).
Sugerencia: mantén todas las configuraciones duraderas bajo una carpeta raíz (p. ej.
F:\_Multimedia\...) y haz backup periódico de los volúmenes críticos (ver comandos más abajo).
Crea un .env junto al docker-compose.yml con tus secretos/URLs/usuarios. Compose soporta environment: y env_file: (incluido el flag required para archivos opcionales) y respeta la sobreescritura por orden de carga. citeturn15search15
Ejemplo mínimo .env:
# Base
TZ=Europe/Madrid
JELLYFIN_PUBLISHED_URL=http://tu-ip:8096
# Jellystat
JELLYSTAT_DB_PASS=pon-una-clave
JELLYSTAT_JWT=pon-otra-clave
# n8n + Postgres
POSTGRES_USER=n8n
POSTGRES_PASSWORD=pon-una-clave
POSTGRES_DB=n8n
# OnlyOffice
ONLYOFFICE_JWT_SECRET=cadena-larga-y-unica
# TubeArchivist
TA_HOSTS=admin@localhost
TA_USERNAME=admin
TA_PASSWORD=cambia_esto
TA_ES_PASSWORD=otra_clave_elastic# Revisar el compose (modo “dry-run”)
docker compose config
# Arrancar todo en segundo plano
docker compose up -d
# Ver estado de contenedores
docker compose ps
# Seguir logs de un servicio
docker compose logs -f jellyfinReferencias a comandos Compose v2: up, down, ps, logs, exec, restart, pull, etc. citeturn5search2
# CPU-only (Ollama CPU y pull del modelo)
docker compose --profile cpu up -d ollama-cpu ollama-pull-llama-cpu
# NVIDIA (necesita NVIDIA Container Toolkit / GPU visible)
docker compose --profile gpu-nvidia up -d ollama-gpu ollama-pull-llama-gpu
# AMD ROCm
docker compose --profile gpu-amd up -d ollama-gpu-amd ollama-pull-llama-gpu-amdNotas
- Para NVIDIA, el soporte de GPU en Compose se define con
deploy.resources.reservations.devices(drivernvidia,capabilities: [gpu],count). citeturn22search0turn22search2- Puedes validar con
docker compose run --rm test-gpuodocker compose up test-gpu(ejecutanvidia-smi).
Servidor multimedia. Habilita aceleración de hardware (Dashboard → Playback → Transcoding) si tienes GPU (NVENC para NVIDIA, VAAPI/QSV para Intel, etc.). Sigue la guía oficial para NVIDIA/Intel y revisa issues/limitaciones conocidas por driver/SO. citeturn16search1turn16search0turn16search5turn16search9
Frontends alternativos del ecosistema Jellyfin.
Indexa/archiva YouTube localmente. Variables: ES_URL, REDIS_CON, TA_HOST/USER/PASS, y credenciales de Elastic (ELASTIC_PASSWORD). citeturn15search11
Gestión de invitaciones/usuarios para Jellyfin.
Analítica/estadísticas para Jellyfin.
IPTV proxy y backend PVR (DVR, timeshift).
- qBittorrent (WebUI
:8080, puertos p2p 6881 TCP/UDP) - Sonarr (
:33074), Radarr (:33075), Bazarr (:33076), Lidarr (:33077), Readarr (:33078), Prowlarr (:33079)
Apunta todas amedia_data:/downloadsy a las rutas finales (/movies,/tv,/books, etc.).
Peticiones de usuarios para nuevas pelis/series. (Tras proxy reverso, usa encabezados X-Forwarded-* adecuados.)
Transcodificación/normalización en masa. Puede usar GPU (NVIDIA), define ffmpegVersion=7. (Ver docs de perfiles/plugins en el repo de Tdarr).
Librerías de cómics, ebooks y frontend de Calibre.
Servidor musical compatible con Subsonic.
Servidor de audiolibros/podcasts.
Automatiza transcodificación/optimización de tu librería (puede usar GPU).
Sincronización de calidades/perfiles, auto-descarga por filtros, monitor de trackers, y notificaciones integradas.
Dashboards/portales para centralizar accesos.
Gestión de Docker y visor de logs.
Monitorización en tiempo real del host/contenedores. Para una cobertura amplia, monta /etc/netdata, /var/lib/netdata, /var/cache/netdata y los paths del host (/proc, /sys, /etc/os-release, etc.). citeturn17search0turn17search4
Meta-buscador privado. Configuración en /etc/searxng/settings.yml (volumen). (Si lo pondrás tras proxy, ajusta SEARXNG_BASE_URL).
Reverse proxy con Let’s Encrypt. Por defecto publica 80/443 y gestiona el panel en el 81. citeturn18search0turn18search2
Metadatos/colecciones para Jellyfin.
Automatización de flujos; configuración típica con DB_TYPE=postgresdb y DB_POSTGRESDB_*. citeturn4search2
- Ollama expone 11434 y persiste en
/root/.ollama. Puedes pre-cargar modelos con un contenedor “init” que hagaollama pull .... citeturn24search17 - Open WebUI puede apuntar a Ollama externo con
OLLAMA_BASE_URL(p. ej.http://host.docker.internal:11000). citeturn23search0
Vector DB para embeddings/recuperación semántica. Por defecto REST en :6333 y datos en /qdrant/storage. citeturn21view0
Monitor de servicios. Si va detrás de proxy, habilita WebSocket en el proxy. Nginx requiere Upgrade/Connection para WS. citeturn18search1
Habilita JWT para evitar rotaciones aleatorias y romper integraciones: JWT_ENABLED=true, fija JWT_SECRET en el entorno y en tu conector (Nextcloud/Seafile, etc.). Mapea volúmenes de logs/data/lib/db. citeturn20search1turn20search0
Mueve TOKEN al .env. Crea A/AAAA para tu subdominio *.duckdns.org.
Explorador de archivos y gestor de BBDD en el navegador.
- moverpelis: cron bucle que mueve archivos de eMule a Películas si no cambian hace >1 min.
- test-gpu:
nvidia/cudaejecutanvidia-smi.
Recomendado: crear una red Docker dedicada (p. ej.
docker network create proxy) y conectar NPM + backends a esa red. Evitas exponer puertos innecesarios en el host.
- Levanta NPM (puertos 80/443 públicos y panel 81). citeturn18search0
- Configura DNS del dominio/subdominios a la IP pública/NAT.
- En NPM → Hosts > Proxy Hosts: crea las entradas:
- Jellyfin →
http://jellyfin:8096 - Open WebUI →
http://open-webui:8080 - Uptime Kuma →
http://uptime-kuma:3001 - SearXNG →
http://searxng:8080
Marca Websockets para apps que lo usen (Kuma, etc.). Para WS en Nginx: añadeUpgrade+Connectionheaders. citeturn18search1
- Jellyfin →
- SSL: pide certificado Let’s Encrypt (HTTP-01). Para wildcard usa DNS-01 (proveedor soportado por NPM).
- Opcional: Access List, HSTS, redirecciones, Custom Nginx Config.
# Real IP detrás de proxy
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSockets (WS/WSS)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;(WS es requisito en servicios como Kuma o apps “live”). citeturn18search1
- Open WebUI + Ollama en el host/otra máquina: define
OLLAMA_BASE_URL(p. ej.https://ia.midominio.com) y ajusta CORS si aplica. citeturn23search0 - OnlyOffice: si lo publicas tras NPM, recuerda que JWT debe coincidir con el del conector (Nextcloud, etc.). Evita que el secreto cambie entre reinicios. citeturn20search1
- Qdrant: restringe acceso público (auth/reverse proxy con ACL) o mantenlo solo en red interna Docker. citeturn21view0
Tip: todos admiten
--project-name NOMBREsi gestionas múltiples stacks.
# Arrancar todo / servicios concretos
docker compose up -d
docker compose up -d jellyfin prowlarr qbittorrent
# Arrancar todo con perfil de GPU
docker compose --profile gpu-nvidia up -d
# Parar (manteniendo contenedores)
docker compose stop
# Reiniciar todos/uno
docker compose restart
docker compose restart jellyfin
# Apagar y eliminar contenedores (conserva volúmenes)
docker compose down
# Apagar y eliminar contenedores + redes huérfanas
docker compose down --remove-orphans# Listar estado
docker compose ps
# Logs (todo / un servicio)
docker compose logs --tail=200
docker compose logs -f jellyfin
# Entrar a un contenedor
docker compose exec jellyfin bash
docker compose exec qbittorrent sh# Traer imágenes nuevas
docker compose pull
# Recrear contenedores con misma config
docker compose up -d --pull always
# Ver qué cambiaría (diff)
docker compose diff# Listar volúmenes
docker volume ls
# Crear backup de un volumen (tar.gz)
# Ej: backup de "jellyfin_data"
docker run --rm -v jellyfin_data:/vol -v %cd%:/backup alpine sh -c "cd /vol && tar czf /backup/jellyfin_data_$(date +%F).tgz ."
# Restaurar
docker run --rm -v jellyfin_data:/vol -v %cd%:/backup alpine sh -c "cd /vol && tar xzf /backup/jellyfin_data_YYYY-MM-DD.tgz"# Ver redes y contenedores conectados
docker network ls
docker network inspect proxy
# Conectar/desconectar un servicio a una red
docker network connect proxy nginx-proxy-manager
docker network disconnect proxy nginx-proxy-manager# Lanzar solo servicios marcados con un perfil
docker compose --profile cpu up -d
docker compose --profile gpu-nvidia up -d
# Probar GPU
docker compose up test-gpu(Para NVIDIA via Compose usa deploy.resources.reservations.devices con driver: nvidia y capabilities: [gpu] + count. Requiere toolkit/driver). citeturn22search0turn22search2
# Contenedores parados + redes no usadas + imágenes dangling
docker system prune
# También volúmenes sin usar (¡ojo!)
docker system prune --volumes# Ver estado de healthchecks vía inspect
docker inspect --format='{{.State.Health.Status}}' jellyfin
# Consultar endpoints de salud (ejemplos)
curl -fsS http://localhost:8096/health # Jellyfin
curl -fsS http://localhost:5055/api/v1/status # Jellyseerr(Jellyfin expone /health para comprobar disponibilidad básica). citeturn7search0
- .env y secretos fuera del repo. Usa
COMPOSE_PROFILES,COMPOSE_PROJECT_NAME, etc. si gestionas varios stacks. citeturn15search11 - NPM: habilita HTTPS, fuerza HSTS/H2, usa Access Lists. Mantén solo 80/443 abiertos al exterior.
- OnlyOffice: fija
JWT_SECRETy replica ese valor en el conector (Nextcloud/Seafile…) para evitar fallos tras reinicios. citeturn20search1 - Netdata: monta correctamente
/etc/netdata,/var/lib/netdata,/var/cache/netdatay paths de host para una visibilidad real del sistema. citeturn17search0 - Qdrant/servicios internos: si no necesitan Internet, no los publiques, limítalos a red Docker interna. citeturn21view0
- Backups: programa copias de los volúmenes de configuración.
| Servicio | Host:Puerto | Contenedor |
|---|---|---|
| Jellyfin | 8096 / 8920 | 8096 / 8920 |
| Jellix | 3003 | 80 |
| Jellyfin-Vue | 3004 | 80 |
| TubeArchivist | 8001 | 8000 |
| jfa-go | 8056 | 8056 |
| Jellystat | 3000 | 3000 |
| Threadfin | 34400 | 34400 |
| TVHeadend | 9981/9982 | 9981/9982 |
| qBittorrent | 8080 / 6881 TCP/UDP | 8080 / 6881 |
| Sonarr | 33074 | 8989 |
| Radarr | 33075 | 7878 |
| Bazarr | 33076 | 6767 |
| Lidarr | 33077 | 8686 |
| Readarr | 33078 | 8787 |
| Prowlarr | 33079 | 9696 |
| Jellyseerr | 33080 | 5055 |
| Tdarr | 33081/33082 | 8265/8266 |
| Komga | 33083 | 25600 |
| Calibre | 33084/33085/33087 | 8080/8181/8081 |
| Kavita | 33086 | 5000 |
| Portainer | 9443/8000 | 9443/8000 |
| Dozzle | 9999 | 8080 |
| Netdata | 19999 | 19999 |
| Audiobookshelf | 13378 | 80 |
| Unmanic | 8888 | 8888 |
| Autobrr | 7474 | 7474 |
| NewTrackon | 33101 | 8080 |
| Notifiarr | 5454 | 5454 |
| Organizr | 33102 | 80 |
| CloudBeaver | 18978 | 8978 |
| SearXNG | 4080 | 8080 |
| NPM (HTTP/HTTPS/Admin) | 80 / 443 / 81 | 80 / 443 / 81 |
| Kometa | (no puerto) | — |
| Calibre-Web | 8083 | 8083 |
| Navidrome | 4533 | 4533 |
| Open WebUI | 3002 | 8080 |
| Uptime Kuma | 3001 | 3001 |
| OnlyOffice | 8088 | 80 |
| Filebrowser | 18080 | 80 |
| DuckDNS | — | — |
| Ollama | 11000 → 11434 | 11434 |
| Qdrant | 6333 | 6333 |
Tras ponerlos detrás de NPM, esos puertos ya no deberían exponerse en WAN (manténlos en LAN/red Docker).
- Búsqueda/Descarga: Prowlarr/Jackett → qBittorrent.
- Clasificación: Sonarr/Radarr/Readarr/Lidarr mueven/renombran a librerías finales.
- Transcodificación: Unmanic/Tdarr optimizan códecs/bitrates (ideal con GPU).
- Servir: Jellyfin + Jellyseerr (peticiones).
- Subtítulos: Bazarr.
- Monitoreo: Netdata + Uptime Kuma.
- Automatización: n8n (workflows con Postgres).
- IA: Open WebUI→Ollama (+Qdrant para RAG/embeddings).
- Proxy/SSL: NPM delante de todo.
- GPU no detectada: confirma Toolkit/Drivers,
deploy.resources...devices(driver: nvidia,capabilities: [gpu],count: 1) y revisadocker compose logs. citeturn22search0turn22search2 - WebSockets no funcionan tras NPM: habilita WS y añade
Upgrade/Connection. citeturn18search1 - OnlyOffice 401/403 con conectores: alinea
JWT_SECRETen DocumentServer y en el conector; evita rotación automática del secreto. citeturn20search1 - Open WebUI no conecta a Ollama: revisa
OLLAMA_BASE_URL(si Ollama está en el host:http://host.docker.internal:11000). citeturn23search0 - Netdata sin métricas del host: revisa montajes
/proc,/sys,/etc/os-releasey volúmenes de/etc/netdata,/var/lib/netdata,/var/cache/netdata. citeturn17search0 - Qdrant accesible públicamente: restringe a red interna o agrega auth/proxy. citeturn21view0
# Ejecutar un curl desde dentro de un contenedor
docker compose exec searxng curl -I http://localhost:8080
# Copiar archivos dentro/fuera de contenedor
docker cp ./config.yml kometa:/config/config.yml
docker cp jellyfin:/config/log/log.txt ./
# Health detallado
docker inspect jellyseerr | jq '.[0].State.Health'
# Ver diferencias de imagen al actualizar (pull requerido)
docker images | grep -E 'jellyfin|ollama|open-webui'
# Forzar recreación de un servicio concreto con imagen nueva
docker compose pull jellyfin && docker compose up -d jellyfin
# Pruebas HTTP básicas en un servicio
curl -fsS http://localhost:3001 # Kuma
curl -fsS http://localhost:4080 # SearXNG
# Perfiles: arrancar solo lo necesario para IA CPU
docker compose --profile cpu up -d ollama-cpu open-webui qdrant- GPU en Docker Compose (reservas de dispositivos y capacidades). citeturn22search0turn22search2
- Jellyfin — Aceleración HW (NVIDIA/Intel) y limitaciones. citeturn16search1turn16search0turn16search5turn16search9
- Netdata en Docker (montajes/privilegios/volúmenes). citeturn17search0turn17search4
- Nginx WebSocket (Upgrade/Connection). citeturn18search1
- Nginx Proxy Manager (puertos por defecto y acceso al panel). citeturn18search0turn18search2
- Open WebUI (
OLLAMA_BASE_URL). citeturn23search0 - Ollama Docker (11434 y volumen
/root/.ollama). citeturn24search17 - Qdrant (puertos y almacenamiento). citeturn21view0
- OnlyOffice (JWT habilitado y secreto fijo). citeturn20search1turn20search0
- Docker Compose CLI v2 (up/down/logs/exec…). citeturn5search2
Con este README unificado ya tienes la guía de despliegue, exposición, operación y comandos para todo el stack. Si quieres, puedo adaptar los dominios/subdominios, listas de acceso y certs de NPM a tu caso concreto (o generar un .env modelo con tus valores).