Repository navigation
FAQ
Frequently asked questions about BetterDesk.
BetterDesk is a complete RustDesk-compatible remote desktop infrastructure. It replaces the original RustDesk hbbs + hbbr servers with a single Go binary, adds a Node.js web management console, desktop clients, and an IoT device management protocol (CDAP).
Yes. BetterDesk is fully compatible with standard RustDesk desktop and mobile clients. No custom client required — just point your existing RustDesk client to your BetterDesk server.
Tested baseline: RustDesk 1.4.7+ (TOTP email_check / tfa_check, address-book personal probe). 1.4.9 is supported for login, address book, groups, and remote sessions. Richer connection-audit fields from 1.4.9 (controller user attribution, primary auth / 2FA method) are accepted safely but not yet shown in the panel — see the server compatibility notes in docs/RDCLIENT_VS_RUSTDESK_AUDIT.md.
BetterDesk is an independent, open-source project that provides features beyond the RustDesk OSS server:
- Web management console with dashboard
- RBAC with 6–7 server roles + organizations and 28 granular permissions
- TOTP 2FA
- E2E encrypted chat
- Browser-based remote desktop
- Device metrics and monitoring
- CDAP IoT protocol
- PostgreSQL support
- Docker single-container deployment
- Optional UX 3.5 console shell
Yes. BetterDesk is licensed under AGPL-3.0. You may use it freely; if you modify and run it as a network service, AGPL copyleft applies to those modifications. Sponsors at $50/month+ on GitHub Sponsors may qualify for an optional Commercial Grant for private deployment patches — see Licensing.
- CPU: 1 core (2+ recommended)
- RAM: 512 MB (2 GB recommended)
- Disk: 1 GB
- OS: Ubuntu 20.04+, Debian 11+, CentOS 8+, Windows 10/11, or Docker
| Port | Protocol | Required |
|---|---|---|
| 21116 | TCP + UDP | ✅ Signal server |
| 21117 | TCP | ✅ Relay server |
| 21114 | TCP | |
| 21115 | TCP | |
| 21118 | TCP | Optional (WS signal) |
| 21119 | TCP | Optional (WS relay) |
| 21121 | TCP | ✅ Client API (if clients login) |
| 5000 | TCP | ✅ Web console |
| 21122 | TCP | Optional (CDAP gateway) |
Yes, but the relay server IP must be public (or port-forwarded). Set RELAY_SERVERS=YOUR.PUBLIC.IP if auto-detection fails.
Yes. The Go server compiles for linux/arm64:
GOARCH=arm64 go build -o betterdesk-server-linux-arm64 .Docker images are also built for linux/arm64.
# Linux
sudo ./betterdesk.sh # Choose option 6
# Windows
.\betterdesk.ps1 # Choose option 6
# Manual
cd /opt/BetterDeskConsole && node reset-password.jssudo ./betterdesk.sh
# Choose option M → SQLite to PostgreSQLOr manually:
./tools/migrate/migrate-linux-amd64 -mode sqlite2pg \
-src db_v2.sqlite3 \
-dst "postgres://user:pass@localhost:5432/betterdesk"Then update .env:
DB_TYPE=postgresql
DATABASE_URL=postgres://user:pass@localhost:5432/betterdesksudo ./betterdesk.sh
# Choose option C — SSL ConfigurationSee TLS / SSL Certificates for details.
Yes. See External Reverse Proxy Guide and Configuration for Nginx/Caddy examples. Set TRUST_PROXY=Y (or 1) in .env and HOST=127.0.0.1 when TLS terminates at the proxy.
Most common causes:
- Firewall blocking ports 21116/21117
- Wrong server address in client config
- Public key mismatch
- Go server not running
Run diagnostics: sudo ./betterdesk.sh → option 8.
From the web console:
- Click the kebab menu (⋮) on the device
- Select Rename
- Enter new ID (6-16 characters, alphanumeric + dash/underscore)
Via API:
curl -X POST http://server:21114/api/peers/OLD_ID/change-id \
-H "X-API-Key: your-key" \
-H "Content-Type: application/json" \
-d '{"new_id": "NEW_ID"}'Soft-delete (default Delete in the console): the device is hidden and filtered from lists, but its ID stays reserved. The client cannot re-register with that ID until you restore or permanently delete the record. The row remains in the database for audit purposes.
To bring the same device back: enable Show deleted devices → kebab menu → Restore.
To free the ID for a fresh registration (e.g. after wiping the client config): enable Show deleted devices → kebab menu → Permanently delete, then restart the RustDesk client. You can also check Permanently delete (release ID) in the delete dialog.
With ?revoke=true (or the Revoke checkbox): additionally blocks the device ID and disconnects active sessions. That ID cannot reconnect until it is unblocked.
The device must have a known MAC address. From the web console, click the kebab menu → Wake on LAN on an offline device. Or via API:
curl -X POST http://server:21114/api/peers/DEVICE_ID/wol \
-H "X-API-Key: your-key" \
-d '{"mac": "AA:BB:CC:DD:EE:FF"}'WOL sends a UDP magic packet on broadcast (255.255.255.255:9). Only works on the same LAN segment as the server.
Yes, at multiple layers:
- NaCl encryption — Signal protocol uses Ed25519 key exchange
- E2E encryption — Peer-to-peer traffic is encrypted end-to-end
- TLS — Optional TLS wrapping for all TCP connections
- Chat E2E — ECDH P-256 + AES-256-GCM for chat messages
No. The relay server performs blind io.Copy between two TCP connections. Peers negotiate E2E encryption through the signal channel — the server cannot decrypt the video/audio/input stream.
- User passwords: bcrypt with automatic salt
- Device passwords: bcrypt via access policies
- API keys: stored as plaintext in
.api_keyfile
Yes. TOTP (Time-based One-Time Password) compatible with Google Authenticator, Authy, etc. See User Management.
Depends on server resources:
- 100 devices: 1 CPU, 512 MB RAM
- 1,000 devices: 2 CPUs, 2 GB RAM
- 10,000+ devices: 4+ CPUs, 4+ GB RAM, PostgreSQL recommended
The relay proxies peer-to-peer traffic via io.Copy. Each active remote desktop session uses 1-10 Mbps depending on resolution and quality settings. Idle/registered devices use minimal bandwidth (heartbeat only).
- SQLite — Good for up to ~1,000 devices. Zero configuration, single file.
-
PostgreSQL — Recommended for 1,000+ devices. Better concurrent access,
LISTEN/NOTIFYfor multi-instance, connection pooling.
No. Current panel updates (Settings → Updates or betterdesk.sh option 2) keep your data in place:
- Database files (
db_v2.sqlite3on fresh installs; legacyauth.dbonly if you still use SQLite auth legacy mode) - PostgreSQL configuration
- SSL certificates
- API keys and admin credentials
Native install:
git pull
sudo ./betterdesk.sh # Choose option 2 — UpdateOr use Settings → Updates in the web panel (recommended — includes backup and preflight checks). See Panel Updates.
Docker (GHCR images):
docker compose pull && docker compose up -dCreate a backup before updating (option 5), then restore from backup if needed. Database schema changes may not be backward-compatible.
Connected Device Automation Protocol — BetterDesk's WebSocket protocol for managing IoT devices, servers, and custom hardware. Provides telemetry, widget rendering, remote commands, terminal, and file management.
Only if you want to manage non-RustDesk devices (sensors, servers, industrial equipment). Standard RustDesk remote desktop works without CDAP.
Use the Python or Node.js SDK, or the native Go agent:
betterdesk-agent -server ws://your-server:21122/cdap -api-key your-keySee CDAP for the full protocol specification.
- Copy
web-nodejs/lang/en.jsontoweb-nodejs/lang/{code}.json - Translate all values
- The language auto-appears in the console
Yes! Pull requests are welcome. Follow the coding style and conventions described in the repository.
Organizations let you scope devices and users for multi-team or MSP deployments. Org admins manage members within their org; global admins manage all orgs. See Organizations and RBAC.
Yes. Configure OIDC / OAuth2 under Settings → Authentication. See OIDC SSO.
No. It is self-hosted. Fleet metrics go to your server. Update checks hit GitHub only when you run them. See Privacy.
GET http://localhost:21114/metrics (auth/allowlist). See Monitoring.
Fixed in v3.3.129+: client sessions are DB-backed (7-day sliding, 30-day max). Update the server, then sign in once in the RustDesk client. Configure TTL under Settings → Authentication → RustDesk clients.
- Troubleshooting — common fixes
- Monitoring — metrics and health
- Privacy — what leaves your network
- Unattended Access and WoL
- Licensing — AGPL and Commercial Grant
- Panel Updates — update channels (stable / dev)
Repository · Issues · Discussions · Releases · Privacy · Sponsors
Wiki source: docs/wiki/ — last sync: 2026-09-06