Новые релизы
Сравнение версии рецепта с последним известным релизом upstream. Это номер версии, а не разбор изменений.
Выбор редакцииСинхронизация файлов
Syncthing держит выбранные папки одинаковыми на нескольких устройствах и передаёт файлы напрямую между ними по зашифрованному каналу. Промежуточного сервера нет: копия данных есть на каждом узле, а сервер в этом рецепте нужен как всегда доступный участник обмена.
Syncthing синхронизирует папки между вашими устройствами напрямую. Ноутбук, телефон и сервер договариваются друг с другом сами: файлы идут по зашифрованному каналу от устройства к устройству, а промежуточного сервиса, который хранил бы копию, просто нет. Подойдёт тем, кто хочет получить привычное «папка на всех устройствах одинаковая», не отдавая содержимое чужому облаку.
Сервер в этом рецепте — не хранилище в облачном смысле, а всегда включённый участник обмена. Телефон и ноутбук бывают выключены и редко видят друг друга; узел на сервере доступен постоянно, поэтому изменения расходятся быстрее, а устройствам не нужно быть онлайн одновременно.
Рецепт поднимает один контейнер. Конфигурация, ключи устройства и база индексов
лежат в Docker volume, синхронизируемые файлы — в каталоге на хосте. Уровень
reliable не заявлен: у Syncthing нет отдельной БД, а в рецепте нет мониторинга
и ресурсных лимитов.
Syncthing — не резервное копирование. Удаление файла разъезжается по всем устройствам так же быстро, как и любое другое изменение. Включайте File Versioning для папок, где важна защита от случайного удаления, и держите отдельные бэкапы.
Контейнер запускается без privileged, host network и доступа к Docker socket,
с no-new-privileges, и работает от непривилегированного пользователя
1000:1000. Трафик между узлами шифруется TLS, а устройства опознают друг друга
по криптографическим идентификаторам, которые нужно подтвердить вручную с обеих
сторон.
Модель сети у Syncthing отличается от остальных приложений каталога: порт
синхронизации 22000 публикуется на всех интерфейсах, иначе прямые соединения не
устанавливаются и обмен идёт через публичные relay. Веб-интерфейс при этом
остаётся на 127.0.0.1 и публикуется только через reverse proxy. Пароль на
интерфейс не задан по умолчанию — задайте его до того, как открывать доступ
снаружи.
Архив конфигурации содержит приватный ключ устройства: тот, кто его получит, сможет выдать себя за ваш узел в кластере. Шифруйте копии, которые покидают сервер.
Образ рецепта просканирован Trivy: критических уязвимостей не найдено — образ состоит из Alpine и одного статически собранного Go-бинарника.
Это сохранённые результаты отдельных проверок, а не данные в реальном времени. Неизвестный статус означает, что проверка ещё не выполнялась.
Сравнение версии рецепта с последним известным релизом upstream. Это номер версии, а не разбор изменений.
Результат отдельного сканирования Docker-образов, а не проверки Compose.
Новый major находится сравнением номеров версий. Вердикт о совместимости заносится вручную после чтения release notes и порядка миграции.
Изменения upstream Compose относительно проверенного рецепта.
Проверка закреплённых тегов образов на наличие новых версий.
От наблюдения к действию
Рецепт уже закрепляет последний известный релиз. Ниже показаны сохранённые основания для этой версии.
v2.1.3v2.1.3Открыть релиз на GitHub ↗ Ссылка нужна для ревизии и сама по себе не доказывает совместимость.
Номера версий не пересекают major-границу совместимости. Вердикт о совместимости не записан.
Смена тегов образов сейчас не планируется.
Смена тега и перезапуск. Шаги конкретного релиза всё равно берутся из release notes и инструкции по установке.
Смена версии сейчас не планируется. Рецепт содержит процедуру backup. Restore проверен.
Точная проверка уровня «Проверен полностью» для этой версии записана 2026-08-31.
Статус показывает, насколько опубликованный рецепт покрывает требования каждого уровня.
Минимальная конфигурация для локальной сети или доступа через VPN.
Рецепт закрывает все требования этого уровня.
Публичная установка с защищённым доступом и резервными копиями.
Рецепт закрывает все требования этого уровня.
Конфигурация для предсказуемой эксплуатации и наблюдаемости.
Нужно добавить вручную: отдельная бд, внешний мониторинг, лимиты cpu и памяти.
Собрать под свой сервер
Ответьте на пять вопросов и скачайте готовый комплект Syncthing.
Сначала прочитайте полную инструкцию: в ней описаны доступ извне, backup и расположение данных.
cp .env.example .envdocker compose up -ddocker compose psДля этого рецепта достаточно 1 ядра CPU, 256 МБ RAM и 2 ГБ диска под сам узел; рекомендуется 512 МБ RAM. Это консервативная оценка рецепта: upstream не публикует формальные минимальные требования, а расход памяти растёт вместе с числом файлов в индексе. Место под сами файлы считайте отдельно: Syncthing хранит полную копию каждой синхронизируемой папки. Нужны Ubuntu 22.04+ или Debian 12+ с Docker Engine и Docker Compose v2.24+.
docker --version
docker compose version
mkdir -p ~/services/syncthing
cd ~/services/syncthing
cp .env.example .env
chmod 600 .env
sudo mkdir -p /srv/syncthing
sudo chown 1000:1000 /srv/syncthing
sed -i "s|^SYNCTHING_DATA_LOCATION=.*|SYNCTHING_DATA_LOCATION=/srv/syncthing|" .env
SYNCTHING_VERSION закрепляет образ; SYNCTHING_DEVICE_NAME — имя, которое
увидят другие узлы; SYNCTHING_GUI_PORT открывает веб-интерфейс только на
localhost; SYNCTHING_SYNC_PORT и SYNCTHING_DISCOVERY_PORT отвечают за обмен
данными и обнаружение в локальной сети; SYNCTHING_DATA_LOCATION — каталог с
синхронизируемыми файлами; SYNCTHING_CONFIG_VOLUME — volume с конфигурацией,
ключами устройства и базой индексов; SYNCTHING_UID и SYNCTHING_GID задают
владельца файлов; TZ — часовой пояс.
Права на каталог важны: контейнер работает от 1000:1000, и без chown
Syncthing не сможет писать в /srv/syncthing.
docker compose pull
docker compose up -d
docker compose ps
ssh -L 8384:127.0.0.1:8384 user@server.example
Откройте http://localhost:8384. Веб-интерфейс изначально без пароля, поэтому
сразу зайдите в Actions → Settings → GUI и задайте пользователя и пароль — без
этого нельзя публиковать интерфейс наружу.
Идентификатор устройства (Actions → Show ID) — это то, чем узлы обмениваются при знакомстве. На втором устройстве добавьте сервер по этому ID, на сервере подтвердите запрос, затем выберите папку и отметьте, с каким устройством её синхронизировать.
На VPS веб-интерфейс остаётся на 127.0.0.1, а порт синхронизации должен быть
доступен снаружи — иначе устройства соединятся только через публичные relay и
скорость упадёт в разы. Откройте его в firewall:
sudo ufw allow 22000/tcp
sudo ufw allow 22000/udp
docker compose up -d
docker compose ps
curl --fail http://127.0.0.1:8384/rest/noauth/health
Порт 21027/udp нужен только для обнаружения устройств в той же локальной сети; на VPS его открывать не нужно.
Внутри доверенной LAN веб-интерфейс удобно открывать через SSH-туннель или VPN.
Если reverse proxy работает на другом узле сети, замените 127.0.0.1 в
compose.yaml на конкретный LAN-адрес сервера и ограничьте порт firewall
адресом proxy.
Порт 21027/udp включает автоматическое обнаружение: устройства в одной сети находят друг друга без ручного ввода адресов. Обмен данными при этом всё равно идёт по порту 22000.
Через reverse proxy публикуется только веб-интерфейс. Порт синхронизации работает по собственному протоколу и через HTTP-proxy не проходит: он остаётся на 22000.
Замените sync.example.com в выбранном файле из proxy/ одним доменом.
proxy/Caddyfile автоматически получает сертификат; proxy/nginx.conf ожидает
сертификат Certbot; proxy/traefik.yaml использует resolver letsencrypt. Для
Traefik в контейнере замените 127.0.0.1 на доступный ему host gateway.
Прежде чем открывать интерфейс наружу, задайте пароль в Settings → GUI. В
примере Nginx увеличен proxy_read_timeout: интерфейс держит долгие запросы
событий, и короткий таймаут рвёт соединение.
curl --fail https://sync.example.com/rest/noauth/health
chmod +x backup.sh restore.sh
./backup.sh
Скрипт останавливает контейнер, архивирует volume с конфигурацией и снова его запускает. В архив попадают приватный ключ устройства, его идентификатор, список папок и устройств и база индексов.
Синхронизируемые файлы в архив не входят — и это осознанно: их копия уже есть на каждом узле. Важно другое: Syncthing не является резервным копированием. Удаление файла разъезжается по всем устройствам так же быстро, как и изменение. Для защиты от ошибочного удаления включите File Versioning в настройках папки, а для настоящих бэкапов используйте отдельный инструмент.
Архив содержит приватный ключ: шифруйте его перед выносом с сервера.
Восстановление возвращает прежний идентификатор устройства, поэтому остальные узлы продолжат работать без повторного добавления:
./restore.sh ./backups/syncthing-YYYYMMDDTHHMMSSZ.tar.gz
docker compose ps
curl --fail http://127.0.0.1:8384/rest/noauth/health
Перед заменой скрипт создаёт страховочную копию текущей конфигурации. Если каталог с файлами пуст, узел скачает их заново с других устройств; если файлы на месте, Syncthing пересканирует их и обнаружит совпадение.
Никогда не запускайте две копии одной конфигурации одновременно: два узла с одинаковым идентификатором конфликтуют в кластере.
Создайте backup и прочитайте release notes. Измените только закреплённый
SYNCTHING_VERSION, затем выполните:
./backup.sh
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 syncthing
Узлы разных версий работают вместе, но протокол совместим не бесконечно: между крупными версиями стоит обновлять все устройства примерно одновременно.
Формат базы индексов меняется между крупными версиями и вниз не мигрирует.
Верните прежний SYNCTHING_VERSION в .env и восстановите архив, снятый до
обновления:
docker compose pull
./restore.sh ./backups/syncthing-before-update.tar.gz
docker compose up -d
Сами файлы при этом не страдают: в худшем случае узел заново построит индекс.
docker compose down удаляет контейнер, но сохраняет конфигурацию и ключи.
Полное необратимое удаление после проверки backup:
docker compose down
docker volume rm syncthing-config
rm -rf ~/services/syncthing
Каталог SYNCTHING_DATA_LOCATION остаётся на месте: рецепт его не удаляет.
После удаления узла остальные устройства будут показывать его как отключённый,
пока вы не уберёте его из своих настроек.
Источники: первые шаги, конфигурация, firewall и порты, версионирование файлов, reverse proxy и безопасность.
Проверьте, что порт синхронизации открыт наружу и узел его слушает:
docker compose ps
curl --fail --silent http://127.0.0.1:8384/rest/noauth/health
sudo ufw status | grep 22000
В веб-интерфейсе строка Listeners должна показывать все адреса как активные.
Если соединение всё же идёт через relay, в карточке устройства Connection Type
будет Relay вместо TCP LAN или TCP WAN — значит, прямое соединение не
установилось и порт 22000 закрыт хотя бы с одной стороны.
Контейнер работает от 1000:1000, а каталог на хосте нередко принадлежит root:
ls -ld /srv/syncthing
sudo chown -R 1000:1000 /srv/syncthing
Значения задаются в SYNCTHING_UID и SYNCTHING_GID, если на сервере нужен
другой владелец.
Это штатное поведение: Syncthing синхронизирует удаления. Восстановить можно из версий, если для папки включено File Versioning: раскройте карточку папки и нажмите Versions. Если версионирование выключено, поможет только внешний backup.
Чаще всего это конфликт правок или недоступный файл:
docker compose logs --tail=200 syncthing | grep -i "error\|conflict\|permission"
Конфликтные копии Syncthing сохраняет рядом с файлом под именем вида
имя.sync-conflict-ДАТА-ВРЕМЯ.расширение. Выберите нужную версию и удалите
лишнюю.
Пароль хранится в конфигурации внутри volume. Сбросить его можно, отредактировав
config.xml при остановленном контейнере:
docker compose stop syncthing
docker run --rm -it -v syncthing-config:/c alpine:3.22 \
sh -c 'sed -i "s@<password>.*</password>@<password></password>@" /c/config/config.xml'
docker compose start syncthing
После этого интерфейс снова откроется без пароля — задайте новый сразу же.
Идентификатор устройства привязан к приватному ключу в volume. Если вы скопировали конфигурацию на второй сервер и запустили оба, в кластере окажутся два узла с одинаковым ID — так делать нельзя. Оставьте одну копию, а на второй машине создайте новый узел.
Память растёт вместе с числом файлов в индексе. Помогают исключения ненужных каталогов через Ignore Patterns в настройках папки и увеличение интервала сканирования.
docker compose logs --tail=200 syncthing | grep -i "error\|migrat"
Формат базы индексов вниз не мигрирует: вернуться на прежнюю версию можно только восстановлением архива, снятого до обновления. Сами файлы при этом не страдают.
Fossary — независимый информационный каталог, не связанный с разработчиками представленных приложений. Мы собираем сведения из открытых источников и проверяем опубликованные рецепты, но не разрабатываем, не распространяем и не контролируем эти приложения.
Публикация карточки или статус проверки не являются требованием, навязыванием либо персональной рекомендацией использовать приложение. Вы самостоятельно решаете, подходит ли оно вам, и используете его на свой риск. Мы не гарантируем безопасность, доступность или пригодность приложения и, в пределах, допускаемых законом, не отвечаем за вызванные им потери или ущерб. До установки проверьте лицензию, настройки безопасности, обработку данных и резервное копирование.