ljw 1 год назад
Родитель
Сommit
abc0e9d907
2 измененных файлов с 445 добавлено и 324 удалено
  1. 213 155
      README.md
  2. 232 169
      README_EN.md

+ 213 - 155
README.md

@@ -41,22 +41,45 @@
41 41
 
42 42
 ### [Rustdesk](https://github.com/rustdesk/rustdesk)
43 43
 
44
-1. PC客户端使用的是 ***1.3.0***,经测试 ***1.2.6+*** 都可以
45
-2. server端指定key,不用自带的生成的key,否则可能链接不上或者超时
46
-
47
-   ```bash
48
-   hbbs -r <relay-server-ip[:port]> -k <key>
49
-   hbbr -k <key>
50
-   ```
51
-
52
-   比如
53
-
54
-   ```bash
55
-   hbbs -r <relay-server-ip[:port]> -k abc1234567
56
-   hbbr -k abc1234567
57
-   ```
58
-3. server端使用系统生成的key,但如果client已登录,链接时容易超时或者链接不上,可以退出登录后再链接就可以了,webclient可以不用退出登录
59
-
44
+#### PC客户端使用的是 ***1.3.0***,经测试 ***1.2.6+*** 都可以
45
+
46
+#### 关于PC端链接超时或者链接不上的问题以及解决方案
47
+- 链接不上是因为server端相对于客户端落后版本,server不会响应客户端的`secure_tcp`请求,所以客户端超时
48
+  相关代码代码位置在`https://github.com/rustdesk/rustdesk/blob/master/src/client.rs#L322`
49
+  ```rust
50
+    if !key.is_empty() && !token.is_empty() {
51
+    // mainly for the security of token
52
+    allow_err!(secure_tcp(&mut socket, key).await);
53
+    }
54
+  ```
55
+  可看到当`key`和`token`都不为空时,会调用`secure_tcp`,但是server端不会响应,所以客户端超时
56
+  `secure_tcp` 代码位置在 `https://github.com/rustdesk/rustdesk/blob/master/src/common.rs#L1203`
57
+  
58
+- ***解决方案***
59
+
60
+  1. server端指定key。
61
+      - 优点:简单
62
+      - 缺点:链接不是加密的
63
+         ```bash
64
+         hbbs -r <relay-server-ip[:port]> -k <key>
65
+         hbbr -k <key>
66
+         ```
67
+         比如
68
+         ```bash
69
+           hbbs -r <relay-server-ip[:port]> -k abc1234567
70
+           hbbr -k abc1234567
71
+         ```
72
+  2. server端使用系统生成的key,或者自定义的密钥对,但如果client已登录,链接时容易超时或者链接不上,可以退出登录后再链接就可以了,webclient可以不用退出登录
73
+      - 优点:链接加密
74
+      - 缺点:操作麻烦
75
+  3. server端使用系统生成的key,或者自定义的密钥对,fork官方客户端的代码将`secure_tcp`修改成直接返回,然后通过`Github Actions`编译,下载编译后的客户端。
76
+  参考[官方文档](https://rustdesk.com/docs/en/dev/build/all/)
77
+      - 优点:链接加密,可以自定义客户端一些功能,编译后直接可用
78
+      - 缺点:需要自己fork代码,编译,有点难度
79
+  4. 使用[我fork的代码](https://github.com/lejianwen/rustdesk),已经修改了`secure_tcp`,可以直接下载使用,[下载地址](https://github.com/lejianwen/rustdesk/releases)
80
+      - 优点:代码改动可查看,`Github Actions`编译,链接加密,直接下载使用
81
+      - 缺点:可能跟不上官方版本更新
82
+##### 对链接加密要求不高的可以使用`1`,对链接加密要求高的可以使用`3`或`4`
60 83
 
61 84
 ## 功能
62 85
 
@@ -145,6 +168,10 @@ rustdesk:
145 168
   api-server: "http://192.168.1.66:21114"
146 169
   key: "123456789"
147 170
   personal: 1
171
+logger:
172
+  path: "./runtime/log.txt"
173
+  level: "warn" #trace,debug,info,warn,error,fatal
174
+  report-caller: true
148 175
 ```
149 176
 
150 177
 * 环境变量,变量名前缀是RUSTDESK_API,环境变量如果存在将覆盖配置文件中的配置
@@ -171,28 +198,27 @@ rustdesk:
171 198
 | RUSTDESK_API_RUSTDESK_API_SERVER    | Rustdesk的api服务器地址                    | http://192.168.1.66:21114   |
172 199
 | RUSTDESK_API_RUSTDESK_KEY           | Rustdesk的key                         | 123456789                   |
173 200
 
174
-### 安装步骤
201
+### 运行
175 202
 
176 203
 #### docker运行
177 204
 
178 205
 1. 直接docker运行,配置可以通过挂载配置文件`/app/conf/config.yaml`来修改,或者通过环境变量覆盖配置文件中的配置
179 206
 
180
-```bash
181
-docker run -d --name rustdesk-api -p 21114:21114 \
182
--v /data/rustdesk/api:/app/data \
183
--e TZ=Asia/Shanghai \
184
--e RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116 \
185
--e RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117 \
186
--e RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114 \
187
--e RUSTDESK_API_RUSTDESK_KEY=123456789 \
188
-lejianwen/rustdesk-api
189
-```
207
+    ```bash
208
+    docker run -d --name rustdesk-api -p 21114:21114 \
209
+    -v /data/rustdesk/api:/app/data \
210
+    -e TZ=Asia/Shanghai \
211
+    -e RUSTDESK_API_LANG=zh-CN \
212
+    -e RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116 \
213
+    -e RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117 \
214
+    -e RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114 \
215
+    -e RUSTDESK_API_RUSTDESK_KEY=<key> \
216
+    lejianwen/rustdesk-api
217
+    ```
190 218
 
191 219
 2. 使用`docker compose`
192
-
193
-    - 简单示例
194
-
195
-   ```docker-compose
220
+   - 简单示例
221
+   ```yaml
196 222
    services:
197 223
       rustdesk-api:
198 224
        container_name: rustdesk-api
@@ -201,7 +227,7 @@ lejianwen/rustdesk-api
201 227
          - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
202 228
          - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
203 229
          - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
204
-         - RUSTDESK_API_RUSTDESK_KEY=123456789
230
+         - RUSTDESK_API_RUSTDESK_KEY=<key>
205 231
        ports:
206 232
          - 21114:21114
207 233
        image: lejianwen/rustdesk-api
@@ -212,74 +238,70 @@ lejianwen/rustdesk-api
212 238
        restart: unless-stopped
213 239
    ```
214 240
 
215
-    - 根据rustdesk提供的示例加上自己的rustdesk-api
216
-
217
-   ```docker-compose
218
-   networks:
219
-     rustdesk-net:
220
-       external: false
221
-   services:
222
-     hbbs:
223
-       container_name: hbbs
224
-       ports:
225
-         - 21115:21115
226
-         - 21116:21116 # 自定义 hbbs 映射端口
227
-         - 21116:21116/udp # 自定义 hbbs 映射端口
228
-         - 21118:21118 # web client
229
-       image: rustdesk/rustdesk-server
230
-       command: hbbs -r <relay-server-ip[:port]> -k 123456789 # 填入个人域名或 IP + hbbr 暴露端口
231
-       volumes:
232
-         - /data/rustdesk/hbbs:/root # 自定义挂载目录
233
-       networks:
234
-         - rustdesk-net
235
-       depends_on:
236
-         - hbbr
237
-       restart: unless-stopped
238
-       deploy:
239
-         resources:
240
-           limits:
241
-             memory: 64M
242
-     hbbr:
243
-       container_name: hbbr
244
-       ports:
245
-         - 21117:21117 # 自定义 hbbr 映射端口
246
-         - 21119:21119 # web client
247
-       image: rustdesk/rustdesk-server
248
-       command: hbbr -k 123456789
249
-       #command: hbbr
250
-       volumes:
251
-         - /data/rustdesk/hbbr:/root # 自定义挂载目录
252
-       networks:
253
-         - rustdesk-net
254
-       restart: unless-stopped
255
-       deploy:
256
-         resources:
257
-           limits:
258
-             memory: 64M
259
-     rustdesk-api:
260
-       container_name: rustdesk-api
261
-       environment:
262
-         - TZ=Asia/Shanghai
263
-         - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
264
-         - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
265
-         - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
266
-         - RUSTDESK_API_RUSTDESK_KEY=123456789
267
-       ports:
268
-         - 21114:21114
269
-       image: lejianwen/rustdesk-api
270
-       volumes:
271
-         - /data/rustdesk/api:/app/data #将数据库挂载出来方便备份
272
-       networks:
273
-         - rustdesk-net
274
-       restart: unless-stopped
275
-   
276
-   ```
277
-
278
-    - 如果使用的是S6的镜像,会需要修改启动脚本,覆盖镜像中的`/etc/s6-overlay/s6-rc.d/hbbr/run`
279
-      和`/etc/s6-overlay/s6-rc.d/hbbr/run`
280
-
281
-        1. 创建`hbbr/run`
282
-
241
+   - 根据rustdesk官方提供的示例,加上自己的rustdesk-api
242
+     - 如果是使用的系统生成的KEY,去掉`-k <key>`参数,在启动后运行`docker-compose logs hbbs`或者`cat ./data/id_ed25519.pub`查看KEY,然后再修改`RUSTDESK_API_RUSTDESK_KEY=<key>`再执行`docker-compose up -d`
243
+      ```yaml
244
+      networks:
245
+        rustdesk-net:
246
+          external: false
247
+      services:
248
+        hbbs:
249
+          container_name: hbbs
250
+          ports:
251
+            - 21115:21115
252
+            - 21116:21116 # 自定义 hbbs 映射端口
253
+            - 21116:21116/udp # 自定义 hbbs 映射端口
254
+            - 21118:21118 # web client
255
+          image: rustdesk/rustdesk-server
256
+          command: hbbs -r <relay-server-ip[:port]> -k <key> # 填入个人域名或 IP + hbbr 暴露端口
257
+          volumes:
258
+            - ./data:/root # 自定义挂载目录
259
+          networks:
260
+            - rustdesk-net
261
+          depends_on:
262
+            - hbbr
263
+          restart: unless-stopped
264
+          deploy:
265
+            resources:
266
+              limits:
267
+                memory: 64M
268
+        hbbr:
269
+          container_name: hbbr
270
+          ports:
271
+            - 21117:21117 # 自定义 hbbr 映射端口
272
+            - 21119:21119 # web client
273
+          image: rustdesk/rustdesk-server
274
+          command: hbbr -k <key>
275
+          volumes:
276
+            - ./data:/root
277
+          networks:
278
+            - rustdesk-net
279
+          restart: unless-stopped
280
+          deploy:
281
+            resources:
282
+              limits:
283
+                memory: 64M
284
+        rustdesk-api:
285
+          container_name: rustdesk-api
286
+          environment:
287
+            - TZ=Asia/Shanghai
288
+            - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
289
+            - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
290
+            - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
291
+            - RUSTDESK_API_RUSTDESK_KEY=<key>
292
+          ports:
293
+            - 21114:21114
294
+          image: lejianwen/rustdesk-api
295
+          volumes:
296
+            - /data/rustdesk/api:/app/data #将数据库挂载出来方便备份
297
+          networks:
298
+            - rustdesk-net
299
+          restart: unless-stopped
300
+      ```
301
+     
302
+   - S6的镜像
303
+     - 如果使用***自定义KEY***,会需要修改启动脚本,覆盖镜像中的`/etc/s6-overlay/s6-rc.d/hbbr/run`和`/etc/s6-overlay/s6-rc.d/hbbr/run`
304
+         1. 创建`hbbr/run`,自定义KEY才需要
283 305
             ```bash
284 306
             #!/command/with-contenv sh
285 307
             cd /data
@@ -287,63 +309,99 @@ lejianwen/rustdesk-api
287 309
             [ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
288 310
             /usr/bin/hbbr $PARAMS
289 311
             ```
290
-
291
-        2. 创建`hbbs/run`
292
-            ```bash
293
-            #!/command/with-contenv sh
294
-            sleep 2
295
-            cd /data
296
-            PARAMS=
297
-            [ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
298
-            /usr/bin/hbbs -r $RELAY $PARAMS
299
-            ```
300
-        3. 修改`docker-compose.yml`中的`s6`部分
301
-
302
-            ```
303
-            networks:
304
-              rustdesk-net:
305
-                external: false
306
-            services:
307
-              rustdesk-server:
308
-                container_name: rustdesk-server
309
-                ports:
310
-                  - 21115:21115
311
-                  - 21116:21116
312
-                  - 21116:21116/udp
313
-                  - 21117:21117
314
-                  - 21118:21118
315
-                  - 21119:21119
316
-                image: rustdesk/rustdesk-server-s6:latest
317
-                environment:
318
-                  - RELAY=192.168.1.66:21117
319
-                  - ENCRYPTED_ONLY=1
320
-                  - KEY=abc123456789
321
-                volumes:
322
-                  - ./data:/data
323
-                  - ./hbbr/run:/etc/s6-overlay/s6-rc.d/hbbr/run
324
-                  - ./hbbs/run:/etc/s6-overlay/s6-rc.d/hbbs/run
325
-                restart: unless-stopped
326
-              rustdesk-api:
327
-                container_name: rustdesk-api
328
-                ports:
329
-                  - 21114:21114
330
-                image: lejianwen/rustdesk-api
331
-                environment:
332
-                  - TZ=Asia/Shanghai
333
-                  - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
334
-                  - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
335
-                  - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
336
-                  - RUSTDESK_API_RUSTDESK_KEY=abc123456789
337
-                volumes:
338
-                  - /data/rustdesk/api:/app/data #将数据库挂载
339
-                networks:
340
-                  - rustdesk-net
341
-                restart: unless-stopped
342
-            ```
343
-
312
+         2. 创建`hbbs/run`,自定义KEY才需要
313
+             ```bash
314
+             #!/command/with-contenv sh
315
+             sleep 2
316
+             cd /data
317
+             PARAMS=
318
+             [ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
319
+             /usr/bin/hbbs -r $RELAY $PARAMS
320
+             ```
321
+         3. 修改`docker-compose.yml`中的`s6`部分
322
+         ```yaml
323
+         networks:
324
+           rustdesk-net:
325
+             external: false
326
+         services:
327
+           rustdesk-server:
328
+             container_name: rustdesk-server
329
+             ports:
330
+               - 21115:21115
331
+               - 21116:21116
332
+               - 21116:21116/udp
333
+               - 21117:21117
334
+               - 21118:21118
335
+               - 21119:21119
336
+             image: rustdesk/rustdesk-server-s6:latest
337
+             environment:
338
+               - RELAY=192.168.1.66:21117
339
+               - ENCRYPTED_ONLY=1
340
+               - KEY=<key>  #自定义KEY
341
+             volumes:
342
+               - ./data:/data
343
+               - ./hbbr/run:/etc/s6-overlay/s6-rc.d/hbbr/run 
344
+               - ./hbbs/run:/etc/s6-overlay/s6-rc.d/hbbs/run 
345
+             restart: unless-stopped
346
+           rustdesk-api:
347
+             container_name: rustdesk-api
348
+             ports:
349
+               - 21114:21114
350
+             image: lejianwen/rustdesk-api
351
+             environment:
352
+               - TZ=Asia/Shanghai
353
+               - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
354
+               - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
355
+               - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
356
+               - RUSTDESK_API_RUSTDESK_KEY=<key>
357
+             volumes:
358
+               - /data/rustdesk/api:/app/data #将数据库挂载
359
+             networks:
360
+               - rustdesk-net
361
+             restart: unless-stopped
362
+         ```
363
+   - 如果使用***系统生成的KEY***或者***自定义KEY_PUB,KEY_PRIV***,不需要修改启动脚本,但要在生成KEY后获取到KEY再`docker-compose up -d`
364
+       ```yaml
365
+       networks:
366
+         rustdesk-net:
367
+           external: false
368
+       services:
369
+         rustdesk-server:
370
+           container_name: rustdesk-server
371
+           ports:
372
+             - 21115:21115
373
+             - 21116:21116
374
+             - 21116:21116/udp
375
+             - 21117:21117
376
+             - 21118:21118
377
+             - 21119:21119
378
+           image: rustdesk/rustdesk-server-s6:latest
379
+           environment:
380
+             - RELAY=192.168.1.66:21117
381
+             - ENCRYPTED_ONLY=1
382
+           volumes:
383
+             - ./data:/data
384
+           restart: unless-stopped
385
+         rustdesk-api:
386
+           container_name: rustdesk-api
387
+           ports:
388
+             - 21114:21114
389
+           image: lejianwen/rustdesk-api
390
+           environment:
391
+             - TZ=Asia/Shanghai
392
+             - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
393
+             - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
394
+             - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
395
+             - RUSTDESK_API_RUSTDESK_KEY=<key> #系统生成的KEY
396
+           volumes:
397
+             - /data/rustdesk/api:/app/data #将数据库挂载
398
+           networks:
399
+             - rustdesk-net
400
+           restart: unless-stopped
401
+       ```
344 402
 #### 下载release直接运行
345 403
 
346
-下载地址[release](https://github.com/lejianwen/rustdesk-api/releases)
404
+[下载地址](https://github.com/lejianwen/rustdesk-api/releases)
347 405
 
348 406
 #### 源码安装
349 407
 

+ 232 - 169
README_EN.md

@@ -40,21 +40,46 @@ desktop software that provides self-hosted solutions.
40 40
 
41 41
 ### [Rustdesk](https://github.com/rustdesk/rustdesk)
42 42
 
43
-1. The PC client version used is ***1.3.0***, and versions ***1.2.6+*** have been tested to work.
44
-2. The server can specify a key, and not use the auto-generated key, otherwise there may be connection failures or timeouts.
45 43
 
46
-   ```bash
47
-   hbbs -r <relay-server-ip[:port]> -k <key>
48
-   hbbr -k <key>
49
-   ```
50
-
51
-   Example:
52
-
53
-   ```bash
54
-   hbbs -r <relay-server-ip[:port]> -k abc1234567
55
-   hbbr -k abc1234567
56
-   ```
57
-3. The server use the auto-generated key, but if the client has logged in, it is easy to time out or the link failed, you can log out and then link again, and the webclient don't have to log out
44
+#### The PC client uses version ***1.3.0***, and versions ***1.2.6+*** have been tested to work.
45
+
46
+#### Solutions for PC client connection timeout or connection issues
47
+- The connection issue is due to the server version lagging behind the client version, causing the server to not respond to the client's `secure_tcp` request, resulting in a timeout.
48
+  Relevant code can be found at `https://github.com/rustdesk/rustdesk/blob/master/src/client.rs#L322`
49
+  ```rust
50
+    if !key.is_empty() && !token.is_empty() {
51
+    // mainly for the security of token
52
+    allow_err!(secure_tcp(&mut socket, key).await);
53
+    }
54
+  ```
55
+  
56
+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.
57
+The `secure_tcp` code is located at `https://github.com/rustdesk/rustdesk/blob/master/src/common.rs#L1203`
58
+
59
+- ***Solutions***
60
+    1. Specify the key on the server.
61
+        - Advantage: Simple
62
+        - Disadvantage: The connection is not encrypted
63
+           ```bash
64
+           hbbs -r <relay-server-ip[:port]> -k <key>
65
+           hbbr -k <key>
66
+           ```
67
+          For example
68
+           ```bash
69
+             hbbs -r <relay-server-ip[:port]> -k abc1234567
70
+             hbbr -k abc1234567
71
+           ```
72
+    2. Use a system-generated key or a custom key pair on the server. If the client is already logged in, it may timeout or fail to connect. Logging out and reconnecting usually resolves the issue, and the web client does not need to log out.
73
+        - Advantage: Encrypted connection
74
+        - Disadvantage: Complicated operation
75
+    3. Use a system-generated key or a custom key pair on the server, fork the official client code to modify `secure_tcp` to return directly, then compile using `Github Actions` and download the compiled client.
76
+       Refer to [official documentation](https://rustdesk.com/docs/en/dev/build/all/)
77
+        - Advantage: Encrypted connection, customizable client features, ready to use after compilation
78
+        - Disadvantage: Requires forking code and compiling, which can be challenging
79
+    4. Use [my forked code](https://github.com/lejianwen/rustdesk), which has already modified `secure_tcp`. You can download and use it directly from [here](https://github.com/lejianwen/rustdesk/releases)
80
+        - Advantage: Code changes are viewable, compiled with `Github Actions`, encrypted connection, ready to use
81
+        - Disadvantage: May not keep up with official version updates
82
+##### If encryption is not a high priority, use `1`. If encryption is important, use `3` or `4`.
58 83
 
59 84
 ## Overview
60 85
 
@@ -148,6 +173,10 @@ rustdesk:
148 173
   api-server: "http://192.168.1.66:21114"
149 174
   key: "123456789"
150 175
   personal: 1
176
+logger:
177
+  path: "./runtime/log.txt"
178
+  level: "warn" #trace,debug,info,warn,error,fatal
179
+  report-caller: true
151 180
 ```
152 181
 
153 182
 * Environment variables, with the prefix `RUSTDESK_API_RUSTDESK_PERSONAL`, will override the settings in the
@@ -182,167 +211,201 @@ rustdesk:
182 211
 
183 212
 1. Run directly with Docker. Configuration can be modified by mounting the config file `/app/conf/config.yaml`, or by
184 213
    using environment variables to override settings.
185
-
186
-```bash
187
-docker run -d --name rustdesk-api -p 21114:21114 \
188
--v /data/rustdesk/api:/app/data \
189
--e RUSTDESK_API_LANG=en \
190
--e RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116 \
191
--e RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117 \
192
--e RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114 \
193
--e RUSTDESK_API_RUSTDESK_KEY=123456789 \
194
-lejianwen/rustdesk-api
195
-```
214
+    
215
+    ```bash
216
+    docker run -d --name rustdesk-api -p 21114:21114 \
217
+    -v /data/rustdesk/api:/app/data \
218
+    -e RUSTDESK_API_LANG=en \
219
+    -e RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116 \
220
+    -e RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117 \
221
+    -e RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114 \
222
+    -e RUSTDESK_API_RUSTDESK_KEY=abc123456 \
223
+    lejianwen/rustdesk-api
224
+    ```
196 225
 
197 226
 2. Using `docker-compose`
198
-
199 227
     - Simple example:
200
-
201
-   ```docker-compose
202
-   services:
203
-      rustdesk-api:
204
-       container_name: rustdesk-api
205
-       environment:
206
-         - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
207
-         - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
208
-         - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
209
-         - RUSTDESK_API_RUSTDESK_KEY=123456789
210
-       ports:
211
-         - 21114:21114
212
-       image: lejianwen/rustdesk-api
213
-       volumes:
214
-         - /data/rustdesk/api:/app/data # Mount the database for easy backup
215
-       networks:
216
-         - rustdesk-net
217
-       restart: unless-stopped
218
-   ```
228
+       ```yaml
229
+       services:
230
+          rustdesk-api:
231
+           container_name: rustdesk-api
232
+           environment:
233
+             - RUSTDESK_API_LANG=en
234
+             - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
235
+             - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
236
+             - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
237
+             - RUSTDESK_API_RUSTDESK_KEY=<key>
238
+           ports:
239
+             - 21114:21114
240
+           image: lejianwen/rustdesk-api
241
+           volumes:
242
+             - /data/rustdesk/api:/app/data # Mount the database for easy backup
243
+           networks:
244
+             - rustdesk-net
245
+           restart: unless-stopped
246
+       ```
219 247
 
220 248
     - Example with RustDesk's official Docker Compose file, adding your `rustdesk-api` service:
221
-
222
-   ```docker-compose
223
-   networks:
224
-     rustdesk-net:
225
-       external: false
226
-   services:
227
-     hbbs:
228
-       container_name: hbbs
229
-       ports:
230
-         - 21115:21115
231
-         - 21116:21116 # 自定义 hbbs 映射端口
232
-         - 21116:21116/udp # 自定义 hbbs 映射端口
233
-         - 21118:21118 # web client
234
-
235
-       image: rustdesk/rustdesk-server
236
-       command: hbbs -r <relay-server-ip[:port]> -k 123456789 # 填入个人域名或 IP + hbbr 暴露端口
237
-       volumes:
238
-         - /data/rustdesk/hbbs:/root # 自定义挂载目录
239
-       networks:
240
-         - rustdesk-net
241
-       depends_on:
242
-         - hbbr
243
-       restart: unless-stopped
244
-       deploy:
245
-         resources:
246
-           limits:
247
-             memory: 64M
248
-     hbbr:
249
-       container_name: hbbr
250
-       ports:
251
-         - 21117:21117 # 自定义 hbbr 映射端口
252
-         - 21119:21119 # web client
253
-       image: rustdesk/rustdesk-server
254
-       command: hbbr -k 123456789
255
-       #command: hbbr
256
-       volumes:
257
-         - /data/rustdesk/hbbr:/root # 自定义挂载目录
249
+     - If you are using a system-generated KEY, remove the `-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.
250
+       ```yaml
251
+          networks:
252
+            rustdesk-net:
253
+              external: false
254
+          services:
255
+            hbbs:
256
+              container_name: hbbs
257
+              ports:
258
+                - 21115:21115
259
+                - 21116:21116 # 自定义 hbbs 映射端口
260
+                - 21116:21116/udp # 自定义 hbbs 映射端口
261
+                - 21118:21118 # web client
262
+              image: rustdesk/rustdesk-server
263
+              command: hbbs -r <relay-server-ip[:port]> -k <key> # 填入个人域名或 IP + hbbr 暴露端口
264
+              volumes:
265
+                - ./data:/root # 自定义挂载目录
266
+              networks:
267
+                - rustdesk-net
268
+              depends_on:
269
+                - hbbr
270
+              restart: unless-stopped
271
+              deploy:
272
+                resources:
273
+                  limits:
274
+                    memory: 64M
275
+            hbbr:
276
+              container_name: hbbr
277
+              ports:
278
+                - 21117:21117 # 自定义 hbbr 映射端口
279
+                - 21119:21119 # web client
280
+              image: rustdesk/rustdesk-server
281
+              command: hbbr -k <key>
282
+              volumes:
283
+                - ./data:/root
284
+              networks:
285
+                - rustdesk-net
286
+              restart: unless-stopped
287
+              deploy:
288
+                resources:
289
+                  limits:
290
+                    memory: 64M
291
+            rustdesk-api:
292
+              container_name: rustdesk-api
293
+              environment:
294
+                - TZ=Asia/Shanghai
295
+                - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
296
+                - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
297
+                - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
298
+                - RUSTDESK_API_RUSTDESK_KEY=<key>
299
+              ports:
300
+                - 21114:21114
301
+              image: lejianwen/rustdesk-api
302
+              volumes:
303
+                - /data/rustdesk/api:/app/data #将数据库挂载出来方便备份
304
+              networks:
305
+                - rustdesk-net
306
+              restart: unless-stopped
307
+          ```
308
+
309
+   - S6 image
310
+       - - If using ***custom KEY***, you will need to modify the startup script to override the `/etc/s6-overlay/s6-rc.d/hbbr/run` and `/etc/s6-overlay/s6-rc.d/hbbr/run` in the image.
311
+           1. Create `hbbr/run`, only needed for custom KEY
312
+              ```bash
313
+              #!/command/with-contenv sh
314
+              cd /data
315
+              PARAMS=
316
+              [ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
317
+              /usr/bin/hbbr $PARAMS
318
+              ```
319
+           2. Create `hbbs/run`, only needed for custom KEY
320
+               ```bash
321
+               #!/command/with-contenv sh
322
+               sleep 2
323
+               cd /data
324
+               PARAMS=
325
+               [ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
326
+               /usr/bin/hbbs -r $RELAY $PARAMS
327
+               ```
328
+           3. Modify the `s6` section in `docker-compose.yml`
329
+           ```yaml
330
+           networks:
331
+             rustdesk-net:
332
+               external: false
333
+           services:
334
+             rustdesk-server:
335
+               container_name: rustdesk-server
336
+               ports:
337
+                 - 21115:21115
338
+                 - 21116:21116
339
+                 - 21116:21116/udp
340
+                 - 21117:21117
341
+                 - 21118:21118
342
+                 - 21119:21119
343
+               image: rustdesk/rustdesk-server-s6:latest
344
+               environment:
345
+                 - RELAY=192.168.1.66:21117
346
+                 - ENCRYPTED_ONLY=1
347
+                 - KEY=<key>  #KEY
348
+               volumes:
349
+                 - ./data:/data
350
+                 - ./hbbr/run:/etc/s6-overlay/s6-rc.d/hbbr/run 
351
+                 - ./hbbs/run:/etc/s6-overlay/s6-rc.d/hbbs/run 
352
+               restart: unless-stopped
353
+             rustdesk-api:
354
+               container_name: rustdesk-api
355
+               ports:
356
+                 - 21114:21114
357
+               image: lejianwen/rustdesk-api
358
+               environment:
359
+                 - TZ=Asia/Shanghai
360
+                 - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
361
+                 - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
362
+                 - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
363
+                 - RUSTDESK_API_RUSTDESK_KEY=<key>
364
+               volumes:
365
+                 - /data/rustdesk/api:/app/data 
366
+               networks:
367
+                 - rustdesk-net
368
+               restart: unless-stopped
369
+           ```
370
+   - 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`
371
+       ```yaml
258 372
        networks:
259
-         - rustdesk-net
260
-       restart: unless-stopped
261
-       deploy:
262
-         resources:
263
-           limits:
264
-             memory: 64M
265
-     rustdesk-api:
266
-       container_name: rustdesk-api
267
-       environment:
268
-         - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
269
-         - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
270
-         - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
271
-         - RUSTDESK_API_RUSTDESK_KEY=123456789
272
-       ports:
273
-         - 21114:21114
274
-       image: lejianwen/rustdesk-api
275
-       volumes:
276
-         - /data/rustdesk/api:/app/data #将数据库挂载出来方便备份
277
-       networks:
278
-         - rustdesk-net
279
-       restart: unless-stopped
280
-   
281
-   ```
282
-    - If you are using an S6 image, you need to modify the startup script `/etc/s6-overlay/s6-rc.d/hbbr/run`
283
-      and `/etc/s6-overlay/s6-rc.d/hbbr/run`
284
-
285
-        1. create `hbbr/run`
286
-
287
-            ```bash
288
-            #!/command/with-contenv sh
289
-            cd /data
290
-            PARAMS=
291
-            [ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
292
-            /usr/bin/hbbr $PARAMS
293
-            ```
294
-
295
-        2. create `hbbs/run`
296
-            ```bash
297
-            #!/command/with-contenv sh
298
-            sleep 2
299
-            cd /data
300
-            PARAMS=
301
-            [ "${ENCRYPTED_ONLY}" = "1" ] && PARAMS="-k ${KEY}"
302
-            /usr/bin/hbbs -r $RELAY $PARAMS
303
-            ```
304
-        3. edit `docker-compose.yml`
305
-            ```
306
-            networks:
307
-              rustdesk-net:
308
-                external: false
309
-            services:
310
-              rustdesk-server:
311
-                container_name: rustdesk-server
312
-                ports:
313
-                  - 21115:21115
314
-                  - 21116:21116
315
-                  - 21116:21116/udp
316
-                  - 21117:21117
317
-                  - 21118:21118
318
-                  - 21119:21119
319
-                image: rustdesk/rustdesk-server-s6:latest
320
-                environment:
321
-                  - RELAY=192.168.1.66:21117
322
-                  - ENCRYPTED_ONLY=1
323
-                  - KEY=abc123456789
324
-                volumes:
325
-                  - ./data:/data
326
-                  - ./hbbr/run:/etc/s6-overlay/s6-rc.d/hbbr/run
327
-                  - ./hbbs/run:/etc/s6-overlay/s6-rc.d/hbbs/run
328
-                restart: unless-stopped
329
-              rustdesk-api:
330
-                container_name: rustdesk-api
331
-                ports:
332
-                  - 21114:21114
333
-                image: lejianwen/rustdesk-api
334
-                environment:
335
-                  - TZ=Asia/Shanghai
336
-                  - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
337
-                  - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
338
-                  - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
339
-                  - RUSTDESK_API_RUSTDESK_KEY=abc123456789
340
-                volumes:
341
-                  - /data/rustdesk/api:/app/data #将数据库挂载
342
-                networks:
343
-                  - rustdesk-net
344
-                restart: unless-stopped
345
-            ```
373
+         rustdesk-net:
374
+           external: false
375
+       services:
376
+         rustdesk-server:
377
+           container_name: rustdesk-server
378
+           ports:
379
+             - 21115:21115
380
+             - 21116:21116
381
+             - 21116:21116/udp
382
+             - 21117:21117
383
+             - 21118:21118
384
+             - 21119:21119
385
+           image: rustdesk/rustdesk-server-s6:latest
386
+           environment:
387
+             - RELAY=192.168.1.66:21117
388
+             - ENCRYPTED_ONLY=1
389
+           volumes:
390
+             - ./data:/data
391
+           restart: unless-stopped
392
+         rustdesk-api:
393
+           container_name: rustdesk-api
394
+           ports:
395
+             - 21114:21114
396
+           image: lejianwen/rustdesk-api
397
+           environment:
398
+             - TZ=Asia/Shanghai
399
+             - RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.1.66:21116
400
+             - RUSTDESK_API_RUSTDESK_RELAY_SERVER=192.168.1.66:21117
401
+             - RUSTDESK_API_RUSTDESK_API_SERVER=http://192.168.1.66:21114
402
+             - RUSTDESK_API_RUSTDESK_KEY=<key>
403
+           volumes:
404
+             - /data/rustdesk/api:/app/data 
405
+           networks:
406
+             - rustdesk-net
407
+           restart: unless-stopped
408
+       ```
346 409
 
347 410
 #### Running from Release
348 411