Jellyfin, el Media Center del Open Source

Por estos días el sitio se ha dedicado a brindar soluciones de streaming de multimedia. Hoy toca el turno a un proyecto que me he seguido de cerca desde que saliera. Se trata del «Netflix» del Open Source, Jellyfin.

1-¿Qué es Jellyfin?

Al llegar Emby a la versión 3.6 y decidió cerrar el código, pasando a ser privativo. Un equipo de desarrolladores, decidió hacer un Fork de la versión 3.5.2 de Emby para crear una alternativa 100% Software Libre y totalmente gratuita a Plex y Emby. Con esto, nace Jellyfin. Jellyfin es un servidor multimedia donde podremos tener todas nuestras películas, series, música, libros, todos organizados y centralizados en un único lugar.

El punto fuerte de Jellyfin, no solo es que sea 100% Software Libre y gratuito, sino que tenemos la total garantía que todo nuestro contenido Multimedia, así como nuestras fotos o vídeos domésticos, mantienen la total privacidad, ya que nuestro servidor de Jellyfin, en ningún caso se conectará a servidores de terceros del mismo modo que lo hace Plex o Emby.

El servidor podemos instalarlo en todo tipo de Sistemas Operativos, ya que es totalmente multiplataforma. Windows, Linux, Mac. Actualmente hay clientes disponibles para Jellyfin en Android, Android TV, Amazón Fire TV o Kodi. También podemos utilizar la versión web, mediante un navegador web, DLNA, Chromecast, Roku. El equipo de Jellyfin, está abierto como todo proyecto de Software Libre, a la colaboración para el resto de dispositivos y Sistemas Operativos, como IOS, entre otros.

El servidor actualmente se siente muchísimo más rápido y ligero que Emby y esto es debido, entre muchas otras, a que están optimizando la interfaz web, que ya es independiente del propio servidor.

2-Instalación y configuración de Jellyfin

Requisitos de la VM para el presente tutorial:

  • Sistema Operativo: Debian 10 (Buster)
  • CPU: 4 cores
  • M. RAM: 4GB
  • Disco de 32GB para los temporales de la transcodificación.
  • Disco de volumen redimensionable para los datos multimedia.

Actualizamos el sistema con los repos mas actualizados que se tengan:

Creamos un directorio para albergar los medios audio-visuales en Jellyfin y sus permisos:

Dedicaremos un disco con un volumen lógico que se utilizará para montar el directorio “/mnt/jellyfin”. A continuación, se muestra la información del volumen (una vez realizadas las configuraciones), después de correr el comando “lsblk”:

Creamos un directorio para los instaladores de Jellyfin y accedemos a este:

Descargamos las versiones mas recientes y estables de los paquetes necesarios para su instalación:

Procedemos con la instalación de los paquetes:

Esto terminara en error por falta de dependencias. Para solucionarlo, corremos el siguiente comando, que instalara las dependencias faltantes y seguidamente los paquetes anteriores.

Hasta este punto contamos con un servidor medios basado en Jellyfin totalmente funcional, al cual se puede acceder mediante el enlace:

http://jellyfin.empresa.midominio.cu:8096

Nos recibe el “Wizard” de Jellyfin para ayudarnos con las configuraciones iniciales. Comenzamos especificando el idioma:

Creamos la cuenta de administración de Jellyfin:

Ahora podremos agregar los medios visuales, dando click en «Añadir biblioteca de medios»:

Los medios soportados por Jellyfin son los siguientes:

Para este ejemplo, comenzaremos agregando películas:

Realizado lo anterior, estamos en condiciones de avanzar y dar click en el botón “+”, para agregar una carpeta de medios a Jellyfin:

A continuación, agregamos el idioma con el que se descargaran las reseñas, los subtítulos y demás extras para el medio (requiere conexión a internet para ello). Las demás opciones las dejamos por defecto, ya que, así como están permiten el funcionamiento del servicio:

Una vez agregado correctamente el contenido, debería mostrarse así:

Al continuar, nos pedirá el idioma de las etiquetas y en este caso especificaremos el inglés, ya que, por lo general, los buenos filmes son anglosajones y las etiquetas para identificarlos mejor será con su propio idioma.

Deshabilitamos o habilitar todas las conexiones remotas al servidor Jellyfin dependerá de cada cual. En este caso lo dejamos por defecto:

Llegado aquí, ya tenemos toda la configuración lista.

Nos autenticamos con el usuario de administración creado:

SI nuestra carpeta de medios no tenía ninguna película, pues Jellyfin no podrá indexar nada y se visualizaría solamente como se muestra, a continuación:

Un servidor de medios audio-visuales no es nadie sin ellos, así que le agregamos contenido desde nuestro disco externo (en este caso) usando la herramienta WinSCP (muy cómoda para las transferencias Windows-Linux):

Una vez indexados los metadatos (esperar al 100%), nuestro servidor de medios nos mostrará el contenido agregado al servidor.

Una vista desde dentro de una película:

Otra vista con varios medios agregados:

A continuación, se muestra la estructura seguida para algunos de los medios indexados en el servidor Jellyfin:

3-Nginx como proxy inverso

Se configurará Nginx como proxy inverso, redireccionando las peticiones HTTP hacia HTTPS y especificando solo el nombre del servidor web.

Instalamos Nginx:

A continuación, generaremos los certificados SSL auto-firmados con OpenSSL:

Respondemos según convenga:

Ambos archivos que se crearon fueron ubicados en los subdirectorios apropiados de “/etc/ssl”.
Como estamos usando OpenSSL, deberíamos también crear un grupo fuerte de Diffie-Hellman (DH), el cual es usado en la negociación Perfect Forward Secrecy (PFS) con los clientes:

Primero creamos un nuevo fragmento de configuración de Nginx en el directorio “/etc/nginx/snippets”.

Para distinguir apropiadamente el propósito de este fichero, le llamaremos “self-signed.conf”:

Dentro de este fichero, necesitamos establecer la directiva “ssl_certificate” a nuestro certificado y la directive “ssl_certificate_key” a la llave asociada. En nuestro caso, esto lucirá así:

Editamos el siguiente fichero para aumentar la seguridad de encriptación:

Agregamos lo siguiente, adaptando a su red:

Creamos el bloque de configuración de Nginx para Jellyfin:

Agregamos lo siguiente:

Verificamos que la configuración no tenga errores de sintaxis:

Si todo está bien, debe devolvernos lo siguiente:

Esta configuración en particular arroja una advertencia ya que nuestro certificado auto-firmado no puede usar el engrapado SSL. Esto se espera y nuestro servidor aún puede cifrar las conexiones correctamente, por lo que obviamos la advertencia.

Reiniciamos el servicio:

El servidor web Nginx está funcionando ahora como proxy inverso, para el servicio de Jellyfin en el puerto 80, redireccionando y asegurando la conexión por HTTPS 443, a través del siguiente enlace:

http://jellyfin.empresa.midominio.cu

4-JelLDAP. Autenticacion por LDAP para Jellyfin

Si nuestro servidor Jellyfin tiene salida a internet, basta con ir al «Panel de Control > Extensiones > Catálogo» e instalar el plugin “LDAP Authentication”:

Instalamos la versión 9.0.0.0, ya que la 10.0.0.0 no se instalaba en la versión de Jellyfin usada en este tutorial:

Reiniciamos el servicio de Jellyfin para terminar la instalación:

En caso que usted no cuente con conexión a internet en su servidor y no puede instalar el plugin por los repos oficiales de Jellyfin, puede bajar el plugin del siguiente enlace:

Una vez suba el plugin al servidor, debe ubicarlo en el directorio “/var/lib/jellyfin/plugins” (que no existe por defecto, pero que se crea tras habilitar/deshabilitar alguno de los plugins por defecto desde la web).

Luego se le debería dar los permisos necesarios:

Reiniciamos el servicio de Jellyfin para terminar la instalación:

4.1-Configuraciones necesarias en el ADDC

Para un ADDC en Samba4, correr los siguientes comandos, adaptando a su red:

Creamos el grupo «JellyfinUsers»:

Agregamos un usuario al grupo creado anteriormente:

Con esto, ya contamos con el grupo de Jellyfin y con un usuario como miembro del mismo.

4.2-Configuraciones del plugin “LDAP-Auth”

El plugin no funciona completamente bien, pues al autenticar que el usuario existe en el ADDC y la contraseña ingresada coincide, debería crear un usuario en Jellyfin con el mismo “uid” del ADDC, si se trata del primer login en el servidor (debe estar habilitada la opción en la configuración del plugin). Por eso, en este tutorial se va a optar por autenticar usuarios del ADDC, siempre y cuando sus cuentas hayan sido creadas previamente en el Jellyfin, especificando que la contraseña se verificará por LDAP.

Creamos un usuario del ADDC y especificamos el tipo de autenticación:

Nos desplazamos a “Panel de Control > Extensiones” y seleccionamos el plugin “LDAP-Auth”. Procedemos a configurarlo.

Inicialmente nos pide el servidor LDAP (o Directorio Activo):

En este caso usaremos LDAP sin cifrado (comunicación por defecto en texto plano entre el servidor LDAP y el Jellyfin):

Especificamos la raíz del nuestro árbol del directorio:

Como trabajaremos sin cifrado, especificamos el puerto por defecto de LDAP:

Los atributos que nos permitirán autenticarnos, cuando se nos pida el nombre de usuario. No puede faltar “sAMAccountName”, cuando se trata del LDAP de un Samba4 o Directorio Activo de Windows:

Similar a la lista anterior, pero es exige que se confirme que el atributo que identifica al usuario en el ADDC:

Filtro para encontrar los usuarios que pertenecen al grupo “JellyfinUsers”:

Esto se deja por defecto:

Especificamos la ruta del usuario que encuestara al LDAP para validar las autenticaciones de los usuarios de Jellyfin:

Especificamos la contraseña del usuario anterior, si no está permitida la exploración anónima del directorio:

Deshabilitamos la opción de creación del usuario en el primer login, que ya se explicó anteriormente, que no funciona correctamente en esta versión:

Luego de guardar los cambios, se requiere reiniciar el servicio de Jellyfin para que las configuraciones surtan efecto.

Si nos intentamos autenticar con un usuario que no pertenece al grupo “JellyfinUsers”, y tenga o no tenga una previamente creada en Jellyfin, saldrá el siguiente error tras intentar autenticarse:

Si nos intentamos autenticar con un usuario que pertenece al grupo “JellyfinUsers”, pero que no tiene una previamente creada en Jellyfin, saldrá el siguiente error tras intentar autenticarse:

Si nos autenticamos con un usuario que pertenezca al grupo de Jellyfin y tiene una cuenta previamente creada, pues éste accederá correctamente al servidor de medios audiovisuales.

5-Ajustes en los temporales de la transcodificación

Durante las pruebas realizadas, como resultado de la reproducción de contenido HD por varios usuarios simultáneamente, el directorio de los temporales de la transcodificación (/var/lib/jellyfin/transcodes) tuvo un crecimiento desproporcionado muy acelerado. Una vez que se llena la partición «/var» que contiene a dicho directorio, el servicio se detiene y puede provocar inestabilidad en el sistema.

Lo recomendable sería tener como espacio para los transcodes, aproximadamente el peso promedio de lo que normalmente se reproduce, multiplicado por el promedio de la cantidad de usuarios que normalmente tiene el servidor. Esta solución implicaría agregar un considerable espacio al servidor.

A continuación, proponemos una vía de solución más económica en cuanto a recursos hardware:

  • Agregar un disco de 32 GB exclusivamente para estos temporales y otros ficheros de reproducción de Jellyfin y montar el nuevo disco montado en «/jellyfin».
  • Crear un script que encueste el % de espacio de la particion «/jellyfin» y que borre los temporales «*.ts» (MPEG Transport Stream) que se crean tras reproducir contenido por web, una vez sea mayor al 70%.
  • Configurar una tarea en el cron que automatice la ejecución dell script cada cierto tiempo (lo pondremos que se ejecute cada 1 min).
  • Configurar el servidor para los nuevos cambios de directorios.

Identificamos el nuevo disco que servirá para albergar la información de multimedia:

El nuevo disco se reconoce con la etiqueta «sdb». Procedemos a darle formato «ext4»:

Creamos el nuevo directorio “/jellyfin”:

Editamos “/etc/fstab” y agregamos el nuevo punto de montaje fijo:

Agregamos lo siguiente:

Aplicamos los cambios:

Verificamos los puntos de montaje:

Entre los resultados, nos fijamos en este que nos interesa:

Creamos los nuevos directorios para los temporales de la transcodificacion y aprovechamos también el de los metadatos:

Vamos a la web de Jellyfin y nos autenticamos como administrador. Luego vamos a “Panel de Control > Reproducción”, habilitamos o no la aceleración por Hardware, tanto para la codificación como para decodificación (es su elección). Cambiamos la ruta de transcodificación a «/jellyfin/transcodes» y guardamos:

Luego vamos a “Panel de Control > General”, cambiamos la ruta de metadatos a «/jellyfin/metadata» y guardamos:

Creamos un directorio para scripts:

Editamos el fichero del script:

Agregamos lo siguiente:

Damos permisos de ejecución:

Creamos una tarea en el cron que se ejecute cada 1 min:

Agregamos lo siguiente:

Reiniciamos el cron:

Referencias Bibliográficas

  1. https://jellyfin.org/docs/. “Documentación oficial de Jellyfin”.
  2. https://ugeek.github.io/blog/post/2019-05-07-el-adios-a-plex-y-emby.-llega-jellyfin.html. “El Adiós a Plex y Emby. Llega Jellyfin”. Mayo, 2019. Ángel.
  3. https://en.wikipedia.org/wiki/Jellyfin. “Wikipedia”.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4.8 / 5. Recuento de votos: 15

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sobre Franco Diaz Hurtado 27 artículos
Ing. Telecomunicaciones y Electrónica; 1er Especialista en Redes de ECASA Nivel Central

6 comentarios

  1. Firefox 81.0 Firefox 81.0 Ubuntu x64 Ubuntu x64
    Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0

    Hola, funciona solamente en VM o pude ser instalado en container lxc???

  2. Firefox 84.0 Firefox 84.0 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0

    Hola Eduardo. Puedes montarlo donde quieras.

  3. Firefox 85.0 Firefox 85.0 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0

    Una pregunta no configuraste por algun lado del proxy inverso en el nginx el ProxyPass /socket pq resuelta que en los log estoy viendo este error ahora mismo y veo que no está puesto en el ejemplo que tenias.

    [ERR] Could not find handler for «/socket»

  4. Google Chrome 93.0.4577.82 Google Chrome 93.0.4577.82 GNU/Linux x64 GNU/Linux x64
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36

    Exelente tuto , en mi caso estoy teniendo problemas para installar en windows 7

  5. Google Chrome 90.0.4430.212 Google Chrome 90.0.4430.212 GNU/Linux x64 GNU/Linux x64
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36

    en mi caso, no puedo agregar una boblioteca que se encuentra en otra particion que es de windows 10, y mi sistema es debian 11

  6. Google Chrome 95.0.4638.69 Google Chrome 95.0.4638.69 GNU/Linux x64 GNU/Linux x64
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36

    Socio buen tuto…

    Que se podria hacer cuando, no se visualiza el preview cuando reproduces una pelicula?

    Saludos.

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.