环境:
Nginx v1.27.4
Ubuntu v22.04.5 LTS
Docker version 26.1.3
Rustdesk Server OSS v1.1.14
Rustdesk windows exe 客户端 v1.2.7 /v 1.3.8
前面的文章 https://www.0z.gs/memo/rustdesk.html 提到了官方的 API 服务是需要付费订阅计划才可以
并且有且只有年付计划,9.9 美元 * 12 = 118.8 美元,按照此时此刻汇率 7.2634 计算,一年得花 862.8919 元
并且由于服务器在国外,面临一些网络风险,国际出口拥堵、被墙、线路质量、UDP 封锁等等不可抗拒因素
所以当然是自力更生,看看有没有第三方的开源项目,这里以之前提到的这个项目为例,部署一个自用
GitHub 项目地址
https://github.com/lantongxue/rustdesk-api-server-pro/
发现 readme 文档的说明有些不适配,修改了一下
这里使用 docker 方案部署
创建配置文件,并根据自己的需要修改自定义内容,主要是配置文件路径、签名密钥 signKey、 api 端口 port,如果不要自动化注册收发验证邮件、修改密码,smtpConfig 这个邮局配置弄不弄无所谓,
cat > /example/opt/server.yaml <<EOF signKey: "HtsglnQeimfgAmnwDOAXkDBLimHjoNkI" # 这里填写 32 位长度的随机字符作为签名密钥 debugMode: true db: driver: "sqlite" dsn: "./server.db" timeZone: "Asia/Shanghai" # 设置时区 showSql: false httpConfig: printRequestLog: true port: "127.0.0.1:1111" # 自定义 API 后端的端口,这里不直接对公网暴露端口,而是使用反向代理统一管理 smtpConfig: host: "127.0.0.1" port: 587 username: "admin@example.com" password: "example" encryption: "tls" # 不需要加密则填写 none,如果是 ssl 加密则为 ssl,这里我使用了 tls from: "example@example.com" jobsConfig: deviceCheckJob: duration: 30 EOF
- 运行容器,这里修改下,因为我按文档没走通,发现如果使用桥接模式自定义映射端口,一直无法访问容器内的端口,折腾很久一直没法解决这个问题,只能简单粗暴一把梭,直接指定 host 模式,就可以访问容器内的端口了,这里自己指定
-v
参数后面的宿主机配置文件路径,就是第一步创建的那个配置文件路径
另外,自己修改里面的创建的管理员用户名和密码 ADMIN_USER 、ADMIN_PASS
这里特别说明一下,无论是通过环境变量设置/或者 CLI 创建的第一个管理员,是无法通过前端 UI 或者 CLI 命令行删除的,且第一个管理员也无法修改用户名,只能删除容器重新部署才能删除首次创建的管理员账户,所以用户名不要乱设置(不过重新部署也不是很麻烦),等待开发者后续更新删除接口,或者自己去修改 sqlite 格式的server.db
数据库文件,改用户名信息
docker run \
--name rustdesk-api-server-pro \
--network host \
-d \
-e ADMIN_USER=admin \
-e ADMIN_PASS=admin \
-e TZ=Asia/Shanghai \
-v /example/opt/server.yaml:/app/server.yaml \
ghcr.io/lantongxue/rustdesk-api-server-pro:latest
也可以不在 docker 命令行设置环境变量设置管理员信息,容器运行后使用提供的 CLI 增加管理员
docker exec -it rustdesk-api-server-pro sh
进入容器内部后执行命令,exampleUsername 为用户名,examplePassword 为密码,--admin
参数表示该用户权限为管理员
./rustdesk-api-server-pro user add exampleUsername examplePassword --admin
启动后,我们再使用前端服务器作为统一对外管理暴露公网端口和 Https 证书部署
这里以 Nginx v1.27.4 为例,进行反向代理
参考配置如下
#PROXY-START /api for rustdesk client
location ^~ /api
{
proxy_pass http://127.0.0.1:1111;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
# proxy_hide_header Upgrade;
add_header X-Cache $upstream_cache_status;
}
#PROXY-END/
#PROXY-START /admin for web-ui
location ^~ /admin
{
proxy_pass http://127.0.0.1:1111/admin;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
# proxy_hide_header Upgrade;
add_header X-Cache $upstream_cache_status;
}
#PROXY-END/
然后复制容器里面的已构建好的前端 UI 到宿主机的 Nginx 反向代理的目录,自行修改宿主机的实际反向代理目录路径
docker cp rustdesk-api-server-pro:/app/dist /usr/share/nginx/html
- rustdesk 客户端如何填写
rustdesk 客户端 → 设置 → 网络 → API 服务器,填写你的 API 后端域名/IP,因为已经反向代理了,所以无需填写端口
如 https://rustdeskapi.example.com
ID 和 中继服务器对于单服务器部署而言,都是同一个意思,可以只填写 ID 服务器,中继服务器为空会默认使用 ID 服务器的值,API 服务器也同理,在单服务器部署场景下,只有 2 项必填,KEY 和 ID 服务器(中继和 API 服务器缺省使用 ID 服务器的值)
但这里我踩了个 BUG,有空可以提个 issue 给项目上游
在 Windows 7 下,rustdesk 客户端无法使用 https 加密的 API 后端,会在账户界面点击登录按钮后,还没输入时直接触发闪退,应该是 Windwos 7 缺少了一些 Win10 + 新增的 Windows API 导出函数,所以直接闪退了
使用 VxKex 项目来扩展 Windows 7 的系统函数解决这个问题
Win 7 API extensions
https://www.alipan.com/s/wsrsZj7HbLD
提取码 fj08
安装之后,对 Rustdesk 客户端右键,选择属性,选择 VxKex 标签页,启用如下选项
- 选择为此程序启用 VxKex NEXT
- 报告其他版本的 Windwos:Windows 10
如果创建了 rustdesk 快捷方式,可能需要对快捷方式再次设置一次 VxKex
设置之后可以保留 https 加密使用 API,如果不使用 vxkex,只能降级牺牲安全性,使用 http 明文通讯,改为
http://rustdeskapi.example.com
在 Windwos 10+ 的系统使用 https 的 API 后端无此问题
鸣谢
https://github.com/lantongxue/rustdesk-api-server-pro
https://github.com/rustdesk/rustdesk