简介

我们常用的远程工具有向日葵,todesk等,虽然是可以免费使用,但是是有限制的,自己部署的RustDesk就没有任何限制了,但是前提是你要有自己的服务器

如果你不是经常使用远程桌面工具,或者是没有自己的服务器,我感觉就没必要自己部署,毕竟租一个服务器一个月最低的也要二三十块,都可以开通各个大厂的远程工具的会员了

如果想要所有数据走自己的服务,不想数据走其他厂商的服务,或者是恰好有服务器,那么可以自己部署一个玩玩



第一步:安装docker和docker compose

这里我使用的是docker部署

如果你的服务器上已经安装了docker和docker compose,那么就可以跳过这一步

如果你的服务器还没有安装,那么安装教程可以查看我之前的文章《从零开始学习Docker--Docker的安装和配置仓库源加速



第二步:修改配置文件

这里使用到的项目是lejianwen/rustdesk-api,我们使用里面的配置文件来修改就可以

项目地址:https://github.com/lejianwen/rustdesk-api

打开项目地址

1.png

滑倒最底下就可以看到docker-compose.yaml文件的内容了

2.png

下面是这个配置文件的解释

     networks:
   rustdesk-net:
     external: false
 services:
   rustdesk:
     ports:
       # 映射21114端口TCP协议:用于网页控制台
       - 21114:21114
       # 映射21115端口TCP协议:用于NAT类型测试
       - 21115:21115
       # 映射21116端口TCP协议:用于ID注册和星跳服务(UDP),以及TCP打动和连接服务(TCP)。需要同时启用TCP和UDP
       - 21116:21116
       # 映射 21116 端口 (UDP):用于 ID 注册和心跳服务。
       - 21116:21116/udp
       # 映射 21117 端口 (TCP):用于中继服务。
       - 21117:21117
       # 映射 21118 端口 (TCP):用于支持网页客户端。
       - 21118:21118
       # 映射 21119 端口 (TCP):用于支持网页客户端。
       - 21119:21119
      # 使用的镜像
     image: lejianwen/rustdesk-server-s6:latest
     environment:
       # 设置中继服务器地址,如果没有域名则是ip地址:端口(http://192.168.99.2:21117),如果有域名则把ip地址替换成域名,端口保持21117
       - RELAY=http://ip地址:21117
       # 启用加密模式,1是启用,0是禁用
       - ENCRYPTED_ONLY=1
       # 是否必须登录才能使用远程,Y是是,N是否
       - MUST_LOGIN=N
       # 时区
       - TZ=Asia/Shanghai
       # 设置ID服务器地址
       - RUSTDESK_API_RUSTDESK_ID_SERVER=http://ip或者域名:21116
       # 设置中继服务器地址
       - RUSTDESK_API_RUSTDESK_RELAY_SERVER=http://ip或者域名:21117
       # 设置API服务器地址
       - RUSTDESK_API_RUSTDESK_API_SERVER=http://ip或者域名:21114
       # API密钥文件路径,保持默认即可
       - RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub
       # JWT 密钥,留空表示不启用
       - RUSTDESK_API_JWT_KEY=
     volumes:
       # 数据持久化
       - /data/rustdesk/server:/data
       - /data/rustdesk/api:/app/data #将数据库挂载
     networks:
       - rustdesk-net
     # 容器停止时自动重启,除非手动停止
     restart: unless-stopped

上面的配置文件中已经帮我们配置了必须要的东西,我们需要在上面的配置文件中进行修改,大家使用下面配置的时候一定要一项一项的看,只要看到http://ip或域名的就替换成你服务器的ip或者是域名。

 networks:
   rustdesk-net:
     external: false
 services:
   rustdesk:
     ports:
       # 映射21114端口TCP协议:用于网页控制台
       - 21114:21114
       # 映射21115端口TCP协议:用于NAT类型测试
       - 21115:21115
       # 映射21116端口TCP协议:用于ID注册和星跳服务(UDP),以及TCP打动和连接服务(TCP)。需要同时启用TCP和UDP
       - 21116:21116
       # 映射 21116 端口 (UDP):用于 ID 注册和心跳服务。
       - 21116:21116/udp
       # 映射 21117 端口 (TCP):用于中继服务。
       - 21117:21117
       # 映射 21118 端口 (TCP):用于支持网页客户端。
       - 21118:21118
       # 映射 21119 端口 (TCP):用于支持网页客户端。
       - 21119:21119
      # 使用的镜像
     image: lejianwen/rustdesk-server-s6:latest
     environment:
       # 设置中继服务器地址,如果没有域名则是ip地址:端口(http://192.168.99.2:21117),如果有域名则把ip地址替换成域名,端口保持21117
       - RELAY=http://ip或域名:21117
       # 启用加密模式,1是启用,0是禁用
       - ENCRYPTED_ONLY=1
       # 是否必须登录才能使用远程,Y是是,N是否
       - MUST_LOGIN=Y
       # 时区
       - TZ=Asia/Shanghai
       # 设置ID服务器地址
       - RUSTDESK_API_RUSTDESK_ID_SERVER=http://ip或域名:21116
       # 设置中继服务器地址
       - RUSTDESK_API_RUSTDESK_RELAY_SERVER=http://ip或域名:21117
       # 设置API服务器地址
       - RUSTDESK_API_RUSTDESK_API_SERVER=http://ip或域名
       # API密钥文件路径,保持默认即可
       - RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub
       # JWT 密钥,留空表示不启用
       - RUSTDESK_API_JWT_KEY=
       #---------------------------------------------以下为新增----------------------------------------------------------------------------
       # 设置 WebSocket 服务器地址
       - RUSTDESK_API_RUSTDESK_WS_HOST=http://ip或域名
       # JWT 过期时间,留空表示不启用
       - RUSTDESK_API_JWT_EXPIRE_DURATION=
       # 是否启用web-client; 1:启用,0:不启用; 默认启用
       - RUSTDESK_API_APP_WEB_CLIENT=1
       # 是否开启注册; true, false 默认false
       - RUSTDESK_API_APP_REGISTER=false
       # token有效时长
       - RUSTDESK_API_APP_TOKEN_EXPIRE=168h
       # 是否禁用密码登录; true, false 默认false
       - RUSTDESK_API_APP_DISABLE_PWD_LOGIN=false
       # 注册用户默认状态; 1 启用,2 禁用, 默认 1
       - RUSTDESK_API_APP_REGISTER_STATUS=1
       # 验证码触发次数; -1 不启用, 0 一直启用, >0 登录错误次数后启用 ;默认 3
       - RUSTDESK_API_APP_CAPTCHA_THRESHOLD=3
       # 封禁IP触发次数; 0 不启用, >0 登录错误次数后封禁IP; 默认 0
       - RUSTDESK_API_APP_BAN_THRESHOLD=5   
       # 后台标题
       - RUSTDESK_API_ADMIN_TITLE=RustDesk管理
       # Web client v2 中是否启用新的在线状态查询方法; 1:启用,0:不启用,默认不启用
       - RUSTDESK_API_RUSTDESK_WEBCLIENT_MAGIC_QUERYONLINE=1
       #---------------------------------------------以上为新增----------------------------------------------------------------------------
     volumes:
       # 数据持久化
       - /opt/rustdesk/data/server:/data
       - /opt/rustdesk/data/api:/app/data #将数据库挂载
     networks:
       - rustdesk-net
     # 容器停止时自动重启,除非手动停止
     restart: unless-stopped


第三步:创建目录

根据自己的使用习惯创建目录,我习惯是自己安装的东西都放在/opt目录下,我就需要在/opt目录下创建rustdesk目录,rustdesk目录下有data目录和config目录,data目录下面有api目录和server目录

我的目录结构为:

/
|--opt
   |--rustdesk
         |--data
         |     |--api
         |     |--server
         |--config

3.png



第四步:创建docker-compose.yaml文件

进入/opt/rustdesk/config目录,创建一个名称为docker-compose.yaml的文件

4.png

然后把我们刚刚第二步修改好的配置文件粘贴进去,然后保存退出

5.png



第五步:启动

config目录使用下面命令启动容器

docker compose up -d

等待拉取镜像完成后启动好后可以使用下面命令查看是否启动

docker ps

6.png

这时候其实使用ip加端口或者是域名加端口已经可以访问了

7.png



第六步:登录

默认用户名是admin,密码是随机的,我们使用下面命令查看密码

首先使用下面命令查看容器名称

docker ps

8.png

然后使用查看日志命令查看容器的日志

docker logs 容器名称

日志里面有一行Admin Password Is:后面就是密码

9.png

填写完成后点击登录就可以登录上去了

10.png



第七步:配置客户端

客户端项目地址:https://github.com/rustdesk/rustdesk

到项目地址里面下载适合自己的客户端

打开客户端,点击ID右边的三个点

11.png

点击【网络】

12.png

点击【ID/中继服务器】

13.png

按照我们的配置文件找到ID服务器中继服务器API服务器的地址填上去,最关键的KEY可以在日志中找到

14.png

9.png

填写完成后点击确定,然后返回主页,看到底部有就绪两个字就是成功了

15.png



配置反向代理(非必须)

我使用了nginx配置了反向代理,同时开启了https

因为每个人使用的nginx面板不一样,还有有的直接不使用面板,纯的nginx,所以这里不详细讲解怎么配置

配置反向代理的思路为以下

一、创建一个空站点

二、修改站点的nginx的配置文件,在配置文件中添加反向代理,证书等

下面是我反向代理的配置文件模板

# -----------------------------------------------------------
# Nginx 反向代理模板
# 支持 WebSocket、IPv6、标准化 Forwarded 头、HTTP→HTTPS
# -----------------------------------------------------------
# 处理 WebSocket 升级:如果请求头有 Upgrade,则 Connection 设置为 upgrade,否则 close
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
# 生成符合 RFC 7239 的标准化 Forwarded 头
map $remote_addr $proxy_forwarded_elem {
    # IPv4: 直接使用
    ~^[0-9.]+$ "for=$remote_addr";
    # IPv6: 用 [] 括起来并加引号
    ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";
    # Unix Socket: 无法表示,用 unknown
    default "for=unknown";
}
# 如果请求已带 Forwarded 头,追加;否则新增
map $http_forwarded $proxy_add_forwarded {
    "~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=.*)?(;.*?)*([ \\t]*,.*?)*$" "$http_forwarded, $proxy_forwarded_elem";
    default "$proxy_forwarded_elem";
}
# -----------------------------------------------------------
# HTTP 服务器:监听 80,自动重定向到 HTTPS
# -----------------------------------------------------------
server {
    listen 80;
    listen [::]:80;
    server_name ****.********.top;
    # 防止 Host 被伪造
    if ($host != $server_name) {
        return 404;
    }
    # Let's Encrypt 验证路径,需放行,不跳转
    location ~ /.well-known/acme-challenge {
        proxy_pass http://127.0.0.1:9180;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
    }
    # 其他所有请求都重定向到 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}
# -----------------------------------------------------------
# HTTPS 服务器:监听 443,反向代理到后端
# -----------------------------------------------------------
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ****.********.top;
    # SSL 证书
    ssl_certificate /etc/nginx/ssl/****.********.top_P256/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/****.********.top_P256/private.key;
    # 启用 TLS 1.2 和 TLS 1.3
    ssl_protocols TLSv1.2 TLSv1.3;
    # 使用推荐的加密套件
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    # 防止 Host 被伪造
    if ($host != $server_name) {
        return 404;
    }
    # 主业务代理
    location / {
        proxy_pass http://127.0.0.1:21114/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_redirect off;
        # 常规头
        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;
        proxy_set_header Forwarded $proxy_add_forwarded;
    }
    location ~ /.well-known/acme-challenge {
        proxy_set_header Host $host;
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
        proxy_pass http://127.0.0.1:9180;
    }
    # WebSocket 代理设置
    location /ws/id {
        proxy_pass http://127.0.0.1:21118;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        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;
    }
    location /ws/relay {
        proxy_pass http://127.0.0.1:21119;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        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;
    }
}
二维码

发表评论