Pequeña guía de instalación de un servidor de descargas automatizado

En este artículo vamos a explicar cómo montar un servidor de descargas automatizado que nos permita seguir series, películas o artistas musicales sin tener que buscarlos y descargarlos manualmente a nuestro media center. Para ello podemos echar mano de un ordenador viejo que tengamos abandonado, un NUC o cualquiera de esos minicacharros ARM baratos tipo Raspberry Pi. En este último caso será recomendable disponer de un disco duro externo para utilizar como medio de almacenamiento, ya que la capacidad interna es muy escasa. Dependiendo de las funciones que queramos utilizar, recomendaría un sistema con al menos 2GB de RAM. Si solo utilizamos alguna cosa concreta podríamos instalar el sistema en una Raspberry Pi 3, que sólo tiene 1GB, pero usando a la vez todos los programas que instalamos en este tutorial se superará esa cifra con facilidad.

Utilizaremos una distribución GNU/Linux según nuestras preferencias. Me voy a centrar en RaspberryOS Lite por ser bien conocida y de fácil acceso, con miles de tutoriales en la red, pero cualquier otra es válida. Habrá que tener en cuanta dos factores: los nombres de los paquetes y los comandos de instalación pueden variar de una distro a otra (especialmente si no usamos derivadas de Debian), y el servidor de streaming puede necesitar aceleración 3D hardware si pretendemos usar la función de transcodificación. En los microservidores ARM esta parte es complicada. En RaspberryOS 32bit está disponible, pero en las distros de 64bit para Raspberry es experimental y no puedo asegurar que funcione. Sin embargo la transcodificación es opcional y en la mayoría de casos no la necesitaremos. Tened en cuenta también que para este texto uso la arquitectura armhf, si utilizáis otra distinta adaptad los comandos y repositorios apropiadamente.

No voy a explicar la instalación y configuración del sistema operativo ni como añadir un disco externo, ya que esto está más que cubierto por miles de tutoriales en la red. Para los propósitos de este texto, el disco externo estará montado en /mnt/descargas. La configuración de red también es algo muy conocido, en todo caso es recomendable usar una conexión por cable y configurar una IP estática. Asumo que todo el mundo sabe conectar por SSH al servidor. Lo que si voy a recomendar es poner un hostname adecuado e instalar avahi-daemon (en RaspberryOS Lite viene de serie) para acceder al servidor sin tener que recordar una IP. Si, por ejemplo, mi servidor se llama "descargame", estará accesible bajo el dominio descargame.local. Casi todas las distribuciones Linux, así como MacOS y Windows 10 vienen con esta capacidad de serie. Si usáis otra arquitectura diferente de la armhf de este tutorial, substituidla por la vuestra en los comandos y repositorios.

Ojo también con la seguridad. Si lo usamos en una red interna doméstica podemos dejarlo tal cuál, pero si vamos a exponerlo a Internet necesitaremos protegerlo con un cortafuegos. Una vez todo esté configurado y funcionando, sólo necesitaremos los puertos 22 (para SSH) y 80 abiertos para el uso normal. Eso sí, montad el cortafuegos al final para no entorpecer la configuración de los programas de descarga., y tened en cuenta que habría que modificar las URLs de los indexers (en Sonarr, Radarr y Lidarr) poniendo 127.0.0.1 o localhost en lugar del nombre de host o la IP externa. Tampoco he añadido configuración SSL para el navegador, pero no sería complicado y hay muchas guías para ello en la red.

Para todo lo demás, raspi-config ;-)

Al final del tutorial incluiré un archivo comprimido con todos los archivos de servicio, configuración del proxy inverso, la plantilla web y las unidades Monit, que podéis utilizar tal cual o como base para modificar.

Dependencias básicas

Recordad que estos comandos habrá que ejecutarlos como root, o utilizando sudo. A lo mejor os resulta más sencillo hacer "sudo su" para lograr una consola de root. Lo primero de todo es actualizar la distro e instalar algunas dependencias de las aplicaciones. Como cliente torrent voy a usar Transmission, pero Deluge también nos valdría (aunque resulta más pesado y tiene más dependencias):

# apt-get update && apt-get dist-upgrade

# apt-get install libicu63 libssl1.1 mono-complete transmission-daemon natpmpc unrar-free nodejs python3-pip python3-distutils git libopenjp2-tools mediainfo libchromaprint-tools smartmontools monit apt-transport-https nginx libxml2-dev libxslt1-dev python3-libxml2 python3-lxml unrar-free ffmpeg libatlas-base-dev python3-numpy

Nginx es un servidor web y lo vamos a utilizar como proxy inverso para acceder a todas las aplicaciones sin tener que recordar sus respectivos puertos. Monit es un servicio que nos permite comprobar la "salud" del servidor y arrancar o parar servicios, así como tomar acciones si alguno de ellos falla. La última parte de las dependencias (a partir de nginx) sólo las necesitaremos si vamos a instalar Bazarr.

El paso anterior habrá activado el servicio mono-xsp4, no lo vamos a utilizar así que lo desactivamos:

# systemctl disable mono-xsp4.service

Aplicaciones de manejo de descargas

Ahora instalaremos las aplicaciones web que se encargan del manejo de las descargas. Por un lado tenemos Jackett, que es una especie de metabuscador. Nos permite seleccionar en qué trackers torrent vamos a buscar contenidos, y sirve los resultados a las demás aplicaciones. Y si, vamos a utilizar torrents porque las cuentas de USENET son de pago ;-) Por otro lado tenemos una serie de programas muy especializados: Sonarr se encarga de las series y programas de TV, Radarr de las películas, y Lidarr de la música.

Como extra, vamos a instalar Bazarr para que se encargue de descargar subtítulos, si nos gusta ver contenidos en versión original o bien seguimos cosas tan nuevas que no se hayan doblado aún. Os advierto que puede resultar bastante pesado para el sistema, así que instaladlo solamente si os resulta útil.

Hay incluso más programas similares, casi todos derivados unos de otros. Según lo que nos interese podemos instalar otras cosas usando el mismo método. Por ejemplo, recientemente los equipos de Radarr y Lidarr se han fusionado y retomado un viejo proyecto llamado Readarr, que usa una interfaz similar para descargar libros y revistas, tanto en formatos de texto (pdf, epub y otros) como audiolibros. También sirve para los cómics. Aunque en este tutorial no lo vamos a instalar, ya que está muy verde aún, si os interesa podéis darle una oportunidad. El proceso sería similar a Radarr o Lidarr.

No utilizaremos Docker ni repositorios de paquetes extras si podemos evitarlo. Supuestamente con Docker la instalación de estos programas es más fácil, pero ocupa más espacio, a menudo produce problemas de permisos y las actualizaciones no son inmediatas. Con los repositorios las actualizaciones también van más lentas, ya que hay que esperar a que alguien monte el paquete correspondiente. Además, al final habrá que toquetear muchos archivos para ajustar los permisos adecuados y que trabajen bien con los demás programas del sistema, así que los beneficios se diluyen. Utilizaremos una instalación manual a la vieja usanza siempre que sea posible.

Con una shell remota vía SSH con nuestro miniservidor, nos vamos a /opt, que es donde vamos a situar los archivos correspondientes, y empezamos a descargar los archivos. Es importante revisar que descarguemos la última versión adecuada a nuestro sistema, en este caso ARM32. Notad que estoy usando la versión 3 de Sonarr (la estable es la 2, pero la transición es inminente) y de Radarr (que también se considera menos estable, pero llevo tiempo utilizándola y no me ha dado grandes problemas). En todo caso, estas aplicaciones pueden actualizarse a si mismas automáticamente y no es dificil actualizar a la última versión manualmente aunque hayamos instalado una anterior:

# cd /opt

# wget "https://github.com/Jackett/Jackett/releases/download/v0.16.1859/Jackett.Binaries.LinuxARM32.tar.gz"

# wget "https://services.sonarr.tv/v1/download/phantom-develop/latest?version=3&os=linux" -O sonarr.tar.gz

Las URLs de descarga de Sonarr y Radarr enlazan directamente con la última versión disponible en cada momento, pero las de Jackett y Lidarr puede que tengáis que ajustarlas si aparecen nuevas versiones. Usamos la versión Mono de Radarr v3, porque me da un poco de cosa instalar el .Net Core de Microsoft:

# wget "https://radarr.servarr.com/v1/update/nightly/updatefile?os=linux&runtime=mono&arch=arm" -O radarr.tar.gz

# wget "https://github.com/lidarr/Lidarr/releases/download/v0.7.1.1381/Lidarr.master.0.7.1.1381.linux.tar.gz"

Extraemos los archivos y renombramos las carpetas para mantenerlo todo limpio y ordenado:

# tar xvf Jackett.Binaries.LinuxARM32.tar.gz && mv Jackett jackett

# tar xvf sonarr.tar.gz && mv Sonarr sonarr

# tar xvf radarr.tar.gz && mv Radarr radarr

# tar xvf Lidarr.master.0.7.1.1381.linux.tar.gz && mv Lidarr lidarr

Esta parte es la instalación de Bazarr, que se descarga vía git.

# git clone "https://github.com/morpheus65535/bazarr.git" /opt/bazarr

Y ya podemos borrar los archivos originales descargados:

# rm *.tar.gz

Permisos

A continuación viene una parte crucial de la configuración: los permisos. Queremos que cada una de estas aplicaciones pueda actualizarse a si misma con los mínimos privilegios necesarios. También queremos que puedan interactuar con los archivos descargados por el cliente torrent para organizarlo todo, por ejemplo renombrando o moviendo archivos. Excepto Jackett, que en principio sólo necesita permisos para actualizarse a si mismo, aunque si queremos utilizar la función de carpeta vigilada (black-hole, que consiste en que Jackett descarga el torrent o magnet directamente en una carpeta que el cliente torrent repasa continuamente, añadiendo a la lista de descargas los enlaces que encuentre) deberemos darle también acceso al grupo de Transmission. Sin embargo os advierto que Transmission no puede manejar los magnet que le brinda Jackett con la carpeta vigilada, sino solamente los archivos .torrent. Así que si vamos a usar esta funcionalidad con los magnet tendremos que usar otro cliente. Deluge en cambio parece funcionar correctamente.

Vamos a tener un usuario de sistema para cada aplicación y a la vez un grupo común para todas ellas y para el cliente torrent. Como Transmission ya crea un grupo propio, lo utilizaremos en lugar de crear uno nuevo. Para simplificar, actuaré como si fuésemos a utilizar la función de carpeta vigilada de Jackett y Transmission.

Creamos los usuarios:

# useradd -s /bin/false -d /var/lib/jackett/ -r -m -U jackett

# useradd -s /bin/false -d /var/lib/sonarr/ -r -m -U sonarr

# useradd -s /bin/false -d /var/lib/radarr/ -r -m -U radarr

# useradd -s /bin/false -d /var/lib/lidarr/ -r -m -U lidarr

# useradd -s /bin/false -d /var/lib/bazarr/ -r -m -U bazarr

Y ahora los añadimos al grupo de Transmission:

# usermod -a -G debian-transmission sonarr

# usermod -a -G debian-transmission radarr

# usermod -a -G debian-transmission lidarr

# usermod -a -G debian-transmission bazarr

# usermod -a -G debian-transmission jackett

Tenemos que asignar la propiedad de los archivos extraidos al usuario correspondiente, y al grupo común:

# chown -R jackett:debian-transmission /opt/jackett

# chown -R sonarr:debian-transmission /opt/sonarr

# chown -R radarr:debian-transmission /opt/radarr

# chown -R lidarr:debian-transmission /opt/lidarr

# chown -R bazarr:debian-transmission /opt/bazarr

Arranque de servicios

Ahora vamos a crear los servicios para que todas las aplicaciones se inicien al arranque del sistema. Asumo que a estas alturas casi todo el mundo utiliza SystemD. Jackett es el más sencillo, ya que viene de serie con un script para instalar el servicio:

# sh /opt/jackett/install_service_systemd.sh

Aún así, habrá que modificar el archivo creado para que la carpeta vigilada funcione.

# nano /etc/systemd/system/jackett.service

El aspecto final sería este:

- jackett.service

Los demás tendremos que crearlos manualmente con un editor de texto. Para los novatos, nano es un editor de consola muy sencillo en el que sólo necesitaréis conocer dos atajos de teclado: Ctrl-o (para guardar el archivo) y Ctrl-x (para salir del editor).

# nano /etc/systemd/system/sonarr.service

# nano /etc/systemd/system/radarr.service

# nano /etc/systemd/system/lidarr.service

# nano /etc/systemd/system/bazarr.service

Nano soporta operaciones de copiar/pegar con el ratón, así que sólo tenéis que copiar el contenido de los archivos de aquí, o descargarlos directamente al servidor:

- sonarr.service

- radarr.service

- lidarr.service

- bazarr.service

Estos scripts los he creado modificando ligeramente los ejemplos del Wiki de los respectivos proyectos. Lo importante es que el servicio funcione a nombre del usuario propio de la aplicación y el grupo común para todas (debian-transmission). El parámetro UMask es muy importante, porque permite que los archivos creados por una aplicación sean manejables por las demás del mismo grupo.

Una vez creados los archivos de servicio, los activamos para que se inicien al arranque del sistema. Excepto Jackett que ya estará activado. Primero recargamos la lista de servicios:

# systemctl daemon-reload

# systemctl enable sonarr.service

# systemctl enable radarr.service

# systemctl enable lidarr.service

# systemctl enable bazarr.service

Servidor multimedia Jellyfin

En este punto tenemos instalados los manejadores de descargas y el cliente torrent, pero nos falta el servidor multimedia. Vamos a utilizar Jellyfin, que es un fork totalmente libre de Emby. Este tiene su propio repositorio, así que resulta más fácil.

# wget "https://repo.jellyfin.org/jellyfin_team.gpg.key"

# apt-key add jellyfin_team.gpg.key

# echo "deb [arch=$( dpkg --print-architecture )] repo.jellyfin.org/$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release ) $( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release ) main" | tee /etc/apt/sources.list.d/jellyfin.list

Donde pone "repo.jellyfin.org" añadid un "https://" delante, que el editor se lo come. Con esto configuramos el repositorio oficial, después simplemente actualizamos la caché de paquetes e instalamos Jellyfin:

# apt-get update && apt-get install jellyfin

La aceleración hardware de vídeo para Jellyfin requiere que este pertenezca al grupo video. Además, nos interesa que pueda manejar (y en su caso borrar) los archivos creados por las demás aplicaciones, así que también lo añadiremos al grupo debian-transmission:

# usermod -a -G video,debian-transmission jellyfin

En este momento ya tenemos el software instalado, lo que nos queda es todo configuración.

Configuración del cliente torrent Transmission

Empezamos toqueteando la configuración de Transmission, para lo cual el servicio tiene que estar parado (si no lo está, el archivo será sobreescrito al cerrar el programa). Recordad que nuestro disco externo está en /mnt/descargas, y ahí es donde se descargarán los torrents. Nos interesa separar los torrents ya completados de los que aún se están descargando, para evitar problemas cuando nuestros manejadores busquen archivos descargados. También cambiaremos el usuario (rpc-username, yo voy a dejar el que viene por defecto, que es transmission), la contraseña (rpc-password, la ponemos directamente en texto claro entre las comillas y Transmission la cifrará en cuanto arranque) y una lista de IPs a las que se permite el acceso a la interfaz web (rpc-whitelist, ponedlas separadas por comas o usad wildcards). Otra cosa que debemos ajustar es el umask, poniéndolo a 2 para que el resto de aplicaciones del grupo tengan acceso completo a los archivos descargados.

El resto de los parámetros de Transmission como el ratio o el límite de sembrado se pueden ajustar a lo que consideréis conveniente:

# systemctl stop transmission-daemon.service

# nano /etc/transmission-daemon/settings.json

Os dejo un archivo de ejemplo que podéis usar como base. He añadido al final del ejemplo las líneas correspondientes a la carpeta vigilada (watch-dir), pero si no usáis esto es mejor borrarlas. ¡¡ Y cambiad la contraseña !!

- settings.json

Recordad que todas las líneas de ese archivo deben acabar en coma, excepto la última antes del corchete de cierre. A continuación tendremos que crear las carpetas que hemos especificado en la configuración, y darles los permisos adecuados:

# mkdir -p /mnt/descargas/torrents/completos && mkdir /mnt/descargas/torrents/incompletos

# chown -R debian-transmission:debian-transmission /mnt/descargas/torrents

Puede ocurrir que nuestro disco externo sea un poco lento al arrancar. Para evitar que Transmission se inicie antes de que el disco se haya montado, deberíamos modificar el archivo de servicio de Transmission. Primero averiguamos la unidad de SystemD que monta el disco con:

# systemctl list-units --type=mount

Esto nos dará una lista de eventos de montaje de discos. Leyéndola es evidente cuál es nuestro externo, en mi caso la unidad se llama mnt-descargas.mount. Lo añadimos después del After y también como Requires:

# nano /lib/systemd/system/transmission-daemon.service

De forma que quede así:

- transmission-daemon.service

Entonces recargamos los servicios con

# systemctl daemon-reload

Proxy inverso con Nginx

Antes de reiniciar para los pasos finales de la configuración, vamos a configurar también el proxy inverso nginx. La idea es que podamos visitar los diferentes gestores de descargas como si fueran "carpetas" de nuestro servidor, ahorrándonos el recordar sobre que puerto se ejecuta cada uno. Cada location se corresponde con la base_url que configuremos en los respectivos programas. Podéis cambiarlos si queréis, pero aseguráos de que ambas (location de nginx y base_url de Radarr, por ejemplo) sean iguales. Primero borramos la configuración por defecto de nginx, luego creamos nuestra propia configuración en /etc/nginx/sites-available, y después la activamos con un enlace simbólico en /etc/nginx/sites-enabled:

# rm /etc/nginx/sites-enabled/default

# nano /etc/nginx/sites-available/proxy_inverso

# ln -s /etc/nginx/sites-available/proxy_inverso /etc/nginx/sites-enabled/

Este archivo es bastante complejo, así que os dejo un ejemplo con todo incluído:

- proxy_inverso

Explico un poco: en el bloque server debéis modificar el server_name y la IP para poner los de vuestro servidor. Los bloques que no uséis, como Bazarr u Ombi (hablaré sobre este más adelante), podéis borrarlos o desactivarlos añadiendo una almohadilla (#) al principio de cada línea. Finalmente, el bloque Jellyfin tiene su truco. Debido a un fallo en el código de este programa (probablemente heredado de Embi) al activar la base_url el servidor DLNA deja de funcionar correctamente porque los clientes reciben una URL errónea. Para solventar este problema, añadimos las líneas

proxy_redirect default;

proxy_redirect / /jellyfin/;

que nos permiten una funcionalidad similar a la de base_url pero sin romper el servidor DLNA. Mi configuración de ejemplo ya las incluye, así que todo debería funcionar. Si más adelante el equipo de Jellyfin arregla este problema, sólo tenéis que borrar esas líneas y añadir el base_url en la configuración interna de Jellyfin.

Al usar nginx como proxy inverso existe un problema potencial que aparecería si intentamos subir archivos torrent de cierto tamaño a Transmission. La configuración por defecto de nginx sólo permite subidas de muy escaso porte, y cuando este se supera se corta la subida. Para evitarlo, editaremos el archivo de configuración general de nginx

# nano /etc/nginx/nginx.conf

y añadiremos bajo el bloque http la siguiente sentencia con un valor razonable (en este caso 4 megas):

client_max_body_size 4M;

Ya queda poco, podemos reiniciar:

# reboot

Configuración de Jackett

En cuanto el servidor vuelva a arrancar, podremos visitar con un navegador las interfaces web de los diferentes programas para configurarlos. Deberíamos empezar por Jackett, que escucha en el puerto 9117. Si el servidor se llama descargame, abrimos la página descargame.local:9117 en el navegador (o también se puede usar directamente la IP) y veremos la interfaz de Jackett aún sin trackers configurados. Lo primero que deberíamos hacer es añadir una contraseña de administración (tecleandola en la casilla correspondiente y después pinchando en "Set Password") y la base_url que hemos configurado en nginx (en Jackett se denomina "Base Path Override"). En nuestro ejemplo es "/jackett". En cuanto pulsemos el botón de "Apply server settings" ya podemos dejar de poner el número de puerto e ir a descargame.local/jackett sin más.

Ahora configuramos los trackers torrent donde queremos buscar el contenido. Jackett admite tanto trackers públicos como privados o semi-privados (semi-privados son los que requieren registro pero no una invitación explícita, de forma que cualquiera puede registrarse). En ese caso, debemos configurar nuestro nombre de usuario y contraseña de acceso a tales trackers. Dependiendo del contenido que vayamos a buscar, podemos hacer un primer filtrado según los sitios que añadamos. Hay trackers especializados por tipo de contenidos (películas, anime. . . ) o por idiomas. Por ejemplo, si queremos añadir trackers de contenido en castellano exclusivamente, podemos pinchar en "Add indexer" y usar la casilla de búsqueda poniendo "es-", con lo que nos mostrará trackers cuyo idioma sea español. Es aconsejable revisar de vez en cuando la lista de trackers, ya que nuevas versiones de Jackett pueden introducir sitios que antes no estaban disponibles. Jackett se actualizará automáticamente a no ser que marquéis la opción de deshabilitar auto-actualizaciones.

Para los trackers semi o totalmente privados, tendremos que configurar nuestros datos de acceso antes de añadirlos, pinchando en el icono de la herramienta. Este icono nos sirve también para configurar qué categorías tiene disponibles cada tracker. Las categorías son un estándar creado para USENET y podéis leer más sobre ellas aquí. En general podéis dejarlas tal como vienen.

Otra cosa que podéis configurar son las URLs que algunos trackers disponen como alternativa (por ejemplo TPB) o un proxy a usar para salir a la red. Esto puede ser útil si algún tracker resulta estar bloqueado por vuestro operador o tiene un bloqueo judicial (otra vez, TPB y también desde no hace mucho EpubLibre). Os dejo una captura de los trackers que tengo configurados en mi Jackett como referencia:

Si queremos utilizar la función de carpeta vigilada debemos asegurarnos de crearla y darle los permisos adecuados, vía SSH:

# mkdir /mnt/descargas/blackhole

# chown debian-transmission:debian-transmission /mnt/descargas/blackhole

# chmod 775 /mnt/descargas/blackhole

Entonces podremos añadir esta carpeta en Jackett (casilla Manual download blackhole directory), y también en la configuración de Transmission (settings.json). Entonces veremos en cualquier búsqueda manual en Jackett un botón para descargar directamente el torrent a la carpeta vigilada, con lo que el cliente torrent la añadirá automáticamente a las descargas. Os recuerdo que este sistema no funcionará con magnets si usamos Transmission.

Configuración de Sonarr

Sin cerrar la pestaña de Jackett, abrimos otra nueva para conectar a Sonarr en descargame.local:8989. Vamos a la pestaña de Settings y en el apartado General cambiamos el URL Base a "/sonarr". Ahora ya podemos acceder a descargame.local/sonarr sin tener que recordar el número de puerto. En la misma pestaña en que estábamos podríamos configurar autenticación para acceder a Sonarr, en caso de que queramos evitar que "alguien" de casa cambie cosas sin nuestro permiso. Pinchando en el botón de "Show Advanced" podemos acceder a más ajustes, entre los cuales deberíamos activar la actualización automática. Cuando estemos conformes, pinchamos en "Save Changes" y cambiamos al apartado de "Download Clients".

Aquí podríamos configurar diversas opciones para enganchar a clientes de USENET o torrent. Estamos utilizando Transmission, así que pinchamos en la opción correspondiente y añadimos los datos necesarios. Basta con escribir un nombre para identificarlo (pongamos "Transmission" por ejemplo), el nombre de usuario y la contraseña de acceso que configuramos antes en settings.json. El resto podemos dejarlo tal cual. Usamos el botón de Test para comprobar que los datos introducidos son correctos y la conexión se produce sin problemas, y guardamos.

A continuación vamos al apartado "Media Management". La mayoría de opciones son autoexplicativas, pero puede que nos interese la opción de CHMOD (en Advanced). La explicación de la opción de renombrado es un poco antiintuitiva, ya que se renombrarán los archivos solo si la marcamos. Lo más importante es la configuración de "Root Folder", que tiene su truco: esta no es la carpeta de las descargas de Transmission, sino la carpeta final a donde Sonarr moverá los episodios y donde los organizará. Dado que usamos diferentes programas para cada tipo de descargas, y cada uno puede tener su "Root Folder", esto nos vendrá bien para organizar los medios en diferentes "bibliotecas" para Jellyfin. Deberíamos crear una carpeta para ello en la consola del servidor, y darle permisos apropiados:

# mkdir /mnt/descargas/series

# chown sonarr:debian-transmission /mnt/descargas/series

# chmod 775 /mnt/descargas/series

Y ahora ya podemos usar el botón de "Add Root Folder", navegar hasta esa carpeta y seleccionarla. Nos movemos a los siguientes apartados: en "Quality" es todo bastante evidente y no hay mucho que explicar, establece límites de tamaño para cada perfil. En "Profiles" deberíamos al menos añadir un perfil en castellano bajo "Language Profiles" para poder buscar contenido en nuestro idioma. No hace falta buscar el título del contenido en nuestro idioma, ya que estos programas integran búsqueda de títulos alternativos (en otros idiomas) y por tanto si les decimos que descargue una serie o película en castellano ellos mismos se encargarán de averiguar cómo se ha titulado aquí. En UI están los ajustes sobre el formato de fecha.

El apartado de "Indexers" es muy importante. Aquí añadiremos los trackers donde Sonarr va a buscar enlaces (torrents en nuestro caso) para descargar el contenido. Las instrucciones para esto las encontramos ya en la página principal de Jackett (en "Adding a Jackett indexer in Sonarr or Radarr"), así que no tiene mucho misterio. En algunos casos puede que queramos editar las categorías de búsqueda. Copiamos los datos en las casillas correspondientes y pulsamos "Test" para probar la conexión. Si todo va bien, guardamos. Recordad que la "API Key" que se nos pide es la que proporciona Jackett, que es diferente en cada instalación.

Repetiremos la operación con todos los trackers que nos interese añadir a Sonarr. En caso de que tengamos configurado en Jackett un surtido limitado de proveedores, o los que tengamos proporcionen varios tipos de medios, nos puede interesar aglutinar las búsquedas como si fuera un sólo "indexer". Para ello Jackett proporciona un indexer especial con la siguiente URL (modificadla para vuestro caso):

descargame.local/jackett/api/v2.0/indexers/all/results/torznab

Con lo que quedaría así:

Configuración de Radarr y Lidarr

Con Sonarr ya funcionando, pasamos a configurar Radarr y Lidarr. Su configuración es prácticamente idéntica a la de Sonarr, así que sólo voy a repasar los detalles diferentes. Creamos carpetas raíz para ellos con los permisos ajustados:

# mkdir /mnt/descargas/peliculas

# chown radarr:debian-transmission /mnt/descargas/peliculas

# chmod 775 /mnt/descargas/peliculas

# mkdir /mnt/descargas/musica

# chown lidarr:debian-transmission /mnt/descargas/musica

# chmod 775 /mnt/descargas/musica

Radarr escucha en el puerto 7878, así que nos conectamos inicialmente a descargame.local:7878 para cambiar la Base URL a "/radarr". Así ya podemos conectar directamente a descargame.local/radarr.

Con Lidarr tres cuartos de lo mismo, pero sobre el puerto 8686. De descargame.local:8686 pasaremos tras cambiar la Base URL (poniendo "/lidarr") a descargame.local/lidarr.

En Radarr podemos ajustar el idioma de la interfaz así como de la información de las películas bajo el apartado Settings/UI. Así veremos los títulos y sinopsis de las películas en castellano. Aún así, si buscamos el título original de una película en inglés, por ejemplo, seguirá apareciendo en los resultados igualmente. Tendremos que refrescar la página en el navegador para ver los cambios. El idioma del contenido a descargar tendremos que seleccionarlo modificando los perfiles, ya que no hay un "perfil de idioma" específico.

Desgraciadamente no podremos librarnos de un "warning" en Radarr que nos apremia a instalar .NET Core. No debería suponer ningún problema de funcionamiento, tan sólo es una molestia. Si a alguien no le importa usar ese software de Microsoft en su distribución Linux, puede hacer caso del aviso.

En Lidarr, además de los perfiles de calidad tenemos los llamados "Metadata Profiles". Esto se refiere al tipo de discos que queremos incluir en un perfil. Por ejemplo, quizá nos interesen solamente los discos de estudio y directos, dejando fuera los recopilatorios.

Una característica interesante de Radarr es que bajo el apartado Películas/Descubrir podemos ver recomendaciones que nos hace en base al tipo de películas que hayamos añadido previamente. Estas irán cambiando según añadimos más.

Backups

En los tres programas de descargas existe una función de backup que se activa periódicamente y antes de cada actualización. Por seguridad, por si tenemos que reinstalar este servidor alguna vez, podemos hacer que tales backups se guarden en el disco externo. Primero creamos las carpetas y les damos los permisos adecuados:

# mkdir -p /mnt/descargas/backups/{sonarr,radarr,lidarr}

# chmod 775 /mnt/descargas/backups -R

# chown sonarr:debian-transmission /mnt/descargas/backups/sonarr

# chown radarr:debian-transmission /mnt/descargas/backups/radarr

# chown lidarr:debian-transmission /mnt/descargas/backups/lidarr

Ahora sólo tenemos que cambiar en la configuración de los tres programas la carpeta donde se guardan. Este ajuste se encuentra en Settings/General (con la opción de mostrar ajustes avanzados activada).

Configuración de Bazarr

Bazarr puede requerir dependencias extra. En principio hemos instalado algunas cosas al inicio del tutorial, y el propio Bazarr aporta otras de ellas, pero si no os funciona bien, podemos probar a instalarlas manualmente. No nos interesa instalarlas en el sistema para que no haya conflictos con la paquetería, así que las instalamos localmente sólo para su usuario:

# sudo -u bazarr python3 -m pip install -r /opt/bazarr/requirements.txt

Vamos ahora a configurar el descargador de subtítulos, que escucha en el puerto 6767. Abrimos en nuestro navegador la página descargame.local:6767 y cambiamos la URL Base a "/bazarr", con lo que ya podremos conectar directamente a descargame.local/bazarr. Tenemos que conectar Bazarr con Sonarr y Radarr, así que en los apartados correspondientes de Settings activamos la conexión y añadimos las URL base de Sonarr y Radarr y sus respectivas claves API (se encuentran en Settings/General de cada programa). También añadimos sus carpetas raíz, ya que los subtítulos se guardarán al lado de cada medio. Veréis que tiene dos casillas, "Path para Sonarr" y "Path para Bazarr", por ejemplo. Esto se debe a que se puede instalar los programas en máquinas distintas y usar carpetas compartidas por red, pero como en nuestro caso todo está en la misma máquina ponemos ambas iguales.

En Subtitles podemos configurar un proveedor de servicio Anti-Captcha si usamos alguno (son de pago) y también los parámetros de búsqueda, "arreglos" para subtítulos o si queremos subtítulos forzados o para gente con problemas de audición.

En Settings/Providers seleccionamos qué proveedores de subtítulos queremos utilizar. Hay varios enfocados en exclusiva a subtítulos en español (de ambos lados del charco), pero otro que también funciona bien es OpenSubtitles (que requiere una cuenta, pero es fácil registrarse). En Settings/Languages seleccionamos que idiomas de subtítulos queremos. Se pueden añadir varios según váis pinchando en ellos en la lista.

Para los dispositivos menos potentes, como nuestra Raspberry, se recomienda usar estos ajustes de la wiki de Bazarr para que sea un poco menos pesado. Como resumen, los listaré aquí:

  • Activar "Adaptative Searching"
  • Desactivar "use Embedded Subtitles"
  • Desactivar "Search Enabled Providers Simultaneously"

Y en el apartado de Scheduler

  • Poner a "Manually" ambas opciones de "Disk Indexing"
  • Seleccionar un intervalo mayor en "Search and Upgrade Subtitles"

Podéis pensar que como Jellyfin puede conectar a OpenSubtitles, Bazarr es redundante. Sin embargo conviene saber que Jellyfin sólo conoce el nombre final de los archivos tras el renombrado de Sonarr y Radarr (si es que lo usamos) y por tanto a menudo utiliza subtítulos inadecuados. Bazarr en cambio busca según los nombres originales de los archivos antes del renombrado y por tanto tiene mayor fiabilidad. En todo caso Jellyfin permite cierta holgura para sincronizar manualmente subtítulos que no sean del todo adecuados.

Funcionamiento básico

La mecánica básica de estos programas es como sigue: añadimos algún contenido que nos interesa usando el buscador en "Add New". Al pinchar en la ficha podemos ajustar algunas opciones como la calidad y el perfil de idioma:

Si marcamos la opción de buscar inmediatamente, el sistema comenzará a buscar el contenido que falta en cuanto pinchemos en "Añadir" y enviarlo al cliente torrent. Si no, esperará al siguiente refresco programado (en Tasks/Tareas podemos ver cuando):

Si, por la razón que fuera, algún contenido diera error en la búsqueda (puede pasar si no está en ningún tracker de los activados o bien la calidad disponible no fuera la que hemos pedido), podemos ir a dicha serie y buscarlo manualmente utilizando el botón del monigote. También podemos buscar temporadas enteras:

Una vez descargado, lo moverá a la carpeta raíz, donde estará disponible para Jellyfin. Si la importación fallara (cosa que suele pasar con algunos trackers españoles, ya que no siempre siguen la convención de nombrado internacional o comparten archivos comprimidos) podemos importar manualmente desde el apartado de "Activity" (pinchando el monigote) o bien desde "Wanted/Manual Import" (el botón de arriba). En Radarr no tenemos tal apartado y tenemos que usar el botón de "Importación Manual" de la página principal. El otro botón de "Import" es para incluir en la biblioteca archivos que ya hubiéramos descargado antes de usar estos programas o que ya tengamos en otra parte.

Configuración de Jellyfin

Finalmente pasamos al servidor de medios Jellyfin. Con el apaño que hemos hecho en la configuración de nginx ya no es necesario conectar directamente al puerto, pero por si acaso os recuerdo que sería descargame.local:8096. En nuestro caso conectamos ya a descargame.local/jellyfin y seguimos la configuración guiada que se nos presenta. Como ya hemos separado las carpetas raíz de cada uno de los programas de gestión de descargas, en las bibliotecas de medios podremos añadir cada una de ellas para tener separadas las películas, las series y la música, ajustando el tipo de contenido que de cada una.

Es consejable activar la opción de "Guardar imágenes y etiquetas en las carpetas de medios" para facilitar la importación en caso de que alguna vez queramos reinstalar el servidor. También podemos ajustar idioma y país para que nos muestre los metadatos correspondientes a nuestro idioma y región, así como los proveedores de esos metadatos. La extracción de imágenes de los capítulos (para mostrar miniaturas) probablemente no nos interese ya que es bastante pesada:

En el panel de control tenemos varios ajustes disponibles. En la parte de usuarios podemos restringir las bibliotecas de medios a las que puede acceder cada uno de ellos. Cada usuario tiene unos parámetros de "Reproducción de contenido" diferentes, en los cuales deberíamos desactivar las acciones de conversión (es decir, transcodificación) si no vamos a utilizarlas, ya que son bastante costosas. Así, dejaríamos activada solamente la opción de "Permitir la reproducción de medios". Tenemos que hacer esto para cada usuario que creemos.

En "Reproducción" podemos activar la aceleración hardware. Para Raspberry (3 y 4 solamente) escogeríamos la opción "OpenMAX OMX". Advierto que esto es experimental y podría no dar buen rendimiento. En DLNA podemos configurar el servidor correspondiente. Este utiliza los privilegios de acceso de un usuario concreto, por lo que deberíamos crear uno específico con acceso limitado a las bibliotecas si queremos que no todas ellas estén servidas por este sistema.

En "Extensiones" tenemos un catálogo de plugins que podemos instalar, los cuales proporcionan acceso a servicios (IPTV), proveedores de metadatos adicionales (por ejemplo, carteles de películas o identificación de animes). El plugin "TMDb Box Sets" es especialmente interesante ya que agrupa automáticamente las películas de una misma saga en colecciones.

En "Redes" podemos configurar una URL Base, pero no deberíamos utilizarla ya que el servicio DLNA dejaría de funcionar correctamente. Ya nos hemos encargado de eso en nginx. Si en un futuro el equipo de Jellyfin arregla este problema, podríamos poner una URL Base y borrar las dos líneas del apaño en nginx.conf que he mencionado antes.

Por último, en "Claves API" deberíamos crear una clave para cada una de nuestras aplicaciones: Sonarr, Radarr y Lidarr. En cada una de estas nos vamos al apartado Settings/Connect y creamos una nueva conexión de tipo Emby (Jellyfin es un fork de Emby y es compatible) con estos parámetros:

Notad que la clave API debe ser específica de cada aplicación, el host es localhost y la opción de "Update library on import and rename" está activada. Esto sirve para que las aplicaciones notifiquen al servidor Jellyfin cada vez que añaden contenido nuevo, ahorrándonos escanear las bibliotecas cada poco tiempo.

El aspecto final de la página de una película en Jellyfin:

Funcionalidades extra

Es posible añadir a Transmission un script para que se descompriman los archivos .rar al acabar la descarga, aquí tenéis las instrucciones. Ciertos grupos españoles suelen subir torrents comprimidos (a veces con contraseña, o incluso metiendo unos archivos comprimidos dentro de otros), y esto podría ser útil para evitar intervención manual en algunos casos. Deluge, por otro lado, tiene esta capacidad integrada en un plugin.

Otra opción para lidiar con las descargas que incluyen archivos comprimidos es Unpackerr, que es un extractor automático externo ya pensado para trabajar con Sonarr/Radarr/Lidarr. Hay paquetes .deb listos para instalar en cualquier arquitectura, por lo que su configuración se reduce a editar /etc/unpackerr/unpackerr.conf (que viene bien comentado y explicado) y ajustar las opciones a nuestro gusto. También es necesario ajustar el archivo de servicio en /lib/systemd/system/unpackerr.service para que funcione con los permisos adecuados, de esta forma:

- unpacker.service

(Por algún motivo que se me escapa, Pastebin marca este archivo de texto como "potencialmente ofensivo", pero podéis estar tranquilos que no incluye nada raro.)

Ombi

Si somos varios en casa y queremos que todos puedan "pedir" películas o lo que sea sin peligro de hurgar en la configuración de nuestro servidor, podemos instalar Ombi. Este programa es algo así como un frontend para todos nuestros manejadores (tanto Sonarr como Radarr y Lidarr), de forma que los usuarios ya no necesitan acceder a cada uno por separado. Además incorpora un sistema de votación, lo que nos permite por ejemplo controlar a qué contenidos acceden los peques de la casa. Podemos instalarlo artesanalmente, como hemos hecho con Radarr y Sonarr, o usar un repositorio semi-oficial. En el caso de Ombi los permisos no son un problema, ya que trabaja directamente con las APIs de los manejadores de descargas y no crea ni mueve archivos, así que podemos utilizar el repositorio sin complicarnos mucho. Lo añadimos a nuestras listas (no os riais del nombre, ya he dicho que no es obra del equipo oficial):

# echo "deb [arch=armhf] repo.ombi.turd.me/stable/ jessie main" | tee "/etc/apt/sources.list.d/ombi.list"

Esto es para nuestro Raspberry OS de 32bit, que yo sepa el repositorio sólo soporta armhf y amd64. Para otras arquitecturas habría que instalar manualmente.

# wget "https://repo.ombi.turd.me/pubkey.txt"

# apt-key add pubkey.txt

Y a continuación refrescamos la caché de apt e instalamos el paquete Ombi:

# apt-get update && apt-get install ombi

Con el navegador visitamos descargame.local:5000 para la configuración inicial y seguimos el proceso guiado. Nuestro media server es Jellyfin, que para el caso es como Emby. Tendremos que crear otra clave API para Ombi en Jellyfin, ya que nos la pedirá durante la configuración:

Insertamos una cuenta de usuario (que será el administrador) y ya estamos listos para hacer login. Entonces pasaremos a configurar los diferentes apartados. En Ajustes/Ombi ponemos una BaseUrl que será "/ombi" y cambiamos el idioma (aunque con la mayoría de navegadores debería detectarlo automáticamente). En cuanto guardemos este ajuste puede que tengamos que reiniciar Ombi con:

# systemctl restart ombi.service

Entonces ya podremos acceder a través de descargame.local/ombi y procederemos a configurar los diferentes apartados. En TV usaremos Sonarr, en Movies será Radarr y en Music, Lidarr. Para cada uno nos pedirá las respectivas claves API, el hostname (que será localhost) y el puerto de escucha (8989 para Sonarr, 7878 para Radarr y 8686 para Lidarr), así como las Base Url de cada uno. Hecho esto podremos escoger perfiles de idioma y calidad en cada aplicación, y sus carpetas raíz. Comprobamos que todo va bien con el botón de "Test connectivity" y cuando estamos conformes pinchamos en "Submit". En Sonarr aseguráos de marcar la opción V3. En Radarr, en teoría, Ombi no soporta aún V3, pero lo he probado y funciona.

En "Ajustes/Media Server/Embi. . . " podemos modificar algunos parámetros extra de Jellyfin. En "Externally Facing Hostname" pondremos la URL de nuestro servidor de medios (en nuestro caso con el subpath, "http://descargame.local/jellyfin", y dejamos la Base Url vacía. Lo hacemos así debido al apaño de Nginx que hemos hecho antes con Jellyfin). Se supone que Ombi tiene un botón de "Ver en Emby/Jellyfin" en cada contenido, pero no he conseguido que funcione. No se si se debe a un fallo en Ombi (he visto en foros a algún otro usuario con el mismo problema) o al problema de Jellyfin que he mencionado antes con las Base URL. Tampoco es una pérdida crítica.

En el resto de la configuración las cosas son mas simples. Arriba, en "Gestión de usuarios", podemos añadir otras cuentas para los demás usuarios. Incluso tenemos una opción para importar usuarios de Jellyfin para ahorrarnos trabajo, pero prestad atención a los "roles" que asignáis. En Ajustes/Configuration/Customization se puede cambiar el nombre del servidor ("Application Name") y la URL externa, que en nuestro caso sería "http://descargame.local/ombi". También podríamos añadir un logo personalizado si nos hace ilusión. En Ajustes/Configuration/TMDB podemos hacer un amago de censura por palabras. Por último, tenemos la opción "Vote". Esto hace que las peticiones en Ombi no se añadan automáticamente al manejador de descargas respectivo, sino que requieran un número de votos antes de enviarse. Así nos aseguramos de que los crios no piden películas para adultos sin supervisión. En el menú superior de "Solicitudes" podemos revisar quién ha pedido qué.

El aspecto final sería este:

Obviamente, si instalamos Ombi nos conviene "cerrar" los demás manejadores de descargas con la opción de autenticación que tienen, para evitar que algún espabilado se salte el sistema de votación y añada cosas manualmente en ellos.

Monitorización del servidor

Monit nos servirá para comprobar el estado del sistema y asegurarnos de que los servicios no dejan de funcionar. También ayuda a controlar el uso de recursos y que el servidor no está sobrecargado. Ya lo hemos instalado al principio, así que nos queda configurarlo. Lo primero es activar la interfaz web para poder verlo en el navegador:

# nano /etc/monit/monitrc

Buscamos una línea que pone "set httpd port 2812 and" y quitamos la almohadilla del inicio. "Descomentamos" también en las siguientes líneas las que ponen "allow localhost" y "allow admin:monit". En esta última cambiamos "admin" por el nombre de usuario que queramos usar y "monit" por una contraseña razonablemente segura. También podemos añadir un email y servidor de correo para que nos envie alertas a nuestro mail si algo va mal. Recargamos el servicio con

# systemctl reload monit.service

y comprobamos que los ajustes tienen efecto visitando en el navegador la URL descargame.local/monit. Aún no hemos añadido nada que monitorizar, así que sólo veremos un escueto resumen del sistema: carga y uso de CPU, RAM y Swap.

Ahora vamos a añadir una serie de unidades dedicadas a comprobar que los servicios están funcionando, así como la salud del sistema. Sería un poco incómodo ponerlo aquí, así que me remito al archivo comprimido del final. Las unidades están en /etc/monit/conf-available y /etc/monit/conf.d. Además, se requieren algunos scripts adicionales en /etc/monit/scripts. Aseguráos de copiarlos o crearlos en el lugar correcto y de que estos scripts (los acabados en .sh) son ejecutables con "chmod +x <nombre del script>". Puede que necesitéis modificar un poco tales scripts para adaptarlos a vuestro sistema, ya que estos están escritos para mi Raspberry y disco externo. En particular, el script upgrades.sh es un poco chapucero, pero de momento funciona. Los scripts que miran la salud del disco externo pueden dar problemas, ya que algunos discos USB no tienen la capacidad SMART. Esto sucede especialmente con discos "portátiles" que no tienen alimentación propia.

Echadles un ojo a los scripts y las unidades para comprobar lo que hacen y configurar el punto en el que dan una alarma, como la ocupación de disco o la temperatura. También podéis modificar el intervalo de ejecución: por defecto, en Monit un "ciclo" son 120 segundos (2 minutos) así que si una unidad se activa cada 120 ciclos significa que se ejecuta la comprobación cada 240 minutos (4 horas).

Una vez todo copiado en su sitio, para activar cada monitor tenemos que hacer un enlace simbólico de /etc/monit/conf-available/<nombre_de_unidad> a /etc/monit/conf-enabled/, de esta manera:

# ln -s /etc/monit/conf-available/transmission-daemon /etc/monit/conf-enabled/

Y así con todas las unidades de monitorización que queramos activar. Los monitores de /etc/monit/conf.d no hace falta activarlos ya que están activados siempre, al ser parámetros de sistema. Para desactivar una unidad simplemente borraríamos el enlace simbólico. Al final recargamos Monit con

# systemctl reload monit.service

y observamos el resultado final:

Desde esta interfaz podemos parar, reiniciar o arrancar servicios monitorizados pinchando en cada monitor. Que sirva esto también como prueba del consumo de recursos del sistema "al ralentí", pero hay que tener en cuenta que va aumentando según añadimos medios a seguir y descargar.

Integración con un landing page

Lo único que nos queda es la integración final de la navegación web de nuestro servidor con un landing page adecuado para que la navegación por los diferentes servicios sea más intuitiva. Podemos hacer algo muy sencillo con cualquier editor WYSIWYG, o descargar una plantilla web de por ahí y modificarla a nuestro gusto. Por comodidad, he incluído en el archivo una plantilla simple que he montado a partir de un ejemplo de Bootstrapmade y que he modificado con imágenes de Pixabay. Esta plantilla ya tiene enlaces para todo lo que hemos instalado, si no usáis algo (los enlaces a Readarr o Bazarr, por ejemplo) o no os gusta cualquier cosa, podéis editar el index.html fácilmente.

Tan solo hay que copiar los archivos a /var/www/html y darles los permisos oportunos con

# chown -R www-data:www-data /var/www/html/*

Para personalizarla un poco de manera sencilla, podéis editar la primera etiqueta <title> en index.html y poner un logo de vuestro gusto en img/our-logo.png. Eso es todo. El landing de nuestro servidor:

Recursos

El archivo comprimido con los recursos extra que hemos usado en esta guía. Tened en cuenta que los permisos han de ser retocados si váis a usar los archivos tal cual: