Files
olcrtc/docs/manual.md

492 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div align="center">
<img src="https://github.com/openlibrecommunity/material/blob/master/olcrtc.png" width="250" height="250">
![License](https://img.shields.io/badge/license-WTFPL-0D1117?style=flat-square&logo=open-source-initiative&logoColor=green&labelColor=0D1117)
![Golang](https://img.shields.io/badge/-Golang-0D1117?style=flat-square&logo=go&logoColor=00A7D0)
</div>
# Мануальная сборка
> **Важно:** Обязательно проверяйте, есть ли сервис видеозвонков у вас в белых списках. Если его там нет - используйте другой. Список всех сервисов в белых списках скоро будет опубликован.
Этот способ для тех кто хочет собрать бинарник руками без Docker/Podman.
Нужен Go 1.26+, mage, git.
---
### swap (ОЗУ)
Если у вас меньше 4ГБ оперативной памяти, сборка может вылетать. **Обязательно включите SWAP**:
```bash
sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
```
---
## Что нужно установить
## Шаг 1: Установить git
```sh
apt install git # Debian / Ubuntu / Mint
pacman -S git # Arch / CachyOS / Manjaro
dnf install git # Fedora / RHEL / CentOS
```
---
## Шаг 2: Установить Go 1.26+
### Arch / Fedora (всё просто)
```sh
pacman -S go # Arch / CachyOS / Manjaro
dnf install go # Fedora / RHEL / CentOS
```
### Debian / Ubuntu (системный пакет устаревший)
На Debian/Ubuntu в репозитории обычно Go 1.19.
На Debian 13 лучше через `testing` c `APT Pinning`, чтобы не засорять ОС:
```sh
echo 'deb http://deb.debian.org/debian/ testing main non-free-firmware' | sudo tee /etc/apt/sources.list.d/testing.list
cat <<EOF | sudo tee /etc/apt/preferences.d/testing-pin
Package: *
Pin: release a=testing
Pin-Priority: 100
EOF
sudo apt update
sudo apt install -t testing golang-go
sudo update-alternatives --install /usr/bin/go go `which go` 10
sudo update-alternatives --install /usr/bin/gofmt gofmt `which gofmt` 10
```
Иначе через SDK:
```sh
apt install golang # ставим старый go - он нужен только чтобы скачать новый
go install golang.org/dl/go1.26.0@latest # скачиваем установщик go1.26
~/go/bin/go1.26.0 download # скачиваем сам go1.26
mv ~/go/bin/go1.26.0 /usr/local/bin/go # заменяем системный go
```
### Проверка
```sh
go version
# go version go1.26.x linux/amd64
```
---
## Шаг 3: Установить mage
mage - система сборки для Go-проектов, аналог make.
```sh
go install github.com/magefile/mage@latest
```
Добавь `~/go/bin` в PATH:
```sh
echo 'export PATH="$HOME/go/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```
Проверка:
```sh
mage --version
# mage vx.x.x
```
---
## Шаг 4: Скачать репозиторий
```sh
git clone https://github.com/openlibrecommunity/olcrtc
cd olcrtc
```
---
## Шаг 5: Собрать
```sh
mage build # текущая платформа
mage cross # все платформы сразу (если собираешь для другой машины)
```
Результат в `build/`:
```
build/olcrtc-linux-amd64
```
---
## Шаг 6: Сгенерировать ключ шифрования
Делается один раз на сервере. Ключ должен совпадать на сервере и клиенте.
```sh
openssl rand -hex 32
# d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799
```
Сохрани вывод - понадобится при запуске клиента.
---
## Шаг 7: Запустить сервер
На серверной машине (VPS и т.д.). Подбери нужную комбинацию auth provider + transport из матрицы в [settings.md](settings.md).
### jitsi + datachannel (рекомендуется)
Самый простой способ: используй любой self-hosted или публичный Jitsi Meet инстанс. Регистрация не нужна, имя комнаты выдумывается на лету. Доступные публичные серверы: `meet1.arbitr.ru` и `meet.cryptopro.ru` - **обязательно проверь в браузере, какой из них работает в твоей сети**, и используй тот, который открывается. Также подойдёт любой другой (`meet.jit.si`, свой self-hosted и т.п.).
Создай YAML конфиг:
```yaml
# server.yaml
mode: srv
auth:
provider: jitsi
room:
# Используйте meet1.arbitr.ru или meet.cryptopro.ru - тот, что работает в вашей сети
id: "https://meet1.arbitr.ru/myroom"
crypto:
key: "d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799"
net:
transport: datachannel
dns: "8.8.8.8:53"
data: data
```
Запусти:
```sh
./build/olcrtc-linux-amd64 server.yaml
```
Сервер сам присоединится к комнате (в качестве участника без камеры/микрофона) и будет ждать, пока клиент тоже зайдёт. Без второго участника Jicofo не выдаёт session-initiate - это особенность Jitsi.
### wbstream + vp8channel (альтернатива)
Создай руму через сайт [wbstream](https://stream.wb.ru) и вставь её ID в `room.id`.
`wbstream + datachannel` **не работает** в обычном guest flow - WB Stream выдаёт токены с `canPublishData=false`, и DC не маршрутизирует данные. Для обычного использования выбирай `vp8channel`.
Создай YAML конфиг:
```yaml
# server.yaml
mode: srv
auth:
provider: wbstream
room:
id: "<room-id-со-stream.wb.ru>"
crypto:
key: "d823fa01cb3e0609b67322f7cf984c4ee2e4ce2e294936fc24ef38c9e59f4799"
net:
transport: vp8channel
dns: "8.8.8.8:53"
data: data
```
Запусти:
```sh
./build/olcrtc-linux-amd64 server.yaml
```
Room ID нужно передать клиенту.
### Добавить отладку
Добавь `debug: true` в YAML конфиг - увидишь каждое соединение:
```
2026/05/03 08:05:23 Connecting link via direct/vp8channel/wbstream...
2026/05/03 08:05:25 wbstream publisher state: connected
2026/05/03 08:05:27 Link connected
2026/05/03 08:05:43 sid=3 connect icanhazip.com:443
2026/05/03 08:05:43 sid=3 connected icanhazip.com
```
---
## Шаг 8: Запустить клиент
На своей машине. `auth.provider`, `net.transport`, `room.id` и `crypto.key` должны совпадать с сервером.
### jitsi + datachannel (рекомендуется)
```yaml
# client.yaml
mode: cnc
auth:
provider: jitsi
room:
# Используйте meet1.arbitr.ru или meet.cryptopro.ru - тот, что работает в вашей сети
id: "https://meet1.arbitr.ru/myroom"
crypto:
key: "<hex-key-такой-же-как-на-сервере>"
net:
transport: datachannel
dns: "8.8.8.8:53"
socks:
host: "127.0.0.1"
port: 8808
data: data
```
```sh
./build/olcrtc-linux-amd64 client.yaml
```
После запуска SOCKS5 будет слушать на `127.0.0.1:8808`. Используй любой клиент с поддержкой SOCKS5 (`curl --socks5 127.0.0.1:8808 ...`, браузер с переключателем прокси и т.п.).
### wbstream + vp8channel (альтернатива)
```yaml
# client.yaml
mode: cnc
auth:
provider: wbstream
room:
id: "<room-id>"
crypto:
key: "<hex-key>"
net:
transport: vp8channel
dns: "8.8.8.8:53"
socks:
host: "127.0.0.1"
port: 8808
data: data
```
```sh
./build/olcrtc-linux-amd64 client.yaml
```
После старта в логах появится:
```
SOCKS5 server listening on 127.0.0.1:8808
```
Если нужно защитить прокси логином и паролем (например на машине с несколькими пользователями), добавь `socks.user` и `socks.pass` в конфиг:
```yaml
# client.yaml
mode: cnc
auth:
provider: wbstream
room:
id: "<room-id>"
crypto:
key: "<hex-key>"
net:
transport: vp8channel
dns: "8.8.8.8:53"
socks:
host: "127.0.0.1"
port: 8808
user: myuser
pass: mypass
data: data
```
Без этих полей аутентификация отключена - поведение прежнее.
---
## Шаг 9: Проверить
```sh
curl --socks5-hostname 127.0.0.1:8808 https://icanhazip.com
```
Должен вернуть IP сервера.
---
## Все mage таргеты
### Сборка
```sh
mage build # собрать для текущей платформы
mage cross # собрать для всех платформ
mage mobile # собрать Android AAR
mage docker # собрать образ через docker
mage podman # собрать образ через podman
mage clean # удалить build/
```
### Качество
```sh
mage vet # go vet
mage lint # golangci-lint
mage tidy # go mod tidy && go mod verify
mage deps # go mod download
```
### Тесты
```sh
mage test # юниты в -short, быстро
mage testFull # все юниты + локальные e2e с -race
mage e2e # smoke-матрица против реальных провайдеров
mage stress # stress-матрица (~6 ч)
mage soak # реальный soak (часами)
mage localSoak # in-memory soak (без сети)
```
### Пайплайны
```sh
mage check # build + vet + lint + testFull (перед коммитом)
mage all # check + e2e (перед мерджем PR)
mage nightly # all + stress (ночной CI, ~6 ч)
mage everything # nightly + soak + localSoak (полная валидация, 12+ ч)
```
### Прочее
```sh
mage help # список таргетов в стандартном стиле mage
mage -l # то же что mage help
mage # без аргументов = mage help
```
Тонкая настройка прогона тестов через переменные окружения:
```sh
# одиночный кейс stress
E2E_CARRIERS=telemost E2E_TRANSPORTS=videochannel \
STRESS_BULK_DURATION=0 STRESS_ECHO_DURATION=0 \
STRESS_CASE_TIMEOUT=2m STRESS_TIMEOUT=3m mage stress
# soak только jitsi на 30 минут
SOAK_CARRIERS=jitsi SOAK_DURATION=30m mage soak
```
Полный список переменных:
- `E2E_CARRIERS`, `E2E_TRANSPORTS`, `E2E_TIMEOUT`, `E2E_STRESS`, `E2E_STRESS_DURATION`
- `STRESS_BULK_DURATION`, `STRESS_ECHO_DURATION`, `STRESS_CASE_TIMEOUT`, `STRESS_TIMEOUT`
- `SOAK_CARRIERS`, `SOAK_TRANSPORTS`, `SOAK_DURATION`, `SOAK_CHAOS`
- `DOCKER_TAG`
---
## Несколько инстансов на одном сервере
Можно запустить несколько серверов olcrtc на одной машине - каждый со своим конфигом (разные провайдеры, комнаты, транспорты). Для этого создай отдельный YAML-файл для каждого инстанса и запусти каждый в отдельном процессе.
### Пример: два сервера
```yaml
# server-jitsi.yaml
mode: srv
auth:
provider: jitsi
room:
id: "https://meet1.arbitr.ru/room1"
crypto:
key: "aaaa...1111"
net:
transport: datachannel
dns: "8.8.8.8:53"
data: data
```
```yaml
# server-wbstream.yaml
mode: srv
auth:
provider: wbstream
room:
id: "<room-id>"
crypto:
key: "bbbb...2222"
net:
transport: vp8channel
dns: "8.8.8.8:53"
data: data
```
Запусти каждый в отдельном терминале (или через `tmux` / `screen` / `systemd`):
```sh
./build/olcrtc-linux-amd64 server-jitsi.yaml
./build/olcrtc-linux-amd64 server-wbstream.yaml
```
### Клиенты
На клиентской машине - по одному конфигу на каждый сервер, с **разными SOCKS5 портами**:
```yaml
# client-jitsi.yaml
mode: cnc
auth:
provider: jitsi
room:
id: "https://meet1.arbitr.ru/room1"
crypto:
key: "aaaa...1111"
net:
transport: datachannel
dns: "8.8.8.8:53"
socks:
host: "127.0.0.1"
port: 8808
data: data
```
```yaml
# client-wbstream.yaml
mode: cnc
auth:
provider: wbstream
room:
id: "<room-id>"
crypto:
key: "bbbb...2222"
net:
transport: vp8channel
dns: "8.8.8.8:53"
socks:
host: "127.0.0.1"
port: 8809
data: data
```
```sh
./build/olcrtc-linux-amd64 client-jitsi.yaml # SOCKS5 на :8808
./build/olcrtc-linux-amd64 client-wbstream.yaml # SOCKS5 на :8809
```
Переключение между инстансами в olcbox - просто выбираешь нужный SOCKS5 порт.
---
Используешь скрипты вместо ручной сборки? -> [Быстрый старт](fast.md)
Все настройки и матрица совместимости -> [settings.md](settings.md)