Поднимаем сервер синхронизации файлов Syncthing в docker
Приветствую!

В этой статье я покажу, как легко развернуть свой экземпляр сервера Syncthing с помощью docker compose🐳 на системе под управлением Linux🐧. И конечно подробно расскажу, как подключить клиентов, на примере Linux Mint, Windows и Android.

Для тех, кто не знает Syncthing — это популярное клиент-серверное open source решение для синхронизации файлов🗃 между различными устройствами📱💻.

Предисловие

Данная статья является частью цикла про организацию личной инфраструктуры☝️. Вот что мы уже установили и настроили в прошлые разы:

Сегодня в нашу маленькую инфраструктуру добавится сервер Syncthing✅. Итоговая схема будет такой:

Введение

Чаще всего я разворачиваю свои сервисы в среде дистрибутива Debian. Сегодняшний кейс не исключение — демонстрация будет проводиться в Debian 12🔥.

Как уже было сказано, Syncthing — это ПО для синхронизации файлов между различными устройствами. Вот основные тезисы от разработчиков:

Проект написан на языке Go и распространяется под открытой лицензией MPL-2.0.

Для лучшего понимания дальнейших действий, перечислю основные сущности сервиса Syncthing📋:

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

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

Для пользователей, предпочитающих больше приватности — в конце статьи будет пример настройки синхронизации файлов только во внутренней сети, например VPN. Такой способ менее удобный, но более конфиденциальный.

Подготовка

Для поднятия своего сервиса Syncthing нам понадобится Linux сервер с установленным и запущенным docker engine. Если у вас еще нет своего сервера, возможно вам будут полезны следующие статьи:

Если Linux сервер готов, подключаемся к нему, например, по SSH🔐 и первым делом устанавливаем систему контроля версий git:

BASH
sudo apt update && sudo apt install -y git
Нажмите, чтобы развернуть и увидеть больше

Далее скачиваем файлы проекта из моего GitHub в директорию /opt:

BASH
sudo git clone https://github.com/r4ven-me/syncthing /opt/syncthing
Нажмите, чтобы развернуть и увидеть больше

Состав файлов:

Обратите внимание, что сервис syncthing, описанный в файле docker-compose.yml намеренно ограничен в аппаратных ресурсах на использование cpus: '0.70' и memory: 512M, т.е максимально разрешенное использование CPU составляет 70% одного ядра и 512 мб RAM. При необходимости скорректируйте данные параметры в соответствии со своими потребностями. Подробнее про лимиты ресурсов сервисов при использовании docker-compose читайте тут.

Теперь создадим сервисные группу и пользователя syncthing для запуска сервиса:

BASH
sudo addgroup --system --gid 3113 syncthing

sudo adduser --system --gecos "Syncthing file synchronization system" \
    --disabled-password --uid 3113 --ingroup syncthing  \
    --shell /sbin/nologin --home /opt/syncthing/data syncthing
Нажмите, чтобы развернуть и увидеть больше

Не забываем выставить ограниченные права на директорию☝️, где будут храниться наши файлы:

BASH
sudo chmod 700 /opt/syncthing/data
Нажмите, чтобы развернуть и увидеть больше

Подробнее про права на файлы смотрите в отдельной статье.

Проверяем наличие всех нужных файлов и папок:

BASH
sudo ls -l /opt/syncthing
Нажмите, чтобы развернуть и увидеть больше

Отлично, идем дальше 🚶.

Запуск сервера Syncthing с помощью docker compose

Проверяем синтаксис compose файла и поднимаем наш новый сервис:

BASH
sudo docker compose -f /opt/syncthing/docker-compose.yml config --quiet

sudo docker compose -f /opt/syncthing/docker-compose.yml up -d

sudo docker ps
Нажмите, чтобы развернуть и увидеть больше

Ага, отлично. Смотрим вывод контейнера:

BASH
sudo docker logs -f syncthing
Нажмите, чтобы развернуть и увидеть больше

Будет что-то подобное:

Все норм👌.

Настройка автозапуска с помощью с systemd

В начале статьи мы создали сервисного пользователя syncthing. Используем его для безопасного запуска нашего нового сервиса с помощью sudo💪.

Копируем файл с описанием ограниченных полномочий sudoers для пользователя syncthing, предварительно проверяя его на синтаксические ошибки:

BASH
sudo visudo --check --file=/opt/syncthing/syncthing_sudoers

sudo cp /opt/syncthing/syncthing_sudoers /etc/sudoers.d/
Нажмите, чтобы развернуть и увидеть больше

В файле syncthing_sudoers описаны привилегии📝, которые разрешают пользователю syncthing запуск и остановку сервисов, описанных в нашем docker-compose.yml, от имени привилегированной группы docker с помощью sudo. Именно эти команды будут использоваться в сервис юните systemd.

Недавно я разбирал тонкости механизма повышения привилегий в Linux. Для лучшего понимания рекомендую к прочтению статью: Командная строка Linux, повышение привилегий: команды su, sudo 😌.

Теперь также проверяем, затем копируем файл сервиса systemd и перечитываем конфигурацию:

BASH
sudo systemd-analyze verify /opt/syncthing/syncthing.service

sudo cp /opt/syncthing/syncthing.service /etc/systemd/system/

sudo systemctl daemon-reload
Нажмите, чтобы развернуть и увидеть больше

В файле syncthing.service описаны условия запуска🛠 контейнера syncthing такие, как: проверка запущенного демона docker, выполнение перезапуска сервиса при падении (с интервалом в 5 сек.), определение пользователя/группы от имени которого нужно запускать сервис и собственно сами команды запуска/остановки этого сервиса.

Останавливаем вручную запущенный ранее контейнер и стартуем его уже с помощью systemd + активируем автозапуск сервиса при старте системы:

BASH
sudo docker compose -f /opt/syncthing/docker-compose.yml down

sudo systemctl enable --now syncthing
Нажмите, чтобы развернуть и увидеть больше

Проверяем статус:

BASH
sudo systemctl status syncthing
Нажмите, чтобы развернуть и увидеть больше

Должно быть так:

Сервер запущен и готов к работе😎!

Настройка сервера Syncthing в веб-интерфейсе

В моем примере Syncthing, в целях безопасности, был поднят на локальном интерфейсе с адресом 127.0.0.1. Если вы поднимаете сервис на удаленной машине, то для доступа к веб интерфейсу Syncthing выполните на клиентской машине проброс нужного порта (8384), с помощью такой SSH команды:

BASH
ssh -N -f -L 7777:127.0.0.1:8384 user@example.com
Нажмите, чтобы развернуть и увидеть больше

Где (по порядку):

В моём примере команда такая:

Теперь открываем веб браузер и вводим:

BASH
http://127.0.0.1:7777
Нажмите, чтобы развернуть и увидеть больше

Первым делом нас встречает вопрос об отправке анонимных отчетов. Оставляю это на ваше усмотрение😉.

Далее нас уведомят, что вход в панель управления осуществляется без пароля и это не безопасно😳.

Поэтому переходим в настройки и создаем там нового пользователя и задаем ему пароль:

Делается это на вкладке «Интерфейс»:

Не забываем нажать «Сохранить». После этого сервис перезапустится и нас любезно попросят авторизоваться с новыми реквизитами:

Перед нами откроется основное меню управления Syncthing🧑‍💻.

По умолчанию сервер уже использует одну директорию «Default folder», которая расположена:

Установка и подключение клиентов

Клиенты Syncthing существуют под все популярные платформы💻📱. Весь список вы найдете здесь и тут😇.

Под капотом у клиентов стартует бэкенд Syncthing (аналогично серверу) и графический frontend + системный трей. По умолчанию сервис также слушает веб подключения🌐, поэтому к сервису всегда можно подключиться через браузер (при желании эту функцию можно отключить). Порт прослушивания зависит от клиента. Чаще всего это 8080 или 8384🤷‍♂️.

Далее я покажу процесс подключения клиентов на примере Linux Mint 22, Windows 10 и Android 13🫡.

Рекомендация: во время первоначальной настройки клиентов используйте директории без важных файлов, чтобы минимизировать риски в случае неверных действий.

Linux Mint

Открываем терминал, обновляем кэш пакетов и устанавливаем графический клиент Syncthing с поддержкой системного трея из стандартных репозиториев:

BASH
sudo apt update && sudo apt install -y syncthing-gtk
Нажмите, чтобы развернуть и увидеть больше

Существует также qt версия.

После установки запускаем программу из главного меню:

Сразу перейдем в настройки и включим автозапуск🚀 Syncthing при запуске графического сеанса пользователя:

Активируем вот эти чекбоксы и нажимаем «Сохранить»:

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

Теперь нам необходимо узнать наш ID клиента. Делается этот тут:

Копируем его, затем возвращаемся в панель управления сервера и добавляем новое устройство:

Вставляем ID на вкладке «Общее» и при необходимости указываем имя устройства:

Затем переходим на вкладку «Предоставление доступа» и ставим чекбокс для общего доступа к директории на сервере:

После нажатия кнопки «Сохранить», через некоторое время на клиенте должно прийти два запроса:

1. Запрос на добавление устройства (сервера):

2. Запрос на добавление общей директории:

Тут указываем путь до локальной папки, которую будем синхронизировать, а также убираем чекбокс с пункта «Только получение» (Receive Only Folder):

Обязательно дождитесь и примите оба запроса!

Все, первый клиент готов:

Клиент Linux Mint

Сервер Syncthing

На данный момент у нас настроена синхронизации директорий:

Давайте проверим работу синхронизации🛠. Для примера создадим 20 пустых файлов на сервере такой командой:

BASH
sudo -u syncthing touch /opt/syncthing/data/Sync/test_file{1..20}.txt
Нажмите, чтобы развернуть и увидеть больше

Файлы на клиенте появились и пришло уведомление:

Теперь если мы в файловом менеджере удалим все файлы кроме одного:

Они также удаляться и на сервере✍️. Синхронизация настроена😌.

Важный момент! В основной синхронизируемой директории (на киленте и на сервере) есть скрытый служебный каталог .stfolder. Не удаляйте его иначе синхронизация выпадет в ошибку и придется все подключать заново.

Чтобы не делать из статьи полотно📜 (хотя уже поздно🙃), шаги по настройке клиентов для Windows и Android я спрятал под спойлерами. Просто кликните на них при необходимости.

Windows

Android

Опционально

Настройка работы Syncthing только во внутренней сети

Если вы разворачиваете сервер Syncthing во внутренней, например, VPN сети, то в качестве IP адреса принимающего подключения укажите адрес виртуального интерфейса VPN.

Настройка сервера

Для этого правим файл docker-compose.yml:

BASH
sudo nvim /opt/syncthing/docker-compose.yml
Нажмите, чтобы развернуть и увидеть больше

Замените 192.168.122.233 на свой адрес.

И перезапустите сервер:

BASH
sudo systemctl restart syncthing
Нажмите, чтобы развернуть и увидеть больше

После чего перейдите в настройки сервера в веб интерфейсе уже по новому адресу (у меня это http://192.168.122.233:8384:

Далее идем на вкладку «Подключения». В поле «Адрес протокола синхронизации» по умолчанию стоит значение default, которое включает в себя целый список адресов, в том числе публичные relay сервера проекта Syncthing:

BASH
tcp://0.0.0.0:22000, quic://0.0.0.0:22000 and dynamic+https://relays.syncthing.net/endpoint
Нажмите, чтобы развернуть и увидеть больше

Меняем его на одно значение:

BASH
tcp://0.0.0.0:22000
Нажмите, чтобы развернуть и увидеть больше

Также на этой вкладке отключаем лишние параметры, кроме локального обнаружения:

Теперь сервер будет принимать подключения только на адрес контейнера, в моем примере это 192.168.122.233:22000 и не будет задействовать публичные сервера.

Почему выше мы указали 0.0.0.0 а не 192.168.122.233? Потому что 0.0.0.0 в данном случае — это адрес (т.е. все адреса) прослушивания внутри самого контейнера, доступ к контейнеру мы ранее настроили через 192.168.122.233. Поэтому далее на клиентах необходимо будет указать именно этот адрес🤯.

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

Теперь на клиенте явно указываем адрес подключения к серверу. В случае Linux Mint делается это вот так:

Готово.

Аналогичным способом измените настройки и на других клиентах🫠.

Настройка прямого подключения клиентов через публичные relay сервера Syncthing

Ранее мы описали способ централизованной синхронизации файлов с использованием своего приватного сервера, который всегда онлайн.

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

Подключение настраивается аналогично, как в случае с сервером, только без него😁.

Вот примерный алгоритм:

  1. Копируем ID клиента Android;
  2. Открываем Syncthing на Windows;
  3. Нажимаем «Добавить устройство», указываем там ID от Android и выбираем директорию для синхронизации;
  4. Через некоторое время на клиенте Android придет два запроса в шторке уведомлений:
    • Добавить новое устройство;
    • Добавить расшариваемую папку этого устройства.

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

Заключение

По итогу: мы получили функциональный и легко переносимый проект системы синхронизации файлов, работающий внутри docker контейнера, с настроенным автозапуском посредством systemd. А также разобрали процесс подключения клиентов для разных платформ😎.

Я уже несколько лет активно пользуюсь этим сервисом внутри своей VPN сети. Таким образом очень удобно хранить разные файлы, особенно шифрованный файл-базу паролей KeePass, которую можно читать/изменять на любом устройстве, не боясь что-то потерять.

Используемые источники

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/storage/podnimaem-server-sinhronizacii-fajlov-syncthing-v-docker/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша