Ir al contenido
  1. Posts/

Syncthing: sincroniza tus archivos sin pasar por ninguna nube

Dejé Dropbox después de que subieran el precio por tercera vez y la versión gratuita pasara a limitar el número de dispositivos. No fue una decisión difícil, pero sí me obligó a buscar una alternativa real, no solo otro servicio de nube con mejor precio.

La diferencia con lo que buscaba era simple: quería que mis archivos fueran de un dispositivo a otro directamente, sin pasar por un servidor de nadie. No porque tenga algo que ocultar, sino porque prefiero no depender de que una empresa decida cuánto cobrar el año que viene.

Syncthing resuelve exactamente eso. No tiene servidor central. Los dispositivos se conectan entre sí de forma directa cuando están en la misma red, o a través de retransmisores STUN/TURN cuando están en redes diferentes, pero en ningún caso tus archivos pasan por un servidor que no controlas.

Llevo más de un año usándolo para sincronizar documentos, proyectos, y fotos del móvil al servidor. No ha fallado una sola vez de forma que haya perdido datos. Ha tenido algún conflicto de sincronización, que solucionó solo la mayoría de las veces, y algún momento en que tardó más de lo esperado en conectar cuando las redes eran complicadas. Nada que no se pudiera arreglar.

Cómo funciona Syncthing
#

Cada instalación de Syncthing tiene un ID único, generado localmente. Para conectar dos dispositivos, introduces el ID de uno en el otro y te envía una solicitud de conexión que tienes que aceptar. Eso es todo lo que necesitas para empezar a sincronizar.

No hay cuenta, no hay contraseña de servicio, no hay registro. El protocolo es peer-to-peer con cifrado TLS entre cada par de dispositivos. Si los dos dispositivos están en la misma red local, la sincronización pasa por esa red directamente. Si están en redes diferentes, Syncthing usa servidores de descubrimiento y retransmisión para establecer la conexión, pero los datos van cifrados de extremo a extremo.

Cada carpeta que sincronizas es independiente. Puedes tener una carpeta de documentos sincronizada entre el portátil y el servidor, una carpeta de fotos del móvil que va solo al servidor, y una carpeta de proyectos compartida entre varios dispositivos, todo en la misma instalación.

Los tipos de carpeta que ofrece Syncthing:

Send and Receive: sincronización bidireccional. Los cambios en cualquier dispositivo se propagan a los demás. Es lo que usarías para documentos de trabajo.

Send Only: la carpeta solo envía cambios, no acepta cambios del exterior. Útil para hacer copias del móvil al servidor sin que el servidor pueda sobreescribir lo que hay en el móvil.

Receive Only: la carpeta solo recibe cambios. Útil para backups: el servidor acepta lo que le mandan pero no modifica el origen.

Instalación
#

Syncthing tiene instaladores para todas las plataformas. En Linux, la forma más limpia es el paquete oficial.

En Debian/Ubuntu:

1
2
3
4
5
6
# Añadir la clave del repositorio
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list

sudo apt update
sudo apt install syncthing

Para que arranque automáticamente como servicio del sistema:

1
2
sudo systemctl enable syncthing@tu-usuario
sudo systemctl start syncthing@tu-usuario

La interfaz web está en http://localhost:8384 por defecto. Si quieres acceder desde otro dispositivo en la red local, cambia la dirección de escucha en la configuración o usa un túnel.

En Docker, si prefieres ese enfoque:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: "3"
services:
  syncthing:
    image: syncthing/syncthing:latest
    container_name: syncthing
    hostname: mi-servidor
    user: "1000:1000"
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./syncthing/config:/var/syncthing/config
      - /ruta/a/datos:/datos
    ports:
      - 8384:8384
      - 22000:22000/tcp
      - 22000:22000/udp
      - 21027:21027/udp
    restart: unless-stopped

El puerto 8384 es la interfaz web. El 22000 es el protocolo de sincronización (TCP y UDP). El 21027 UDP es para el descubrimiento local en red. Si solo vas a sincronizar en red local, los puertos UDP son suficientes. Si quieres sincronización remota, necesitas que el 22000 TCP sea accesible desde fuera.

En Android e iOS hay clientes oficiales. La aplicación se llama Syncthing en Android (está en F-Droid y en Google Play). En iOS hay Möbius Sync, que es de terceros porque Apple limita las aplicaciones que pueden ejecutarse en segundo plano, lo cual complica la sincronización automática.

Configuración inicial
#

Cuando abres la interfaz web por primera vez, Syncthing te muestra el ID del dispositivo (una cadena larga de letras y números, formato XXX-XXX-XXX-XXX). Ese ID es lo que compartes con otros dispositivos para conectarte.

La interfaz tiene dos secciones principales: Carpetas y Dispositivos.

Para añadir un dispositivo, vas a “Add Device”, pegas el ID del otro dispositivo y le pones un nombre descriptivo. El otro dispositivo recibirá una notificación para aceptar la conexión. Hasta que no aceptes en los dos lados, no se sincroniza nada.

Para añadir una carpeta, vas a “Add Folder”. Le das un nombre, una ruta local donde van a vivir los archivos, y seleccionas con qué dispositivos quieres compartirla. También configuras el tipo (Send and Receive, Send Only, Receive Only) y las exclusiones si las necesitas.

Ignorar archivos con .stignore
#

Cada carpeta puede tener un fichero .stignore en la raíz que lista los patrones de archivos que Syncthing debe ignorar. Funciona de forma similar a .gitignore.

Ejemplos útiles:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Cachés y temporales
.DS_Store
Thumbs.db
*.tmp
~$*

# Cachés de herramientas de desarrollo
node_modules
.venv
__pycache__
.git

# Archivos grandes que no quiero sincronizar
*.iso
*.dmg

El .stignore también admite el prefijo #include para reutilizar patrones entre carpetas. Si tienes un conjunto de exclusiones común, puedes poner el fichero en un lugar y referenciarlo desde cada carpeta.

Resolución de conflictos
#

Cuando dos dispositivos modifican el mismo archivo antes de sincronizarse, Syncthing crea un archivo de conflicto con el nombre archivo.sync-conflict-YYYYMMDD-HHMMSS-IDDEVICE.ext. El original se queda con la versión más reciente y el conflicto queda como un fichero separado que tú decides qué hacer con él.

No es tan sofisticado como Google Drive, que permite ver el historial de versiones desde el navegador, pero para uso personal es suficiente. En más de un año de uso, he tenido quizás cuatro o cinco conflictos reales, todos en archivos donde había estado editando desde dos sitios a la vez sin esperar a que sincronizara.

Hay una opción en la configuración avanzada de la carpeta para mantener versiones antiguas de los archivos durante un número de días configurable. Si activas eso, Syncthing guarda copias de las versiones anteriores en una carpeta .stversions dentro de la carpeta sincronizada. No es un sistema de backup completo, pero ayuda en casos donde sobreescribes algo por error.

Syncthing con un servidor siempre encendido
#

La limitación de la sincronización P2P es que dos dispositivos solo pueden sincronizarse si los dos están encendidos al mismo tiempo. Si trabajo en el portátil durante el día y cierro la tapa antes de que el servidor procese los cambios, habrá un retraso hasta que vuelvan a coincidir encendidos.

La solución habitual es tener un dispositivo siempre encendido en el homelab que actúe de punto de sincronización central. En mi caso es el servidor en casa. Todos los demás dispositivos sincronizan con él. Cuando el portátil y el móvil no están encendidos al mismo tiempo, el servidor hace de intermediario: el portátil manda los cambios al servidor, el servidor se los manda al móvil cuando se conecta.

Esto no contradice el principio P2P. Syncthing no tiene un servidor de empresa en medio, pero tú puedes tener tu propio servidor siempre encendido que actúe de hub. La diferencia es que ese servidor está bajo tu control y solo tú tienes acceso a los archivos.

Para este uso, el consumo de recursos de Syncthing en el servidor es muy bajo. En mi setup con unos 200 GB sincronizados entre varios dispositivos, el proceso consume menos de 50 MB de RAM en reposo y prácticamente nada de CPU salvo cuando está activamente sincronizando.

Acceso remoto
#

Si quieres acceder a los archivos desde fuera de casa, tienes dos opciones:

La primera es exponer el puerto 22000 TCP a internet directamente o a través de Cloudflare Tunnel. Syncthing sabrá conectar cuando esté fuera de la red local.

La segunda, que prefiero, es combinar Syncthing con Tailscale. Los dispositivos conectados a Tailscale pueden sincronizarse como si estuvieran en la misma red local, sin abrir puertos al exterior. La velocidad es buena y no necesito preocuparme por las reglas del firewall.

En la configuración de Syncthing, si tienes Tailscale puedes fijar la dirección de escucha a la IP de Tailscale del dispositivo para que las conexiones remotas vayan siempre por esa interfaz cifrada.

Comparativa con Nextcloud Files
#

Nextcloud también tiene sincronización de archivos y es la alternativa self-hosted más popular para reemplazar Google Drive. La diferencia principal es de modelo: Nextcloud es un servidor central al que los clientes se conectan. Syncthing no tiene servidor central.

Nextcloud ofrece más funciones alrededor de los archivos: compartir con enlace público, colaboración en documentos, aplicaciones adicionales como calendario o notas. Si necesitas eso, Nextcloud tiene más sentido.

Syncthing es más simple y más robusto para lo que hace. No hay servidor web que mantener, no hay base de datos, no hay PHP que actualizar. Si lo único que quieres es que tus archivos estén en varios sitios a la vez, Syncthing lo hace mejor y con menos mantenimiento.

Lo que no hace Syncthing
#

No tiene interfaz de acceso web a los archivos. No puedes abrir un navegador, navegar por tus archivos y descargar uno desde cualquier lugar como puedes hacer con Nextcloud o un NAS con interfaz web. Si necesitas eso, Syncthing no es suficiente por sí solo.

No reemplaza un backup. Syncthing sincroniza. Si borras un archivo en un dispositivo, se borra en todos los demás. Para protegerte contra borrados accidentales, el historial de versiones que mencioné antes ayuda, pero no es un sistema de backup completo. Para eso sigo usando Restic.

No tiene control de acceso por usuario más allá del PIN de la interfaz web. Si quieres compartir carpetas con personas externas con permisos diferentes, Nextcloud es más apropiado.

Mi configuración actual
#

Tengo Syncthing instalado en el servidor en casa (Docker), en el portátil (instalación nativa en Linux), y en el móvil Android (aplicación oficial).

Las carpetas que sincronizo:

Documentos: Send and Receive entre los tres. Son los archivos que trabajo día a día.

Fotos del móvil: Send Only desde el móvil, Receive Only en el servidor. Las fotos van al servidor automáticamente cuando el móvil está conectado a WiFi. En el servidor, Syncthing las pone en una carpeta que Immich monitoriza para importarlas automáticamente. El resultado es que cada foto que hago en el móvil acaba en mi galería de Immich sin que tenga que hacer nada.

Proyectos: Send and Receive entre portátil y servidor. Proyectos de código, diseño, y documentación que quiero tener respaldados en el servidor además de en git.

El servidor hace de hub. Cuando el portátil y el móvil no están encendidos al mismo tiempo, los cambios pasan por el servidor y llegan al otro dispositivo cuando se conecta. En la práctica, la sincronización es casi instantánea cuando hay conexión a la red local.

La configuración me llevó una tarde. El mantenimiento desde entonces ha sido cero. Esa es la mejor señal de que la herramienta hace lo que promete.