Autoaloja Jellyfin: tu propio Netflix en un VPS (guía 2026)
Autoaloja Jellyfin con Docker Compose en un VPS barato y monta tu propio Netflix: instalación, acceso remoto, transcodificación, copias de seguridad y sin cuotas de suscripción.
62 min de lectura

Plex sigue poniendo detrás de un muro de pago funciones que ya son tuyas. Si prefieres autoalojar Jellyfin, obtienes tu propio Netflix: sin cuentas con un proveedor, sin anuncios, sin suscripción y sin peaje para el acceso remoto. Esta guía despliega el servidor multimedia Jellyfin con Docker Compose en un VPS barato (o un mini PC en casa), lo expone de forma segura detrás de un proxy inverso y cubre las partes que de verdad lo mantienen en marcha: Direct Play en una máquina sin GPU, copias de seguridad y actualizaciones en la nueva línea de versiones 12.x.
Todo lo que sigue está fijado a Jellyfin 12.1 y escrito en septiembre de 2026. Cada paso importante tiene un comando de verificación para que sepas que funcionó antes de continuar.
Versiones de esta guía
Fija tu imagen en jellyfin/jellyfin:12.1. Jellyfin cambió su versionado con la 12.0 (GA el 8 de septiembre de 2026): el prefijo 10. desapareció, así que a 10.11.x le sigue 12.x, donde el primer dígito es ahora la versión mayor. Todos los comandos de aquí siguen la documentación actual de 12.x; la sección de actualización cubre el salto desde 10.10.7 o 10.11.x.
¿Prefieres empezar con el vídeo? Ese recorrido está planteado para un servidor casero; la guía escrita de abajo es la vía del VPS y Dokploy.
Por qué autoalojar Jellyfin en lugar de pagar por Plex
Jellyfin es un servidor multimedia libre bajo GPL-2.0, sin cuenta de proveedor ni necesidad de «llamar a casa». El repositorio ronda las 57.000 estrellas en GitHub, lleva en desarrollo desde diciembre de 2018 (empezó como un fork comunitario de Emby; véase la página oficial del proyecto), y el cliente web viene incluido en el puerto 8096.
Lo que obtienes gratis y que Plex pone detrás de Plex Pass: transcodificación por hardware, acceso remoto y usuarios ilimitados. No es una diferencia menor. El precio del Plex Pass de por vida no ha parado de subir (los hilos de la comunidad citan 749,99 $), y el streaming remoto es justo la función por la que la mayoría empieza a autoalojar.
Lo que pierdes: pulido en los clientes. Las apps de Plex siguen siendo más fluidas en algunas TV, y los clientes de Jellyfin a veces van por detrás de los nuevos códecs y plataformas. Además, el servidor lo operas tú. Si has llegado hasta aquí en bitdoze, probablemente eso sea una ventaja, no un inconveniente. Para el argumento general del autoalojamiento, consulta por qué necesitas un home server en 2026.
| Jellyfin | Plex | |
|---|---|---|
| Precio | Gratis, GPL-2.0 | Nivel gratuito + muro de pago Plex Pass |
| Transcodificación por hardware | Incluida | Plex Pass |
| Acceso remoto | Incluido, tu proxy | El nivel gratuito ha cambiado varias veces |
| Cuenta del proveedor | No obligatoria | Obligatoria |
Un ángulo más para el público de los VPS: Jellyfin es solo software que ejecutas tú. No hay unos ToS del proveedor que prohíban IPs de centros de datos. Los reportes de la comunidad sugieren que Plex bloquea o rechaza algunos rangos de IP de Hetzner, algo que conviene saber antes de planear un montaje alojado en torno a él. La regla real es más simple que cualquier duda sobre ToS: sirve solo contenido que sea tuyo, extraído de tus discos o comprado.
Tu contenido, tu responsabilidad
Esta guía se mantiene neutral sobre las fuentes. Usa contenido que poseas, extraído de discos que compraste o adquirido digitalmente. Aquí no hay recorridos del stack *arr, a propósito.
Dónde ejecutar tu servidor Jellyfin: mini PC vs VPS
La decisión en una frase: un servidor casero gana en coste de almacenamiento y transcodificación por hardware. Un VPS gana en ancho de banda de subida, IP pública y disponibilidad permanente si estás atrapado detrás de CGNAT. El ancho de banda casi nunca es el límite. Lo es el almacenamiento. Una cifra aproximada de la comunidad: 4K a 25 Mbps son unos 11 GB/hora, así que un solo espectador intensivo mueve alrededor de 1 TB/mes de tráfico saliente. Un VPS europeo típico incluye 20 TB/mes, suficiente para una familia sin esfuerzo.
- ¿Subida decente en casa (20 Mbps+) y quieres transcodificación por hardware? Monta un servidor casero.
- ¿CGNAT, subida lenta, o lo necesitas siempre encendido con IP pública? Monta un VPS.
- ¿Las dos cosas? Ve a híbrido: biblioteca en casa, VPS o Tailscale para el acceso remoto.
- ¿Necesitas transcodificación por hardware? Eso es territorio doméstico (iGPU Intel de 7.ª generación o más reciente).
- ¿Solo quieres tenerlo funcionando esta noche sin comprar hardware? VPS.
| Vía | Coste recurrente | Pago único | Qué obtienes |
|---|---|---|---|
| VPS | ~10-20 EUR/mes (clase CX + Storage Box + dominio) | - | IP pública, 20 TB de egreso, sin hardware en casa |
| Casa | ~3-5 EUR/mes de electricidad | ~150-180 EUR de mini PC + discos | TB baratos, Intel Quick Sync |
| Híbrido | Coste del VPS + electricidad | Mini PC + discos | Lo mejor de ambos mundos, más piezas móviles |
Los precios son de septiembre de 2026 y Hetzner revalorizó en junio de 2026, así que comprueba los precios actuales de Hetzner antes de presupuestar. Mi opción por defecto es híbrida: mantener la biblioteca en casa (o en una Storage Box), Direct Play en todas partes, y no pensar nunca en presupuestos de transcodificación.
La vía del VPS: Direct Play en una máquina Hetzner barata
Mi recomendación por defecto es un VPS de Hetzner Cloud de clase CX23 (2 vCPU, 4 GB de RAM) o su gemelo ARM CAX21, con el contenido en una Hetzner Storage Box montada por SMB/SFTP/WebDAV, o simplemente un disco local más grande. Si necesitas ubicaciones fuera de la UE o ya tienes cuenta, un VPS KVM de Hostinger funciona igual.
Los precios de los VPS subieron en general en 2026 — si te estás replanteando una máquina alquilada, mira qué cambió y cuándo gana un mini PC.
Sin GPU en esta clase de VPS solo hay transcodificación por software, así que la estrategia es Direct Play (tiene su propia sección abajo). Reglas generales de la comunidad, no benchmarks: aproximadamente una transcodificación 1080p por software por cada 2 vCPU, y una transcodificación 4K por software se come una máquina de 4-8 vCPU para un solo stream. Planifica en torno a Direct Play y esas cifras dejan de importar.
La vía del servidor casero: almacenamiento y hardware
Un mini PC N100 o similar de clase Jasper Lake es el favorito de la comunidad porque la decodificación por hardware de HEVC de 10 bits requiere Intel de 7.ª generación (Kaby Lake) o más reciente. Algo como el GMKtec K15 tiene justo la forma de máquina adecuada: Intel QuickSync se encarga de las transcodificaciones HEVC. Acompáñalo de un NAS o discos USB; el artículo sobre el mejor NAS para homelabs con Docker y Proxmox cubre cajas de almacenamiento que hacen también de hosts Docker, y nuestra selección de los mejores mini PC para servidor casero tiene las opciones de CPU actuales.
Si la biblioteca vive en un recurso compartido del NAS, monta un recurso NFS desde tu NAS y conoce la salvedad de antemano: los montajes de red no entregan eventos inotify, así que Jellyfin no escaneará automáticamente los archivos nuevos ahí. Usa escaneos programados en su lugar.
No empieces un montaje nuevo en una Raspberry Pi. La aceleración por hardware V4L2 está obsoleta, la Pi 5 no tiene codificador por hardware en absoluto, y Jellyfin 10.11+ abandonó ARM de 32 bits por completo. Y si la máquina está siempre encendida, elige un SAI para tu servidor casero para que un corte de luz no corrompa una base de datos a mitad de escaneo.
Qué necesitas antes de empezar
- Host Linux x86_64 o ARM64 (Ubuntu 24.04 / Debian 12 típico). Solo 64 bits.
- Docker Engine + plugin Docker Compose instalados y funcionando.
- 2 GB de RAM es el suelo; 4 GB va cómodo con la base de datos de metadatos en memoria (10.11 y posteriores).
- Al menos 2 GB libres en los directorios de datos. Jellyfin 10.11+ se niega a arrancar en caso contrario.
- Un registro DNS para Let’s Encrypt (o acepta acceso solo por Tailscale y sáltate el TLS).
- Puertos 80/443 abiertos en el host del proxy inverso. El puerto 8096 se queda interno.
- Una carpeta de contenido que poseas, hayas extraído o comprado.
- Opcional, solo vía doméstica: iGPU Intel de 7.ª generación o más reciente para transcodificación por hardware.
Solo 64 bits
Jellyfin 10.11 eliminó el soporte ARM32/armhf. Las Pi 1/2 y las imágenes SBC de 32 bits son callejones sin salida. Si uname -m imprime armv7l o i686, para y elige otra máquina.
Nota sobre dimensionado de RAM: Jellyfin no tiene un mínimo oficial documentado. El suelo de 2 GB y la cifra cómoda de 4 GB son recomendaciones basadas en la caché de base de datos en memoria introducida en 10.11 y mantenida en 12.x, que puede elevar el uso de RAM hasta aproximadamente el tamaño de la base de datos de tu biblioteca. Las bibliotecas grandes quieren 8 GB.
Instala Jellyfin con Docker Compose, paso a paso
Abajo hay dos caminos sin fricción: Docker Compose a secas (el predeterminado), o la plantilla de un clic de Dokploy si ya usas Dokploy. Ambos terminan en el mismo paso de verificación.
El docker-compose.yml (fijado a la 12.1)
Crea el directorio del proyecto y un punto de montaje para el contenido, luego escribe el archivo compose. Fija la etiqueta exacta. latest ya sigue a 12.x y flotará a la siguiente versión mayor, llevándose las migraciones consigo.
mkdir -p /opt/jellyfin/{config,cache}
cd /opt/jellyfinservices:
jellyfin:
image: jellyfin/jellyfin:12.1
container_name: jellyfin
# user: "1000:1000" # optional: run non-root, match media ownership
ports:
- "8096:8096/tcp"
# - "7359:7359/udp" # client discovery. LAN only. omit on a VPS
volumes:
- ./config:/config # metadata, DB, images. this is what you back up
- ./cache:/cache # disposable transcode/cache data
- /mnt/media:/media:ro # your library. read-only is fine
environment:
- JELLYFIN_PublishedServerUrl=https://jellyfin.example.com
restart: unless-stoppedNotas de la documentación oficial del contenedor que conviene conocer antes de editar esto:
- Los montajes múltiples de contenido funcionan (
/media/movies,/media/tv, …), y el modo solo lectura está totalmente soportado. - Las fuentes personalizadas para incrustar subtítulos se montan en
/usr/local/share/fonts/custom(más un/fallback_fontsopcional). - DLNA necesita
network_mode: host. La red bridge por defecto es la correcta para un VPS. - El puerto 8920 existe para HTTPS interno. El TLS interno está obsoleto y su eliminación está planeada. No lo uses; termina el TLS en un proxy inverso.
- Vocabulario de etiquetas en el nuevo esquema:
latest,12,12.1,unstable.12flota entre versiones menores; yo fijo la menor completa y la subo de forma deliberada. - Las imágenes alternativas (
linuxserver/jellyfin,ghcr.io/hotio/jellyfin) usan rutas de configuración distintas. No son intercambiables con los volúmenes de la imagen oficial. El contenedor en Windows/macOS no está soportado oficialmente para aceleración por hardware. Solo host Linux.
Luego levántalo:
docker compose up -d
docker compose logs -f --tail=50Despliegue en un clic con la plantilla Jellyfin de Dokploy
Si ya usas Dokploy, Jellyfin es una plantilla oficial en dokploy.com/templates (más de 500 plantillas a último recuento, junto a Jellyseerr). Dos rutas:
- Instala la plantilla Jellyfin con un clic desde el panel.
- Pega el compose de arriba como un servicio Compose de Dokploy.
En ambos casos, el Traefik de Dokploy termina el TLS por ti, así que sáltate la sección de Caddy y salta directo al arreglo de Known Proxies de abajo. Comportamiento de la plantilla a septiembre de 2026: revisa las rutas de los volúmenes en el compose generado antes de desplegar, sobre todo si migras un /config existente. Si Dokploy no está instalado todavía, empieza con nuestra guía de instalación de Dokploy.
Desplegar con Docker Compose
cd /opt/jellyfin
docker compose up -d
docker compose ps
curl -sI http://localhost:8096 | head -1Espera HTTP/1.1 200 (o un 302 a la interfaz web). docker compose ps debería mostrar running, no restarting. Si el contenedor entra en bucle de reinicios, docker compose logs jellyfin | tail -20 suele nombrar la causa: permisos en ./config, o menos de 2 GB libres en el volumen.
Desplegar con Dokploy
En Dokploy: Templates, busca “Jellyfin”, despliega. Define el dominio como jellyfin.example.com, deja el TLS a Traefik y confirma que el volumen de configuración está en almacenamiento persistente, no en la capa del contenedor.
Verifica igual desde el host:
docker ps --filter name=jellyfin --format '{{.Status}}'
curl -sI http://localhost:8096 | head -1Luego configura Known Proxies antes de que nadie streamee en remoto (siguiente sección). Es el paso específico de Dokploy que la gente se salta.
Comprueba que está levantado
curl -sI http://localhost:8096 | head -1 devuelve HTTP/1.1 200 o 302. docker compose ps está sano. docker compose logs jellyfin | tail -20 no muestra errores de migración. Roto se ve así: permission denied en ./config (ver Solución de problemas), o «Less than 2 GB of free space» y una salida inmediata.
Configuración inicial: administrador, bibliotecas y cuentas de usuario
Abre http://YOUR_SERVER_IP:8096 desde una red de confianza (o por túnel SSH: ssh -L 8096:localhost:8096 user@server, y luego navega a http://localhost:8096). El asistente se ejecuta en este orden:
- Crea la cuenta de administrador. Contraseña fuerte y única. Esta cuenta no se comparte.
- Define el idioma de visualización y de metadatos. Los proveedores remotos de metadatos (TMDb, OMDb, Open Subtitles) vienen activados por defecto. Si prefieres archivos NFO locales, dilo aquí en vez de reescanear después.
- Añade bibliotecas apuntando a las rutas dentro del contenedor (
/media/movies,/media/tv,/media/music), no a las rutas del host. - Deja correr el primer escaneo. Las bibliotecas grandes tardan. Es normal.
- Crea cuentas por usuario para la familia. Nunca repartas el login de administrador. Cada usuario tiene su propio interruptor «Allow remote connections», que cobra sentido una vez configuradas las Local Networks en la sección de seguridad.
Apunte sobre Roku: la ficha de la tienda puede afirmar que se requiere una suscripción de cable. No es así. Es una limitación de la tienda, según la página oficial de clientes.
Verifica tu primer escaneo
Dashboard > Libraries muestra los contadores de elementos subiendo. docker logs jellyfin muestra el progreso del escaneo. Reproduce un elemento en el navegador a calidad original y confirma que el audio y los subtítulos funcionan antes de darlo por terminado.
No expongas todavía el 8096
Resiste la tentación de abrir el 8096 a internet «solo para probar». Configura primero el proxy inverso de la siguiente sección. Lleva diez minutos y elimina la peor trampa de esta guía.
Acceso remoto a Jellyfin detrás de un proxy inverso
Tres razones por las que un proxy inverso no es opcional. El TLS interno está obsoleto y programado para eliminarse, así que la terminación HTTPS pertenece al proxy. Quieres un dominio real con Let’s Encrypt, no una IP en bruto. Y un 8096 expuesto en internet es justo lo que la documentación advierte.
Usa un subdominio (jellyfin.example.com), no una subruta. Alojar en una subruta como Base URL funciona, pero la documentación de red enumera lo que rompe: DLNA, HDHomeRun, integraciones con Sonarr/Radarr, MrMC. No merece la pena.
La documentación de proxy inverso de Jellyfin señala tres trampas. Son la principal causa del «funciona en local, roto en remoto»:
- Known Proxies. Añade la IP del proxy o Jellyfin descartará
X-Forwarded-For. Los usuarios remotos parecerán locales entonces, y las restricciones de acceso remoto por usuario se rompen en silencio. - Los WebSockets deben pasar por el proxy. Los datos de la guía de TV en directo y las actualizaciones de actividad los necesitan.
- Higiene de logs. Jellyfin puede poner
api_keyen las URL. No registres las rutas completas de las peticiones en el log de acceso del proxy.
Traefik o Caddy: TLS y WebSockets
La documentación de Jellyfin recomienda Caddy «por su facilidad de uso, especialmente con https». Es difícil discrepar. Caddyfile mínimo:
jellyfin.example.com {
reverse_proxy jellyfin:8096
}Caddy obtiene y renueva el certificado por sí mismo y proxifica WebSockets por defecto. Las configuraciones de Nginx, HAProxy y Apache están en la documentación oficial de proxy inverso si ya usas alguno; no pegues tres stacks competidores en la misma máquina.
Si desplegaste con Dokploy, ya tienes Traefik. Crea el dominio en el servicio, apúntalo al puerto 8096 del contenedor Jellyfin y deja que el router de Dokploy gestione el TLS. El paso de Known Proxies de abajo es la parte que no es automática.
Known Proxies: la solución n.º 1 al «funciona en local, roto en remoto»
El fallo exacto: Jellyfin ignora las cabeceras X-Forwarded-For de los proxies en los que no confía. Cada usuario remoto aparece con la IP del proxy. Tus reglas por usuario de «bloquear acceso remoto» se convierten en decoración, y el panel muestra una sola IP para todos.
Arreglo: Dashboard > Networking > Known Proxies. Añade la IP del proxy inverso tal como la ve Jellyfin. En Dokploy es la IP de contenedor o de gateway de Traefik:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.Gateway}}{{end}}' dokploy-traefik
# or list the container IP if they share a user-defined network
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dokploy-traefikVerifica con un cliente remoto real: reproduce algo desde un móvil con datos (Wi-Fi apagado), y luego mira Dashboard > Activity > Devices. La sesión debería mostrar una IP remota que no sea la de tu proxy, y «Remote» en la fila de la sesión. Si sigue diciendo Local con la IP del proxy, la entrada de Known Proxies no hizo efecto.
¿Prefieres no exponerlo? Solo Tailscale o WireGuard
Alternativa de exposición cero: vincula Jellyfin solo a la red privada y une los clientes a través de Tailscale o WireGuard. Sin dominio, sin puerto público, sin fail2ban, sin certificado que cuidar. Es un buen valor por defecto para uso de una sola familia.
La contrapartida: cada dispositivo necesita el cliente VPN. Móviles y portátiles van bien. Las smart TV son el problema. Algunas no pueden ejecutar Tailscale en absoluto, y enseñar a los familiares a activar una VPN es una carga de soporte. Para un uso intensivo en el salón, gana la vía del subdominio + proxy.
Caddy
jellyfin.example.com {
reverse_proxy jellyfin:8096
}Recarga: caddy reload --config /etc/caddy/Caddyfile. Los certificados son automáticos. Los WebSockets pasan por defecto.
Traefik (Dokploy)
Adjunta el dominio al servicio Jellyfin en el panel de Dokploy y deja que su router Traefik termine el TLS. No hace falta editar labels para un servicio Compose estándar. Luego define Known Proxies con la IP de Traefik (ver arriba). Ese es todo el delta de Dokploy.
Solo Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up
tailscale ip -4Publica Jellyfin solo en la dirección tailscale0 (o déjalo vinculado a la red docker y alcanzarlo vía el servicio compose desde otro contenedor en la tailnet). Sin dominio, sin 80/443, sin exposición pública. Añade clientes desde la consola de administración de Tailscale.
Nunca redirijas el puerto 8096 directamente
La documentación de red lo dice claramente: abrir un puerto directamente a internet es inseguro y no está recomendado. Proxy con TLS, o solo VPN. Igual para el 8920 (obsoleto) y el 7359/UDP (descubrimiento LAN).
La trampa de Known Proxies
Salta Known Proxies y cada restricción de acceso remoto de la siguiente sección será teatro. Los usuarios quedarán mal clasificados y tus reglas remotas por usuario no se aplicarán.
Comprobaciones de extremo a extremo: curl -I https://jellyfin.example.com devuelve HTTP/2 200 (o 302) con una cadena válida de Let’s Encrypt. Luego haz la prueba de Known Proxies con datos móviles de arriba. Roto se ve así: fallos de handshake TLS (DNS sin propagar, o 443 bloqueado), actualizaciones de TV en directo que se pierden (WebSockets bloqueados), o cada sesión mostrando la IP del proxy (Known Proxies).
Estrategia de reproducción para un VPS sin GPU: Direct Play primero
En un VPS sin GPU, la transcodificación es lo que funde la máquina. La solución no es un VPS más grande. Es evitar las transcodificaciones.
Definiciones rápidas, porque el panel usa estas palabras y la gente las confunde:
- Direct Play: el cliente reproduce el archivo tal cual. CPU casi nula. Este es el objetivo.
- Direct Stream: el vídeo no se toca; el audio o los subtítulos se remultiplexan o cambian de contenedor. Barato.
- Transcode: el vídeo se vuelve a codificar. Esta es la opción cara.
Estrategia para un VPS sin GPU:
- Precodifica la biblioteca a formatos ampliamente compatibles: vídeo H.264 o HEVC, audio AAC o EAC3. HandBrake para ripeos puntuales, Tdarr o similar para recodificar en lote archivos existentes. Elige preajustes que encajen con tus clientes, no la máxima calidad teórica.
- Pon los clientes en calidad original / auto-máx. La mayoría de las transcodificaciones en un servidor Direct Play son autoinfligidas por un cliente puesto a 2 Mbps.
- Prefiere los clientes oficiales de web, escritorio y TV, cuyo soporte de códecs conoces de verdad.
Reglas generales de la comunidad (de nuevo, no benchmarks): cerca de una transcodificación 1080p por software por cada 2 vCPU. Una transcodificación 4K por software satura una máquina de 4-8 vCPU para un stream. Direct Play baja esas cifras a casi cero y la cuenta de ancho de banda de antes (aproximadamente 1 TB/mes por espectador 4K intensivo) pasa a ser lo único a vigilar.
Lectura del panel: inicia la reproducción, abre Dashboard > Playback. La fila dice Direct Play, Direct Stream o Transcode.
- Direct Play: listo.
docker stats jellyfindebería mostrar la CPU casi en reposo. - Direct Stream: bien. Solo trabajo de audio/subtítulos.
- Transcode: o arreglas el archivo fuente o el ajuste del cliente, o aceptas quemar CPU. Si sigue pasando y lo necesitas, quieres una iGPU (siguiente sección).
La trampa de H.264 Hi10P
El H.264 de 10 bits (Hi10P) no tiene decodificación por hardware en ninguna GPU Intel, NVIDIA o AMD. Estos archivos siempre caen a software. Recodifícalos a H.264 de 8 bits o HEVC de 10 bits, o presupuesta CPU para cada reproducción.
Transcodificación por hardware en Jellyfin con Intel Quick Sync
Sáltate esto en un VPS
Las instancias VPS de clase Hetzner/Contabo no tienen iGPU. Esta sección es para la vía del mini PC y el servidor casero. En un VPS, sigue la estrategia Direct Play de arriba.
Si sí necesitas transcodificación (clientes mezclados, incrustación de subtítulos, una biblioteca 4K servida a pantallas 1080p), Intel Quick Sync es la recomendación por defecto. La imagen oficial de Docker trae los drivers Intel Media y un runtime OpenCL. Tú solo pasas el dispositivo y emparejas el GID del grupo render del host.
Encuentra el GID en el host:
getent group render | cut -d: -f3 # often 104, but it varies. also check video/inputAñade al servicio compose y recrea:
user: "1000:1000"
group_add:
- "104" # the host render GID from getent
devices:
- /dev/dri/renderD128:/dev/dri/renderD128docker compose up -dLuego Dashboard > Playback: activa la aceleración por hardware (QSV o VAAPI), desmarca los códecs que tu generación no soporta y deja el tone mapping apagado hasta que funcione una transcodificación básica.
Datos de las generaciones de Intel sacados de la documentación oficial de HWA de Intel:
- Decodificación/codificación HEVC de 10 bits: 7.ª generación (Kaby Lake) y posteriores. Por eso las máquinas de clase N100 son la elección por defecto.
- Decodificación AV1: Tiger Lake (11.ª generación) y posteriores. Codificación AV1: Arc serie A y Meteor Lake y posteriores.
- A diferencia de NVIDIA NVENC, no hay límite de sesiones de codificación concurrentes en iGPU Intel ni en dGPU Arc.
- El tone mapping de HDR10/HLG a SDR está soportado (métodos OpenCL o QSV VPP).
Verifica que la HWA funciona de verdad
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v verbose -init_hw_device vaapi=va -init_hw_device opencl@vavainfo lista los perfiles VA-API sin errores de permisos. Durante una transcodificación forzada a baja calidad, intel_gpu_top en el host (paquete intel-gpu-tools) muestra los motores Video/VideoEnhance ocupados. Si los motores se quedan al 0 % mientras la CPU se dispara, estás en software sin saberlo: dispositivo equivocado, GID equivocado o un códec no soportado aún marcado.
Intel QSV (recomendado)
Los pasos de arriba son todo el camino: dispositivo + group_add + activar QSV en Dashboard > Playback. Análisis a fondo oficial: documentación de aceleración por hardware de Intel. Verifica con vainfo e intel_gpu_top.
NVIDIA NVENC (referencia)
NVIDIA funciona pero son más piezas móviles: nvidia-container-toolkit en el host, runtime pasado a Docker, y NVENC tiene límites de sesiones concurrentes según la clase de GPU. No he reproducido los comandos aquí a propósito. Sigue la documentación oficial de HWA de NVIDIA y verifica con las herramientas allí listadas antes de confiarla en producción.
Copias de seguridad y actualizaciones seguras (de 10.11.x a 12.x)
El contenido lo puedes volver a extraer. Lo que no puedes reconstruir es la base de datos de metadatos, el progreso de visualización, las cuentas de usuario y la caché de imágenes. Haz copia de /config. Ese es todo el trabajo.
Capa 1: Backup & Restore integrado (introducido en 10.11). El panel puede hacer una instantánea de la base de datos de metadatos en caliente y restaurarla. Salvedad directa de las notas de la versión: la restauración es para el mismo sistema, SO y contenedor. No es una herramienta de migración entre máquinas.
Capa 2: el clásico tar de /config fuera del sitio. /config es pequeño (BD + metadatos + imágenes). /cache es prescindible. El patrón que uso para el resto de mi flota:
# stop first for a consistent tar, or use the live backup above
docker compose stop jellyfin
tar -czf jellyfin-config-$(date +%F).tar.gz -C /opt/jellyfin config
# ship it offsite: restic/rclone to S3, B2, R2, whatever you already run
rclone copy jellyfin-config-$(date +%F).tar.gz remote:backups/jellyfin/
docker compose start jellyfinSi usas Dokploy, programa copias de seguridad de Dokploy a Cloudflare R2 y apunta una al volumen de Jellyfin. Si quieres una plataforma de copias más completa en torno a Restic y Rclone, copias de seguridad autoalojadas con Restic y Rclone cubre un montaje basado en Pluton. El precio de los snapshots (los de Hetzner rondan los 0,014 EUR/GB/mes, citado por la comunidad) frente a restic-a-S3 queda en tablas a este tamaño. Elige el que realmente vayas a restaurar.
La escalera de actualización
El versionado de Jellyfin cambió con la 12.0 (GA el 8 de septiembre de 2026; la 12.1 llegó una semana después). El prefijo 10. desapareció. Las reglas de ahora en adelante: el primer dígito es la mayor (nunca autoactualices a ciegas; haz copia y lee las notas de la versión primero), el segundo es la menor (normalmente segura de automatizar).
Ruta y restricciones según las notas de la versión 12.0:
<=10.10.6 a 10.10.7 a 10.11.x a 12.1 (fijada)
- 12.x admite actualizaciones directas solo desde 10.10.7 y 10.11.x. Cualquier cosa más vieja sube la escalera hasta 10.10.7 primero.
- Los cambios de base de datos de la 12.0 impiden volver atrás sin una restauración completa. Tu copia de
/configprevia a la actualización es el plan de rollback. - Elimina los plugins instalados desde repositorio antes de migrar; necesitan tiempo para adaptarse al nuevo esquema. Vuelve a añadirlos después desde el repositorio estable de plugins.
- Tras actualizar a 12.x hace falta un escaneo completo de la biblioteca: las versiones alternativas autoresueltas se pierden en la migración y el reescaneo las restaura. Espera que el primer escaneo tarde mucho más de lo normal, y algunos títulos pueden reaparecer como recién añadidos.
- El primer arranque de 12.x ejecuta migraciones durante minutos o más. No lo interrumpas.
- Las rutas de API heredadas
/emby/*y/mediabrowser/*se eliminaron, y la autorización heredada está desactivada por defecto (la migración la apaga en instalaciones existentes). Los clientes antiguos de terceros dejarán de funcionar. - Una nueva flag de arranque
--mode(MediaServer,MigrateSystem,SeedSystem) puede ejecutar migraciones sin arrancar el servidor, útil para actualizaciones controladas de contenedores. - Si vienes de antes de 10.11, las trampas antiguas siguen aplicando en ese tramo: la migración EF Core (
library.dbpasa a serjellyfin.db) puede tardar horas en bibliotecas grandes o corruptas, así que ejecútala de noche y vigila la interfaz de arranque desde la LAN. Restablece primero Library Page Size a 100, mantén al menos 2 GB libres en los directorios de datos (si no, se niega a arrancar), espera más RAM después, y guarda el archivo de rollbacklibrary.db.oldhasta que la nueva versión demuestre estabilidad.
- Copia de
/config(API de Backup en caliente o tar) y verifica que el archivo de copia existe fuera del sitio. - Comprueba el espacio libre en los directorios de datos: al menos 2 GB, más para bibliotecas grandes.
- Confirma que estás en 10.10.7+ o 10.11.x antes de intentar 12.x.
- Elimina los plugins instalados por repositorio antes de migrar; vuelve a añadirlos después.
- Restablece Library Page Size a 100 si vienes de antes de 10.11.
- Programa una ventana de mantenimiento. Las migraciones no son una actividad para el descanso de la comida en bibliotecas grandes.
- No interrumpas las migraciones. Ni con Ctrl-C, ni con
docker restart. - Planifica el reescaneo completo de la biblioteca obligatorio tras una actualización a 12.x.
- Lee primero las notas de la versión de destino. Siempre.
Nunca autoactualices a ciegas las versiones mayores
Las migraciones de 12.x se ejecutan en el primer arranque. Copia primero, lee las notas, prográmalo. Las versiones menores (12.0 a 12.1) son las que puedes automatizar. Si quieres herramientas para eso, puedes autoactualizar contenedores Docker con Tugtainer solo para el canal menor, y mantener los saltos mayores manuales.
Por qué la paranoia también con las point releases: la 10.11.7 (marzo de 2026) arregló 4 GHSA marcados «extremely important», y la 10.11.10 arregló 3 más. La cadencia tampoco bajó en el nuevo esquema: la 12.1 llegó una semana después de la 12.0 con 47 correcciones. La política de Jellyfin es un embargo de divulgación de 14 días tras publicar los parches. Ir una versión menor por detrás está bien. Ir seis meses por detrás, no.
Rollback, en orden de preferencia. Ten en cuenta que 12.x no tiene rollback in situ una vez corren las migraciones de base de datos; cada camino de abajo es una restauración, no un downgrade:
- Restaura la instantánea integrada de Backup & Restore (solo mismo sistema).
- Si estás a mitad de migración en el tramo 10.11: para, e inspecciona
library.db.old. Es tu BD previa a la migración. - Reserva completa: fija la etiqueta anterior (
jellyfin/jellyfin:10.11.11para un rollback de 10.11 a 12), para el contenedor, descomprime tu copia de/configsobre./config, arranca.
docker compose stop jellyfin
rm -rf config && tar -xzf jellyfin-config-2026-09-22.tar.gz
# compose file: image: jellyfin/jellyfin:10.11.11
docker compose up -dNota de coste/operación: un snapshot de Hetzner cuesta aproximadamente 0,0143 EUR/GB/mes (citado por la comunidad, verifícalo). Con tamaños de /config de unos pocos GB es calderilla frente al coste de reconstruir el historial de visualización. Haz la copia.
Lista de comprobación de endurecimiento de seguridad
Para una instancia expuesta a internet, este es el mínimo que yo ejecutaría en producción:
- Nunca redirijas el 8096. Proxy con TLS (o solo VPN). Igual para el 8920 y el 7359/UDP.
- UFW permite solo 22, 80, 443:
ufw allow 22,80,443/tcp && ufw enable. - Define los CIDR de Local Networks en Dashboard > Networking para que la clasificación «remota» sea real.
- Interruptores por usuario «Allow remote connections» definidos a propósito, no dejados por defecto sin querer.
- Cuentas únicas por persona. Sin login de administrador compartido. Contraseñas fuertes.
- Plugin LDAP/SSO opcional para autenticación (verifica los nombres actuales de los plugins contra el catálogo oficial).
- Jail de fail2ban sobre los logs de autenticación de Jellyfin (patrón de la comunidad; verifica la regex del filtro contra tu formato de log actual antes de confiar en él).
- Los logs de acceso del proxy censuran las rutas de las peticiones.
api_keypuede aparecer en las URL. - Mantén el host parcheado (
unattended-upgradesen Debian/Ubuntu) y monitorízalo.
Comandos que conviene tener en la memoria muscular:
sudo ufw default deny incoming
sudo ufw allow 22,80,443/tcp
sudo ufw enable
sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgradesFiltrado DNS familiar
Para un servidor multimedia doméstico, el filtrado de anuncios/rastreadores/malware a nivel DNS en la red es un complemento barato. Yo apunto la casa a NextDNS en vez de correr otro contenedor para ello.
Los secretos van en archivos env con permisos estrictos, no en línea en archivos compose que acaban en Git. Y la última capa es el monitoreo: monitoriza tu servidor con Beszel y Uptime Kuma para enterarte de disco lleno y caídas antes que tu familia.
Toques finales: Jellyseerr, clientes de TV y plugins
Jellyseerr (v2.7.x, también plantilla de Dokploy) es la interfaz de explorar-y-pedir que hace que el montaje parezca Netflix para el resto de la casa. La familia busca, pulsa solicitar, tú apruebas, tu tooling de biblioteca existente lo descarga. Gratis. Si ya usas el stack *arr en privado, Jellyseerr es la puerta de entrada que acaba con los mensajes de «¿puedes añadir X?».
Clientes, de la lista oficial:
| Pantalla | Cliente |
|---|---|
| Navegador | Cliente web integrado |
| Escritorio | Jellyfin Media Player |
| Android / iOS | Apps de Jellyfin (Play, F-Droid, Amazon, App Store) |
| Android TV / Fire TV | App oficial |
| Roku | App oficial (la ficha de la tienda puede decir que requiere cable; no es así) |
| LG WebOS / Samsung Tizen | App oficial |
| Xbox | App oficial |
| Kodi | JellyCon add-on |
Existen clientes populares de terceros (Findroid en Android, Swiftfin en Apple TV, Infuse en plataformas Apple). Infuse es de pago. La lista oficial de arriba es la base segura.
Plugins en un párrafo: los proveedores TMDb, OMDb y Open Subtitles vienen activados. Existen plugins LDAP/SSO para endurecer la autenticación; verifica los nombres contra el catálogo oficial de plugins antes de instalar algo sin fijar, y quédate en el repositorio estable: los cambios de esquema de 12.x rompieron compilaciones de plugins antiguos. La 10.11 hizo los proveedores de segmentos de contenido configurables por biblioteca (en lo que se enganchan los plugins estilo intro-skipper), y la 12.0 movió también los ajustes de subtítulos por biblioteca. Para descargar la transcodificación, rffmpeg (mencionado en la documentación oficial de HWA) delega los trabajos de transcodificación a otra máquina por SSH, un truco elegante cuando una máquina tiene la iGPU y la otra tiene la biblioteca.
Solución de problemas de Jellyfin: arreglos rápidos
| Síntoma | Causa probable | Arreglo |
|---|---|---|
| Biblioteca vacía / «playback error» | El contenedor no puede leer el contenido (desajuste UID/GID) | user: uid:gid acorde a la propiedad del contenido, o arregla los permisos. Ver análisis a fondo abajo. |
| Transcodificación silenciosa en CPU | HWA apagada, dispositivo/GID equivocado, o códec no soportado marcado | vainfo, intel_gpu_top, desmarca códecs no soportados |
| HWA rota en el contenedor | Docker corriendo en macOS/Windows | No soportado oficialmente. Usa un host Linux. |
| «Database locked» en escaneos | Contención de escaneos paralelos; bloqueo de archivos en LXC | Baja las tareas de escaneo paralelas; LockingBehavior = Optimistic en config/database.xml; evita LXC por completo |
| Los archivos nuevos nunca aparecen | Los montajes NFS/rclone carecen de inotify | Usa escaneos programados; sube fs.inotify.max_user_watches=524288 en el host para bibliotecas locales grandes |
| Administrador bloqueado | Demasiados logins fallidos | Ver el SQL de abajo. Copia jellyfin.db primero. |
| Falta el progreso de reproducción | Desfase de reloj | timedatectl set-ntp true |
| Los subtítulos se renderizan como cajas (☐☐☐) | Faltan fuentes | Monta fuentes en /usr/local/share/fonts/custom |
| Usuarios remotos marcados como Local | Known Proxies sin configurar | Añade la IP del proxy en Dashboard > Networking |
| TV en directo / actividad se congela | WebSockets bloqueados | Permite las cabeceras de upgrade por el proxy |
404 en apps en /jellyfin |
Subruta de Base URL | Usa un subdominio en su lugar |
| Se niega a arrancar, sale al instante | Menos de 2 GB libres en los directorios de datos | Libera espacio o mueve los volúmenes |
| El contenedor no arranca en una Pi vieja | ARM32 eliminado en 10.11+ | Pasa a un host ARM64/x86_64 de 64 bits |
Permisos, el problema Docker número uno. El usuario del contenedor no puede leer tu montaje de contenido, así que el escaneo no encuentra nada y la reproducción falla. Comprueba lo que ve el contenedor:
docker exec -it jellyfin ls -l /media
docker exec -it jellyfin id
ls -ln /mnt/media # host-side numeric ownersEmparéjalos: define user: "1000:1000" (o lo que muestre ls -ln) en el compose, o chown -R el árbol de contenido al usuario del contenedor. No hagas chmod 777 y sigas adelante. Para el patrón completo (USER en Dockerfile, docker exec -u, user + group_add en Compose), mira cómo arreglar errores de permisos en contenedores Docker.
Bloqueo del administrador. Con el contenedor parado y una copia de la BD hecha:
cp config/data/jellyfin.db jellyfin.db.bak
sqlite3 config/data/jellyfin.db \
"UPDATE Users SET InvalidLoginAttemptCount = 0 WHERE Username='admin';"El esquema de 10.11 vive en jellyfin.db (post EF Core). En instalaciones más viejas puede ser library.db. Hay consultas de reparación de permisos en la documentación oficial de solución de problemas; trabaja sobre una copia.
¿Base de datos bloqueada en Proxmox LXC?
Posición oficial: LXC tiene problemas de bloqueo de base de datos irresolubles con Jellyfin. Ejecútalo en Docker o en una VM completa. Si virtualizas, una VM con Docker dentro es la respuesta aburrida que funciona.
Preguntas frecuentes: autoalojar Jellyfin
¿Es Jellyfin realmente gratis, incluso para la transcodificación por hardware?
Sí. GPL-2.0, sin equivalente a Plex Pass, sin niveles de funciones. La transcodificación por hardware, el acceso remoto y los usuarios ilimitados están incluidos. Tus costes son solo infraestructura: alquiler del VPS, electricidad y discos.
¿Puedo ejecutar Jellyfin en un VPS barato?
Sí, con la estrategia Direct Play. Una máquina de clase CX23 (2 vCPU / 4 GB) sirve una biblioteca Direct Play a una familia sin despeinarse. El coste real es el almacenamiento, no el cómputo. No planees transcodificación 4K por software en esta clase de hardware; un solo stream la saturará.
¿Necesita Jellyfin una GPU?
No, salvo que transcodifiques. Direct Play no necesita GPU en absoluto. Cuando sí necesitas transcodificación, una iGPU Intel de 7.ª generación o más reciente con Quick Sync es el punto dulce: sin límites de sesiones, drivers en la imagen oficial, un solo paso de dispositivo en el compose.
¿Es Jellyfin mejor que Plex en 2026?
En control y precio, sí: sin suscripción, sin cuenta de proveedor, transcodificación por hardware gratis, y tu servidor bajo tus reglas. En pulido de apps en algunas TV, Plex sigue por delante. La contrapartida es operarlo tú mismo, que es en torno a lo que está construida esta guía. Tu contenido se queda en tu hardware de cualquier forma.
¿Está bien ejecutar Jellyfin en un VPS de centro de datos?
Para contenido sobre el que tienes derechos, sí. Jellyfin como software no tiene unos ToS de proveedor en tu camino; la restricción es el contenido, no la plataforma. Quédate con contenido que poseas, hayas extraído o comprado, usa cuentas reales por usuario, y estás en la misma posición que cualquier otro servicio autoalojado. No es consejo legal; solo sentido común operativo.
Cierre: tu propio Netflix ya corre, que siga siendo aburrido
Elegiste un VPS o un mini PC, desplegaste Jellyfin con Docker Compose (o la plantilla de Dokploy), lo pusiste detrás de un proxy inverso con Known Proxies configurado, elegiste Direct Play o cableaste Quick Sync, y programaste copias de /config antes que nada. Eso es un servidor multimedia que puedes dejar en paz.
La cadencia operativa es corta: toma la última point release, mantén honesto el calendario de copias de /config, nunca actualices a ciegas una versión mayor, y monitoriza la máquina para que tu familia no sea el sistema de alertas. Desde aquí, los siguientes pasos naturales son Jellyseerr para las peticiones, almacenamiento híbrido si la biblioteca supera al disco del VPS, y monitoreo de uptime en condiciones.


