Jump to content

Syncthing (Русский)

From ArchWiki

Syncthing - это клиент-серверное приложение с открытым исходным кодом для синхронизации файлов, написанное на Go, которое реализует свой собственный - столь же бесплатный - Протокол обмена блоками. Все транзитные сообщения между узлами синхронизации шифруются с использованием TLS, и все узлы однозначно идентифицируются с помощью криптографических сертификатов.

Установка

Установите пакет syncthing.

Syncthing предоставляет #Web-GUI для управления и мониторинга. Существуют также GUI обёртки такие как #Syncthing-GTK и #Syncthing Tray (предоставляемые отдельными пакетами).

Запуск Syncthing

Начало работы Syncthing

Запустите двоичный файл syncthing вручную с терминала. Множество необязательных параметров описаны в syncthing(1).

Примечание: Вы можете запустить несколько копий syncthing, но только один экземпляр для каждого пользователя, поскольку syncthing блокирует для него базу данных. Проверьте журналы на наличие ошибок, связанных с заблокированной базой данных.

Автозапуск Syncthing

Syncthing может быть установлен либо как системная служба, либо как пользовательская служба для автоматического запуска.

Системная служба

Запуск Syncthing как системной службы гарантирует, что она будет запущена при загрузке, даже если у пользователя нет активного сеанса, и предназначена для использования на сервере. Добавьте в автозагрузку и запустите syncthing@"myusername".service, где myusername - фактическое имя пользователя Syncthing.

Warning: Если вы запускаете службу для учетной записи, в которой вы настроили umask не по умолчанию, то файл по умолчанию syncthing@username.service не будет соответствовать этому значению umask, вместо этого используют значение по умолчанию для служб SystemD (обычно 0022, что подразумевает глобальную читаемость). Примечательно, что любые устройства, которые используют разные системы разрешений (например, при использовании Syncthing-Fork на Android), могут сделать файлы, загруженные с этого устройства, глобально доступными для чтения любым пользователем в вашей системе, если синхронизированный каталог не находится в другом каталоге, к которому у вашего пользователя есть эксклюзивный доступ.

Чтобы установить umask в службе для всех пользователей, рассмотрите возможность использования drop-in файла SystemD:

/etc/systemd/system/syncthing@.service.d/override.conf
[Service]
UMask=0077

Затем перезапустите все соответствующие служебные юниты.

Это настроит все новые загруженные файлы для синхронизированных каталогов так, чтобы они были доступны для чтения и записи только соответствующим пользователем. Чтобы у существующих файлов были более строгие разрешения, можно использовать chmod og-rwx -R <соответствующий каталог>. В зависимости от вашего варианта использования, вы можете захотеть использовать немного более мягкие разрешения, чем "доступ только для чтения/записи определенными пользователями при запущенной синхронизации" - измените значения umask соответствующим образом.

Чтобы настроить Syncthing umask для одного пользователя, просто добавьте имя пользователя после символа @ в путь к раскрывающемуся файлу, чтобы выбрать соответствующий экземпляр шаблонного модуля SystemD. Это переопределит umask только при запуске службы синхронизации для этого отдельновзятого пользователя.

Note: Если учетная запись службы была создана явно для синхронизации (например, через useradd -r), убедитесь, что у пользователя есть домашний каталог, в противном случае служба немедленно завершит работу. Syncthing пытается поместить файлы конфигурации в $XDG_STATE_HOME/syncthing или $HOME/.local/state/syncthing.

Пользовательская служба: при входе в систему

Запуск Syncthing от имени службы systemd user гарантирует, что синхронизация начнется только после того, как пользователь войдет в систему (например, через графический экран входа в систему или ssh). Этот метод предназначен для использования на (многопользовательском) компьютере. Чтобы запустить пользовательскую службу, запустите/добавьте в автозапуск пользовательский юнит syncthing.service (т.е. с флагом --user).

Пользовательская служба: при загрузке

Служба systemd-user может быть запущена во время загрузки системы (т.е. без входа в систему) с помощью Systemd (Русский)/User (Русский)#Автоматический запуск systemd от имени пользователя.

Пользовательская служба: при монтировании

Служба Syncthing systemd user может быть запущена после подключения определенного (необязательно зашифрованного) устройства и остановлена после его отключения. Чтобы создать пользовательскую службу, зависящую от количества подключенных устройств, после подключения устройства найдите имя точки подключения systemd, запустив systemctl list-units -t mount. Затем создайте новую службу, аналогичную приведенной ниже:

/home/$USER/.config/systemd/user/syncthing.service
[Unit]
Description=Syncthing
BindsTo=run-media-user-and-hash.mount

[Service]
ExecStart=/usr/bin/syncthing

[Install]
WantedBy=run-media-user-and-hash.mount

Syncthing-GTK

syncthing-gtkAUR предоставляет графический пользовательский интерфейс GTK, уведомления на рабочем столе и интеграцию с файловыми менеджерами Nautilus, Nemo и Caja. Syncthing может быть запущен с помощью Syncthing-GTK: используйте настройки интерфейса для запуска syncthing-gtk при загрузке и указать, следует ли запускать демон syncthing.

Примечание: При запуске демона syncthing с использованием как systemd, так и syncthing-gtk может случиться так, что два экземпляра syncthing будут запущены одновременно, что приведет к высокой загрузке процессора: один будет запущен syncthing-gtk, а другой (чуть позже) - systemd. Чтобы решить эту проблему, либо избегайте запуска syncthing с помощью systems, либо настройте syncthing-gtk на ожидание демона syncthing.

Web-GUI

Syncthing предоставляет веб-интерфейс, доступный по умолчанию на http://localhost:8384.

Совет: Чтобы получить удаленный доступ к графическому интерфейсу, обратитесь к Часто задаваемые вопросы.

Syncthing Tray

syncthingtray-qt6AUR дополняет веб-интерфейс пользователя, предоставляя значок в системном трее на основе Qt и уведомления на рабочем столе. Существует версия, не зависящая от среды рабочего стола, и плазмоид для Plasma. Он также обеспечивает интеграцию с системами и файловым менеджером Dolphin.

Дополнительные замечания см. в прикрепленных комментариях к AUR. Если вы не уверены в конфигурации, рекомендуется также ознакомиться с README.

Пакеты также поставляются с утилитой syncthingctl, которая позволяет взаимодействовать с Syncthing из командной строки.

Конфигурация

После установки Syncthing уже имеет надлежащую конфигурацию для запуска. Новые серверы и/или папки можно добавить через веб-интерфейс. Подробные инструкции по простой настройке сети приведены в Начало работы с Syncthing.

После успешного первого запуска будет создан репозиторий по умолчанию в ~/Sync. Вы можете увидеть это в веб-интерфейсе администратора. Справа приведен список добавленных вами узлов. Слева находится список хранилищ, которые представляют собой папки, которые вы можете выбрать для совместного использования с другими узлами.

Чтобы добавить другой узел, нажмите "Add Node" под списком узлов. Вам будет предложено ввести идентификатор узла (который можно найти на другом компьютере, нажав Редактировать > Показать ID), а также краткое название и адрес.

Если вы укажете "dynamic" для адреса, сервер оповещений syncthing будет использоваться для автоматического обмена адресами между узлами. Если вы хотите узнать больше об идентификаторах узлов, включая криптографические значения, то можете прочитать соответствующую страницу документации Syncthing.

После сохранения конфигурации сервер синхронизации автоматически перезапускается. Далее вы можете либо изменить конфигурацию узла по умолчанию (щелкните его название, а затем Редактировать), либо создать новый узел для обмена данными. Просто отметьте узел, с которым вы хотите поделиться данными, и у него будет разрешение на доступ к ним.

Настройка локальной сети

В типичном случае, когда несколько компьютеров совместно используют LAN (Local Area Network) за маршрутизатором NAT (Network Address Translation), рекомендуется для универсальной конфигурации активировать как локальное, так и глобальное обнаружение на каждом узле:

  • Это позволит обнаруживать данные в любых ситуациях, в том числе, если некоторые узлы являются мобильными устройствами, такими как ноутбуки или телефоны на базе Android, и выходят из локальной сети и подключаются к Интернету. Таким образом, они по-прежнему будут найдены с помощью global discovery.
  • Используйте разные прослушиваемые адреса портов для каждой машины, например tcp://:22010, tcp://:22011, tcp://:22012 и так далее. Это позволит различать узлы на серверах глобального обнаружения и избежать появления сообщения "Connected to myself - should not happen" на других локальных устройствах всякий раз, когда они покидают локальную сеть.
  • Если на одном компьютере запущено несколько экземпляров для разных пользователей, установите разные порты для каждого пользователя localAnnouncePort (бродкаст IPv4), чтобы избежать проблем с синхронизацией, и выберите тот же localAnnounceMCAddr (мультикаст IPv6), чтобы найти другие устройства в локальной сети без глобального обнаружения (см. Параметры элемента).
  • Если два экземпляра на одном компьютере должны найти друг друга без глобального обнаружения, добавьте tcp://127.0.0.1:xxxxx в качестве второго адреса устройства, например, tcp://127.0.0.1:22001 и tcp://127.0.0.1:22001.//127.0.0.1:22002}} (см. Элемент устройства).
  • По возможности включите переадресацию портов UPnP или вручную перенаправьте каждый порт на нужный компьютер в локальной сети. При обнаружении нового узла Syncthing пытается использовать настроенный порт прослушивания, по умолчанию 22000. Если этот порт окажется недоступен, он будет искать другой порт локально: всякий раз, когда в Syncthing включен NAT traversal, он попытается использовать UPnP для сопоставления случайного внешнего порта с выбранным внутренним портом прослушивания, например 22000. Если UPnP не поддерживается или если его использование нежелательно, каждый порт должен быть вручную перенаправлен на нужный компьютер в локальной сети. В конечном итоге, если не удастся найти открытый порт с обеих сторон, будет использоваться ретрансляция.

Использование inotify

inotify (inode notify) - это подсистема ядра Linux, которая расширяет файловые системы, чтобы замечать изменения в файловой системе и сообщать об этих изменениях приложениям. Syncthing поддерживает функцию inotify, и эту функциональность можно включить в меню конфигурации для отдельных папок.

Участие в инфраструктуре

Можно принять участие в инфраструктуре Syncthing, запустив глобальный сервер обнаружения или сервер ретрансляции.

Запуск сервера ретрансляции

Syncthing имеет возможность подключать два устройства через ретрансляцию, когда невозможно установить прямое соединение между ними. Ретранслируемые соединения зашифрованы обычным образом, поэтому ретранслятор не имеет никакого представления о соединении, кроме информации об IP-адресах и идентификаторах устройств.

Любой желающий может запустить сервер ретрансляции, и он автоматически присоединится к пулу ретрансляторов Syncthing и будет доступен всем пользователям Syncthing. Чтобы запустить свой собственный ретранслятор, установите syncthing-relaysrv и запустите/добавьте в автозагрузку syncthing-relaysrv.service. Ограничение скорости и другие параметры можно настроить с помощью командной строки. Эти параметры можно задать в директиве ExecStart службы drop-in файла следующим образом:

/etc/systemd/system/syncthing-relaysrv.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/syncthing-relaysrv -global-rate 500000 -provided-by relayprovidername
Note: Ретранслятор по умолчанию прослушивает порты22067 для получения данных и 22070 для определения статуса обслуживания (используется для общедоступной статистики), поэтому они должны быть открыты для TCP-соединений. При необходимости порты по умолчанию могут быть соответственно заменены параметрами -listen и -status-srv.
Tip: Статистика трафика конкретного ретранслятора доступна по умолчанию через порт 22070, например http://example.com:22070/status

Запуск сервера обнаружения

Глобальное обнаружение используется Syncthing для поиска пиров в Интернете. Любое устройство при запуске сообщает о себе серверу обнаружения, который хранит идентификатор устройства, IP-адрес, порт и текущее время. Затем по запросу, например, для заданного идентификатора устройства, он возвращает информацию, хранящуюся в формате JSON.

В качестве примера, запрос https://discovery.syncthing.net/?device=ITZRNXE-YNROGBZ-HXTH5P7-VK5NYE5-QHRQGE2-7JQ6VNJ-KZUEDIU-5PPR5AM вернёт {"seen":"2020-02-29T14:56:08.34589801Z","addresses":["quic://212.121.228.172:22000","tcp://212.121.228.172:22000"]}

Список общедоступных глобальных серверо обнаружения предоставляется. Кроме того, любой желающий может запустить сервер обнаружения, для того, чтобы запустить свой собственный, установите пакет syncthing-discosrv.

Юнит-файл по умолчанию, предоставляемый пакетом, хранит данные в /var/lib/syncthing-discosrv и, похоже, работает нормально, если вам не нужно настраивать какие-либо флаги; смотрите список.

Ниже приведен пример юнит-файла замены, в котором данные хранятся в /var/discosrv вместо /var/lib/syncthing-discosrv. Пользователю/группе syncthing-discosrv требуются разрешения для чтения файлов сертификатов. Вам необходимо отредактировать юнит-файл systemd, чтобы правильно указать сертификаты и выполнить любые другие изменения конфигурации, которые могут потребоваться.

syncthing-discosrv.service
[Unit]
Description=Syncthing discovery server
After=network.target

[Service]
User=syncthing
Group=syncthing
ExecStart=/usr/bin/syncthing-discosrv --db-dir /var/discosrv/discosrv.db --cert /var/discosrv/cert.pem --key /var/discosrv/key.pem
Restart=on-failure
SuccessExitStatus=2

PrivateDevices=true
ProtectSystem=full
ProtectHome=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Чтобы указать клиенту на ваш сервер обнаружения, измените переменную Global Discovery Servers в разделе настроек на https://yourserver:8443/ (порт по умолчанию) или на любой другой порт, который вы перенастроили. Переменная содержит список серверов обнаружения, разделенных запятыми. Можно указать несколько серверов, в том числе сервер по умолчанию.

Если вы используете самозаверенные сертификаты, клиент может отказаться подключаться, если вы не добавите идентификатор сервера обнаружения к его домену. Идентификатор выводится в стандартный вывод при запуске сервера обнаружения. Измените запись Global Discovery Servers, чтобы добавить идентификатор: {{ic|https://yourserver.com:8443/?id=AAAAAAA-BBBBBBB-CCCCCCC-DDDDDDD-EEEEEEE-FFFFFFF-GGGGGGG-HHHHHHH

Советы и рекомендации

Остановить спам в журналах

Синхронизация может быть довольно шумной, даже если она ничего не выполняет. Службу ExecStart можно переопределить для прямой фильтрации выходных данных без использования дополнительного скрипта (при необходимости откорректируйте "grep").:

/etc/systemd/system/syncthing@.service.d/nospam.conf
[Service]
ExecStart=
ExecStart=/bin/bash -c 'set -o pipefail; /usr/bin/syncthing -no-browser -no-restart -logflags=0 | grep -v "INFO: "'

Запуск в VirtualBox

Syncthing может подключаться как локально, так и глобально к виртуальной машине (VM) VirtualBox, сохраняя при этом свой сетевой адаптер в режиме стандартной NAT (в отличие от мостовой сети, подключенной к адаптеру главного компьютера).

Чтобы включить этот режим, Syncthing должен прослушивать порт в виртуальной машине, отличный от порта прослушивания, уже используемый хостом. Например, если хост использует порт 22000 по умолчанию, в виртуальной машине можно использовать порт 22001. Порт прослушивания в виртуальной машине можно изменить с помощью адреса прослушивания протокола синхронизации Syncthing на tcp://:22001 в Настройках графического интерфейса пользователя.

В этой конфигурации порт 22001/TCP хоста должен быть перенаправлен гостевому серверу. Это можно сделать с помощью следующей команды:

$ VBoxManage modifyvm myvmname --natpf1 "syncthing,tcp,,22001,,22001"

При такой настройке ретрансляция не требуется: локальные устройства могут подключаться к виртуальной машине через порт 22001, в то время как глобальные устройства доступны до тех пор, пока у них самих открыт порт.

Note: локальное обнаружение в этой настройке ограничено, поскольку порт прослушивания обнаружения 21027 уже используется хостом. Таким образом, гостевой сервер не может создать таблицу локальных сообщений, хотя он все еще может транслировать их в локальную сеть через NAT виртуальной машины и объявлять о себе. Описанные выше шаги позволяют запустить функционирующий сервер в конфигурации NAT по умолчанию, но для оптимальной настройки рекомендуется использовать мостовое соединение.

Запуск через прокси

Синхронизацию можно запустить через прокси-сервер, чтобы обеспечить возможность использования за корпоративным брандмауэром или туннелирования по SSH. Согласно документации по использованию прокси-сервера, необходимо установить переменную окружения all_proxy, и она должна указывать на тип прокси-сервера socks5.

  • Если служба запускается из скрипта или из командной строки, вы должны заранее задать переменные следующим образом:
export all_proxy="socks5://proxy_address:proxy_port"
export no_proxy="127.0.0.1"
  • Если он запускается как служба, вы должны определить переменные в конфигурации службы следующим образом:
/etc/systemd/system/syncthing@myusername.service.d/override.conf
[Service]
Environment="all_proxy=socks5://proxy_address:proxy_port"
Environment="no_proxy=127.0.0.1"

Затем вы должны выполнить перезагрузку демона и перезапуск syncthing@myusername.service.

Этот файл можно отредактировать с помощью systemd в syncthing@myusername.service в соответствии с разделом Редактирование файлов юнитов.

Syncthing FUSE

SyncthingFUSE - это драйвер FUSE, предоставляющий доступ к общему ресурсу syncthing без фактической синхронизации с локальным хранилищем. Когда вы открываете файл, его содержимое, по возможности, загружается из локального кэша. Если содержимого нет в кэше, SyncthingFUSE запрашивает содержимое у пиров и добавляет его в кэш. Однако локальный кэш не будет превышать фиксированный размер. Если в данный момент для файла недоступны пиры, его открытие завершится ошибкой.

Устранение неисправностей

Ошибка базы данных

Иногда на работу Syncthing могут влиять проблемы с базой данных. Распространенным симптомом этого является сообщение клиента о "несинхронизированных элементах", которое так и не устраняется даже после отключения устройств и перезапуска Syncthing. Чтобы принудительно выполнить повторное сканирование файлов и повторную синхронизацию базы данных при следующем запуске Syncthing, используйте следующую команду:

$ syncthing --reset-database

Ошибка файловой системы, доступной только для чтения, даже при запуске от имени root

Если Syncthing жалуется на файловую систему, доступную только для чтения, хотя у пользователя (например, root) есть права на запись, проверьте определение модуля шаблона:

$ systemctl cat syncthing@.service

В части [Service] есть часть Hardening, а под ней директива Protect System, для которой по умолчанию установлено значение full. Смотрите systemd.exec(5) § SANDBOXING для получения дополнительной информации об этой директиве.

Создайте drop-in файл, чтобы изменить значение на соответствующее вашим потребностям. Если вы пытаетесь синхронизировать подкаталог /tc, то Protect System=true должно сработать.

Прочее

Смотри Дебаг Syncthing.

Смотри также