
Rust WebRTC P2P #11 - Nginx Config + Deploy Live on VPS
Chúng ta đưa Signaling Server từ local lên VPS thực tế → Cấu hình domain → Setup Nginx → Thiết lập HTTPS (SSL)
1. Cấu hình Domain
2. Cài đặt Nginx
- Cài đặt trên Linux (Debian / CentOS)
- Kiểm tra hoạt động:
+ Port 80 (HTTP)
+ Port 443 (HTTPS)
3. Deploy ứng dụng Rust
- Cài đặt Rust trên VPS
- Build ứng dụng
- Upload:
+ File executable
+ Thư mục config
→ Sử dụng SFTP
- Chạy server:
+ Ví dụ port 1006
+ Thiết lập biến môi trường
4. Nginx Reverse Proxy & SSL
- Tạo SSL với Cloudflare Origin Server
- Cấu hình Nginx:
+ Redirect HTTP → HTTPS
+ Reverse proxy về port 1006
- Quan trọng:
+ Cấu hình header để hỗ trợ WebSocket
→ Upgrade connection
server
{
listen 80;
server_name test-p2p.bytebuffer.co;
return 301 https://$host$request_uri;
}
server
{
client_max_body_size 20M;
listen 443 ssl;
ssl_certificate /root/ssl/bytebuffer.co/certificate.pem;
ssl_certificate_key /root/ssl/bytebuffer.co/private-key.pem;
server_name test-p2p.bytebuffer.co;
root /usr/share/nginx/bytebuffer-p2p;
index index.php index.html index.htm;
location = /call
{
proxy_pass http://127.0.0.1:10006/call;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 300s;
}
location /
{
proxy_pass http://127.0.0.1:10006/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_request_buffering off;
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}5. Test thực tế
- Test login qua domain thật
→ Kiểm tra response và log
- Test WebSocket:
→ Kết nối qua domain
→ Kiểm tra cookie authentication
6. Kết quả đạt được:
- Deploy thành công ứng dụng Rust lên VPS
- Cấu hình domain + HTTPS hoàn chỉnh
- Thiết lập reverse proxy cho WebSocket
- Sẵn sàng chạy production cho WebRTC
Bài học liên quan
Xem khóa học
Rust WebRTC P2P #1 - Giới thiệu khóa học
Chào mừng bạn đến với series Rust VoIP! Trong bài mở đầu, bạn sẽ nắm được bức tranh toàn cảnh: mục tiêu xây dựng Signaling Server bằng Rust, kiến trúc P2P (Browser ↔ Rust Server ↔ Browser), tech stack sử dụng (Axum, Tokio, WebSocket, MongoDB, JWT), và lộ trình 7 phần của toàn bộ series từ WebRTC đến CRM/Queue.
Bài 1
Rust WebRTC P2P #2 - VoIP là gì? WebRTC là gì?
Hiểu bản chất VoIP — công nghệ truyền thoại/video qua mạng IP đứng sau Skype, Zoom, Google Meet. Sau đó khám phá WebRTC — bộ tiêu chuẩn cho phép trình duyệt giao tiếp trực tiếp peer-to-peer: media đi thẳng giữa hai browser, server chỉ làm nhiệm vụ signaling duy nhất.
Bài 2
Rust WebRTC P2P #3 - SIP overview + Why choose Rust
So sánh SIP (giao thức signaling truyền thống trong telephony) với WebRTC signaling nhẹ hơn, phù hợp browser. Đi sâu vào 4 lý do chọn Rust: hiệu năng không GC pause, safety ngăn data race từ compile time (Arc, DashMap, mpsc), async mạnh mẽ với Tokio, và cơ chế bắt buộc xử lý lỗi — yếu tố sống còn khi server chịu hơn 100K cuộc gọi/ngày.
Bài 3
Rust WebRTC P2P #4 - Install Rust + RustRover + Cargo Commands
Thực hành cài đặt Rust Toolchain qua rustup.rs trên Windows/Linux/macOS và xác thực bằng rustc, cargo, rustup. Khám phá RustRover — IDE chuyên biệt giúp code Rust nhanh hơn VS Code. Làm quen 4 lệnh Cargo thiết yếu: cargo new, cargo build, cargo build --release và cargo run.
Bài 4
Rust WebRTC P2P #5 - Hello World + Tokio Runtime + Cargo.toml
Khám phá Cargo.toml — trái tim quản lý dependencies của mọi dự án Rust. Khai báo các thư viện sẽ dùng xuyên suốt khóa học: Axum, Tokio, Serde, DashMap, UUID, Log4rs, Anyhow. Cấu hình Tokio Runtime biến hàm main thành async, tận dụng thread pool xử lý hàng nghìn kết nối đồng thời. Kết thúc bằng việc chạy thành công project Hello World đầu tiên.
Bài 5
Rust WebRTC P2P #6 - Axum Server + Config Loading
Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) với Rust Trong phần 6 này: Chúng ta bắt đầu xây dựng backend → Thiết lập hệ thống cấu hình (Config) → Khởi tạo Axum HTTP Server
Bài 6
Rust WebRTC P2P #7 - MongoDB + Logging with log4rs
Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) bằng Rust Trong video 7 này: Chúng ta hoàn thiện nền tảng Signaling Server với 2 phần quan trọng: - Cấu hình MongoDB - Thiết lập hệ thống Logging với log4rs
Bài 7
Rust WebRTC P2P #8 - Create WebSocket Endpoint with Axum
WebSocket là giao thức giữ kết nối hai chiều liên tục — khác HTTP request/response. Trong signaling server, mỗi user kết nối WebSocket và giữ kết nối suốt session
Bài 8
Rust WebRTC P2P #9 - ConnectionState — Client Online management
Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) bằng Rust Trong phần 9 này: Chúng ta xây dựng một thành phần cốt lõi của Signaling Server → Quản lý trạng thái kết nối (Connection State) → Quản lý danh sách user đang online
Bài 9
Rust WebRTC P2P #10 - Message Routing — Dispatcher Pattern
Trong phần 10 này, chúng ta sẽ tiến hành chuẩn hóa cách thức trao đổi dữ liệu giữa Client và Server thông qua WebSocket bằng cách xây dựng hệ thống Message Routing và áp dụng Dispatcher Pattern.
Bài 10
Rust WebRTC P2P #12 - User Model + MongoDB Queries
Trong phần này, mình bắt đầu xây dựng Data Layer cho hệ thống, bao gồm User Model và các truy vấn MongoDB. Đây là nền tảng quan trọng để triển khai Login và Authentication cho cả REST API và WebSocket server.
Bài 12
Rust WebRTC P2P #13 - Login Service + JWT + Argon2
Trong phần 13 này, chúng ta triển khai một trong những tính năng quan trọng nhất của backend: Login Service. Mục tiêu là xây dựng cơ chế xác thực an toàn, sử dụng JWT và các tiêu chuẩn bảo mật hiện đại để bảo vệ thông tin người dùng.
Bài 13
Rust WebRTC P2P #14 - Auth Middleware HTTP + WebSocket Auth Flow
Trong phần 14 này, chúng ta thực hiện một bước rất quan trọng để bảo vệ hệ thống: xây dựng Middleware cho HTTP Server và thiết lập luồng xác thực cho WebSocket. Đây là lớp bảo vệ giúp đảm bảo chỉ những người dùng hợp lệ mới có thể truy cập API và thiết lập kết nối signaling.
Bài 14
Rust WebRTC P2P #15 - Demo Login + WebSocket Auth từ Postman
Trong phần 15 này, chúng ta thực hiện demo toàn bộ quy trình xác thực đã xây dựng ở các phần trước. Sử dụng Postman để mô phỏng client, chúng ta sẽ kiểm tra cách server xử lý token thông qua cả HTTP và WebSocket.
Bài 15
Rust WebRTC P2P #16 - State Pattern — P2PCallStateHandler Trait
Trong phần 16 này, chúng ta đi vào một thành phần rất quan trọng trong kiến trúc của signaling server: State Pattern. Đây là phần “trái tim” giúp điều khiển toàn bộ luồng xử lý của một cuộc gọi, từ lúc bắt đầu cho đến khi kết thúc.
Bài 16
Rust WebRTC P2P #17 - CallActor - Event Loop + Timer Management
Trong phần 17 này, chúng ta thiết kế một thành phần rất quan trọng trong hệ thống: CallActor (Connector). Đây là nơi tiếp nhận toàn bộ sự kiện của cuộc gọi, quản lý timer và điều phối logic xử lý, đóng vai trò như “bộ não” của signaling server.
Bài 17
Rust WebRTC P2P #18 - CallSupervisor - Call lifetime management
Trong phần này, chúng ta xây dựng CallSupervisor – thành phần quản lý trung tâm chịu trách nhiệm điều phối và quản lý vòng đời của các cuộc gọi trong hệ thống signaling server. Đây là lớp giúp hệ thống kiểm soát tài nguyên, điều phối message và đảm bảo hoạt động ổn định khi có nhiều cuộc gọi đồng thời.
Bài 18
Rust WebRTC P2P #19 - P2P Architecture + Offer/Answer/ICE Overview
Trong phần 19 này, chúng ta sẽ tạm dừng việc viết code để cùng nhìn lại một cách chi tiết và hệ thống nhất về kiến trúc P2P thực tế mà chúng ta đang xây dựng. Video này sẽ giúp bạn hình dung rõ nét cách các bản tin Offer, Answer và ICE Candidate di chuyển qua lại giữa Caller, Callee và Rust Signaling Server
Bài 19
Rust WebRTC P2P #20 - SDP Detail — ipv4, Port, Codec
Trong phần 20 này, chúng ta sẽ đi sâu vào "trái tim" của quá trình Signaling: SDP (Session Description Protocol). Đây là bản tin mô tả phiên làm việc giúp hai trình duyệt hiểu được nhau về mặt kỹ thuật, từ loại dữ liệu truyền tải cho đến các chuẩn nén âm thanh
Bài 20
Rust WebRTC P2P #21 - ICE Candidate — STUN/TURN/coTURN
Trong phần 21 này, chúng ta tìm hiểu về ICE Candidate – thành phần giúp hai trình duyệt thực sự kết nối được với nhau trong môi trường thực tế. Nếu SDP là bản thỏa thuận, thì ICE Candidate chính là “tọa độ mạng” giúp các peer vượt qua NAT và firewall.
Bài 21
Rust WebRTC P2P #22 - Chrome webrtc-internals + Firefox about:webrtc
Trong phần 22 này, chúng ta sẽ tạm rời xa code để làm quen với những công cụ debug cực kỳ quan trọng giúp bạn kiểm tra và giám sát kết nối WebRTC trực tiếp trên trình duyệt. Đây là bước không thể thiếu để xác định Signaling Server hoạt động đúng hay chưa và liệu luồng media đã được thiết lập thành công hay chưa.
Bài 22