Compare commits
3 Commits
6dadec6b64
...
625a7acfb7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
625a7acfb7 | ||
|
|
6364253c6f | ||
|
|
f6e99cf32b |
27
.env
Normal file
27
.env
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
###########
|
||||||
|
# GATEWAY #
|
||||||
|
###########
|
||||||
|
#Секретный ключ по которому авторизуются бекенды при подключении к SFU шлюзу
|
||||||
|
SECRET=SFU_TEST_SECRET
|
||||||
|
#PORT SFU шлюза (для приема соединений от бекендов)
|
||||||
|
PORT=1001
|
||||||
|
###############
|
||||||
|
# SFU SECTION #
|
||||||
|
###############
|
||||||
|
#Публичный IP адрес, который будет использоваться для ICE кандидатов (если SFU работает за NAT)
|
||||||
|
SFU_PUBLIC_IP=192.168.6.82
|
||||||
|
#Диапазон портов для ICE кандидатов
|
||||||
|
SFU_PORT_RANGE_FROM=30000
|
||||||
|
SFU_PORT_RANGE_TO=39999
|
||||||
|
################
|
||||||
|
# TURN SECTION #
|
||||||
|
################
|
||||||
|
#Разрешить использовать этот SFU как TURN сервер тоже (для ретрансляции медиа трафика на сам SFU)
|
||||||
|
TURN_ALLOW=true
|
||||||
|
#TURN имя пользователя и пароль для аутентификации на TURN сервере (если используется)
|
||||||
|
TURN_PUBLIC_IP=192.168.6.82
|
||||||
|
TURN_USER=user
|
||||||
|
TURN_PASS=pass
|
||||||
|
#Диапазон занимемых TURN сервером портов (tcp/udp)
|
||||||
|
TURN_PORT_RANGE_FROM=40000
|
||||||
|
TURN_PORT_RANGE_TO=50000
|
||||||
39
.gitea/workflows/build.yaml
Normal file
39
.gitea/workflows/build.yaml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
name: Build G365SFU
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Install Node.js
|
||||||
|
run: |
|
||||||
|
if command -v apt-get &> /dev/null; then
|
||||||
|
sudo apt-get update && sudo apt-get install -y nodejs npm
|
||||||
|
elif command -v brew &> /dev/null; then
|
||||||
|
brew install node
|
||||||
|
fi
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: 1.20
|
||||||
|
- name: Build G365SFU
|
||||||
|
run: |
|
||||||
|
make build
|
||||||
|
- name: Deploy to server via SSH
|
||||||
|
uses: appleboy/scp-action@v1
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.SFU_SSH_HOST }}
|
||||||
|
username: ${{ secrets.SFU_SSH_USER }}
|
||||||
|
password: ${{ secrets.SFU_SSH_PASSWORD }}
|
||||||
|
port: ${{ secrets.SFU_SSH_PORT }}
|
||||||
|
source: "build/*"
|
||||||
|
target: ${{ secrets.SFU_DEPLOY_PATH }}
|
||||||
|
strip_components: 1
|
||||||
|
rm: false
|
||||||
|
debug: true
|
||||||
|
flatten: true
|
||||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
.env
|
|
||||||
.vscode
|
.vscode
|
||||||
__debug*
|
__debug*
|
||||||
|
build/.env
|
||||||
|
build/g365sfu
|
||||||
5
Makefile
Normal file
5
Makefile
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
.PHONY: build
|
||||||
|
|
||||||
|
build:
|
||||||
|
mkdir -p build
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o build/g365sfu .
|
||||||
10
README.md
10
README.md
@@ -1,6 +1,9 @@
|
|||||||
# G365SFU
|
# G365SFU
|
||||||
G365SFU - это медиасервер, который используется для организации звонков. Он работает по протоколам WebSocket (шлюз/gateway) и WebRTC (для медиа-трафика) и состоит из трех основных компонентов: шлюза (gateway), SFU сервера, TURN сервера. SFU занимается пересылкой медиа-потоков между участниками звонка, а TURN сервер обеспечивает возможность связи между участниками, находящимися за NAT или брандмауэром. **ВАЖНО!** G365SFU не занимается сигнализацией, а только пересылает медиа-трафик, поэтому для организации звонков необходимо использовать отдельный сервер сигнализации, который будет обмениваться данными о подключении между участниками и SFU. **ВАЖНО!** Пользователи в звонках не соединяются друг с другом напрямую, они "созваниваются" с сервером SFU, используя его в качестве посредника для передачи медиа-трафика. Сервер SFU при этом не может расшифровать звонок, так как ему приходят уже зашифрованные RTP пакеты, которые он просто пересылает между участниками.
|
G365SFU - это медиасервер, который используется для организации звонков. Он работает по протоколам WebSocket (шлюз/gateway) и WebRTC (для медиа-трафика) и состоит из трех основных компонентов: шлюза (gateway), SFU сервера, TURN сервера. SFU занимается пересылкой медиа-потоков между участниками звонка, а TURN сервер обеспечивает возможность связи между участниками, находящимися за NAT или брандмауэром. **ВАЖНО!** G365SFU не занимается сигнализацией, а только пересылает медиа-трафик, поэтому для организации звонков необходимо использовать отдельный сервер сигнализации, который будет обмениваться данными о подключении между участниками и SFU. **ВАЖНО!** Пользователи в звонках не соединяются друг с другом напрямую, они "созваниваются" с сервером SFU, используя его в качестве посредника для передачи медиа-трафика. Сервер SFU при этом не может расшифровать звонок, так как ему приходят уже зашифрованные RTP пакеты, которые он просто пересылает между участниками.
|
||||||
|
|
||||||
|
### Disclaimer
|
||||||
|
В Docker работает только на Linux (Ubuntu 22.04 и выше). На других платформах нужно запускать бинарный файл напрямую ./build/g365sfu, предварительно собрав его с помощью команды `make build`. Связано это с публикацией огромного диапазона портов для SFU и TURN сервера, что не поддерживается в Docker на других платформах. Сейчас Docker использует host-network, который поддерживает только ядра Linux, что позволяет обойти эту проблему.
|
||||||
|
|
||||||
### Gatway
|
### Gatway
|
||||||
Gateway - это компонент, который обеспечивает связь между Вашим сервером сигналинга (в Rosetta он написан на Java) и SFU сервером. Он принимает WebSocket соединения от сервера сигнализации и обрабатывает сообщения, связанные с управлением звонками, такими как создание комнаты, присоединение к комнате, отключение от комнаты и т.д. Gateway также отвечает за аутентификацию пользователей и управление их сессиями. В G365SFU используется встроенный шлюз, который можно настроить через переменные окружения. Он будет слушать на порту 1001 (по умолчанию) для входящих WebSocket соединений от сервера сигнализации. Gateway обеспечивает надежную связь между сервером сигнализации и SFU сервером, позволяя эффективно управлять звонками и участниками.
|
Gateway - это компонент, который обеспечивает связь между Вашим сервером сигналинга (в Rosetta он написан на Java) и SFU сервером. Он принимает WebSocket соединения от сервера сигнализации и обрабатывает сообщения, связанные с управлением звонками, такими как создание комнаты, присоединение к комнате, отключение от комнаты и т.д. Gateway также отвечает за аутентификацию пользователей и управление их сессиями. В G365SFU используется встроенный шлюз, который можно настроить через переменные окружения. Он будет слушать на порту 1001 (по умолчанию) для входящих WebSocket соединений от сервера сигнализации. Gateway обеспечивает надежную связь между сервером сигнализации и SFU сервером, позволяя эффективно управлять звонками и участниками.
|
||||||
|
|
||||||
@@ -10,7 +13,7 @@ SFU - Selective Forwarding Unit - это тип медиасервера, кот
|
|||||||
### TURN сервер
|
### TURN сервер
|
||||||
TURN - Traversal Using Relays around NAT - это протокол, который позволяет устройствам за NAT (Network Address Translation) или брандмауэром устанавливать связь с другими устройствами в интернете. TURN серверы используются для ретрансляции медиа-трафика между участниками видеоконференции, когда прямое соединение между ними невозможно из-за ограничений сети. В G365SFU используется встроенный TURN сервер, который можно включить с помощью переменной окружения `TURN_ALLOW=true`. Он будет слушать на порту 3478 и использовать диапазон портов от 40000 до 50000 для ретрансляции трафика. Параметры сервера, такие как публичный IP, имя пользователя и пароль, также настраиваются через переменные окружения. TURN сервер обеспечивает надежную связь между участниками звонка, даже если они находятся за NAT.
|
TURN - Traversal Using Relays around NAT - это протокол, который позволяет устройствам за NAT (Network Address Translation) или брандмауэром устанавливать связь с другими устройствами в интернете. TURN серверы используются для ретрансляции медиа-трафика между участниками видеоконференции, когда прямое соединение между ними невозможно из-за ограничений сети. В G365SFU используется встроенный TURN сервер, который можно включить с помощью переменной окружения `TURN_ALLOW=true`. Он будет слушать на порту 3478 и использовать диапазон портов от 40000 до 50000 для ретрансляции трафика. Параметры сервера, такие как публичный IP, имя пользователя и пароль, также настраиваются через переменные окружения. TURN сервер обеспечивает надежную связь между участниками звонка, даже если они находятся за NAT.
|
||||||
|
|
||||||
# Установка
|
# Установка (Ubuntu 22.04 и выше)
|
||||||
Для начала, нам необходимо открыть порты 30000-39999 для SFU и 40000-50000 для TURN сервера (по умолчанию, если перенастраивается .env то нужно указать другие). Это можно сделать с помощью команды `ufw`:
|
Для начала, нам необходимо открыть порты 30000-39999 для SFU и 40000-50000 для TURN сервера (по умолчанию, если перенастраивается .env то нужно указать другие). Это можно сделать с помощью команды `ufw`:
|
||||||
```bash
|
```bash
|
||||||
sudo ufw allow 30000:39999/udp
|
sudo ufw allow 30000:39999/udp
|
||||||
@@ -18,4 +21,9 @@ sudo ufw allow 40000:50000/udp
|
|||||||
sudo ufw allow 30000:39999/tcp
|
sudo ufw allow 30000:39999/tcp
|
||||||
sudo ufw allow 40000:50000/tcp
|
sudo ufw allow 40000:50000/tcp
|
||||||
sudo ufw allow 3478/tcp
|
sudo ufw allow 3478/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
Запускаем докер-контейнер с G365SFU, указав необходимые переменные окружения в файле `build/.env` (пример можно взять из корневой папки проекта .env). Для этого нужно выполнить следующую команду в терминале, находясь в папке build:
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
```
|
```
|
||||||
18
build/Dockerfile
Normal file
18
build/Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM alpine:3.20
|
||||||
|
|
||||||
|
RUN apk add --no-cache ca-certificates tzdata
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Бинарь должен быть собран заранее в ./build/g365sfu
|
||||||
|
COPY g365sfu /app/g365sfu
|
||||||
|
|
||||||
|
COPY .env /app/.env
|
||||||
|
|
||||||
|
RUN chmod +x /app/g365sfu
|
||||||
|
|
||||||
|
EXPOSE 1001
|
||||||
|
EXPOSE 3478/tcp
|
||||||
|
EXPOSE 3478/udp
|
||||||
|
|
||||||
|
ENTRYPOINT ["/app/g365sfu"]
|
||||||
13
build/docker-compose.yml
Normal file
13
build/docker-compose.yml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
services:
|
||||||
|
g365sfu:
|
||||||
|
container_name: g365sfu
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: g365sfu:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
#Поддерживается только в Linux (на Windows и MacOS нужно использовать bridge сеть и проброс портов, но нельзя пробрасывать большие
|
||||||
|
#диапазоны портов, это может вызывать проблемы с работой Docker)
|
||||||
|
network_mode: host
|
||||||
@@ -32,7 +32,15 @@ func getSecret() string {
|
|||||||
|
|
||||||
// Обработчик WebSocket соединений
|
// Обработчик WebSocket соединений
|
||||||
func HandleWebSocket(w http.ResponseWriter, r *http.Request) {
|
func HandleWebSocket(w http.ResponseWriter, r *http.Request) {
|
||||||
conn, _ := upgrader.Upgrade(w, r, nil)
|
conn, err := upgrader.Upgrade(w, r, nil)
|
||||||
|
if err != nil {
|
||||||
|
logger.LogWarnMessage("failed to upgrade to websocket: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if conn == nil {
|
||||||
|
logger.LogWarnMessage("failed to upgrade to websocket: connection is nil")
|
||||||
|
return
|
||||||
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
// Канал для передачи байтов
|
// Канал для передачи байтов
|
||||||
|
|||||||
Reference in New Issue
Block a user