709 - Sincroniza tus dispositivos sin sube

709 - Sincroniza tus dispositivos sin sube

Descubre Syncthing, la herramienta de sincronización de archivos P2P que respeta tu privacidad. Sincroniza carpetas entre dispositivos sin la nube.

1:25
-3:15

Desde la llegada de Gemini Cli a mi stack tecnológico se ha producido una revolución, y esto me ha llevado a darle una vuelta a mi flujo de trabajo. Quiero buscar como exprimir al máximo esta herramienta, y sacarle mucho mas partido, algo que se que es posible. Sin embargo, inevitablemente, algunas cosas tienen que cambiar. Necesito, que todos mis archivos estén de forma completamente transparente para que Gemini Cli, pueda leerlos, incluso si puede ser con control de versiones, todavía mejor, y todo por hacerle la vida mas fácil, que al final es hacernos la vidad mas fácil a nosotros. En este sentido, estaba buscando como sincronizar todos los archivos de mis dispositivos de otra forma. Fue entonces cuando me acordé de Syncthing, una herramienta que estuve utilizando hace ya algunos años, pero que había abandonado, y era el momento de recuperar.

Sincroniza tus dispositivos sin NUBE

Syncthing

Syncthing es una aplicación de sincronización de archivos de código abierto y gratuita que permite sincronizar archivos de forma continua entre dos o más dispositivos en tiempo real. Funciona en una red peer-to-peer, lo que significa que no hay un servidor central involucrado, mejorando la privacidad y seguridad de los datos.

Esto de que no hay un servidor central no es del todo cierto, en el sentido de que para el descubrimiento de los nodos es necesario, dependiendo del caso, dos tipos de nods en la red, que nos ayudan en la sincronización, que son los servidores de descubrimiento y los de retransmisión.

Servidores de Descubrimiento y Retransmisión

Como decía en el punto anterior, para el correcto funcionamiento de la red de Syncthing, dependiendo de la situación, red, cortafuegos, etc, es necesario la intervención de dos tipos de servidores, que son los de descubrimiento y los de retransmisión.

  • Servidor de Descubrimiento (Discovery Server). La función de un servidor de descubrimiento es ayudar a los dispositivos Syncthing a encontrarse entre sí en la red. Actúa como un directorio, mapeando los IDs de los dispositivos a sus direcciones IP. Esto es crucial para dispositivos con IPs dinámicas o detrás de NATs. El servidor de descubrimiento solo maneja metadatos de conexión (IDs de dispositivo, IPs), no el contenido de los archivos.
  • Servidor de Retransmisión (Relay Server). Un servidor de retransmisión, se utiliza cuando dos dispositivos Syncthing no pueden establecer una conexión directa (por ejemplo, debido a firewalls restrictivos). El servidor de retransmisión actúa como un intermediario, retransmitiendo el tráfico cifrado entre los dos dispositivos. Aunque el servidor de retransmisión conoce las IPs y los IDs de los dispositivos que se comunican y el volumen de datos, no puede ver el contenido de los archivos, ya que la comunicación es cifrada de extremo a extremo.

Por resumirlo de forma sencilla, los servidores de descubrimiento ayudan a los dispositivos a encontrarse, mientras que los servidores de retransmisión facilitan la comunicación entre dispositivos cunado la comunicación directa no es posible.

Indicar, que todo esto, en una red local, no es necesario. Es decir, si tus dos dispositivos se encuentran en una red local, no necesitarás ni servidores de retransmisión ni servidores de descubrimiento. Los dispositivos serán capaces de localizarse entre ellos y sincronizarse de forma completamente autónoma.

Llegados a este punto, probablemente ya te habrás llevado las manos a la cabeza en varias ocasiones pensando en la infraestructura que tienes que levantar. Sin embargo no es tanto así. Existen una serie de servidores de descubrimiento como de servidores de retransmisión disponibles para su utilización. Con lo que no es necesario que lo levantes por tu cuenta… Pero, si quieres ser completamente independiente, también lo puedes hacer, como te mostraré mas adelante.

Características de Syncthing

Las características principales de esta herramienta son las siguientes,

  • Privacidad y seguridad. Los datos se almacenan solo en los dispositivos del usuario, y la comunicación está cifrada.
  • Multiplataforma. Disponible para Windows, macOS, Linux, Android, FreeBSD, Solaris y BSD.
  • Fácil de usar. Se configura y monitoriza a través de una interfaz web, sin necesidad de direcciones IP o configuraciones avanzadas. Es transversal a todos los sistemas operativos, en el sentido que la interfaz web es idéntica en todos ellos.
  • Sincronización flexible. Puede sincronizar archivos en red local o a través de Internet, permitiendo sincronizar múltiples carpetas. Para esto, es necesario el uso de los relay que comenté anteriormente. Tu tienes el control de que se sincroniza y con quien se sincroniza. Control total.
  • Privacidad. Los datos se almacenan solo en los dispositivos del usuario, y la comunicación está cifrada. No hay un servidor central, tus datos sólo están en tus dispositivos.

Configuración

Con independencia del sistema operativo en el que te encuentres, siempre puedes configurar Syncthing vía interfaz web. En el momento que inicias Syncthing, la interfaz web está disponible en http://localhost:8384.

En la interfaz web encontrarás tres paneles principales,

  • El de las carpetas, donde indica cada una de las carpetas que tienes compartida, y el estado en que se encuentran esas carpetas. Además puedes ver toda la información relativa a cada una de ellas, desde el ID de la carpeta, el tipo de carpeta, con quien está compartida y mucho mas. Desde aquí, puedes acceder el cuadro de diálogo para editar la carpeta, donde puedes compartir todos los parámetros indicados anteriormente.
  • Un panel llamado Este Dispositivo, donde encontrarás la información relativa a tu dispositivo, con parámetros como la velocidad de subida o descarga, el estado, los oyentes, la identificación o el descubrimiento, por citar algunos.
  • Por último, el tercero de los paneles te permite identificar los dispositivos con los que compartes algo. Aquí al igual que lo que sucede con el de carpetas, te permite ver los parámetros configurados en cada uno de los dispositivos y por supuesto, también modificarlos desde un cuadro de diálogo. Desde ese cuadro de diálogo verás información del dispositivo, pero también podrás especificar que quieres compartir con ese dispositivo.

Instalación

En el episodio 702 titulado Arcane ha cambiado mi forma de usar Docker, te hablé sobre Arcane, que es similar a Portainer, pero mucho mas simplificado. Así en mi repositorio de plantillas de Arcane en GitHub, puedes encontrar esta plantilla para Syncthing, acompañada de un Servidor de Descubrimiento y un Servidor de Retransmisión. De cualquier forma también te lo añado a continuación,

services:
  syncthing:
    image: syncthing/syncthing:latest
    hostname: syncthing
    container_name: syncthing
    restart: unless-stopped
    init: true
    environment:
      PUID: "1000"
      PGID: "1000"
      DOMAIN: "sync.territoriolinux.es"
    volumes:
      - syncthing:/var/syncthing
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    networks:
      - proxy
    healthcheck:
      test: curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1
      interval: 1m
      timeout: 10s
      retries: 3
    labels:
      traefik.enable: "true"
      traefik.http.routers.syncthing.rule: "Host(`${FQDN_SYNC}`)"
      traefik.http.routers.syncthing.entrypoints: "https"
      traefik.http.services.syncthing.loadbalancer.server.port: "8384"
      traefik.http.routers.syncthing.middlewares: "oidc-auth@file"

  discosrv:
    image: syncthing/discosrv
    container_name: disco
    hostname: disco
    environment:
      - PUID=1000
      - PGID=1000
    restart: unless-stopped
    init: true
    entrypoint: ["/bin/entrypoint.sh", "/bin/stdiscosrv", "--http", "--compression", "--debug", "--cert=/certs/${FQDN_DISCO}/cert.pem", "--key=/certs/${FQDN_DISCO}/key.pem"]
    volumes:
      - disco:/var/stdiscosrv
      - certs:/certs
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    networks:
      - proxy
    labels:
      traefik.enable: "true"
      traefik.http.routers.disco.rule: "Host(`${FQDN_DISCO}`)"
      traefik.http.routers.disco.entrypoints: "https"
      traefik.http.services.disco.loadbalancer.server.port: "8443"
      traefik.http.routers.disco.tls.options: "discosrv@file"
      traefik.http.middlewares.disco.passtlsclientcert.pem: "true"
      traefik.http.routers.disco.middlewares: "disco,htransformation@file"

  relaysrv:
    image: syncthing/relaysrv
    container_name: relaysrv
    hostname: relaysrv
    environment:
      - PUID=1000
      - PGID=1000
    restart: unless-stopped
    entrypoint: ["/bin/entrypoint.sh", "/bin/strelaysrv", "-pools", ""]
    volumes:
      - data:/var/strelaysrv
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    networks:
      - proxy
    labels:
      traefik.enable: "true"
      traefik.tcp.routers.relaysrv.rule: "HostSNI(`*`)"
      traefik.tcp.routers.relaysrv.entrypoints: "relay"
      traefik.tcp.routers.relaysrv.service: "relaysrv"
      traefik.tcp.services.relaysrv.loadbalancer.server.port: "22067"

volumes:
  syncthing: {}
  disco: {}
  data: {}
  certs:
    external: true

networks:
  proxy:
    external: true

Esto es suponiendo que estés utilizando Traefik, como proxy inverso, en cuyo caso, además tienes que añadir algunos cambios adicionales para que todo funcione como espera.

Configuración de traefik

Dentro de la configuración estática de Traefik, en el archivo traefik.yml, tienes que añadir el siguiente entryPoint,

relay:
  address: ":22067"

Por supuesto que si tienes habilitado el Firewall, como es mi caso particular, tienes que permitir ese puerto.

Además tienes que añadir el siguiente plugin,

experimental:
  plugins:
    htransformation:
      moduleName: "github.com/tomMoulard/htransformation"
      version: "v0.3.3"

Y dentro de la configuración dinámica, tienes que añadir un par de cambios adicionales. El primero es la configuración dentro de tus middlewares,

http:
  middelwares:
    htransformation:
      plugin:
        htransformation:
          Rules:
            - Rule:
              Name: 'X-Client-Port Set'
              Header: 'X-Client-Port'
              Value: '^X-Forwarded-Port'
              HeaderPrefix: "^"
              Type: 'Set'

Y dentro de tls lo siguiente,

tls:
  options:
    default:
      minVersion: VersionTLS12
      cipherSuites:
       - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
       - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
       - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"
       - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
       - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
       - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305"
    modern: &modern_tls
      minVersion: VersionTLS13
      sniStrict: true
    discosrv:
      <<: *modern_tls
      clientAuth:
        clientAuthType: RequireAnyClientCert

Ten en cuenta que toda esta configuración particularizada para Traefik, únicamente es para los servidores de descubrimiento y retransmisión. Si no piensas tener tus propios servidores de descubrimiento y retransmisión, sino que vas a utilizar los por defecto, simplemente, puedes ignorar por completo esta sección.

Configuración particular de servidor de descubrimiento y de retransmisión

En el caso de que hayas querido utilizar tus propios servidores de descubrimiento y de retransmisión, lo puedes hacer en los clientes de la siguiente forma.

El primero, el relay es el servidor de retransmisión, mientras que para el servidor de descubrimiento está en la parte inferior como https://disco.tuservidor.es

Uso y funcionamiento

Olvidándonos por completo de los servidores de descubrimiento y de retransmisión, y centrándonos en lo importante, la sincronización, lo cierto es que el funcionamiento de Syncthing, es muy pero que muy sencillo.

Asumiendo que ya tienes Syncthing instalado y funcionando en ambos dispositivos, el siguiente paso es establecer la conexión entre ellos. Cada instalación de Syncthing tiene una ID de dispositivo única, que es como su número de identificación personal. Para que tus dos máquinas se vean y puedan compartir archivos, deberás añadir la ID de un dispositivo en el otro. Esto se hace a través de la interfaz web de Syncthing, buscando la opción para añadir un dispositivo remoto y pegando la ID que copiaste del otro.

Una vez que hayas añadido la ID del segundo dispositivo, este recibirá una notificación preguntando si acepta la conexión. Es crucial que aceptes esta solicitud en el segundo dispositivo para que la comunicación se establezca correctamente. Piensa en esto como si estuvieras aceptando una solicitud de amistad en una red social; hasta que ambos lados confirman, no hay un vínculo establecido. Una vez aceptada, tus dos dispositivos estarán emparejados y listos para intercambiar información sobre las carpetas que deseas sincronizar.

Con los dispositivos ya conectados, el siguiente paso es elegir qué carpeta quieres sincronizar. En uno de los dispositivos, selecciona la carpeta que deseas mantener idéntica en ambos (por ejemplo, tu carpeta de Documentos Importantes) y añádela como una carpeta compartida dentro de la interfaz de Syncthing. Al hacer esto, el dispositivo emparejado recibirá automáticamente una notificación preguntando si desea recibir esta carpeta. Deberás aceptar esta solicitud y, muy importante, especificar dónde quieres que se guarde esa carpeta en el segundo dispositivo.

Finalmente, una vez que la carpeta ha sido aceptada en ambos extremos y se ha definido su ubicación, Syncthing comenzará su trabajo. Cualquier cambio que realices en esa carpeta en cualquiera de los dos dispositivos (añadir, borrar, modificar archivos) se replicará automáticamente en el otro. La sincronización es continua y en segundo plano, asegurando que siempre tengas la versión más reciente de tus archivos en ambos lugares, sin necesidad de intervención manual ni de depender de servicios en la nube externos.

Deja una respuesta

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