Tagging-фаза матчит title PR против паттерна и требует И компонент
(= package-name free-turn-proxy), И версию. Прошлый паттерн нёс только
версию -> 'PR component undefined does not match free-turn-proxy' -> релиз
не строился, тег не создавался. Полный формат chore: release COMPONENT VERSION
закрывает оба условия. Тег остаётся v1.0.0 (include-component-in-tag false).
Повторный сброс: manifest 0.0.0, CHANGELOG очищен.
Заголовок group/manifest release-PR брался из group-pull-request-title-pattern
(default по имени ветки -> 'chore: release master'), без версии. Tagging-фаза
матчит title против паттерна и извлекает версию из него, поэтому тег не
создавался. Теперь обе паттерн-опции кладут версию в заголовок.
Плюс повторный сброс: manifest 0.0.0, CHANGELOG очищен.
- manifest 0.0.0, CHANGELOG очищен (старт с нуля)
- убран skip-github-release (отменял создание тега, не только релиза)
- задан pull-request-title-pattern с версией: версия попадает в title PR,
иначе для manifest-root title генерился по имени ветки и tagging-фаза
не могла извлечь версию из заголовка
- manifest 0.0.0 (release-please пересчитает версию с нуля)
- CHANGELOG очищен под регенерацию
- skip-github-release: true — GitHub-релиз создаёт только GoReleaser
(убирает двойное создание релиза release-please + goreleaser,
из-за которого плодились черновики и падал Release-workflow)
Два Windows-specific бага мешали ставить /32-маршруты к TURN-реле:
- log.Printf пишет в stderr, а usage гонит `2>&1 | routes.ps1`.
В Windows PowerShell 5.1 `2>&1` на нативном exe оборачивает каждую
stderr-строку в ErrorRecord (нет метода .Trim()) — `$_.Trim()` бросал
исключение на каждой строке, ни одна не матчилась. Заменено на $_.Trim(),
который коэрсит и String, и ErrorRecord в текст строки лога.
- New-NetRoute требует -InterfaceIndex (параметр mandatory); без него
в non-interactive пайпе cmdlet падал. InterfaceIndex берётся из того же
default-route, что и NextHop.
Чинит тихий выход после выбора метода (set -e + установка WireGuard
в мастере убивали скрипт без диагностики) и неудобный выбор.
- trap ERR с номером строки и командой вместо тихой смерти
- WireGuard только детектится (порт бэкенда), без авто-установки
- whiptail-TUI: gauge-прелоадеры (pull/up/download/deps), меню с
--default-item, backtitle, валидация портов/hex-ключа; fallback на
текст со спиннером, чтение из /dev/tty (работает через curl | bash)
- non-interactive режим: -y + флаги (--method/--mode/--obf-key/
--version/--update/--uninstall/--purge), CLI бьёт install.conf
- health-check после старта (docker inspect / systemctl is-active):
падение даёт ошибку с логами, а не ложное «Готово»
- docs: curl | bash one-liner + примеры non-interactive
VK TURN реджектит standalone CreatePermission refresh с 400 Bad Request
каждые 120s, засоряя логи. Данные идут через ChannelData; channel-bind
refresh (RFC 8656 §9) держит permission живым, потому отдельный refresh
избыточен. Выставляем PermissionRefreshInterval в 24h.
android-бинарь libfreeturn.so пакуется в два архива (android + raw-android),
из-за чего sboms.artifacts=binary грузил один SBOM-файл дважды под одним
именем → 422 already_exists. artifacts=archive привязывает SBOM к уникальному
имени архива.
Тег, созданный через GITHUB_TOKEN, не триггерит release.yml (защита
GitHub от циклов). PAT пушит тег от имени юзера — GoReleaser
запускается по vX.Y.Z.
Клиент всегда отправляет Client ID первой DTLS app-record, сервер
всегда читает. Флаг -auth и URI-параметр auth удалены — рассинхрон
client/server невозможен. -clients-file на сервере включает только
проверку ID по allowlist clients.json.
Также:
- clients.json и client_config.json пишутся с правами 0o600
- исправлены все находки golangci-lint (errcheck, gosec, govet shadow)
Примечание: удалён флаг -auth и URI-параметр auth; Client ID теперь
всегда в первой записи туннеля — старые клиенты/серверы несовместимы.
Повторный запуск install-server.sh обнаруживает установку и предлагает меню: обновить версию (конфиг сохраняется), переконфигурировать, удалить.
- конфиг установки в /opt/free-turn-proxy/install.conf (chmod 600)
- выбор версии релиза при установке (список с GitHub API, дефолт latest)
- iptables -C перед -I: нет дублей правил при повторе
- атомарная подмена бинарника systemd + restart
- docker compose pull для подтягивания нового образа
- internal/clientsdb: БД клиентов с hot-reload + length-prefixed ID wire
- internal/uri: parse/encode share-ссылок freeturn://
- internal/sub: загрузка и парсинг подписок (sub.md)
- client: флаги -auth, -client-id, -sub; позиционный URI; ID через crypto/rand
- server: подкоманда clients (add/remove/list), чтение ID под -clients-file
- запись/чтение ID учитывают DTLS record-orientation (буфер на запись целиком)
- docs: uri.md, sub.md; правки flags/deploy/quickstart
- снят UTF-8 BOM по всем исходникам
Переименовать переменные-указатели флагов под имена флагов 1:1 (vklink→link,
host→turn, obfProfileRaw→obfProfile, убрать суффиксы *Flag/*Raw/*Hex). Урезать
многословные описания флагов; убрать аннотации (default), раз пакет flag
печатает их сам.
ParseClient/ParseServer возвращают flag.ErrHelp после печати usage, но main
трактовал это как фатальную ошибку: log.Fatalf печатал лишнюю строку
"flag: help requested" и выходил с кодом 1. Ловим flag.ErrHelp и выходим с 0
в обоих бинарях.
Сейчас нужен только VK-провайдер. internal/provider/static и связанные флаги
-static-user/-static-pass/-static-addr удалены, валидация и тесты обновлены.
Интерфейс provider.Provider остаётся — слот для будущих реализаций сохранён в
нейтральных формулировках doc-комментариев.
Переносит VK-specific пакеты под internal/provider/vk/internal/* — теперь
недоступны для импорта извне provider/vk (Go internal/ rule). ish остался в
internal/client/ish — не VK-specific.
vk.SetCaptchaLoggers удалён: логгеры captcha/manual подключаются внутри vk.New,
debug-флаг передаётся через новое поле Config.Debug. cmd/client/main.go больше
не импортирует captcha-пакеты.
Документация обновлена.
Вытаскивает источник TURN-creds из захардкоженной привязки к VK в интерфейс
internal/provider.Provider. Pipeline (proxy/udprelay, proxy/tcpfwd) работает
только через интерфейс — без VK-specific импортов и sentinel'ов.
Реализации:
- internal/provider/vk: фасад над client/vkauth (требует -link)
- internal/provider/static: фиксированные creds для self-hosted coturn /
metered / любого RFC 5766/8656 TURN (флаги -static-user/-static-pass/
-static-addr)
Изменения интерфейса:
- common.GetCredsFunc дропнула link (provider держит сам)
- udprelay AuthHandler: LockoutUntilUnix → BackoffUntilUnix
- vkauth sentinels обёрнуты в provider.ErrBackoffActive / ErrFatalNoStreams
через errors.Join (backward-compat сохранён)
Документация: docs/providers.md (новый), docs/glossary.md и docs/flags.md
обновлены.