RustDesk源码简单修复环境变量 让小白也能使用Github轻松编译

18次阅读
没有评论

前言

鼠标曾出过RustDesk的相关视频,鉴于项目作者勤恳的更新迭代,一些部署服务端和编译客户端的方法,都已经失效。毕竟粉丝需求大于天,今天鼠标就系统的讲下,从服务端部署,到客户端调用变量编译。教程非常简单,可以说有手就会系列,无需本地安装git等操作,全程网页操作!同时鼠标也会分享一些相关的,粉丝大佬基于原项目二开的项目。

温馨提示,本教程有些略长,如果有需要,请耐心看完本视频!每分每秒都是知识点哟!

准备工作

  • 固定IP服务器一台 服务器的选择,国内用户建议使用国内服务器,IP地理位置越近越好。
  • 备案域名一个(可选) 域名不是必须,国内服务器需要备案域名,国外服务器无需备案。
  • Github账号 没有github账号,可以注册一个,很简单,鼠标这里就不赘述,不会的可以自行度娘。
  • WindTerm 免费SSH客户端工具,用于通过SSH协议,远程连接服务器,当然,你也可以使用其他SSH工具。

部署服务端

准备工作做好后,我们还需要对服务器进行一些配置。

服务器配置

  1. 访问服务器提供商后台,如果你追求更好的稳定性,新开箱的服务器建议安装debian系统,当然这也不是必须的!

  2. 如果你的提供商后台有防火墙,请添加入站规则并开放如下端口:

    TCP:21114-21119,8089 #
    UDP:21116

    以上端口除了备用端口8089,其余都是RustDesk服务所用端口,备用端口可以根据自己喜好修改,此端口为接下来安装1panel的端口。

  3. 使用WindTerm通过SSH协议登录服务器,用户名及密码信息,可以在提供商后台查看或重置,成功登录服务器后会出现这个提示。

  4. 新装系统首次登录,建议更新下系统软件,终端控制台依次输入如下命令回车运行:

    sudo apt update
    sudo apt upgrade

    第一个命令是更新软件索引,第二个命令是更新软件,过程中可以能会提示输入Y等信息,我们根据提示输入回车确认即可。

    更新完毕后,输入如下命令,重启系统:

    reboot

域名解析(可选)

如果你有备案域名,或者你使用的是海外服务器,那么此时,我们就可以把域名,解析到这台服务器。解析方法每个域名托管商大同小异,给域名添加A记录解析:

  • 主机记录 如果解析主域名,直接输入@,解析二级域名,输入二级域名名称
  • 记录类型 选择A记录,也就是指向一个IPv4地址,譬如我们配置好的服务器IP

其他保持默认,最后点击确定或添加即可。

安装1panel

安装服务器管理面板,一方面可以降低操作难度,另一方面,可以更便捷的管理我们的项目!推荐安装1panel,免费的服务器运维管理面板,界面简洁美观,资源占用低,尤其对新手小白较友好!

  1. 在WindTerm的命令终端,输入如下命令回车,运行1panel一键安装脚本:

    bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)
  2. 过程中,根据提示确认各种参数,切记,端口要和我们之前开放的备用端口一致,直至安装完成!

  3. 安装完成后,在命令终端按住键盘Ctrl,点击这个连接,就可以在浏览器刚问1panel面板了,通过刚才设置的用户名及密码,登录1panel面板,这个就是他管理界面的样子

部署服务

此次,鼠标部署的RustDesk服务,非官方服务,而是github大佬@lejianwen,基于原版服务的二开,增加API用户管理等,详细说明可查看Github文档!

  1. 1panel管理页面,左侧导航点击<code>容器</code>,依次点击<code>编排</code>-<code>创建编排</code>

  2. 编排页面,确定勾选<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变量值,可以设置为复杂一些的字符串!修改好后,点击确认开始拉取部署镜像,直至完成!

  3. 控制台出现这个提示,rustdesk服务就部署完成了,回到容器页面,可以看到容器已经正常运行!点击日志,可以查看Key等信息,保存备用!

  4. 据作者文档说明,API密码可以在控制台查看,鼠标是始终没找见!算了!直接修改下吧!点击rustdesk容器终端,再点击<code>连接</code>,输入如下命令回车运行,就可以重置你的API密码了:

    ./apimain reset-admin-pwd <你的新密码>
  5. 此时,输入你的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从服务部署,到客户端编译,门槛不高,有手就会!视频中涉及的代码,以及一些网址资源,鼠标博客都可以免费查看下载!本期视频就到这里,感觉视频有用,那就点赞收藏一下吧!我是鼠标,谢谢您的观看!


正文完
 0

鼠标迁徙

温馨提示
作者为短视频博主,该网站文章笔记为视频文本!视频中相关的网站、代码及资源等,都可以在这里找到!

当然,你可以从以下媒体关注我:
笔记搜索
鼠标迁徙
鼠标迁徙
生如夏花之绚烂,死如秋叶之静美……
用户数
21
文章数
106
评论数
54
阅读量
75288
热门笔记
RustDesk源码简单修复环境变量 让小白也能使用Github轻松编译

RustDesk源码简单修复环境变量 让小白也能使用Github轻松编译

前言 鼠标曾出过RustDesk的相关视频,鉴于项目作者勤恳的更新迭代,一些部署服务端和编译客户端的方法,都已...
最新评论
love2542 love2542 不错不错
nomk nomk 这不是激活,这是破解。
3080483995@qq.com 3080483995@qq.com 下载的脚本失效了大佬 可以更新一下吗
smianao smianao 那个失效了!你去B站找原作者 下载最新的吧!抱歉啊!
老七 老七 博主 80G的镜像 博客没有找到安装地址啊,
皮皮超 皮皮超 老大,语法不对啊,docker添加不了
皮皮超 皮皮超 yml语法不对
hwlove hwlove 2025/08/03 09:14:08 创建编排 [rustdesk] 任务开始 [START]2025/08/03 09:14:29 编排创建输出: rustdesk Pulling Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awaiting headers) 2025/08/03 09:14:30 创建编排 失败: exit status 1 2025/08/03 09:14:31 [TASK-END] 为啥我的失败??????????
xzy0701 xzy0701 hi你好,我看了你youtube的部署视频,部署很简单,现在有一个问题,就是我已经做了内网穿透,不过没有做域名,我在外网直接通过ip无法访问,请问是否还需要做些网络配置,或者在外网必须要做域名,我用的也是飞牛
a995718 a995718 大佬什么时候出一期在本地编译的教程