承接 Day 8(Selkies 與 WebRTC 基礎),今天動手部署 coturn + TURN-REST API,讓瀏覽器在多 NAT/防火牆環境中也能建立 WebRTC 連線,並學會用
webrtc-internals
觀察連線是否走到 TURN。
kubectl create ns turn
kubectl -n turn create secret generic turn-secret --from-literal=secret=MyTURNSecret123
# coturn-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: coturn-config
namespace: turn
labels:
app: coturn
data:
turnserver.conf: |
listening-port=3478
tls-listening-port=5349
realm=turn.example.com
fingerprint
use-auth-secret
static-auth-secret=MyTURNSecret123
total-quota=100
bps-capacity=0
stale-nonce=600
no-loopback-peers
no-multicast-peers
套用:
kubectl apply -f coturn-config.yaml
# coturn-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: coturn
namespace: turn
spec:
replicas: 1
selector:
matchLabels:
app: coturn
template:
metadata:
labels:
app: coturn
spec:
containers:
- name: coturn
image: instrumentisto/coturn:latest
args: ["-c", "/etc/coturn/turnserver.conf"]
ports:
- containerPort: 3478
- containerPort: 5349
volumeMounts:
- name: config
mountPath: /etc/coturn
volumes:
- name: config
configMap:
name: coturn-config
---
apiVersion: v1
kind: Service
metadata:
name: coturn
namespace: turn
spec:
type: LoadBalancer
ports:
- name: udp-3478
port: 3478
protocol: UDP
- name: tcp-3478
port: 3478
protocol: TCP
- name: tcp-5349
port: 5349
protocol: TCP
selector:
app: coturn
若環境無 LoadBalancer,可改 NodePort;正式建議配置靜態 IP + DNS:
turn.example.com
。
Selkies 支援 時間戳簽名的 REST API(TURN REST API draft)。
// turn-rest.js
const crypto = require('crypto');
const express = require('express');
const app = express();
const secret = process.env.TURN_SECRET || 'MyTURNSecret123';
const realm = 'turn.example.com';
app.get('/turn-cred', (req, res) => {
const ttl = 300; // 5 分鐘
const username = Math.floor(Date.now() / 1000) + ttl;
const hmac = crypto.createHmac('sha1', secret);
hmac.update(username.toString());
const password = hmac.digest('base64');
res.json({
username: username.toString(),
password,
ttl,
uris: [
`stun:${realm}:3478`,
`turn:${realm}:3478?transport=udp`,
`turn:${realm}:3478?transport=tcp`,
`turns:${realm}:5349?transport=tcp`
]
});
});
app.listen(8080, () => console.log('TURN REST API on :8080'));
部署後,瀏覽器端 Selkies 會先打 /turn-cred
拿臨時帳號密碼,再組成 ICE Server Config。
chrome://webrtc-internals
about:webrtc
開啟 Selkies 提供的 URL。
在 webrtc-internals
觀察:
succeeded
。relay
→ 表示流量確實經由 TURN。srflx
(STUN)或 host
。檢查位元率與延遲:
googFrameRateSent
、googRtt
、bytesSent/Received
。俺は誰?ここはどこ?俺は何をしている?