"Después del juego es antes del juego"
Sepp Herberger

miércoles, 2 de marzo de 2022

Sincronizando directorios remotos entre Linux y OpenWRT mediante syncthing

Después de montar un NAS sobre OpenWRT he querido probar una herramienta a la que tenia puesto el ojo hace tiempo: syncthing.

Syncthing permite mantener sincronizados de forma automática directorios entre distintas máquinas, incluso si corren diferentes sistemas operativos. Cualquier cambio en uno de los ficheros o subcarpetas en una máquina será propagada hacia las demás mediante un sistema P2P en tiempo real o en intervalos de tiempo predefinidos. Puede ser útil para tener, por ejemplo, una copia de seguridad de los datos de nuestros usuarios o de directorios importantes.

Hacerlo funcionar entre dos Ubuntu es bastante sencillo, hay muchos manuales en Internet. La versión que viene con Ubuntu 18 es bastante antigua, así que nos descargamos la más moderna versión 1.19, añadiendo el repositorio de la aplicación y ejecutando los comandos:
# apt-get install curl
# curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
# echo "deb https://apt.syncthing.net/ syncthing stable" | tee /etc/apt/sources.list.d/syncthing.list
# apt-get install apt-transport-https
# apt-get update
# apt-get install syncthing
# systemctl enable syncthing@root.service
# systemctl start syncthing@root.service
Una vez instalado, los pasos sigientes son:
  1. Con el navegador, en la URL http://127.0.0.1:8384 accedemos al entorno web de configuración de syncthing, un entorno muy sencillo y funcional. Lo primero a hacer es definir un usuario y contraseña de acceso en Actions/Settings/GUI/GUI Authentication User-Password.
    Luego lo que he hecho es eliminar la carpeta compartida "Default Folder" de la sección "Folder", ya que no me interesa para nada, y añadir una carpeta que si quiero compartir y sincronizar, por ejemplo "/media/sync" o la que nos interese en nuestro caso.
  2. A continuación, instalamos la aplicación en el otro PC, la abrimos con el navegador en http://127.0.0.1:8384 y definimos usuario/contraseña y borramos la carpeta "Default Folder". No definimos ninguna carpeta para sincronizar.
  3. Volvemos al primer PC, a la página http://127.0.0.1:8384, y le damos al botón "Añadir un dispositivo remoto", en la sección "Dispositivos". Esto nos pide el Device ID del otro ordenador (que encontramos en su menú Actions/Show ID), pero como syncthing es muy listo lo ha localizado el solo por nosotros y aparece para que pinchemos y lo seleccionemos sin tener que escribir nada.
    Además marcamos la carpeta que queremos sincronizar en un checkbox que aparece en la parte inferior de la siguiente pestaña.
  4. De nuevo en el PC secundario abrimos la página http://127.0.0.1:8384, esperamos unos instantes y nos saldrá la petición de que otro dispositivo quiere sincronizar con este pc. Aceptamos y esperamos otro ratito. Ahora nos dirá que quiere sincronizar la carpeta compartida desde el otro PC, aceptamos de nuevo e indicamos la ruta local sobre la que queremos ubicar esa carpeta. Fin.
Con esto, cualquier cambio que hagamos sobre las carpetas conectadas se propagará al poco tiempo al otro extremo. También podemos programarlo a nivel de carpeta para que no sea una sincronización inmediata y se haga a ciertos intervalos.

Una vez conseguido entre 2 PC con Ubuntu el siguiente paso es hacerlo con uno que tenga OpenWRT, por ejemplo nuestro NAS. Para ello me he guiado con este enlace. Los pasos seguidos son:
  • Descargamos la versión para procesador MIPS (nuestros DLink DIR-860L funcionan con CPU MIPS) de syncthing, en el enlace https://github.com/syncthing/syncthing/releases/download/v1.19.0/syncthing-linux-mipsle-v1.19.0.tar.gz
  • Descomprimimos el fichero y localizamos el ejecutable syncthing entre los ficheros extraídos, verificando que es un ejecutable para MIPS:
    # ls -l syncthing 
    -rwxr-xr-x 1 root root 23242371 feb  1 12:52 syncthing
    # file syncthing 
    syncthing: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, Go BuildID=34n17_AjfWP2w_vsWklx/00redfghuYoGTWmMPWQy/8T6vcQMJvHjNx9l6eQVF/zZyy9E8KKWjV03NfAwtN, not stripped
    
  • Copiamos el fichero a nuestro OpenWRT. Como ocupa 23MB y nuestro DLink solo tiene 16MB de disco interno no nos queda otra que copiarlo sobre el disco duro externo USB que montamos en el NAS, en la ruta /disco:
    # scp syncthing root@nas:/disco/syncthing 
    
    Una vez copiado, conectamos por ssh al OpenWRT y lo ejecutamos (/disco/syncthing) para verificar que funciona...es raro encontrar un ejecutable para OpenWRT aislado que funcione sin quejarse, pero este lo hace sin problema.
  • Ahora creamos un script de inicio para ejecutar syncthing como un servicio en el arranque:
    # cat /etc/init.d/syncthing
    #!/bin/sh /etc/rc.common
    # Copyright (C) 2015 brglng@github.com
    
    START=99
    STOP=99
    
    start() {
            service_start /disco/syncthing 2>&1 | logger -t syncthing &
    }
    
    stop() {
            service_stop /disco/syncthing
    }
    
    Activamos y lanzamos el servicio y creamos la carpeta donde haremos las sincronizaciones (dentro del disco USB, obviamente):
    # /etc/init.d/syncthing enable
    # /etc/init.d/syncthing start
    # mkdir /disco/sync
    
  • Ahora tenemos un problemilla: para configurar syncthing hay que entrar con navegador web en http://127.0.0.1:8384, pero OpenWRT no tiene entorno gráfico ni navegador web. Debemos entrar desde un PC externo a http://nas:8334, pero syncthing por defecto solo acepta conexiones http desde 127.0.0.1. Esto se corrige editando: /root/.config/syncthing/config.xml y localizando:
    ...
    <gui enabled="true" tls="false">
      <address>127.0.0.1:8384</address> 
    </gui>
    ...
    
    Que debe cambiar a:
    ...
    <gui enabled="true" tls="false">
      <address>0.0.0.0:8384</address> 
    </gui>
    ...
    
    Tras esto, reiniciamos el servicio syncthing y ya podremos conectar a http://nas:8334
  • Una vez conectados al entorno web los pasos son similares a cuando lo hicimos con dos PC con Ubuntu, solo que la ruta de la carpeta sincronizada será /disco/sync
Y con esto ya tenemos nuestro NAS sincronizado mediante un servicio syncthing. En las pruebas preliminares no parece que se haya cargado de forma apreciable la modesta CPU MIPS de nuestro OpenWRT. Lo observaremos con cuidado.