Настраиваем Syncthing. Синяя изолента в мелком бизнесе и дома
У меня тут внезапно завалялся гайд по настройке syncthing. Я уверен, что многим это может пригодиться.
Про революцию в дистрибуции файлов, которую совершил torrent-протокол рассказывать излишне. Одна проблема была у классических версии технологии — статичность. Если данные в каталоге изменялись, приходилось заново создавать и передавать всем новый torrent-файл. И вдруг, внезапно появляется BitTorrentSync. Наступает всеобщее счастье, теперь можно синхронизировать целые массивы изменяющихся данных. Однако, спустя время проприетарность софта выливается в сильное урезание функциональности, привязку к своим серверам и довольно агрессивную монетизацию. Вот тут и выходит на сцену идеологически кошерный свободный преемник — Syncthing.
Syncthing, как и обычный torrent может пролезть практически через любые барьеры в виде файерволлов, NAT и тому подобное. В случае серых IP-адресов полагается на централизованные релеи и сервера-анонсеры. При этом можно спокойно поднять их самостоятельно, что дает полную независимость от инфрастуруктуры разработчиков. Все узлы в кластере равноправны. Можно задать двустороннюю и одностороннюю синхронизацию, когда изменения на удаленных копиях не затронут оригинал. Умеет версионирование. Красота, одним словом.
В моем случае решалась задача ежедневного создания резервных копий баз данных. 3 независимых отделения в разных концах города. Интернет через Yota-модем, воткнутый в Mikrotik. Канал узкий и нестабильный по ширине. Основная идея, которая была реализована — обмен по принципу torrent-протокола копиями баз по ночам, когда нагрузка на сеть минимальна, а базы никто не трогает. В результате, каждое подразделение хранит копии двух соседних. Хорошая избыточность и географическая распределенность, что уже спасло однажды, когда сервер внезапно был убит ударом молнии.
Устанавливаем. По умолчанию я имею в виду сервер на базе deb-based Linux, хотя у syncthing есть и версии для Windows и Android. Для продакшена добавим репозитории из стабильной ветки и установим:
# Add the release PGP keys:
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
# Add the "stable" channel to your APT sources:
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
# Update and install syncthing:
sudo apt-get update
sudo apt-get install syncthing
Теперь надо разобраться с демонами. Подобный софт не должен работать от имени root. Все созданные в результате синхронизации файлы должны принадлежать локальному пользователю. Поэтому есть два варианта — автоматический запуск как системный сервис либо в качестве пользовательского сервиса. Второй вариант будет работать только тогда, когда пользователь залогинился через ssh или авторизировался в локальной системе. Нас интересует системный демон и для этого лучше всего подойдет глубоко любимый общественностью systemd. Пути могут немного отличаться в разных дистрибутивах. Данный мануал применим к Debian и Ubuntu 16.04 Server. Для начала создаем юнит:
sudo nano /etc/systemd/system/syncthing@.service
И вносим туда следующее содержимое: [Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target
Wants=syncthing-inotify@.service
[Service]
User=%i
ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4
[Install]
WantedBy=multi-user.target
Теперь остается лишь активировать сервис от имени нужного пользователя и можно настраивать ноду.
sudo systemctl enable syncthing@username.service
sudo systemctl start syncthing@username.service
Интерфейс доступен по адресу 127.0.0.1:8384. Если вы хотите заходить с другой машины — придется поправить конфиг ~/.config/syncthing/config.xml. Дальнейшие настройки предельно просты — добавляются доверенные ноды по уникальному ключу, а затем расшариваются нужные каталоги в режиме одно- или двусторонней синхронизации. При необходимости можно вручную указать ip адрес и порт ноды, без этого для установления связи будет использоваться сеть серверов-анонсеров и релеев. Более того, вы можете поднять анонсеры и релеи на своей инфраструктуре, что позволяет использовать ПО в рамках разветвленной локальной сети компании.
В любой момент можно удобно просмотреть список синхронизируемых файлов. Крайне полезный и удобный в настройке получился софт. Ресурсы потребляет достаточно экономно. прямо сейчас в режиме ожидания ест около 15 мегабайт RAM и доли процента процессорного времени. Общий объем данных в кластере в районе 500 ГБ.
Всем удачи в экспериментах. Прочной изоленты.
Update 1
Спасибо datacompboy. Нашел интересный флаг для игнорирования удаления в мастер-ноде.
ignoreDelete is an advanced folder setting that affects the handling of incoming index updates. When set, incoming updates with the delete flag set are ignored.
Некоторая проблема в том, что с точки зрения других нод, это будет рассинхроном.
Assume two devices, «Alice» and «Bob», are sharing a folder. Bob has set ignoreDelete.New and updated files are synchronized as usual between Alice and Bob. When Bob deletes a file, it is deleted for Alice as well. When Alice deletes a file, Bob ignores that update and does not delete the file.
In this state, Bob is fully up to date from his own point of view, as is Alice from her own point of view.
However from the point of view of Alice, who deleted a file and propagated the update, Bob is now out of date because he is yet to remove the file that was deleted.
From the point of view of Bob, who ignored the delete entry from Alice, Alice is now out of date because she is missing the file that was deleted
.