miércoles, 1 de enero de 2014

Raspberry + Owncloud + Transmission = ¡Archivos para todos!

Molesybits ya le ha dedicado algunas entradas a la Raspberry Pi y a sus grandes ventajas. Ahora, tras cacharrear con esta maravilla, quiero aportar algo más a este tema. En esta entrada trataremos sobre cómo instalar nuestra propia nube "tipo Dropbox" en la Raspberry y de las posibilidades que nos ofrece el sumarle a ello las descargas de torrents con Transmission. ¿Estáis preparados? Venga, que es muy divertido.

Ainssss, Raspberry ...

0. Preparando la Raspberry Pi

Los materiales que vas a necesitar para utilizar crear tu propio servidor de archivos, de copias de seguridad y de descargas serán:

  • Raspberry Pi. Se puede comprar en Amazon por unos 37 €, pero si estás en Valencia, he descubierto que en Electrónica Burriana la venden por un precio muy parecido. También allí puedes encontrar complementos como cajas, ventiladores, ...
  • Cable de alimentación mico-USB, vale el de la mayoría de los teléfonos móviles actuales.
  • Tarjeta SD de al menos 4 GB.
  • Hub alimentado para conectar los dispositivos USB (ratón, teclado, discos, ...)
  • Cable ethernet para darle conexión a la Pi.
  • Ordenador con Linux conectado a la misma red que la Pi.
  • Mucha paciencia, un mol de ganas por aprender, cafeína y música.

Cuando ya lo tengas todo, llega el primer momento importante: preparar la tarjeta SD para que arranque la Pi. Yo voy a utilizar  Raspbian como sistema operativo, así que me he descargado la imagen desde la web oficial. Después he utilizado el programa ImageWriter para volcar la imagen en la SD y ¡ya podemos insertar la tarjeta en la placa y conectarla!

Todo empieza aquí

1. Domesticando a la fiera

En cuanto insertes la SD, conectes la placa y el router le dé IP, empezará la fiesta. Nos conectaremos a ella por ssh, así que tendremos que conocer qué IP le ha dado nuestro router. Eso lo puedes hacer consultando el portal web de tu router (http://192.168.1.1, en mi caso) o por telnet, pidiendo la tabla del arp. Cuando ya conozcas la IP, escribe en la terminal

ssh pi@IPdelapi

Te pedirá la contraseña, que por defecto es raspberry (se puede cambiar).

  Después ejecuta

sudo raspi-config

Y aparecerá el menú de configuración. Aquí sólo voy a tomar la primera opción para que el sistema ocupe toda la tarjeta SD. A continuación, reinicia, deja que la Pi tome IP, averigua cuál es y vuelve a conectarte por ssh. Actualiza entonces el sistema con

sudo apt-get update && sudo apt-get upgrade

Ya es hora de que hagamos algunos cambios en la Rasbperry Pi. Para empezar, su IP es variable porque se la asigna el DHCP del router, así que vamos a fijarla. Yo he escogido la IP 192.168.1.7, pero puedes hacerle tomar otra. Para ello editaremos el archivo interfaces mediante:

sudo nano /etc/network/interfaces


Ése archivo te tiene que quedar así:



Después reinicia la Pi (sudo reboot), y si todo ha ido bien, vuelve a hacerle ssh, este vez a la nueva IP. Puede que te aparezca entonces el típico anuncio de que la "host key" ha sido cambiado, de manera que tendrás que borrar la antigua con el comando:

ssh-keygen -R tuIPestática

Una vez fijada la IP, vamos a cambiarle el nombre a la Raspberry Pi. Si escribes hostname en la terminal de ssh, verás que te devuelve un soso "raspberry", así que modificaremos el archivo hosts con:

sudo nano /etc/hosts

y sustituiremos el "raspberry" de la última línea por el nombre que queramos. Yo he elegido como nombre "E7". Luego, tecleamos

sudo nano /etc/hostname

y editamos el archivo cambiando "raspberry" por el nombre que quieres que tenga tu máquina. ¡Ya hemos acabado de domesticar a la fiera! Sólo queda volver a reiniciar con el consabido sudo reboot.

2. Montando un disco USB

Como unidad de almacenamiento voy a utilizar un pendrive. Antes de nada, me he preocupado de formatearlo a ext4 con gparted para así evitarme algunos problemas. Como también he pensado conectar a la Raspberry Pi un disco duro externo de mayor capacidad, he adquirido un hub alimentado.

Hay que definir un punto de montaje para el disco, así que hay que crear el directorio. En mi caso he tecleado:

sudo mkdir /media/pendrive

y ya sé que el disco se montará en esa carpeta.

Una vez conectado el disco a la placa, con

sudo fdisk -l

podrás conocer información sobre él. Con ella modifica el archivo fstab para asegurarte que siempre se monta el disco tras cada reinicio.

sudo nano /etc/fstab

Verás una tabla con las unidades existentes en el sistema. Tendrás que añadir otra entrada correspondiente al disco USB, que en mi caso he dejado de la siguiente manera:
dev/sda1 /mnt/usbdisk auto defaults,user 0 1

Guarda los cambios, cierra el editor y monta la nueva unidad con el comando:

sudo mount -a

Dale los permisos a la carpeta de montaje con:

sudo chmod 777 /media/pendrive

y ya puedes reiniciar la Pi para comprobar que los cambios se han realizado.


3. Instalando el servidor web

El propósito de este tutorial es el de crear nuestra propia nube de archivos y nuestro propio servidor de descargas. Y esto corre sobre un servidor web, así que debemos de instalarle a la Raspberry Pi los paquetes necesarios para convertirla en una web server.


Para ello, instala apache2, php5 y algunos programas y librerías necesarios

sudo apt-get install apache2 php5 php5-intl php5-sqlite php5-mysql php5-pgsql smbclient php5-curl curl libcurl3 php5-common php5-gd php5-cgi php-pear libapache2-mod-php5 php-apc openssl-blacklist

Reinicia el servicio para comprobar que todo ha ido bien

sudo /etc/init.d/apache2 restart

Y compruébalo introduciendo en el navegador la dirección que hayas escogido para tu placa en el punto 1.


Si ves el típico mensaje "It works!", ya puedes pasar al punto 4.

4. Instalación de owncloud

Owncloud es un servicio libre que permite el almacenamiento y aplicaciones en línea, algo así como un Dropbox casero y totalmente gratuito. Esto permite que puedas tener todas las gigas que quieras en tu "nube personal". Lo único que hace falta para disfrutar de Owncloud es de un servidor y, claro, acabamos de ver cómo se instala uno en nuestra Raspberry Pi, así que ¿por qué no instalar Owncloud y olvidarnos de servicios tipo Dropbox?


Manuales para instalar Owncloud he encontrado muchos, pero no todos son lo buenos que cabría esperar. Por ello, he partido del mejor que he encontrado, éste. A partir de ahí he realizado modificaciones en función de mis conveniencias, pero que sepas que también puedes acudir a El blog de Ignasi para configurar tu Raspberry.

Antes de comenzar, modificaremos algunos parámetros de Apache y de PHP. Escribe en la terminal de pi:

sudo nano /etc/php5/cgi/conf.d/20-apc.ini

Edita ese archivo de manera que lo que leas en él sea esto:

extension=apc.so
apc.enabled=1
apc.shm_size=30

Edita también el archivo php.ini:

sudo nano /etc/php5/apache2/php.ini

para que podamos subir archivos de gran tamaño, al cambiar las líneas de "upload_max_filesize" y "post_max_size". En mi caso voy a dejarlas fijadas en 2 GB:
upload_max_size = 2048 M
post_max_size = 2048 M

Para evitar problemas, escribe en la terminal:

sudo nano /etc/apache2/sites-enabled/000-default

y busca "AllowOverride". Verás que siempre que aparece le sigue la palabra "None"; bien, debes sustituir esos dos "None" por "All".

Ahora ya sólo queda activar los módulos rewrite y headers:

sudo a2enmod rewrite
sudo a2enmod headers

y reiniciar el servidor

sudo service apache2 restart

Hasta aquí, los ajustes en el servidor. Ahora tenemos que preparar la carpeta en la que Owncloud guardará nuestros archivos. ¿Recuerdas que en el punto 2 de este pequeño manual montamos un disco usb? Bien, pues aprovecharemos prácticamente toda la capacidad de ese disco para almacenar y compartir archivos. Si recuerdas, monté el disco usb en el directorio /media/pendrive, así que crearé una carpeta dentro de él que se llame "owncloud" para guardar allí los archivos ("data") y la configuración del servicio:

sudo mkdir -p /media/pendrive/owncloud
sudo mkdir -p /media/pendrive/owncloud/data

Es muy importante que le des los permisos necesarios a la aplicación para que escriba en ese directorio. Puesto que Owncloud corre sobre Apache, su usuario es www-data, así que escribimos

sudo chown www-data:www-data /media/pendrive/owncloud/data

Tras finalizar estos pasos, lo primero que debemos hacer es descargarnos el software desde la página oficial de Owncloud. Así que, para la versión actual de Owncloud, escribe en la terminal de la Raspberry:

cd /temp

Descomprimimos el archivo en el directorio /var/www

cd /var/www
sudo tar jxvf /tmp/owncloud-6.0.0a.tar.bz2

y se creará la carpeta owncloud en ese directorio. Dale los permisos necesarios:

sudo chown -R www-data:www-data owncloud

y ya puedes acceder a la aplicación tecleando en la barra del navegador http://192.168.1.7/owncloud. Te aparecerá una pantalla como la que ves aquí abajo. En ella introduce tu usuario, tu contraseña y el directorio que hemos creado para finalizar la instalación. ¡Ya lo tienes!

Sólo queda explicar cómo instalar el cliente de Owncloud para la sincronización de archivos, pero eso lo explicaré en otra entrada. De momento, hay que saber en qué directorio se almacenan los archivos; en mi caso es /media/pendrive/owncloud/data/luis/files.

Para terminar con owncloud, debo decir que funciona muy lento. He leído por ahí que la solución es teclear en la terminal

sudo apt-get install php-apc

y reiniciar el servidor

sudo service apache2 restart


Ya podemos escribir en el navegador 

http://IPdelapi/owncloud 

y finalizar allí la instalación de Owncloud sin olvidarnos de poner como directorio de almacenamiento el que habíamos fijado. Recuerda que en mi caso es /media/pendrive/owncloud/data/luis/files, pero tendrás que poner el que hayas decidido tú.

Aquí te dejo un vídeo por si te has perdido en algún paso.




5. Haciendo que Transmission y Owncloud se lleven bien

Ahora que ya tenemos la Raspberry Pi funcionando como "nube" de archivos, sería estupendo aprovechar su bajo consumo para utilizarlo como servidor de descargas. Así que le instalaremos Transmission y permitiremos que se almacenen las descargas en Owncloud para que estén disponibles para cualquier ordenador conectado a Internet.


Aunque ya hemos hablado de Transmission, vais a ver que la cosa se complica si lo que pretendemos es que se guarden las descargas en la misma carpeta que Owncloud guarda los datos. Por eso voy a explicar cómo hacer que Transmission y Owncloud se lleven bien.

Empezaremos instalando transmission y después deteniendo el servicio para realizar los ajustes:

sudo apt-get install transmission-daemon
sudo service transmission-daemon stop

Antes de nada, vamos a definir dónde guardaremos las descargas que nos facilita Transmission. Como pretendo que se puedan compartir mediante Owncloud, tendré que emplear el directorio donde se almacenan los archivos por esta aplicación. En mi caso (recuerda el punto 4) es /media/pendrive/owncloud/data/luis/files, pero ahora habrá que darle permisos a Transmission, cuyo usuario es debian-transmission, de manera que nos situamos en dicho directorio con cd y escribimos:

sudo chown -R debian-transmission:debian-transmission data

Ahora editamos el archivo settings.json

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

para que los siguientes parámetros queden de la forma:

    "download-dir": "/media/pendrive/owncloud/data/luis/files",
    "incomplete-dir": "/media/pendrive/owncloud/data/luis/files",
    "incomplete-dir-enabled": false,
    "rpc-password": "1234567p",
    "rpc-port": 9091,
    "rpc-url": "/transmission/",
    "rpc-username": "transmission",
    "rpc-whitelist-enabled": false,
    "umask": 0,
    "rpc-whitelist-enabled": false,
    "umask": 0,
   
Guardamos, salimos y ahora escribimos en la terminal:

sudo nano /etc/default/transmission-daemon

descomentamos la última línea (borrando el "#") y cambiando el nicelevel a 19.

Ya podemos iniciar Transmission

sudo service transmission-daemon start

y añadirle algún torrent desde el navegador. Para ello, escribe en la barra de direcciones 

http://IPdelapi/transmission

poner nuestro nombre de usuario y contraseña ("transmission" y "1234567p", en mi caso). Añade algún torrent para comprobar que todo va bien.

Si no ha pasado nada raro, Transmission funcionará bien. Sin embargo, un vistazo a la dirección http://Ipdelapi/owncloud nos permitirá saber que, ¡horror!, Owncloud ha dejado de funcionar. Eso es debido a que hemos cambiado el usuario propietario de la carpeta data que almacena los archivos; ahora es de debian-transmission y no de www-data, el usuario de Apache.

La solución que se me ha ocurrido es la siguiente:

1) Detén los servicios Apache y Transmission

sudo service apache2 stop
sudo service transmission-daemon stop

2) Vamos a hacer que los usuarios www-data y debian-transmission se lleven bien. Y para llevarse bien con alguien no hay nada mejor que tener algo en común, ¿verdad? Bien, pues vamos a permitir que ambos usuarios compartan el mismo grupo, así que teclea en la terminal:

sudo nano /etc/group

Busca el grupo debian-transmission (debe estar al final) y asegúrate que esa línea te queda así:

debian-transmission:x:111:pi:www-data

3) Vuelve a darle permisos al usuario www-data a la carpeta owncloud de tu unidad usb escibiendo:

cd /media/pendrive/owncloud
sudo chown -R www-data:debian-transmission data

4) Vuelve a iniciar los servicios que habíamos detenido.
sudo service apache 2 stop
sudo service transmission-daemon stop

Comprueba ahora que todo va bien escribiendo en la barra de direcciones del navegador:

http://IPdelapi/owncloud

haz lo mismo para comprobar Transmission

http://IPdelapi/transmission

Y ya hemos acabado: ¡nuestro propio servidor de descargas y de almacenamiento compartido!

Fácil, fácil ;)

También he grabado un vídeo con todos los pasos de la reconciliación entre Owncloud y Transmission, puede que te sirva.