Pion 自定义 SFU 服务器无法在内部工作 docker
Pion custom SFU server not working inside docker
我遵循了这个例子:https://github.com/pion/example-webrtc-applications/tree/master/sfu-ws
在本地工作
我做了一个 linux 构建,我把它放在服务器上,正在运行
我把它放在一个 docker 容器里,它不再工作了。
在docker我打开的端口范围:
50000-50200:50000-50200/udp
version: '3'
services:
app:
image: xxxx
container_name: web_preprod
ports:
- 127.0.0.1:8080:8080
- 127.0.0.1:6060:6060
- 50000-50200:50000-50200/udp
restart: on-failure
networks:
- xxxx
nginx:
image: nginx:latest
restart: always
container_name: nginx_preprod
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
ports:
- "80:80"
- "443:443"
- "6061:6061"
- "6062:6062"
networks:
- xxxx
volumes:
- /tmp:/tmp
- ./nginx.conf:/etc/nginx/nginx.conf
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
depends_on:
- app
networks:
xxxx:
driver: bridge
端口6061
不安全,用于测试。
在我的服务器上,我使用了相同的端口:
se := webrtc.SettingEngine{}
se.SetEphemeralUDPPortRange(50000, 50200)
WebRTCApi = webrtc.NewAPI(webrtc.WithMediaEngine(getPublisherMediaEngine()), webrtc.WithSettingEngine(se))
但我在服务器或客户端上都没有得到 onTrack
。
我看到的,在我收到的服务器上
PeerConnectionStateFailed
我用的是google stun,客户端有free turn server
var config = {
iceServers: [{
urls: ["stun:stun1.l.google.com:19302"]
},
{
urls: 'turn:numb.viagenie.ca:3478',
credential: 'xxxx',
username: 'xxxx@gmail.com'
}
]
};
pc = new RTCPeerConnection(config)
如果您有任何想法,我将不胜感激。
问题是 Pion(或任何 WebRTC 实现)只知道它正在侦听的 IP 地址。它无法知道 map/forward 到它的所有地址。人们也将其称为 Public IP
或 NAT Mapping
。因此,当 Pion 发出候选人时,他们可能看起来像 10.10.0.*
,而远程对等方将无法联系到它。
您应该做的是使用 SettingEngine 并设置 SetNat1To1IPs。如果您知道主机的 public IP,它将使用 public IP 重写候选。
ICE 是一个棘手的过程。从概念上理解它 WebRTC for the Curious#Networking 可能会有所帮助。一定会尽快回答任何后续问题!
我遵循了这个例子:https://github.com/pion/example-webrtc-applications/tree/master/sfu-ws
在本地工作
我做了一个 linux 构建,我把它放在服务器上,正在运行
我把它放在一个 docker 容器里,它不再工作了。
在docker我打开的端口范围:
50000-50200:50000-50200/udp
version: '3' services: app: image: xxxx container_name: web_preprod ports: - 127.0.0.1:8080:8080 - 127.0.0.1:6060:6060 - 50000-50200:50000-50200/udp restart: on-failure networks: - xxxx nginx: image: nginx:latest restart: always container_name: nginx_preprod command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'" ports: - "80:80" - "443:443" - "6061:6061" - "6062:6062" networks: - xxxx volumes: - /tmp:/tmp - ./nginx.conf:/etc/nginx/nginx.conf - ./data/certbot/conf:/etc/letsencrypt - ./data/certbot/www:/var/www/certbot depends_on: - app networks: xxxx: driver: bridge
端口6061
不安全,用于测试。
在我的服务器上,我使用了相同的端口:
se := webrtc.SettingEngine{}
se.SetEphemeralUDPPortRange(50000, 50200)
WebRTCApi = webrtc.NewAPI(webrtc.WithMediaEngine(getPublisherMediaEngine()), webrtc.WithSettingEngine(se))
但我在服务器或客户端上都没有得到 onTrack
。
我看到的,在我收到的服务器上
PeerConnectionStateFailed
我用的是google stun,客户端有free turn server
var config = {
iceServers: [{
urls: ["stun:stun1.l.google.com:19302"]
},
{
urls: 'turn:numb.viagenie.ca:3478',
credential: 'xxxx',
username: 'xxxx@gmail.com'
}
]
};
pc = new RTCPeerConnection(config)
如果您有任何想法,我将不胜感激。
问题是 Pion(或任何 WebRTC 实现)只知道它正在侦听的 IP 地址。它无法知道 map/forward 到它的所有地址。人们也将其称为 Public IP
或 NAT Mapping
。因此,当 Pion 发出候选人时,他们可能看起来像 10.10.0.*
,而远程对等方将无法联系到它。
您应该做的是使用 SettingEngine 并设置 SetNat1To1IPs。如果您知道主机的 public IP,它将使用 public IP 重写候选。
ICE 是一个棘手的过程。从概念上理解它 WebRTC for the Curious#Networking 可能会有所帮助。一定会尽快回答任何后续问题!