RustDesk 自托管远程桌面构建指南:vcpkg 依赖、Docker 编译流程与代码结构解析
本篇技术指南围绕 RustDesk 仓库的官方编译文档展开,完整覆盖从 vcpkg 编解码依赖安装、各 Linux 发行版系统依赖配置,到 Docker 容器化构建与可执行文件运行方式的全流程操作,并对照仓库源码(Cargo 清单、Dockerfile、构建脚本)说明每个步骤背后的实现依据。读完本文,你可以从零开始在本机或 Docker 环境中编译出可运行的 RustDesk 可执行文件,并清晰理解 libs/、src/、flutter/ 三大代码板块的分工。
项目定位:可自托管的远程桌面应用
RustDesk 是一个用 Rust 编写的远程控制桌面软件,其设计目标是对等方案(如 TeamViewer 类产品)的自托管替代品:功能开箱即用、无需强制依赖官方服务,数据完全由使用者自行掌控。使用者可以选择使用社区公共的 rendezvous/relay 服务器,也可以配置自己的服务器,或完全自行搭建 rendezvous/relay 服务。
对开发者而言,这种"客户端 + 可选自托管服务端"的架构意味着:只要能把 RustDesk 客户端编译出来,后续的所有服务端部署与网络穿透逻辑都建立在客户端这一套代码之上。因此官方文档将"如何编译"作为第一优先级内容,本文正是对其完整继承与源码级展开。
需要说明:仓库当前的包版本为 1.4.9,最低 Rust 工具链要求为 1.75(见 Cargo.toml 中 version 与 rust-version 字段),本文中的构建步骤以该仓库当前内容为准。
编译依赖总览:Rust/C++ 环境 + vcpkg + UI 动态库
三类依赖缺一不可
官方文档的"Dependencies"部分指出,桌面端使用 Flutter 或 Sciter(已弃用)作为 UI 层,而文档给出的最简路径是 Sciter 方案,因为入门更容易。完整构建需要三类依赖:
- Rust 与 C++ 开发环境:RustDesk 核心为 Rust,但底层编解码库(VPX、AV1、Opus 等)是 C/C++ 实现,需要 gcc/g++、CMake、Ninja 等工具链;
- vcpkg 安装的四个编解码包:
libvpx(VP8/VP9)、libyuv(YUV 像素格式转换)、opus(音频编码)、aom(AV1 编解码)。安装命令按平台区分:同时必须正确设置环境变量# Windows vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static # Linux/MacOS vcpkg install libvpx libyuv opus aomVCPKG_ROOT,指向 vcpkg 的安装根目录; - Sciter 动态库(仅 Sciter UI 构建需要):按平台下载
sciter.dll(Windows x64)、libsciter-gtk.so(Linux x64)、libsciter.dylib(macOS),放入构建产物目录即可。
从源码结构看,第 3 点与 Cargo.toml 的依赖声明互相印证:非 Android/iOS 目标下引入了 sciter-rs 绑定;而 flutter 是一个可选 feature(flutter = ["flutter_rust_bridge"]),并不包含在 default feature 中——因此默认 cargo run 走的就是 Sciter UI 路径,与文档描述一致。若未来切换 Flutter UI,则需显式开启 --features flutter。
仓库根目录的 vcpkg.json 进一步揭示了完整的依赖面:除了上述四个核心包,还通过 overlay-ports 指向 res/vcpkg 目录下的定制 port(aom、ffmpeg、libvpx、libyuv、mfx-dispatch、opus 均带有 RustDesk 自维护的补丁与 portfile),并通过 overlay-triplets 引用 res/vcpkg-triplets 中为 Android 各架构定制的 triplet 文件。其中 ffmpeg 仅在静态链接平台(Windows、Linux 非 32 位 ARM、macOS)引入,并带有 qsv/amf/nvcodec 硬件编解码 feature——对应 Cargo.toml 中的 hwcodec、vram、mediacodec、drm 等编译开关。也就是说,基础构建只需四个包,硬件加速构建才需要 ffmpeg 那一整套重依赖。
构建脚本如何消费 vcpkg
RustDesk 在编译期通过 build.rs 系列脚本把 vcpkg 产物接入链接器。例如主包 build.rs 中直接 std::env::var("VCPKG_ROOT") 读取该环境变量(Android 目标下还会把 installed/<triple>/lib 加入链接搜索路径);屏幕捕获库 libs/scrap/build.rs 则在找不到 VCPKG_ROOT 时给出明确的 panic 提示,并允许 macOS arm64 回退到 Homebrew 路径。这就是为什么环境变量配错时构建会直接失败而不是静默降级。
各 Linux 发行版的系统依赖安装
不同发行版的包名差异较大,官方文档按发行版给出了完整的 apt/zypper/yum/pacman 命令,以下逐一继承:
Ubuntu 18 / Debian 10
sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \
libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \
libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
openSUSE Tumbleweed
sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel
Fedora 28 / CentOS 8
sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel
Arch / Manjaro
sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire
这些依赖可以按功能归为四组:通用工具链(gcc/g++、cmake、nasm/yasm 汇编器、make)、GTK 3 与 X11 扩展(libgtk-3-dev、libxcb-*、libXfixes、libxdo)、音频栈(ALSA、PulseAudio、GStreamer)、辅助工具(clang、ninja-build、zip/unzip)。这与容器化构建中实际安装的系统包高度一致,可作为下文 Docker 章节的对照依据。
安装 vcpkg 与 libvpx 的 Fedora 补丁
官方文档将 vcpkg 固定在 2023.04.15 版本(Dockerfile 同样使用该 tag,保证 CI 与本地行为一致),安装步骤如下:
git clone https://github.com/microsoft/vcpkg
cd vcpkg
git checkout 2023.04.15
cd ..
vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=$HOME/vcpkg
vcpkg/vcpkg install libvpx libyuv opus aom
Fedora 上的 libvpx 修复(可选)
在 Fedora 上,libvpx 的 vcpkg 构建会因缺少 -fPIC 标志导致链接失败。官方文档给出的手工修复流程是:进入 vcpkg/buildtrees/libvpx/src 下的源码目录,执行 ./configure 后用 sed 给 Makefile 中的 CFLAGS/CXXFLAGS 注入 -fPIC,再 make 并把生成的 libvpx.a 复制到 $HOME/vcpkg/installed/x64-linux/lib/。遇到相同报错时可按此思路处理,或考虑换用其他发行版构建。
本机编译与运行(Sciter UI 路径)
环境准备完成后,完整的编译运行流程为:
# 1. 安装 Rust 工具链
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
# 2. 获取代码(本仓库地址)
git clone https://gitcode.com/GitHub_Trending/ru/rustdesk
cd rustdesk
# 3. 放置 Sciter 动态库
mkdir -p target/debug
# 下载 libsciter-gtk.so(Linux x64 版 Sciter 动态库)后:
mv libsciter-gtk.so target/debug
# 4. 编译并运行
VCPKG_ROOT=$HOME/vcpkg cargo run
运行产物与执行方式:
# debug 构建
target/debug/rustdesk
# release 构建(cargo run --release 或 cargo build --release)
target/release/rustdesk
两点重要注意事项(原文档明确强调):
- 必须从仓库根目录执行,否则应用可能找不到所需的资源文件;
- release 构建的优化配置相当激进:Cargo.toml 中
[profile.release]开启了lto = true、codegen-units = 1、panic = 'abort'、strip = true,因此 release 编译耗时明显更长,但产物更小、运行更快。
Docker 方式编译:一次构建,反复复用
官方文档提供了完整的容器化构建方案,避免在宿主机污染编译环境。核心思路是:用 Dockerfile 预装好全部工具链与 vcpkg 依赖构建基础镜像,之后每次编译只需把仓库目录挂载进容器跑 entrypoint 脚本。
第一步:构建构建器镜像
git clone https://gitcode.com/GitHub_Trending/ru/rustdesk
cd rustdesk
docker build -t "rustdesk-builder" .
仓库根目录的 Dockerfile 基于 debian:bullseye-slim,关键配置包括:
- 一次性安装与上文 Ubuntu 章节对应的系统包(g++/gcc、nasm/yasm、libgtk-3-dev、clang、各 libxcb/libx 开发包、ALSA/PulseAudio/GStreamer 等),并设置
DEBIAN_FRONTEND=noninteractive与VCPKG_FORCE_SYSTEM_BINARIES=1(后者让 vcpkg 复用系统的 cmake/gperf 等二进制,加快构建); - 源码编译安装 CMake 3.30.6;
- 克隆 vcpkg 并固定
--branch 2023.04.15,--disable-metrics安装libvpx libyuv opus aom四个包; - 创建非 root 的
user用户(/home/user),预先下载libsciter-gtk.so到其主目录,并以普通用户身份安装 Rust 工具链。
第二步:挂载仓库并执行编译
docker run --rm -it -v $PWD:/home/user/rustdesk \
-v rustdesk-git-cache:/home/user/.cargo/git \
-v rustdesk-registry-cache:/home/user/.cargo/registry \
-e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder
参数说明:
| 参数 | 作用 |
|---|---|
-v $PWD:/home/user/rustdesk |
把当前仓库目录挂载为容器内工作目录 |
-v rustdesk-git-cache:... / rustdesk-registry-cache:... |
两个命名卷分别缓存 Cargo 的 git 依赖与 crates registry,首次构建较慢(需拉取全部依赖),后续构建显著提速 |
-e PUID/PGID |
透传宿主机用户/组 ID,保证容器内生成的文件在宿主机上的属主正确 |
entrypoint 脚本的参数解析
容器入口是 entrypoint.sh,它会把 docker run 末尾追加的 <OPTIONAL-ARGS> 原样传给 cargo build。脚本内部逻辑(entrypoint.sh):
--release:置位 release 模式,并把libsciter-gtk.so拷贝到target/release/;--target <triple>:自动调用rustup target add添加交叉编译目标;- 未传
--release时,自动把动态库拷贝到target/debug/; - 最终执行
VCPKG_ROOT=/vcpkg cargo build --locked $argv,--locked保证严格使用 Cargo.lock 锁定的依赖版本。
因此,若想要一个优化过的 release 版本,只需在命令末尾追加参数:
docker run --rm -it -v $PWD:/home/user/rustdesk ... rustdesk-builder --release
文档同时提醒:install、run 等 cargo 子命令在此方式下不受支持,因为它们会在容器内部而非宿主机上安装/执行程序。构建产物落在挂载进来的仓库目录中,回到宿主机从仓库根目录执行:
target/debug/rustdesk # 或
target/release/rustdesk
代码文件结构:文档描述与源码事实对照
官方文档给出了仓库的板块划分,以下逐条继承,并结合当前仓库实际内容补充说明:
| 路径 | 职责(文档描述) | 源码侧印证 |
|---|---|---|
| libs/hbb_common | 视频编解码封装、配置、tcp/udp wrapper、protobuf、文件传输等公共工具 | 主包与 libs/scrap/build.rs 均依赖它;build.rs 中调用其 gen_version() 生成版本信息 |
| libs/scrap | 屏幕捕获 | 支持 Windows/macOS/Linux 多后端,帧格式为 packed BGRA;README 声明 Linux 需 XCB + SHM + RandR,Windows 需 DirectX 11.1;其 build.rs 负责对接 vcpkg/ffmpeg |
| libs/enigo | 各平台键盘/鼠标控制 | Cargo.toml 中以 features = ["with_serde"] 引入,含 linux/macos/win 三套实现 |
| libs/clipboard | Windows/Linux/macOS 的文件级复制粘贴实现 | 含 unix、windows 双平台子模块 |
| src/ui | Sciter UI(已弃用) | 由 sciter-rs 绑定加载 *.tis/*.html/*.css 资源 |
| src/server | 音频/剪贴板/输入/视频服务与网络连接 | 含 audio_service、video_service、input_service、clipboard_service 等服务模块 |
| src/client.rs | 发起 peer 连接 | 配合 src/client/ 下的 io_loop、screenshot、file_trait 等模块 |
| src/rendezvous_mediator.rs | 与 rustdesk-server 通信,等待直连(TCP 打洞)或中继(relayed)连接 | 该文件是 rendezvous 握手逻辑的入口,对应文档中"等待直接连接或间接中继"的描述 |
| src/platform | 平台相关代码 | 含 linux、macos、windows 子模块及特权脚本 |
| flutter | 桌面与移动端 Flutter UI | 完整 Dart 工程(android/ios/linux/macos/windows 平台目录),当前 UI 的主力演进方向 |
除文档列出的目录外,当前仓库的 Cargo.toml workspace 还纳入了 libs/virtual_display(Windows 虚拟显示器)、libs/portable(便携模式)与 libs/remote_printer(远程打印)三个库,反映项目在文档基础描述之上持续扩充的能力面。
合规声明
原文档附带的滥用免责声明同样重要:RustDesk 开发者不认可也不支持任何不道德或非法用途;未授权访问、越权控制、侵犯隐私等行为严格违背项目准则,作者不对应用的滥用承担责任。远程桌面工具应当仅用于获得明确授权的设备管理场景。
小结
本文完整继承了官方编译文档的骨架——vcpkg 四依赖安装、四大 Linux 发行版系统包清单、libvpx Fedora 补丁、rustup + cargo run 本机流程、Docker 两步构建法,以及仓库板块结构表——并在每一步补充了可核验的源码依据:VCPKG_ROOT 在 build.rs 中的读取位置、vcpkg.json 与 res/vcpkg 覆盖 port 的扩展依赖、Dockerfile 中固定的 vcpkg tag 与非 root 构建用户、entrypoint.sh 对 --release/--target 的解析、release profile 的 LTO/strip 优化配置。掌握以上内容后,你可以选择本机直编或 Docker 容器两条路径之一,稳定产出 RustDesk 的可执行文件,并在此基础上继续探索自托管服务端与网络穿透配置。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00