doc: add YAML configuration support

This commit is contained in:
zarazaex69
2026-05-13 23:10:23 +03:00
parent 1e8f378844
commit 25d0e98698
13 changed files with 794 additions and 544 deletions

View File

@@ -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=<name>` (сменить ветку), `--no-cache` (очистить Go-кеш перед сборкой) |
| `srv.sh` | Интерактивный скрипт запуска сервера через Podman. Задаёт вопросы про carrier/transport/room/key, генерирует YAML конфиг, собирает образ, запускает контейнер. Флаги: `--branch=<name>` (сменить ветку), `--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://<Carrier>?<Transport>@<RoomID>#<Key>%<ClientID>$<MIMO>` |
| `settings.md` | Матрица совместимости carrier×transport, описание всех YAML полей, готовые примеры конфигов |
| `uri.md` | URI формат для клиентских приложений: `olcrtc://<Carrier>?<Transport>@<RoomID>#<Key>$<MIMO>` |
| `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 <<EOF
mode: srv
link: direct
auth:
provider: wbstream
room:
id: "ROOM_ID_HERE"
crypto:
key: "REPLACE_WITH_64_HEX"
net:
transport: datachannel
dns: "1.1.1.1:53"
data: data
EOF
# сервер
./olcrtc -mode srv -carrier wbstream -transport datachannel \
-id ROOM_ID -client-id default -key HEX_KEY \
-link direct -dns 1.1.1.1:53 -data data
# запустить сервер
./olcrtc server.yaml
# клиент
./olcrtc -mode cnc -carrier wbstream -transport datachannel \
-id ROOM_ID -client-id default -key HEX_KEY \
-link direct -dns 1.1.1.1:53 -data data \
-socks-host 127.0.0.1 -socks-port 8808
# конфиг клиента
cat > client.yaml <<EOF
mode: cnc
link: direct
auth:
provider: wbstream
room:
id: "ROOM_ID_HERE"
crypto:
key: "REPLACE_WITH_64_HEX"
net:
transport: datachannel
dns: "1.1.1.1:53"
socks:
host: "127.0.0.1"
port: 8808
data: data
EOF
# запустить клиент
./olcrtc client.yaml
```
### Docker
```sh
docker run -e OLCRTC_CARRIER=wbstream \
-e OLCRTC_ROOM_ID=... \
-e OLCRTC_KEY=... \
olcrtc/server:local
# Mount your YAML config into the container:
docker run -v ./server.yaml:/etc/olcrtc/server.yaml \
olcrtc/server:local /etc/olcrtc/server.yaml
```
---
## 14. CLI - все флаги
## 14. YAML конфигурация
### Обязательные (для всех режимов)
olcrtc читает конфигурацию из единственного YAML-файла. CLI-флагов нет.
| Флаг | Описание |
```sh
olcrtc config.yaml
```
Полная схема описана в [configuration.md](configuration.md). Примеры:
- [server.example.yaml](server.example.yaml)
- [client.example.yaml](client.example.yaml)
### Основные поля
| YAML путь | Описание |
|---|---|
| `-mode` | `srv` - сервер, `cnc` - клиент, `gen` - генерация Room ID |
| `-carrier` | `telemost`, `jazz`, `wbstream` |
| `-transport` | `datachannel`, `vp8channel`, `seichannel`, `videochannel` |
| `-id` | Room ID |
| `-client-id` | Идентификатор клиента, должен совпадать на srv и cnc. Один client-id может держать бесконечное количество соединений, но SFU ограничивает полосу на участника — оптимально 1 client-id = 1 пользователь (не обязательно) |
| `-key` | Ключ шифрования hex 64 символа |
| `-link` | Всегда `direct` |
| `-data` | Всегда `data` |
| `-dns` | DNS сервер, например `1.1.1.1:53` |
| `mode` | `srv` - сервер, `cnc` - клиент, `gen` - генерация Room ID |
| `link` | Всегда `direct` |
| `auth.provider` | `telemost`, `jazz`, `wbstream` или `none` |
| `room.id` | Room ID |
| `crypto.key` | Ключ шифрования hex 64 символа |
| `net.transport` | `datachannel`, `vp8channel`, `seichannel`, `videochannel` |
| `net.dns` | DNS сервер, например `1.1.1.1:53` |
| `data` | Путь к директории данных |
| `debug` | Verbose логи |
### Необязательные
### Только клиент (`mode: cnc`)
| Флаг | Описание |
| YAML путь | Описание |
|---|---|
| `-debug` | Verbose логи |
| `socks.host` | Адрес SOCKS5 (по умолчанию `127.0.0.1`) |
| `socks.port` | Порт SOCKS5 (по умолчанию `8808`) |
| `socks.user` | Логин (опционально) |
| `socks.pass` | Пароль (опционально) |
### Только для клиента (`-mode cnc`)
### Только сервер (`mode: srv`)
| Флаг | По умолчанию | Описание |
|---|---|---|
| `-socks-host` | `127.0.0.1` | Адрес SOCKS5 |
| `-socks-port` | `1080` | Порт SOCKS5 |
| `-socks-user` | - | Логин (опционально) |
| `-socks-pass` | - | Пароль (опционально) |
### Только для сервера (`-mode srv`)
| Флаг | Описание |
| YAML путь | Описание |
|---|---|
| `-socks-proxy` | Адрес SOCKS5 прокси для исходящего трафика |
| `-socks-proxy-port` | Порт этого прокси |
| `socks.proxy_addr` | Адрес SOCKS5 прокси для исходящего трафика |
| `socks.proxy_port` | Порт этого прокси |
### Режим генерации (`-mode gen`)
### Генерация (`mode: gen`)
| Флаг | Описание |
| YAML путь | Описание |
|---|---|
| `-amount` | Количество комнат для генерации |
| `gen.amount` | Количество комнат для генерации |
### vp8channel
### Транспорты
| Флаг | Default | Описание |
|---|---|---|
| `-vp8-fps` | 25 | FPS VP8 потока |
| `-vp8-batch` | 1 | Кадров за тик |
### seichannel
| Флаг | Default | Описание |
|---|---|---|
| `-fps` | 20 | FPS H264 потока |
| `-batch` | 1 | Кадров за тик |
| `-frag` | 900 | Размер фрагмента в байтах |
| `-ack-ms` | 2000 | ACK timeout в мс |
### videochannel
| Флаг | Default | Описание |
|---|---|---|
| `-video-codec` | `qrcode` | `qrcode` или `tile` |
| `-video-w` | 1920 | Ширина |
| `-video-h` | 1080 | Высота |
| `-video-fps` | 30 | FPS |
| `-video-bitrate` | `2M` | Битрейт |
| `-video-hw` | `none` | `none` или `nvenc` |
| `-video-qr-recovery` | `low` | ECC: `low`/`medium`/`high`/`highest` |
| `-video-qr-size` | 0 (авто) | Размер фрагмента QR в байтах |
| `-video-tile-module` | 4 | Размер тайла в пикселях 1..270 |
| `-video-tile-rs` | 20 | Reed-Solomon паритет % 0..200 |
Настройки транспортов задаются в секциях `vp8`, `sei`, `video` YAML конфига. Подробнее в [configuration.md](configuration.md).
---
@@ -692,16 +695,16 @@ docker run -e OLCRTC_CARRIER=wbstream \
Соглашение для клиентских приложений. Сам `olcrtc` не парсит - используется в сторонних клиентах.
```
olcrtc://<Carrier>?<Transport><payload>@<RoomID>#<Key>%<ClientID>$<MIMO>
olcrtc://<Carrier>?<Transport><payload>@<RoomID>#<Key>$<MIMO>
```
Где `<payload>` - опциональный блок `<key=value&...>` с параметрами транспорта.
**Примеры:**
```
olcrtc://wbstream?datachannel@room-01#d823fa...%android-01$RU / olc free sub
olcrtc://wbstream?vp8channel<vp8-fps=60&vp8-batch=64>@room-01#d823fa...%android-01$RU
olcrtc://telemost?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@room-01#d823fa...%client$RU
olcrtc://wbstream?datachannel@room-01#d823fa...$RU / olc free sub
olcrtc://wbstream?vp8channel<vp8-fps=60&vp8-batch=64>@room-01#d823fa...$RU
olcrtc://telemost?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@room-01#d823fa...$RU
```
### Формат подписки (sub.md)
@@ -714,7 +717,7 @@ olcrtc://telemost?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@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 - он корректно логирует ошибки и продолжает работу. Соединения к незаблокированным адресам проходят без проблем. Проблема на стороне хостинга или фаервола.

View File

@@ -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

View File

@@ -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` |

View File

@@ -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)

View File

@@ -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="<room-id-со-stream.wb.ru>"
Создай YAML конфиг:
```yaml
# server.yaml
mode: srv
link: direct
auth:
provider: wbstream
room:
id: "<room-id-со-stream.wb.ru>"
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: "<room-id>"
crypto:
key: "<hex-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 <hex-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 <hex-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: "<room-id>"
crypto:
key: "<hex-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)

View File

@@ -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

View File

@@ -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="<room-id-со-stream.wb.ru>"
# сервер
./olcrtc -mode srv -carrier wbstream -transport datachannel \
-id "$ROOM_ID" -client-id <client-id> -key <hex-key> -link direct -data data -dns 1.1.1.1:53
# server.yaml
mode: srv
link: direct
auth:
provider: wbstream
room:
id: "<room-id-со-stream.wb.ru>"
crypto:
key: "<hex-key>"
net:
transport: datachannel
dns: "1.1.1.1:53"
data: data
```
# клиент
./olcrtc -mode cnc -carrier wbstream -transport datachannel \
-id "$ROOM_ID" -client-id <client-id> -key <hex-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: "<room-id-со-stream.wb.ru>"
crypto:
key: "<hex-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 <client-id> -key <hex-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: "<room-id>"
crypto:
key: "<hex-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 <room-id> -client-id <client-id> -key <hex-key> -link direct -data data \
-vp8-fps 60 -vp8-batch 64
```yaml
# server.yaml
mode: srv
link: direct
auth:
provider: telemost
room:
id: "<room-id>"
crypto:
key: "<hex-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 <room-id> -client-id <client-id> -key <hex-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: "<room-id>"
crypto:
key: "<hex-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 <room-id> -client-id <client-id> -key <hex-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: "<room-id>"
crypto:
key: "<hex-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 <room-id> -client-id <client-id> -key <hex-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: "<room-id>"
crypto:
key: "<hex-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 <room-id> -client-id <client-id> -key <hex-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: "<room-id>"
crypto:
key: "<hex-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 <room-id> -client-id <client-id> -key <hex-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: "<room-id>"
crypto:
key: "<hex-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
```
---

View File

@@ -92,8 +92,8 @@ olcrtc://...
Каждая строка сервера содержит один `olcrtc`-URI в формате из [uri.md](uri.md):
```text
olcrtc://<Auth>?<Transport>@<RoomID>#<EncryptionKey>%<ClientID>$<MIMO>
olcrtc://<Auth>?<Transport><key=value&key=value>@<RoomID>#<EncryptionKey>%<ClientID>$<MIMO>
olcrtc://<Auth>?<Transport>@<RoomID>#<EncryptionKey>$<MIMO>
olcrtc://<Auth>?<Transport><key=value&key=value>@<RoomID>#<EncryptionKey>$<MIMO>
```
Одна строка = один сервер/одна запись подписки.
@@ -141,7 +141,7 @@ olcrtc://<Auth>?<Transport><key=value&key=value>@<RoomID>#<EncryptionKey>%<Clien
#used: 10mb/10gb
#available: 9.99gb
olcrtc://wbstream?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$RU / olcng free sub / IPv6
olcrtc://wbstream?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799$RU / olcng free sub / IPv6
##name: RU-1
##icon: 🇷🇺
##color: #4A90E2
@@ -150,7 +150,7 @@ olcrtc://wbstream?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@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

View File

@@ -12,15 +12,15 @@
Этот документ описывает **соглашение для разработчиков клиентских приложений**, которым нужен компактный способ передавать параметры подключения `olcrtc`.
Текущий `olcrtc` не парсит такой URI автоматически. Если клиентское приложение хочет использовать эту запись, оно должно само разобрать строку и передать полученные поля в свои вызовы `olcrtc`.
Текущий `olcrtc` не парсит такой URI автоматически. Если клиентское приложение хочет использовать эту запись, оно должно само разобрать строку и передать полученные поля в YAML конфиг `olcrtc`.
---
## Формат
```text
olcrtc://<Auth>?<Transport>@<RoomID>#<EncryptionKey>%<ClientID>$<MIMO>
olcrtc://<Auth>?<Transport><key=value&key=value>@<RoomID>#<EncryptionKey>%<ClientID>$<MIMO>
olcrtc://<Auth>?<Transport>@<RoomID>#<EncryptionKey>$<MIMO>
olcrtc://<Auth>?<Transport><key=value&key=value>@<RoomID>#<EncryptionKey>$<MIMO>
```
Все поля после `olcrtc://` считаются частью клиентского соглашения.
@@ -35,10 +35,9 @@ olcrtc://<Auth>?<Transport><key=value&key=value>@<RoomID>#<EncryptionKey>%<Clien
|------|----------|
| `<Auth>` | Имя auth-провайдера, например `telemost`, `jazz`, `wbstream` |
| `<Transport>` | Имя транспорта, например `datachannel`, `vp8channel`, `seichannel`, `videochannel` |
| payload | Параметры транспорта в `<key=value&...>`. Ключи совпадают с CLI-флагами без дефиса. Блок опускается если используются defaults |
| payload | Параметры транспорта в `<key=value&...>`. Ключи совпадают с YAML полями. Блок опускается если используются defaults |
| `<RoomID>` | Идентификатор комнаты или auth-specific room URL/ID |
| `<EncryptionKey>` | Ключ шифрования в hex, обычно 64 символа (`32` байта) |
| `<ClientID>` | Идентификатор клиента. Должен совпадать с ожидаемым значением на сервере. Один client-id может держать бесконечное количество соединений, но SFU ограничивает полосу на участника — оптимально 1 client-id = 1 пользователь (не обязательно) |
| `<MIMO>` | Свободный комментарий для 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>` | `-auth` |
| `<Transport>` | `-transport` |
| payload | соответствующие флаги транспорта |
| `<RoomID>` | `-id` |
| `<EncryptionKey>` | `-key` |
| `<ClientID>` | `-client-id` |
| URI поле | YAML поле |
|----------|-----------|
| `<Auth>` | `auth.provider` |
| `<Transport>` | `net.transport` |
| payload | соответствующие YAML поля транспорта |
| `<RoomID>` | `room.id` |
| `<EncryptionKey>` | `crypto.key` |
| `<MIMO>` | В `olcrtc` не передаётся. Это только клиентский комментарий |
`-link direct` и `-data data` в этом формате не кодируются, потому что для текущих сценариев они фиксированные.
`link: direct` и `data: data` в этом формате не кодируются, потому что для текущих сценариев они фиксированные.
---
@@ -107,7 +105,6 @@ Payload не используется.
| `<...>` | payload параметров транспорта |
| `@` | `<RoomID>` |
| `#` | `<EncryptionKey>` |
| `%` | `<ClientID>` |
| `$` | `<MIMO>` |
Рекомендуется не использовать эти символы внутри самих полей. Если клиенту это нужно, он должен ввести собственное 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<vp8-fps=60&vp8-batch=64>@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$RU / olc free sub / IPv6
olcrtc://wbstream?vp8channel<vp8-fps=60&vp8-batch=64>@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<fps=60&batch=64&frag=900&ack-ms=2000>@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$DE / olc free sub
olcrtc://jazz?seichannel<fps=60&batch=64&frag=900&ack-ms=2000>@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<video-w=1080&video-h=1080&video-fps=60&video-bitrate=5000k&video-hw=none&video-codec=qrcode>@room-01#d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799%android-01$MIMO
olcrtc://telemost?videochannel<video-w=1080&video-h=1080&video-fps=60&video-bitrate=5000k&video-hw=none&video-codec=qrcode>@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
```
---

View File

@@ -1,11 +1,3 @@
# НЕ НОЙТЕ ЧТО ВБ НЕ РАБОТАЕТ! ОНИ ОТКЛЮЧИЛИ АВТО СОЗДАНИЕ РУМ И ПОДКЛЮЧЕНИЕ ГОСТЕЙ К ЗВОНКАМ, СПАМЬТЕ ИМ НА ПОЧТУ ПОДДЕРЖКИ ЧТОБЫ ВЕРНУЛИ, ЕСЛИ В ТЕЧЕНИИ 3 ДНЕЙ ОНИ НЕ ВЕРНУТ ГОСТЕЙ ТО ПОДДЕРЖКА WMS БУДЕТ ВЫПЕЛЕНА
# !!!ВСЕМ РАЗРАБАМ OLCRTC КЛЕНТОВ И ПАНЕЛЕЙ!!!
## через +- неделю будем смержена ветка с серьезными изменениями ломающими всю совместимость, посмотреть изменения можно здесь (https://github.com/openlibrecommunity/olcrtc/tree/refactor/universal-carrier) , советую пеерчитать доку / кинуть ее в ии и на основе этого обновить панели, тоесть создать ветку с поддержкой новой версии, проверить что все работает, и ждать как ветка refactor/universal-carrier станет master. получается у вас есть неделя чтобы обновить клиенты
<div align="center">
<img src="https://github.com/openlibrecommunity/material/blob/master/olcrtc.png" width="250" height="250">
@@ -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)

View File

@@ -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" <<EOF
mode: cnc
link: direct
auth:
provider: "$AUTH"
room:
id: "$ROOM_ID"
crypto:
key: "$KEY"
net:
transport: "$TRANSPORT"
dns: "$DNS"
socks:
host: "0.0.0.0"
port: $SOCKS_PORT
EOF
if [ -n "$SOCKS_USER" ]; then
AUTH_ARGS+=(-socks-user "$SOCKS_USER" -socks-pass "$SOCKS_PASS")
cat >> "$CONFIG_FILE" <<EOF
user: "$SOCKS_USER"
pass: "$SOCKS_PASS"
EOF
fi
if [ "$TRANSPORT" = "vp8channel" ]; then
cat >> "$CONFIG_FILE" <<EOF
vp8:
fps: $VP8_FPS
batch_size: $VP8_BATCH
EOF
fi
if [ "$TRANSPORT" = "seichannel" ]; then
cat >> "$CONFIG_FILE" <<EOF
sei:
fps: $SEI_FPS
batch_size: $SEI_BATCH
fragment_size: $SEI_FRAG
ack_timeout_ms: $SEI_ACK
EOF
fi
if [ "$TRANSPORT" = "videochannel" ]; then
cat >> "$CONFIG_FILE" <<EOF
video:
width: $VIDEO_W
height: $VIDEO_H
fps: $VIDEO_FPS
bitrate: "$VIDEO_BITRATE"
hw: $VIDEO_HW
codec: $VIDEO_CODEC
qr_size: $VIDEO_QR_SIZE
qr_recovery: $VIDEO_QR_RECOVERY
tile_module: $VIDEO_TILE_MODULE
tile_rs: $VIDEO_TILE_RS
EOF
fi
cat >> "$CONFIG_FILE" <<EOF
data: data
debug: false
EOF
echo "[*] Starting OlcRTC client..."
podman run -d \
--name $CONTAINER_NAME \
@@ -293,9 +341,7 @@ podman run -d \
-v $WORK_DIR:/app:Z \
-w /app \
$IMAGE_NAME \
./olcrtc -mode cnc -auth "$AUTH" -id "$ROOM_ID" -client-id "$CLIENT_ID" -key "$KEY" \
-link direct -transport "$TRANSPORT" -dns "$DNS" -data data \
-socks-host 0.0.0.0 -socks-port "$SOCKS_PORT" "${TRANSPORT_ARGS[@]}" "${AUTH_ARGS[@]}"
./olcrtc client.yaml
sleep 2
@@ -306,7 +352,6 @@ echo "Container name: $CONTAINER_NAME"
echo "Auth: $AUTH"
echo "Transport: $TRANSPORT"
echo "Room ID: $ROOM_ID"
echo "Client ID: $CLIENT_ID"
if [ -n "$SOCKS_USER" ]; then
echo "SOCKS5 proxy: $SOCKS_IP:$SOCKS_PORT (auth: $SOCKS_USER)"
else

View File

@@ -6,21 +6,6 @@ die() {
exit 1
}
bool_flag() {
case "${1:-}" in
1|true|TRUE|yes|YES|on|ON) return 0 ;;
*) return 1 ;;
esac
}
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 [ "${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" <<GENEOF
mode: gen
auth:
provider: "$carrier"
net:
dns: "$dns_server"
gen:
amount: 1
data: "$data_dir"
GENEOF
room_id=$(/usr/local/bin/olcrtc "$gen_config")
[ -n "$room_id" ] || die "room generation failed for carrier '$carrier'"
echo "olcrtc-entrypoint: generated room ID: $room_id" >&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" <<EOF
mode: $mode
link: $link
auth:
provider: "$carrier"
room:
id: "$room_id"
crypto:
key: "$key"
net:
transport: "$transport"
dns: "$dns_server"
data: "$data_dir"
EOF
if [ -n "$socks_proxy" ]; then
set -- "$@" -socks-proxy "$socks_proxy" -socks-proxy-port "$socks_proxy_port"
cat >> "$config" <<EOF
socks:
proxy_addr: "$socks_proxy"
proxy_port: $socks_proxy_port
EOF
fi
if [ "$transport" = "videochannel" ]; then
set -- "$@" \
-video-w "$video_w" \
-video-h "$video_h" \
-video-fps "$video_fps" \
-video-hw "$video_hw" \
-video-codec "$video_codec" \
-video-qr-recovery "$video_qr_recovery"
[ -n "$video_bitrate" ] && set -- "$@" -video-bitrate "$video_bitrate"
[ "$video_qr_size" -gt 0 ] && set -- "$@" -video-qr-size "$video_qr_size"
[ "$video_tile_module" -gt 0 ] && set -- "$@" -video-tile-module "$video_tile_module"
[ "$video_tile_rs" -gt 0 ] && set -- "$@" -video-tile-rs "$video_tile_rs"
cat >> "$config" <<EOF
video:
width: $video_w
height: $video_h
fps: $video_fps
hw: $video_hw
codec: $video_codec
qr_recovery: $video_qr_recovery
EOF
[ -n "$video_bitrate" ] && printf ' bitrate: "%s"\n' "$video_bitrate" >> "$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" <<EOF
vp8:
fps: $vp8_fps
batch_size: $vp8_batch
EOF
fi
if bool_flag "${OLCRTC_DEBUG:-}"; then
set -- "$@" -debug
if [ "$transport" = "seichannel" ]; then
cat >> "$config" <<EOF
sei:
fps: $sei_fps
batch_size: $sei_batch
fragment_size: $sei_frag
ack_timeout_ms: $sei_ack
EOF
fi
exec "$@"
case "${debug}" in
1|true|TRUE|yes|YES|on|ON)
printf 'debug: true\n' >> "$config"
;;
esac
exec /usr/local/bin/olcrtc "$config"

View File

@@ -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" <<GENEOF
mode: gen
auth:
provider: "$CARRIER"
net:
dns: "$DNS"
gen:
amount: 1
data: data
GENEOF
ROOM_ID=$(podman run --rm \
--network host \
-v $WORK_DIR:/app:Z \
-w /app \
$IMAGE_NAME \
./olcrtc -mode gen -carrier "$CARRIER" -dns "$DNS" -amount 1 -data data)
./olcrtc gen.yaml)
if [ -z "$ROOM_ID" ]; then
echo "[X] Room generation failed"
exit 1
@@ -335,6 +333,69 @@ else
echo ""
fi
# Generate YAML config
CONFIG_FILE="$WORK_DIR/server.yaml"
cat > "$CONFIG_FILE" <<EOF
mode: srv
link: direct
auth:
provider: "$CARRIER"
room:
id: "$ROOM_ID"
crypto:
key: "$KEY"
net:
transport: "$TRANSPORT"
dns: "$DNS"
EOF
if [ -n "$SOCKS_PROXY_ADDR" ]; then
cat >> "$CONFIG_FILE" <<EOF
socks:
proxy_addr: "$SOCKS_PROXY_ADDR"
proxy_port: $SOCKS_PROXY_PORT
EOF
fi
if [ "$TRANSPORT" = "vp8channel" ]; then
cat >> "$CONFIG_FILE" <<EOF
vp8:
fps: $VP8_FPS
batch_size: $VP8_BATCH
EOF
fi
if [ "$TRANSPORT" = "seichannel" ]; then
cat >> "$CONFIG_FILE" <<EOF
sei:
fps: $SEI_FPS
batch_size: $SEI_BATCH
fragment_size: $SEI_FRAG
ack_timeout_ms: $SEI_ACK
EOF
fi
if [ "$TRANSPORT" = "videochannel" ]; then
cat >> "$CONFIG_FILE" <<EOF
video:
width: $VIDEO_W
height: $VIDEO_H
fps: $VIDEO_FPS
bitrate: "$VIDEO_BITRATE"
hw: $VIDEO_HW
codec: $VIDEO_CODEC
qr_size: $VIDEO_QR_SIZE
qr_recovery: $VIDEO_QR_RECOVERY
tile_module: $VIDEO_TILE_MODULE
tile_rs: $VIDEO_TILE_RS
EOF
fi
cat >> "$CONFIG_FILE" <<EOF
data: data
debug: false
EOF
echo "[*] Starting OlcRTC server..."
podman run -d \
--network host \
@@ -343,9 +404,7 @@ podman run -d \
-v $WORK_DIR:/app:Z \
-w /app \
$IMAGE_NAME \
./olcrtc -mode srv -carrier "$CARRIER" -id "$ROOM_ID" -client-id "$CLIENT_ID" -key "$KEY" \
-link direct -transport "$TRANSPORT" -dns "$DNS" -data data \
"${EXTRA_ARGS[@]}" "${TRANSPORT_ARGS[@]}"
./olcrtc server.yaml
read -p "Enter a comment for the config (default: olc - t.me/openlibrecommunity): " sub_configname
if [ -z "$sub_configname" ]; then
@@ -359,7 +418,6 @@ echo "Container name: $CONTAINER_NAME"
echo "Carrier: $CARRIER"
echo "Transport: $TRANSPORT"
echo "Room ID: $ROOM_ID"
echo "Client ID: $CLIENT_ID"
echo "Encryption key: $KEY"
echo ""
TRANSPORT_PAYLOAD=""
@@ -378,7 +436,7 @@ elif [ "$TRANSPORT" = "videochannel" ]; then
fi
fi
OLC_URI="olcrtc://$CARRIER?${TRANSPORT}${TRANSPORT_PAYLOAD}@$ROOM_ID#$KEY%$CLIENT_ID\$$sub_configname"
OLC_URI="olcrtc://$CARRIER?${TRANSPORT}${TRANSPORT_PAYLOAD}@$ROOM_ID#$KEY\$$sub_configname"
echo "uri: $OLC_URI"
echo ""
@@ -401,7 +459,7 @@ else
echo "[!] Could not download gr ($GR_URL), skipping QR"
fi
if [ ${#EXTRA_ARGS[@]} -gt 0 ]; then
if [ -n "$SOCKS_PROXY_ADDR" ]; then
echo "SOCKS5 proxy: $SOCKS_PROXY_ADDR:$SOCKS_PROXY_PORT"
fi
@@ -412,32 +470,3 @@ echo ""
echo "Stop server:"
echo " podman stop $CONTAINER_NAME"
echo ""
echo "Client command:"
echo -n " ./olcrtc -mode cnc -carrier \"$CARRIER\" -id \"$ROOM_ID\" -client-id \"$CLIENT_ID\" -key \"$KEY\" \\"
echo ""
echo -n " -link direct -transport \"$TRANSPORT\" -dns $DNS -data data \\"
echo ""
if [ "$TRANSPORT" = "videochannel" ]; then
echo -n " -video-w \"$VIDEO_W\" -video-h \"$VIDEO_H\" -video-fps \"$VIDEO_FPS\" \\"
echo ""
echo -n " -video-bitrate \"$VIDEO_BITRATE\" -video-hw \"$VIDEO_HW\" -video-codec \"$VIDEO_CODEC\" \\"
echo ""
if [ "$VIDEO_CODEC" = "tile" ]; then
echo -n " -video-tile-module \"$VIDEO_TILE_MODULE\" -video-tile-rs \"$VIDEO_TILE_RS\" \\"
echo ""
fi
fi
if [ "$TRANSPORT" = "vp8channel" ]; then
echo -n " -vp8-fps \"$VP8_FPS\" -vp8-batch \"$VP8_BATCH\" \\"
echo ""
fi
if [ "$TRANSPORT" = "seichannel" ]; then
echo -n " -fps \"$SEI_FPS\" -batch \"$SEI_BATCH\" -frag \"$SEI_FRAG\" -ack-ms \"$SEI_ACK\" \\"
echo ""
fi
echo " -socks-host 0.0.0.0 -socks-port 1080"
echo ""