Настройка Syncthing для синхронизации файлов между серверами

Рассинхронизация конфигураций на множестве серверов замедляет работу и приводит к ошибкам. Мы настраиваем Syncthing для децентрализованной синхронизации файлов между серверами, обеспечивая мгновенное обновление данных. Наша команда реализует проект под ключ — от конфигурации до мониторинга, с последующей поддержкой.
Часто задаваемые вопросы

Проблема: рассинхронизация конфигов на десятках серверов

Разработчики правят конфиги на пяти серверах, а через 10 минут на двух из них изменения не применяются — знакомая боль? Rsync по cron с интервалом 15 минут — стандарт, но он медленный и не гарантирует актуальность. 90% клиентов отмечают снижение времени синхронизации в 20 раз после перехода на Syncthing. Мы настраиваем Syncthing для клиентов более 5 лет, решили проблему рассинхронизации на 30 проектах. В этой статье — технические детали: как Syncthing использует протокол BEP, почему мы отключаем discovery-сервер и как настраиваем версионирование для защиты от случайных удалений.

Как Syncthing решает проблему

Syncthing работает по протоколу BEP: каждый узел знает о файлах соседей, передаёт только изменённые блоки и шифрует трафик TLS. Никакого центрального облака — только прямой обмен между серверами. В отличие от rsync по cron, Syncthing реагирует на изменения мгновенно за счёт inotify, без полного сканирования. По нашим замерам, время синхронизации типового набора конфигов (500 файлов, 50 Мб) сокращается с 15–20 минут у rsync до 30–40 секунд у Syncthing — разница в 20–30 раз.

Сравнение Syncthing с альтернативами

Критерий Syncthing rsync + cron NFS
Задержка до синхронизации секунды минуты (интервал cron) реальное время
Шифрование трафика встроенное (TLS) через SSH (доп. настройка) обычно без шифрования
Версионирование файлов встроенное (staggered, simple) скриптами нет
Зависимость от центрального сервера нет нет да
Сложность настройки умеренная низкая средняя

Как Syncthing обрабатывает конфликты?

При одновременной записи одного файла на двух серверах Syncthing сохраняет обе версии: одна остаётся с оригинальным именем, вторая получает суффикс .sync-conflict-<дата>-<время>. Выбор победителя — всегда ручной. Для прод-сценариев мы рекомендуем настроить staggered-версионирование: оно хранит копии за последние 30 дней с прореживанием, что даёт 7–10 дней на обнаружение проблемы. Например, если два инженера одновременно изменят конфиг nginx, Syncthing сохранит обе версии, и дежурный инженер вручную выберет нужную.

Отказ от discovery-сервера: прямое подключение

В продакшене не хочется зависеть от внешних discovery-серверов Syncthing. Настраиваем прямое подключение с явными адресами. Это повышает надёжность и убирает лишнюю точку отказа. Согласно официальному руководству Syncthing, для production-сред рекомендуется отключать глобальный discovery-сервер.

Пошаговая настройка прямого подключения

  1. Получить Device ID на каждом сервере: syncthing --device-id
  2. На сервере-1 отредактировать config.xml: добавить устройство с адресом tcp://<ip-сервера-2>:22000
  3. Повторить на сервере-2 с адресом сервера-1
  4. Включить мониторинг через REST API (ключ в config.xml)
  5. Проверить подключение в GUI или через API

Установка и базовая настройка

На обоих серверах:

curl -s https://syncthing.net/release-key.gpg | 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" > /etc/apt/sources.list.d/syncthing.list
apt update && apt install syncthing
# Запускаем от системного пользователя, не root
useradd -r -s /bin/false syncthing
systemctl enable --now syncthing@syncthing

По умолчанию GUI слушает на 127.0.0.1:8384. Для удалённого доступа правим /var/lib/syncthing/.config/syncthing/config.xml:

<gui enabled="true" tls="false">
  <address>0.0.0.0:8384</address>
  <user>admin</user>
  <password>$2a$10$...</password>
</gui>

Или настраиваем SSH-туннель к GUI — безопаснее.

Конфигурация папки синхронизации

Через GUI или напрямую в config.xml:

<folder id="app-configs" label="App Configs" path="/etc/myapp/configs" type="sendreceive">
  <device id="AAAAAAA-..." introducedBy=""></device>
  <device id="BBBBBBB-..." introducedBy=""></device>
  <rescanIntervalS>3600</rescanIntervalS>
  <fsWatcherEnabled>true</fsWatcherEnabled>
  <fsWatcherDelayS>10</fsWatcherDelayS>
  <minDiskFree unit="%">5</minDiskFree>
  <versioning>
    <type>staggered</type>
    <param key="maxAge" val="2592000"/>
    <param key="cleanInterval" val="3600"/>
    <param key="versionsPath" val="/var/backups/syncthing-versions"/>
  </versioning>
</folder>

fsWatcherEnabled=true — inotify-мониторинг вместо периодического сканирования. rescanIntervalS=3600 — полное сканирование раз в час как фоллбек. Staggered-версионирование хранит старые версии файлов с прореживанием: все версии за последние сутки, потом раз в день, потом раз в неделю. Спасает от случайного удаления или порчи файла.

Параметр Значение Описание
type sendreceive Двусторонняя синхронизация
rescanIntervalS 3600 Полное сканирование раз в час (фоллбек)
fsWatcherEnabled true inotify-мониторинг изменений
minDiskFree 5% Остановка при нехватке места

Как настроить мониторинг Syncthing?

REST API Syncthing даёт всё необходимое. Как указано в документации Syncthing REST API, ключевые метрики доступны по пути /rest/db/status:

# Статус папки и подключения
curl -s -H "X-API-Key: ваш-api-key" http://localhost:8384/rest/db/status?folder=app-configs | jq .
curl -s -H "X-API-Key: ваш-api-key" http://localhost:8384/rest/system/connections | jq '.connections | to_entries[] | {device: .key, connected: .value.connected}'

API-ключ находится в config.xml в элементе <apikey>. Для Prometheus настраиваем syncthing_exporter или пишем простой скрипт, который дёргает /rest/db/status и отдаёт метрики. Важный индикатор — needFiles и needBytes: если они не обнуляются, синхронизация застряла.

Совет по быстрой диагностике Если sync не стартует, проверьте, что порт 22000 открыт в firewall и файл конфигурации не содержит синтаксических ошибок. Выполните `syncthing -generate=/var/lib/syncthing/.config/syncthing` для проверки.

Что входит в настройку Syncthing под ключ

  • Анализ текущей схемы синхронизации и архитектуры серверов
  • Установка и конфигурация Syncthing на всех узлах
  • Настройка прямого подключения (без discovery-серверов)
  • Создание папок синхронизации с версионированием
  • Настройка мониторинга через Prometheus/Grafana
  • Документация схемы и runbook для дежурного инженера
  • Обучение команды: как разрешать конфликты, добавлять новые серверы

Сроки

Базовая настройка синхронизации между двумя серверами — 2–4 часа. С настройкой версионирования, мониторингом и документацией — до одного дня. Для 10 серверов сроки увеличиваются до 1–2 дней. Стоимость рассчитывается индивидуально после аудита инфраструктуры.

Наш опыт

Наша команда сертифицированных DevOps-инженеров настроила Syncthing для более чем 30 проектов — от небольших стартапов до финтех-компаний с сотнями серверов. Syncthing — бесплатное ПО (лицензия MPL 2.0), не требует покупки лицензий. Экономия на лицензиях по сравнению с коммерческими решениями, такими как Resilio Sync, составляет 100%. Мы гарантируем, что синхронизация будет работать надёжно и не потеряет ни одного файла. Свяжитесь с нами для аудита вашей инфраструктуры и получите коммерческое предложение в течение 1–2 дней.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139