前言
鼠标曾出过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 官方免费版
sbqx.cc

WindTerm 2.7.0 官方版
sbqx.cc