•
1 min read
upgrades.syncthing.gluek.info

Зеркало сервера обновлений Syncthing. В России заблокирован release.syncthingcdn.net (проверка на cheburcheck), откуда Syncthing скачивает новые версии, поэтому автообновление перестало работать.

Как пользоваться

В веб-интерфейсе Syncthing открыть Действия → Настройки → Дополнительно → Options и указать в поле Releases URL:

https://upgrades.syncthing.gluek.info/meta.json

После этого Syncthing будет проверять и скачивать обновления через зеркало.

Это безопасно?

Да. Каждый архив релиза содержит файл release.sig, и Syncthing проверяет его ключом, встроенным в сам бинарник (lib/upgrade). Если зеркало отдаст изменённый файл, подпись не сойдётся и обновление просто не установится.

Как устроено

Syncthing сначала скачивает meta.json со списком релизов, а в нём лежат прямые ссылки на архивы в release.syncthingcdn.net. Значит, мало проксировать сам meta.json, нужно ещё переписать в нём ссылки.

  1. Скрипт по cron раз в час скачивает оригинальный meta.json и заменяет адрес CDN на адрес зеркала:
#!/bin/sh
set -eu
dir=/path/to/folder/syncthing
mkdir -p "$dir"
tmp=$(mktemp "$dir/.meta.XXXXXX")
trap "rm -f $tmp" EXIT
curl -fsS -m 60 https://upgrades.syncthing.net/meta.json \
  | sed "s#https://release.syncthingcdn.net/#https://upgrades.syncthing.gluek.info/#g" > "$tmp"
grep -q "\"tag_name\"" "$tmp"
chmod 644 "$tmp"
mv "$tmp" "$dir/meta.json"
  1. Caddy отдаёт этот файл как статику, а все остальные запросы проксирует на CDN:
upgrades.syncthing.gluek.info {
	handle /meta.json {
		root * /path/to/folder/syncthing
		file_server
	}
	handle {
		reverse_proxy https://release.syncthingcdn.net {
			header_up Host release.syncthingcdn.net
		}
	}
}

Переписывать ссылки на лету можно было бы плагином replace-response, но его нет в стандартной сборке Caddy, и пересобирать сервер ради одного зеркала не хотелось. Скрипт по cron проще.