GNU/Linux: terabytes de nube privada con la Raspberry Pi y Syncthing

2019-03-15 - Categorías: General / GNU/Linux
Syncthing y la Raspberry Pi

He seguido jugando para ver hasta donde puede llegar este pequeño ordenador de poco más de 30€, la Raspberry Pi. Una joya de la informática, que junto a Syncthing, otra joya de la informática, hacen una combinación explosiva. Así que aquí estoy escribiendo éste HOWTO sobre servidores para montar una nube de terabytes de almacenamiento sincronizado y privado en tu propia casa, local o en varios lugares remotos.

Sólo por el coste de tus PCs, sin pagar nada a una empresa, sin que tus datos estén copiados en ordenadores que no son tuyos, y sin que tus datos estén copiados en el extranjero. Es decir, tus datos ya no tendrán que estar almacenados en ningún servidor externo en ninguna empresa. Todo sincronizado entre tus móviles, ordenadores y la Raspberry Pi. Además, podrás disfrutar de tantos terabytes como quieras sin coste mensual, sólo necesitas tener los discos externos que quieras y la Raspberry Pi encendida.

Además, si tu caso es empresarial o de negocio, y tus datos están copiados al extranjero, probablemente tendrás un problema legal sobre la privacidad de los datos. Así que no sólo en lo personal, sino también en lo laboral, ésta puede ser una gran solución a varios problemas..

Qué necesitamos, comenzando

Hardware

Para empezar necesitamos de varios ordenadores, algún móvil, una Raspberry Pi, y un disco duro externo. En mi caso, tenía un disco duro de dos teras externo con USB. Conecto el disco duro a la Raspberry Pi y comienzo a instalar el software en todos los dispositivos. Para este post he utilizado Raspbian, del que ya hablé en este otro post por si necesitas ver cómo instalarlo.

Software

En Windows:
https://github.com/canton7/SyncTrayzor#installation

En Linux conviene seguir las siguientes instrucciones para instalarnos la última versión:
https://apt.syncthing.net/

En Android:
https://play.google.com/store/apps/details?id=com.nutomic.syncthingandroid

No he probado en Mac, pero siguiendo las instrucciones de la página oficial no creo que haya muchos problemas:
https://syncthing.net/

Un poco de teoría, el sistema de dispositivos y carpetas compartidas

Syncthing en la Raspberry Pi..

La gran diferencia que tiene Syncthing con respecto a muchos sistemas de sincronización, es que los datos no están copiados afuera de los dispositivos de tu propiedad, no existe una copia almacenada en la nube de una empresa externa. A su vez, tampoco hay una copia centralizada en un único servidor que distribuye todo a todos. Es complicado de explicar, pero fácil de poner en marcha una vez que se juguetea un rato.

Por otro lado, todo se configura organizándose mediante carpetas compartidas y dispositivos. Es decir, tendremos unas carpetas compartidas que se sincronizan de cierta manera. Por otro lado tenemos los dispositivos que formarán tu nube de sincronización.

El modo de dispositivo presentador

Una configuración importante, es que todos tus dispositivos pueden estar conectados entre sí. Presentándose entre sí a nuevos dispositivos para hacer más grande fácilmente el conjunto total de tus dispositivos conectados. Este sistema de presentación se hace configurando a un dispositivo como presentador o incluso a todos como presentadores si quisieras.

Es decir, si tienes un dispositivo presentador, lo que hace es presentarte a todos los dispositivos que tenga conectados. Esto ayuda enormemente a que puedas distribuir entre todos los dispositivos las carpetas junto con la siguiente configuración.

El modo de dispositivo con aceptar automáticamente

Otra configuración importante en los dispositivos, es que si activamos el aceptar automáticamente las carpetas de un dispositivo, podremos distribuir nuevas carpetas en nuestra nube. Esto, lo que hace es que el dispositivo en donde estás, siemplemente acepte cualquier carpeta que el otro dispositivo te comparte.

Pero tiene su contrapartida, porque si activas esto en dos dispositivos a la vez, y luego quieres borrar una carpeta en uno, se te replicará en el otro constántemente.. xD Es chistoso y tiene fácil solución, sólo dejas uno en aceptar automáticamente, o dejas de compartir la carpeta antes de borrarla.

Compartiendo carpetas

Finalmente quedará el configurar cada carpeta de forma la puedes compartir entre tu red de dispositivos. El resto de configuraciones creo que son todas muy intuitivas de usar en la interfaz, no merece la pena que me extienda en este post.

Sólo mencionarte que tienes el clásico versionado de ficheros, y modos de carpeta. Así puedes evitar la perdida de ficheros, o que las modificaciones vayan sólo en una dirección.

Instalación en Raspberry Pi, o derivado de GNU/Linux

Lo primero a instalar será la última versión, para esto, en un sistema como Raspbian, derivado de Debian tenemos que hacer lo siguiente:

# Add the release PGP keys:
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -

# Add the "stable" channel to your APT sources:
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list

# Update and install syncthing:
sudo apt-get update
sudo apt-get install syncthing

Con esto ya tenemos el ejecutable, lo siguiente es configurarlo como servicio del sistema, es decir, como demonio del sistema. Para esto tenemos que configurar el fichero /etc/init.d/syncthing siguiente:

#!/bin/sh
### BEGIN INIT INFO
# Provides: syncthing
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Multi-user daemonized version of syncthing.
# Description: Starts the syncthing daemon for all registered users.
### END INIT INFO

# Replace with users you want to run syncthing clients for
# syncthing_USERS="<your name here>"
syncthing_USERS="pi"
#DAEMON=/opt/syncthing/syncthing
DAEMON=/usr/bin/syncthing

startd() {
  for stuser in $syncthing_USERS; do
    HOMEDIR=$(getent passwd $stuser | awk -F: '{print $6}')
    if [ -f $config ]; then
      echo "Starting syncthing for $stuser"
      start-stop-daemon -b -o -c $stuser -S -u $stuser -x $DAEMON
    else
      echo "Couldn't start syncthing for $stuser (no $config found)"
    fi
  done
}

stopd() {
  for stuser in $syncthing_USERS; do
    dbpid=$(pgrep -fu $stuser $DAEMON)
    if [ ! -z "$dbpid" ]; then
      echo "Stopping syncthing for $stuser"
      start-stop-daemon -o -c $stuser -K -u $stuser -x $DAEMON
    fi
  done
}

status() {
  for stuser in $syncthing_USERS; do
    dbpid=$(pgrep -fu $stuser $DAEMON)
    if [ -z "$dbpid" ]; then
      echo "syncthing for USER $stuser: not running."
    else
      echo "syncthing for USER $stuser: running (pid $dbpid)"
    fi
  done
}

case "$1" in
  start) startd
    ;;
  stop) stopd
    ;;
  restart|reload|force-reload) stopd && startd
    ;;
  status) status
    ;;
  *) echo "Usage: /etc/init.d/syncthing {start|stop|reload|force-reload|restart|status}"
     exit 1
   ;;
esac

exit 0

Fíjate que el usuario que usará la Raspi es pi, así guardará las configuraciones para correr en la carpeta del usuario siguiente:

/home/pi/.config/syncthing

Estas configuraciones en el directorio ~/.config/syncthing/ son las que tendremos que restablecer si hacemos un formateo del nodo. Bastará con volver a copiar todo este contenido en el directorio del usuario que va a correr Syncthing, para que al arrancar de nuevo el servicio, vuelva a correr como el nodo que era antes. Así todas las configuraciones de carpetas, identificadores, enlaces entre nodos, etc.. todo seguirá igual.

Nos falta declarar el servicio, el cual podemos copiar del que nos viene instalado con:

sudo cp /lib/systemd/system/syncthing@.service /etc/systemd/system/syncthing.service

Y lo editamos para que arranque con el usuario que debe:

[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=multi-user.target network.target

[Service]
User=pi
ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4

# Hardening
ProtectSystem=full
PrivateTmp=true
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Ésta forma de instalar también me ha funcionado para derivados de Debian, como Raspbian. Al hacer esto de arriba, tendremos un servicio de sistema, o también llamado demonio, que podremos trabajar con los comandos siguientes:

sudo service syncthing status
sudo service syncthing start
sudo service syncthing stop
sudo service syncthing restart
sudo systemctl status syncthing
sudo systemctl enable syncthing
sudo systemctl disable syncthing
...

Si por lo que sea no arranca cuando incias el sistema operativo en GNU/Linux, lo que hay que hacer es ejecutar ‘sudo systemctl enable syncthing’. Así marcaremos el servicio para que esté siempre ejecutándose, salvo si hay algún error que provoque que se pare. En caso de error al ejecutarse, habría que revisar el registro de errores:

journalctl -u syncthing

Para terminar una utilidad que me ha gustado poner en el escritorio ha sido el enlace directo a la interfaz web. Así no tenemos que andar instalando ningún programa extra para administrarlo.

Accesos directos de la última versión de Syncthing instalada desde APT..

Podemos enviar al escritorio los accesos directos o crear estos accesos directos en escritorio haciendo un fichero syncthing-ui.desktop como este:

#!/usr/bin/env xdg-open
[Desktop Entry]
Name=Syncthing Web UI
GenericName=File synchronization UI
Comment="Opens Syncthing's Web UI in the default browser (Syncthing must already be started)."
Exec=/usr/bin/syncthing -browser-only
Icon=syncthing
Terminal=false
Type=Application
Keywords=synchronization;interface;
Categories=Network;FileTransfer;P2P

Terminando

Para terminar sólo me queda redireccionarte a la siguientes páginas de donde he sacado gran parte de la información:

Si has llegado hasta aquí, espero que te haya podido ayudar. ¡Un saludo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

© 2024 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.