Hasta ahora hemos hecho en los 15 tutoriales anteriores un montón de instalaciones diferentes, todas ellas usando Docker Compose y siguiendo la misma metodología.
Una de las que hemos hecho es la instalación de un servidor de Plex, que nos servía para poder disfrutar de nuestro contenido multimedia en cualquier dispositivo de nuestro hogar (televisión, móvil, tablet, etc…). Pero además nos permitía acceder a nuestra biblioteca desde fuera (desde cualquier dispositivo conectado a internet) e incluso compartir determinados contenidos con amigos y familiares.
Sin embargo durante ese artículo hemos dejado muy claro que el servicio siempre depende de los servidores de Plex, por lo que si algún día bajan la persiana nos quedaríamos sin poder disfrutar de su servicio. Lo mismo pasaría si el gobierno de turno de nuestro país decide por el motivo que sea que no se pueda acceder a este servicio (cosa que no me soprendería en absoluto viendo el historial de leyes «analógicas» que han hecho los diferentes gobiernos en españa»)
Bueno... que cierren el chiringuito puede pasar con cualquier servicio. Que se lo digan a los que eran felices con Google Stadia o Picasa.
Por supuesto. Pero ¿A que molaría que el servicio colgara directamente de tu raspberry sin depender de terceros? Evidentemente Plex depende de la página web de plex, de la que no tenemos ningún control, pero nosotros ya hemos aprendido a colgar servicios de nuestro propio dominio. A lo mejor podemos hacer algo similar a plex pero sin depender de servicios externos.
Ya, pero si Plex no lo permite no hay nada que hacer.
Sí que hay algo que hacer. Podemos usar otro sistema completamente distinto, que esté 100% basado en software libre y que nunca vaya a depender de terceros para que funcione. Este sistema existe, se llama Jellyfin y podemos montarlo también en nuestra raspberry.
Pero ya tengo montado el Plex con todo perfectamente configurado. Tener que desinstalar todo para instalar Jellyfin es un rollo.
No tienes que desinstalar nada. Los dos sistemas pueden convivir en tu pequeño servidor si así lo deseas. De hecho puedes incluso tener algunas cosas en un sistema y otras en el otro (que tengan contenidos compartidos diferentes). Eso lo puedes gestionar como veas conveniente.
En este tutorial abordaremos la instalación de Jellyfin usando docker compose, y ya que estamos vamos a indicar cómo podemos cambiar la ruta de los volumenes que le vamos a asignar, en el caso de que queramos que Jellyfin y Plex compartan su contenido.
1- Creamos la estructura de la carpeta «docker».
En todos los artículos anteriores hemos puesto cada uno de los contenedores que hemos desplegado dentro de una carpeta situada en nuestra carpeta home
. La ruta que hemos empleado ha sido ésta.
/home/<tu_usuario>/docker
En caso de que no la tengas creada, te invito a crearla usando este comando desde la carpeta «home
» de tu usuario.
sudo mkdir docker
Vamos a meternos dentro de esa carpeta y ahí dentro vamos a crear otra carpeta llamada «jellyfin» en la que almacenaremos todo lo que la instalación de Jellyfin va a necesitar. Lo haremos con los siguientes comandos.
mkdir jellyfin
cd jellyfin
Este conenedor va a necesitar tres carpetas para almacenar sus datos. Las carpetas se llamarán «config», «media» y «cache». Así que dentro de esa carpeta, vamos a crear la estructura que va a necesitar jellyfin para funcionar. La haremos con el siguiente comando.
mkdir config && mkdir media && mkdir cache
2- Creamos el archivo de configuración de Jellyfin.
Como siempre, dentro de la carpeta /home/<tu_usuario>/docker/jellyfin, vamos a necesitar crear un archivo llamado docker-compose.yml que nos permitirá iniciar la instalación de Jellyfin. Lo crearemos con el siguiente comando.
sudo nano docker-compose.yml
Dentro de ese archivo vamos a poner el siguiente código, sin modificar ni una coma.
version: "3.9"
networks:
default:
driver: bridge
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
networks:
- default
user: 1000:1000
# devices:
# - /dev/dri:/dev/dri # for hardware transcoding
ports:
- "8096:8096" # HTTP Port
# - "8920:8920" # Requires valid certificates.
volumes:
- $DOCKERDIR/jellyfin/config:/config
- $DOCKERDIR/jellyfin/cache:/cache
- $DOCKERDIR/jellyfin/media:/data/media
- /dev/shm:/data/transcode
Como siempre, teclearemos Control+O
para guardar cambios y luego Control+X
para salir del editor de texto.
Oye... ¿Y esa línea comentada que pone "for hardware transcoding" para qué sirve? Tiene buena pinta. ¿La descomento?
Jellyfin, al igual que Plex, permite adaptar la calidad de las retransmisiones desde el propio servidor. Mola mucho, pero para hacer esto se necesita un equipo que permita codificar al vuelo los vídeos mientras se retransmiten, cosa que una simple raspberry no es capaz de hacer.
Si la instalación de Jellyfin la estáis haciendo en un ordenador con una tarjeta gráfica dedicada y más potencia de proceso, entonces sí que os puede interesar activar esta opción. Para activarla sólo debéis borrar las almohadillas de las dos líneas del medio del archivo, para dejarlas así.
devices:
- /dev/dri:/dev/dri # for hardware transcoding
Si no tenéis un equipo capaz de hacer estas filigranas (por ejemplo, si usáis una Raspberry para alojar Jellyfin, o si usáis un equipo virtualizado dentro de un VMWare o Proxmox), os recomiendo dejar esas dos líneas tal cual están, con las almohadillas delante.
Oye... ¿Y si tengo Plex y Jellyfin instalados a la vez y quiero que ambos apunten a la misma carpeta de vídeos?
Pues muy sencillo. Modificaríamos los volúmenes del docker-compose.yml de uno de ellos para que apunten a la carpeta del otro (vamos, que los dos deben apuntar al mismo directorio de películas).
Por ejemplo, si he desplegado el plex siguiendo el tutorial que vimos en su momento pero quiero que Jellyfin use los mismos archivos, tendría que modificar la zona de volumenes del archivo de configuración del docker compose. Así que en lugar de poner ésto.
- $DOCKERDIR/jellyfin/media:/data/media
Deberíamos poner ésto otro:
- $DOCKERDIR/plex/movies:/data/media
De esta forma, cada vez que añadamos un archivo a esa carpeta, el archivo lo procesarán a la vez tanto Jellyfin como Plex y podremos disfrutarlo en ambas plataformas.
3- Creamos el archivo oculto «.env» y lo securizamos.
Como siempre, crearemos el archivo oculto .env
en el que pondremos algunas variables fundamentales para que nuestro Jellyfin se pueda desplegar correctamente. Vamos a crear el archivo con el comando…
sudo nano .env
… y vamos a ponerle el siguiente contenido (recordad que aquí sí que hay que modificar algunas cosas).
DOCKERDIR=/home/<tu_usuario>/docker
TZ="Europe/Madrid"
En la primera línea debemos poner la ruta entera hacia la carpeta docker
de nuestro servidor (Con rellenar la zona de <tu_usuario> por el usuario correcto ya nos serviría). En la segunda línea debemos poner la zona mundial en la que va a estar alojado el servidor. Acordaos de teclear Control+O
para guardar cambios y Control+X
para salir del editor «nano».
Por supuesto no os olvidéis de securizar este archivo para que no pueda entrar nadie a hacernos maldades. Para ello debemos teclear el siguiente comando:
sudo chmod 600 .env
Con esto tenemos nuestro Jellyfin a punto de caramelo para ser desplegado.
4) Instalación de Jellyfin.
Desplegarlo es muy sencillo y seguro que ya sabéis cómo hacerlo. Simplemente debemos teclear el siguiente comando.
sudo docker-compose -p "jellyfin" up -d
Después de un ratito, la instalación de Jellyfin se habrá realizado correctamente y estará listo para su uso.
5) Primer acceso y configuración de la interfaz.
Ahora que ya lo tenemos instalado, podemos acceder a nuestro recién instalado Jellyfin desde la siguiente dirección.
http://ip.de.la.raspberry:8096
Evidentemente tienes que cambiar <ip.de.la.raspberry> por la dirección ip local que tiene tu pequeño servidor.
Uy, pero esa ip local sólo está disponible dentro de mi red. Si me voy a casa de un amigo ¿No voy a poder ver el contenido de mi Jellyfin?
No te adelantes en el tutorial, Usuario Anónimo. Para acceder al Jellyfin desde fuera, al igual que hemos hecho en los últimos artículos, vamos a tener que configurar nuestro proxy. Pero eso aún lo vamos a ver en el punto 6. De momento céntrate en configurar correctamente el sistema.
Como os decía, una vez realizada la instalación de Jellyfin, entrad en esa dirección web. La primera pantalla que os puede aparecer es la siguiente:
A mi no me sale eso.
Ya lo sé. Esto que os acabo de poner no sale siempre. Seguramente os aparezca si habéis hecho varios intentos de configuración de Jellyfin o tenéis varias instalaciones simultáneas de Jellyfin. En el caso de que os salga, lo más sencillo es pulsar en el botón «Añadir Servidor» y luego en el campo «host» tendréis que poner algo como esto:
<ip.de.tu.raspberry>:8096
Debería quedaros algo tal que así.
Luego pulsaremos en el botón «Conectar» y ya tendremos la pantalla de bienvenida al sistema.
Al pulsar el botón «Siguiente» debemos poner credenciales para entrar de forma segura en nuestro Jellyfin. Recordad: Poned una contraseña segura que no hayáis usado en ningún otro sitio. La gran mayoría de los ataques hoy en día vienen por reutilizar las mismas contraseñas en distintos sitios. Sed seguros.
Ahora toca añadir bibliotecas a nuestra instalación. Pulsamos en el botón «Añadir biblioteca de medios».
Ya añadimos nuestra primera carpeta. ¿Os acirdáis que cuando creamos nuestro docker-compose.yml
teníamos una línea tal que así?
- $DOCKERDIR/jellyfin/media:/data/media
Esa línea indicaba la ruta en la que íbamos a dejar nuestros archivos de vídeo en Jellyfin. Debemos poner en el interfaz, en el campo «carpetas» la ruta que aparece en la parte derecha de la línea (porque la parte izquierda es la ruta en nuestra raspberry).
¿Y si quiero añadir más carpetas de cosas diferentes?
Pues después de configurar todo lo que vamos a indicar en el artículo, si quieres puedes modificar el archivo docker-compose.yml
. Debes buscar los volúmenes que hemos configurado por defecto y debajo de esas líneas deberías añadir líneas similares. Algo como esto.
- $DOCKERDIR/jellyfin/fotos:/data/series- $DOCKERDIR/jellyfin/series:/data/fotos
Por supuesto, deberíais crear a mano esas carpetas (en el ejemplo, las carpetas «series» y «fotos») en el mismo sitio dónde está el archivo docker-compose.yml. Luego podríais parar el contenedor y volverlo a generar con los comandos:
sudo docker-compose down
sudo docker-compose up -d
Y una vez hecho esto, desde el interfaz de Jellyfin, deberías añadir las bibliotecas que has creado a mano (Recuerda… debes poner siempre la parte de la derecha de las líneas que has añadido al docker-compose.yml).
Pero voy a asumir que os llega la biblioteca por defecto, así que prosigamos con la configurando nuestra instalación de Jellyfin. Una vez añadida la biblioteca, vamos a activar las opciones de acceso remoto que se nos proponen.
Y una vez hecho esto ya tendríamos nuestro Jellyfin configurado.
¿Pero cómo añado contenido a Jellyfin?
Pues de la misma forma que lo hemos hecho con Plex. Para evitar tener que configurar carpetas compartidas, os recomiendo usar algún programa como «WinSCP«, «Filezilla» o «Cyberduck» para establecer una conexión SSH con vuestra raspberry y subir los archivos directamente por SSH a la carpeta /home/<tu_usuario>/docker/jellyfin/media. De esta forma evitamos abrir puertos peligrosos o que posibles virus en nuestro ordenador principal puedan acceder de alguna forma a los archivos que hemos subido y los encripten.
6) Configuración del proxy.
Tal y cómo os he indicado, este docker requiere configurar nuestro proxy para otorgar una URL pública a nuestro Jellyfin y así poder acceder desde internet a su contenido. No hay diferencias respecto a lo que ya hemos hecho en otras ocasiones. Pero no os preocupéis. Os lo vuelvo a explicar en un momento.
Si usáis Nginx Proxy Manager (que lo hemos instalado en el tutorial número 9 de esta misma serie) debéis ir a Hosts
y luego a Proxy Hosts
.
Luego, haremos click en Add Proxy Host.
Nos saldrá la pantalla que nos permitirá configurar nuestro proxy. Vamos a cubrir los campos con los siguientes datos:
- Domain Names: Pondremos la dirección web que le vamos a asignar a nuestro Jellyfin (un subdominio de nuestra propiedad. Algo así como
jellyfin.midominio.com
) - scheme: http
- Forward Hostname / IP: Aquí pondremos la ip local del host dónde hemos instalado el Jellyfin (la de nuestra raspberry si tenemos los dockers instalados en una raspberry). Algo así como 192.168.177.10
- Forward Port: 8096
Después de guardar los cambios vamos a pulsar sobre los tres puntos que hay a la derecha de la línea del proxy que acabamos de configurar y pulsaremos sobre la opción Edit
.
seleccionamos la pestaña SSL
, solicitamos un certificado SSL nuevo en el desplegable y activamos las opciones Force SSL
y HTTP/2 Support
. Por supuesto, al finalizar, pulsamos sobre la opción «Save».
Y con esto quedaría listo el proxy. Ahora podremos acceder a nuestro Jellyfin desde fuera de nuestra red usando la dirección web que hemos configurado.
Ahora también podremos configurar las aplicaciones específicas para los diferentes dispositivos (IOs, Android, etc…) que hay en las tiendas de aplicaciones de cada uno de ellos. Simplemente tened en cuenta que cuando nos pida el servidor al que queremos conectarnos, tenemos que darle la dirección web que hemos configurado en este paso.
7) Actualización de este contenedor.
Una vez más, este punto es exactamente igual que en todos los tutoriales anteriores. En caso de que Jellyfin sea el único contenedor que tenemos en el equipo, simplemente crearemos un ejecutable en nuestro sistema con este comando…
sudo nano actualizar.sh
… y en él, pondremos el siguiente contenido (acuérdate de modificar <tu_usuario> para que el script apunte a la ruta dónde se encuentra el archivo docker-compose.yml).
cd /home/<tu_usuario>/docker/jellyfin
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
Por supuesto, este archivo debemos hacerlo ejecutable con este otro comando:
sudo chmod +x actualizar.sh
En el momento que queramos actualizar el contenedor a su última versión, simplemente ejecutaríamos este comando desde la carpeta en la que hemos creado el archivo.
sudo ./actualizar.sh
Si hemos seguido todos los tutoriales hasta aquí, el comando sería más largo, porque primero actualizaríamos el sistema operativo del host y luego iríamos actualizando, uno a uno, cada uno de los contenedores que hemos instalado. El archivo actualizar.sh
en este caso sería así (De nuevo tendríamos que modificar todas las rutas que contienen el texto <tu_usuario> por las rutas correctas).
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove -y
sudo apt-get autoclean -y
cd /home/<tu_usuario>/docker/pihole
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/wireguard
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
sudo shutdown -r now
cd /home/<tu_usuario>/docker/amule
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
sudo shutdown -r now
cd /home/<tu_usuario>/docker/transmission
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/plex
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/navidrome
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/nextcloud
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/vikunja
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/calibre
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/vaultwarden
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/jellyfin
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
sudo shutdown -r now
Por supuesto, esto también lo podríamos ejecutar con el comando ./ejecutar.sh
.
Con esto ya tendríamos Jellyfin funcionando perfectamente en vuestro sistema. Ahora os toca a vosotros. ¿Preferís Plex, Jellyfin o tal vez algún otro sistema similar? ¿Habéis tenido algún problema para hacer todo lo que os indico? Estaré atento a vuestros comentarios.
Probé Jellyfin hace uno año y la verdad me dio muchos problemas, muchas películas me tiraban error, en otras se desfasaba el audio, en la TV no podía cambiar el color de los subtitulos, despues de eso habia ido con Plex, todo perfecto, pero en uno de mis TV, no se por que motivo al navegar por la interfaz, el TV se quedaba completamente colgado, lo tenia que desenchufar y volver a enchufar, actuelmente (desde hace poco mas de un año) vengo usando Embi, y la verdad que no tuve ningun problema, lo unico es de pago. pero me va perfecto
El problema de estos casos no es de Jellyfin, es de la propia TV. Validado empíricamente.