Servidor completo usando Raspberry Pi

Introducción y objetivos

El objetivo de este post es crear un completo servidor casero que permita gestionar varios servicios usando una Raspberry Pi. Este servidor se conectará a la televisión de casa mediante el puerto HDMI y a internet mediante el router y nos permitirá entre otras cosas:

  • Gestionar desde el móvil la descarga de contenidos vía torrent.
  • La reproducción vídeo y audio en la TV de casa usando el móvil como control.
  • Streaming de vídeo y audio a cualquier dispositivo que se conecte a la red de casa; DLNA
  • La gestión de una biblioteca electrónica de libros y comics permitiendo su acceso fácil a ella a dispositivos móviles tipo tablets o libros electrónicos.
  • Descarga automática de capítulos de series

Raspberry Pi es un pequeño ordenador basado en arquitectura ARM con grandes posibilidades que corre un sistema basado en GNU/Linux.

Los servicios básicos que queremos tener son los siguientes:

  • Apache: servidor web para servir de interfaz de varios de los servicios.
  • Calibre: para la gestión de una biblioteca electrónica.
  • Transmission: para la descarga de torrents.
  • XBMC: para disponer de un completo entorno multimedia.
  • sickbeard: para la descarga automática de capítulos de una serie.

En mis pruebas he utilizado dos distribuciones diferentes de Linux adaptadas a Raspberry Pi ambas basadas en Debian: Raspbian y Raspmc. Debido a los problemas que supone la instalación de XBMC en Raspbian es recomendable usar Raspbmc.

Hardware para el sistema

Tras haber realizado varias pruebas voy a usar el siguiente hardware:

  • Una Raspberry Pi
  • Un adaptador de red inalámbrica USB para la conexión al router
  • Un cable HDMI para la conexión a la TV
  • Una tarjeta SD para instalar el arranque del sistema operativo de la Raspberry Pi
  • Una memoria USB para la instalación del sistema operativo
  • Un disco duro externo para el almacenamiento de los datos (vídeo, audio, etc)

Uno de los pasos claves del proceso es el separar el arranque del sistema operativo del resto del SO en lugar de instalar ambos en una tarjeta SD como es el procedimiento estándar. En mi experiencia, el uso de torrents hace que el número de escrituras sobre la tarjeta SD la corrompa rápidamente. El uso de una memoria USB mejora el rendimiento y evita este problema. Una opción es particionar el disco duro externo para instalar en él el sistema operativo de la Raspberry Pi y también los datos.

Sobre Raspbmc y su instalación

Raspbmc es una distribución de Linux basada en debian. Su gran ventaja es que viene ya preparada con una instalación funcional de XBMC lo que simplifica en gran medida los quebraderos de cabeza que suponen instalar este programa.Hay varias formas de instalar Raspbmc en una tarjeta SD. El método que recomiendo es descargar el script python install.py de http://www.raspbmc.com/wiki/user/os-x-linux-installation/ y seguir las instrucciones.
Este método facilita mucho la instalación de raspbmc y nos llevaría a tener instalado Raspbmc en la tarjeta SD, sin embargo, se va a mover el SO a un USB para usar sólo la SD como arranque (/boot). La instalación del sistema en el USB es tan simple como introducir una memoria USB en el momento de arrancar por primera vez la Raspberry Pi.

Instalación y configuración de software adicional

Vía apt se instalará transmission, apache y calibre

apt-get update
apt-get install transmission-daemon apache2 calibre

Se cambia el nombre de host

vi /etc/hostname
mihost
vi /etc/hosts
se sustituye raspbmc por mihost mihost.noip.me en el loopback 127.0.1.1

Configuración de apache2

En la ruta /etc/apache2/sites-available se editará el fichero default
vi /etc/apache2/sites-available/default

<VirtualHost *:80>
        ServerAdmin pi@ratoncio.no-ip.org

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        <Directory /var/www/ficheros/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride AuthConfig
                Order allow,deny
                allow from all
        </Directory>
        <Directory /var/www/biblioteca/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #para calibre y transmission
        RewriteEngine on

        ProxyPass /descargas/ http://localhost:9999/descargas/
        ProxyPass /descargas http://localhost:9999/descargas
        SetEnv force-proxy-request-1.0 1
        SetEnv proxy-nokeepalive 1
</VirtualHost>

Se habilitan los mods de apache necesarios para hacer rewrite, necesario para poder redirigir a distintos puertos calibre y transmission desde apache.

a2enmod proxy rewrite proxy_http

Se crea la estructura web en /var/www
Se crea un directorio en /var/www/biblioteca con usuario y grupo www-data

Configuración de calibre

En la ruta /home/pi se crea un script calibre-server que permitirá lanzar y parar calibre en modo server. Calibre correrá en un puerto al que se redirigirá desde la página web que servimos con apache.

#!/bin/bash
export LANG=es_ES.UTF-8
if [ $# -eq 1 ];then
case $1 in
start)
calibre-server --with-library=/media/Almacen/biblioteca/ --daemonize --port 10001 --url-prefix /biblioteca ;
echo "La biblioteca esta abierta";
;;
stop)
#killall calibre-server;
kill -9 `ps -fea|grep calibre-server|grep -v grep|awk '{print $2}'`;
echo "La biblioteca esta cerrada";
;;
status)
RESUL=`ps aux|grep -v grep|grep "calibre-server"|wc -l`;
if [ $RESUL -eq 0 ];then
echo "La biblioteca esta cerrada";
else
echo "La biblioteca esta abierta";
fi;
;;
*)
echo "Opciones: start|stop"
;;
esac;
fi;

El control de acceso se hace mediante un fichero .htaccess que se encuentra en /var/www/biblioteca con este contenido:

AuthUserFile /home/pi/pass-htaccess-apache
AuthType Basic
AuthName "Haz login"
Require user javi mariola
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://localhost:10001/biblioteca/$1 [proxy]

Se puede ver que el script lanza en modo daemon calibre en el puerto 10001 con la ruta que hayamos configurado con la biblioteca. Al acceder vía web a la ruta mihost.noip.me/biblioteca se nos redirigirá al server corriendo en el puerto 10001 con calibre.

Configuración de transmission-daemon

Para emplear torrents se configurará transmission-daemon.

Se edita el fichero /var/lib/transmission-daemon/info/settings.json (es un enlace a /etc/transmission-daemon/settings.json). Para que este fichero se edite correctamente el servidor transmission debe estar parado así:

service transmission-daemon stop

{
    "alt-speed-down": 50,
    "alt-speed-enabled": true,
    "alt-speed-time-begin": 420,
    "alt-speed-time-day": 127,
    "alt-speed-time-enabled": true,
    "alt-speed-time-end": 0,
    "alt-speed-up": 10,
    "bind-address-ipv4": "0.0.0.0",
    "bind-address-ipv6": "::",
    "blocklist-enabled": false,
    "blocklist-url": "http://www.example.com/blocklist",
    "cache-size-mb": 4,
    "dht-enabled": true,
    "download-dir": "/media/Almacen/transmission-daemon/downloads",
    "download-limit": 100,
    "download-limit-enabled": 0,
    "download-queue-enabled": true,
    "download-queue-size": 12,
    "encryption": 0,
    "idle-seeding-limit": 30,
    "idle-seeding-limit-enabled": false,
    "incomplete-dir": "/media/Almacen/transmission-daemon/incomplete",
    "incomplete-dir-enabled": false,
    "lpd-enabled": false,
    "max-peers-global": 200,
    "message-level": 2,
    "peer-congestion-algorithm": "",
    "peer-limit-global": 300,
    "peer-limit-per-torrent": 60,
    "peer-port": 51413,
    "peer-port-random-high": 65535,
    "peer-port-random-low": 49152,
    "peer-port-random-on-start": false,
    "peer-socket-tos": "default",
    "pex-enabled": true,
    "port-forwarding-enabled": true,
    "preallocation": 1,
    "prefetch-enabled": 1,
    "queue-stalled-enabled": true,
    "queue-stalled-minutes": 30,
    "ratio-limit": 2,
    "ratio-limit-enabled": false,
    "rename-partial-files": true,
    "rpc-authentication-required": true,
    "rpc-bind-address": "0.0.0.0",
    "rpc-enabled": true,
    "rpc-password": "contraseniaservicio",
    "rpc-port": 9999,
    "rpc-url": "/descargas/",
    "rpc-username": "descargas",
    "rpc-whitelist": "127.0.0.1",
    "rpc-whitelist-enabled": false,
    "script-torrent-done-enabled": true,
    "script-torrent-done-filename": "/var/lib/transmission-daemon/script/avisaTorrent",
    "seed-queue-enabled": false,
    "seed-queue-size": 10,
    "speed-limit-down": 350,
    "speed-limit-down-enabled": false,
    "speed-limit-up": 20,
    "speed-limit-up-enabled": true,
    "start-added-torrents": true,
    "trash-original-torrent-files": false,
    "umask": 18,
    "upload-limit": 100,
    "upload-limit-enabled": 0,
    "upload-slots-per-torrent": 14,
    "utp-enabled": true,
    "watch-dir": "/media/Almacen/transmission-daemon/blackhole",
    "watch-dir-enabled": true

}

A continuación se edita el fichero /etc/init.d/transmission-daemon y se indica en USER que el usuario será pi

Y se hace chown -R pi:pi /var/lib/transmission-daemon/* y chown pi:pi /etc/transmission-daemon/settings.json

Configuración de NFS

Hacer que cargue nfs en el arranque.

apt-get install nfs-kernel-server
update-rc.d rpcbind defaults
update-rc.d nfs-common defaults
update-rc.d nfs-kernel-server defaults

Se definen los exports

/media/Almacen *(ro,sync,no_subtree_check,insecure,all_squash,anonuid=0,anongid=0)

Se refrescan los exports
exportfs -ra

Configuración Sickbeard

sudo apt-get install git-core
git clone git://github.com/echel0n/SickBeard-TVRage.git /var/local/sickbeard
cd /var/local/sickbeard
python SickBeard.py -d

Sickbeard arranca en el puerto 8081. En un navegador entramos en dicha dirección y seleccionamos config y general.
Desactivar Launch Browser pues el acceso será web.
En web interface se puede configurar un user, passwd y nuevo puerto. Solo cambiaré el puerto por otro (20001) pues la autenticación la hago con htacess
En search providers se chequean los gratuitos sin cuenta ( NZBs, Sick Beard y Womble)
En post processing se quita la opción de keep original files y se marcan las move associated files y rename episodes. En name pattern seleccionamos “s02e03 – Ep Name”
En metadata seleccionamos XBMC (12+ pues la versión de Raspbmc equivale a la 12 o superior) y chequeamos los metadatos (todos menos los season all)
En config notifications seleccionamos XBMC y chequeamos notify on download, update library, introducimos la ip y el puerto (192.168.1.124:1234)
En search options, torrent search activamos la búsqueda de torrents, el método blackhole y definimos una ruta para el directorio blackhole (/media/Almacen/transmission-daemon/blackhole)
Ya se puede trabajar seleccionando add existing shows si ya tenemos parte de la serie descargada o add shows si aún no.

Anuncios
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: