Instalación de Syncthing para Sincronización de Archivos

Syncthing es una herramienta de sincronización de archivos descentralizada y de código abierto que sincroniza datos entre dispositivos de forma directa P2P sin servidores centrales, con cifrado TLS en tránsito y opciones de versionado de archivos. A diferencia de Dropbox o Google Drive, Syncthing no almacena tus datos en servidores de terceros, siendo ideal para sincronización de datos sensibles entre servidores, equipos de desarrollo y dispositivos personales. Esta guía cubre la instalación y configuración completa en Linux.

Requisitos Previos

  • Linux (Ubuntu/Debian o CentOS/Rocky)
  • Acceso a los puertos 22000 (TCP/UDP) para la sincronización
  • Acceso al puerto 8384 para la interfaz web (solo local)
  • Al menos dos dispositivos para sincronizar

Instalación de Syncthing

# Ubuntu/Debian - Agregar el repositorio oficial
curl -fsSL https://syncthing.net/release-key.gpg | \
    sudo gpg --dearmor -o /usr/share/keyrings/syncthing-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/syncthing-archive-keyring.gpg] \
    https://apt.syncthing.net/ syncthing stable" | \
    sudo tee /etc/apt/sources.list.d/syncthing.list

sudo apt-get update
sudo apt-get install -y syncthing

# CentOS/Rocky Linux
sudo dnf install -y syncthing

# O descargar el binario directamente
SYNCTHING_VERSION="1.27.5"
curl -LO "https://github.com/syncthing/syncthing/releases/download/v${SYNCTHING_VERSION}/syncthing-linux-amd64-v${SYNCTHING_VERSION}.tar.gz"
tar xzf syncthing-linux-amd64-v${SYNCTHING_VERSION}.tar.gz
sudo cp syncthing-linux-amd64-v${SYNCTHING_VERSION}/syncthing /usr/local/bin/

# Verificar la instalación
syncthing --version

Configuración como Servicio

Con systemd (para usuario del sistema)

# Crear usuario dedicado para Syncthing (opcional, recomendado)
sudo useradd --system --create-home --shell /bin/false syncthing

# Habilitar el servicio de usuario systemd
sudo systemctl enable syncthing@syncthing
sudo systemctl start syncthing@syncthing

# Para tu usuario actual
systemctl --user enable syncthing
systemctl --user start syncthing

# Ver el estado
systemctl status syncthing@syncthing

# Ver los logs
journalctl -u syncthing@syncthing -f

Configurar acceso web remoto

Por defecto, la interfaz web solo escucha en localhost. Para acceder remotamente de forma segura:

# Opción 1: Túnel SSH (recomendado para acceso ocasional)
# Desde tu máquina local:
ssh -L 8384:localhost:8384 [email protected]
# Luego acceder a http://localhost:8384 en tu navegador

# Opción 2: Proxy Nginx con autenticación
apt-get install -y nginx apache2-utils

# Crear credenciales para acceso web
htpasswd -c /etc/nginx/.syncthing-htpasswd admin

cat > /etc/nginx/sites-available/syncthing << 'EOF'
server {
    listen 443 ssl http2;
    server_name syncthing.tudominio.com;

    ssl_certificate /etc/letsencrypt/live/syncthing.tudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/syncthing.tudominio.com/privkey.pem;

    auth_basic "Syncthing Admin";
    auth_basic_user_file /etc/nginx/.syncthing-htpasswd;

    location / {
        proxy_pass http://127.0.0.1:8384;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF

ln -s /etc/nginx/sites-available/syncthing /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Modificar la configuración de Syncthing

# Editar la configuración XML directamente
# (o usar la interfaz web en http://localhost:8384)
nano ~/.config/syncthing/config.xml

# Cambiar la dirección de escucha de la GUI para acceso local
# <address>127.0.0.1:8384</address>
# Cambiar a 0.0.0.0:8384 solo si usas firewall o autenticación

# Reiniciar después de cambios en el archivo de configuración
systemctl --user restart syncthing

Emparejar Dispositivos

Obtener el ID del dispositivo

# Ver el ID único de este dispositivo
syncthing --device-id

# O desde la interfaz web: Actions > Show ID
# El ID tiene el formato: XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX

Agregar un dispositivo desde la CLI (editando config.xml)

# La forma más sencilla es usar la interfaz web:
# 1. En el dispositivo A: Actions > Show ID → copiar el ID
# 2. En el dispositivo B: Add Remote Device → pegar el ID
# 3. En el dispositivo A: aparecerá una notificación para aceptar el dispositivo B

# Para configuración automatizada, editar config.xml:
# Agregar dentro de <configuration>:
<!-- Agregar en config.xml del dispositivo -->
<device id="DISPOSITIVO-B-ID-XXXX" name="Servidor-Backup" compression="metadata" introducer="false">
    <address>dynamic</address>
    <paused>false</paused>
    <autoAcceptFolders>false</autoAcceptFolders>
    <maxSendKbps>0</maxSendKbps>
    <maxRecvKbps>0</maxRecvKbps>
</device>
# Reiniciar para aplicar cambios en config.xml
systemctl --user restart syncthing

Compartir Carpetas y Versionado

Tipos de versionado disponibles

  • Sin versionado: los archivos eliminados se eliminan permanentemente
  • Papelera de reciclaje: mueve archivos eliminados a .stversions/Trash
  • Simple: mantiene N versiones del archivo
  • Escalonado: retención por tiempo (últimas horas, días, semanas, meses, años)
  • Externo: ejecuta un script personalizado al versionar

Configurar versionado escalonado (recomendado)

En la interfaz web: Edit Folder > Versioning > Staggered:

  • Máximo de versiones: 5 para las últimas horas
  • Días de retención: 30
<!-- En config.xml, dentro del elemento <folder> -->
<versioning type="staggered">
    <cleanupIntervalS>3600</cleanupIntervalS>
    <fsPath>.stversions</fsPath>
    <params>
        <maxAge>2592000</maxAge>   <!-- 30 días en segundos -->
        <cleanInterval>3600</cleanInterval>
    </params>
</versioning>

Configurar carpetas de solo lectura (enviar)

# Para carpetas donde el servidor solo envía datos (distribución de contenido)
# En la interfaz web: Edit Folder > Folder Type > Send Only

# Para carpetas donde el servidor solo recibe (backups)
# Edit Folder > Folder Type > Receive Only

# Recibir y Enviar es la opción por defecto (sincronización bidireccional)

Patrones de Exclusión

# Crear archivo .stignore en la raíz de la carpeta sincronizada
cat > /ruta/de/carpeta/.stignore << 'EOF'
# Excluir directorios comunes de desarrollo
.git
node_modules
.next
__pycache__
.venv
venv
*.pyc
dist
build

# Excluir archivos temporales y caché
*.tmp
*.cache
.DS_Store
Thumbs.db
*~

# Excluir archivos de log grandes
*.log

# Excluir directorios de caché de aplicaciones
.cache
.local/share/Trash

# Patrones con expresiones regulares (prefijo #!re:)
#!re:\.backup\.\d+$
EOF

Patrones incluidos desde otro archivo

# Syncthing soporta incluir patrones de archivos externos
# En .stignore:
#include .gitignore

# Esto incluye todos los patrones del .gitignore existente
# sin duplicar la configuración

Relay Servers y NAT

Cuando los dispositivos están detrás de NAT y no pueden conectarse directamente, Syncthing usa servidores de relay de la comunidad. Para mayor privacidad o rendimiento, puedes usar tu propio relay:

# Instalar el servidor de relay de Syncthing
curl -LO https://github.com/syncthing/relaysrv/releases/latest/download/relaysrv-linux-amd64.tar.gz
tar xzf relaysrv-linux-amd64.tar.gz
sudo mv relaysrv-linux-amd64/relaysrv /usr/local/bin/

# Crear servicio systemd para el relay
cat > /etc/systemd/system/syncthing-relay.service << 'EOF'
[Unit]
Description=Syncthing Relay Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/relaysrv \
    -listen=0.0.0.0:22067 \
    -status-srv=0.0.0.0:22070
Restart=on-failure
User=nobody

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now syncthing-relay

# Abrir los puertos necesarios
ufw allow 22067/tcp  # Relay data
ufw allow 22070/tcp  # Status HTTP
# Configurar Syncthing para usar tu propio relay
# En config.xml:
<!-- Agregar en la sección <options> -->
<relaysEnabled>true</relaysEnabled>
<relayWithoutGlobalAnn>true</relayWithoutGlobalAnn>

<!-- Agregar servidor de relay personalizado -->
<relayURL>relay://tu-relay.tudominio.com:22067</relayURL>

Instalación con Docker

# docker-compose.yml para Syncthing
cat > docker-compose.yml << 'EOF'
version: '3'

services:
  syncthing:
    image: syncthing/syncthing:latest
    container_name: syncthing
    hostname: mi-servidor
    environment:
      - PUID=1000  # UID del usuario propietario de los archivos
      - PGID=1000  # GID del usuario
    volumes:
      # Configuración de Syncthing
      - ./config:/var/syncthing
      # Directorios a sincronizar (ajustar según necesidad)
      - /home/usuario/documentos:/data/documentos
      - /var/www:/data/web
    ports:
      - "8384:8384"   # Interfaz web (solo exponer con nginx/auth)
      - "22000:22000/tcp"  # Puerto de transferencia
      - "22000:22000/udp"  # Descubrimiento QUIC
      - "21027:21027/udp"  # Descubrimiento local
    restart: unless-stopped
    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
EOF

docker compose up -d

# Ver los logs
docker compose logs syncthing -f

Solución de Problemas

Dispositivos no se conectan entre sí

# Verificar que el puerto 22000 está accesible
sudo ufw allow 22000/tcp
sudo ufw allow 22000/udp

# Comprobar desde el otro dispositivo
nc -zv IP_DEL_SERVIDOR 22000

# Verificar en la interfaz web: Remote Devices > el dispositivo > Address
# "Connected" indica conexión directa
# "Relayed" indica que usa un servidor relay (más lento)

Conflictos de sincronización

# Los archivos en conflicto se nombran: archivo.sync-conflict-FECHA-DEVICEID.ext
# Encontrar todos los conflictos
find /ruta/carpeta -name "*.sync-conflict-*"

# Resolverlos manualmente: comparar, elegir la versión correcta y eliminar el conflicto
# La causa más común: el mismo archivo fue modificado en dos dispositivos sin sincronizar

Sincronización muy lenta

# Verificar el ancho de banda usado por Syncthing
# En la interfaz web: el gráfico de tráfico muestra la velocidad actual

# Limitar el ancho de banda de subida/descarga
# En config.xml:
# <maxSendKbps>5120</maxSendKbps>  <!-- 5 MB/s -->
# <maxRecvKbps>5120</maxRecvKbps>

# Habilitar compresión para conexiones lentas
# En Devices > Edit: Compression > Metadata or All

La interfaz web no responde

# Verificar que Syncthing está corriendo
systemctl --user status syncthing
# O:
systemctl status syncthing@tu-usuario

# Ver logs de errores
journalctl --user -u syncthing --since "1 hour ago"

# Reiniciar el servicio
systemctl --user restart syncthing

Conclusión

Syncthing es la herramienta de sincronización más respetuosa con la privacidad disponible en el ecosistema open source, ya que los datos nunca pasan por servidores de terceros. Su combinación de sincronización P2P directa, cifrado TLS, versionado configurable y soporte para relay servers lo hace adecuado tanto para sincronización entre servidores de producción como para replicación de datos de desarrollo entre equipos. La ausencia de límites de almacenamiento o velocidad lo convierte en una alternativa escalable a cualquier servicio de sincronización en la nube.