Commit Graph

139 Commits

Author SHA1 Message Date
Anton 3d9144e044 chore(master): release 1.0.1 2026-05-26 13:02:37 +03:00
samosvalishe 0f74c238c5 refactor: install.sh 2026-05-26 13:02:13 +03:00
samosvalishe 281dd3e87a fix(release): drop package-name so root component is empty (issue 2214) 2026-05-26 02:32:41 +03:00
samosvalishe e976f7d8ef fix(release): set empty component for release-please tagging (issue 2214) 2026-05-26 02:28:49 +03:00
Anton 202bd86eb5 Merge pull request #9 from samosvalishe/release-please--branches--master
chore(master): release 1.0.0
2026-05-26 02:13:51 +03:00
Anton 8c0f8e4d79 chore(master): release 1.0.0 2026-05-26 02:13:13 +03:00
samosvalishe 68804665a4 chore: title-pattern с компонентом и версией для tagging release-please
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 очищен.
2026-05-26 02:12:33 +03:00
Anton 03d0750dc4 Merge pull request #8 from samosvalishe/release-please--branches--master
chore: release 1.0.0
2026-05-26 02:06:16 +03:00
Anton 45fd89af52 chore: release 1.0.0 2026-05-26 02:05:48 +03:00
samosvalishe b5922724ca chore: задать group-pull-request-title-pattern с версией
Заголовок group/manifest release-PR брался из group-pull-request-title-pattern
(default по имени ветки -> 'chore: release master'), без версии. Tagging-фаза
матчит title против паттерна и извлекает версию из него, поэтому тег не
создавался. Теперь обе паттерн-опции кладут версию в заголовок.

Плюс повторный сброс: manifest 0.0.0, CHANGELOG очищен.
2026-05-26 02:05:08 +03:00
Anton cc33ad140c Merge pull request #7 from samosvalishe/release-please--branches--master
chore: release master
2026-05-26 01:57:13 +03:00
Anton d9613f9f40 chore: release master 2026-05-26 01:54:45 +03:00
samosvalishe 3d4580f01d chore: повторный сброс релизов + фикс tagging release-please
- manifest 0.0.0, CHANGELOG очищен (старт с нуля)
- убран skip-github-release (отменял создание тега, не только релиза)
- задан pull-request-title-pattern с версией: версия попадает в title PR,
  иначе для manifest-root title генерился по имени ветки и tagging-фаза
  не могла извлечь версию из заголовка
2026-05-26 01:53:55 +03:00
Anton f806d64369 Merge pull request #6 from samosvalishe/release-please--branches--master
chore: release master
2026-05-26 01:44:15 +03:00
Anton f5d447a0d1 chore: release master 2026-05-26 01:42:52 +03:00
samosvalishe 268ea25303 chore: сброс состояния релизов для чистого старта
- manifest 0.0.0 (release-please пересчитает версию с нуля)
- CHANGELOG очищен под регенерацию
- skip-github-release: true — GitHub-релиз создаёт только GoReleaser
  (убирает двойное создание релиза release-please + goreleaser,
  из-за которого плодились черновики и падал Release-workflow)
2026-05-26 01:41:59 +03:00
Anton fd52ca8c2d Merge pull request #5 from samosvalishe/release-please--branches--master
chore: release master
2026-05-26 01:24:54 +03:00
Anton 8a6ec07007 chore: release master 2026-05-26 01:20:49 +03:00
samosvalishe 7b0a907638 fix(routes): починить установку маршрутов в routes.ps1 на Windows
Два 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.
2026-05-26 01:02:30 +03:00
samosvalishe 1b154a2e84 fix(install): переписать установщик сервера — TUI, надёжность, non-interactive
Чинит тихий выход после выбора метода (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
2026-05-26 00:52:46 +03:00
samosvalishe 98e1d7cc8e fix(turndial): подавить периодический CreatePermission refresh
VK TURN реджектит standalone CreatePermission refresh с 400 Bad Request
каждые 120s, засоряя логи. Данные идут через ChannelData; channel-bind
refresh (RFC 8656 §9) держит permission живым, потому отдельный refresh
избыточен. Выставляем PermissionRefreshInterval в 24h.
2026-05-26 00:20:30 +03:00
samosvalishe e906dfa8ef ci: SBOM по архивам, не по бинарю (фикс дубля android sbom-ассета)
android-бинарь libfreeturn.so пакуется в два архива (android + raw-android),
из-за чего sboms.artifacts=binary грузил один SBOM-файл дважды под одним
именем → 422 already_exists. artifacts=archive привязывает SBOM к уникальному
имени архива.
2026-05-25 02:34:30 +03:00
Anton 124ad83982 Merge pull request #4 from samosvalishe/release-please--branches--master
chore: release master
2026-05-25 02:05:35 +03:00
Anton 1f4be3541e chore: release master 2026-05-25 01:56:18 +03:00
samosvalishe 029c3aba95 fix: ci 2026-05-25 01:53:42 +03:00
samosvalishe 2cbc2af396 chore: docs 2026-05-25 01:33:22 +03:00
samosvalishe 587e95dbcc fix: ci 2026-05-25 01:32:24 +03:00
samosvalishe f12f6e6371 chore: tidy 2026-05-25 00:46:25 +03:00
samosvalishe b4f8cbcec0 fix: ci 2026-05-25 00:42:23 +03:00
samosvalishe dab58489d9 fix: ci 2026-05-25 00:33:27 +03:00
samosvalishe 36852a6a68 ci: release-please использует PAT вместо GITHUB_TOKEN
Тег, созданный через GITHUB_TOKEN, не триггерит release.yml (защита
GitHub от циклов). PAT пушит тег от имени юзера — GoReleaser
запускается по vX.Y.Z.
2026-05-25 00:33:27 +03:00
samosvalishe f1b047e9e5 feat: Client ID шлётся всегда, симметричный wire авторизации
Клиент всегда отправляет 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 теперь
всегда в первой записи туннеля — старые клиенты/серверы несовместимы.
2026-05-25 00:33:26 +03:00
samosvalishe 198d314031 feat: идемпотентный установщик с выбором версии и обновлением
Повторный запуск install-server.sh обнаруживает установку и предлагает меню: обновить версию (конфиг сохраняется), переконфигурировать, удалить.

- конфиг установки в /opt/free-turn-proxy/install.conf (chmod 600)
- выбор версии релиза при установке (список с GitHub API, дефолт latest)
- iptables -C перед -I: нет дублей правил при повторе
- атомарная подмена бинарника systemd + restart
- docker compose pull для подтягивания нового образа
2026-05-24 22:38:21 +03:00
samosvalishe 953e5758da feat: добавлены CONTRIBUTING.md и ISSUE_TEMPLATE.md 2026-05-24 22:23:38 +03:00
samosvalishe 782700113e feat: main ветка -> master 2026-05-24 22:18:38 +03:00
samosvalishe 76519860b4 feat: автоустановка сервера и обновление документации 2026-05-24 21:17:57 +03:00
samosvalishe 0c59adf59d docs: обновленные ссылки на README.md 2026-05-24 20:12:38 +03:00
samosvalishe e061345089 feat: авторизация по client-id, freeturn:// URI и подписки
- 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 по всем исходникам
2026-05-24 01:14:38 +03:00
samosvalishe 41d877dc64 chore: free turn proxy 2026-05-24 00:01:57 +03:00
samosvalishe 0f749a66a7 docs: обновление 2026-05-23 23:48:01 +03:00
samosvalishe 97cc24ad7f docs: обновление 2026-05-23 23:29:22 +03:00
samosvalishe bf59e5c8b4 refactor(config): единообразные имена переменных флагов, ужать help-текст
Переименовать переменные-указатели флагов под имена флагов 1:1 (vklink→link,
host→turn, obfProfileRaw→obfProfile, убрать суффиксы *Flag/*Raw/*Hex). Урезать
многословные описания флагов; убрать аннотации (default), раз пакет flag
печатает их сам.
2026-05-23 20:52:30 +03:00
samosvalishe 0bf46b1ceb fix(cli): корректно обрабатывать -help/-h вместо exit 1
ParseClient/ParseServer возвращают flag.ErrHelp после печати usage, но main
трактовал это как фатальную ошибку: log.Fatalf печатал лишнюю строку
"flag: help requested" и выходил с кодом 1. Ловим flag.ErrHelp и выходим с 0
в обоих бинарях.
2026-05-23 20:52:23 +03:00
samosvalishe 75676d99f5 docs: обновление 2026-05-23 18:29:30 +03:00
samosvalishe 4bedd00662 refactor(wire): переименовать srtpmimicry → rtpopus, заменить bool -obf на -obf-profile
Готовим зонтик `internal/wire/` под будущие профили мимикрии (rtph264, vp8
и т.д.). Сейчас интерфейс/registry не вводим — родится при появлении второго
профиля; пока только перепаковываем единственный профиль в собственный namespace.

Пакет:
- `internal/wire/srtpmimicry` → `internal/wire/rtpopus`
- error-префикс `"wrap: ..."` → `"rtpopus: ..."`
- wire-формат не тронут (заморожен — совместимость с задеплоенными пирами)

CLI (breaking):
- `-obf` (bool) удалён
- добавлен `-obf-profile none|rtpopus` (default `none`)
- `ObfOpts.Mode bool` → `Profile ObfProfile` + `Enabled()` helper
- консты `ObfProfileNone`/`ObfProfileRTPOpus`
- validation invalid-value error для `-obf-profile`

Docker (breaking):
- env `OBF_MODE=true` → `OBF_PROFILE=rtpopus`

Callsites:
- `common.NewClientWrap` → `NewClientObf`
- vars `wc`/`relayWC` → `obfConn`, `wrapListener` → `obfListener`
- log `obf=%t` → `obf-profile=%s`

Доки + тесты подтянуты под новые имена.
2026-05-23 15:24:00 +03:00
samosvalishe cf47f374b3 refactor(provider): убрать static-провайдер, оставить абстракцию
Сейчас нужен только VK-провайдер. internal/provider/static и связанные флаги
-static-user/-static-pass/-static-addr удалены, валидация и тесты обновлены.
Интерфейс provider.Provider остаётся — слот для будущих реализаций сохранён в
нейтральных формулировках doc-комментариев.
2026-05-23 14:54:46 +03:00
samosvalishe 2b85d937ea refactor(provider/vk): перенести vkauth/captcha/browserprofile/namegen под provider/vk/internal
Переносит 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-пакеты.

Документация обновлена.
2026-05-23 14:36:58 +03:00
samosvalishe 12c1ad6283 feat: абстракция провайдера (vk + static)
Вытаскивает источник 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
обновлены.
2026-05-23 14:11:05 +03:00
samosvalishe 8427887902 chore(deps): обновить Go-зависимости, GitHub Actions и Task до последних версий
- go.mod: x/crypto v0.51.0 → v0.52.0, bump x509roots/fallback; indirect:
  klauspost/compress v1.18.6, x/mod v0.36.0, x/tools v0.45.0
- CI actions: checkout v6.0.2, setup-go v6.4.0, upload-artifact v7.0.1,
  docker/{qemu,buildx,login} v4.x, sbom-action v0.24.0, goreleaser-action
  v7.2.2, release-please-action v5.0.0
- TASK_VERSION v3.40.0 → v3.51.1
2026-05-23 01:49:34 +03:00
samosvalishe dd8233208c fix(lint): устранить замечания golangci-lint + переход на dockers_v2
Проход lint (52 → 0):
- vkauth/token: переименовать затенённый err (govet shadow x3)
- udprelay/loop: явный _ = conn.Close() (errcheck x2)
- captcha/manual: ReadHeaderTimeout + html.EscapeString (G112, G705)
- proxy/tcpfwd: хелпер nonNegUint64 для байтовых счётчиков io.Copy (G115)
- proxy/bondclient, wire/bondframe: bounds-проверки на len->uint16/uint32
- wire/srtpmimicry: задокументирована усечка RTP seq mod 2^16
- dnsdial/doh: bounds-проверка + binary.BigEndian.PutUint16
- captcha/slider: clamp luma до 255 перед конверсией uint8
- vkauth/types: обоснованный nolint для публичных учёток VK SDK

Новый пакет internal/randx — Intn/IntN/Float64 на crypto/rand, drop-in замена
math/rand. Мигрированы все места antifingerprint-jitter (~22) в captcha, slider,
namegen, vkauth, udprelay.

GoReleaser:
- bump GORELEASER_VERSION v2.5.0 → v2.15.4 в Taskfile и обоих CI-workflow;
  текущий синтаксис .goreleaser.yaml (archives.ids, format_overrides.formats)
  требует v2.8+
- миграция dockers + docker_manifests → dockers_v2 (единый блок, multi-platform
  buildx); Dockerfile.goreleaser использует конвенцию ARG TARGETPLATFORM
2026-05-23 01:37:42 +03:00