diff --git a/docs/about.md b/docs/about.md index 1dd610a..3347446 100644 --- a/docs/about.md +++ b/docs/about.md @@ -23,7 +23,7 @@ 11. [Mobile / Android](#11-mobile--android) 12. [Python PoC скрипты](#12-python-poc-скрипты) 13. [Сборка и деплой](#13-сборка-и-деплой) -14. [CLI - все флаги](#14-cli--все-флаги) +14. [YAML конфигурация](#14-yaml-конфигурация) 15. [URI-формат и подписки](#15-uri-формат-и-подписки) 16. [Матрица совместимости](#16-матрица-совместимости) 17. [CI/CD](#17-cicd) @@ -89,9 +89,9 @@ **2026-04-25..30** - tile кодек для videochannel с Reed-Solomon коррекцией ошибок, `vp8channel` поверх KCP для надёжной доставки, замена самописного мультиплексора на smux. -**2026-05-01..06** - `seichannel` (данные в H264 SEI NAL-юнитах), E2E тесты на реальных провайдерах, URI-формат и формат подписок, `-client-id` для привязки клиента к серверу, SOCKS5 аутентификация. +**2026-05-01..06** - `seichannel` (данные в H264 SEI NAL-юнитах), E2E тесты на реальных провайдерах, URI-формат и формат подписок, SOCKS5 аутентификация. -**2026-05-07..10** - финальная полировка: исправлен throughput bug в vp8channel (ограничение было в 32 раза ниже реального), документация, SEI конфигурация, `-socks-user`/`-socks-pass`. +**2026-05-07..10** - финальная полировка: исправлен throughput bug в vp8channel (ограничение было в 32 раза ниже реального), документация, SEI конфигурация, SOCKS5 аутентификация (username/password). ### Статья на Хабре @@ -144,7 +144,7 @@ Проект разбит на чёткие слои. Каждый слой можно заменить независимо. ``` -cmd/olcrtc/ CLI entrypoint, парсинг флагов +cmd/olcrtc/ CLI entrypoint, загрузка YAML конфига │ internal/app/session/ конфигурация, валидация, роутинг в server/client │ │ @@ -199,28 +199,28 @@ internal/e2e/ E2E тесты на реальных провайдер | Файл | Что делает | |---|---| -| `main.go` | Точка входа. Парсит флаги (`flag.FlagSet`), настраивает логирование, подавляет шум LiveKit/pion в не-debug режиме, запускает `session.Run` или `session.Gen`. Graceful shutdown по SIGTERM/SIGINT с 5-секундным таймаутом | -| `main_test.go` | Юнит-тесты CLI: валидация флагов, режимы, edge cases | +| `main.go` | Точка входа. Загружает YAML конфиг (`olcrtc config.yaml`), настраивает логирование, подавляет шум LiveKit/pion в не-debug режиме, запускает `session.Run` или `session.Gen`. Graceful shutdown по SIGTERM/SIGINT с 5-секундным таймаутом | +| `main_test.go` | Юнит-тесты CLI: валидация конфига, режимы, edge cases | ### `internal/app/session/` | Файл | Что делает | |---|---| -| `session.go` | Главная точка конфигурации. `RegisterDefaults()` регистрирует все carriers, links, transports. `Validate()` проверяет все флаги. `Run()` роутит в `server.Run` или `client.Run`. `Gen()` генерирует Room ID для jazz с ретраями (wbstream больше не поддерживает автогенерацию - руму нужно создавать вручную через stream.wb.ru). `buildRoomURL()` строит URL для каждого carrier | +| `session.go` | Главная точка конфигурации. `RegisterDefaults()` регистрирует все carriers, links, transports. `Validate()` проверяет все настройки. `Run()` роутит в `server.Run` или `client.Run`. `Gen()` генерирует Room ID для jazz с ретраями (wbstream больше не поддерживает автогенерацию - руму нужно создавать вручную через stream.wb.ru) | | `session_test.go` | Тесты валидации конфига | ### `internal/server/` | Файл | Что делает | |---|---| -| `server.go` | Серверная сторона туннеля. Подключается к комнате как второй участник звонка. Создаёт `muxconn` → `smux.Session`. Для каждого входящего smux-стрима читает JSON `ConnectRequest` от клиента с адресом назначения, устанавливает TCP соединение и гоняет байты туда-обратно. Поддерживает SOCKS5 прокси для исходящего трафика. Умеет переподключаться при разрыве | +| `server.go` | Серверная сторона туннеля. Подключается к комнате как второй участник звонка. Создаёт `muxconn` → `smux.Session`. Первый smux-стрим — контрольный (handshake CLIENT_HELLO / SERVER_WELCOME). Для каждого последующего стрима читает JSON `ConnectRequest` от клиента, устанавливает TCP соединение и гоняет байты. Поддерживает хуки: `OnSessionOpen`, `OnSessionClose`, `OnTraffic`. Умеет переподключаться при разрыве | | `server_test.go` | Тесты серверной логики | ### `internal/client/` | Файл | Что делает | |---|---| -| `client.go` | Клиентская сторона. Поднимает SOCKS5-сервер. Для каждого входящего подключения: SOCKS5 handshake (поддержка RFC 1929 username/password auth), создаёт smux-стрим, шлёт JSON `ConnectRequest` с адресом, гоняет байты. Переподключается при разрыве WebRTC сессии | +| `client.go` | Клиентская сторона. Поднимает SOCKS5-сервер. Для каждого входящего подключения: SOCKS5 handshake (поддержка RFC 1929 username/password auth), создаёт smux-стрим, шлёт JSON `ConnectRequest` с адресом, гоняет байты. Первый smux-стрим — контрольный (handshake). Переподключается при разрыве WebRTC сессии с retry loop | | `client_test.go` | Тесты клиентской логики | ### `internal/muxconn/` @@ -343,9 +343,9 @@ internal/e2e/ E2E тесты на реальных провайдер | Файл | Что делает | |---|---| -| `srv.sh` | Интерактивный скрипт запуска сервера через Podman. Задаёт вопросы про carrier/transport/room/key, собирает образ, запускает контейнер. Флаги: `--branch=` (сменить ветку), `--no-cache` (очистить Go-кеш перед сборкой) | +| `srv.sh` | Интерактивный скрипт запуска сервера через Podman. Задаёт вопросы про carrier/transport/room/key, генерирует YAML конфиг, собирает образ, запускает контейнер. Флаги: `--branch=` (сменить ветку), `--no-cache` (очистить Go-кеш перед сборкой) | | `cnc.sh` | Интерактивный скрипт запуска клиента через Podman | -| `docker/olcrtc-entrypoint.sh` | Docker entrypoint: читает env переменные, формирует CLI флаги, запускает `olcrtc` | +| `script/docker/olcrtc-entrypoint.sh` | Docker entrypoint: читает env переменные, генерирует YAML конфиг, запускает `olcrtc` | | `docker/olcrtc-healthcheck.sh` | Docker healthcheck: проверяет что процесс запущен | ### `data/` @@ -361,8 +361,8 @@ internal/e2e/ E2E тесты на реальных провайдер |---|---| | `fast.md` | Быстрый старт через скрипты (Podman) | | `manual.md` | Мануальная сборка: Go, mage, кросс-компиляция, все шаги | -| `settings.md` | Матрица совместимости carrier×transport, все CLI флаги с описанием, готовые команды | -| `uri.md` | URI формат для клиентских приложений: `olcrtc://?@#%$` | +| `settings.md` | Матрица совместимости carrier×transport, описание всех YAML полей, готовые примеры конфигов | +| `uri.md` | URI формат для клиентских приложений: `olcrtc://?@#$` | | `sub.md` | Формат подписок: список серверов в одном файле с метаданными | --- @@ -377,7 +377,7 @@ Carrier - это WebRTC сервис видеозвонков, через кот - Не требует регистрации для участника (только организатор) - DataChannel работает, но Jazz **банит IP** за паттерны трафика характерные для DataChannel туннеля - VideoTrack работает стабильно -- Поддерживает автогенерацию Room ID (`-mode gen`) +- Поддерживает автогенерацию Room ID (`mode: gen`) - Инициализация звонка изнутри автоматически реализована ### Yandex Telemost (`telemost`) @@ -394,7 +394,7 @@ Carrier - это WebRTC сервис видеозвонков, через кот - **Рекомендуется** - самый стабильный - Минимальная прослойка, почти прямой relay - Работает со всеми транспортами: datachannel, vp8channel, seichannel, videochannel -- Поддерживает автогенерацию Room ID (`-mode gen`) +- Поддерживает автогенерацию Room ID (`mode: gen`) - Инициализация звонка автоматически --- @@ -419,7 +419,7 @@ Transport определяет как именно данные упаковыв - Работает везде где есть VideoTrack (jazz, telemost, wbstream) - Большой пинг из-за батчинга фреймов - KCP параметры: MTU 1400, окно 4096, conv ID `0xC0FFEE01` -- Рекомендуется: `-vp8-fps 60 -vp8-batch 64` +- Рекомендуется: `vp8.fps: 60`, `vp8.batch_size: 64` ### seichannel @@ -429,7 +429,7 @@ Transport определяет как именно данные упаковыв - UUID для SEI payload: `5dc03ba8-450f-4b55-9a77-1f916c5b0739` - ACK timeout (по умолчанию 3с), фрагментация, ретрансмиссия до 4 попыток - Не работает с telemost -- Рекомендуется: `-fps 60 -batch 64 -frag 900 -ack-ms 2000` +- Рекомендуется: `sei.fps: 60`, `sei.batch_size: 64`, `sei.fragment_size: 900`, `sei.ack_timeout_ms: 2000` ### videochannel @@ -475,7 +475,7 @@ WebRTC сам по себе шифрует трафик через DTLS-SRTP, н **Поддерживается:** - SOCKS5 (RFC 1928) с командой CONNECT -- Аутентификация username/password (RFC 1929) через `-socks-user`/`-socks-pass` +- Аутентификация username/password (RFC 1929) через `socks.user`/`socks.pass` в YAML конфиге - SOCKS5h (hostname resolution на стороне сервера) - DNS запросы идут через туннель - Без аутентификации (по умолчанию) @@ -488,7 +488,7 @@ export all_proxy=socks5h://127.0.0.1:8808 export all_proxy=socks5h://user:pass@127.0.0.1:8808 # с авторизацией ``` -**Сервер** (`srv`) может сам ходить через SOCKS5 прокси для исходящего трафика (`-socks-proxy`, `-socks-proxy-port`). +**Сервер** (`srv`) может сам ходить через SOCKS5 прокси для исходящего трафика (`socks.proxy_addr`, `socks.proxy_port` в YAML конфиге). --- @@ -501,7 +501,7 @@ export all_proxy=socks5h://user:pass@127.0.0.1:8808 # с авторизацие Community Android клиент: [alananisimov/olcbox](https://github.com/alananisimov/olcbox) **API:** -- `Start(carrier, roomID, clientID, keyHex string)` - запустить туннель +- `Start(carrier, roomID, keyHex string)` - запустить туннель - `Stop()` - остановить - `IsRunning() bool` - `SetProtector(p SocketProtector)` - Android VPN bypass (VpnService.protect) @@ -582,106 +582,109 @@ cd olcrtc # генерация ключа openssl rand -hex 32 -# генерация room ID (для jazz/wbstream) -./olcrtc -mode gen -carrier wbstream -dns 1.1.1.1:53 -amount 1 -data data +# создать конфиг (пример: wbstream + datachannel) +cat > server.yaml < client.yaml <?@#%$ +olcrtc://?@#$ ``` Где `` - опциональный блок `` с параметрами транспорта. **Примеры:** ``` -olcrtc://wbstream?datachannel@room-01#d823fa...%android-01$RU / olc free sub -olcrtc://wbstream?vp8channel@room-01#d823fa...%android-01$RU -olcrtc://telemost?seichannel@room-01#d823fa...%client$RU +olcrtc://wbstream?datachannel@room-01#d823fa...$RU / olc free sub +olcrtc://wbstream?vp8channel@room-01#d823fa...$RU +olcrtc://telemost?seichannel@room-01#d823fa...$RU ``` ### Формат подписки (sub.md) @@ -714,7 +717,7 @@ olcrtc://telemost?seichannel@room-01#d823f #refresh: 10m #icon: 🇷🇺 -olcrtc://wbstream?datachannel@room-01#key%client-id$RU / free +olcrtc://wbstream?datachannel@room-01#key$RU / free ##name: RU-1 ##ip: 1.2.3.4 ##comment: basic free node @@ -801,7 +804,7 @@ WB Stream - текущий приоритет. Основа уже реализ | Issue | Что было | |---|---| | #44 | Very high ping - исправлен throughput bug vp8channel | -| #40 | Подключение нескольких устройств - реализовано через client-id | +| #40 | Подключение нескольких устройств | | #39 | Oracle VPS поддержка | | #38 | Стандартный URI формат - реализован | | #37 | Jitsi Meet - не планируется | @@ -861,9 +864,10 @@ dial tcp: lookup stream.wb.ru: i/o timeout 77.88.8.8:53 ``` -При ручном запуске: -```sh -./olcrtc -mode cnc ... -dns 8.8.8.8:53 +При ручном запуске — указать другой DNS в YAML конфиге: +```yaml +net: + dns: "8.8.8.8:53" ``` После смены DNS в логах должна появиться строка: @@ -875,7 +879,7 @@ SOCKS5 server listening on 0.0.0.0:8808 **Симптомы:** -В логах сервера (`-mode srv`) появляются строки вида: +В логах сервера появляются строки вида: ``` sid=59 dial 157.240.205.60:443 failed (10.000774052s): dial failed: dial tcp4 157.240.205.60:443: i/o timeout sid=69 dial 194.221.250.50:443 failed (10.002092858s): dial failed: dial tcp4 194.221.250.50:443: i/o timeout @@ -901,9 +905,11 @@ curl -v --connect-timeout 5 https://149.154.167.41 **Решение:** 1. Сменить хостинг-провайдера или локацию на того, кто не блокирует исходящий трафик. -2. Использовать на сервере исходящий SOCKS5 прокси (`-socks-proxy`/`-socks-proxy-port`), который не заблокирован: -```sh -./olcrtc -mode srv ... -socks-proxy 1.2.3.4 -socks-proxy-port 1080 +2. Использовать на сервере исходящий SOCKS5 прокси через YAML конфиг: +```yaml +socks: + proxy_addr: "1.2.3.4" + proxy_port: 1080 ``` Это ошибка не на стороне olcRTC - он корректно логирует ошибки и продолжает работу. Соединения к незаблокированным адресам проходят без проблем. Проблема на стороне хостинга или фаервола. diff --git a/docs/client.example.yaml b/docs/client.example.yaml index 009d830..ee6ecf2 100644 --- a/docs/client.example.yaml +++ b/docs/client.example.yaml @@ -1,6 +1,5 @@ # olcrtc client config example -# Run with: olcrtc -config client.yaml -# Any CLI flag (e.g. -key, -id) overrides the corresponding YAML field. +# Run with: olcrtc client.yaml mode: cnc @@ -11,7 +10,6 @@ auth: room: id: "ROOM_ID_HERE" # must match the server - client_id: "default" # must match the server (deprecated) crypto: key: "REPLACE_ME_WITH_64_HEX_CHARS" # must match the server diff --git a/docs/configuration.md b/docs/configuration.md index b8ebc7f..8e3b59c 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -20,7 +20,6 @@ Examples: | `link` | `direct` | | `auth.provider` | `telemost`, `jazz`, `wbstream`, `none` | | `room.id` | conference room id | -| `room.client_id` | deprecated, will be removed | | `crypto.key` | 64-char hex (32 bytes) | | `net.transport` | `datachannel`, `videochannel`, `seichannel`, `vp8channel` | | `net.dns` | resolver `host:port` | diff --git a/docs/fast.md b/docs/fast.md index d3ea70f..59827e3 100644 --- a/docs/fast.md +++ b/docs/fast.md @@ -133,16 +133,6 @@ Enter Room ID: Для **jazz** скрипт предложит выбор: сгенерировать автоматически (рекомендуется) или ввести существующий ID. При автогенерации скрипт запустит `gen` и получит ID до старта сервера. Также можно создать руму через сайт [jazz](https://salutejazz.ru/calls/create). -### Client ID - -``` -Enter Client ID [default: default]: -``` - -Это обязательный идентификатор клиента. Он должен быть одинаковым на сервере и клиенте - используется чтобы клиент подключался именно к вашему серверу, а не к случайному серверу в руме. - -Один `-client-id` технически может держать бесконечное количество одновременных соединений. Однако SFU ограничивает полосу пропускания на одного участника звонка, поэтому оптимально использовать схему **1 client-id = 1 пользователь** - но это не обязательное требование. - ### DNS ``` @@ -243,11 +233,10 @@ Container name: olcrtc-server Auth: wbstream Transport: datachannel Room ID: abc123xyz -Client ID: default Encryption key: d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799 ``` -**Сохрани Room ID, Client ID и Encryption key** - они нужны для клиента. +**Сохрани Room ID и Encryption key** - они нужны для клиента. --- @@ -261,15 +250,7 @@ cd olcrtc ./script/cnc.sh ``` -Отвечай на те же вопросы что на сервере - **auth, transport, room ID и client ID должны совпадать**. - -Когда спросит client ID: - -``` -Enter Client ID [default: default]: default -``` - -Введи тот же `client ID`, который использовал на сервере. +Отвечай на те же вопросы что на сервере - **auth, transport и room ID должны совпадать**. Когда спросит ключ: @@ -302,7 +283,6 @@ SOCKS5 username (leave empty to disable auth): [+] Client started successfully! Container name: olcrtc-client -Client ID: default SOCKS5 proxy: 127.0.0.1:8808 ``` @@ -349,4 +329,4 @@ podman stop olcrtc-client Хочешь собрать руками без Podman? -> [Мануальная сборка](manual.md) -Все флаги и матрица совместимости -> [settings.md](settings.md) +Все настройки и матрица совместимости -> [settings.md](settings.md) diff --git a/docs/manual.md b/docs/manual.md index 2c07f2a..bfb8ca3 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -143,52 +143,43 @@ openssl rand -hex 32 --- -## Шаг 7: Придумать client ID - -Это обязательный идентификатор клиента. Он должен совпадать на сервере и клиенте, иначе сервер отклонит соединение. - -```sh -CLIENT_ID=default -``` - -Подойдёт любая короткая строка без пробелов: `home-laptop`, `android-01`, `archlinux`. - -Один `-client-id` технически может держать бесконечное количество одновременных соединений. Однако SFU ограничивает полосу пропускания на одного участника звонка, поэтому оптимально использовать схему **1 client-id = 1 пользователь** - но это не обязательное требование. - ---- - -## Шаг 8: Запустить сервер +## Шаг 7: Запустить сервер На серверной машине (VPS и т.д.). Подбери нужную комбинацию carrier + transport из матрицы в [settings.md](settings.md). ### wbstream + datachannel (рекомендуется - максимальная скорость и пинг) -Сначала создай руму вручную через сайт [wbstream](https://stream.wb.ru) (автогенерация через `-mode gen` для wbstream больше не поддерживается) и сохрани её ID: +Сначала создай руму вручную через сайт [wbstream](https://stream.wb.ru) (автогенерация через `mode: gen` для wbstream больше не поддерживается) и сохрани её ID. -```sh -ROOM_ID="" +Создай YAML конфиг: + +```yaml +# server.yaml +mode: srv +link: direct +auth: + provider: wbstream +room: + id: "" +crypto: + key: "d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799" +net: + transport: datachannel + dns: "1.1.1.1:53" +data: data ``` -Затем запусти сервер: +Запусти: ```sh -./build/olcrtc-linux-amd64 \ - -mode srv \ - -carrier wbstream \ - -transport datachannel \ - -id "$ROOM_ID" \ - -client-id "$CLIENT_ID" \ - -key d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799 \ - -link direct \ - -dns 1.1.1.1:53 \ - -data data +./build/olcrtc-linux-amd64 server.yaml ``` Room ID нужно передать клиенту. ### Добавить отладку -Добавь `--debug` к любой команде - увидишь каждое соединение: +Добавь `debug: true` в YAML конфиг - увидишь каждое соединение: ``` 2026/05/03 08:05:23 Connecting link via direct/datachannel/wbstream... @@ -200,60 +191,72 @@ Room ID нужно передать клиенту. --- -## Шаг 9: Запустить клиент +## Шаг 8: Запустить клиент -На своей машине. Carrier, transport, id, `client-id` и key должны совпадать с сервером. +На своей машине. Auth provider, transport, room ID и key должны совпадать с сервером. ### wbstream + datachannel +```yaml +# client.yaml +mode: cnc +link: direct +auth: + provider: wbstream +room: + id: "" +crypto: + key: "" +net: + transport: datachannel + dns: "1.1.1.1:53" +socks: + host: "127.0.0.1" + port: 8808 +data: data +``` + ```sh -./build/olcrtc-linux-amd64 \ - -mode cnc \ - -carrier wbstream \ - -transport datachannel \ - -id abc123xyz \ - -client-id "$CLIENT_ID" \ - -key \ - -link direct \ - -dns 1.1.1.1:53 \ - -data data \ - -socks-host 127.0.0.1 \ - -socks-port 1080 +./build/olcrtc-linux-amd64 client.yaml ``` После старта в логах появится: ``` -SOCKS5 server listening on 127.0.0.1:1080 +SOCKS5 server listening on 127.0.0.1:8808 ``` -Если нужно защитить прокси логином и паролем (например на машине с несколькими пользователями), добавь `-socks-user` и `-socks-pass`: +Если нужно защитить прокси логином и паролем (например на машине с несколькими пользователями), добавь `socks.user` и `socks.pass` в конфиг: -```sh -./build/olcrtc-linux-amd64 \ - -mode cnc \ - -carrier wbstream \ - -transport datachannel \ - -id abc123xyz \ - -client-id "$CLIENT_ID" \ - -key \ - -link direct \ - -dns 1.1.1.1:53 \ - -data data \ - -socks-host 127.0.0.1 \ - -socks-port 1080 \ - -socks-user myuser \ - -socks-pass mypass +```yaml +# client.yaml +mode: cnc +link: direct +auth: + provider: wbstream +room: + id: "" +crypto: + key: "" +net: + transport: datachannel + dns: "1.1.1.1:53" +socks: + host: "127.0.0.1" + port: 8808 + user: myuser + pass: mypass +data: data ``` -Без этих флагов аутентификация отключена - поведение прежнее. +Без этих полей аутентификация отключена - поведение прежнее. --- -## Шаг 10: Проверить +## Шаг 9: Проверить ```sh -curl --socks5-hostname 127.0.0.1:1080 https://icanhazip.com +curl --socks5-hostname 127.0.0.1:8808 https://icanhazip.com ``` Должен вернуть IP сервера. @@ -261,7 +264,7 @@ curl --socks5-hostname 127.0.0.1:1080 https://icanhazip.com Или выставить переменную чтобы весь трафик шёл через прокси: ```sh -export all_proxy=socks5h://127.0.0.1:1080 +export all_proxy=socks5h://127.0.0.1:8808 curl https://icanhazip.com ``` @@ -284,4 +287,4 @@ mage docker # собрать образ через docker Используешь скрипты вместо ручной сборки? -> [Быстрый старт](fast.md) -Все флаги и матрица совместимости -> [settings.md](settings.md) +Все настройки и матрица совместимости -> [settings.md](settings.md) diff --git a/docs/server.example.yaml b/docs/server.example.yaml index dfe1982..5c1cf67 100644 --- a/docs/server.example.yaml +++ b/docs/server.example.yaml @@ -1,6 +1,5 @@ # olcrtc server config example -# Run with: olcrtc -config server.yaml -# Any CLI flag (e.g. -key, -id) overrides the corresponding YAML field. +# Run with: olcrtc server.yaml mode: srv @@ -12,7 +11,6 @@ auth: room: id: "ROOM_ID_HERE" - client_id: "default" # deprecated: server identifier (will be removed in upcoming refactor) crypto: # 32-byte hex (64 chars). Generate with: openssl rand -hex 32 diff --git a/docs/settings.md b/docs/settings.md index 0dc8f60..1ca4214 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -30,44 +30,54 @@ --- -## Обязательные флаги +## Обязательные поля YAML конфига -| Флаг | Что вводить | -|------|-------------| -| `-mode` | `srv` на сервере, `cnc` на клиенте, `gen` для генерации Room ID | -| `-carrier` | `telemost`, `jazz` или `wbstream` | -| `-transport` | `datachannel`, `vp8channel`, `seichannel` или `videochannel` | -| `-id` | Room ID | -| `-client-id` | Общий идентификатор клиента. Должен совпадать на сервере и клиенте. Один client-id может держать бесконечное количество соединений, но SFU ограничивает полосу на участника - оптимально 1 client-id = 1 пользователь (не обязательно) | -| `-key` | Ключ шифрования hex 64 символа. Генерация: `openssl rand -hex 32` | -| `-link` | Всегда `direct` | -| `-data` | Всегда `data` | -| `-dns` | DNS-сервер, например `1.1.1.1:53` | +| YAML поле | Что вводить | +|-----------|-------------| +| `mode` | `srv` на сервере, `cnc` на клиенте, `gen` для генерации Room ID | +| `auth.provider` | `telemost`, `jazz` или `wbstream` | +| `net.transport` | `datachannel`, `vp8channel`, `seichannel` или `videochannel` | +| `room.id` | Room ID | +| `crypto.key` | Ключ шифрования hex 64 символа. Генерация: `openssl rand -hex 32` | +| `link` | Всегда `direct` | +| `data` | Всегда `data` | +| `net.dns` | DNS-сервер, например `1.1.1.1:53` | --- -## Необязательные флаги +## Необязательные поля -| Флаг | Описание | -|------|----------| -| `--debug` | Подробные логи соединений | +| YAML поле | Описание | +|-----------|----------| +| `debug` | `true` для подробных логов соединений | --- -## -mode gen +## mode: gen Генерирует Room ID заранее, не запуская сервер. Поддерживается только для `jazz`. Для `wbstream` создавай руму вручную через [stream.wb.ru](https://stream.wb.ru) (автогенерация отключена со стороны WB). -**Обязательные флаги:** +**Обязательные поля:** -| Флаг | Описание | -|------|----------| -| `-carrier` | `jazz` | -| `-dns` | DNS-сервер | -| `-amount` | Количество комнат | +| YAML поле | Описание | +|-----------|----------| +| `auth.provider` | `jazz` | +| `net.dns` | DNS-сервер | +| `gen.amount` | Количество комнат | + +```yaml +# gen.yaml +mode: gen +auth: + provider: jazz +net: + dns: "1.1.1.1:53" +gen: + amount: 3 +``` ```sh -./olcrtc -mode gen -carrier jazz -dns 1.1.1.1:53 -amount 3 +./olcrtc gen.yaml # room-id-1 # room-id-2 # room-id-3 @@ -75,163 +85,293 @@ --- -## Флаги только для сервера (`-mode srv`) +## Поля только для сервера (`mode: srv`) -| Флаг | Описание | -|------|----------| -| `-socks-proxy` | Адрес SOCKS5-прокси для исходящего трафика сервера | -| `-socks-proxy-port` | Порт этого прокси | +| YAML поле | Описание | +|-----------|----------| +| `socks.proxy_addr` | Адрес SOCKS5-прокси для исходящего трафика сервера | +| `socks.proxy_port` | Порт этого прокси | --- -## Флаги только для клиента (`-mode cnc`) +## Поля только для клиента (`mode: cnc`) -| Флаг | Описание | По умолчанию | -|------|----------|:------------:| -| `-socks-host` | На каком адресе поднять SOCKS5 | `127.0.0.1` | -| `-socks-port` | На каком порту поднять SOCKS5 | `1080` | -| `-socks-user` | Логин для входящих SOCKS5-подключений (необязательно) | - | -| `-socks-pass` | Пароль для входящих SOCKS5-подключений (необязательно) | - | +| YAML поле | Описание | По умолчанию | +|-----------|----------|:------------:| +| `socks.host` | На каком адресе поднять SOCKS5 | `127.0.0.1` | +| `socks.port` | На каком порту поднять SOCKS5 | `1080` | +| `socks.user` | Логин для входящих SOCKS5-подключений (необязательно) | - | +| `socks.pass` | Пароль для входящих SOCKS5-подключений (необязательно) | - | -Если `-socks-user` не задан - аутентификация отключена (любой локальный клиент может подключиться). +Если `socks.user` не задан - аутентификация отключена (любой локальный клиент может подключиться). Если задан - клиент принимает только подключения с правильным логином и паролем (RFC 1929). --- ## datachannel -Дополнительных флагов нет - всё по умолчанию. +Дополнительных полей нет - всё по умолчанию. --- ## vp8channel -**Рекомендуется: `-vp8-fps 60 -vp8-batch 64`** (числа лучше чётные, больший batch = выше скорость) +**Рекомендуется: `fps: 60`, `batch_size: 64`** (числа лучше чётные, больший batch = выше скорость) -| Флаг | Описание | По умолчанию | -|------|----------|:------------:| -| `-vp8-fps` | FPS VP8 потока | `25` | -| `-vp8-batch` | Кадров за тик | `1` | +| YAML поле | Описание | По умолчанию | +|-----------|----------|:------------:| +| `vp8.fps` | FPS VP8 потока | `25` | +| `vp8.batch_size` | Кадров за тик | `1` | --- ## seichannel -**Рекомендуется: `-fps 60 -batch 64 -frag 900 -ack-ms 2000`** +**Рекомендуется: `fps: 60`, `batch_size: 64`, `fragment_size: 900`, `ack_timeout_ms: 2000`** -| Флаг | Описание | По умолчанию | -|------|----------|:------------:| -| `-fps` | FPS H264 потока | `60` | -| `-batch` | Кадров за тик | `64` | -| `-frag` | Размер фрагмента в байтах | `900` | -| `-ack-ms` | Таймаут ACK в миллисекундах | `2000` | +| YAML поле | Описание | По умолчанию | +|-----------|----------|:------------:| +| `sei.fps` | FPS H264 потока | `60` | +| `sei.batch_size` | Кадров за тик | `64` | +| `sei.fragment_size` | Размер фрагмента в байтах | `900` | +| `sei.ack_timeout_ms` | Таймаут ACK в миллисекундах | `2000` | --- ## videochannel -**Рекомендуется: `-video-codec qrcode -video-w 1080 -video-h 1080 -video-fps 60 -video-bitrate 5000k -video-hw none`** +**Рекомендуется: `codec: qrcode`, `width: 1080`, `height: 1080`, `fps: 60`, `bitrate: "5000k"`, `hw: none`** -| Флаг | Описание | По умолчанию | -|------|----------|:------------:| -| `-video-codec` | `qrcode` или `tile` | `qrcode` | -| `-video-w` | Ширина в пикселях | `1920` | -| `-video-h` | Высота в пикселях | `1080` | -| `-video-fps` | FPS | `30` | -| `-video-bitrate` | Битрейт, например `2M` или `5000k` | `2M` | -| `-video-hw` | Аппаратное ускорение: `none` или `nvenc` | `none` | -| `-video-qr-recovery` | Коррекция ошибок QR: `low` / `medium` / `high` / `highest` | `low` | -| `-video-qr-size` | Размер фрагмента QR в байтах, `0` = авто | `0` | -| `-video-tile-module` | Размер тайла в пикселях 1..270 (только `tile`) | `4` | -| `-video-tile-rs` | Reed-Solomon паритет % 0..200 (только `tile`) | `20` | -| `-ffmpeg` | Путь к исполняемому файлу ffmpeg | `ffmpeg` | +| YAML поле | Описание | По умолчанию | +|-----------|----------|:------------:| +| `video.codec` | `qrcode` или `tile` | `qrcode` | +| `video.width` | Ширина в пикселях | `1920` | +| `video.height` | Высота в пикселях | `1080` | +| `video.fps` | FPS | `30` | +| `video.bitrate` | Битрейт, например `"2M"` или `"5000k"` | `"2M"` | +| `video.hw` | Аппаратное ускорение: `none` или `nvenc` | `none` | +| `video.qr_recovery` | Коррекция ошибок QR: `low` / `medium` / `high` / `highest` | `low` | +| `video.qr_size` | Размер фрагмента QR в байтах, `0` = авто | `0` | +| `video.tile_module` | Размер тайла в пикселях 1..270 (только `tile`) | `4` | +| `video.tile_rs` | Reed-Solomon паритет % 0..200 (только `tile`) | `20` | +| `ffmpeg` | Путь к исполняемому файлу ffmpeg | `ffmpeg` | Для codec `tile` нужно точно `1080x1080`. --- -## Готовые команды +## Готовые конфиги ### wbstream + datachannel (рекомендуется - максимальная скорость, без бана) -```sh +```yaml # room ID нужно создать вручную через https://stream.wb.ru -ROOM_ID="" -# сервер -./olcrtc -mode srv -carrier wbstream -transport datachannel \ - -id "$ROOM_ID" -client-id -key -link direct -data data -dns 1.1.1.1:53 +# server.yaml +mode: srv +link: direct +auth: + provider: wbstream +room: + id: "" +crypto: + key: "" +net: + transport: datachannel + dns: "1.1.1.1:53" +data: data +``` -# клиент -./olcrtc -mode cnc -carrier wbstream -transport datachannel \ - -id "$ROOM_ID" -client-id -key -link direct -data data -dns 1.1.1.1:53 \ - -socks-host 127.0.0.1 -socks-port 1080 +```yaml +# client.yaml +mode: cnc +link: direct +auth: + provider: wbstream +room: + id: "" +crypto: + key: "" +net: + transport: datachannel + dns: "1.1.1.1:53" +socks: + host: "127.0.0.1" + port: 8808 +data: data ``` ### wbstream + datachannel + SOCKS5 аутентификация -```sh -# клиент с логином и паролем на прокси -./olcrtc -mode cnc -carrier wbstream -transport datachannel \ - -id "$ROOM_ID" -client-id -key -link direct -data data -dns 1.1.1.1:53 \ - -socks-host 127.0.0.1 -socks-port 1080 \ - -socks-user myuser -socks-pass mypass +```yaml +# client.yaml с логином и паролем на прокси +mode: cnc +link: direct +auth: + provider: wbstream +room: + id: "" +crypto: + key: "" +net: + transport: datachannel + dns: "1.1.1.1:53" +socks: + host: "127.0.0.1" + port: 8808 + user: myuser + pass: mypass +data: data ``` Использование: ```sh -curl --socks5-hostname myuser:mypass@127.0.0.1:1080 https://icanhazip.com +curl --socks5-hostname myuser:mypass@127.0.0.1:8808 https://icanhazip.com # или -export all_proxy=socks5h://myuser:mypass@127.0.0.1:1080 +export all_proxy=socks5h://myuser:mypass@127.0.0.1:8808 ``` --- ### telemost + vp8channel -```sh -# сервер -./olcrtc -mode srv -carrier telemost -transport vp8channel \ - -id -client-id -key -link direct -data data \ - -vp8-fps 60 -vp8-batch 64 +```yaml +# server.yaml +mode: srv +link: direct +auth: + provider: telemost +room: + id: "" +crypto: + key: "" +net: + transport: vp8channel + dns: "1.1.1.1:53" +vp8: + fps: 60 + batch_size: 64 +data: data +``` -# клиент -./olcrtc -mode cnc -carrier telemost -transport vp8channel \ - -id -client-id -key -link direct -data data \ - -socks-host 127.0.0.1 -socks-port 1080 \ - -vp8-fps 60 -vp8-batch 64 +```yaml +# client.yaml +mode: cnc +link: direct +auth: + provider: telemost +room: + id: "" +crypto: + key: "" +net: + transport: vp8channel + dns: "1.1.1.1:53" +socks: + host: "127.0.0.1" + port: 8808 +vp8: + fps: 60 + batch_size: 64 +data: data ``` ### telemost + seichannel -```sh -# сервер -./olcrtc -mode srv -carrier telemost -transport seichannel \ - -id -client-id -key -link direct -data data \ - -fps 60 -batch 64 -frag 900 -ack-ms 2000 +```yaml +# server.yaml +mode: srv +link: direct +auth: + provider: telemost +room: + id: "" +crypto: + key: "" +net: + transport: seichannel + dns: "1.1.1.1:53" +sei: + fps: 60 + batch_size: 64 + fragment_size: 900 + ack_timeout_ms: 2000 +data: data +``` -# клиент -./olcrtc -mode cnc -carrier telemost -transport seichannel \ - -id -client-id -key -link direct -data data \ - -socks-host 127.0.0.1 -socks-port 1080 \ - -fps 60 -batch 64 -frag 900 -ack-ms 2000 +```yaml +# client.yaml +mode: cnc +link: direct +auth: + provider: telemost +room: + id: "" +crypto: + key: "" +net: + transport: seichannel + dns: "1.1.1.1:53" +socks: + host: "127.0.0.1" + port: 8808 +sei: + fps: 60 + batch_size: 64 + fragment_size: 900 + ack_timeout_ms: 2000 +data: data ``` ### telemost + videochannel (крайний случай) -```sh -# сервер -./olcrtc -mode srv -carrier telemost -transport videochannel \ - -id -client-id -key -link direct -data data \ - -video-codec qrcode -video-w 1080 -video-h 1080 \ - -video-fps 60 -video-bitrate 5000k -video-hw none +```yaml +# server.yaml +mode: srv +link: direct +auth: + provider: telemost +room: + id: "" +crypto: + key: "" +net: + transport: videochannel + dns: "1.1.1.1:53" +video: + codec: qrcode + width: 1080 + height: 1080 + fps: 60 + bitrate: "5000k" + hw: none +data: data +``` -# клиент -./olcrtc -mode cnc -carrier telemost -transport videochannel \ - -id -client-id -key -link direct -data data \ - -socks-host 127.0.0.1 -socks-port 1080 \ - -video-codec qrcode -video-w 1080 -video-h 1080 \ - -video-fps 60 -video-bitrate 5000k -video-hw none +```yaml +# client.yaml +mode: cnc +link: direct +auth: + provider: telemost +room: + id: "" +crypto: + key: "" +net: + transport: videochannel + dns: "1.1.1.1:53" +socks: + host: "127.0.0.1" + port: 8808 +video: + codec: qrcode + width: 1080 + height: 1080 + fps: 60 + bitrate: "5000k" + hw: none +data: data ``` --- diff --git a/docs/sub.md b/docs/sub.md index d9eb4e9..4217803 100644 --- a/docs/sub.md +++ b/docs/sub.md @@ -92,8 +92,8 @@ olcrtc://... Каждая строка сервера содержит один `olcrtc`-URI в формате из [uri.md](uri.md): ```text -olcrtc://?@#%$ -olcrtc://?@#%$ +olcrtc://?@#$ +olcrtc://?@#$ ``` Одна строка = один сервер/одна запись подписки. @@ -141,7 +141,7 @@ olcrtc://?@#%@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$RU / olcng free sub / IPv6 +olcrtc://wbstream?seichannel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799$RU / olcng free sub / IPv6 ##name: RU-1 ##icon: 🇷🇺 ##color: #4A90E2 @@ -150,7 +150,7 @@ olcrtc://wbstream?seichannel@room-01#d823f ##ip: 203.0.113.10 ##comment: basic free node -olcrtc://wbstream?datachannel@abc123xyz#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%android-01$DE / backup / IPv4 +olcrtc://wbstream?datachannel@abc123xyz#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$DE / backup / IPv4 ##name: DE-Backup ##icon: 🇩🇪 ##color: #2EBD85 diff --git a/docs/uri.md b/docs/uri.md index 5f02c3d..9544c44 100644 --- a/docs/uri.md +++ b/docs/uri.md @@ -12,15 +12,15 @@ Этот документ описывает **соглашение для разработчиков клиентских приложений**, которым нужен компактный способ передавать параметры подключения `olcrtc`. -Текущий `olcrtc` не парсит такой URI автоматически. Если клиентское приложение хочет использовать эту запись, оно должно само разобрать строку и передать полученные поля в свои вызовы `olcrtc`. +Текущий `olcrtc` не парсит такой URI автоматически. Если клиентское приложение хочет использовать эту запись, оно должно само разобрать строку и передать полученные поля в YAML конфиг `olcrtc`. --- ## Формат ```text -olcrtc://?@#%$ -olcrtc://?@#%$ +olcrtc://?@#$ +olcrtc://?@#$ ``` Все поля после `olcrtc://` считаются частью клиентского соглашения. @@ -35,10 +35,9 @@ olcrtc://?@#%` | Имя auth-провайдера, например `telemost`, `jazz`, `wbstream` | | `` | Имя транспорта, например `datachannel`, `vp8channel`, `seichannel`, `videochannel` | -| payload | Параметры транспорта в ``. Ключи совпадают с CLI-флагами без дефиса. Блок опускается если используются defaults | +| payload | Параметры транспорта в ``. Ключи совпадают с YAML полями. Блок опускается если используются defaults | | `` | Идентификатор комнаты или auth-specific room URL/ID | | `` | Ключ шифрования в hex, обычно 64 символа (`32` байта) | -| `` | Идентификатор клиента. Должен совпадать с ожидаемым значением на сервере. Один client-id может держать бесконечное количество соединений, но SFU ограничивает полосу на участника — оптимально 1 client-id = 1 пользователь (не обязательно) | | `` | Свободный комментарий для UI/метаданных, например `RU / olc free sub / IPv6` | --- @@ -51,50 +50,49 @@ Payload не используется. ### vp8channel -| Ключ | CLI-флаг | Описание | -|------|----------|----------| -| `vp8-fps` | `-vp8-fps` | FPS VP8 потока | -| `vp8-batch` | `-vp8-batch` | Кадров за тик | +| Ключ | YAML поле | Описание | +|------|-----------|----------| +| `vp8-fps` | `vp8.fps` | FPS VP8 потока | +| `vp8-batch` | `vp8.batch_size` | Кадров за тик | ### seichannel -| Ключ | CLI-флаг | Описание | -|------|----------|----------| -| `fps` | `-fps` | FPS H264 потока | -| `batch` | `-batch` | Кадров за тик | -| `frag` | `-frag` | Размер фрагмента в байтах | -| `ack-ms` | `-ack-ms` | Таймаут ACK в миллисекундах | +| Ключ | YAML поле | Описание | +|------|-----------|----------| +| `fps` | `sei.fps` | FPS H264 потока | +| `batch` | `sei.batch_size` | Кадров за тик | +| `frag` | `sei.fragment_size` | Размер фрагмента в байтах | +| `ack-ms` | `sei.ack_timeout_ms` | Таймаут ACK в миллисекундах | ### videochannel -| Ключ | CLI-флаг | Описание | -|------|----------|----------| -| `video-w` | `-video-w` | Ширина в пикселях | -| `video-h` | `-video-h` | Высота в пикселях | -| `video-fps` | `-video-fps` | FPS | -| `video-bitrate` | `-video-bitrate` | Битрейт, например `5000k` или `2M` | -| `video-hw` | `-video-hw` | Аппаратное ускорение: `none` или `nvenc` | -| `video-codec` | `-video-codec` | `qrcode` или `tile` | -| `video-qr-size` | `-video-qr-size` | Размер фрагмента QR в байтах | -| `video-qr-recovery` | `-video-qr-recovery` | Коррекция ошибок: `low` / `medium` / `high` / `highest` | -| `video-tile-module` | `-video-tile-module` | Размер тайла в пикселях 1..270 (только `tile`) | -| `video-tile-rs` | `-video-tile-rs` | Reed-Solomon паритет % 0..200 (только `tile`) | +| Ключ | YAML поле | Описание | +|------|-----------|----------| +| `video-w` | `video.width` | Ширина в пикселях | +| `video-h` | `video.height` | Высота в пикселях | +| `video-fps` | `video.fps` | FPS | +| `video-bitrate` | `video.bitrate` | Битрейт, например `5000k` или `2M` | +| `video-hw` | `video.hw` | Аппаратное ускорение: `none` или `nvenc` | +| `video-codec` | `video.codec` | `qrcode` или `tile` | +| `video-qr-size` | `video.qr_size` | Размер фрагмента QR в байтах | +| `video-qr-recovery` | `video.qr_recovery` | Коррекция ошибок: `low` / `medium` / `high` / `highest` | +| `video-tile-module` | `video.tile_module` | Размер тайла в пикселях 1..270 (только `tile`) | +| `video-tile-rs` | `video.tile_rs` | Reed-Solomon паритет % 0..200 (только `tile`) | --- -## Соответствие параметрам olcrtc +## Соответствие YAML полям olcrtc -| URI поле | Параметр / значение | -|----------|---------------------| -| `` | `-auth` | -| `` | `-transport` | -| payload | соответствующие флаги транспорта | -| `` | `-id` | -| `` | `-key` | -| `` | `-client-id` | +| URI поле | YAML поле | +|----------|-----------| +| `` | `auth.provider` | +| `` | `net.transport` | +| payload | соответствующие YAML поля транспорта | +| `` | `room.id` | +| `` | `crypto.key` | | `` | В `olcrtc` не передаётся. Это только клиентский комментарий | -`-link direct` и `-data data` в этом формате не кодируются, потому что для текущих сценариев они фиксированные. +`link: direct` и `data: data` в этом формате не кодируются, потому что для текущих сценариев они фиксированные. --- @@ -107,7 +105,6 @@ Payload не используется. | `<...>` | payload параметров транспорта | | `@` | `` | | `#` | `` | -| `%` | `` | | `$` | `` | Рекомендуется не использовать эти символы внутри самих полей. Если клиенту это нужно, он должен ввести собственное escaping/percent-encoding правило и применять его симметрично при кодировании и декодировании. @@ -119,82 +116,106 @@ Payload не используется. ### wbstream + datachannel (рекомендуется) ```text -olcrtc://wbstream?datachannel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$RU / olc free sub / IPv6 +olcrtc://wbstream?datachannel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799$RU / olc free sub / IPv6 ``` Payload не нужен - datachannel параметров не имеет. -### Эквивалент CLI +### Эквивалент YAML -```sh -./olcrtc -mode cnc \ - -auth wbstream \ - -transport datachannel \ - -id room-01 \ - -client-id android-01 \ - -key d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799 \ - -link direct \ - -data data +```yaml +mode: cnc +link: direct +auth: + provider: wbstream +room: + id: "room-01" +crypto: + key: "d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799" +net: + transport: datachannel +data: data ``` ### wbstream + vp8channel ```text -olcrtc://wbstream?vp8channel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$RU / olc free sub / IPv6 +olcrtc://wbstream?vp8channel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799$RU / olc free sub / IPv6 ``` -### Эквивалент CLI +### Эквивалент YAML -```sh -./olcrtc -mode cnc \ - -auth wbstream \ - -transport vp8channel \ - -id room-01 \ - -client-id android-01 \ - -key d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799 \ - -link direct \ - -data data \ - -vp8-fps 60 -vp8-batch 64 +```yaml +mode: cnc +link: direct +auth: + provider: wbstream +room: + id: "room-01" +crypto: + key: "d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799" +net: + transport: vp8channel +vp8: + fps: 60 + batch_size: 64 +data: data ``` ### jazz + seichannel ```text -olcrtc://jazz?seichannel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$DE / olc free sub +olcrtc://jazz?seichannel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799$DE / olc free sub ``` -### Эквивалент CLI +### Эквивалент YAML -```sh -./olcrtc -mode cnc \ - -auth jazz \ - -transport seichannel \ - -id room-01 \ - -client-id android-01 \ - -key d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799 \ - -link direct \ - -data data \ - -fps 60 -batch 64 -frag 900 -ack-ms 2000 +```yaml +mode: cnc +link: direct +auth: + provider: jazz +room: + id: "room-01" +crypto: + key: "d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799" +net: + transport: seichannel +sei: + fps: 60 + batch_size: 64 + fragment_size: 900 + ack_timeout_ms: 2000 +data: data ``` ### telemost + videochannel ```text -olcrtc://telemost?videochannel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$MIMO +olcrtc://telemost?videochannel@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799$MIMO ``` -### Эквивалент CLI +### Эквивалент YAML -```sh -./olcrtc -mode cnc \ - -auth telemost \ - -transport videochannel \ - -id room-01 \ - -client-id android-01 \ - -key d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799 \ - -link direct \ - -data data \ - -video-w 1080 -video-h 1080 -video-fps 60 -video-bitrate 5000k -video-hw none -video-codec qrcode +```yaml +mode: cnc +link: direct +auth: + provider: telemost +room: + id: "room-01" +crypto: + key: "d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799" +net: + transport: videochannel +video: + width: 1080 + height: 1080 + fps: 60 + bitrate: "5000k" + hw: none + codec: qrcode +data: data ``` --- diff --git a/readme.md b/readme.md index 10c72a1..81b6890 100644 --- a/readme.md +++ b/readme.md @@ -1,11 +1,3 @@ -# НЕ НОЙТЕ ЧТО ВБ НЕ РАБОТАЕТ! ОНИ ОТКЛЮЧИЛИ АВТО СОЗДАНИЕ РУМ И ПОДКЛЮЧЕНИЕ ГОСТЕЙ К ЗВОНКАМ, СПАМЬТЕ ИМ НА ПОЧТУ ПОДДЕРЖКИ ЧТОБЫ ВЕРНУЛИ, ЕСЛИ В ТЕЧЕНИИ 3 ДНЕЙ ОНИ НЕ ВЕРНУТ ГОСТЕЙ ТО ПОДДЕРЖКА WMS БУДЕТ ВЫПЕЛЕНА - -# !!!ВСЕМ РАЗРАБАМ OLCRTC КЛЕНТОВ И ПАНЕЛЕЙ!!! - -## через +- неделю будем смержена ветка с серьезными изменениями ломающими всю совместимость, посмотреть изменения можно здесь (https://github.com/openlibrecommunity/olcrtc/tree/refactor/universal-carrier) , советую пеерчитать доку / кинуть ее в ии и на основе этого обновить панели, тоесть создать ветку с поддержкой новой версии, проверить что все работает, и ждать как ветка refactor/universal-carrier станет master. получается у вас есть неделя чтобы обновить клиенты - - -
@@ -35,6 +27,8 @@ Community ui client: [alananisimov/olcbox](https://github.com/alananisimov/olcbo ## Read docs for start +[Configuration](docs/configuration.md) + [For noobs](docs/fast.md) [Manual](docs/manual.md) diff --git a/script/cnc.sh b/script/cnc.sh index bd60792..9d9eed4 100755 --- a/script/cnc.sh +++ b/script/cnc.sh @@ -120,10 +120,6 @@ if [ -z "$ROOM_ID" ]; then exit 1 fi -echo "" -read -p "Enter Client ID [default: default]: " CLIENT_ID_INPUT -CLIENT_ID=${CLIENT_ID_INPUT:-default} - echo "" read -p "Enter Encryption Key (hex): " KEY @@ -155,13 +151,19 @@ echo "" read -p "SOCKS5 username (leave empty to disable auth): " SOCKS_USER_INPUT SOCKS_USER=${SOCKS_USER_INPUT:-} +SOCKS_PASS="" if [ -n "$SOCKS_USER" ]; then read -s -p "SOCKS5 password: " SOCKS_PASS_INPUT echo "" SOCKS_PASS=${SOCKS_PASS_INPUT:-} fi -TRANSPORT_ARGS=() +# Transport-specific settings +VIDEO_W=1920; VIDEO_H=1080; VIDEO_FPS=30; VIDEO_BITRATE="2M"; VIDEO_HW="none" +VIDEO_CODEC="qrcode"; VIDEO_QR_SIZE=0; VIDEO_QR_RECOVERY="low" +VIDEO_TILE_MODULE=4; VIDEO_TILE_RS=20 +VP8_FPS=25; VP8_BATCH=1 +SEI_FPS=20; SEI_BATCH=1; SEI_FRAG=900; SEI_ACK=3000 if [ "$TRANSPORT" = "videochannel" ]; then echo "" @@ -185,8 +187,6 @@ if [ "$TRANSPORT" = "videochannel" ]; then read -p "Tile Reed-Solomon parity percent 0..200 [default: 20]: " VTILE_RS_INPUT VIDEO_TILE_RS=${VTILE_RS_INPUT:-20} - - TRANSPORT_ARGS+=(-video-tile-module "$VIDEO_TILE_MODULE" -video-tile-rs "$VIDEO_TILE_RS") ;; *) VIDEO_CODEC="qrcode" @@ -202,11 +202,6 @@ if [ "$TRANSPORT" = "videochannel" ]; then read -p "QR fragment size bytes [default: 0 (auto)]: " VQRSZ_INPUT VIDEO_QR_SIZE=${VQRSZ_INPUT:-0} - - if [ "$VIDEO_QR_SIZE" -gt 0 ]; then - TRANSPORT_ARGS+=(-video-qr-size "$VIDEO_QR_SIZE") - fi - TRANSPORT_ARGS+=(-video-qr-recovery "$VIDEO_QR_RECOVERY") ;; esac @@ -218,9 +213,6 @@ if [ "$TRANSPORT" = "videochannel" ]; then read -p "Hardware acceleration (none/nvenc) [default: none]: " VHW_INPUT VIDEO_HW=${VHW_INPUT:-none} - - TRANSPORT_ARGS+=(-video-w "$VIDEO_W" -video-h "$VIDEO_H" -video-fps "$VIDEO_FPS" \ - -video-bitrate "$VIDEO_BITRATE" -video-hw "$VIDEO_HW" -video-codec "$VIDEO_CODEC") fi if [ "$TRANSPORT" = "vp8channel" ]; then @@ -232,8 +224,6 @@ if [ "$TRANSPORT" = "vp8channel" ]; then read -p "VP8 batch size (frames per tick) [default: 1]: " VP8BATCH_INPUT VP8_BATCH=${VP8BATCH_INPUT:-1} - - TRANSPORT_ARGS+=(-vp8-fps "$VP8_FPS" -vp8-batch "$VP8_BATCH") fi if [ "$TRANSPORT" = "seichannel" ]; then @@ -251,8 +241,6 @@ if [ "$TRANSPORT" = "seichannel" ]; then read -p "SEI ACK timeout in milliseconds [default: 3000]: " SEIACK_INPUT SEI_ACK=${SEIACK_INPUT:-3000} - - TRANSPORT_ARGS+=(-fps "$SEI_FPS" -batch "$SEI_BATCH" -frag "$SEI_FRAG" -ack-ms "$SEI_ACK") fi echo "" @@ -279,11 +267,71 @@ if [ ! -f "$WORK_DIR/olcrtc" ]; then exit 1 fi -AUTH_ARGS=() +# Generate YAML config +CONFIG_FILE="$WORK_DIR/client.yaml" +cat > "$CONFIG_FILE" <> "$CONFIG_FILE" <> "$CONFIG_FILE" <> "$CONFIG_FILE" <> "$CONFIG_FILE" <> "$CONFIG_FILE" </dev/null 2>&1; then - od -An -N32 -tx1 /dev/urandom | tr -d ' \n' - else - hexdump -n 32 -e '32/1 "%02x"' /dev/urandom - fi -} - if [ "${1:-}" = "olcrtc" ]; then shift fi @@ -37,7 +22,6 @@ link="${OLCRTC_LINK:-direct}" data_dir="${OLCRTC_DATA_DIR:-/usr/share/olcrtc}" dns_server="${OLCRTC_DNS:-1.1.1.1:53}" key="${OLCRTC_KEY:-}" -client_id="${OLCRTC_CLIENT_ID:-}" key_file="${OLCRTC_KEY_FILE:-/var/lib/olcrtc/key.hex}" socks_proxy="${OLCRTC_SOCKS_PROXY:-}" socks_proxy_port="${OLCRTC_SOCKS_PROXY_PORT:-1080}" @@ -56,18 +40,44 @@ video_tile_rs="${OLCRTC_VIDEO_TILE_RS:-0}" vp8_fps="${OLCRTC_VP8_FPS:-0}" vp8_batch="${OLCRTC_VP8_BATCH:-0}" +sei_fps="${OLCRTC_SEI_FPS:-0}" +sei_batch="${OLCRTC_SEI_BATCH:-0}" +sei_frag="${OLCRTC_SEI_FRAG:-0}" +sei_ack="${OLCRTC_SEI_ACK:-0}" + +debug="${OLCRTC_DEBUG:-false}" + [ "$mode" = "srv" ] || die "server image defaults to OLCRTC_MODE=srv; got '$mode'" [ -n "$carrier" ] || die "set OLCRTC_CARRIER (e.g. telemost, jazz, wbstream)" [ -n "$transport" ] || die "set OLCRTC_TRANSPORT (e.g. datachannel, videochannel, seichannel, vp8channel)" -[ -n "$client_id" ] || die "set OLCRTC_CLIENT_ID to bind the expected client" + +make_key() { + if command -v od >/dev/null 2>&1; then + od -An -N32 -tx1 /dev/urandom | tr -d ' \n' + else + hexdump -n 32 -e '32/1 "%02x"' /dev/urandom + fi +} if [ -z "$room_id" ]; then case "$carrier" in jazz) - echo "olcrtc-entrypoint: OLCRTC_ROOM_ID not set, generating room via -mode gen..." >&2 - room_id=$(/usr/local/bin/olcrtc -mode gen -carrier "$carrier" -dns "$dns_server" -amount 1 -data "$data_dir") + echo "olcrtc-entrypoint: OLCRTC_ROOM_ID not set, generating room..." >&2 + gen_config="/tmp/olcrtc-gen.yaml" + cat > "$gen_config" <&2 + rm -f "$gen_config" ;; *) die "set OLCRTC_ROOM_ID to the room identifier" @@ -95,42 +105,69 @@ esac [ "${#key}" -eq 64 ] || die "OLCRTC_KEY must be 64 hex characters" -set -- /usr/local/bin/olcrtc \ - -mode "$mode" \ - -carrier "$carrier" \ - -id "$room_id" \ - -client-id "$client_id" \ - -key "$key" \ - -link "$link" \ - -transport "$transport" \ - -data "$data_dir" \ - -dns "$dns_server" +# Generate YAML config +config="/tmp/olcrtc-server.yaml" +cat > "$config" <> "$config" <> "$config" <> "$config" + [ "$video_qr_size" -gt 0 ] 2>/dev/null && printf ' qr_size: %s\n' "$video_qr_size" >> "$config" + [ "$video_tile_module" -gt 0 ] 2>/dev/null && printf ' tile_module: %s\n' "$video_tile_module" >> "$config" + [ "$video_tile_rs" -gt 0 ] 2>/dev/null && printf ' tile_rs: %s\n' "$video_tile_rs" >> "$config" fi if [ "$transport" = "vp8channel" ]; then - set -- "$@" -vp8-fps "$vp8_fps" -vp8-batch "$vp8_batch" + cat >> "$config" <> "$config" <> "$config" + ;; +esac + +exec /usr/local/bin/olcrtc "$config" diff --git a/script/srv.sh b/script/srv.sh index 3403108..bc15f7b 100755 --- a/script/srv.sh +++ b/script/srv.sh @@ -139,10 +139,6 @@ else fi fi -echo "" -read -p "Enter Client ID [default: default]: " CLIENT_ID_INPUT -CLIENT_ID=${CLIENT_ID_INPUT:-default} - echo "" read -p "DNS server [default: 8.8.8.8:53]: " DNS_INPUT DNS=${DNS_INPUT:-8.8.8.8:53} @@ -150,7 +146,8 @@ DNS=${DNS_INPUT:-8.8.8.8:53} echo "" read -p "Use SOCKS5 proxy for egress? (y/N): " USE_PROXY -EXTRA_ARGS=() +SOCKS_PROXY_ADDR="" +SOCKS_PROXY_PORT=0 if [[ "$USE_PROXY" =~ ^[Yy]$ ]]; then read -p "Enter SOCKS5 proxy address [default: 127.0.0.1]: " PROXY_ADDR_INPUT @@ -160,10 +157,14 @@ if [[ "$USE_PROXY" =~ ^[Yy]$ ]]; then SOCKS_PROXY_PORT=${PROXY_PORT_INPUT:-1080} echo "[*] Will use SOCKS5 proxy: $SOCKS_PROXY_ADDR:$SOCKS_PROXY_PORT" - EXTRA_ARGS+=(-socks-proxy "$SOCKS_PROXY_ADDR" -socks-proxy-port "$SOCKS_PROXY_PORT") fi -TRANSPORT_ARGS=() +# Transport-specific settings +VIDEO_W=1920; VIDEO_H=1080; VIDEO_FPS=30; VIDEO_BITRATE="2M"; VIDEO_HW="none" +VIDEO_CODEC="qrcode"; VIDEO_QR_SIZE=0; VIDEO_QR_RECOVERY="low" +VIDEO_TILE_MODULE=4; VIDEO_TILE_RS=20 +VP8_FPS=25; VP8_BATCH=1 +SEI_FPS=20; SEI_BATCH=1; SEI_FRAG=900; SEI_ACK=3000 if [ "$TRANSPORT" = "videochannel" ]; then echo "" @@ -187,8 +188,6 @@ if [ "$TRANSPORT" = "videochannel" ]; then read -p "Tile Reed-Solomon parity percent 0..200 [default: 20]: " VTILE_RS_INPUT VIDEO_TILE_RS=${VTILE_RS_INPUT:-20} - - TRANSPORT_ARGS+=(-video-tile-module "$VIDEO_TILE_MODULE" -video-tile-rs "$VIDEO_TILE_RS") ;; *) VIDEO_CODEC="qrcode" @@ -204,11 +203,6 @@ if [ "$TRANSPORT" = "videochannel" ]; then read -p "QR fragment size bytes [default: 0 (auto)]: " VQRSZ_INPUT VIDEO_QR_SIZE=${VQRSZ_INPUT:-0} - - if [ "$VIDEO_QR_SIZE" -gt 0 ]; then - TRANSPORT_ARGS+=(-video-qr-size "$VIDEO_QR_SIZE") - fi - TRANSPORT_ARGS+=(-video-qr-recovery "$VIDEO_QR_RECOVERY") ;; esac @@ -220,9 +214,6 @@ if [ "$TRANSPORT" = "videochannel" ]; then read -p "Hardware acceleration (none/nvenc) [default: none]: " VHW_INPUT VIDEO_HW=${VHW_INPUT:-none} - - TRANSPORT_ARGS+=(-video-w "$VIDEO_W" -video-h "$VIDEO_H" -video-fps "$VIDEO_FPS" \ - -video-bitrate "$VIDEO_BITRATE" -video-hw "$VIDEO_HW" -video-codec "$VIDEO_CODEC") fi if [ "$TRANSPORT" = "vp8channel" ]; then @@ -234,8 +225,6 @@ if [ "$TRANSPORT" = "vp8channel" ]; then read -p "VP8 batch size (frames per tick) [default: 1]: " VP8BATCH_INPUT VP8_BATCH=${VP8BATCH_INPUT:-1} - - TRANSPORT_ARGS+=(-vp8-fps "$VP8_FPS" -vp8-batch "$VP8_BATCH") fi if [ "$TRANSPORT" = "seichannel" ]; then @@ -253,8 +242,6 @@ if [ "$TRANSPORT" = "seichannel" ]; then read -p "SEI ACK timeout in milliseconds [default: 3000]: " SEIACK_INPUT SEI_ACK=${SEIACK_INPUT:-3000} - - TRANSPORT_ARGS+=(-fps "$SEI_FPS" -batch "$SEI_BATCH" -frag "$SEI_FRAG" -ack-ms "$SEI_ACK") fi echo "" @@ -303,13 +290,24 @@ if [ ! -f "$WORK_DIR/olcrtc" ]; then fi if [ "$GEN_ROOM" = "1" ]; then - echo "[*] Generating room via -mode gen..." + echo "[*] Generating room via mode: gen..." + GEN_CONFIG="$WORK_DIR/gen.yaml" + cat > "$GEN_CONFIG" < "$CONFIG_FILE" <> "$CONFIG_FILE" <> "$CONFIG_FILE" <> "$CONFIG_FILE" <> "$CONFIG_FILE" <> "$CONFIG_FILE" <