Syncthing: Cómo sincronizar archivos en red [Guía completa]
Al fin, después de mucho tiempo y muchos pedidos, vamos con un post sobre cómo sincronizar archivos en una red local (LAN) usando syncthing, y algunas curiosidades!
¿Qué es syncthing?
Syncthing es una herramienta de código abierto que nos permite sincronizar archivos entre diferentes dispositivos: computadoras de escritorio, portátiles, celulares, GNU/Linux, Windows, etc., dentro de una red LAN.
Es multiplataforma, y eso facilita mucho las cosas, y le da un potencial enorme.
Syncthing corre un daemon en cada equipo, y cuenta con una interfaz web o GTK, que permite configurarlo de manera relativamente sencilla.
La intención de syncthing es que, cuando dos dispositivos configurados que estén compartiendo directorios, si se encuentran dentro de una red LAN, verifiquen los cambios en dichos directorios, y se sincronicen.
Cada equipo cuenta con un identificador en la red, de modo que cada uno es único en la LAN. Una vez que dos equipos están conectados a la LAN, cualquiera de ellos puede «añadir» al otro mediante su identificador.
Una vez que un equipo añade al otro, el segundo equipo verá una notificación, y podrá añadir al primer equipo también, para quedar conectados.
Una vez que los equipos están conectados, cualquiera puede crear un directorio y compartirlo con el otro equipo. Cada sistema decide dónde almacenar el directorio compartido.
A partir de ahí, cuando uno de los equipos copie archivos a dicho directorio, el otro equipo también verá dichos archivos.
Además, podemos tener varios equipos conectados a la LAN, y cada uno puede compartir con los demás diferentes directorios, según necesitemos.
Esa es la idea principal del uso de syncthing. Veamos paso a paso cómo se configura, y luego les comento algunos usos que yo le doy.
Instalación y configuración
En primer lugar vamos a instalar syncthing en cada dispositivo. En esta guía vamos a hacerlo entre dos sistemas GNU/Linux, un Arch Linux, y un Devuan. También puede configurarse en Android, el paquete está disponible en F-Droid.
En ambos casos he instalado dos paquetes, syncthing, y syncthing-gtk, la interfaz GTK para poder administrarlo, y para tener el iconito en el systray para ver el estado de sincronización. Algunas distros no poseen en sus repositorios el paquete syncthing-gtk, pero igual podemos configurar syncthing mediante una interfaz web.
Esto es súper útil, porque no es necesario instalar ningún frontend gráfico para administrarlo, y al ser web, se puede administrar incluso en sistemas que no tienen interfaz gráfica, y hasta en servidores remotos a los que accedemos vía SSH (al final comento algo de esto).
Les dejo los comandos que usé para instalarlo en estas dos distros. Si usan distros basadas en Debian, como Mint, MxLinux o Ubuntu, pueden usar el mismo comando de Devuan.
# Para Arch Linux
sudo pacman -S syncthing
# Para Devuan:
sudo apt install syncthing
# Para Fedora:
sudo dnf install syncthing
# Para RedHat:
sudo yum install syncthing
Una vez instalado, en general, vamos a ver una o más entradas en el menú de nuestra distro, donde vamos a poder:
- Lanzar el daemon syncthing
- Abrir la interfaz GTK de syncthing (si instalamos el paquete correspondiente)
- Abrir la interfaz web de syncthing (abre un navegador)
A mi no me ha hecho falta habilitar de manera predeterminada el daemon, ya que suelo tener la ventana GTK abierta, y eso ejecuta el daemon si no está corriendo. En el caso de que quisiéramos tener el daemon corriendo siempre, independientemente de la interfaz de acceso, podemos habilitarlo en systemd:
sudo systemctl enable syncthing@$USER.service
sudo systemctl start syncthing@$USER.service
En estos comando $USER
será reemplazado por nuestro nombre de usuario de login.
Y listo, ya tendremos a syncthing instalado y funcional. Vamos a configurarlo!
Configuración de syncthing
En este tutorial usaremos la interfaz web para que resulte más sencillo de seguir, y porque algunas distros no tienen en sus repositorios la interfaz GTK, pero podemos replicar lo mismo desde la interfaz GTK, accediendo al menú.
Para acceder a la interfaz web, simplemente vamos a un navegador y entramos en:
http://127.0.0.1:8384/
Aclaración, para que se entienda mejor este tutorial:
- Las capturas de pantalla en modo Dark/Oscuro, corresponden a uno de los equipos, llamémosle «Cryptos«.
- Las capturas de pantalla en modo Light/Claro, corresponden al otro equipo de la red, llamémosle «Devuan«.
(Son los hostname de mis equipos, los dejé así porque figuran en las capturas :P)
En primer lugar, si usamos la interfaz web, seguramente nos pida autenticación. Es recomendable configurar un nombre de usuario y contraseña para poder acceder. En la interfaz GTK eso es indistinto.
Comencemos la configuración: usuario y clave.
Este paso deberíamos realizarlo en cada equipo de la red.
Veamos por ejemplo en Cryptos cómo se configura la contraseña. Entramos a «Actions» -> «Settings«, en la pestaña «GUI«:

Obteniendo el ID de dispositivo
El ID de dispositivo es lo que nos permite añadirlos a las configuraciones de los otros dispositivos en la red. También, en cada equipo, deberíamos obtener el ID del dispositivo para poder añadirlo a los demás, aunque vamos a ver más abajo que syncthing nos facilita algunas cositas.
Para hacerlo en la interfaz web, vamos al menú «Actions«:

Vamos a ver el código de identificación del dispositivo, y un QR por si queremos obtenerlo escaneando (esto es muy útil cuando el dispositivo que añade al otro es un celular).

El ID del dispositivo nos va a permitir añadirlo en los otros equipos de la red, por lo que deberíamos tener a mano estos ID’s.
Añadiendo dispositivos
Supongamos que Cryptos va a a añadir a Devuan a su configuración. En la interfaz web de Cryptos el botón para añadir un nuevo dispositivo se encuentra abajo: «Add remote device«.

Al entrar veremos a ver una ventana que nos pide el ID del dispositivo que deseamos añadir. También puede que nos muestre otros dispositivos conectados en la LAN. Esto es muy útil porque no hay que copiar y pegar códigos raros, solamente comparar el código que detectó con el del dispositivo que deseamos añadir, y si es el mismo, dar clic.

En la pestaña Sharing podremos directamente compartir alguna carpeta con el otro equipo, si es que ya tenemos directorios compartidos. Vamos a suponer que no, para verlo paso a paso 🙂
Una vez que hemos añadido en Cryptos al equipo Devuan, en Devuan veremos una notificación de que ha sido añadido. Deberemos aceptarla para que ambos equipos queden conectados.

Al aceptarlo, veremos al nuevo dispositivo en la lista. De hecho, tanto Cryptos como Devuan verán al otro dispositivo en la lista de «Remote devices«.

Compartiendo un directorio
Supongamos que necesitamos compartir un directorio entre ambos equipos, para que cualquier archivo que uno deje en ese directorio, el otro también pueda verlo y modificarlo.
Para ello, en cualquier dispositivo vamos a crear un directorio nuevo para compartir.
En mi caso, por una cuestión de orden, todos los directorios que tengo compartidos por syncthing los mantengo en mi home de usuario, en ~/syncthing. Es importante mantener algún tipo de lógica, si no podemos tener directorios compartidos de todo el sistema con varios otros dispositivos, y a la larga puede ser un problema.
Por otro lado, los directorios compartidos no necesariamente deben llamarse igual en ambos equipos. Por ejemplo, un equipo podría compartir ~/syncthing/dir1 con otro, y este otro almacenarlo como ~/syncthing/otrascosas. Ambos directorios quedarán enlazados, pero debemos recordar eso para evitar guardar archivos en el directorio equivocado.
Yo, por simplicidad y consistencia, le doy el mismo nombre al directorio compartido en todos los dispositivos.
Vamos con el ejemplo.
Voy a crear un directorio para compartir en ambos equipos. Tanto en Cryptos como en Devuan he creado vm_share
, un directorio compartido.
$ mkdir ~/syncthing/vm_share
Este directorio será compartido entre ambos. Yo lo he creado manualmente, pero (creo que) syncthing los crea automáticamente si lo configuramos y no lo encuentra.
Para compartirlo, desde cualquier equipo (supongamos Cryptos en este ejemplo), vamos a añadir la carpeta. Debajo de la lista de directorios, vamos a añadir uno nuevo dando clic en el botón «Add Folder«.

Esto nos abrirá una ventana nueva, donde, en la pestaña «General» podremos configurar un nombre (por simplicidad le doy el mismo nombre del directorio), y un path o ruta, allí colocaremos la ruta al directorio creado previamente:

En la pestaña «Sharing» configuraremos los equipos con los que deseamos compartir dicho directorio. En mi caso, he seleccionado el equipo Devuan que añadí anteriormente (como ven, uso syncthing hace mucho, y tengo varios dispositivos conectados):

Luego de esto, ya veremos el nuevo directorio configurado, y en el equipo con el que hemos compartido, Devuan en este caso, deberemos aceptar la invitación:

Al aceptar la invitación, veremos la misma pantalla de configuración de directorio compartido. Allí estableceremos, en la pestaña «General«, un nombre y ruta al directorio compartido.

Yo he cambiado el path para que quede dentro del directorio syncthing de mi home y tener ahí dentro todos los directorios compartidos.
Como curiosidad, en la pestaña «Advanced» podemos configurar si es una carpeta que recibirá archivos, o que enviará, o ambos (opción por default).
Una vez que hemos aceptado, ambos directorios se encontrarán sincronizados!
Cualquier archivo que coloquemos en uno de los equipos, se cargará automáticamente en el otro. Esto, por supuesto, si ambos directorios están compartidos como de envío y recepción de archivos.
Siguientes pasos
Una vez que ya tenemos el directorio compartido y funcional, podemos configurar otros parámetros. Por ejemplo, si editamos la carpeta compartida dentro de syncthing, dentro de la pestaña Advanced, veremos varios parámetros útiles, como:
- El intervalo de escaneo de cambios.
- El tipo de carpeta: si envía archivos solamente, o sólo recibe, o ambos.
- Configuraciones de espacio en disco.
- Orden de verificación de archivos.
- Otros parámetros de sincronización de metadatos, como permisos, dueño, etc.
En las otras pestañas también podemos hacer cosas interesantes, por ejemplo:
- En Sharing podemos compartir el mismo directorio con otro dispositivo conectado.
- En Ignore Patterns podemos especificar qué archivos no queremos sincronizar.
- En File Versioning podemos configurar cómo queremos manejar diferentes versiones de los archivos sincronizados (esto no lo he probado, pero supongo que hará algo similar a Git, más rudimentario).
Y por supuesto, abajo tenemos el botón de «Remove» para eliminar el directorio.

Motivaciones: ¿para qué uso syncthing?
Uso esta herramienta hace muchos años ya, y no he tenido problemas.
Algunos usos que le doy son:
- Comparto un directorio entre mi computadora de escritorio y mi laptop para intercambiar videos y realizar diferentes procesos de edición en cada máquina.
- Comparto un directorio entre todos mis equipos con algunos archivos generales que quiero tener siempre disponible, como la base de datos de Keepass, mi gestor de contraseñas.
- Comparto entre mi computadora de escritorio y mi celular un directorio donde sincronizo las fotos que tomo, para tener backup (no uso Google Drive para eso).
Las posibilidades son muchas, y me ha solucionado problemas que tenía con otras herramientas.
De hecho, mucho del contenido que comparto entre mis equipos antes lo compartía via Dropbox o Mega, y ahora lo he movido a Syncthing porque no me interesa que esté en la nube.
Otras configuraciones interesantes
Para escribir este artículo me he puesto a jugar con syncthing, y he descubierto algunas cosas interesantes.
Como puede ser administrado por interfaz web, si necesitamos acceder desde otro equipo, que no sea localhost, podemos hacerlo cambiando la dirección IP de la interfaz web. Para ello vamos a «Actions» -> «Settings«, y en la pestaña «GUI» podemos cambiar la IP:

Esto nos permite acceder a syncthing desde cualquier equipo de la LAN, o administrarlo remotamente si nuestro servidor es accesible desde Internet.
De hecho, si estamos administrando un equipo remoto, y necesitamos cambiar la IP, podemos hacerlo por comandos editando el archivo de configuración ~/.config/syncthing/config.xml. No es lo ideal, pero ahí dentro está la dirección:

Por otro lado, si el servidor lo estamos administrando por SSH, una interesante opción sería «traernos» el puerto 127.0.0.1:8384 del servidor a nuestro cliente, y accederlo como si fuera local.
¿Cómo podemos hacer esto? Así: Reenvío de puerto: Tunelizando conexiones por SSH. En ese ejemplo lo hice con una base de datos, pero bien puede ser cualquier servicio TCP que esté atendiendo en un puerto determinado, como syncthing 😛
Conclusiones
Y hemos llegado al final!
Se hizo largo, quería añadir capturas de configuración de un cliente Android, pero es similar, y no era el fin del artículo. Igual, si les sirve, puedo escribir otro post añadiendo esas configuraciones 🙂
Hace tiempo me habían pedido este post, y sabía que iba a ser largo, muchas capturas y configuraciones, pero al fin llegó! 😀
De hecho tal vez lo grabe para el canal de YouTube para explicarlo más en detalle.
Quedan varias cositas por ver de syncthing, cómo funciona el protocolo, formatos de transferencia de archivos, capturas de tráfico y curiosidades que podemos detectar estudianto esto, pero bueno, eso será para otra oportunidad.
Espero que les sirva! Cualquier duda me escriben por redes sociales, o en nuestro grupo de Telegram.
Hasta la próxima!