RustDesk OSS 自建服务部署文档(iStoreOS Docker版,纯docker run + Web网页端 + API监控后台)
参考官方文档:https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-oss/docker/
部署环境:iStoreOS(软路由),纯Docker Run部署(不使用Compose)
数据持久化目录:/mnt/sata1-4/wanghao/rustdesk
服务域名:local.wuanwanghao.top
公钥:[自行查看id_ed25519.pub获取]
安全策略:仅依靠ED25519公钥鉴权(无设备ID白名单,后续可按需添加--allow-id)
扩展组件:lejianwen/rustdesk-api 第三方Web管理后台,用于查看在线设备、管理设备备注
重要补充:内置WebClient网页远控存在前端WebRTC内存泄漏问题,v2.6.29版本可手动替换webclient2前端优化,下文包含下载解压安装包、编译打包、构建自定义镜像、网页端崩溃故障排查方案
端口说明表
| 端口 | 协议 | 归属服务 | 作用 |
|---|---|---|---|
| 21115 | TCP | hbbs | NAT类型探测,用来判断客户端是内网还是公网 |
| 21116 | TCP+UDP | hbbs | 核心端口。TCP:设备注册、心跳维持;UDP:P2P点对点打洞,缺一不可 |
| 21117 | TCP | hbbr | 中继端口。P2P直连失败时,远程桌面流量走这个端口中转 |
| 21118 | TCP | hbbs | Web网页客户端信令端口(网页版RustDesk需要),不用网页端可关闭 |
| 21119 | TCP | hbbr | Web网页客户端中继端口(网页版RustDesk需要),不用网页端可关闭 |
| 21114 | TCP | rustdesk-api | 第三方API管理后台网页端口,查看在线设备、设备备注、连接日志 |
⚠️ iStoreOS重点:iStoreOS防火墙/端口转发需要放行上面开放的端口,外网才能访问。
一、基础服务:hbbs + hbbr(纯docker run)
# 1. 创建数据目录
mkdir -p /mnt/sata1-4/wanghao/rustdesk
mkdir -p /mnt/sata1-4/wanghao/rustdesk/api
# 启动hbbs信令服务(开启web 21118端口,-w 启用网页客户端)
sudo docker run -d \
--name hbbs \
-p 21115:21115/tcp \
-p 21116:21116/tcp \
-p 21116:21116/udp \
-p 21118:21118/tcp \
-v /mnt/sata1-4/wanghao/rustdesk:/root \
--restart unless-stopped \
rustdesk/rustdesk-server:latest \
hbbs -r local.wuanwanghao.top:21117
# 启动hbbr中继服务(开启web 21119端口)
sudo docker run -d \
--name hbbr \
-p 21117:21117/tcp \
-p 21119:21119/tcp \
-v /mnt/sata1-4/wanghao/rustdesk:/root \
--restart unless-stopped \
rustdesk/rustdesk-server:latest \
hbbr
关闭Web网页版本:删除两条命令里面
-p 21118:21118/tcp和-p 21119:21119/tcp,同时删掉hbbs命令末尾-w
二、新增第三方API监控后台(lejianwen/rustdesk-api)
两种部署方式:1.直接使用官方镜像;2.【推荐】自定义打包v2.6.29镜像,内置新版webclient2,缓解网页端内存泄漏
# 1. 创建docker网桥(仅首次执行)
docker network create rustdesk-net
# 将现有hbbs、hbbr加入网桥,实现容器内部通信
docker network connect rustdesk-net hbbs
docker network connect rustdesk-net hbbr
方式A:直接拉官方镜像(原版webclient,存在内存泄漏)
# 启动rustdesk-api Web管理后台
docker run -d \
--name rustdesk-api \
--network rustdesk-net \
-p 21114:21114 \
-e TZ=Asia/Shanghai \
-e RUSTDESK_API_LANG=zh-CN \
-e RUSTDESK_API_RUSTDESK_ID_SERVER=hbbs:21116 \
-e RUSTDESK_API_RUSTDESK_RELAY_SERVER=hbbr:21117 \
-e RUSTDESK_API_RUSTDESK_API_SERVER=[http://local.wuanwanghao.top:21114](http://local.wuanwanghao.top:21114) \
-v /mnt/sata1-4/wanghao/rustdesk/api:/app/data \
-v /mnt/sata1-4/wanghao/rustdesk:/app/conf/data \
--restart unless-stopped \
lejianwen/rustdesk-api
访问后台:浏览器打开 http://local.wuanwanghao.top:21114,首次访问初始化管理员账号密码
方式B:自定义构建 v2.6.29 镜像(替换webclient2,推荐)
原理:原版镜像内置webclient v1内存泄漏严重;v2.6.29包自带webclient2前端资源,重新打包镜像,资源路径
/app/resources/
2.1 下载&解压官方release安装包
官方文档代码地址: https://github.com/lejianwen/rustdesk-api
# 创建工作目录
mkdir -p ~/rustdesk-api-build
cd ~/rustdesk-api-build
# 下载v2.6.29 linux-amd64二进制包
wget [https://github.com/lejianwen/rustdesk-api/releases/download/v2.6.29/linux-amd64.tar.gz](https://github.com/lejianwen/rustdesk-api/releases/download/v2.6.29/linux-amd64.tar.gz)
# 解压到release文件夹
tar -zxvf linux-amd64.tar.gz -C ./release
解压完成后目录结构:
~/rustdesk-api-build/
├─ linux-amd64.tar.gz # 下载的压缩包
├─ Dockerfile
└─ release/
├─ apimain # 主程序
├─ resources/ # 网页静态资源!webclient2在这里!
├─ conf/
├─ data/
├─ docs/
└─ runtime/
2.2 Dockerfile编写
在 ~/rustdesk-api-build 新建 Dockerfile
FROM lejianwen/rustdesk-api
# 把本地release下面所有文件,全部覆盖到容器内 /app
COPY ./release /app
# 保证apimain可执行
RUN chmod +x /app/apimain
# 沿用原镜像配置:工作目录、端口、启动命令,完全不变
WORKDIR /app
EXPOSE 21114
CMD ["./apimain"]
2.3 构建镜像命令
# 当前目录为 ~/rustdesk-api-build
docker build -t rustdesk-api:v2.6.29 .
2.4 启动自定义镜像
docker run -d \
--name rustdesk-api \
--network rustdesk-net \
-p 21114:21114 \
-e TZ=Asia/Shanghai \
-e RUSTDESK_API_LANG=zh-CN \
-e RUSTDESK_API_RUSTDESK_ID_SERVER=192.168.3.1:21116 \
-e RUSTDESK_API_RUSTDESK_RELAY_SERVER=local.wuanwanghao.top:21117 \
-e RUSTDESK_API_RUSTDESK_KEY=[your_key] \
-v /mnt/sata1-4/wanghao/rustdesk/api:/app/data \
--restart unless-stopped \
rustdesk-api:v2.6.29
WebClient2访问地址:http://192.168.3.1:21114/webclient2/
快速临时替换(不构建镜像,测试用)
适合快速验证新版本,不做镜像固化;前提已经完成上面wget+tar解压得到release目录
# 拷贝整个release目录所有文件覆盖到容器/app
docker cp release/. rustdesk-api:/app/
# 赋予执行权限
docker exec rustdesk-api chmod +x /app/apimain
# 重启容器
docker restart rustdesk-api
⚠️ 注意事项:主程序名称为
apimain,不是rustdesk-api-server;webclient2静态资源位于/app/resources/,不是web文件夹;数据卷挂载路径为/app/data,与镜像VOLUME定义保持一致。
查看公钥
# 新版rustdesk-server 使用ed25519密钥,不是rsa
cat /mnt/sata1-4/wanghao/rustdesk/id_ed25519.pub
✅ 公钥:[自行复制输出内容]
RustDesk 客户端配置(桌面客户端)
打开RustDesk客户端 → 设置 → 网络
- 服务器:
local.wuanwanghao.top:21116 - 密钥:
[id_ed25519.pub的内容] - API服务器(可选,填入后台地址):http://local.wuanwanghao.top:21114
RustDesk Web网页客户端配置
网页访问:https://local.wuanwanghao.top:21118
网页内填入:
- 服务器地址:
local.wuanwanghao.top:21118 - 密钥:
[id_ed25519.pub的内容]
新增webclient2独立入口:http://local.wuanwanghao.top:21114/webclient2/
常用运维命令
# 查看全部容器运行状态
docker ps
# 查看hbbs日志(查看设备注册、接入记录,用于监控)
docker logs -f hbbs
# 查看hbbr中继日志
docker logs -f hbbr
# 查看api后台日志,排查后台看不到设备问题
docker logs -f rustdesk-api
# 停止全部服务
docker stop hbbs hbbr rustdesk-api
# 删除容器(保留磁盘数据文件,仅删除docker容器实例)
docker rm hbbs hbbr rustdesk-api
# 单独重启某个服务(修改启动参数后使用)
docker restart hbbs
docker restart hbbr
docker restart rustdesk-api
安全说明
- 鉴权逻辑:客户端必须填写正确公钥,才能注册设备到服务;仅知道域名,没有公钥无法注册。
- 兜底安全:每一台被控主机,务必在RustDesk设置永久访问密码。就算设备注册成功,无访问密码不能进入桌面。
- 风险提示:公钥一旦外泄,其他人可以使用该公钥注册设备。不要随意把公钥发给他人。
- 可选增强:如需开启设备ID白名单(只允许指定设备注册,公钥泄露也不怕),在hbbs启动命令末尾增加
--allow-id 设备ID1,设备ID2。
示例:
hbbs -r local.wuanwanghao.top:21117 --allow-id 设备ID1,设备ID2
故障排查
- 容器启动后无id_ed25519.pub:等待30秒或重启hbbs,服务初始化完成自动生成密钥。
- 客户端无法注册:检查iStoreOS防火墙端口放行、域名A记录解析是否指向软路由公网IP。
- P2P无法直连:依靠hbbr中继转发流量,21117端口必须放行。
- Web网页客户端无法访问:确认21118、21119端口放行。
- API后台空白/看不到在线设备:确认21114端口放行;检查网桥配置;确认密钥目录挂载正确,api可以读取id_ed25519.pub。
- ✅【重点新增】WebClient网页远程画面正常,几秒后浏览器标签卡死、无响应、崩溃
- 根因:前端WebRTC WebCodecs的VideoFrame对象没有释放,内存泄漏,属于webclient前端代码缺陷,容器后端服务本身正常。Chrome内核更容易触发,Edge浏览器GC策略更友好,可延长会话时间。关闭硬件编码只能延缓,不能根治。
- 排查步骤:
- 打开浏览器任务管理器(Shift+Esc),观察标签内存持续上涨不回落,确认内存泄漏。
- 优先使用Edge浏览器访问webclient2;Chrome极易快速OOM崩溃。
- 被控端RustDesk设置:关闭硬件编码,仅保留H.264软编码;分辨率锁定1280×720,帧率5~10fps,码率限制500kbps以内。
- 使用限制:单次网页远程会话尽量不超过30分钟,用完主动断开远程、关闭标签页释放内存。
- 根治方案:升级至v2.6.29自定义镜像(webclient2);长时间稳定网页远控备选noVNC。
升级服务镜像操作
# 停止并删除旧容器
docker stop hbbs hbbr rustdesk-api
docker rm hbbs hbbr rustdesk-api
# 拉取最新镜像
docker pull rustdesk/rustdesk-server:latest
# 如果使用原版api镜像
docker pull lejianwen/rustdesk-api:latest
# 如果是自定义v2.6.29镜像,进入构建目录,重新执行docker build构建
# cd ~/rustdesk-api-build
# docker build -t rustdesk-api:v2.6.29 .
# 重新执行上面hbbs、hbbr、rustdesk-api的docker run启动命令
备用方案:hbbs带设备白名单的docker run片段
仅修改hbbs的command部分,其余不动
hbbs -r local.wuanwanghao.top:21117 --allow-id 设备ID1,设备ID2
使用说明
文档内所有 [xxx] 是占位符,部署的时候替换:
[自行复制输出内容]→ 执行cat id_ed25519.pub拿到的公钥设备ID1,设备ID2→ 你的RustDesk设备ID
备注:iStoreOS环境如果wget下载github慢,可以把
linux‑amd64.tar.gz在电脑本地下载完成后上传至软路由~/rustdesk‑api‑build目录,跳过wget步骤,直接执行解压命令tar -zxvf linux-amd64.tar.gz -C ./release。