Cómo crear un servidor de Jellyfin con Docker en Ubuntu
Un servidor de Jellyfin personal es una solución práctica si quieres almacenar y gestionar películas, series, música o fotos de forma centralizada. En lugar de depender de un servicio de streaming externo, mantienes el control total sobre tus archivos, las cuentas de usuario y el acceso desde todos tus dispositivos.
¡Prueba tu servidor virtual durante 30 días! Si lo solicitas, te reembolsaremos todos los gastos incurridos.
¿Qué es Jellyfin?
Jellyfin es un servidor multimedia de código abierto que te permite organizar y gestionar tu propia colección de contenidos y reproducirlos en distintos dispositivos a través del navegador o de una aplicación. Es compatible con contenidos como películas, series, música y fotos, e incluye funciones como gestión de usuarios, metadatos, carátulas, seguimiento del progreso de reproducción y streaming en red.
Como Jellyfin se ejecuta en local, funciona de forma independiente de proveedores externos. Solo necesitas conexión a Internet para tareas como la descarga de metadatos o el acceso desde fuera de tu red. Para el uso dentro de la red doméstica, Jellyfin utiliza por defecto HTTP en el puerto 8096. De forma opcional, también puedes usar HTTPS. Para el acceso externo, la documentación oficial recomienda configurar un proxy inverso y utilizar certificados de confianza.
¿Qué requisitos de servidor son recomendables?
Antes de instalar Jellyfin, conviene elegir el tipo de servidor adecuado. Para un servidor de Jellyfin no solo importa cuántos archivos quieres almacenar, sino sobre todo si tus dispositivos pueden reproducir los contenidos directamente o si el servidor tiene que convertirlos durante la reproducción. Este proceso se conoce como transcodificación y requiere muchos recursos. Especialmente el contenido en 4K, el proceso de conversión de HDR a SDR (tone mapping) y varios streams simultáneos pueden suponer una carga elevada para la CPU o la GPU.
La documentación de Jellyfin recomienda, para configuraciones de tamaño medio, al menos 8 GB de RAM como referencia general. En un servidor Linux sin entorno gráfico, 4 GB pueden ser suficientes. Además, para la aceleración por hardware en sistemas que no sean de Apple, Jellyfin recomienda usar gráficos Intel, ya que suelen ofrecer una configuración más sencilla y una buena calidad de codificación en la práctica.
A continuación te mostramos, a partir de distintos escenarios, qué tipo de servidor de Jellyfin se adapta mejor a tu caso de uso.
Particulares y familias
Si utilizas Jellyfin principalmente tú solo o con dos o tres personas y tus archivos ya están en formatos de vídeo habituales como MP4 con H.264, en muchos casos basta con un buen servidor virtual (VPS). En este escenario, el servidor suele limitarse a entregar los archivos, sin necesidad de recodificarlos en cada reproducción. Para ello, un VPS con Linux es un buen punto de partida, con al menos 4 vCores, 4 GB de RAM y unos 120 GB de almacenamiento NVMe.
Si necesitas más margen para metadatos, bibliotecas más grandes o transcodificaciones puntuales, una configuración con 6 vCores, 8 GB de RAM y 240 GB de NVMe ofrece mayor comodidad.
La principal ventaja de un VPS es su relación calidad-precio. Obtienes suficiente rendimiento para un servidor de Jellyfin personal sin necesidad de invertir desde el principio en hardware dedicado. Esta opción resulta especialmente adecuada si tus dispositivos reproducen formatos modernos de forma nativa y la transcodificación solo se utiliza de forma ocasional.
Usuarios avanzados
Si necesitas más margen porque tu biblioteca crece rápidamente, quieres crear varias cuentas de usuario o prefieres ajustar los recursos del servidor con mayor flexibilidad, tiene sentido recurrir a un servidor en la nube o a los llamados Cloud Cubes. Puedes empezar con configuraciones a partir de 4 vCPU, 8 GB de RAM y 240 GB de almacenamiento, lo que te ofrece más capacidad para escaneos en paralelo, gestión de metadatos, bibliotecas más grandes y transcodificaciones puntuales.
La principal ventaja de esta opción es la flexibilidad. Los servidores en la nube se adaptan fácilmente a cambios en los requisitos. Esto resulta especialmente útil si empiezas con una configuración pequeña y más adelante quieres añadir nuevas bibliotecas, más usuarios o servicios adicionales como un proxy inverso, monitorización o copias de seguridad. Para usuarios avanzados, equipos pequeños o entornos de homelab, suele ser la opción intermedia más equilibrada.
Usuarios exigentes y contenido en 4K
Si trabajas con grandes bibliotecas en 4K, necesitas adaptar contenido HDR a dispositivos más antiguos o realizas transcodificación simultánea para varios usuarios, un VPS pequeño puede quedarse corto rápidamente. Jellyfin advierte de forma explícita que el tone mapping de HDR a SDR por software puede exigir mucho a la CPU.
Para estos escenarios, un servidor dedicado o un servidor bare metal es la mejor opción, ya que utilizas hardware exclusivo y no compartes la potencia de cálculo, la RAM ni el almacenamiento con otras cargas de trabajo.
En este caso, conviene contar al menos con 8 núcleos de CPU, entre 16 y 32 GB de RAM y almacenamiento SSD o NVMe rápido. Además, lo ideal es disponer de una GPU Intel o NVIDIA adecuada para la transcodificación por hardware.
Recomendación de sistema operativo: ¿Debian o Ubuntu?
Ambas distribuciones de servidor Linux son adecuadas para ejecutar Jellyfin, pero Ubuntu Server 24.04 LTS suele ser la opción más práctica si estás empezando. Docker ofrece documentación oficial para Ubuntu y muchas guías se basan directamente en esta distribución. Debian también es muy estable, pero con Ubuntu evitarás algunos problemas iniciales.
Si tu colección multimedia crece rápidamente, puede ser útil utilizar almacenamiento adicional. Para empezar, lo más recomendable es usar almacenamiento local en SSD o NVMe dentro del servidor. También puedes integrar almacenamiento externo, como Object Storage (almacenamiento de objetos), pero primero tendrás que montarlo como sistema de archivos mediante una herramienta adecuada.
Ten en cuenta que Jellyfin accede directamente a los archivos del sistema de archivos y no admite Object Storage como origen de almacenamiento nativo. Como alternativa, puedes usar Object Storage como archivo para contenidos más antiguos que no necesiten estar disponibles de forma permanente.
Paso a paso: instalar Jellyfin con Docker en Ubuntu Server
En el siguiente ejemplo te mostramos cómo instalar Jellyfin en Ubuntu Server 24.04 LTS con Docker Engine y el plugin Docker Compose. Esta opción resulta especialmente adecuada para principiantes, ya que Docker encapsula la aplicación y facilita las actualizaciones posteriores.
Paso 1: actualizar el servidor Ubuntu
Conéctate a tu servidor mediante SSH y, en primer lugar, actualiza las listas de paquetes y el sistema:
sudo apt update
sudo apt upgrade -ybashA continuación, reinicia el servidor si es necesario (después tendrás que volver a iniciar sesión):
sudo rebootbashEste paso es importante para comenzar con un sistema actualizado, con los últimos parches de seguridad y una base estable. Especialmente en un servidor Ubuntu recién desplegado, es una buena práctica realizar esta actualización inicial.
Paso 2: instalar Docker en Ubuntu 24.04
En el siguiente paso debes instalar Docker en Ubuntu 24.04. Para ello, se recomienda configurar el repositorio oficial de APT. Primero elimina paquetes antiguos o potencialmente conflictivos:
sudo apt remove docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc -ybashA continuación, configura el repositorio oficial de Docker:
sudo apt update
sudo apt install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt updatebashDespués, instala Docker Engine, Buildx y el plugin Compose con el siguiente comando:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -ybashA continuación, comprueba si Docker está en ejecución:
sudo systemctl status dockerbashEl estado debería mostrarse como active (running):

Por último, puedes verificar la instalación con el contenedor de prueba oficial:
sudo docker run hello-worldbashLa salida debería tener el siguiente aspecto:

Paso 3: usar Docker sin sudo
De forma predeterminada, los comandos de Docker deben ejecutarse con sudo. Si lo prefieres, puedes añadir tu usuario al grupo docker para evitarlo:
sudo usermod -aG docker $USER
newgrp dockerbashLa documentación de Docker indica que los miembros del grupo docker obtienen permisos equivalentes a los de root. En un servidor personal esto es habitual, pero debes tener en cuenta que, en entornos donde otros usuarios tengan acceso, puede suponer un riesgo de seguridad.
Paso 4: crear la estructura de directorios para Jellyfin
Una vez terminados los preparativos, puedes crear la estructura de directorios para tu servidor de Jellyfin. Esto te permitirá separar correctamente la configuración, la caché y los contenidos multimedia. Por ejemplo, puedes utilizar la siguiente estructura (aunque puedes adaptarla según tus necesidades):
mkdir -p ~/jellyfin/config
mkdir -p ~/jellyfin/cache
mkdir -p ~/media/peliculas
mkdir -p ~/media/series
mkdir -p ~/media/musica
mkdir -p ~/media/fotosbashLa carpeta config almacenará la configuración del servidor, los usuarios y la base de datos. La carpeta cache se utiliza para datos temporales. Los archivos multimedia se organizan en carpetas de biblioteca independientes.
Paso 5: determinar la UID y la GID del usuario
Jellyfin puede ejecutarse en el contenedor utilizando el ID de usuario y el ID de grupo de tu usuario en Linux. Esto facilita la gestión de los permisos de archivos. Para obtener estos valores, ejecuta el siguiente comando:
idbashAnota los valores de UID y GID que se muestran, ya que los necesitarás más adelante en el archivo Compose.
Paso 6: crear el archivo Docker Compose para Jellyfin
Cambia al directorio de trabajo y crea un archivo llamado docker-compose.yml. En este ejemplo usamos el editor de texto nano, aunque puedes utilizar cualquier otro editor:
mkdir -p ~/jellyfin
cd ~/jellyfin
nano docker-compose.ymlbashIntroduce el siguiente contenido en el archivo:
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: "1000:1000"
ports:
- "8096:8096/tcp"
- "7359:7359/udp"
volumes:
- ./config:/config
- ./cache:/cache
- type: bind
source: /home/TU_USUARIO/media/peliculas
target: /media/peliculas
read_only: true
- type: bind
source: /home/TU_USUARIO/media/series
target: /media/series
read_only: true
- type: bind
source: /home/TU_USUARIO/media/musica
target: /media/musica
read_only: true
- type: bind
source: /home/TU_USUARIO/media/fotos
target: /media/fotos
read_only: true
environment:
- JELLYFIN_PublishedServerUrl=http://TU_IP_SERVIDOR:8096
restart: unless-stoppedyamlA continuación, sustituye los siguientes valores en el archivo:
- el valor
1000:1000por tu UID:GID real, que has obtenido en el paso anterior TU_USUARIOpor tu nombre de usuario de LinuxTU_IP_SERVIDORpor la dirección IP de tu servidor
Las carpetas de medios están aquí configuradas con read_only: true. Esto significa que Jellyfin puede leer los archivos, pero no modificarlos. Para un servidor Jellyfin personal, esta configuración es más segura y suficiente en la mayoría de los casos.
Paso 7: iniciar el contenedor de Jellyfin
Ahora puedes iniciar el contenedor en segundo plano con Docker Compose:
sudo docker compose up -dbashA continuación, comprueba si el contenedor está en ejecución:
sudo docker compose psbash
Paso 8: abrir Jellyfin en el navegador
Abre en tu navegador la dirección de tu servidor con el puerto predeterminado de Jellyfin:
http://SERVER-IP:8096Se iniciará automáticamente el asistente de configuración en el navegador.
Si utilizas un servidor de IONOS, primero tendrás que configurar el cortafuegos para permitir conexiones TCP a través del puerto 8096.
Paso 9: configuración inicial en el asistente de Jellyfin
En el navegador, Jellyfin te guía a través de la configuración básica. Primero, selecciona el idioma y crea una cuenta de administrador con una contraseña segura. A continuación, configura tus bibliotecas: elige, por ejemplo, “Películas”, “Series”, “Música” o “Fotos” e indica en cada caso los directorios montados en el contenedor, es decir, en este ejemplo /media/peliculas o /media/series. Después, Jellyfin descargará metadatos, carátulas y otra información adicional, siempre que el servidor tenga acceso a Internet.

Paso 10: organizar correctamente tus archivos multimedia
Para que Jellyfin reconozca correctamente tus archivos, es importante mantener una estructura clara y coherente. Para las películas, conviene utilizar una carpeta independiente por título; para las series, organizar el contenido por temporadas. En el caso de la música, es especialmente importante contar con etiquetas (tags) bien definidas.
Cuanto más ordenada sea la estructura de carpetas, menos trabajo manual necesitarás después para ajustar metadatos y asociaciones. Aunque no es un requisito técnico obligatorio, en la práctica marca una gran diferencia.
Ten en cuenta también los siguientes consejos de seguridad para tu servidor de Jellyfin:
- Usa HTTPS: si haces accesible Jellyfin desde Internet, es imprescindible proteger el acceso mediante HTTPS. La forma más sencilla es utilizar un proxy inverso con un certificado TLS gratuito.
- Evita el acceso directo desde Internet: no abras directamente el puerto de Jellyfin en el router. En su lugar, utiliza un proxy inverso o una VPN.
- Utiliza contraseñas seguras: configura una contraseña segura para la cuenta de administrador y crea cuentas independientes para otros usuarios.
- Actualiza el sistema con regularidad: mantén Ubuntu, Docker y la imagen de Jellyfin actualizados mediante revisiones periódicas.
- Monta los directorios de medios en modo de solo lectura: si utilizas Docker, es recomendable montar las carpetas de medios en modo solo lectura (
read_only) para evitar modificaciones accidentales en tus archivos.
Conectar Jellyfin con un dominio
Para acceder a tu servidor de Jellyfin a través de un dominio como jellyfin.tudominio.es, necesitas lo siguiente:
- Un dominio o subdominio
- Un registro DNS que apunte a la IP pública de tu servidor
- Un proxy inverso con HTTPS (por ejemplo, Caddy, que es una opción recomendada por Jellyfin)
Paso 1: crear el registro DNS para el subdominio
Crea en tu proveedor de dominio un registro A, por ejemplo:
jellyfin.tudominio.es -> TU_IP_PUBLICASi utilizas IPv6, crea también un registro AAAA. Para que el HTTPS automático con Caddy funcione correctamente, el registro DNS debe apuntar ya a tu servidor.
Para que tu servidor de Jellyfin sea accesible mediante HTTPS, asegúrate de que los puertos 80 (HTTP) y 443 (HTTPS) estén abiertos en el servidor o en el cortafuegos. El proxy inverso utiliza estos puertos para gestionar las solicitudes web y emitir certificados TLS.
Paso 2: instalar Caddy
Jellyfin recomienda utilizar Caddy por su configuración sencilla de HTTPS. En Ubuntu, puedes instalarlo a través del repositorio oficial con los siguientes comandos:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy -ybashTras la instalación, Caddy se inicia automáticamente como servicio del sistema.
Paso 3: configurar Caddy
En el siguiente paso, edita la configuración de Caddy. En este ejemplo utilizamos nano, aunque puedes emplear cualquier editor de texto:
sudo nano /etc/caddy/CaddyfilebashIntroduce la siguiente configuración:
jellyfin.tudominio.es {
reverse_proxy 127.0.0.1:8096
}Guarda el archivo y comprueba que la configuración es válida:
sudo caddy validate --config /etc/caddy/CaddyfilebashSi no se muestran errores, recarga el servicio:
sudo systemctl reload caddybashPaso 4: limitar Jellyfin al acceso local
Una vez que el dominio funcione correctamente, es recomendable ajustar el archivo docker-compose.yml para que Jellyfin no esté expuesto directamente en el puerto 8096.
Para ello, abre de nuevo ~/jellyfin/docker-compose.yml y modifica la configuración de puertos:
ports:
- "127.0.0.1:8096:8096/tcp"
- "7359:7359/udp"yamlA continuación, reinicia el contenedor:
sudo docker compose up -dbashDe este modo, la interfaz web solo será accesible desde el propio servidor, mientras que Caddy gestionará el acceso externo de forma segura.
Por último, añade el proxy como Known Proxy en la configuración de red de Jellyfin. Así, Jellyfin podrá procesar correctamente las cabeceras HTTP enviadas por el proxy. Encontrarás este ajuste en la interfaz web en “Dashboard” → “Networking” → “Known Proxies”.

