|
| 1 | +<p align="center"> |
| 2 | + <a href="#如何自行建置">自行建置</a> • |
| 3 | + <a href="#Docker-映像檔">Docker</a> • |
| 4 | + <a href="#基於-S6-overlay-的映象檔">S6-overlay</a> • |
| 5 | + <a href="#如何建立金鑰對">金鑰對</a> • |
| 6 | + <a href="#deb-套件">Debian</a> • |
| 7 | + <a href="#ENV-環境參數">環境參數</a><br> |
| 8 | + [<a href="README.md">English</a>] | [<a href="README-DE.md">Deutsch</a>] | [<a href="README-NL.md">Nederlands</a>]<br> |
| 9 | +</p> |
| 10 | + |
| 11 | +# RustDesk Server Program |
| 12 | + |
| 13 | +[](https://github.com/rustdesk/rustdesk-server/actions/workflows/build.yaml) |
| 14 | + |
| 15 | +[**下載**](https://github.com/rustdesk/rustdesk-server/releases) |
| 16 | + |
| 17 | +[**說明文件**](https://rustdesk.com/docs/zh-tw/self-host/) |
| 18 | + |
| 19 | +[**FAQ**](https://github.com/rustdesk/rustdesk/wiki/FAQ) |
| 20 | + |
| 21 | +自行建置屬於您自己的 RustDesk 伺服器,它是免費的且開源。 |
| 22 | + |
| 23 | +## 如何自行建置 |
| 24 | + |
| 25 | +```bash |
| 26 | +cargo build --release |
| 27 | +``` |
| 28 | + |
| 29 | +在 target/release 中會產生三個可執行檔。 |
| 30 | + |
| 31 | +- hbbs - RustDesk ID/會合伺服器 |
| 32 | +- hbbr - RustDesk 中繼伺服器 |
| 33 | +- rustdesk-utils - RustDesk 命令行工具 |
| 34 | + |
| 35 | +您可以在 [releases](https://github.com/rustdesk/rustdesk-server/releases) 頁面上找到更新的執行檔。 |
| 36 | + |
| 37 | +如果您需要額外功能,[RustDesk 專業版伺服器](https://rustdesk.com/pricing.html) 或許更適合您。 |
| 38 | + |
| 39 | +如果您想開發自己的伺服器,[rustdesk-server-demo](https://github.com/rustdesk/rustdesk-server-demo) 可能是一個比這個倉庫更好、更簡單的開始。 |
| 40 | + |
| 41 | +## Docker 映像檔 |
| 42 | + |
| 43 | +Docker 映像檔會在每次 GitHub 發布時自動生成並發布。我們有兩種映像檔。 |
| 44 | + |
| 45 | +### Classic 映像檔 |
| 46 | + |
| 47 | +這些映像檔是基於 `ubuntu-20.04` 建置的,僅添加了兩個主要的執行檔(`hbbr` 和 `hbbs`)。它們可在 [Docker Hub](https://hub.docker.com/r/rustdesk/rustdesk-server/) 上取得,帶有以下tags: |
| 48 | + |
| 49 | +| 架構 | image:tag | |
| 50 | +| ------- | ----------------------------------------- | |
| 51 | +| amd64 | `rustdesk/rustdesk-server:latest` | |
| 52 | +| arm64v8 | `rustdesk/rustdesk-server:latest-arm64v8` | |
| 53 | + |
| 54 | +您可以使用以下指令,直接透過 ``docker run`` 來啟動這些映像檔: |
| 55 | + |
| 56 | +```bash |
| 57 | +docker run --name hbbs --net=host -v "$PWD/data:/root" -d rustdesk/rustdesk-server:latest hbbs -r <relay-server-ip[:port]> |
| 58 | +docker run --name hbbr --net=host -v "$PWD/data:/root" -d rustdesk/rustdesk-server:latest hbbr |
| 59 | +``` |
| 60 | + |
| 61 | +或刪去 `--net=host`, 但 P2P 直接連線會無法運作。 |
| 62 | + |
| 63 | +對於使用 SELinux 的系統,需要將 ``/root`` 替換為 ``/root:z``,以便容器正確運行。或者,也可以通過添加選項 ``--security-opt label=disable`` 完全禁用 SELinux 容器隔離。 |
| 64 | + |
| 65 | +```bash |
| 66 | +docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v "$PWD/data:/root" -d rustdesk/rustdesk-server:latest hbbs -r <relay-server-ip[:port]> |
| 67 | +docker run --name hbbr -p 21117:21117 -p 21119:21119 -v "$PWD/data:/root" -d rustdesk/rustdesk-server:latest hbbr |
| 68 | +``` |
| 69 | + |
| 70 | +`relay-server-ip` 參數是執行這些容器的伺服器的 IP 地址(或 DNS 名稱)。如果您為 `hbbr` 使用的端口不是 **21117**,則必須使用 **可選** 的 `port` 參數。 |
| 71 | + |
| 72 | +您也可以使用 docker-compose 使用這個設定做為範例: |
| 73 | + |
| 74 | +```yaml |
| 75 | +version: '3' |
| 76 | + |
| 77 | +networks: |
| 78 | + rustdesk-net: |
| 79 | + external: false |
| 80 | + |
| 81 | +services: |
| 82 | + hbbs: |
| 83 | + container_name: hbbs |
| 84 | + ports: |
| 85 | + - 21115:21115 |
| 86 | + - 21116:21116 |
| 87 | + - 21116:21116/udp |
| 88 | + - 21118:21118 |
| 89 | + image: rustdesk/rustdesk-server:latest |
| 90 | + command: hbbs -r rustdesk.example.com:21117 |
| 91 | + volumes: |
| 92 | + - ./data:/root |
| 93 | + networks: |
| 94 | + - rustdesk-net |
| 95 | + depends_on: |
| 96 | + - hbbr |
| 97 | + restart: unless-stopped |
| 98 | + |
| 99 | + hbbr: |
| 100 | + container_name: hbbr |
| 101 | + ports: |
| 102 | + - 21117:21117 |
| 103 | + - 21119:21119 |
| 104 | + image: rustdesk/rustdesk-server:latest |
| 105 | + command: hbbr |
| 106 | + volumes: |
| 107 | + - ./data:/root |
| 108 | + networks: |
| 109 | + - rustdesk-net |
| 110 | + restart: unless-stopped |
| 111 | +``` |
| 112 | +
|
| 113 | +請編輯第 16 行,將其指向您的中繼伺服器 (監聽端口 21117 那一個)。 如果需要的話,您也可以編輯 volume (第 18 和 33 行)。 |
| 114 | +
|
| 115 | +(感謝 @lukebarone 和 @QuiGonLeong 協助提供 docker-compose 的設定範例) |
| 116 | +
|
| 117 | +## 基於 S6-overlay 的映象檔 |
| 118 | +
|
| 119 | +這些映象檔是針對 `busybox:stable` 建置的,並添加了執行檔(hbbr 和 hbbs)以及 [S6-overlay](https://github.com/just-containers/s6-overlay)。 它們在以及這些 tags 在 [Docker hub](https://hub.docker.com/r/rustdesk/rustdesk-server-s6/) 可用: |
| 120 | + |
| 121 | +| 架構 | version | image:tag | |
| 122 | +| --------- | ------- | -------------------------------------------- | |
| 123 | +| multiarch | latest | `rustdesk/rustdesk-server-s6:latest` | |
| 124 | +| amd64 | latest | `rustdesk/rustdesk-server-s6:latest-amd64` | |
| 125 | +| i386 | latest | `rustdesk/rustdesk-server-s6:latest-i386` | |
| 126 | +| arm64v8 | latest | `rustdesk/rustdesk-server-s6:latest-arm64v8` | |
| 127 | +| armv7 | latest | `rustdesk/rustdesk-server-s6:latest-armv7` | |
| 128 | +| multiarch | 2 | `rustdesk/rustdesk-server-s6:2` | |
| 129 | +| amd64 | 2 | `rustdesk/rustdesk-server-s6:2-amd64` | |
| 130 | +| i386 | 2 | `rustdesk/rustdesk-server-s6:2-i386` | |
| 131 | +| arm64v8 | 2 | `rustdesk/rustdesk-server-s6:2-arm64v8` | |
| 132 | +| armv7 | 2 | `rustdesk/rustdesk-server-s6:2-armv7` | |
| 133 | +| multiarch | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0` | |
| 134 | +| amd64 | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0-amd64` | |
| 135 | +| i386 | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0-i386` | |
| 136 | +| arm64v8 | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0-arm64v8` | |
| 137 | +| armv7 | 2.0.0 | `rustdesk/rustdesk-server-s6:2.0.0-armv7` | |
| 138 | + |
| 139 | +強烈建議您使用 `multiarch` 映象檔 可以選擇使用 `major version` 或 `latest` tags。 |
| 140 | + |
| 141 | +S6-overlay 在此充當監督程序,保持兩個進程運行,因此使用此映象檔,您無需運行兩個獨立的容器。 |
| 142 | + |
| 143 | +您可以直接使用以下命令使用 `docker run` 來啟動這個映象檔: |
| 144 | + |
| 145 | +```bash |
| 146 | +docker run --name rustdesk-server \ |
| 147 | + --net=host \ |
| 148 | + -e "RELAY=rustdeskrelay.example.com" \ |
| 149 | + -e "ENCRYPTED_ONLY=1" \ |
| 150 | + -v "$PWD/data:/data" -d rustdesk/rustdesk-server-s6:latest |
| 151 | +``` |
| 152 | + |
| 153 | +或刪去 `--net=host`, 但 P2P 直接連線會無法運作。 |
| 154 | + |
| 155 | +```bash |
| 156 | +docker run --name rustdesk-server \ |
| 157 | + -p 21115:21115 -p 21116:21116 -p 21116:21116/udp \ |
| 158 | + -p 21117:21117 -p 21118:21118 -p 21119:21119 \ |
| 159 | + -e "RELAY=rustdeskrelay.example.com" \ |
| 160 | + -e "ENCRYPTED_ONLY=1" \ |
| 161 | + -v "$PWD/data:/data" -d rustdesk/rustdesk-server-s6:latest |
| 162 | +``` |
| 163 | + |
| 164 | +或是您可以使用 docker-compose 文件: |
| 165 | + |
| 166 | +```yaml |
| 167 | +version: '3' |
| 168 | +
|
| 169 | +services: |
| 170 | + rustdesk-server: |
| 171 | + container_name: rustdesk-server |
| 172 | + ports: |
| 173 | + - 21115:21115 |
| 174 | + - 21116:21116 |
| 175 | + - 21116:21116/udp |
| 176 | + - 21117:21117 |
| 177 | + - 21118:21118 |
| 178 | + - 21119:21119 |
| 179 | + image: rustdesk/rustdesk-server-s6:latest |
| 180 | + environment: |
| 181 | + - "RELAY=rustdesk.example.com:21117" |
| 182 | + - "ENCRYPTED_ONLY=1" |
| 183 | + volumes: |
| 184 | + - ./data:/data |
| 185 | + restart: unless-stopped |
| 186 | +``` |
| 187 | + |
| 188 | +對於此容器映象檔,您可以使用這些環境變數,**除了**以下**環境變數**部分指定的那些。 |
| 189 | + |
| 190 | +| 環境變數 | 是否可選 | 敘述 | |
| 191 | +| -------------- | -------- | ------------------------------------------ | |
| 192 | +| RELAY | 否 | 運行此容器的機器的 IP 地址/ DNS 名稱 | |
| 193 | +| ENCRYPTED_ONLY | 是 | 如果設置為 **"1"**,將不接受未加密的連接。 | |
| 194 | +| KEY_PUB | 是 | 金鑰對中的公鑰(Public Key) | |
| 195 | +| KEY_PRIV | 是 | 金鑰對中的私鑰(Private Key) | |
| 196 | + |
| 197 | +### 在基於 S6-overlay 的 Secret 管理 |
| 198 | + |
| 199 | +您可以將金鑰對保存在 Docker volume 中,但最佳實踐建議不要將金鑰寫入文件系統;因此,我們提供了一些選項。 |
| 200 | + |
| 201 | +在容器啟動時,會檢查金鑰對的是否存在(`/data/id_ed25519.pub` 和 `/data/id_ed25519`),如果其中一個金鑰不存在,則會從環境變數或 Docker Secret 重新生成它。 |
| 202 | +然後檢查金鑰對的有效性:如果公鑰和私鑰不匹配,容器將停止運行。 |
| 203 | +如果您未提供金鑰,`hbbs` 將為您產生一個,並將其放置在默認位置。 |
| 204 | + |
| 205 | +#### 使用 ENV 存儲金鑰對 |
| 206 | + |
| 207 | +您可以使用 Docker 環境變數來儲存金鑰。只需按照以下範例操作: |
| 208 | + |
| 209 | +```bash |
| 210 | +docker run --name rustdesk-server \ |
| 211 | + --net=host \ |
| 212 | + -e "RELAY=rustdeskrelay.example.com" \ |
| 213 | + -e "ENCRYPTED_ONLY=1" \ |
| 214 | + -e "DB_URL=/db/db_v2.sqlite3" \ |
| 215 | + -e "KEY_PRIV=FR2j78IxfwJNR+HjLluQ2Nh7eEryEeIZCwiQDPVe+PaITKyShphHAsPLn7So0OqRs92nGvSRdFJnE2MSyrKTIQ==" \ |
| 216 | + -e "KEY_PUB=iEyskoaYRwLDy5+0qNDqkbPdpxr0kXRSZxNjEsqykyE=" \ |
| 217 | + -v "$PWD/db:/db" -d rustdesk/rustdesk-server-s6:latest |
| 218 | +``` |
| 219 | + |
| 220 | +```yaml |
| 221 | +version: '3' |
| 222 | +
|
| 223 | +services: |
| 224 | + rustdesk-server: |
| 225 | + container_name: rustdesk-server |
| 226 | + ports: |
| 227 | + - 21115:21115 |
| 228 | + - 21116:21116 |
| 229 | + - 21116:21116/udp |
| 230 | + - 21117:21117 |
| 231 | + - 21118:21118 |
| 232 | + - 21119:21119 |
| 233 | + image: rustdesk/rustdesk-server-s6:latest |
| 234 | + environment: |
| 235 | + - "RELAY=rustdesk.example.com:21117" |
| 236 | + - "ENCRYPTED_ONLY=1" |
| 237 | + - "DB_URL=/db/db_v2.sqlite3" |
| 238 | + - "KEY_PRIV=FR2j78IxfwJNR+HjLluQ2Nh7eEryEeIZCwiQDPVe+PaITKyShphHAsPLn7So0OqRs92nGvSRdFJnE2MSyrKTIQ==" |
| 239 | + - "KEY_PUB=iEyskoaYRwLDy5+0qNDqkbPdpxr0kXRSZxNjEsqykyE=" |
| 240 | + volumes: |
| 241 | + - ./db:/db |
| 242 | + restart: unless-stopped |
| 243 | +``` |
| 244 | + |
| 245 | +#### 使用 Docker Secret 來儲存金鑰對 |
| 246 | + |
| 247 | +您還可以使用 Docker Secret來儲存金鑰。 |
| 248 | +如果您使用 **docker-compose** 或 **docker swarm**,這很有用。 |
| 249 | +只需按照以下示例操作: |
| 250 | + |
| 251 | +```bash |
| 252 | +cat secrets/id_ed25519.pub | docker secret create key_pub - |
| 253 | +cat secrets/id_ed25519 | docker secret create key_priv - |
| 254 | +docker service create --name rustdesk-server \ |
| 255 | + --secret key_priv --secret key_pub \ |
| 256 | + --net=host \ |
| 257 | + -e "RELAY=rustdeskrelay.example.com" \ |
| 258 | + -e "ENCRYPTED_ONLY=1" \ |
| 259 | + -e "DB_URL=/db/db_v2.sqlite3" \ |
| 260 | + --mount "type=bind,source=$PWD/db,destination=/db" \ |
| 261 | + rustdesk/rustdesk-server-s6:latest |
| 262 | +``` |
| 263 | + |
| 264 | +```yaml |
| 265 | +version: '3' |
| 266 | +
|
| 267 | +services: |
| 268 | + rustdesk-server: |
| 269 | + container_name: rustdesk-server |
| 270 | + ports: |
| 271 | + - 21115:21115 |
| 272 | + - 21116:21116 |
| 273 | + - 21116:21116/udp |
| 274 | + - 21117:21117 |
| 275 | + - 21118:21118 |
| 276 | + - 21119:21119 |
| 277 | + image: rustdesk/rustdesk-server-s6:latest |
| 278 | + environment: |
| 279 | + - "RELAY=rustdesk.example.com:21117" |
| 280 | + - "ENCRYPTED_ONLY=1" |
| 281 | + - "DB_URL=/db/db_v2.sqlite3" |
| 282 | + volumes: |
| 283 | + - ./db:/db |
| 284 | + restart: unless-stopped |
| 285 | + secrets: |
| 286 | + - key_pub |
| 287 | + - key_priv |
| 288 | +
|
| 289 | +secrets: |
| 290 | + key_pub: |
| 291 | + file: secrets/id_ed25519.pub |
| 292 | + key_priv: |
| 293 | + file: secrets/id_ed25519 |
| 294 | +``` |
| 295 | + |
| 296 | +## 如何建立金鑰對 |
| 297 | + |
| 298 | +加密需要一對金鑰;您可以按照前面所述提供它,但需要一種生成金鑰對的方法。 |
| 299 | + |
| 300 | +您可以使用以下命令生成一對金鑰: |
| 301 | + |
| 302 | +```bash |
| 303 | +/usr/bin/rustdesk-utils genkeypair |
| 304 | +``` |
| 305 | + |
| 306 | +如果您沒有(或不想)在系統上安裝 `rustdesk-utils` 套件,您可以使用 Docker執行相同的命令: |
| 307 | + |
| 308 | +```bash |
| 309 | +docker run --rm --entrypoint /usr/bin/rustdesk-utils rustdesk/rustdesk-server-s6:latest genkeypair |
| 310 | +``` |
| 311 | + |
| 312 | +輸出將類似於以下內容: |
| 313 | + |
| 314 | +```text |
| 315 | +Public Key: 8BLLhtzUBU/XKAH4mep3p+IX4DSApe7qbAwNH9nv4yA= |
| 316 | +Secret Key: egAVd44u33ZEUIDTtksGcHeVeAwywarEdHmf99KM5ajwEsuG3NQFT9coAfiZ6nen4hfgNICl7upsDA0f2e/jIA== |
| 317 | +``` |
| 318 | + |
| 319 | +## .deb 套件 |
| 320 | + |
| 321 | +每個執行檔都有單獨的 .deb 套件可供使用,您可以在 [releases](https://github.com/rustdesk/rustdesk-server/releases) 中找到它們。 |
| 322 | +這些套件適用於以下發行版: |
| 323 | + |
| 324 | +- Ubuntu 22.04 LTS |
| 325 | +- Ubuntu 20.04 LTS |
| 326 | +- Ubuntu 18.04 LTS |
| 327 | +- Debian 11 bullseye |
| 328 | +- Debian 10 buster |
| 329 | + |
| 330 | +## ENV 環境參數 |
| 331 | + |
| 332 | +可以使用這些 ENV 參數來配置 hbbs 和 hbbr。 |
| 333 | +您可以像往常一樣指定參數,或者使用 .env 文件。 |
| 334 | + |
| 335 | +| 參數 | 執行檔 | 敘述 | |
| 336 | +| --------------------- | --------- | -------------------------------------------------------------------- | |
| 337 | +| ALWAYS_USE_RELAY | hbbs | 如果設為 **"Y"**,禁止直接點對點連接 | |
| 338 | +| DB_URL | hbbs | 資料庫的路徑 | |
| 339 | +| DOWNGRADE_START_CHECK | hbbr | 降級檢查之前的延遲時間(以秒為單位) | |
| 340 | +| DOWNGRADE_THRESHOLD | hbbr | 降級檢查的閾值(bit/ms) | |
| 341 | +| KEY | hbbs/hbbr | 如果設置了,將強制使用特定金鑰,如果設為 **"_"**,則強制使用任何金鑰 | |
| 342 | +| LIMIT_SPEED | hbbr | 速度限制(以Mb/s為單位) | |
| 343 | +| PORT | hbbs/hbbr | 監聽端口(hbbs為21116,hbbr為21117) | |
| 344 | +| RELAY_SERVERS | hbbs | 運行hbbr的機器的IP地址/DNS名稱(用逗號分隔) | |
| 345 | +| RUST_LOG | all | 設定 debug level (error\|warn\|info\|debug\|trace) | |
| 346 | +| SINGLE_BANDWIDTH | hbbr | 單個連接的最大頻寬(以Mb/s為單位) | |
| 347 | +| TOTAL_BANDWIDTH | hbbr | 最大總頻寬(以Mb/s為單位) | |
0 commit comments