Cómo instalar Jellyfin con Docker y ver tu biblioteca en la tele
Índice de contenidos
- Puntos clave
- Qué es Jellyfin y en qué se diferencia de Plex y Emby
- Qué versión instalar
- Instalar Jellyfin con Docker Compose
- Por qué van separados config, caché y biblioteca
- Cómo nombrar los ficheros para que el catalogador acierte
- Usuarios y bibliotecas
- Aceleración por hardware, la parte que de verdad importa
- Cómo saber si una reproducción es directa o transcodificada
- Aplicaciones para la tele, el móvil y el navegador
- Acceso remoto sin abrir puertos
- Copias de seguridad
- Qué ganas y qué pierdes
- Preguntas frecuentes
- ¿Necesito una GPU para instalar Jellyfin?
- ¿Puedo migrar mi biblioteca de Plex o Emby a Jellyfin?
- ¿Es seguro dejar el puerto 8096 abierto en el router?
- Conclusión
- Fuentes
Jellyfin es un servidor multimedia libre con licencia GPL-2.0 que no pide cuenta ni suscripción. Se instala con el compose oficial, que publica el puerto 8096 y monta tres volúmenes separados para configuración, caché y biblioteca. La versión estable en agosto de 2026 es la 10.11.11 y la transcodificación por hardware viene incluida.
Tienes un disco lleno de películas, series o música y quieres verlo en la tele y en el móvil sin pagar una suscripción ni meter una clave de licencia. Jellyfin hace exactamente eso: un servidor que indexa tus ficheros, les busca carátulas y sinopsis, y los sirve a cualquier aplicación cliente. Esta guía lo instala con el compose oficial, ordena la biblioteca para que el catalogador no falle, activa la transcodificación por GPU y deja el acceso remoto cerrado como debe estar.
Puntos clave
- La versión estable a finales de agosto de 2026 es la 10.11.11, publicada el 6 de junio; la rama 12 lleva seis candidatas y todavía no es estable.
- El compose oficial monta tres volúmenes distintos:
/config,/cachey la biblioteca, que va como montaje de tipobindy en solo lectura si no quieres que el servidor escriba en ella. - Los puertos son 8096/TCP para HTTP, 8920/TCP para HTTPS si lo activas y 7359/UDP para que las aplicaciones encuentren el servidor en la red local.
- La transcodificación por hardware entra por VAAPI, QSV, NVENC, AMF o RKMPP, y en Docker se reduce a pasar
/dev/dri/renderD128con el gruporender, o el runtime de NVIDIA. - Jellyfin no trae acceso remoto propio. La documentación desaconseja abrir el puerto al exterior, así que la salida es un proxy inverso o una VPN.
Qué es Jellyfin y en qué se diferencia de Plex y Emby
Jellyfin es un servidor multimedia libre con licencia GPL-2.0. Nació como bifurcación de Emby 3.5.2, la última versión antes de que aquel proyecto cerrara su código, y se portó a .NET. El repositorio acumula 56.352 estrellas y 5.384 bifurcaciones, y la imagen oficial de Docker Hub declara más de 411 millones de descargas.
La diferencia con los otros dos se resume en tres cosas concretas. La primera es la cuenta: Plex vincula el servidor a una cuenta de plex.tv, mientras que en Jellyfin el usuario administrador se crea en tu máquina y ahí se queda.
La segunda es el muro de pago. Plex escribe en su propia página que "To stream remotely from any server you have access to, you’ll need a Remote Watch Pass or a Plex Pass", y la transcodificación por hardware figura también entre las funciones del plan de pago.
Emby es más explícito con los números. Premiere cuesta 4,99 dólares al mes, 54 al año o 119 de pago único, e incluye la transcodificación acelerada, las aplicaciones móviles y hasta la copia de seguridad. En Jellyfin todo eso está en la caja.
La documentación del proyecto lo formula así: "There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it".
Lo que pierdes es cobertura de dispositivos y pulido en algunos clientes de televisión.
Qué versión instalar
En el momento de escribir esto, la última publicación marcada como estable en el repositorio es la 10.11.11, del 6 de junio de 2026. Por encima hay seis candidatas de la rama 12, desde la v12.0-rc1 del 21 de junio hasta la v12.0-rc6 del 26 de agosto, todas marcadas como versión previa. Si te tienta la 12, espera: Jellyfin no tiene mecanismo de vuelta atrás, y en cuanto arranca una versión nueva aplica sus migraciones y la anterior ya no puede leer los datos.
Fija la etiqueta. La imagen oficial admite latest, la mayor (10), la menor (10.11) y la exacta (10.11.11), y en un servidor doméstico la exacta te ahorra sorpresas un martes por la noche.
Un aviso que la documentación da en mayúsculas: los contenedores en anfitriones Windows o macOS no tienen soporte, y la transcodificación por hardware está rota ahí. Jellyfin en Docker es Linux.
Instalar Jellyfin con Docker Compose
El despliegue son cuatro pasos:
- Crea los directorios
config,cachey el punto de montaje de tu biblioteca. - Escribe el fichero
compose.yamlcon los tres volúmenes y los dos puertos. - Levanta la pila y espera a que el registro anuncie que Kestrel escucha.
- Entra en
http://<tu-servidor>:8096y completa el asistente inicial.
El compose es este, calcado del oficial salvo por la etiqueta fijada:
services:
jellyfin:
image: jellyfin/jellyfin:10.11.11
container_name: jellyfin
user: 1000:1000
ports:
- "8096:8096/tcp"
- "7359:7359/udp"
volumes:
- ./config:/config
- ./cache:/cache
- type: bind
source: /srv/media
target: /media
read_only: true
restart: unless-stopped
environment:
- JELLYFIN_PublishedServerUrl=http://192.168.1.20:8096
extra_hosts:
- "host.docker.internal:host-gateway"
Tres detalles que no son decorativos. user: 1000:1000 evita que el servidor corra como root y hace que los ficheros que escriba pertenezcan a tu usuario. El montaje de la biblioteca es type: bind porque apunta a un disco que ya existe, y en solo lectura porque Jellyfin no necesita escribir en tus películas. Y JELLYFIN_PublishedServerUrl es la dirección que el servidor anuncia a las aplicaciones cuando lo buscan por la red.
El puerto 7359/UDP es el que permite ese descubrimiento automático y es el único que no se puede cambiar. Si además quieres DLNA, el contenedor tiene que ir en modo de red del anfitrión, que es una decisión aparte.
Por qué van separados config, caché y biblioteca
Porque tienen ciclos de vida distintos y el propio arranque lo demuestra. Desplegué la 10.11.11 en una máquina arm64 para escribir esto, y el registro declara las rutas efectivas:
Main: Jellyfin version: 10.11.11
Main: Operating system: Debian GNU/Linux 13 (trixie)
Main: Architecture: Arm64
Main: Program data path: /config
Main: Cache path: /cache
Startup: Storage path `/config/data` successfully checked with 39GiB free
which is over the minimum of 2GiB.
SqliteDatabaseProvider: SQLite connection string:
Data Source=/config/data/jellyfin.db
En /config viven la base de datos SQLite, las claves, los registros y los metadatos descargados: eso es lo que hay que respaldar. En /cache viven las miniaturas y los fragmentos temporales de transcodificación: eso es material desechable que puedes borrar cuando quieras, y que agradece un SSD. Y la biblioteca es tuya y no la toca nadie. Juntarlo todo en un volumen es lo que convierte una copia de seguridad de 200 MB en una de 40 GB.
El arranque comprueba además que cada ruta tenga un mínimo de 2 GiB libres, y se queja si no. En reposo, con dos bibliotecas pequeñas y sin nadie reproduciendo, docker stats marcó 177,5 MiB de memoria para el contenedor.
Cómo nombrar los ficheros para que el catalogador acierte
Aquí es donde falla casi todo el mundo, aunque no por el motivo que suele repetirse. Probé el catalogador con nombres buenos y malos a propósito, y el resultado corrige la creencia habitual.
La documentación pide para películas una carpeta por título con el formato Nombre (año) [id del proveedor] y el fichero dentro con el mismo nombre. Para series, una carpeta por serie y dentro carpetas Season 01, con este aviso literal: no abrevies el nombre de la temporada a S01 ni a SE01. Y hay caracteres reservados que rompen la exploración: < > : " / | ? *.
Ahora lo medido. Un fichero con nombre de publicación pirata, sintel.2010.1080p.BluRay.x264-GROUP.mp4, se identificó igual de bien que la versión ordenada Sintel (2010)/Sintel (2010).mp4: ambos acabaron con el mismo identificador de TMDb (45745) y de IMDb (tt1727587). Otro llamado Tears of Steel 2012.mkv, sin paréntesis en el año, también encontró su ficha. El analizador de nombres retira las etiquetas de resolución, fuente y grupo antes de buscar.
Lo que no se identificó fue video final DEFINITIVO.mp4: ningún año, ningún identificador, ninguna sinopsis. El problema no es el ruido alrededor del título, es que no haya título.
Con las series la cosa cambia y ahí sí hay un fallo silencioso. Coloqué un capítulo en una carpeta S01 con el nombre capitulo uno.mp4 y otro en Season 02 llamado Serie Mala 2x03.mp4. El segundo entró perfecto como temporada 2, episodio 3. El primero se catalogó como episodio sin número de temporada ni de episodio, y Jellyfin lo metió en una temporada fantasma llamada Season Unknown que no corresponde a ninguna carpeta del disco.
La numeración tiene que estar en el nombre del fichero, en formato S01E01 o 2x03. La carpeta sola no basta.
Una estructura que funciona:
/srv/media
├── peliculas
│ └── Sintel (2010)
│ ├── Sintel (2010).mkv
│ └── Sintel (2010).es.srt
└── series
└── Cosmos Laundromat (2015)
└── Season 01
└── Cosmos Laundromat (2015) S01E01.mkv
Los subtítulos externos siguen la misma regla de sufijos: .es.srt marca el idioma, .forced los forzados y .sdh los de accesibilidad auditiva. Si quieres guardar dos versiones de la misma película, tienen que estar en la misma carpeta y empezar con el nombre exacto de la carpeta seguido de espacio, guion, espacio y una etiqueta. Si te saltas ese prefijo, verás dos películas repetidas en el catálogo, que es justo lo que me pasó al dejar el mismo fichero en dos carpetas distintas.
Usuarios y bibliotecas
El asistente inicial crea el administrador y pregunta idioma y país de los metadatos. Ponerlo en español desde el principio importa: mis fichas llegaron con la sinopsis en castellano porque configuré es como idioma preferido de metadatos antes del primer análisis.
Una biblioteca es un tipo de contenido más una o más rutas. El tipo, Películas, Series, Música, decide qué analizador se usa, así que mezclar películas y series en la misma biblioteca es una mala idea aunque el disco esté ordenado. Los usuarios adicionales se crean después y cada uno tiene su casilla de conexiones remotas, que es la que gobierna si esa persona puede entrar desde fuera de casa.
Aceleración por hardware, la parte que de verdad importa
Sin GPU, cada reproducción que no encaje con el cliente sale del procesador y una película 4K basta para tumbar un servidor doméstico. Los métodos validados por el proyecto son cinco: QSV de Intel, NVENC de NVIDIA, AMF de AMD, VA-API para Intel y AMD en Linux, VideoToolbox en macOS y RKMPP para Rockchip.
| Método | Para quién | Qué hay que pasar al contenedor |
|---|---|---|
| VA-API | Intel y AMD en Linux, casi cualquier iGPU | /dev/dri/renderD128 y el grupo render |
| QSV | Intel Broadwell o posterior, mejor rendimiento | Lo mismo que VA-API |
| NVENC | NVIDIA con controlador 520.56.06 o superior | Runtime de NVIDIA y el kit de contenedores |
| AMF | AMD en Windows | No aplica en Docker sobre Linux |
| RKMPP | Placas Rockchip como RK3588 | /dev/dri y los dispositivos de vídeo |
Para Intel o AMD, primero averigua el identificador numérico del grupo que posee el dispositivo, porque cambia entre distribuciones:
getent group render | cut -d: -f3
ls -l /dev/dri
Con ese número, el compose crece dos bloques:
group_add:
- "993" # el id real del grupo render en tu anfitrión
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
Con NVIDIA el planteamiento es distinto porque la imagen no lleva el controlador propietario. Hay que instalarlo en el anfitrión junto al kit de contenedores de NVIDIA, y entonces el compose declara el runtime:
runtime: nvidia
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
Después queda activarlo en el panel, en Playback y Transcoding, eligiendo el método y desmarcando los códecs que tu tarjeta no admita. La comprobación honesta se hace desde dentro del contenedor: docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo lista los perfiles que la GPU ofrece de verdad.
Dos advertencias que salen de la propia documentación. QSV no funciona en Docker sobre Windows ni en WSL. Y el H.264 de 10 bits no tiene decodificador por hardware en ninguna GPU de Intel, NVIDIA ni AMD, así que ese material siempre cae al procesador.
En mi prueba, sobre arm64 y sin /dev/dri en la máquina, el servidor declaró Available hwaccel types: ["cuda", "drm", "opencl", "rkmpp"] y el panel dejó la aceleración en None. Es exactamente lo que debe verse cuando no hay nada que pasar al contenedor. El transcodificador que trae la imagen es ffmpeg version 7.1.4-Jellyfin, no el ffmpeg del sistema.
Cómo saber si una reproducción es directa o transcodificada

Jellyfin distingue tres formas de servir un vídeo. En Direct Play el fichero viaja tal cual porque el cliente entiende el contenedor, el vídeo, el audio y los subtítulos. En Direct Stream solo se reenvasa el contenedor o se rehace el audio. Y en transcodificación se recodifica el vídeo entero, que es lo caro.
La documentación señala la incrustación de subtítulos como el componente que más procesador consume de todo el proceso.
Lo comprobé pidiendo al servidor la decisión para el mismo fichero con dos perfiles de cliente distintos. Con un perfil que admite mp4, H.264 y AAC, la respuesta fue SupportsDirectPlay: true y ninguna dirección de transcodificación. Con un perfil que solo admite webm, VP9 y Opus, la misma película devolvió SupportsDirectPlay: false y una dirección /videos/<id>/master.m3u8, que es la señal de que va a recodificar.
En el panel, la sección de dispositivos activos muestra durante la reproducción si el método es DirectPlay, DirectStream o Transcode, junto al motivo concreto (VideoCodecNotSupported, SubtitleCodecNotSupported, ContainerBitrateExceedsLimit y una veintena más) y al tipo de aceleración en uso. Si ves transcodificación constante en la tele del salón, ahí está el diagnóstico: no toques la GPU hasta saber qué motivo aparece.
Aplicaciones para la tele, el móvil y el navegador
El cliente web va incluido y es el más completo. En televisión, la aplicación de Android TV es la mejor cuidada del catálogo oficial. En iOS y tvOS, Swiftfin; en Android, la aplicación oficial. Y para el ordenador, Jellyfin Desktop, que reproduce con mpv en lugar de con el navegador y es la vía razonable para material exigente.
El resto es más irregular, y decirlo es más útil que venderlo. Los clientes de Roku, webOS de LG y Tizen de Samsung existen y funcionan, pero van por detrás en funciones y su ritmo de publicación depende de la comunidad. El HDR está admitido en un abanico estrecho de dispositivos. Si tu televisor es un Samsung de hace seis años, un reproductor barato con Android TV te dará mejor resultado que pelearte con la aplicación nativa.
Acceso remoto sin abrir puertos
Jellyfin no incluye nada parecido al acceso remoto de Plex, y su documentación es directa al respecto: abrir un puerto directamente a internet "is therefore insecure and not recommended". Las dos salidas sensatas son las de siempre.
La primera es un proxy inverso con certificado de Let’s Encrypt delante del 8096, que es el patrón que ya cubrimos en la guía de Traefik con Docker Compose. Si vas por ahí, hay un ajuste que casi todo el mundo olvida: la dirección del proxy tiene que aparecer en Known Proxies, dentro de los ajustes de red. Sin eso, Jellyfin ve la IP del proxy en lugar de la del visitante, deja de distinguir entre red local y externa, y los permisos de acceso remoto por usuario dejan de aplicarse. Y ojo con los registros del proxy: Jellyfin envía a veces la clave de la API dentro de la propia dirección, así que registrar la ruta completa escribe secretos en el fichero de registro.
La segunda es no publicar nada y entrar por VPN, ya sea con Headscale como plano de control propio o con WireGuard y wg-easy. Es la que uso cuando el servidor es solo para mí y para mi familia. El servidor sigue sin escuchar en internet y el móvil ve el 8096 como si estuviera en el salón.
Copias de seguridad
Desde la 10.11 hay copia de seguridad integrada y funciona con el servidor encendido, que es una mejora real frente al procedimiento manual de parar el contenedor y copiar carpetas. Se lanza desde el panel, en Backups, y elige qué incluir: la base de datos siempre, y opcionalmente metadatos, subtítulos y datos de vista previa. Comprueba que haya al menos 5 GB libres, aunque con subtítulos y vistas previas se queda corto enseguida.
El archivo cae en <tu volumen>/config/data/backups, así que si respaldas el volumen /config ya lo tienes fuera. La restauración se hace desde la misma pantalla o arrancando el binario con --restore-archive y la ruta del zip. Hazla antes de cada actualización, sin excepción: ya lo dije arriba, no hay vuelta atrás.
Qué ganas y qué pierdes
| Jellyfin 10.11.11 | Plex | Emby | |
|---|---|---|---|
| Licencia | GPL-2.0 | Propietaria | Propietaria |
| Cuenta externa obligatoria | No | Sí, en plex.tv | Para Connect |
| Transcodificación por hardware | Incluida | Plex Pass | Premiere |
| Acceso remoto de serie | No, lo montas tú | Sí, con suscripción | Sí, con Connect |
| Aplicaciones móviles | Gratuitas | Gratuitas | Premiere |
| Coste anunciado | 0 | No visible sin sesión | 4,99 USD al mes |
La columna que decide es casi siempre la última fila combinada con la penúltima. Si quieres ver tu biblioteca desde el móvil en el tren y no te apetece montar una VPN, Plex hace ese trabajo por ti y cobra por él. Si ya tienes un Portainer gobernando tus contenedores y un Nextcloud detrás del mismo proxy, añadir Jellyfin es media hora y ninguna cuenta nueva.
Preguntas frecuentes
¿Necesito una GPU para instalar Jellyfin?
No para instalarlo. La necesitas si tu biblioteca tiene códecs que tus clientes no reproducen de forma directa, que es lo que obliga a transcodificar, más que la potencia del servidor. Con ficheros H.264 en mp4 y clientes modernos, la reproducción es directa y el procesador apenas trabaja.
¿Puedo migrar mi biblioteca de Plex o Emby a Jellyfin?
Los ficheros sí, sin tocar nada, porque las convenciones de nombres son parecidas. La configuración no: usuarios, listas de reproducción y estados de visto hay que rehacerlos. Y si vienes de la imagen de LinuxServer.io, las rutas internas de datos no coinciden con las de la imagen oficial y no se pueden intercambiar sin más.
¿Es seguro dejar el puerto 8096 abierto en el router?
No. La propia documentación de Jellyfin lo desaconseja de forma explícita. Pon un proxy inverso con HTTPS delante, o mejor, entra por VPN y no publiques nada.
Conclusión
Instalar Jellyfin son quince líneas de compose y un asistente de dos pantallas. Lo que separa un servidor que funciona de uno que da guerra está en tres decisiones posteriores. Separa configuración, caché y biblioteca en volúmenes distintos, y numera los episodios en el nombre del fichero en vez de confiar en la carpeta. Y pasa la GPU al contenedor antes de que la primera película 4K te deje el servidor a cero.
El acceso remoto no viene resuelto, y ese es el precio real de no pagar suscripción. La versión en inglés de esta guía está en How to install Jellyfin with Docker.
Fuentes
- Jellyfin, introducción a la documentación
- jellyfin/jellyfin, versión 10.11.11 en el repositorio
- Jellyfin, instalación en contenedor
- Jellyfin, aceleración por hardware
- Jellyfin, nombres y organización de películas
- Jellyfin, copia de seguridad y restauración
- Docker Hub, imagen oficial jellyfin/jellyfin
- Emby, licencias y funciones de Premiere
- Plex, qué incluye Plex Pass
Código fuente
Accede a todo el código fuente de este artículo en GitHub.
Ver en GitHub