{"captainVersion":4,"services":{"$$cap_appname-hbbr":{"image":"rustdesk/rustdesk-server:$$cap_rustdesk_version","command":"hbbr","volumes":["$$cap_appname-data:/root"],"restart":"always","ports":["$$cap_relay_port:21117"],"caproverExtra":{"notExposeAsWebApp":"true"}},"$$cap_appname-hbbs":{"image":"rustdesk/rustdesk-server:$$cap_rustdesk_version","command":"hbbs -r $$cap_public_host:$$cap_relay_port","depends_on":["$$cap_appname-hbbr"],"environment":{"ALWAYS_USE_RELAY":"$$cap_always_use_relay"},"volumes":["$$cap_appname-data:/root"],"restart":"always","ports":["$$cap_nat_test_port:21115","$$cap_id_port:21116"],"caproverExtra":{"notExposeAsWebApp":"true"}}},"caproverOneClickApp":{"displayName":"RustDesk Server OSS","isOfficial":true,"description":"Self-hosted RustDesk OSS ID and relay server.","documentation":"https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/docker/","instructions":{"start":"Deploy RustDesk Server OSS with hbbs (ID/rendezvous) and hbbr (relay) on CapRover.\n\nThis template does not use host networking. It publishes the RustDesk TCP and UDP ports explicitly through Docker Swarm. Make sure the same ports are open in your VPS firewall or cloud security group.\n\nEnter the public DNS name or public IP clients will use as Server hostname. Do not include https:// or a port. This does not need to be added as a CapRover web app domain; it only needs to resolve to this VPS public IP because RustDesk uses direct TCP/UDP ports.","end":"RustDesk Server OSS is deployed.\n\nNext steps:\n1. Open these firewall ports on the VPS:\n - $$cap_nat_test_port/tcp\n - $$cap_id_port/tcp\n - $$cap_id_port/udp\n - $$cap_relay_port/tcp\n2. Read the server public key from the hbbs logs:\n docker logs \n Look for the line starting with \"Key:\".\n You can also copy the key file with:\n docker cp :/root/id_ed25519.pub ./id_ed25519.pub\n3. In RustDesk clients, set:\n ID server: $$cap_public_host\n Relay server: $$cap_public_host:$$cap_relay_port\n Key: the value from the \"Key:\" log line or id_ed25519.pub\n4. If direct peer connections are unreliable, redeploy with Always use relay set to Y.\n5. This template is tuned for native desktop, iOS, and Android clients. If you need RustDesk web client support later, add these extra port mappings manually:\n - hbbs: 21118/tcp -> 21118\n - hbbr: 21119/tcp -> 21119"},"variables":[{"id":"$$cap_public_host","label":"Server hostname","defaultValue":"your-domain.com","validRegex":"/^[a-zA-Z0-9.-]+$/","description":"Public DNS name or public IP used by RustDesk clients. It must point to this VPS public IP, but it does not need to be configured as a CapRover web app domain. Do not include protocol or port."},{"id":"$$cap_rustdesk_version","label":"RustDesk server version","defaultValue":"latest","validRegex":"/^([a-zA-Z0-9_.-])+$/","description":"Docker tag for rustdesk/rustdesk-server."},{"id":"$$cap_nat_test_port","label":"hbbs NAT test port","defaultValue":"21115","validRegex":"/^[0-9]+$/","description":"External TCP port mapped to hbbs 21115."},{"id":"$$cap_id_port","label":"hbbs ID port","defaultValue":"21116","validRegex":"/^[0-9]+$/","description":"External TCP and UDP port mapped to hbbs 21116."},{"id":"$$cap_relay_port","label":"hbbr relay port","defaultValue":"21117","validRegex":"/^[0-9]+$/","description":"External TCP port mapped to hbbr 21117."},{"id":"$$cap_always_use_relay","label":"Always use relay","defaultValue":"N","validRegex":"/^[YN]$/","description":"Set to Y to force RustDesk clients through hbbr relay when direct connections are unreliable."}]}}