Table of Contents
- Troubleshooting
- Device Status Issues
- Connection Issues
- "Failed to secure TCP: deadline has elapsed"
- Relay Connections Fail
- "client sent an HTTP request to an HTTPS server"
- Web Console Issues
- 0 Devices in Panel but Dashboard Shows Count
- Users Page Returns 401
- Password Change Shows "Password is Required"
- Login Page Redirects in Loop
- Installation Issues
- get_public_ip: command not found
- PostgreSQL Config Lost After Update
- Auth Database Destroyed After Update
- Password Contains $ — Service Fails
- Windows: RandomNumberGenerator::Fill Error
- Docker Issues
- Port 5000 Conflict (Single Container)
- SELinux Volume Mount Denied
- DNS Resolution Failures During Build
- Diagnostics
- RustDesk Client Session Timeout (#242)
- HTTP/HTTPS Port Confusion (#219)
- Getting Help
- See also
Troubleshooting
Common issues and their solutions.
Device Status Issues
Devices Show as Offline
Symptoms: All devices show "Offline" in the web console despite clients being connected.
Causes & Solutions:
| Cause | Solution |
|---|---|
| Go server not running | sudo systemctl restart betterdesk-server |
| Client pointing to wrong server | Verify ID Server address in client settings |
| Public key mismatch | Check id_ed25519.pub matches client config |
| Firewall blocking ports | Open 21116 TCP+UDP, 21117 TCP |
| Wrong API key | Check .api_key file matches .env API_KEY |
Devices Go Offline Intermittently
Possible causes:
- Strict NAT — Enable
--always-use-relay - Firewall timeout — Reduce
PEER_TIMEOUT_SECSor check firewall keepalive settings - Server resource exhaustion — Check CPU/memory on server
"Zombie" Devices Reappearing After Delete
This has been fixed. Signal handlers now check IsPeerSoftDeleted() — deleted devices cannot re-register. If you're seeing this, update to the latest version.
Connection Issues
"Failed to secure TCP: deadline has elapsed"
Cause: The TCP signal handler is not sending immediate responses for punch hole/relay requests.
Solutions:
- Update to the latest Go server binary
- Check TLS configuration — if using self-signed certs, ensure
--tls-apiis NOT set - Verify relay server IP:
curl http://your-server:21114/api/server-config - If server is behind NAT, set
RELAY_SERVERS=YOUR.PUBLIC.IP
Relay Connections Fail
Common causes:
| Cause | Solution |
|---|---|
| Empty UUID in relay | Update Go server to current 3.5.x |
| Private IP detected | Set RELAY_SERVERS=YOUR.PUBLIC.IP |
| Relay port blocked | Open 21117 TCP |
| Public IP detection failed | Check curl -4 ifconfig.me from server |
"client sent an HTTP request to an HTTPS server"
Cause: API port 21114 has TLS enabled (--tls-api) but Node.js console connects via HTTP.
Solution: Remove --tls-api flag, or for self-signed certs:
# Edit service file
sudo systemctl edit --full betterdesk-server
# Remove -tls-api from ExecStart
sudo systemctl restart betterdesk-server
Web Console Issues
0 Devices in Panel but Dashboard Shows Count
Cause: Missing or mismatched API key. Dashboard uses public /api/server/stats, Devices uses protected /api/peers.
Solution:
# Check API key on Go server
cat /opt/betterdesk/.api_key
# Check API key in Node.js console
grep API_KEY /opt/BetterDeskConsole/.env
# They must match. If not, copy from Go server:
cp /opt/betterdesk/.api_key /opt/BetterDeskConsole/.api_key
# Update .env
sudo systemctl restart betterdesk-console
Users Page Returns 401
Cause: Route conflict — RustDesk client API route /api/users (Bearer token) intercepting panel requests (session cookie).
Solution: Update to the current panel (3.5.x).
Password Change Shows "Password is Required"
Cause: Field name mismatch — frontend sends current_password (snake_case), backend expects currentPassword (camelCase).
Solution: Update to the current panel (3.5.x).
Login Page Redirects in Loop
Possible causes:
- Session cookie not being set (check
TRUST_PROXYsetting behind reverse proxy) - Browser blocking cookies (SameSite policy)
- Session secret changed (all sessions invalidated)
Installation Issues
get_public_ip: command not found
Cause: Diagnostics function called undefined function in older script versions.
Solution: Update betterdesk.sh to latest version. The get_public_ip() function is now defined in all scripts.
PostgreSQL Config Lost After Update
Cause: Older scripts overwrote .env with SQLite defaults during UPDATE.
Solution: Update install scripts to current 3.5.x. They preserve database configuration via preserve_database_config().
Auth Database Destroyed After Update
Cause: Older install scripts unconditionally deleted auth.db and regenerated admin password on every update.
Solution: Update to latest scripts. The fix detects existing .env as an update indicator and preserves auth.db.
Password Contains $ — Service Fails
Cause: systemd interprets $ as variable substitution in service files.
Solution: $ is now escaped to $$ in service files. Re-run the installer to regenerate service files:
sudo ./betterdesk.sh
# Choose option 3 — Repair
Windows: RandomNumberGenerator::Fill Error
Cause: `.NET 6+ static method unavailable in Windows PowerShell 5.1.
Solution: Update betterdesk.ps1 to latest version. Fixed to use RNGCryptoServiceProvider.GetBytes().
Docker Issues
Port 5000 Conflict (Single Container)
Cause: Go server reads generic PORT=5000 env var (intended for Node.js) and sets signal port to 5000.
Solution: Ensure SIGNAL_PORT=21116 is set in Go server environment:
environment:
SIGNAL_PORT: "21116"
SELinux Volume Mount Denied
Solutions:
# Option 1: Named volumes (recommended)
volumes:
betterdesk-data:
# Option 2: :z flag
volumes:
- ./data:/data:z
# Option 3: Set SELinux context
sudo chcon -Rt svirt_sandbox_file_t ./data
DNS Resolution Failures During Build
# Add DNS to Docker daemon
echo '{"dns": ["8.8.8.8", "8.8.4.4"]}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker
docker compose build --no-cache
Diagnostics
Run Full Diagnostics
sudo ./betterdesk.sh
# Choose option 8 — Diagnostics
This checks:
- Service status (systemd)
- Port availability
- Database integrity
- API key consistency
- Public IP detection
- TLS certificate validity
- Disk space
- Log errors
Manual Diagnostics
# Service status
sudo systemctl status betterdesk-server betterdesk-console
# Logs
journalctl -u betterdesk-server --since "1 hour ago" --no-pager
journalctl -u betterdesk-console --since "1 hour ago" --no-pager
# Port check
ss -tlnp | grep -E '21114|21116|21117|5000'
# API health
curl -s http://localhost:21114/api/health
# Peer count
curl -s http://localhost:21114/api/server/stats
# Public IP
curl -4 ifconfig.me
Dev Diagnostics Script
./dev_modules/diagnose_offline_status.sh
Detailed offline status diagnostics including network, DNS, and process analysis.
RustDesk Client Session Timeout (#242)
Symptoms: Desktop/mobile RustDesk clients lose server login after ~24 hours.
Solution: Update to v3.3.129+. Sessions are now DB-backed (7-day sliding, 30-day max). After updating, sign in once in each RustDesk client. Adjust TTL under Settings → Authentication → RustDesk clients.
HTTP/HTTPS Port Confusion (#219)
Symptoms: After toggling HTTP/HTTPS, Go API calls fail or hit port 21121 instead of 21114.
Cause: Shared .env uses API_PORT=21121 for the Node Client API proxy; the Go server needs GO_API_PORT=21114.
Solution: Update to latest build. Verify betterdesk-server.service includes Environment=GO_API_PORT=21114. Restart both services after toggle.
Getting Help
- Check the GitHub Issues for known problems
- Run diagnostics and include the output in your bug report
- Include Go server and Node.js console versions
- Include relevant log output (redact sensitive data)
See also
- FAQ — quick answers
- Configuration — ports and environment variables
- Panel Updates — update failures and stale banners
- Migration Guide — database migration issues
Start
Console
- Web Console
- User Management
- Organizations and RBAC
- LDAP / Active Directory
- OIDC SSO
- Client Generator
- Fleet and Policies
- Unattended Access and WoL
- Web Remote Desktop
- UX 3.5
Ops
Help
Advanced
- API Reference
- CDAP
- SDK
- Alpha Software Notice
- Desktop Clients
- MeshAgent
- Chat E2E Encryption
- Licensing
Source: docs/wiki/
Repository · Issues · Discussions · Releases · Privacy · Sponsors
Wiki source: docs/wiki/ — last sync: 2026-09-06