Seedbox en la Raspberry Pi con Arch Linux

Imagen

Después del post sobre cómo instalar Arch Linux en la Raspberry Pi, hoy toca hacer el tutorial de cómo hacer un seedbox en esta plaquita que un amigo me llevaba un tiempo pidiendo.

Bueno, como era esperable, este post, está lleno de líneas de comandos xD y se que son agotadoras, mecánicas y aburridas, pero es que tengo que soltar unos cuantos posts llenos de código para liberarme de tenerlo en la cabeza. Como dijeron en un programa del microkernel, yo tengo un blog para mí, para escribir consejos, tutoriales y demás cosicas, que a mí mismo me sirvan y a los demás también, un sitio donde pueda guardar toda la info. que uso a menudo o consultar cómo se hacía X cosa.

Seguramente diréis que no tiene mucha potencia como para mantener un seedbox, bueno, tiene poca RAM (sobretodo la mía que sólo tiene 256 MB xD) lo cual es un inconveniente si vamos a tener muchos torrents activos, pero con 256 MB da para bastantes.
En cuanto al procesador, 700 Mhz también es poco (por unos 35 € que queremos?), pero no he tenido problemas de velocidad.

Bueno, como habéis visto en la imagen usaremos:

  • Lighttpd: como servidor web (podéis usar Apache o cualquier otro), ya que es de los más ligeros para nuestra bestia parda y apenas me ha dado problemas.
  • rTorrent: como cliente de torrents en consola.
  • ruTorrent: interfaz web para rTorrent, muy comoda, bonita y funcional.

Let’s go:

Paso 1: Instalar servidor web (Lighttpd)

Antes de nada actualizamos los repositorios:

sudo pacman -Sy

Instalamos Lighttpd:

sudo pacman -S lighttpd

Vamos a iniciar el servidor a ver si funciona:

sudo systemctl start lighttpd

Una vez iniciado, vamos al navegador e introducimos la IP local de la RPi y deberíais obtener esto:

Imagen

Otra forma para ver si el servidor está corriendo, es con el siguiente comando:

systemctl status lighttpd

Perfecto!, ya tenemos funcionando el servidor web.

Paso 2: Instalar y configurar rTorrent

Instalamos rTorrent:

sudo pacman -S rtorrent

Vamos a configurar algunas opciones:

  1. Copia el esqueleto del archivo de configuración a tu home:
    cp /usr/share/doc/rtorrent/rtorrent.rc ~/.rtorrent.rc
  2. Creamos dos directorios en nuestro home, Torrents (para los torrents finalizados) y .session (donde almacenará el progreso de los mismos y demás configuraciones):
    mkdir ~/Torrents && mkdir ~/.session
  3. Edita el archivo ~/.rtorrent.rc:
    nano ~/.rtorrent.rc
  4. Escribimos el directorio de descargas y temporales (tenemos que poner rutas absolutas -> /home/[usuario]/Torrents) y descomentamos la línea:
    # Default directory to save the downloaded torrents.
    directory = /home/bio/Torrents
    
    # Default session directory. Make sure you don't run multiple instance
    # of rtorrent using the same session directory. Perhaps using a
    # relative path?
    session = /home/bio/.session
    
    
  5. Configuramos el puerto (o rango de puertos) de escucha, se recomienda poner puertos por encima del 49152, que son puertos no reservados:
    port_range = 49164-49164
  6. Podemos habilitar el cifrado si queremos más privacidad:
    encryption = allow_incoming,try_outgoing,enable_retry
  7. Hay una opción llamada DHT, que sirve para conseguir clientes cuando el tracker de un torrent está caido o no tiene suficientes clientes, muy usado en trackers públicos pero conviene tenerlo desactivado en trackers privados, si lo activamos, hay que indicarle un puerto UDP:
    # Enable DHT support for trackerless torrents or when all trackers are down.
    # May be set to "disable" (completely disable DHT), "off" (do not start DHT),
    # "auto" (start and stop DHT as needed), or "on" (start DHT immediately).
    # The default is "off". For DHT to work, a session directory must be defined.
    #
    dht = auto
    
    # UDP port to use for DHT.
    #
    dht_port = 6881
    
    
  8. La última opción del archivo es peer exchange (intercambio de pares), que comunica los clientes conectados a un usuario con otro usuario conectado, conviene desactivarlo en trackers privados:
    # Enable peer exchange (for torrents not marked private)
    #
    peer_exchange = yes
    
    

Podemos probar que funciona rTorrent iniciándolo:

rtorrent

Si todo ha salido bien veremos lo siguiente:

rtorrent1

Por último vamos a crear un servicio de Arch Linux para iniciar y parar rTorrent a nuestro antojo e instalaremos el paquete screen para ocultar la interfaz de consola de rTorrent.

Instalamos screen:

sudo pacman -S screen

Creamos el servicio para rTorrent:

sudo nano /etc/systemd/system/rtorrent@.service

Copiamos lo siguiente:


[Unit]
Description=rtorrent Service
After=network.target

[Service]
Type=forking
User=%i
ExecStart=/usr/bin/screen -dmS rtorrent rtorrent
ExecStop=/usr/bin/screen -S rtorrent -X quit

[Install]
WantedBy=multi-user.target

Ahora usaremos estos comandos:

Iniciar rTorrent:

sudo systemctl start rtorrent@nombre_usuario

Estado de rTorrent:

systemctl status rtorrent@nombre_usuario

Parar rTorrent:

sudo systemctl stop rtorrent@nombre_usuario

Con esto, ya tenemos rTorrent configurado, ahora nos falta la interfaz web.

Paso 3: Instalar y configurar ruTorrent

En este paso vamos a instalar la interfaz web para rTorrent.

ruTorrent no está en los repositorios oficiales de Arch Linux, pero sí que se encuentra en AUR (repositorios no oficiales), así que vamos a bajarlo de AUR, aunque si lo prefieres puedes bajarlo manualmente desde su página.

Para instalar paquetes de forma cómoda desde AUR recomiendo instalar yaourt fakeroot (dependencia necesaria para muchos paquetes), además necesitaremos instalar unos paquetes para utilizar ruTorrent con PHP sin problemas:

sudo pacman -S yaourt fakeroot mod_fastcgi php-cgi

Ahora usaremos yaourt para instalar rutorrentrutorrent-plugins:

yaourt -S rutorrent rutorrent-plugins

Veremos este mensaje, escribimos «n«:


rutorrent 3.5-1 (lun sep 7 21:59:27 CEST 2009)
(Paquete sin soporte: podría ser peligroso!)
==> Quiere editar PKGBUILD? [S/n] ("A" para anular)
==> -----------------------------------------------
==> n

Nos preguntará si queremos seguir compilando rutorrent, respondemos «s«:


==> Continuar compilando rutorrent? [S/n]
==> -------------------------------------
==> s

yaourt1

Cuando termine respondemos «s«:


==> Continuar la instalación de rutorrent? [S/n]
==> [v]isualizar los contenidos del paquete [c]omprobar el paquete con namcap
==> -------------------------------------------------------------------------
==> s

Una vez instalado rutorrent pasará a la instalación de rutorrent-plugins y seguimos el mismo proceso.

Ahora toca la configuración del servidor web para que muestre la página de ruTorrent, editamos el archivo /etc/lighttpd/lighttpd.conf:

sudo nano /etc/lighttpd/lighttpd.conf

Cambiamos

server.document-root    = "/srv/http/"

por

server.document-root    = "/usr/share/webapps/rutorrent/"

Comentamos la línea que empieza por mimetype.asign:

#mimetype.assign                = ( ".html" => "text/html" . . .

Y debajo suya pegamos este trozo de asociaciones MIME para que el servidor web sepa cómo tratar cada tipo de archivo:


mimetype.assign = (
 ".rpm" => "application/x-rpm",
 ".pdf" => "application/pdf",
 ".sig" => "application/pgp-signature",
 ".spl" => "application/futuresplash",
 ".class" => "application/octet-stream",
 ".ps" => "application/postscript",
 ".torrent" => "application/x-bittorrent",
 ".dvi" => "application/x-dvi",
 ".gz" => "application/x-gzip",
 ".pac" => "application/x-ns-proxy-autoconfig",
 ".swf" => "application/x-shockwave-flash",
 ".tar.gz" => "application/x-tgz",
 ".tgz" => "application/x-tgz",
 ".tar" => "application/x-tar",
 ".zip" => "application/zip",
 ".mp3" => "audio/mpeg",
 ".m3u" => "audio/x-mpegurl",
 ".wma" => "audio/x-ms-wma",
 ".wax" => "audio/x-ms-wax",
 ".ogg" => "application/ogg",
 ".wav" => "audio/x-wav",
 ".gif" => "image/gif",
 ".jar" => "application/x-java-archive",
 ".jpg" => "image/jpeg",
 ".jpeg" => "image/jpeg",
 ".png" => "image/png",
 ".xbm" => "image/x-xbitmap",
 ".xpm" => "image/x-xpixmap",
 ".xwd" => "image/x-xwindowdump",
 ".css" => "text/css",
 ".html" => "text/html",
 ".htm" => "text/html",
 ".js" => "text/javascript",
 ".asc" => "text/plain",
 ".c" => "text/plain",
 ".cpp" => "text/plain",
 ".log" => "text/plain",
 ".conf" => "text/plain",
 ".text" => "text/plain",
 ".txt" => "text/plain",
 ".dtd" => "text/xml",
 ".xml" => "text/xml",
 ".mpeg" => "video/mpeg",
 ".mpg" => "video/mpeg",
 ".mov" => "video/quicktime",
 ".qt" => "video/quicktime",
 ".avi" => "video/x-msvideo",
 ".asf" => "video/x-ms-asf",
 ".asx" => "video/x-ms-asf",
 ".wmv" => "video/x-ms-wmv",
 ".bz2" => "application/x-bzip",
 ".tbz" => "application/x-bzip-compressed-tar",
 ".tar.bz2" => "application/x-bzip-compressed-tar",
 # default mime type
 "" => "application/octet-stream",
 )

Tenemos que activar PHP para Lighttpd, añadimos estas líneas en el mismo fichero:

# Necesario para Lighttpd + PHP
server.modules += ( "mod_fastcgi" )

fastcgi.server = ( ".php" => ((
 "bin-path" => "/usr/bin/php-cgi",
 "socket" => "/tmp/php.socket"
 )))

Permitimos la ejecución de archivos PHP en las carpetas de rTorrent, editamos /etc/php/php.ini:

sudo nano /etc/php/php.ini

Bajamos a la línea 307 y la modificamos para que quede así:

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/usr/bin/

Reiniciamos el servidor web:

sudo systemctl restart lighttpd

Ahora probamos a meternos en la IP de la RPi y nos debería de salir esto:rutorrent1De momento no tiene conexión con rTorrent, eso es lo que viene ahora.

Paso 4: Conexión rTorrent – ruTorrent

  1. Editamos el archivo ~/.rtorrent.rc:
    nano ~/.rtorrent.rc

    Añadimos las siguientes líneas al final del mismo:

    # Socket CGI
    scgi_port = localhost:5050
    
  2. Editamos el archivo /usr/share/webapps/rutorrent/conf/config.php:
    sudo nano /usr/share/webapps/rutorrent/conf/config.php

    Cambiamos el puerto de la línea 30 por lo siguiente:

    $scgi_port = 5050;
  3. Editamos el archivo /etc/lighttpd/lighttpd.conf:
    sudo nano /etc/lighttpd/lighttpd.conf

    Añadimos este trozo de código justo ANTES del trozo que hemos puesto hace un momento:

    # Comunicación rTorrent <-> ruTorrent
    server.modules += ( "mod_scgi" )
    
    scgi.server = (
     "/RPC2" =>
     ( "127.0.0.1" =>
     (
     "host" => "127.0.0.1",
     "port" => 5050,
     "check-local" => "disable"
     )
     )
     )
    
  4. Por si las moscas, podemos hacer estos dos comandos, que hacen que el usuario http sea el propietario de las carpetas de ruTorrent para evitar problemas de permisos, aunque creo que es innecesario, los pongo por si acaso:
    sudo chown -R http /usr/share/webapps/rutorrent
    sudo chown -R http /etc/webapps/rutorrent
    

Con la actualización 3.6 de ruTorrent ha habido cambios respecto a la carpeta de temporales, siendo necesario crear una subcarpeta en /tmp con los permisos necesarios:

mkdir /tmp/rutorrent && chmod 777 /tmp/rutorrent

Ahora modificamos la línea que pone $tempDirectory = null; en el archivo /usr/share/webapps/rutorrent/conf/config.php por:

$tempDirectory = "/tmp/rutorrent/";

Todo listo! Reiniciamos los servicios de rtorrent lighttpd:

sudo systemctl restart rtorrent@nombre_usuario
sudo systemctl restart lighttpd

Recargamos la página de ruTorrent (IP de la RPi) y deberíamos ver lo siguiente (nótese que han aparecido más iconos y unos cuantos errores, ahora lo arreglaremos):
rutorrent2
Si os aparece eso, es que la conexión con rTorrent se ha hecho bien 🙂

Paso 5: Configuración final de plugins y arreglo de errores

  • Problema: rTorrent no puede acceder al programa ‘id’.
    Solución:

    • Editamos el servicio de lighttpd:
      sudo nano /usr/lib/systemd/system/lighttpd.service
    • Cambiamos la línea que dice
      PrivateTmp=true

      por

      PrivateTmp=false
    • Recargamos los servicios, ya que lo hemos modificado:
      sudo systemctl --system daemon-reload
    • Y reiniciamos lighttpd:
      sudo systemctl restart lighttpd
  • Problema: El Webserver no puede acceder al programa ‘mediainfo/ffmpeg’ + Error rutracker_check
    Solución:

    • Si vamos a usar los plugins de capturas de pantalla e información multimedia, sólo tenemos que instalar los paquetes (que incluyen bastantes dependencias, ~125 MB):
      sudo pacman -S ffmpeg mediainfo
    • Si no queremos usarlos, podemos desactivarlos:
      sudo nano /usr/share/webapps/rutorrent/conf/plugins.ini

      Buscamos [mediainfo][screenshots] [rutracker_check] y lo cambiamos a:

      [mediainfo]
      enabled = no
      [screenshots]
      enabled = no
      [rutracker_check]
      enabled = no
      
  • Problema: No se puede localizar unzip/unrar.
    Solución:

    • Tan fácil como instalar ambos paquetes:
      sudo pacman -S unzip unrar

Paso 6: Autentificación y SSL

Si todo ha ido bien, deberíamos tener el servidor funcionando y podemos acceder a ruTorrent. Lo que vamos a hacer ahora es poner un usuario y contraseña y si queremos un certificado SSL para entrar por HTTPS.

  1. Tenemos que instalar Apache (que es otro servidor web, no vamos a utilizarlo, simplemente vamos a utilizar una herramienta que proporciona, htdigest):
    sudo pacman -S apache
  2. Creamos el archivo que contiene el usuario y la contraseña cifrada:
    sudo htdigest -c /etc/lighttpd/.auth 'descripción_mostrada_al_entrar_a_la_web' nombre_usuario

    Introducimos la contraseña que queramos para acceder a la web.

  3. Editamos la configuración de Lighttpd:
    sudo nano /etc/lighttpd/lighttpd.conf
  4. Vamos a pegar un trozo de código justo antes que este:
    # Necesario para Lighttpd + PHP
    server.modules += ( "mod_fastcgi" )
    

    Lo que vamos a pegar es esto (donde va a estar la ruta del archivo con el usuario, contraseña y mensaje de bienvenida):

    # Autorización servidor web
    server.modules += ( "mod_auth" )
    
    auth.debug = 0
    auth.backend = "htdigest"
    auth.backend.htdigest.userfile = "/etc/lighttpd/.auth"
    
    auth.require = ( "/" => (
     "method" => "digest",
     "realm" => "descripción_mostrada_al_entrar_a_la_web",
    "require" => "valid-user"
    ))
    
  5. Reiniciamos Lighttpd:
    sudo systemctl restart lighttpd

Ya podemos probar si al entrar al ruTorrent nos pide usuario y contraseña.

autentificacion1

Ya tenemos la contraseña puesta, ahora podemos poner un certificado SSL para que toda la información entre la RPi y nuestro PC vaya cifrada.

  1. Creamos el directorio para los certificados:
    sudo mkdir /etc/lighttpd/certs
  2. Creamos el certificado:
    sudo openssl req -new -x509 -newkey rsa:2048 -keyout /etc/lighttpd/certs/lighttpd.pem -out /etc/lighttpd/certs/lighttpd.pem -days 730 -nodes

    Nos pedirá algunos datos, podemos rellenar los que queramos o dejarlos vacíos.

  3. Configuramos el servidor web (por última vez xDD):
    sudo nano /etc/lighttpd/lighttpd.conf
  4. Añadimos este código antes de # Autorización servidor web:
    # Encriptación SSL
    #$SERVER["socket"] == ":443" {
     ssl.engine = "enable"
     ssl.pemfile = "/etc/lighttpd/certs/lighttpd.pem"
    #}
  5. Modificamos la  línea tal que así, para que se conecte por el puerto 443 que es el de SSL:
    server.port = 443
  6. Reiniciamos el servidor web:
    sudo systemctl restart lighttpd

Si ahora nos metemos en ruTorrent, nos saldrá un aviso de que no es una página de confianza, aceptamos los riesgos o como ponga en vuestro navegador y ale, ya está, conexión cifrada.

Resultado final:

final1

Espero que os haya gustado jeje
Después del último post me tomé un descanso, que estaba liado con la uni, pero bueno, aquí tenéis este post 🙂

Pronto más y mejor.

14 comentarios en “Seedbox en la Raspberry Pi con Arch Linux

  1. Pingback: Instalación base ArchLinux ARM en Raspberry Pi | Bio Linux
  2. WOW, WOW, WOW!
    Grandísimo post, te has lucido. Muchas gracias una vez más por colaborar y despejar mis dudas exactas. Por otro lado, me gustaría que hicieras un post dónde explicaras como agregar SSL a el servicio que queremos montar. Me vendría de perlas ya que aun no entiendo muy bien como se hace este procedimiento. Buscaré en tu blog, quizás y ya lo hiciste y yo aquí molestandote. En caso contrario, creeme que te agradecería bastante si realizaras la petición que te he dado. Saludos hermano.

    • Muchas gracias por el comentario 🙂

      Lo de SSL lo explico en el paso 6 (Autentificación y SSL), ahí tienes que bajar hasta donde dice: «Ya tenemos la contraseña puesta, ahora podemos poner un certificado SSL para que toda la información entre la RPi y nuestro PC vaya cifrada.».

      Por cierto, no se si el tutorial seguirá funcionando bien, porque hace un tiempo salío la versión 3.6 de ruTorrent y creo que cambia alguna cosa, pero bueno, cuando tenga tiempo libre lo actualizaré.

      Y para nada es una molestia jaja, de hecho te agradezco el comentario.

      • Hombre, creí que el procedimiento sería eso y un poco más extenso si deseabamos montar algun otro servicio. Muchas gracias entonces, sigue así qur ya te agregue a mi lista de RSS, excelente post y excelente blog. Ya solamente falta que llegue mi Pi para meterle trasteo intenso, jajaja. ¡Saludos! ¡Un abrazo!

  3. un error en el paso 3

    curl error: Peer certificate cannot be authenticated with given CA certificates
    error: target not found: rutorrent-plugins
    error: target not found: rutorrent

    • Hmmm, raro, no te deja descargar los paquetes porque no tienes los certificados válidos.

      Prueba primero a hacer una actualización completa: sudo pacman -Syu
      Y por si no están instalados (lo cual dudo), instala los certificados CA: sudo pacman -S ca-certificates

      • Algo le pasa al yaourt, si, siempre me devuelve error con los plugins

        ==> Creating package «rutorrent-plugins»…
        -> Generating .PKGINFO file…
        -> Generating .MTREE file…
        -> Compressing package…
        /usr/bin/makepkg: line 1915: 1041 Killed ${COMPRESSXZ[@]:-xz -c -z -}
        bsdtar: Write error
        ==> ERROR: Failed to create package file.
        ==> ERROR: Makepkg was unable to build rutorrent-plugins.
        ==> Restart building rutorrent-plugins ? [y/N]
        ==> ——————————————
        ==>

      • Ayy eso mismo creo que me pasó a mi también, pero creo que era con otro paquete.

        Creo que la solución es la que pongo en el paso 6 (Creación de espacio de intercambio (SWAP)) de la guía de instalación de Arch Linux.

        El problema, si no recuerdo mal, era que se quedaba sin memoria RAM o sin espacio en disco para los temporales, si es la primera lo arreglarás con la solución que te he dado, si no dime y hacemos algo más de magia para los temporales.

  4. Muy buenas.

    Ante todo felicitar al autor por esta increíble y completa guía. Me ha gustado mucho y me ha ayudado mucho.

    He seguido todos los pasos y he conseguido montar el servidor sin problemas, ahora bien, en el último apartado he encontrado un pequeño problema:

    En el apartado de la configuración de SSL el tutorial dice que debemos agregar éste código:

    # Encriptación SSL
    #$SERVER[«socket»] == «:443» {
    ssl.engine = «enable»
    ssl.pemfile = «/etc/lighttpd/certs/lighttpd.pem»
    #}

    Si agrego dicho código, el servidor no me permite realizar conexiones, me reinicia la conexión(no se porque).

    Por lo tanto, he probado a realizar lo mismo, pero eliminando las almohadillas de $SERVER y de la llave final, ésto es:

    # Encriptación SSL
    –> $SERVER[«socket»] == «:443» {
    ssl.engine = «enable»
    ssl.pemfile = «/etc/lighttpd/certs/lighttpd.pem»
    –> }
    (Flechas no incluidas)

    Al realizar ésto, el servidor funciona bien pero la conexión no es encriptada.

    ¿Algúna forma? ¿Estoy haciendo algo mal?

    Muchas gracias.

Replica a Elektro Cancelar la respuesta