基于RustDesk自建服务器实战指南(跨平台免费多设备远程控制)
文章目录
- 基于RustDesk自建服务器实战指南(跨平台免费多设备远程控制)
-
- 前言
- 一、主流远程控制方案全景解析
- 二、使用Docker搭建RustDesk服务端教程
-
- (一)环境检查与配置
- [(二)使用Docker Compose部署RustDesk](#(二)使用Docker Compose部署RustDesk)
- (三)客户端配置与连接测试
- 一键部署脚本(五星推荐)
- 部署后验证
- 三、常见错误
-
- [1. 安装过程中 docker-compose-plugin 包下载失败](#1. 安装过程中 docker-compose-plugin 包下载失败)
- [2. 下载Docker Compose失败,Empty reply from server](#2. 下载Docker Compose失败,Empty reply from server)
- [3. docker pull镜像时网络超时的问题](#3. docker pull镜像时网络超时的问题)
- 四、后记
前言
在当今多设备互联的时代,远程控制技术 已成为企业远程运维、个人技术支持和跨设备协作的重要工具。特别是对安卓设备的远程控制需求日益增长,从协助长辈解决手机使用问题,到企业批量管理移动设备,都离不开高效可靠的远程控制方案。
然而,实现高质量的安卓设备远程控制面临诸多技术挑战:系统权限限制 是最大障碍,安卓系统沙盒安全机制和权限隔离使得免Root控制异常困难;网络环境复杂性 包括NAT穿透、防火墙限制和延迟抖动等问题;跨平台兼容性 要求解决方案能覆盖Windows、macOS、iOS和Android等多种操作系统;安全性与隐私保护更是重中之重,需要防范未授权访问和数据泄露风险。
一、主流远程控制方案全景解析
在深入探讨自建服务器方案之前,我们有必要对当前主流的远程控制方案进行一次全面的梳理与分析。根据其服务架构和技术实现,市面上的远程控制解决方案大致可以分为三类,各具特色,也各有取舍。
三大技术架构的博弈

-
成熟商用软件(SaaS模式)
- 代表产品:ToDesk、向日葵、AnyDesk、TeamViewer
- 核心逻辑:使用服务商提供的统一中继服务器集群,用户通过注册账户实现设备发现和连接。开箱即用,无需关心网络环境。
- 优点:部署简单,功能丰富(如远程文件、远程终端、高清模式),通常有跨平台客户端支持。
- 缺点 :数据流经第三方服务器 ,对隐私敏感场景存在顾虑;免费版本在速度、分辨率、功能上有明确限制;个人使用可能因高频触发而被判定为商用导致限速或付费。
-
IP直达(点对点直连)
- 代表技术:Windows RDP、VNC、通过VPN打通内网后的SSH/远程桌面
- 核心逻辑:控制端通过IP地址(或主机名)直接访问被控端,不依赖第三方服务器中转。
- 优点 :延迟最低 ,连接质量最优;数据不出私网,安全性高。
- 缺点 :极度依赖网络环境 ,要求两端至少一端拥有公网IP,或已通过VPN/内网穿透等技术处于同一局域网,配置复杂,对普通用户极不友好。
-
自建服务器(私有化部署)
- 代表方案:RustDesk、部分企业级远程管理系统的私有化部署版
- 核心逻辑:用户在自有服务器上搭建中继服务,替代商业软件的中转服务器,实现"自主可控"。
- 优点 :数据完全私密,连接速度和稳定性取决于自有服务器质量,可摆脱商业软件的各种限制,长期成本可预期。
- 缺点 :存在一定的初始部署和技术维护成本,需要用户具备基础的服务器运维能力。
聚焦安卓:商用方案的"甜蜜"与"痛点"
针对控制安卓设备这一细分场景,市面上也涌现了诸多解决方案。我们将几款主流工具对安卓设备的控制能力与痛点整理如下:
| 工具名称 | 控制安卓能力 | 核心优势 | 主要痛点与槽点 |
|---|---|---|---|
| ToDesk | 支持 | 连接速度快,国产软件对国内网络优化好,免费版相对良心。 | 免费版存在设备数量限制和单日使用时长提示 ;高峰期部分节点可能出现连接繁忙;被控安卓端需保持App在前台。 |
| 向日葵 | 支持 | 生态完整,软硬件结合好(如开机棒),功能全面。 | 免费版画质和帧率限制明显 ,操作有卡顿感;部分高级功能(如摄像头、远程文件)需付费;同样存在节点繁忙问题。 |
| AirDroid | 支持 | 专注移动设备,除远程控制外,文件管理、通知同步等功能丰富。 | 免费版有月度流量限制,远程控制画质一般;部分功能需付费订阅;纯粹的互联网中转,隐私性依赖厂商。 |
| AnyDesk | 支持 | 客户端轻量,连接建立快,界面简洁。 | 个人免费使用,但频繁的商业用途检测可能导致中断;对中文和国内网络环境的优化一般。 |
| TeamViewer | 支持 | 老牌巨头,功能稳定,企业级功能强大。 | 对个人用户识别极其严格 ,极易被误判为商业用途而强制付费,对普通用户已基本不友好。 |
| 小X远程等工具 | 参差不齐 | 通常主打"免Root"控制,App本身可能更轻量。 | 核心痛点在于安全性存疑 (非开源,权限过高),功能单一,连接稳定性无保障,可能存在潜在风险。 |
总结痛点如下:
- 画质与流畅度困境:免费版通常被限制在较低的分辨率和帧率,远程操作手机时卡顿、模糊是常态。
- 功能与收费博弈:诸如高清模式、文件自由传输、多设备同时在线等实用功能,常常是付费才能解锁的"特权"。
- 隐私的隐形代价:所有远程画面、操作指令都流经服务商服务器,尽管大厂承诺安全,但对敏感场景而言始终是"心结"。
- 稳定性的不确定性:共享的公共中继节点,在高峰期可能面临拥堵,导致连接失败或延迟飙升。
破局之路:为什么选择自建服务器?
面对商用软件的种种限制与隐私忧虑,自建服务器 方案提供了一条截然不同的"破局之路"。其核心价值在于将控制权彻底交还给用户 。

通过在自己的服务器上部署中继服务(如RustDesk的hbbs/hbbr),你构建了一个完全私有的远程控制网络。所有连接数据在你的服务器和两端设备之间流转,不再"过别人的手"。这意味着:
- 隐私的绝对保障:敏感操作画面和指令不再经由任何第三方服务器,从根源上杜绝了潜在的窥探风险。
- 性能的自主掌控 :连接速度和画质上限,完全取决于你为服务器配置的带宽和硬件性能,一分钱一分体验,不再受免费套餐的"卡脖子"。
- 成本的可预期性:一次部署,长期使用。除了服务器的租赁费用(通常每月几十元即可获得不错体验),没有按设备、按时长、按功能的额外付费,长期成本透明且可控。
- 无限制的自由:连接设备数量、使用时长、所有高级功能,均由你部署的软件版本决定,通常开源方案的功能是完整开放的。
当然,这种"自由"是有门槛的,它要求你具备基础的Linux服务器操作和网络知识,并愿意投入数小时进行初始的部署和配置。但这份投入带来的回报是持久且丰厚的。
在自建服务器的阵营中,RustDesk 因其开源免费、部署相对简单、性能优秀、跨平台支持完善 (包括对安卓的良好支持)而脱颖而出,成为技术爱好者和小型团队的首选。当然,除了RustDesk,你也可以通过组合Tailscale/VPN + scrcpy/原生VNC的方案实现更底层的直连控制,但这通常需要更高的技术门槛。如果有机会再后续的文章当中都会给大家讲到。
本文接下来的重点,就将聚焦于 RustDesk自建服务器 这一方案,手把手带你从零开始,搭建一个完全属于你自己的、高性能、高私密的远程控制中心。下面会依次介绍RustDesk服务端搭的建教程,包含到常用的安装方式还有操作系统。
RustDesk相关链接
服务下载地址:https://github.com/rustdesk/rustdesk-server/releases
客户端下载地址:https://rustdesk.com/zh/ 支持IOS、Mac、Windows、Android、Linux等!
二、使用Docker搭建RustDesk服务端教程
下面我们就开始动手进行操作,理论上Docker不限制任何的操作系统还有环境,基本上所有的操作系统都支持,这里的话我们就使用CentOS 7和Docker来搭建一个RustDesk服务器。闲麻烦的话可以跳转后面的脚本一键部署,方便快捷。
关于docker的使用,可以参考我之前的blog:
Docker入门 --- 简单安装及部署 | Docker进阶 --- 一文掌握Docker 入门到精通
(一)环境检查与配置
在开始部署之前,我们需要确保你的CentOS 7服务器已经准备就绪。以下是需要检查和完善的准备工作。
1.服务器需求检查
-
操作系统:确认你的系统是CentOS 7.x版本。你可以在终端中执行
cat /etc/redhat-release来查看。

-
硬件要求:RustDesk服务端(hbbs/hbbr)资源需求不高。1核1GB内存是基础,但建议使用1核2GB内存或更高的配置,以确保在多设备连接时依然流畅。存储空间有10GB以上即可。
-
网络要求:这是最关键的一步。你需要一台拥有公网IP地址的服务器。(当然没有公网IP也不着急,且看 后续的文章)并确保服务器的防火墙(如firewalld)或云服务商的安全组规则已经开放了以下必需的端口:
| 协议 | 端口号 | 用途说明 |
|---|---|---|
| TCP | 21115-21119 | 用于信令服务、中继服务、Web客户端等 |
| UDP | 21116 | 用于点对点连接和心跳检测 |
开放防火墙端口的命令示例:
shell
# 启动firewalld(如果未启动)
sudo systemctl start firewalld
sudo systemctl enable firewalld # 设置开机自启动
# 开放TCP 21115-21119端口
sudo firewall-cmd --permanent --add-port=21115-21119/tcp
# 开放UDP 21116端口
sudo firewall-cmd --permanent --add-port=21116/udp
# 重新加载防火墙配置使其生效
sudo firewall-cmd --reload
# 查看已开放的端口,确认配置成功
sudo firewall-cmd --list-ports
# 查看防火墙状态
sudo systemctl status firewalld

看到输出"21115-21119/tcp 21116/udp"表示我们的相关端口已经放通了。
2.安装Docker环境
如果你的系统还没有安装Docker,请依次执行以下命令进行安装。这些命令会添加Docker的官方镜像源并使用国内镜像加速下载。
shell
# 1. 卸载旧版本的Docker(如果有)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 2. 安装必要的工具包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 vim
# 3. 设置稳定的Docker镜像仓库(使用国内阿里云源)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4. 更新yum软件包索引(可选)
sudo yum makecache fast
# 5. 安装最新版本的Docker Engine和Containerd
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 6. 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 7. 验证Docker是否安装成功(如果能正常输出版本号则成功)
docker --version

3.安装Docker Compose
Docker Compose是一个用于定义和运行多容器Docker应用的工具。我们将使用它来编排RustDesk服务,这比直接使用docker run命令更便于管理。
GitHub发布页:https://github.com/docker/compose/releases
可以使用uname命令查看自己对于的linux版本。

下面这个就是我们要要的,复制下载链接:

shell
# 下载Docker Compose的特定版本(例如5.0.1),你可以从GitHub发布页获取最新稳定版的下载链接
#sudo curl -L "https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予下载的二进制文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建符号链接,以便在终端中直接使用docker-compose命令
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证安装是否成功
docker-compose --version

(二)使用Docker Compose部署RustDesk
一切准备就绪,现在开始最核心的部署步骤。我们将使用一个docker-compose.yml文件来定义和启动所有服务。
1.创建部署目录和编写配置文件
首先,创建一个独立的目录来存放所有配置和数据,这样非常整洁且易于维护。
shell
# 创建目录并进入
sudo mkdir -p /opt/rustdesk-server
cd /opt/rustdesk-server
然后,创建并编辑docker-compose.yml文件。
shell
sudo vim docker-compose.yml
将以下配置内容粘贴到文件中。请务必将 <你的服务器公网IP地址> 替换为你CentOS服务器的真实公网IP。并根据后文看是否使用-k参数,建议使用并配置为自己密码。
json
services:
hbbs:
container_name: rustdesk-hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs -r <你的服务器公网IP地址>:21116 -k _your_secure_key_123456
volumes:
- ./data:/root
ports:
- "21115:21115"
- "21116:21116/tcp"
- "21116:21116/udp"
- "21118:21118/tcp"
networks:
- rustdesk-net
restart: unless-stopped
healthcheck:
test: ["CMD", "pgrep", "hbbs"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
hbbr:
container_name: rustdesk-hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr -k _your_secure_key_123456
volumes:
- ./data:/root
ports:
- "21117:21117/tcp"
- "21119:21119/tcp"
networks:
- rustdesk-net
restart: unless-stopped
healthcheck:
test: ["CMD", "pgrep", "hbbr"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
rustdesk-net:
driver: bridge
配置参数详解:
很多新手容易忽略配置里的细节,这里特意拆解关键参数,避免踩坑:
- 容器核心组件: RustDesk 服务依赖hbbs(中继注册服务器)和hbbr(中继转发服务器)两个核心容器,缺一不可。
- command命令参数:
hbbs -r <IP>:21116 -k <密码>:
---r:指定hbbs的公网 IP 和端口(固定 21116),客户端会通过这个地址完成设备注册。该参数至关重要,它告诉客户端如何连接到你的中继服务器。后面的IP必须是公网IP。
---k:设置加密连接密钥,、加强连接的安全性。请将_your_secure_key_123456替换为一个你自己定义的、复杂的密码(如:-k MySecureKey_2025!)。如果使用-k,hbbs启动时会自动生成一对非对称密钥对。 - volumes: 数据卷映射:
./data:/root会把容器内的配置和设备数据映射到宿主机的/opt/rustdesk-server/data目录,后续重装容器也不会丢失数据。 - ports: 端口说明RustDesk 需要占用21115-21119端口,其中21116同时需要 TCP 和 UDP 协议。将容器内部的端口映射到宿主机,使得外部可以访问RustDesk服务。注意配置防火墙时要重点放行。
- restart:
unless-stopped:确保容器在异常退出或Docker守护进程重启时自动重新启动,提高服务可靠性。
编辑完成后,按 Esc键,然后输入:wq保存并退出vim编辑器。
2.启动RustDesk服务
在docker-compose.yml文件所在的目录下,执行以下命令来启动服务
shell
sudo docker-compose up -d
-d参数表示在后台运行(守护进程模式)。如果一切正常,你会看到类似下面的输出:

你可以使用以下命令检查容器的运行状态:
shell
sudo docker-compose ps
如果两个服务的状态(State)都显示为 "Up" ,那么恭喜你,部署已经成功!

3. 获取关键密钥信息
设置了密码的可以跳过该步骤,因为我也没找到公钥。理论上部署成功后,密钥文件已经生成在 /opt/rustdesk-server/data目录下。如果之前没有使用-k参数,才需要查看公钥。
shell
# 查看生成的id_ed25519.pub公钥文件内容
sudo cat /opt/rustdesk-server/data/id_ed25519.pub
# 生成的公钥类似这样
7SRdnwqxCbndEAan/ukzmSS9bBNz3vMLTAncvcQlK6I=
请完整记录下终端输出的这一长串公钥字符串(它以一串字母数字开始)。如果你是通过 -k指定了固定密钥,则客户端配置时直接使用该密钥。
这个Key是客户端能够安全连接到你的私服的关键凭证,请妥善保管。
(三)客户端配置与连接测试
现在,你的私有RustDesk服务器已经搭建完毕。接下来需要在控制端和被控端的RustDesk客户端上进行配置。
1. 下载客户端 :从 RustDesk官网为你需要使用的设备(Windows, macOS, Linux, Android, iOS)下载并安装客户端。

Android:https://github.com/rustdesk/rustdesk/releases/download/1.4.5/rustdesk-1.4.5-universal-signed.apk、https://github.com/rustdesk/rustdesk/releases/download/1.4.5/rustdesk-1.4.5-aarch64-signed.apk
Windows:https://github.com/rustdesk/rustdesk/releases/download/1.4.5/rustdesk-1.4.5-x86_64.exe、https://github.com/rustdesk/rustdesk/releases/download/1.4.5/rustdesk-1.4.5-x86_64.msi
iOS:https://apps.apple.com/us/app/rustdesk-remote-desktop/id1581225015
Mac:https://apps.apple.com/us/app/rustdesk-remote-desktop/id1581225015
其余的自行去网站上看,如无法打卡github,请多尝试几次。
2. 配置客户端:
- 打开RustDesk客户端。
- 点击左上角的"菜单"图标(三条横线),进入 设置 -> 网络。
- 在 ID服务器 和 中继服务器 中,填写你的CentOS服务器的公网IP地址。
- 在 Key 中,填写你在上一步骤中获取的公钥字符串或你自定义的固定密钥。

3. 应用并重启 点击"应用",然后完全退出并重新启动RustDesk客户端,使配置生效。
4. 开始连接:
- 在被控安卓设备上,RustDesk客户端会显示本机的ID和临时密码。
- 在控制端(如你的电脑)的RustDesk客户端输入被控端的ID和密码,即可建立连接!此时,所有数据都将通过你自建的服务器进行传输。

至此,你已经成功在CentOS 7上利用Docker搭建了一个完全私有的RustDesk远程控制服务器。享受高速、安全、无限制的远程控制体验吧!如果遇到任何问题,欢迎在评论区留言讨论。
一键部署脚本(五星推荐)
为了方便部署,这里提供一个完整的自动化部署脚本:
shell
#!/bin/bash
# RustDesk 私有化部署一键脚本(适配 CentOS 7)
# 作者:Xenon Young
# 使用方法:sudo chmod +x deploy-rustdesk.sh && sudo ./deploy-rustdesk.sh
# 注意:执行前请修改下方「配置变量」中的服务器IP和自定义密钥
set -euo pipefail # 严格模式:出错立即退出,未定义变量报错,管道错误传递
# ======================== 配置变量(请根据实际情况修改)========================
SERVER_PUBLIC_IP="x.x.x.x" # 替换为你的服务器公网IP
CUSTOM_SECRET_KEY="A@123!" # 替换为你的自定义加密密钥(建议包含大小写+数字+特殊字符)
RUSTDESK_VERSION="latest" # RustDesk镜像版本(推荐latest或1.2.3)
DATA_DIR="/opt/rustdesk-server" # 部署目录(数据持久化路径)
DOCKER_COMPOSE_VERSION="v5.0.1" # Docker Compose版本
# ==============================================================================
# 颜色输出函数(增强可读性)
red() { echo -e "\033[31m$1\033[0m"; }
green() { echo -e "\033[32m$1\033[0m"; }
yellow() { echo -e "\033[33m$1\033[0m"; }
blue() { echo -e "\033[34m$1\033[0m"; }
# 第一步:系统环境检查
blue "===== 1/12 系统环境检查 ====="
if [ ! -f /etc/redhat-release ] || ! grep -q "CentOS Linux 7" /etc/redhat-release; then
red "错误:本脚本仅支持 CentOS 7 系统!"
exit 1
fi
green "✅ 系统检测通过:CentOS 7"
# 第二步:安装基础依赖
blue "===== 2/12 安装基础依赖 ====="
yum install -y yum-utils device-mapper-persistent-data lvm2 curl wget net-tools tar > /dev/null 2>&1
green "✅ 基础依赖安装完成"
# 第三步:卸载旧版Docker(如有)
blue "===== 3/12 清理旧版Docker ====="
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine > /dev/null 2>&1
green "✅ 旧版Docker清理完成"
# 第四步:安装Docker(阿里云源,加速下载)
blue "===== 4/12 安装Docker ====="
if ! command -v docker &> /dev/null; then
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo > /dev/null 2>&1
yum install -y docker-ce docker-ce-cli containerd.io > /dev/null 2>&1
# 启动Docker并设置开机自启
systemctl start docker
systemctl enable docker > /dev/null 2>&1
green "✅ Docker安装并启动成功"
else
yellow "⚠️ Docker已安装,跳过此步骤"
fi
# 第五步:配置Docker镜像加速(解决拉取镜像超时)
blue "===== 5/12 配置Docker镜像加速 ====="
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload
systemctl restart docker
green "✅ Docker镜像加速配置生效"
# 第六步:安装Docker Compose(多加速链接兜底)
blue "===== 6/12 安装Docker Compose ====="
COMPOSE_BIN="/usr/local/bin/docker-compose"
if ! command -v docker-compose &> /dev/null; then
# 定义多个加速链接,失败自动切换
COMPOSE_URLS=(
"https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64"
"https://mirror.ghproxy.com/https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64"
"https://gh.xxooo.cf/https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64"
)
# 尝试下载,直到成功
for url in "${COMPOSE_URLS[@]}"; do
yellow "🔄 尝试从链接下载:$url"
if curl -L "$url" -o "$COMPOSE_BIN" --connect-timeout 10; then
chmod +x "$COMPOSE_BIN"
ln -s "$COMPOSE_BIN" /usr/bin/docker-compose > /dev/null 2>&1
green "✅ Docker Compose安装成功"
break
fi
done
# 检查是否下载成功
if [ ! -x "$COMPOSE_BIN" ]; then
red "❌ Docker Compose下载失败,请手动下载后重新执行脚本!"
exit 1
fi
else
yellow "⚠️ Docker Compose已安装,跳过此步骤"
fi
# 第七步:创建部署目录
blue "===== 7/12 创建部署目录 ====="
mkdir -p "${DATA_DIR}" && cd "${DATA_DIR}"
green "✅ 部署目录创建完成:${DATA_DIR}"
# 第八步:生成优化后的docker-compose.yml(修复健康检查、移除过时字段)
blue "===== 8/12 生成docker-compose配置文件 ====="
cat > docker-compose.yml << EOF
services:
hbbs:
container_name: rustdesk-hbbs
image: rustdesk/rustdesk-server:${RUSTDESK_VERSION}
command: hbbs -r ${SERVER_PUBLIC_IP}:21116 -k ${CUSTOM_SECRET_KEY}
volumes:
- ./data:/root
ports:
- "21115:21115/tcp"
- "21116:21116/tcp"
- "21116:21116/udp"
- "21118:21118/tcp"
networks:
- rustdesk-net
restart: unless-stopped
# 适配极简镜像的健康检查(无pgrep/curl,用端口检测)
healthcheck:
test: ["CMD", "sh", "-c", "exec 3<>/dev/tcp/localhost/21116 && exec 3<&- && exec 3>&-"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
hbbr:
container_name: rustdesk-hbbr
image: rustdesk/rustdesk-server:${RUSTDESK_VERSION}
command: hbbr -k ${CUSTOM_SECRET_KEY}
volumes:
- ./data:/root
ports:
- "21117:21117/tcp"
- "21119:21119/tcp"
networks:
- rustdesk-net
restart: unless-stopped
healthcheck:
test: ["CMD", "sh", "-c", "exec 3<>/dev/tcp/localhost/21117 && exec 3<&- && exec 3>&-"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
rustdesk-net:
driver: bridge
EOF
green "✅ docker-compose.yml配置文件生成完成"
# 第九步:配置防火墙(放行端口)
blue "===== 9/12 配置防火墙规则 ====="
if systemctl is-active --quiet firewalld; then
firewall-cmd --permanent --add-port=21115-21119/tcp > /dev/null 2>&1
firewall-cmd --permanent --add-port=21116/udp > /dev/null 2>&1
firewall-cmd --reload > /dev/null 2>&1
green "✅ 防火墙端口放行完成(21115-21119 TCP + 21116 UDP)"
else
yellow "⚠️ firewalld未启动,跳过防火墙配置(请确保云安全组放行端口)"
fi
# 第十步:拉取RustDesk镜像(多源兜底)
blue "===== 10/12 拉取RustDesk镜像 ====="
# 优先拉取官方镜像
if ! docker pull rustdesk/rustdesk-server:${RUSTDESK_VERSION} > /dev/null 2>&1; then
yellow "🔄 官方镜像拉取失败,尝试阿里云备用源..."
if docker pull registry.cn-hangzhou.aliyuncs.com/rustdesk/rustdesk-server:${RUSTDESK_VERSION} > /dev/null 2>&1; then
docker tag registry.cn-hangzhou.aliyuncs.com/rustdesk/rustdesk-server:${RUSTDESK_VERSION} rustdesk/rustdesk-server:${RUSTDESK_VERSION} > /dev/null 2>&1
green "✅ 备用源镜像拉取并重命名成功"
else
red "❌ 镜像拉取失败!请手动下载镜像包后执行以下命令导入:"
echo " 1. 下载:wget https://mirror.ghproxy.com/https://github.com/rustdesk/rustdesk-server/releases/download/1.2.3/rustdesk-server-x86_64.tar.gz"
echo " 2. 解压:tar -zxvf rustdesk-server-x86_64.tar.gz"
echo " 3. 导入:docker load < hbbs.tar.gz && docker load < hbbr.tar.gz"
echo " 4. 打标签:docker tag rustdesk/rustdesk-server-hbbs:latest rustdesk/rustdesk-server:latest"
exit 1
fi
else
green "✅ 官方镜像拉取成功"
fi
# 第十一步:启动RustDesk服务
blue "===== 11/12 启动RustDesk服务 ====="
docker-compose up -d > /dev/null 2>&1
sleep 5 # 等待服务启动
# 检查容器状态
if docker-compose ps | grep -q "Up"; then
green "✅ RustDesk服务启动成功"
else
red "❌ RustDesk服务启动失败!日志如下:"
docker-compose logs
exit 1
fi
# 第十二步:部署完成,输出关键信息
blue "===== 12/12 部署完成 - 关键信息汇总 ====="
green "🎉 RustDesk私有化服务器部署成功!"
echo -e "\n【核心配置信息】"
echo -e "📌 服务器公网IP:\033[33m${SERVER_PUBLIC_IP}\033[0m"
echo -e "🔑 连接密钥:\033[33m${CUSTOM_SECRET_KEY}\033[0m"
echo -e "📁 数据目录:\033[33m${DATA_DIR}/data\033[0m"
echo -e "\n【客户端配置步骤】"
echo -e "1. 下载客户端:https://rustdesk.com/zh/"
echo -e "2. 打开客户端 → 菜单 → 网络 → ID服务器:填写 ${SERVER_PUBLIC_IP}"
echo -e "3. Key:填写 ${CUSTOM_SECRET_KEY} → 应用并重启客户端"
echo -e "\n【常用管理命令】"
echo -e "🔍 查看状态:cd ${DATA_DIR} && docker-compose ps"
echo -e "📄 查看日志:cd ${DATA_DIR} && docker-compose logs -f hbbs/hbbr"
echo -e "⏹️ 停止服务:cd ${DATA_DIR} && docker-compose down"
echo -e "▶️ 启动服务:cd ${DATA_DIR} && docker-compose up -d"
echo -e "📝 查看端口:netstat -tulpn | grep -E '2111[5-9]'"
部署后验证
部署完成后,执行以下命令验证服务是否正常运行:
shell
# 1. 检查容器状态
cd /opt/rustdesk-server
sudo docker-compose ps
# 2. 查看服务日志
sudo docker-compose logs -f hbbs
sudo docker-compose logs -f hbbr
# 3. 检查端口监听状态
sudo netstat -tlnp | grep -E '2111[5-9]'


三、常见错误
1. 安装过程中 docker-compose-plugin 包下载失败
具体问题如下:
Error downloading packages: docker-compose-plugin-2.27.1-1.el7.x86_64: [Errno 256] No more mirrors to try.

问题原因: 由于 YUM 缓存元数据不一致导致的问题。
解决方式: 清理 YUM 元数据并重试安装,使用以下命令
shell
sudo yum --enablerepo=docker-ce-stable clean metadata #清理元数据缓存
sudo yum install -y docker-ce docker-ce-cli containerd.io #重试安装
2. 下载Docker Compose失败,Empty reply from server
报错如下:curl: (52) Empty reply from server

解决方式,采用更快的加速链接下载:
txt
https://gh.xxooo.cf/https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-linux-x86_64
https://gh.zwy.one/https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-linux-x86_64
https://github.limoruirui.com/https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-linux-x86_64
3. docker pull镜像时网络超时的问题
问题如下: 由于网络的问题导致从官方拉取镜像超时。

解决方法: 使用 GitHub Container Registry 镜像
shell
# 1. 从 GitHub Container Registry 拉取
sudo docker pull ghcr.io/rustdesk/rustdesk-server:latest
# 2. 重命名镜像
sudo docker tag ghcr.io/rustdesk/rustdesk-server:latest rustdesk/rustdesk-server:latest
# 3. 启动服务
cd /opt/rustdesk-server
sudo docker-compose up -d
结果如下:

四、后记
本次实战指南从远程控制的核心痛点出发,完整落地了基于 CentOS 7 + Docker 的 RustDesk 私有化服务器搭建全流程:我们从主流远程控制方案的对比分析切入,明确了自建服务器的核心优势;再到环境检查、Docker/Docker Compose 的安装配置、防火墙端口放行,最后完成 RustDesk 服务端部署、客户端配置及连接验证,甚至针对国内网络环境优化了镜像拉取、Docker Compose 下载等关键环节,还提供了可直接复用的一键部署脚本和高频问题解决方案。
通过本次实操,你已经掌握了私有化远程控制服务器的核心逻辑 ------ 不再依赖第三方中继节点,所有数据流转完全自主可控,既解决了商用工具免费版的功能限制、隐私泄露风险,也实现了跨平台(尤其是安卓设备)的稳定远程控制。无论是协助长辈操作手机、个人多设备协作,还是小型团队的远程运维,这套方案都能满足低成本、高私密、无限制的核心需求。
当然,本次内容仅覆盖了 CentOS 7 系统下的 Docker 部署场景,这只是 RustDesk 私有化部署的 "起点"。后续我们会围绕更丰富的使用场景持续补充内容:
- 多系统部署适配: 除 CentOS 外,还会讲解 Ubuntu/Debian、Windows 、OpenEuler、红帽等主流操作系统的 RustDesk 部署方案,覆盖物理机、容器化等不同部署形态;
- 无公网 IP 解决方案: 针对个人用户无公网 IP 的痛点,详解 FRP/NGROK 内网穿透、Tailscale 组网、路由器 DDNS + 端口映射等多种方案,让内网服务器也能被外网设备访问;
- 进阶优化与扩展: 包括 RustDesk 服务端性能调优(端口复用、资源限制、日志清理)、多节点负载均衡部署、访问权限精细化控制(黑白名单、密钥分级);
- 轻量化替代方案: 对比测试 "Tailscale/VPN + scrcpy" 的安卓直连方案,兼顾轻量化与低延迟,满足不同场景的性能需求;
技术的价值在于落地,而私有化部署的核心是 "自主可控"。如果你在本次实操中遇到任何问题(如端口放行、镜像拉取、客户端连接失败等),欢迎在评论区留言交流;也期待你分享自己的部署优化经验,我们会持续迭代内容,让更多人能低成本搭建属于自己的远程控制体系。
后续内容将尽快更新,敬请关注!