mirror of
https://github.com/openlibrecommunity/olcrtc.git
synced 2026-05-26 07:08:11 +00:00
doc: add YAML configuration support
This commit is contained in:
222
docs/about.md
222
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=<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 - он корректно логирует ошибки и продолжает работу. Соединения к незаблокированным адресам проходят без проблем. Проблема на стороне хостинга или фаервола.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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` |
|
||||
|
||||
26
docs/fast.md
26
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)
|
||||
|
||||
135
docs/manual.md
135
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="<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)
|
||||
|
||||
@@ -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
|
||||
|
||||
368
docs/settings.md
368
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="<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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -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
|
||||
|
||||
191
docs/uri.md
191
docs/uri.md
@@ -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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
10
readme.md
10
readme.md
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
145
script/srv.sh
145
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" <<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 ""
|
||||
|
||||
Reference in New Issue
Block a user