Pengaturan RustDesk self-hosted — panduan lengkap Docker + Caddy TLS

Anda mencoba menjalankan RustDesk secara self-hosted tetapi terus menemui hambatan yang sama: NAT dan firewall, komponen server yang membingungkan, dan pertanyaan apakah Anda perlu TLS di atas enkripsi RustDesk. Panduan ini mengarahkan pembaca teknis melalui setup lengkap...
Anda mencoba menjalankan RustDesk secara self-hosted tetapi terus menemui hambatan yang sama: NAT dan firewall, komponen server yang membingungkan, dan pertanyaan mengganggu apakah Anda membutuhkan TLS di atas enkripsi RustDesk sendiri. Panduan ini membimbing pembaca teknis melalui pengaturan RustDesk self-hosted lengkap dan dapat direproduksi pada satu VPS — Docker Compose untuk hbbs/hbbr, dan TLS melalui Caddy sehingga klien dapat terhubung lewat 443 dari jaringan yang ketat.
Apa yang akan kita bangun dan alasannya
Tujuan: sebuah rendezvous + relay RustDesk pada satu VPS yang klien Anda arahkan dengan nama DNS. Komponen yang terlibat:
- Komponen server RustDesk (hbbs dan hbbr) berjalan di Docker — diuji di sini dengan image rustdesk-server v1.2.1.
- Caddy v2 (manajemen sertifikat via Let's Encrypt) untuk menyediakan pintu masuk TLS pada port 443 sehingga klien dapat menjangkau relay Anda meskipun outbound 21115 diblokir.
- Opsional passthrough UDP atau relay tambahan untuk skala (ditutup di catatan).
Mengapa melakukan ini? Protokol RustDesk sudah menyediakan enkripsi end-to-end untuk sesi desktop, tetapi banyak jaringan hanya mengizinkan outbound 443/80. Mengakhiri TLS di VPS Anda (dan membiarkan Caddy memperoleh serta memperbarui sertifikat secara otomatis) adalah cara praktis agar layanan dapat dijangkau tanpa membuka port nonstandar. Jika Anda hanya ingin akses LAN atau mengatasi NAT dengan reverse tunnel, lihat artikel kami tentang remote-desktop-without-port-forwarding.
Prasyarat dan pilihan
Yang saya gunakan saat menulis ini:
- Ubuntu 22.04 LTS pada VPS publik (1 vCPU / 2 GB RAM cukup untuk uji; untuk banyak klien tingkatkan ke 4+ CPU dan pantau CPU/RAM).
- Docker 24.x dan Docker Compose v2 (sintaks CLI compose V2).
- Image Docker rustdesk-server (tag v1.2.1 di panduan ini) — sesuaikan jika ada rilis stabil yang lebih baru.
- Caddy v2.6+ (ACME otomatis Caddy membuat pembaruan sertifikat menjadi mudah).
- Sebuah record DNS A seperti rustdesk.example.com yang mengarah ke IP publik VPS Anda, dan port 80/443 diizinkan (Caddy membutuhkan 80/443 untuk validasi).
Catatan kapan produk komersial terhost lebih cocok: jika Anda membutuhkan SLA tingkat enterprise, auditing sesi lanjutan, atau dukungan komersial, TeamViewer/AnyDesk mungkin lebih sesuai — lihat rustdesk-vs-anydesk dan tulisan perbandingan harga kami. Self-hosting terbaik ketika Anda menginginkan kontrol, biaya berulang lebih rendah, atau menghindari server pihak ketiga.
Langkah 1 — Deploy server RustDesk dengan Docker Compose
Buat direktori proyek di VPS dan letakkan docker-compose.yml di sana. Contoh ini mengekspos port server RustDesk yang umum ke host. Ganti variabel lingkungan dan tag image sesuai lingkungan Anda.
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
Jalankan:
docker compose up -d # watch logs docker compose logs -f rustdesk-server
Pastikan container sudah berjalan dan mendengarkan pada 21115. Di VPS Anda jalankan:
ss -tuln | grep 21115
Jika image yang Anda gunakan mengekspos port berbeda atau memiliki gaya konfigurasi berbeda, baca README image tersebut. Beberapa operator menyusun hbbs/hbbr secara manual dan menggunakan port kustom; sesuaikan langkah-langkah ini jika perlu.
Langkah 2 — Gunakan Caddy untuk menambahkan TLS di atas relay (443)
Ada dua pola umum untuk membuat RustDesk dapat dijangkau melalui 443:
- Terminasi TLS TCP dengan Caddy 2.6+ (Caddy mengakhiri TLS dan meneruskan TCP mentah ke relay RustDesk). Caddy menambahkan fitur TCP yang ditingkatkan di v2.6; jika Anda menggunakan pendekatan ini, Anda mendapatkan sertifikat ACME otomatis dan pembaruan.
- Biarkan Caddy mengelola sertifikat saja, dan gunakan proxy TCP (stunnel, HAProxy, atau Nginx stream) untuk memakai file sertifikat tersebut. Ini adalah alternatif jika versi Caddy atau lingkungan Anda tidak mendukung fitur proxy TCP yang Anda butuhkan.
Di bawah ini adalah konfigurasi Caddy minimal dan pragmatis yang menggunakan Caddy untuk TLS pada port 443 dan meneruskan koneksi TCP mentah ke relay RustDesk di localhost:21115. Ini membutuhkan Caddy v2.6+ (periksa dengan 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
}
}
}
Potongan docker-compose untuk menjalankan Caddy berdampingan dengan server RustDesk (proyek yang sama):
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
Kaveat penting: reverse_proxy bawaan Caddy berorientasi HTTP, sehingga perilaku saat memproxy TCP mentah non-HTTP bergantung pada versi Caddy dan opsi transport. Dalam praktiknya banyak operator menggunakan fitur proxying TCP Caddy yang diperkenalkan di 2.6 untuk mengakhiri TLS bagi backend TCP arbitrary. Jika Anda menemui masalah protokol, gunakan opsi (2) di atas: biarkan Caddy menangani sertifikat dan serahkan file sertifikat ke lapisan TLS TCP kecil (stunnel atau HAProxy stream) yang kemudian memproxy TCP biasa ke rustdesk.
Contoh: Caddy sebagai manajer sertifikat + stunnel untuk terminasi TLS (gambaran cepat).
# 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.
Salah satu pendekatan memberi Anda hostname (rustdesk.example.com) dan port 443 untuk klien. Uji konektivitas dari mesin lain dengan: nc -vz rustdesk.example.com 443 — Anda seharusnya membangun handshake TLS jika Caddy/stunnel dikonfigurasi dengan benar.
Langkah 3 — Arahkan klien ke server self-hosted Anda
Klien RustDesk mengizinkan server ID/relay kustom di pengaturan. UI tepatnya bervariasi menurut platform dan versi, tetapi nilai pentingnya adalah:
- ID Server / Rendezvous: rustdesk.example.com:443 (atau domain dan port Anda)
- Relay Server: rustdesk.example.com:443
Di Windows: buka RustDesk > Settings > ID/Server dan atur Id server dan Relay server ke rustdesk.example.com:443. Di Linux dan macOS pengaturan yang sama ada di Preferences. Untuk instalasi headless, klien terkadang dapat diberi flag baris perintah atau file konfigurasi — periksa repo klien untuk detail.
Pastikan klien terbaru (1.2.x atau lebih baru pada saat penulisan). Klien yang lebih baru menyertakan perbaikan protokol dan NAT traversal yang lebih baik. Jika Anda mencoba menggunakan klien yang jauh lebih lama, perilaku bisa berbeda.
Pemecahan masalah dan pengamanan
Masalah umum dan cara debug:
- Firewall: pastikan firewall VPS (ufw/iptables/provider cloud) mengizinkan inbound 80/443. Untuk container server RustDesk yang mendengarkan di 21115 secara lokal, pastikan socket TCP ada (ss/netstat).
- Penerbitan sertifikat: jika Let's Encrypt tidak dapat memvalidasi, Caddy akan mencatat error. Pastikan record DNS A Anda mengarah ke VPS dan port 80 dapat dijangkau selama penerbitan awal.
- Ketidakcocokan protokol: jika Anda melihat handshake TLS berhasil tetapi koneksi gagal dari klien, kemungkinan Anda memproxy hanya HTTP dengan Caddy secara tidak sengaja. Gunakan pendekatan stunnel dalam kasus tersebut.
- UDP relay: performa RustDesk membaik dengan UDP untuk frame layar; jika UDP diperlukan dan jalur jaringan Anda memblokir UDP, Anda akan fallback ke relay TCP. Ekspos/forward port UDP hanya jika Anda mengendalikan jaringan dan tahu apa yang Anda lakukan.
Tips pengamanan:
- Jalankan server rustdesk di bawah pengguna tidak-privileg (unprivileged) terdedikasi dan perbarui image Docker secara berkala.
- Aktifkan fail2ban atau sejenisnya untuk membatasi percobaan koneksi gagal berulang, dan pantau log (
docker compose logs -f rustdesk-server). - Cadangkan direktori data server rustdesk Anda (dalam contoh adalah ./data) secara berkala.
- Pertimbangkan menjalankan relay di belakang jaringan privat atau VPC jika Anda mengoperasikan beberapa relay.
Catatan skala: Satu relay cukup untuk tim kecil. Untuk deployment lebih besar, jalankan beberapa proses hbbr di mesin terpisah dan gunakan load-balancing DNS atau load balancer L4 yang tepat. Jika Anda membutuhkan fitur enterprise terpusat seperti auditing, solusi komersial mungkin memiliki keunggulan. Lihat tulisan kami tentang self-hosted-remote-desktop dan rustdesk-vs-anydesk untuk pertimbangan lebih lanjut.
Pemeliharaan, biaya, dan rekomendasi akhir
Biaya operasional sebagian besar adalah biaya VPS dan waktu Anda. VPS kecil tipikal (1–2 CPU, 2–4 GB) dapat ditemukan sekitar $5–10/month (DigitalOcean, Vultr, Hetzner). Caddy dan RustDesk server bersifat open-source; biaya berulang utama adalah hosting. Jika Anda membutuhkan penagihan berbasis GUI atau dukungan enterprise, vendor komersial mengenakan biaya per-seat atau per-session — lihat perbandingan harga kami seperti anydesk-pricing-explained dan godeskflow-vs-teamviewer-pricing untuk konteks.
Rekomendasi:
- Mulai dengan satu VPS dan layout Docker Compose di atas. Uji koneksi dari jaringan yang sama persis dengan yang akan digunakan pengguna Anda (ISP rumahan, firewall korporat).
- Jika klien sering berada di balik firewall yang sangat ketat, letakkan relay Anda di 443 dan verifikasi terminasi TLS bekerja andal; gunakan Caddy+stunnel jika proxying TCP-only oleh Caddy menimbulkan masalah.
- Otomatiskan cadangan direktori data server dan catat upgrade image. Rilis server RustDesk bergerak; uji upgrade di staging jika Anda bergantung pada uptime produksi.
Jika Anda ingin panduan yang lebih singkat untuk pola akses jarak jauh atau alternatif, baca artikel terkait kami: remote-access-setup-guide dan remote-desktop-security.
Selesai membaca? Jika Anda ingin mencoba remote desktop sepenuhnya open-source yang mudah diintegrasikan dengan self-hosting, unduh GoDesk atau bandingkan harganya — lihat GoDesk download dan GoDesk pricing. Jika Anda siap menerapkan setup RustDesk ini, mulai dengan membuat docker-compose.yml dan Caddyfile di atas lalu jalankan docker compose up -d. Untuk memulai cepat, kunjungi /download untuk mengambil klien dan mulai terhubung.