RustDesk self hosted setup — hướng dẫn Docker đầy đủ + Caddy TLS

Bạn đang cố tự lưu trữ RustDesk nhưng gặp cùng các trở ngại: NAT và tường lửa, các thành phần máy chủ khó hiểu, và câu hỏi liệu có cần TLS bên cạnh mã hóa của RustDesk. Hướng dẫn này dẫn bạn qua một thiết lập rustdesk tự lưu trữ hoàn chỉnh trên một VPS — Docker Compose cho hbbs/hbbr và TLS bằng Caddy.
You're trying to self-host RustDesk but keep hitting the same blockers: NAT and firewalls, confusing server components, and the nagging question of whether you need TLS on top of RustDesk's own encryption. This guide walks a technically minded reader through a complete, reproducible rustdesk self hosted setup on a single VPS — Docker Compose for hbbs/hbbr, and TLS fronting using Caddy so clients can connect on 443 from restrictive networks.
Những gì chúng ta đang xây dựng và vì sao
Mục tiêu: một rendezvous + relay trên một VPS duy nhất mà máy khách trỏ tới bằng tên DNS. Các thành phần liên quan:
- rustdesk server components (hbbs and hbbr) running in Docker — tested here with rustdesk-server v1.2.1 images.
- Caddy v2 (certificate management via Let's Encrypt) to provide a TLS front door on port 443 so clients can reach your relay even when outbound 21115 is blocked.
- Optional UDP passthrough or additional relays for scale (covered in notes).
Tại sao làm vậy? RustDesk’s protocol đã cung cấp mã hóa đầu-cuối cho phiên desktop, nhưng nhiều mạng chỉ cho phép outbound 443/80. Terminate TLS tại VPS của bạn (và để Caddy lấy/tuỳ tự gia hạn chứng chỉ) là cách thực tế để làm dịch vụ có thể truy cập được mà không phải mở các cổng không chuẩn. Nếu bạn chỉ cần truy cập LAN hoặc điều khiển NAT bằng reverse tunnels, xem bài viết của chúng tôi về remote-desktop-without-port-forwarding.
Yêu cầu trước và lựa chọn
Những thứ tôi đã dùng khi viết hướng dẫn này:
- Ubuntu 22.04 LTS trên một VPS công cộng (1 vCPU / 2 GB RAM đủ cho thử nghiệm; với nhiều máy khách thì nâng lên 4+ CPU và theo dõi CPU/RAM).
- Docker 24.x và Docker Compose v2 (cú pháp CLI compose V2).
- rustdesk-server Docker image (tag v1.2.1 trong hướng dẫn này) — điều chỉnh nếu có bản ổn định mới hơn.
- Caddy v2.6+ (ACME tự động của Caddy giúp việc gia hạn chứng chỉ trở nên đơn giản).
- Một bản ghi DNS A như rustdesk.example.com trỏ tới IP công cộng VPS của bạn, và cho phép các cổng 80/443 (Caddy cần 80/443 để xác thực).
Ghi chú khi sản phẩm thương mại host có thể phù hợp hơn: nếu bạn cần SLA cấp doanh nghiệp, auditing phiên nâng cao, hoặc hỗ trợ thương mại, TeamViewer/AnyDesk có thể là lựa chọn tốt hơn — xem rustdesk-vs-anydesk và các bài so sánh giá của chúng tôi. Tự lưu trữ phù hợp khi bạn muốn kiểm soát, chi phí định kỳ thấp hơn, hoặc tránh máy chủ bên thứ ba.
Bước 1 — Triển khai rustdesk server bằng Docker Compose
Tạo một thư mục dự án trên VPS và thả file docker-compose.yml bên dưới. Ví dụ này mở các cổng điển hình của RustDesk ra host. Thay các biến môi trường và tag image cho phù hợp môi trường của bạn.
mkdir -p ~/rustdesk-server
cd ~/rustdesk-server
cat > docker-compose.yml <<'EOF'
version: '3.8'
services:
rustdesk-server:
image: rustdesk/rustdesk-server:1.2.1
container_name: rustdesk-server
restart: unless-stopped
ports:
- "21115:21115/tcp" # rendezvous / TCP relay
- "21115:21115/udp" # optional UDP relay (if your image supports it)
- "21116:21116/udp" # additional UDP (some builds use multiple UDP ports)
volumes:
- ./data:/root/.config/rustdesk-server
environment:
- RUSTDESK_RELAY_IPV4=0.0.0.0
- RUSTDESK_RELAY_PORT=21115
EOF
Khởi chạy:
docker compose up -d # watch logs docker compose logs -f rustdesk-server
Xác nhận container đã khởi và lắng nghe trên 21115. Trên VPS của bạn chạy:
ss -tuln | grep 21115
Nếu image bạn dùng lộ các cổng khác hoặc có kiểu cấu hình khác, hãy tham khảo README của image đó. Một số người vận hành biên dịch hbbs/hbbr thủ công và dùng cổng tùy chỉnh; điều chỉnh các bước tương ứng.
Bước 2 — Dùng Caddy để đặt TLS lên trên relay (443)
Có hai mô hình phổ biến để làm RustDesk có thể truy cập trên 443:
- TCP TLS termination with Caddy 2.6+ (Caddy terminates TLS and forwards raw TCP to the rustdesk relay). Caddy added improved TCP features in v2.6; if you use that approach, you get automatic ACME certificates and renewals.
- Let Caddy manage certificates only, and use a TCP proxy (stunnel, HAProxy, or Nginx stream) to consume those cert files. This is a fallback if your Caddy version or environment doesn't support the TCP proxy features you need.
Dưới đây là một cấu hình Caddy tối thiểu, thực dụng để Caddy đảm nhiệm TLS trên cổng 443 và chuyển tiếp kết nối TCP thô tới RustDesk relay tại localhost:21115. Điều này yêu cầu Caddy v2.6+ (kiểm tra bằng caddy version).
# Caddyfile (save as ./Caddyfile in the same folder as docker-compose.yml)
rustdesk.example.com:443 {
# Caddy will obtain/renew certificates automatically
reverse_proxy 127.0.0.1:21115 {
# Use plain TCP transport; Caddy will accept TLS from clients and connect to the backend via TCP
transport http {
# We don't speak HTTP to the backend; keep minimal transport settings
}
}
}
Đoạn docker-compose để chạy Caddy cạnh rustdesk server (cùng project):
cat >> docker-compose.yml <<'EOF'
caddy:
image: caddy:2.6.4
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
EOF
docker compose up -d caddy
Cảnh báo quan trọng: reverse_proxy tích hợp của Caddy hướng tới HTTP, vì vậy hành vi khi proxy các kết nối TCP thô không phải HTTP phụ thuộc vào phiên bản Caddy và các tuỳ chọn transport. Trong thực tế nhiều người vận hành dùng các tính năng proxy TCP của Caddy được giới thiệu trong 2.6 để terminate TLS cho các backend TCP tuỳ ý. Nếu gặp vấn đề giao thức, dùng phương án (2) ở trên: để Caddy quản lý chứng chỉ và chuyển file chứng chỉ đó cho một lớp TLS TCP nhỏ (stunnel hoặc HAProxy stream) rồi proxy TCP thô tới rustdesk.
Ví dụ: Caddy làm cert manager + stunnel để terminate TLS (tổng quan nhanh).
# 1) Ensure Caddy is running and has issued certs for rustdesk.example.com # 2) Copy cert/key from Caddy storage into a place stunnel can read, or mount the same volume. # 3) Run stunnel with a config that points TLS 443 -> 127.0.0.1:21115 # stunnel.conf snippet [rustdesk] accept = 443 connect = 127.0.0.1:21115 cert = /etc/stunnel/fullchain.pem key = /etc/stunnel/privkey.pem # In Docker world, mount Caddy's certificate files into the stunnel container path above.
Một trong hai cách trên sẽ cung cấp cho bạn một hostname (rustdesk.example.com) và cổng 443 cho máy khách. Kiểm tra kết nối từ máy khác bằng: nc -vz rustdesk.example.com 443 — bạn sẽ thiết lập được TLS handshake nếu Caddy/stunnel cấu hình đúng.
Bước 3 — Trỏ máy khách tới máy chủ tự lưu trữ của bạn
RustDesk clients cho phép chỉ định ID/relay server tuỳ chỉnh trong cài đặt. Giao diện chính xác khác nhau theo nền tảng và phiên bản, nhưng các giá trị thiết yếu là:
- ID Server / Rendezvous: rustdesk.example.com:443 (or your domain and port)
- Relay Server: rustdesk.example.com:443
Trên Windows: Mở RustDesk > Settings > ID/Server và đặt Id server và Relay server thành rustdesk.example.com:443. Trên Linux và macOS các cài đặt tương tự có trong Preferences. Với cài đặt headless, client đôi khi có thể nhận flag dòng lệnh hoặc file cấu hình — kiểm tra repo của client để biết chi tiết.
Đảm bảo máy khách mới (1.2.x hoặc mới hơn tại thời điểm viết). Các client mới hơn có sửa lỗi giao thức và cải thiện NAT traversal. Nếu dùng client cũ hơn nhiều, hành vi có thể khác nhau.
Gỡ lỗi và củng cố bảo mật
Các vấn đề thường gặp và cách gỡ lỗi:
- Firewall: xác nhận firewall của VPS (ufw/iptables/cloud provider) cho phép inbound 80/443. Đối với container RustDesk server lắng nghe trên 21115 cục bộ, đảm bảo socket TCP tồn tại (ss/netstat).
- Certificate issuance: if Let's Encrypt can't validate, Caddy will log an error. Confirm your DNS A record points to the VPS and that port 80 is reachable during initial issuance.
- Protocol mismatch: if you see TLS handshake success but connection failures from the client, you may be proxying HTTP-only with Caddy by mistake. Use the stunnel approach in those cases.
- UDP relay: RustDesk performance improves with UDP for screen frames; if UDP is needed and your network path blocks UDP, you’ll fall back to TCP relay. Expose/forward the UDP ports only if you control your network and know what you’re doing.
Mẹo củng cố bảo mật:
- Chạy rustdesk server dưới một user không có đặc quyền riêng và giữ các Docker image luôn cập nhật.
- Kích hoạt fail2ban hoặc công cụ tương tự để giới hạn các kết nối thất bại lặp lại, và giám sát logs (
docker compose logs -f rustdesk-server). - Sao lưu định kỳ thư mục dữ liệu của rustdesk server (trong ví dụ là ./data).
- Xem xét chạy relay phía sau mạng riêng hoặc VPC nếu bạn vận hành nhiều relay.
Ghi chú về scale: Một relay đơn phù hợp cho nhóm nhỏ. Với triển khai lớn hơn, chạy nhiều tiến trình hbbr trên các máy riêng biệt và dùng DNS load-balancing hoặc L4 load balancer thực sự. Nếu bạn cần các tính năng doanh nghiệp tập trung như auditing, đó là lúc giải pháp thương mại có ưu thế. Xem các bài của chúng tôi về self-hosted-remote-desktop và rustdesk-vs-anydesk để đánh đổi.
Bảo trì, chi phí và khuyến nghị cuối
Chi phí vận hành chủ yếu là phí VPS và thời gian của bạn. Một VPS nhỏ điển hình (1–2 CPU, 2–4 GB) có thể tìm được với $5–10/month (DigitalOcean, Vultr, Hetzner). Caddy và RustDesk server là mã nguồn mở; chi phí định kỳ chính là hosting. Nếu bạn cần billing giao diện GUI hoặc hỗ trợ doanh nghiệp, các nhà cung cấp thương mại tính phí theo seat hoặc phiên — xem so sánh giá của chúng tôi như anydesk-pricing-explained và godeskflow-vs-teamviewer-pricing để biết bối cảnh.
Khuyến nghị:
- Bắt đầu với một VPS đơn và layout Docker Compose ở trên. Kiểm tra kết nối từ đúng các mạng mà người dùng của bạn sẽ dùng (ISP gia đình, tường lửa công ty).
- Nếu máy khách thường ở sau tường lửa rất hạn chế, đặt relay trên 443 và xác thực TLS termination hoạt động ổn định; dùng Caddy+stunnel nếu proxy TCP chỉ bằng Caddy gây sự cố.
- Tự động hóa sao lưu thư mục dữ liệu server và theo dõi cập nhật image. RustDesk server thay đổi; thử nâng cấp trong môi trường staging nếu bạn phụ thuộc vào thời gian hoạt động production.
Nếu bạn muốn một hướng dẫn ngắn hơn về các mô hình truy cập từ xa hoặc các phương án thay thế, đọc các bài liên quan: remote-access-setup-guide và remote-desktop-security.
Đã đọc xong? Nếu bạn muốn thử một remote desktop hoàn toàn mã nguồn mở tích hợp tốt với self-hosting, tải GoDesk hoặc so sánh giá của nó — xem GoDesk download và GoDesk pricing. Nếu bạn sẵn sàng triển khai thiết lập RustDesk này, bắt đầu bằng việc tạo docker-compose.yml và Caddyfile ở trên và chạy docker compose up -d. Để bắt đầu nhanh, vào /download để lấy client và kết nối.