Servidor con Raspberry PI
Tabla de contenidos
Presentación
Creo que pocas de mis aparatos tecnológicos me ha sido de más ayuda que mi servidor personal. Y no estoy hablando de un servidor potente de un proveedor de servicios como los que podrían tener grandes compañías. Estoy hablando de un pequeño servidor usando una placa de bajo coste como las Raspberry Pi.
Para el que no las conozca, son ordenadores montados en una placa que tienen todos los periféricos necesarios para un uso bastante decente, como puertos usb, puerto de red e incluso WiFi o Bluetooth. Porque un servidor no es más que eso, un ordenador que está conectado a la red y encendido 24/7. Y ese es precisamente el motivo por el cual es tan interesante esta pequeña placa, y es que tiene un consumo energético bajísmo, de menos de una decena de vatios-hora. Eso significa unos pocos céntimos al mes por todo lo que puede ofrecer.
Pero, ¿qué es exactamente lo que puede ofrecer un servidor personal? Pues la respuesta que no sorprenderá a nadie que siga leyendo hasta aquí es: más de lo que te imaginas. Por citar sólo algunos de los más importantes podríamos decir:
- Servidor web. Puedes alojar tu propia página web
- Servidor de correo. Tu propia cuenta de correo electrónico en casa
- Nube de almacenamiento. Sincroniza tus archivos en tus distintos dispositivos
- Servidor de ficheros. Todos tus ficheros disponibles desde cualquier parte
Para mí, sin ninguna duda, el más útil es el último de los citados. Al tener mis archivos en almacenamiento conectado a mi servidor, el cual está conectado a la red, puedo acceder a mis ficheros desde cualquier parte y desde múltiples dispositivos. Aunque la finalidad pueda parecer similar con la nube de almacenamiento, para mí la diferencia estriba en que no necesariamente quiero tener todos mis ficheros sincronizados en múltiples dispositivos. Más adelante profundizaré en ello, pero por ahora voy a compartir con vosotros la configuración de mi servidor de ficheros. Aunque no entraré en demasiados detalles técnicos, espero dar los suficientes como para que se pueda seguir con relativa facilidad, y dar los enlaces suficientes para profundizar más.
Voy a suponer que utilizamos una Raspberry Pi con el sistema operativo Raspbian. Aunque probablemente todo lo que voy a describir pueda hacerse con cualquier otro tipo de ordenador en placa, lo importante es que tenga disponible el software que usaremos. También supondré que el lector tiene ciertos conocimientos en entornos GNU/Linux, que le permitan instalar paquetes de software y editar ficheros, así como un uso básico de la terminal.
Arrancando el servidor en red local
Descargamos la imagen de Raspbian y la copiamos a la memoria SD de la Raspberry. Existen muchas maneras de copiar una ISO a un USB o SD para hacer un disco de arranque, pero mi favorita por su simplicidad siempre es dd.
Una vez tengamos la SD con la ISO preparada, aún vamos a hacer un pequeño paso antes de arrancar la Raspberry. Vamos a trabajar con el servidor de forma remota, de manera que necesitamos habilitar el servidor SSH para conectarmos a ella desde otro ordenador. En el siguiente enlace tienes toda la información para hacerlo. Como aún no hemos arrancado el sistema, lo que haremos será montar la partición boot de la SD y crear un fichero que se llame ssh, sin extensión y sin importar el contenido. Para averiguar cual es la partición boot, introducimos la SD en nuestro ordenador y ejecutamos la orden lsblk:
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk0 179:0 0 29.8G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part └─mmcblk0p2 179:2 0 29.6G 0 part
En ese ejemplo, he ejecutado la orden en una tarjeta de memoria de 32 GB. Vemos que hay dos particiones, la pequeña será la partición que estamos buscando de boot. La montamos y añadimos el fichero. Con esto conseguiremos poder conectarnos de forma remota a la Raspberry. El siguiente paso es conectarla por ethernet (lo más simple, si queremos WiFi ya habría que configurar el punto de acceso más tarde) y a la red eléctrica.
Para poder conectarnos a la Raspberry, necesitamos saber cual es la dirección local que le ha asignado nuestro router (asumiendo que usa dhcd, lo más normal). Una forma muy sencilla de conseguirlo es entrando en la página de configuración del router, que será del estilo 192.168.1.1 y obtener la dirección de la Raspberry. Suponiendo que fuera 192.168.1.15, a partir de ahora podemos acceder a la Raspberry haciendo:
El usuario con el que entraremos al servidor es el que trae por defecto pi. Nos pedirá la contraseña por defecto, la cual es raspberry. Huelga decir que es una buena idea cambiar esta contraseña, de forma que una vez que hayamos hecho login podemos hacerlo usando el comando passwd. Una vez hecho esto, ya podemos empezar a configurar nuestro servidor sin necesidad de teclado, ratón o pantalla conectado a nuestra Raspberry. Al conectarnos nos dará una sesión del usuario pi dentro de la terminal desde donde ejecutamos el comando ssh.
Consejo avanzado
Por seguridad y conveniencia, quizá quieras usar tu llave pública SSH para acceder a tu servidor. Esto tiene la ventaja de que no necesitas introducir la contraseña cada vez que ejecutes el comando ssh. Además, es más difícil romper este tipo de encriptación que tu contraseña (a menos que uses una buena contraseña). Aquí puedes leer más sobre las claves públicas SSH y como copiarla al servidor. Otra opción para asegurar aún más el servicio SSH es cambiar el puerto que usa, que por defecto es el 22. En el enlace que puse al servicio SSH tienes más información.
Como ultimo paso, te recomiendo lanzar la aplicación de configuración de la Raspberry usando el comando:
Al lanzar el comando con sudo se ejecuta como administrador, y necesitarás introducir la contraseña. Después, selecciona la opción para expandir el sistema de archivo y aprovechar toda la SD. Tienes más información aquí.
Configurando el almacenamiento del servidor
Ahora que ya tenemos la Raspberry en red local operativa, vamos a añadirle almacenamiento a nuestro servidor. Estos ordenadores vienen con varios puertos USB dependiendo del modelo que tengas, de manera que como almacenamiento a mi me gusta una combinación de discos duros externos y memorias flash USB. Las memorias de USB ya son muy baratas (64 GB por unos 8€), de forma que para mi es más que suficiente. Además, son más rápidas que los discos duros tradicionales (al menos en el arranque del disco) y consumen menos. Si decides tener varios discos, una cosa importante que has de tener en cuenta es si la Raspberry es capaz de proporcionar corriente suficiente para que todos los discos funcionen simultaneamente. También piensa que si almacenas mucha información en un disco muy grande y se estropea, perderás mucho más que si se estropeara una unidad pequeña. Por ello, recomiendo una combinación de discos y memorias más pequeñas, junto con copias de seguridad. Conectamos el almacenamiento que queramos y ejecutamos de nuevo la orden lsblk:
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 1.8T 0 disk └─sda1 8:1 0 1.8T 0 part sdb 8:16 0 931.5G 0 disk └─sdb1 8:17 0 931.5G 0 part sdc 8:32 1 57.3G 0 disk sdd 8:48 1 14.4G 0 disk └─sdd1 8:49 1 14.4G 0 part sde 8:64 1 57.3G 0 disk mmcblk0 179:0 0 29.8G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 29.6G 0 part /
Puedes ver que ahora las particiones de la trajeta SD mmcblk0 tienen puntos de montaje asignados, ya que el sistema al arrancar se los asigna automáticamente. Fíjate que además he conectado 5 sistemas de almacenamiento: 2 discos duros (sda y sdb) y tres memorias USB (sdc, sdd y sde). El motivo de que aparezcan subentradas (sda1 o sdd1) en algunos y en otros no (sdc o sde) es porque algunos de mis sistemas de almacenamiento tienen hechos particiones y otros no.
Consejo avanzado
Estoy dando por hecho que los sistemas de almacenamiento que vamos a usar ya se han formateado y están listos. Para una mayor integración en sistemas GNU/Linux, recomiendo que los discos estén en formato ext4, ya que es el formato por defecto en estos sistemas. Se puede usar una herramienta como fdisk para crear tablas de particiones y particionar el disco, y luego darle formato con mkfs.
De cualquier manera, para poder usar el almacenamiento primero hay que montarlo. Pero además, sería conveniente que el sistema los montara automaticamente al arrancar, de forma que al reiniciar o si se va la luz, volvamos a tener disponible el almacenamiento. Lo primero es crear los puntos de montaje en los que vamos a montar el almacenamiento, lo cual haré en la raíz del usuario pi, es decir:
$ mkdir Disco1 Disco2 MUSB1 MUSB2 MUSB3
Fíjate que para que los directorios se creen en la raíz del usuario pi, o home de pi, tenemos que encontrarnos primero en dicho directorio, o escribir la ruta completa al crear el directorio: mkdir /home/pi/Disco1, etc. Una vez hecho esto, para hacer que los discos se monten automáticamente, tenemos que editar el fichero /etc/fstab, y añadir las siguientes líneas:
UUID=bee8daad-d76e-4af7-b43a-3de104ef8b57 /home/pi/Disco1 ext4 defaults 0 0 UUID=a1e934f9-1275-41a9-b84c-c5eb93787ef2 /home/pi/Disco2 ext4 defaults 0 0 UUID=3b4fe3d8-ae5f-4162-922f-3936b0d767ac /home/pi/MUSB1 ext4 defaults 0 0 UUID=77857436-71cb-40f6-86fe-6e7e1373cebe /home/pi/MUSB2 ext4 defaults 0 0 UUID=d5f38239-e0ed-4af3-bbef-a218639665ac /home/pi/MUSB3 ext4 defaults 0 0
Cada una de esas líneas le dice al sistema que monte el volumen identificado por cada UUID en el punto de montaje, con el formato especificado; las opciones de montajes serán las por defecto. Para identificar los discos, también podríamos haber usado la notación /dev/sda1, pero como esos identificadores podrían cambiar en ciertos casos, prefiero usar los UUID. Para hallar el UUID de cada disco, basta con ejecutar la orden:
$ ls -l /dev/disk/by-uuid/ total 0 lrwxrwxrwx 1 root root 10 Aug 9 18:56 3b4fe3d8-ae5f-4162-922f-3936b0d767ac -> ../../sdd1 lrwxrwxrwx 1 root root 15 Aug 9 18:56 592B-C92C -> ../../mmcblk0p1 lrwxrwxrwx 1 root root 15 Aug 9 18:56 706944a6-7d0f-4a45-9f8c-7fb07375e9f7 -> ../../mmcblk0p2 lrwxrwxrwx 1 root root 9 Aug 9 18:56 77857436-71cb-40f6-86fe-6e7e1373cebe -> ../../sde lrwxrwxrwx 1 root root 10 Aug 9 18:56 a1e934f9-1275-41a9-b84c-c5eb93787ef2 -> ../../sdb1 lrwxrwxrwx 1 root root 10 Aug 9 18:56 bee8daad-d76e-4af7-b43a-3de104ef8b57 -> ../../sda1 lrwxrwxrwx 1 root root 9 Aug 9 18:56 d5f38239-e0ed-4af3-bbef-a218639665ac -> ../../sdc
Una vez hecho esto, podemos reiniciar nuestra Raspberry (desconectándola de la corriente y volviendo a conectarla, o mucho mejor, introduciendo la orden reboot) y deberíamos ver, al ejecutar de nuevo la orden lsblk, que nuestros almacenamientos se han montado adecuadamente en los puntos de montaje adecuados y están listos para que los usemos:
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 1.8T 0 disk └─sda1 8:1 0 1.8T 0 part /home/pi/Disco1 sdb 8:16 0 931.5G 0 disk └─sdb1 8:17 0 931.5G 0 part /home/pi/Disco2 sdc 8:32 1 57.3G 0 disk /home/pi/MUSB1 sdd 8:48 1 14.4G 0 disk └─sdd1 8:49 1 14.4G 0 part /home/pi/MUSB2 sde 8:64 1 57.3G 0 disk /home/pi/MUSB3 mmcblk0 179:0 0 29.8G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 29.6G 0 part /
Consejo avanzado
Ahora que ya tenemos configurado el almacenamiento, conviene que te tomes un momento a pensar como distribuir tus datos, y asegurarlo con copias de seguridad. Como te decía anteriormente, a mi me gusta compartimentizar mis datos: la música en una memoria USB; el resto de documentos y fotografías en otra memoria; otra memoria USB la uso como nube Nextcloud; y los discos duros para almacenar copias de seguridad y datos más voluminosos. Para las copias de seguridad, yo uso rsync, el cual puedes ejecutar periodicamente para salvaguardar tus datos:
$ rsync -av /home/pi/MUSB1 /home/pi/Disco1/
El anterior comando creará una copia del contenido de la MUSB1 dentro de un directorio MUSB1 en el Disco1. Además, a partir de la primera vez que se ejecute, creará una copia incremental. Esto quiere decir que sólo copiará aquellos ficheros nuevos o modificados desde la última vez que se ejecutó. Si además le añadiésemos la opción --delete, lo que se borre en la fuente se borrará también en la copia de seguridad. Sin embargo, ese comando prefiero hacerlo manualmente para evitar borrados accidentales. Digo esto porque ese comando es ideal para automatizarlo con crontab. Podemos guardar el comando de rsync en un script de shell y automatizarlo. Para ello, lanzamos la orden crontab -e y añadimos la frase
0 6 * * 0 /home/pi/misc/backup.sh
He guardado el script en una carpeta misc dentro de la raíz de usuario y se ejecutará a las 6 de la mañana de cada domingo. En el enlace que puse puedes leer sobre el formato de crontab.
Accediendo al almacenamiento
Ahora que ya tenemos el almacenamiento configurado en nuestro servidor, tenemos que ver cómo podemos acceder a él. La respuesta corta es: de muchas maneras. Hay muchas aplicaciones y programas, tanto de móvil como de ordenador, que nos permiten hacer esto. La mayoría de administrador de archivos en los sistemas GNU/Linux traen una opción para añadir una conexión a un almacenamiento remoto, usando el protocolo Secure File Transfer Protocol. Este protocolo nos permite acceder a nuestros ficheros de forma segura, ya que utiliza de fondo el protocolo SSH, igual que lo usábamos para acceder a nuestro servidor remotamente. La sintáxis de este protocolo es, suponiendo la misma dirección IP que en casos anteriores, la siguiente:
$ sftp://pi@192.168.1.15:/home/pi
Fíjate que estamos accediendo con el usuario por defecto pi, y además estamos indicando la ruta absoluta a la que queremos acceder, que en este caso es la raíz del usuario. Además, si modificaste el puerto por defecto tendrás que indicarlo entre los dos puntos después de la dirección y la ruta. Pero no te preocupes, la mayoría de aplicaciones y programas traen un asistente que facilita introducir los datos, como esta de la aplicación VLC de Android. Usando esta aplicación, podemos reproducir música o vídeos desde nuestro servidor con nuestro teléfono.
Sin embargo, en mis ordenadores yo prefiero usar SSHFS. Es un sistema de ficheros que monta un almacenamiento remoto en nuestro sistema de archivos, igual que montamos un disco. Para hacerlo, utilizamos el siguiente comando:
$ sshfs pi@192.168.1.15:/home/pi/ ~/pi
Fíjate que es parecido a la orden que usamos para sftp, sólo que aquí tenemos que indicarle un punto de montaje, de forma similar a como indicábamos para los sistemas de almacenamiento. Recuerda asimismo que la tilde ~ es equivalente al directorio raíz del usuario. Ahora, cuando en nuestro ordenador accedamos a esa carpeta en la que hemos montado, encontraremos todos los ficheros de nuestro servidor, como si estuvieran en local. Puedes editar, mover, copiar ficheros y no notarás que lo estás haciendo en remoto, eso será transparente para tí.
Consejo avanzado
Si estás utilizando un ordenador que está en red local, siempre tienes conexión directa con el servidor, y puede que que estés pensando que es un rollo tener que abrir una terminal para lanzar ese comando y acceder a tus ficheros. Lo que necesitas es editar el archivo fstab en tu ordenador (no en el servidor) y añadir una línea que monte automáticamente el servidor como hemos hecho antes. Aquí tienes toda la información sobre como conseguirlo.
Si tu ordenador no está en red local con el servidor, puede que no siempre quieras intentar automontar tu servidor (ya que quizá ni siquiera tengas conexión a internet). En este caso, puede que sea mejor hacer un script de shell con la orden de montar, y asociarlo a un atajo de teclado. ¿Qué como accedemos a nuestro servidor sin estar en red local? Sigue leyendo...
Accediendo al servidor desde cualquier parte
Si has llegado hasta aquí, supongo que te interesa esto en especial, ya que acceder a tus archivos en tu casa está bien, pero desde cualquier parte del mundo... Eso son palabras mayores. Lo primero que tienes que recordar es que el router que tenemos en casa es una puerta de acceso a internet. Igual que antes asumíamos que la dirección IP de nuestra Raspberry era 192.168.1.15, debes saber que nuestro router tiene una dirección IP única en el mundo, que podemos usar para acceder a nuestro servidor practicamente igual que hasta ahora. Pero hay dos aspectos que tenemos que resolver primero:
- Nuestra dirección IP de casa no es fija, sino dinámica. Por lo tanto, tenemos que conseguir un nombre de dominio que apunte a esa dirección, sea cual sea.
- Cuando lancemos una orden como hasta ahora con la dirección de nuestro router, tenemos que especificar al router que queremos hablar con la Raspberry.
Vamos por partes, empecemos con el problema de la dirección dinámica. Una opción sería solicitarle a nuestro Internet Service Provider, o ISP, que nos diera una dirección fija, y problema resulto. Pero también puede ser que no nos proporcione ese servicio, o simplemente no queramos pagarlo. Yo uso lo que se llama un proovedor de nombres de dominios dinámicos, y en concreto No-IP. Creándonos una cuenta, obtenemos un nombre de dominio que apunta a nuestra IP de casa, sea cual sea, de forma que en todos los comandos hasta ahora, simplemente sustituimos la dirección IP por ese nombre de dominio, por ejemplo:
$ sshfs pi@tudominio.random.org:/home/pi/ ~/pi
Los dominios que ofrecen de forma gratuita suelen tener extensiones un poco raras, pero para lo que lo queremos, sirve a las mil maravillas. Ahora sólo nos queda configurar nuestra parte en el router de casa. La mayoría de routers que nos dan las compañías tienen la opción para introducir nuestra cuenta de No-IP y contraseña, de forma que el router automáticamente cada cierto tiempo le da la dirección IP que tiene a los servidores de No-IP, de manera que nuestro nombre de dominio siempre apunte a la última dirección que tengamos.
Por último, nos queda hacer que cuando lancemos nuestro comando, y nos redirija a nuestro router, el router sepa que tiene que encaminar hacia la Raspberry. Esto se hace en la configuración del router, a la que normalmente se accede introduciendo en un navegador de internet la dirección del router local, la cual es normalmente 192.168.1.1. Una vez dentro, tenemos que buscar una opción que se llame port forwarding. Básicamente lo que hace es decirle al router: cuando te lleguen paquetes de información que vengan a X puerto, mándaselos a la Raspberry. Para hacerlo más sencillo, te aconsejo que le des a la Raspberry una dirección IP fija. Lo que tenemos que hacer ahora es crear reglas para cada servicio que vayamos a utilizar. De momento, como sólo hemos hablado del SSH, SFTP y el SSHFS, sólo necesitamos crear una regla relacionada con el puerto 22, que es el puerto por defecto del SSH (el resto de servicios usan el mismo). La forma de introducir depende de cada modelo de router, pero más o menos la información que tienes que introducir es la siguiente:
Protocolo | Dirección entrada | Rango de puerto de entrada | Dirección de salida | Rango de puerto de salida |
---|---|---|---|---|
UDP y TCP | * | 22:22 | 192.168.1.15 | 22:22 |
- Protocolo: UDP y TCP
- Dirección de entrada: *
- Rango de puerto de entrada: 22:22
- Dirección de salida: 192.168.1.15
- Rango de puerto de salida: 22:22
Como digo, puede que haya información que no necesites, pero lo importante está ahí. Para este ejemplo, sigo suponiendo que la dirección IP local de la Raspberry es la misma que en casos anteriores. Con esa regla estamos redirigiendo el tráfico proveniente de cualquier dirección IP en el puerto 22 a la Raspberry.
Consejo avanzado
Si antes cambiaste el puerto en el que trabaja el servidor SSH del servidor, tendrás que tenerlo en cuenta a la hora de hacer las reglas. Además, hay algunos routers que tienen reservado el puerto 22 y no te dejan redirigir su tráfico. En este caso no te queda más remedio que cambiar el puerto para el SSH.
Otro problema que puedes tener es que al usar el nombre de dominio desde dentro de la red local, el router mande hacia fuera el tráfico porque no le corresponda a nada en red local, y luego lo rechace. Busca entre las opciones de LAN por si hubiera alguna opción de nombres de dominio y establece una relación entre el tuyo y la dirección de la Raspberry.
Conclusiones
Si has llegado hasta aquí, mi enhorabuena. Una vez que has hecho esto varias veces parece trivial, pero aún recuerdo la sensación cuando lo logré por primera vez; poner el internet a tu servicio para tu conveniencia y por tu propia mano es algo fantástico. Si es tu primera vez y todo te ha funcionado a la primera, no te creo. Te habrás peleado con miles de tonterías, habrás estado buscando por la red (espero que en Duckduckgo) para solucionar mil historias. Y me alegro, porque es lo mejor que podría pasarte, ya que has tenido que aprender hasta llegar aquí. Podría haber hecho este tutorial mucho más escueto, con los comandos justos e imágenes para que no tuvieras ni que pensar. Pero he preferido poner enlaces y explicar para que esto te sirva de veras.
Un fleco que se nos ha quedado y que está muy relacionado con acceder a tus archivos es la nube personal. He decidido no incluir la instalación de la nube en esta entrada por dos motivos:
- Esta forma de acceder a tus archivos que he descrito es sustancialmente más simple, y mientras más simple sea algo, mejor. Si ves que se te queda corto, creo que eres más que capaz de buscar como hacerlo si has conseguido llegar hasta aquí.
- Nextcloud es más pesado y requiere de software adicional (base de datos, php, servidor web) que quizá no quieras tener instalado en tu servidor.
De todas maneras yo lo uso, ya que me permite acceder y sincronizar ficheros entre mis ordenadores y móvil. Pero para mí, como te dije al principio, existe una diferencia sustancial que creo que podrás adivinar con lo que ya has leído. Me gusta tener mis datos compartimentizados y disponibles cuando tengo necesidad, pero no siempre. Meter todos mis datos en el almacenamiento de la nube iría en contra de este principio. ¿Para qué quiero tener todas mis fotos disponibles en todos mis terminales, sincronizándose en todo momento? Por ello, el almacenamiento que uso para mi nube es una de las memorias USB de tan sólo 16GB. En ella tengo los documentos con los que trabajo frecuentemente; cuando doy algo por finalizado, lo muevo a un almacenamiento más definitivo, como las otras memorias o los discos. Quizá esta manera de trabajar te parezca útil, quizá encuentres otras que te satisfagan en mayor medida. En cualquier caso, espero que esta entrada te haya resultado de provecho.