WebRTC Server Tự Host Trên VPS Offshore
WebRTC là công nghệ nền tảng cho mọi ứng dụng realtime communication hiện đại: Google Meet, Discord, WhatsApp Web, các giải pháp video chat tự phát triển. Để chạy WebRTC ở quy mô lớn, cần các thành phần hạ tầng như STUN/TURN server (Coturn) và SFU/MCU (MediaSoup, Janus). Tự host các thành phần này trên VPS offshore Iceland của AnubizHost giúp bạn xây ứng dụng video/audio realtime riêng mà không phụ thuộc Twilio hay Agora - tiết kiệm chi phí drastically khi scale và đảm bảo data flow đi qua hạ tầng do bạn kiểm soát.
Need this done for your project?
We implement, you ship. Async, documented, done in days.
Kiến Trúc WebRTC: STUN, TURN, SFU
WebRTC cho phép browser-to-browser communication trực tiếp (peer-to-peer) cho audio, video, data channel. Trong thực tế, kết nối P2P không phải lúc nào cũng thành công do NAT và firewall, vì vậy cần các thành phần phụ trợ.
STUN server: Giúp client phát hiện public IP và type of NAT mình đang ở phía sau. Đây là bước đầu tiên để cố thiết lập kết nối P2P. STUN nhẹ, một VPS nhỏ có thể phục vụ hàng nghìn client.
TURN server: Khi P2P không thiết lập được (NAT đối xứng, firewall doanh nghiệp), TURN relay media stream qua server. Tốn bandwidth nhưng đảm bảo connectivity 100%. Khoảng 10-20% kết nối WebRTC trong môi trường thực cần TURN.
SFU (Selective Forwarding Unit): Cho phòng họp nhiều người (3+), full mesh P2P không scale được. SFU nhận stream từ mỗi người và forward cho tất cả người khác. Bandwidth scale O(N) thay vì O(N²) như mesh. MediaSoup, Janus, Jitsi Videobridge là các SFU phổ biến.
MCU (Multipoint Control Unit): Tương tự SFU nhưng MCU thực hiện composite các stream thành một stream duy nhất (mixing). Tiết kiệm bandwidth client nhưng tốn nhiều CPU server và mất tính chất per-stream control. Ít phổ biến hơn SFU hiện nay.
Kiến trúc điển hình của một video chat app: client browser → STUN/TURN (Coturn) cho NAT traversal → SFU (MediaSoup) cho phân phối stream. Toàn bộ stack chạy trên 2-3 VPS AnubizHost với chi phí dưới $50/tháng, phục vụ hàng nghìn user.
Cài Đặt Coturn TURN Server
Coturn là TURN server mã nguồn mở phổ biến nhất, hỗ trợ STUN và TURN qua UDP/TCP/TLS:
apt update && apt install -y coturn
nano /etc/turnserver.conf
Cấu hình cơ bản:
listening-port=3478
tls-listening-port=5349
external-ip=IP_PUBLIC_CUA_VPS
# Xác thực tĩnh (đơn giản, cho dev)
user=username1:password1
# Hoặc xác thực dynamic qua API (production)
use-auth-secret
static-auth-secret=STATIC_SECRET_RANDOM
realm=turn.tenmien.com
total-quota=100
bps-capacity=0
stale-nonce=600
no-loopback-peers
no-multicast-peers
cert=/etc/letsencrypt/live/turn.tenmien.com/cert.pem
pkey=/etc/letsencrypt/live/turn.tenmien.com/privkey.pem
Đối với production, dùng use-auth-secret kết hợp với REST API: server backend của bạn sinh credential temporary mỗi khi client cần TURN (TTL 24h). Cách này an toàn hơn user/pass tĩnh.
Mở firewall:
ufw allow 3478,5349/tcp
ufw allow 3478,5349/udp
ufw allow 49152:65535/udp
Range 49152-65535 dùng cho media relay. Có thể giới hạn nhỏ hơn (ví dụ 50000-55000) nếu lưu lượng thấp.
Khởi động Coturn:
systemctl enable --now coturn
Test bằng trickle-ice tool của WebRTC: nhập turn URL và credential, công cụ sẽ verify STUN/TURN hoạt động.
Triển Khai MediaSoup SFU Cho Video Conference
MediaSoup là SFU mã nguồn mở viết bằng C++ với binding Node.js, hiệu năng cực cao - một VPS 8 core có thể xử lý 500+ stream đồng thời. Cài đặt:
apt install -y nodejs npm python3 build-essential
mkdir /opt/mediasoup-server && cd /opt/mediasoup-server
npm init -y
npm install mediasoup express ws
Tạo server tối giản trong server.js:
const mediasoup = require('mediasoup');
const express = require('express');
async function startSFU() {
const worker = await mediasoup.createWorker({
rtcMinPort: 40000,
rtcMaxPort: 49999,
});
const router = await worker.createRouter({
mediaCodecs: [
{ kind: 'audio', mimeType: 'audio/opus', clockRate: 48000, channels: 2 },
{ kind: 'video', mimeType: 'video/VP8', clockRate: 90000 },
],
});
// Signaling logic via WebSocket
// (full implementation: github.com/versatica/mediasoup-demo)
}
startSFU();
Mở firewall cho range RTP 40000-49999 UDP. Coturn ở port khác (49152-65535) - nhớ không trùng port range.
MediaSoup chỉ là media layer - bạn cần viết signaling layer riêng (WebSocket recommended) để client trao đổi SDP, ICE candidate, room management. Tham khảo demo chính thức tại github.com/versatica/mediasoup-demo.
Scale: Một worker process xử lý ~150-300 producer/consumer pair. Multi-worker tận dụng tối đa CPU. Multi-server với load balancer cho phép scale ngang vô hạn - các server giao tiếp qua pipe transport hoặc plain RTP transport.
Monitoring: MediaSoup expose stats qua API. Tích hợp với Grafana để dashboard realtime: số producer, consumer, bitrate per stream, packet loss. Quan trọng để debug khi user complain chất lượng kém.
Recording: Cho phép record session bằng cách tạo plain transport, pipe ra ffmpeg và lưu mp4. Phù hợp cho meeting recording, compliance.
Related Services
Why Anubiz Host
Ready to get started?
Skip the research. Tell us what you need, and we'll scope it, implement it, and hand it back — fully documented and production-ready.