This project implements the RustDesk API using Go, and includes both a web UI and web client. RustDesk is a remote desktop software that provides self-hosted solutions.
GitHub, Google and OIDC login, supports web admin authorized loginCLI
Reset admin password
Because the server version lags behind the client version, the server does not respond to the client's secure_tcp request, causing the client to timeout.
Relevant code can be found at https://github.com/rustdesk/rustdesk/blob/master/src/client.rs#L322
if !key.is_empty() && !token.is_empty() {
// mainly for the security of token
allow_err!(secure_tcp(&mut socket, key).await);
}
As seen, when both key and token are not empty, secure_tcp is called, but the server does not respond, causing the client to timeout.
The secure_tcp code is located at https://github.com/rustdesk/rustdesk/blob/master/src/common.rs#L1203
bash
hbbs -r <relay-server-ip[:port]> -k <key>
hbbr -k <key>
For example
bash
hbbs -r <relay-server-ip[:port]> -k abc1234567
hbbr -k abc1234567
secure_tcp to return directly, then compile using Github Actions and download the compiled client.
Refer to official documentation
secure_tcp. You can download and use it directly from here
Github Actions, encrypted connection, ready to useIf encryption is not a high priority, use 1. If encryption is important, use 3 or 4.
Basic implementation of the PC client's primary interfaces.Supports the Personal version api, which can be enabled by configuring the rustdesk.personal file or the RUSTDESK_API_RUSTDESK_PERSONAL environment variable.
GitHub, Google and OIDC login, which can be used after configuration in the admin panel. See the OAuth
configuration section for details.Groups are divided into shared groups and regular groups. In shared groups, everyone can see the peers of all group members, while in regular groups, only administrators can see all members' peers.
The frontend and backend are separated to provide a user-friendly management interface, primarily for managing and displaying data.Frontend code is available at rustdesk-api-web
Admin panel URL: http://<your server[:port]>/_admin/. The default username and password for the initial
installation are admin admin, please change the password immediately.

In the top right corner, you can change the password, switch languages, and toggle between day/night mode.shared group and regular group.

GitHub, Google and OIDC are supported. You need to create an OAuth App and configure it in
the admin panel.
Google and Github, you don't need to fill the Issuer and ScpoesOIDC, you must set the Issuer. And Scopes is optional which default is openid,email,profile, please make sure this Oauth App can access sub, email and preferred_usernameGitHub OAuth App
at Settings -> Developer settings -> OAuth Apps -> New OAuth App here.Authorization callback URL to http://<your server[:port]>/api/oauth/callback,
e.g., http://127.0.0.1:21114/api/oauth/callback.
v2 Preview, accessible at /webclient2

v2 preview deployment
https on port 443, you must configure a reverse proxy. Refer to the official documentationhttp or other https ports, configure 21118 and 21119 as with v1<your server[:port]>/admin/swagger/index.html<your server[:port]>/swagger/index.html

# help
./apimain -h
./apimain reset-admin-pwd <pwd>
conf/config.yaml.gorm.type is set to sqlite, MySQL-related configurations are not required.en and zh-CN are supported. The default is zh-CN.lang: "en"
app:
web-client: 1 # web client route 1:open 0:close
register: false #register enable
gin:
api-addr: "0.0.0.0:21114"
mode: "release"
resources-path: 'resources'
trust-proxy: ""
gorm:
type: "sqlite"
max-idle-conns: 10
max-open-conns: 100
mysql:
username: "root"
password: "111111"
addr: "192.168.1.66:3308"
dbname: "rustdesk"
rustdesk:
id-server: "192.168.1.66:21116"
relay-server: "192.168.1.66:21117"
api-server: "http://192.168.1.66:21114"
key: "123456789"
personal: 1
logger:
path: "./runtime/log.txt"
level: "warn" #trace,debug,info,warn,error,fatal
report-caller: true
proxy:
enable: false
host: ""
The prefix for variable names is RUSTDESK_API. If environment variables exist, they will override the configurations in the configuration file.
| Variable Name | Description | Example |
|---|---|---|
| TZ | timezone | Asia/Shanghai |
| RUSTDESK_API_LANG | Language | en,zh-CN |
| RUSTDESK_API_APP_WEB_CLIENT | web client on/off; 1: on, 0 off, deault 1 | 1 |
| RUSTDESK_API_APP_REGISTER | register enable; true, false; default:false |
false |
| ----- ADMIN Configuration----- | ---------- | ---------- |
| RUSTDESK_API_ADMIN_TITLE | Admin Title | RustDesk Api Admin |
| RUSTDESK_API_ADMIN_HELLO | Admin welcome message, you can use html |
|
| RUSTDESK_API_ADMIN_HELLO_FILE | Admin welcome message file, will override RUSTDESK_API_ADMIN_HELLO |
./conf/admin/hello.html |
| ----- GIN Configuration ----- | --------------------------------------- | ----------------------------- |
| RUSTDESK_API_GIN_TRUST_PROXY | Trusted proxy IPs, separated by commas. | 192.168.1.2,192.168.1.3 |
| ----- GORM Configuration ----- | --------------------------------------- | ----------------------------- |
| RUSTDESK_API_GORM_TYPE | Database type (sqlite or mysql). Default is sqlite. |
sqlite |
| RUSTDESK_API_GORM_MAX_IDLE_CONNS | Maximum idle connections | 10 |
| RUSTDESK_API_GORM_MAX_OPEN_CONNS | Maximum open connections | 100 |
| RUSTDESK_API_RUSTDESK_PERSONAL | Open Personal Api 1:Enable,0:Disable | 1 |
| ----- MYSQL Configuration ----- | --------------------------------------- | ----------------------------- |
| RUSTDESK_API_MYSQL_USERNAME | MySQL username | root |
| RUSTDESK_API_MYSQL_PASSWORD | MySQL password | 111111 |
| RUSTDESK_API_MYSQL_ADDR | MySQL address | 192.168.1.66:3306 |
| RUSTDESK_API_MYSQL_DBNAME | MySQL database name | rustdesk |
| ----- RUSTDESK Configuration ----- | --------------------------------------- | ----------------------------- |
| RUSTDESK_API_RUSTDESK_ID_SERVER | Rustdesk ID server address | 192.168.1.66:21116 |
| RUSTDESK_API_RUSTDESK_RELAY_SERVER | Rustdesk relay server address | 192.168.1.66:21117 |
| RUSTDESK_API_RUSTDESK_API_SERVER | Rustdesk API server address | http://192.168.1.66:21114 |
| RUSTDESK_API_RUSTDESK_KEY | Rustdesk key | 123456789 |
| RUSTDESK_API_RUSTDESK_KEY_FILE | Rustdesk存放key的文件 | ./conf/data/id_ed25519.pub |
| ---- PROXY ----- | --------------- | ---------- |
| RUSTDESK_API_PROXY_ENABLE | proxy_enable :false, true |
false |
| RUSTDESK_API_PROXY_HOST | proxy_host | http://127.0.0.1:1080 |
Run directly with Docker. Configuration can be modified by mounting the config file /app/conf/config.yaml, or by
using environment variables to override settings.
docker run -d --name rustdesk-api -p 21114:21114 \
-v /data/rustdesk/api:/app/data \
-e RUSTDESK_API_LANG=en \
-e RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116 \
-e RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117 \
-e RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114 \
-e RUSTDESK_API_RUSTDESK_KEY=abc123456 \
lejianwen/rustdesk-api
Using docker-compose
Simple example:
services:
rustdesk-api:
container_name: rustdesk-api
environment:
- RUSTDESK_API_LANG=en
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
ports:
- 21114:21114
image: lejianwen/rustdesk-api
volumes:
- /data/rustdesk/api:/app/data # Mount the database for easy backup
networks:
- rustdesk-net
restart: unless-stopped
Example with RustDesk's official Docker Compose file, adding your rustdesk-api service:
-k <key> parameter. However, after the first startup, run docker-compose logs hbbs or cat ./data/id_ed25519.pub to view the KEY, then modify RUSTDESK_API_RUSTDESK_KEY=<key> and execute docker-compose up -d again.
yaml
networks:
rustdesk-net:
external: false
services:
hbbs:
container_name: hbbs
ports:
- 21115:21115
- 21116:21116 # 自定义 hbbs 映射端口
- 21116:21116/udp # 自定义 hbbs 映射端口
- 21118:21118 # web client
image: rustdesk/rustdesk-server
command: hbbs -r <relay-server-ip[:port]> -k <key> # 填入个人域名或 IP + hbbr 暴露端口
volumes:
- ./data:/root # 自定义挂载目录
networks:
- rustdesk-net
depends_on:
- hbbr
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
hbbr:
container_name: hbbr
ports:
- 21117:21117 # 自定义 hbbr 映射端口
- 21119:21119 # web client
image: rustdesk/rustdesk-server
command: hbbr -k <key>
volumes:
- ./data:/root
networks:
- rustdesk-net
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
rustdesk-api:
container_name: rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
ports:
- 21114:21114
image: lejianwen/rustdesk-api
volumes:
- /data/rustdesk/api:/app/data #将数据库挂载出来方便备份
networks:
- rustdesk-net
restart: unless-stopped
S6 image
/etc/s6-overlay/s6-rc.d/hbbr/run and /etc/s6-overlay/s6-rc.d/hbbr/run in the image.
hbbr/run, only needed for custom KEY
bash
#!/command/with-contenv sh
cd /data
PARAMS=
[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
/usr/bin/hbbr $PARAMS
hbbs/run, only needed for custom KEY
bash
#!/command/with-contenv sh
sleep 2
cd /data
PARAMS=
[ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
/usr/bin/hbbs -r $RELAY $PARAMS
s6 section in docker-compose.yml
```yaml
networks:
rustdesk-net:
external: false
services:
rustdesk-server:
container_name: rustdesk-server
ports:
If using system-generated KEY or custom KEY_PUB, KEY_PRIV, you do not need to modify the startup script, but you need to obtain the KEY after it is generated and then run docker-compose up -d
networks:
rustdesk-net:
external: false
services:
rustdesk-server:
container_name: rustdesk-server
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21117:21117
- 21118:21118
- 21119:21119
image: rustdesk/rustdesk-server-s6:latest
environment:
- RELAY=192.168.1.66:21117
- ENCRYPTED_ONLY=1
volumes:
- ./data:/data
restart: unless-stopped
rustdesk-api:
container_name: rustdesk-api
ports:
- 21114:21114
image: lejianwen/rustdesk-api
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
- RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
- RUSTDESK_API_RUSTDESK_KEY=<key>
volumes:
- /data/rustdesk/api:/app/data
networks:
- rustdesk-net
restart: unless-stopped
Download the release from release.
Clone the repository:
git clone https://github.com/lejianwen/rustdesk-api.git
cd rustdesk-api
Install dependencies:
go mod tidy
# Install Swag if you need to generate documentation; otherwise, you can skip this step
go install github.com/swaggo/swag/cmd/swag@latest
Build the admin front-end (the front-end code is in rustdesk-api-web):
cd resources
mkdir -p admin
git clone https://github.com/lejianwen/rustdesk-api-web
cd rustdesk-api-web
npm install
npm run build
cp -ar dist/* ../admin/
Run:
# Run directly
go run cmd/apimain.go
# Or generate and run the API using generate_api.go
go generate generate_api.go
To compile, change to the project root directory. For Windows, run build.bat, and for Linux, run build.sh. After
compiling, the corresponding executables will be generated in the release directory. Run the compiled executables
directly.
Open your browser and visit http://<your server[:port]>/_admin/, with default credentials admin admin. Please
change the password promptly.
Configure reverse proxy in nginx
server {
listen <your port>;
server_name <your server>;
location / {
proxy_pass http://<api-server[:port]>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}