前言
鼠标曾出过 RustDesk 的相关视频,鉴于项目作者勤恳的更新迭代,一些部署服务端和编译客户端的方法,都已经失效。毕竟粉丝需求大于天,今天鼠标就系统的讲下,从服务端部署,到客户端调用变量编译。教程非常简单,可以说有手就会系列,无需本地安装 git 等操作,全程网页操作!同时鼠标也会分享一些相关的,粉丝大佬基于原项目二开的项目。
温馨提示,本教程有些略长,如果有需要,请耐心看完本视频!每分每秒都是知识点哟!
准备工作
- 固定 IP 服务器一台 服务器的选择,国内用户建议使用国内服务器,IP 地理位置越近越好。
- 备案域名一个(可选) 域名不是必须,国内服务器需要备案域名,国外服务器无需备案。
- Github 账号 没有 github 账号,可以注册一个,很简单,鼠标这里就不赘述,不会的可以自行度娘。
- WindTerm 免费 SSH 客户端工具,用于通过 SSH 协议,远程连接服务器,当然,你也可以使用其他 SSH 工具。
部署服务端
准备工作做好后,我们还需要对服务器进行一些配置。
服务器配置
-
访问服务器提供商后台,如果你追求更好的稳定性,新开箱的服务器建议安装 debian 系统,当然这也不是必须的!
-
如果你的提供商后台有防火墙,请添加入站规则并开放如下端口:
TCP:21114-21119,8089 UDP:21116以上端口除了备用端口 8089,其余都是 RustDesk 服务所用端口,备用端口可以根据自己喜好修改,此端口为接下来安装 1panel 的端口。
-
使用 WindTerm 通过 SSH 协议登录服务器,用户名及密码信息,可以在提供商后台查看或重置,成功登录服务器后会出现这个提示。
-
新装系统首次登录,建议更新下系统软件,终端控制台依次输入如下命令回车运行:
sudo apt update sudo apt upgrade第一个命令是更新软件索引,第二个命令是更新软件,过程中可以能会提示输入 Y 等信息,我们根据提示输入回车确认即可。
更新完毕后,输入如下命令,重启系统:
reboot
域名解析(可选)
如果你有备案域名,或者你使用的是海外服务器,那么此时,我们就可以把域名,解析到这台服务器。解析方法每个域名托管商大同小异,给域名添加 A 记录解析:
- 主机记录 如果解析主域名,直接输入 @,解析二级域名,输入二级域名名称
- 记录类型 选择 A 记录,也就是指向一个 IPv4 地址,譬如我们配置好的服务器 IP
其他保持默认,最后点击确定或添加即可。
安装 1panel
安装服务器管理面板,一方面可以降低操作难度,另一方面,可以更便捷的管理我们的项目!推荐安装 1panel,免费的服务器运维管理面板,界面简洁美观,资源占用低,尤其对新手小白较友好!
-
在 WindTerm 的命令终端,输入如下命令回车,运行 1panel 一键安装脚本:
bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh) -
过程中,根据提示确认各种参数,切记,端口要和我们之前开放的备用端口一致,直至安装完成!
-
安装完成后,在命令终端按住键盘 Ctrl,点击这个连接,就可以在浏览器刚问 1panel 面板了,通过刚才设置的用户名及密码,登录 1panel 面板,这个就是他管理界面的样子
部署服务
此次,鼠标部署的 RustDesk 服务,非官方服务,而是 github 大佬@lejianwen,基于原版服务的二开,增加 API 用户管理等,详细说明可查看 Github 文档!
-
1panel 管理页面,左侧导航点击 <code> 容器 </code>,依次点击 <code> 编排 </code>-<code> 创建编排 </code>
-
编排页面,确定勾选 <code> 编辑 </code>,文件夹名称随意,譬如我输入 <code>rustdesk</code>,将如下代码粘贴到编辑区:
networks: rustdesk-net: external: false services: rustdesk: ports: - 21114:21114 - 21115:21115 - 21116:21116 - 21116:21116/udp - 21117:21117 - 21118:21118 - 21119:21119 image: lejianwen/rustdesk-server-s6:latest environment: - RELAY=8.8.8.8:21117 - ENCRYPTED_ONLY=1 - MUST_LOGIN=Y - TZ=Asia/Shanghai - RUSTDESK_API_RUSTDESK_ID_SERVER=8.8.8.8:21116 - RUSTDESK_API_RUSTDESK_RELAY_SERVER=8.8.8.8:21117 - RUSTDESK_API_RUSTDESK_API_SERVER=http://8.8.8.8:21114 - RUSTDESK_API_KEY_FILE=/data/id_ed25519.pub - RUSTDESK_API_JWT_KEY=123456 # jwt key volumes: - /data/rustdesk/server:/data - /data/rustdesk/api:/app/data #将数据库挂载 networks: - rustdesk-net restart: unless-stopped上述代码中,你只需将 IP 地址 8.8.8.8,改为你自己的服务器 IP 或域名;JWT_KEY 变量值,可以设置为复杂一些的字符串!修改好后,点击确认开始拉取部署镜像,直至完成!
-
控制台出现这个提示,rustdesk 服务就部署完成了,回到容器页面,可以看到容器已经正常运行!点击日志,可以查看 Key 等信息,保存备用!
-
据作者文档说明,API 密码可以在控制台查看,鼠标是始终没找见!算了!直接修改下吧!点击 rustdesk 容器终端,再点击 <code> 连接 </code>,输入如下命令回车运行,就可以重置你的 API 密码了:
./apimain reset-admin-pwd <你的新密码> -
此时,输入你的 IP/ 域名 + 端口 21114,就可以访问 API 服务了,默认用户名为 admin,密码就是我们刚刚设置的!通过 API 管理后台,我们可以进行用户设备管理等操作,具体可以看作者Github 文档。
通过以上步骤,我们成功部署了 RustDesk 的服务端。只要防火墙正确放行端口,容器也正常启动,服务基本上是没有问题的!下面,咱们就开始着手编译 rustdesk 客户端!
客户端编译
早期,官方 github 项目是允许配置变量,直接编译的!后来,作者出于被过分滥用的考虑,删除了变量调用!鼠标也出过相应教程,修改源码,实现服务器等信息内置!操作起来,虽说没有什么难度,但是对于小白来说,却也不是怎么友好!这次好了,无需本地环境,无需复杂的 git 命令,全程在 web 网页操作!
Fork 项目
登录 Github 账号,访问 rustdesk官方项目 仓库,将客户端项目 fork 到我们自己的仓库;同时,访问子模块,并将子模块也一并 fork 到我们的仓库。
源码修改
fork 到我们仓库的源码,我们有三个地方需要修改,分别是子模块地址、工作流变量读取、配置文件变量调用。
-
子模块地址修改
该文件位于主仓库目录下的 <code>.gitmodules</code> 文件,点击查看该文件,点击这个图标进入编辑模式,修改这个地址,将这里替换为你的用户名,也就我们 fork 后的子模块仓库地址。修改完后点击这里的 <code>Commit changes</code> 这里填写下备注,譬如:修改子模块地址,最后点击 <code>Commit changes</code> 保存。
-
工作流变量读取修改
该文件位于主仓库目录下 <code>.github/workflows/flutter-build.yml</code> 文件,编辑方法同上,在代码的第 49 行添加如下代码:
RS_PUB_KEY: "${{secrets.RS_PUB_KEY}}" RENDEZVOUS_SERVER: "${{secrets.RENDEZVOUS_SERVER}}" API_SERVER: "${{secrets.API_SERVER}}" -
配置文件变量调用
该文件位于子模块仓库目录 <code>src/config.rs</code> 文件,Ctrl+ F 搜索定位如下代码行:(如果过程中无法修改,可切换到 main 分支)
pub const RS_PUB_KEY: &str = "OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=";搜索结果替换为如下代码:
pub const PUBLIC_RS_PUB_KEY: &str = "OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw="; pub const RS_PUB_KEY: &str = match option_env!("RS_PUB_KEY") {Some(key) if !key.is_empty() => key, _ => PUBLIC_RS_PUB_KEY, };接着,Ctrl+ F 搜索定位如下代码行:
pub static ref PROD_RENDEZVOUS_SERVER: RwLock= RwLock::new("".to_owned()); 搜索结果替换为如下代码:
pub static ref PROD_RENDEZVOUS_SERVER: RwLock= RwLock::new(match option_env!("RENDEZVOUS_SERVER") {Some(key) if !key.is_empty() => key, _ => "", }.to_owned()); 粘贴后的代码,我们可以使用 Tab 键及 Shift+Tab 键,来调整代码缩进格式。这次代码提交后,我们需要记录下本次提交的 hash 值,后面会用到!
修改 commit 指针
虽然我们修改了子模块的的地址,但是它链接的是之前的 commit,点进去你会发现,我们之前修改子模块的 config.rs 文件,根本没生效!所以,我们要修改 commit 指针,也就是指向我们刚刚修改的子模块 commit。
如何修改?还是将项目克隆到本地?用 git 重新提交?小白抗议,这太繁琐,太麻烦!跟着我操作,超级简单,网页也能修改 commit 指针!
-
创建 Github token
依次点击用户中心 - <code>Settings</code> - <code>Developer settings</code>,第三项展开选择 <code>tokens</code>,生成新 token 展开,选中第二项,Note 这里随意填写,勾选 <code>repo</code>,其他默认即可,最后点击生成 token,保存 token 备用!
-
修改 commit 指针
主仓库界面快捷键 <code>Ctrl+Shift+I</code> 打开浏览器控制台,将如下代码粘贴到控制台:
// 替换为您的实际信息 const owner = '用户名'; const repo = '仓库名'; const submodulePath = 'libs/hbb_common'; const newCommitHash = 'commit hash 值'; // 替换为实际的 commit hash const branch = 'master'; // 或 'master',根据您的仓库 async function updateSubmodule() { try { // 获取 GitHub Token const token = prompt('请输入您的 GitHub Personal Access Token (需要 repo 权限):'); if (!token) {alert('需要 Token 才能继续'); return; } const headers = {'Authorization':token ${token}, 'Content-Type': 'application/json', 'Accept': 'application/vnd.github.v3+json' }; console.log('1. 获取分支引用...'); // 1. 获取当前分支引用 const refResponse = await fetch(https://api.github.com/repos/${owner}/${repo}/git/refs/heads/${branch}, {headers: headers}); if (!refResponse.ok) {throw new Error(获取分支引用失败: ${refResponse.status} ${refResponse.statusText}); } const refData = await refResponse.json(); const currentCommitSha = refData.object.sha; console.log('当前提交 SHA:', currentCommitSha); // 2. 获取提交对象 console.log('2. 获取提交对象...'); const commitResponse = await fetch(https://api.github.com/repos/${owner}/${repo}/git/commits/${currentCommitSha}, {headers: headers}); if (!commitResponse.ok) {throw new Error(获取提交对象失败: ${commitResponse.status} ${commitResponse.statusText}); } const commitData = await commitResponse.json(); const treeSha = commitData.tree.sha; console.log('当前树 SHA:', treeSha); // 3. 创建新树 console.log('3. 创建新树...'); const treeResponse = await fetch(https://api.github.com/repos/${owner}/${repo}/git/trees, { method: 'POST', headers: headers, body: JSON.stringify({ base_tree: treeSha, tree: [ { path: submodulePath, mode: '160000', // 子模块的特殊模式 type: 'commit', sha: newCommitHash } ] }) }); if (!treeResponse.ok) {const errorText = await treeResponse.text(); throw new Error(创建树失败: ${treeResponse.status} ${treeResponse.statusText} - ${errorText}); } const treeData = await treeResponse.json(); console.log('新树 SHA:', treeData.sha); // 4. 创建新提交 console.log('4. 创建新提交...'); const newCommitResponse = await fetch(https://api.github.com/repos/${owner}/${repo}/git/commits, { method: 'POST', headers: headers, body: JSON.stringify({message:Update ${submodulePath} submodule to ${newCommitHash.substring(0, 8)}, tree: treeData.sha, parents: [currentCommitSha] }) }); if (!newCommitResponse.ok) {const errorText = await newCommitResponse.text(); throw new Error(创建提交失败: ${newCommitResponse.status} ${newCommitResponse.statusText} - ${errorText}); } const newCommitData = await newCommitResponse.json(); console.log('新提交 SHA:', newCommitData.sha); // 5. 更新分支引用 console.log('5. 更新分支引用...'); const updateRefResponse = await fetch(https://api.github.com/repos/${owner}/${repo}/git/refs/heads/${branch}, { method: 'PATCH', headers: headers, body: JSON.stringify({ sha: newCommitData.sha, force: false }) }); if (!updateRefResponse.ok) {const errorText = await updateRefResponse.text(); throw new Error(更新引用失败: ${updateRefResponse.status} ${updateRefResponse.statusText} - ${errorText}); } console.log('子模块更新成功!'); alert(✅ 子模块更新成功!\n 新提交: ${newCommitData.sha.substring(0, 8)}); } catch (error) {console.error('错误:', error); alert(❌ 更新失败: ${error.message}); } } // 执行函数 updateSubmodule();以上代码,第 2.3.5 行分别修改为你实际的 gtihub 用户名、仓库名,以及之前鼠标让你保存的 commit hash 值,回车运行,会提示你输入 token,将我们刚获取的 token 填入,并点击确定!片刻,commit 指针就更改好了!我们可以点击子模块,测试 config 文件是否修改!
添加变量
项目主仓库,点击 <code>Settings</code>,展开这个选项点击 <code>Actions</code>。右侧窗口分别添加如下变量:
API_SERVER //API 变量 例:http:127.0.0.1:21114
RENDEZVOUS_SERVER // 中继服务器变量 例:127.0.0.1
RS_PUB_KEY // 服务端 KEY 变量 例:OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=
运行工作流
变量添加好后,我们就可以编译了,也就是运行 Gtihub Actions 工作流。运行之前,要确定主仓库设置里,Actions 的常规设置,这两个选项是选中状态!
主仓库点击 <code>Actions</code>,查看更多,选中这个文件,点击这里开启工作流,再点击这里运行工作流,剩下就是耐心的等了!一个小时左右,就会编译完成!在你项目的 Releases 里,就可以下载对应系统的客户端了!
二开推荐
鼠标的方法,基于原版修复了变量,几乎没有什么改动,也没有啥技术含量!感觉自己修改麻烦,也可以直接 fork我的主仓库 ,添加三个变量,就可以编译你自己的客户端了!如果你感觉这样不能满足你的需求,咱们有个粉丝大佬,基于原版,添加了很多功能,譬如固定密码无人值守之类的,感兴趣的也可以直接 fork 它的仓库!使用了人家的项目的同时,给人家点个 Star,即使你白嫖了,也要肯定人家的无私付出吧!
总结
以上,就是本期视频的全部内容!rustdesk 从服务部署,到客户端编译,门槛不高,有手就会!视频中涉及的代码,以及一些网址资源,鼠标博客都可以免费查看下载!本期视频就到这里,感觉视频有用,那就点赞收藏一下吧!我是鼠标,谢谢您的观看!

Watt Toolkit v3.0.0-rc.16 官方免费版
smianao.com

WindTerm 2.7.0 官方版
smianao.com