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

1,677次阅读
没有评论

前言

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


正文完
 7