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:
apt update apt upgrade -y
Creamos un directorio para albergar los medios audio-visuales en Jellyfin y sus permisos:
mkdir /mnt/jellyfin mkdir /mnt/jellyfin/peliculas mkdir /mnt/jellyfin/series mkdir -p /mnt/jellyfin/musica/videoclips chmod -R 755 /mnt/jellyfin
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”:
# [...] sdb 8:16 0 32G 0 disk └─sdb1 8:17 0 32G 0 part └─vg2-lv4 254:0 0 32G 0 lvm /mnt/jellyfin # [...]
Creamos un directorio para los instaladores de Jellyfin y accedemos a este:
mkdir /opt/jellyfin cd /opt/jellyfin
Descargamos las versiones mas recientes y estables de los paquetes necesarios para su instalación:
wget --no-check-certificate https://tor1.mirror.jellyfin.org/releases/server/debian/versions/stable/server/10.7.0~rc2/jellyfin-server_10.6.4-1_amd64.deb wget --no-check-certificate https://tor1.mirror.jellyfin.org/releases/server/debian/versions/jellyfin-ffmpeg/4.3.1-3/jellyfin-ffmpeg_4.3.1-3-buster_amd64.deb wget --no-check-certificate https://tor1.mirror.jellyfin.org/releases/server/debian/versions/stable/web/10.7.0~rc2/jellyfin-web_10.6.4-1_all.deb wget --no-check-certificate https://tor1.mirror.jellyfin.org/releases/server/debian/versions/stable/meta/10.7.0~rc2/jellyfin_10.6.4-1_all.deb
Procedemos con la instalación de los paquetes:
dpkg -i jellyfin-server*.deb jellyfin-web*.deb jellyfin_*.deb jellyfin-ffmpeg_*.deb
Esto terminara en error por falta de dependencias. Para solucionarlo, corremos el siguiente comando, que instalara las dependencias faltantes y seguidamente los paquetes anteriores.
apt -f install -y
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:
#/mnt/jellyfin/peliculas #Películas #| #+-- Me Before You #| |-- Me Before You (2014).jpg #| +-- Me Before You (2014) - [480p].avi #| #+-- Soul #| |-- Soul (2020) - [1080p].jpg #| |-- Soul (2020) - [1080p].mkv #| |-- Soul (2020) - [1080p].spa.default.srt #| |-- Soul (2020) - [1080p].eng.srt #| +-- trailer.mp4 #| #+-- The Croods 2 #| |-- The Croods 2 (2020) - [1080p].jpg #| |-- The Croods 2 (2020) - [1080p].mkv #| |-- The Croods 2 (2020) - [1080p].spa.default.srt #| +-- The Croods 2 (2020) - [1080p].eng.srt #| #... #/mnt/jellyfin/series #Programas de TV #| #+-- The Borgias #| |-- The Borgias.jpg #| +-- Season 01 #| |-- Season 01.jpg #| |-- The Borgias S01E01 - E02.avi #| |-- The Borgias S01E01 - E02.srt #| |-- The Borgias S01E03.avi #| |-- The Borgias S01E03.srt #| +-- ... #| #+-- The Great #| |-- The Great.jpg #| +-- Season 01 #| |-- Season 01.jpg #| |-- The Great S01E01.avi #| |-- The Great S01E01.srt #| |-- The Great S01E02.avi #| |-- The Great S01E02.srt #| +-- ... #| #+-- Warrior #| |-- Warrior.jpg #| |-- Season 01 #| | |-- Season 01.jpg #| | |-- Warrior S01E01.avi #| | |-- Warrior S01E01.srt #| | |-- Warrior S01E02.avi #| | |-- Warrior S01E02.srt #| | +-- ... #| +-- Season 02 #| |-- Season 02.jpg #| |-- Warrior S02E01.avi #| |-- Warrior S02E01.srt #| |-- Warrior S02E02.avi #| |-- Warrior S02E02.srt #| +-- ... #...
#/mnt/jellyfin/musica/videoclips #Videos Musicales #| #+-- Variado (2020) #| |-- Black Eyed Peas Ft Shakira - Girl Like Me #| |-- Justin Timberlake - Cry me a river - Dance Video #| |-- Maluma Ft The Weeknd - Hawái(Remix) #| |-- Rosalia Ft The Weeknd - Blinding Lights #| +-- Clean Bandit - Symphony (feat. Zara Larsson) #| #+-- Sia #| |-- Sia.jpg #| |-- California Dreamin.mp4 #| |-- Chandelier.mp4 #| +-- ... #| #...
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:
apt install nginx -y
A continuación, generaremos los certificados SSL auto-firmados con OpenSSL:
openssl req -x509 -nodes -days 730 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
Respondemos según convenga:
Generating a RSA private key ......................................................................................+++++ ..........................................................................................................+++++ writing new private key to '/etc/ssl/private/nginx-selfsigned.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CU State or Province Name (full name) [Some-State]:HABANA Locality Name (eg, city) []:LaHabana Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA Organizational Unit Name (eg, section) []:REDES Common Name (e.g. server FQDN or YOUR name) []:jellyfin.empresa.midominio.cu Email Address []:[email protected]
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:
openssl dhparam -out /etc/nginx/dhparam.pem 2048
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”:
nano /etc/nginx/snippets/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í:
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
Editamos el siguiente fichero para aumentar la seguridad de encriptación:
nano /etc/nginx/snippets/ssl-params.conf
Agregamos lo siguiente, adaptando a su red:
ssl_protocols TLSv1.3 TLSv1.2; # Requires nginx >= 1.13.0 else use TLSv1.2 ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/dhparam.pem; # ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305-OLD:ECDHE-RSA-CHACHA20-POLY1305-OLD:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256; # ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0 ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # Requires nginx >= 1.5.9 ssl_stapling on; # Requires nginx >= 1.3.7 ssl_stapling_verify on; # Requires nginx => 1.3.7 # resolver NS1 NS2 valid=300s; resolver pdc1.empresa.midominio.cu valid=300s; resolver_timeout 5s; # Disable strict transport security for now. You can uncomment the following # line if you understand the implications. # add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";
Creamos el bloque de configuración de Nginx para Jellyfin:
nano /etc/nginx/conf.d/jellyfin.conf
Agregamos lo siguiente:
server { listen 80; listen [::]:80; server_name jellyfin.empresa.midominio.cu; # enforce https return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name videos.*; access_log /var/log/nginx/jellyfin.access; error_log /var/log/nginx/jellyfin.error; include snippets/self-signed.conf; include snippets/ssl-params.conf; set $jellyfin 127.0.0.1; location / { proxy_pass http://$jellyfin:8096; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-Host $http_host; # Disable buffering when the nginx proxy gets very resource heavy upon streaming proxy_buffering off; } # location block for /web - This is purely for aesthetics so /web/#!/ works instead of having to go to /web/index.html/#!/ location ~ ^/web/$ { # Proxy main Jellyfin traffic proxy_pass http://$jellyfin:8096/web/index.html/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-Host $http_host; } }
Verificamos que la configuración no tenga errores de sintaxis:
nginx -t
Si todo está bien, debe devolvernos lo siguiente:
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt" nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
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:
systemctl restart nginx
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:
systemctl restart jellyfin
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:
cd /var/lib/jellyfin/plugins/ unzip LDAP_Authentication_9.0.0.0.zip chown -R jellyfin:jellyfin /var/lib/jellyfin/plugins/ chmod 755 'LDAP Authentication' chmod -R 644 'LDAP Authentication'/*
Reiniciamos el servicio de Jellyfin para terminar la instalación:
systemctl restart jellyfin
4.1-Configuraciones necesarias en el ADDC
Para un ADDC en Samba4, correr los siguientes comandos, adaptando a su red:
Creamos el grupo «JellyfinUsers»:
samba-tool group add "JellyfinUsers" \ --groupou="OU=Grupos" \ --description="Grupo para los usuarios con acceso a Jellyfin"
Agregamos un usuario al grupo creado anteriormente:
samba-tool group addmembers "JellyfinUsers" usuario1.apellido
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:
fdisk -l
El nuevo disco se reconoce con la etiqueta «sdb». Procedemos a darle formato «ext4»:
mkfs.ext4 /dev/sdb
Creamos el nuevo directorio “/jellyfin”:
mkdir /jellyfin
Editamos “/etc/fstab” y agregamos el nuevo punto de montaje fijo:
nano /etc/fstab
Agregamos lo siguiente:
/dev/sdb1 /jellyfin ext4 defaults 0 0
Aplicamos los cambios:
mount /dev/sdb1 /jellyfin
Verificamos los puntos de montaje:
lsblk
Entre los resultados, nos fijamos en este que nos interesa:
# [...] sdb 8:16 0 32G 0 disk └─sdb1 8:17 0 32G 0 part /jellyfin # [...]
Creamos los nuevos directorios para los temporales de la transcodificacion y aprovechamos también el de los metadatos:
mkdir /jellyfin/transcodes/ chmod -R 777 /jellyfin/transcodes/ chown -R jellyfin:jellyfin /jellyfin/transcodes/ mkdir /jellyfin/metadata chmod -R 777 /jellyfin/metadata chown -R jellyfin:jellyfin /jellyfin/metadata
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:
mkdir -p /config/scripts
Editamos el fichero del script:
nano /config/scripts/clean-transcodes-temp.sh
Agregamos lo siguiente:
#!/bin/bash FECHA="$(date +%d-%b-%Y-%H:%M)" peso="/config/scripts/peso" x=`(df -h | grep -w "/jellyfin" | awk -F "" '{ print $41$42$43 }')` logfile="/var/log/jellyfin/myjellyfin.log" # Obtenemos el % de uso de la particion "/jellyfin" y lo guardamos en la variable "peso" echo "$x" | sed 's/^[[:space:]]*//' > $peso # Verificar si el espacio esta lleno completamente num=`cat $peso` if [ $num -eq 100 ]; then # Si esta lleno, borrar los ficheros MPEG Transport Stream (.ts) rm -rf /jellyfin/transcodes/*.ts echo "$FECHA: Se borraron los temporales de Jellyfin al llegar al 100% de uso /jellyfin/transcodes/" >> $logfile else # Si no esta lleno completamente, pero es superior al 70%, entonces borrar los ficheros ".ts" if [ $num -ge 70 ]; then rm -rf /jellyfin/transcodes/*.ts echo "$FECHA: Se borraron los temporales de Jellyfin al tener $num% de espacio" >> $logfile fi fi
Damos permisos de ejecución:
chmod +x /config/scripts/clean-transcodes-temp.sh
Creamos una tarea en el cron que se ejecute cada 1 min:
crontab -e
Agregamos lo siguiente:
########### # LEYENDA # ########### # "m": minutos (0-59) # "h": horas (0-23) # "dow": dia de la semana (0-6) # "dom": dia del mes (1-28/1-30/1-31) # "mon": mes (1-12) # "*": cualquiera # ",": separa valores dentro de la misma variable (0,5,10) # "-": define rangos dentro de la misma variable (0-5) # <m> <h> <dom> <mon> <dow> <directorio del script> ############ # JELLYFIN # ############ * * * * * /config/scripts/clear-transcoding-temp.sh
Reiniciamos el cron:
systemctl restart cron
Referencias Bibliográficas
- https://jellyfin.org/docs/. “Documentación oficial de Jellyfin”.
- 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.
- https://en.wikipedia.org/wiki/Jellyfin. “Wikipedia”.
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.
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
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
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»
Warning: Undefined array key 1 in /var/www/html/sysadminsdecuba/wp-content/plugins/wp-useragent/wp-useragent-detect-os.php on line 668
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???
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Hola Eduardo. Puedes montarlo donde quieras.