Configure self-hosted STUN for remote WebRTC

This commit is contained in:
Xin Wang
2026-08-05 14:05:22 +08:00
parent 16156028c9
commit 0456d2b4ae
7 changed files with 53 additions and 36 deletions

View File

@@ -170,44 +170,53 @@ https://<远程机器IP或域名>:18189
如果浏览器和后端不在同一内网,WebRTC 媒体链路通常需要 TURN。项目里的
`docker-compose.yaml` 已经带了 coturn,用 `remote` profile 启动即可。
#### 6.1 配项目根目录 `.env`
#### 6.1 确认公网/私网 IP
项目根目录的 `.env` 给 coturn 容器用:
查询云主机默认路由使用的私网 IP:
```bash
ip -4 route get 1.1.1.1
```
输出中 `src` 后的地址是 `PRIVATE_IP`。例如:
```text
1.1.1.1 via 10.0.0.1 dev eth0 src 10.0.0.8
```
云控制台中绑定到该主机、用于 SSH 的公网地址是 `PUBLIC_IP`
#### 6.2 配项目根目录 `.env`
Docker Compose 会把项目根 `.env` 中的 ICE 配置同时传给 API 和 coturn:
```text
PUBLIC_IP=<远程机器公网IP>
PRIVATE_IP=<远程机器私网IP>
TURN_SECRET=<一串足够长的随机密钥>
STUN_URL=stun:<远程机器公网IP>:3478
TURN_URLS=turn:<远程机器公网IP>:3478?transport=udp,turn:<远程机器公网IP>:3478?transport=tcp
```
示例:
```text
PUBLIC_IP=118.89.89.89
PRIVATE_IP=10.0.0.8
TURN_SECRET=change-me-to-a-long-random-string
```
#### 6.2 配后端 `backend/.env`
后端用同一个 `TURN_SECRET` 签发短时 TURN 凭证:
```text
TURN_URLS=turn:<远程机器公网IP>:3478?transport=udp,turn:<远程机器公网IP>:3478?transport=tcp
TURN_SECRET=<和项目根 .env 一致的密钥>
```
示例:
```text
STUN_URL=stun:118.89.89.89:3478
TURN_URLS=turn:118.89.89.89:3478?transport=udp,turn:118.89.89.89:3478?transport=tcp
TURN_SECRET=change-me-to-a-long-random-string
```
改完 `backend/.env` 后,重启后端 `uvicorn`
`STUN_URL` 指向同机 coturn可避免后端等待不可达的公共 STUN
Compose 的 `environment` 会覆盖 `backend/.env` 中的同名值,因此 Docker
部署必须在项目根 `.env` 设置上述变量。
#### 6.3 启动 coturn
```bash
docker compose --profile remote up -d coturn
docker compose config --quiet
docker compose --profile remote up -d --build --force-recreate api coturn
```
查看状态和日志:
@@ -259,7 +268,7 @@ curl -k https://<远程机器IP或域名>:18189/api/webrtc/ice-servers
```json
{
"iceServers": [
{"urls": "stun:stun.l.google.com:19302"},
{"urls": "stun:118.89.89.89:3478"},
{
"urls": "turn:<远程机器公网IP>:3478?transport=udp",
"username": "...",