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前端优化,下文包含下载解压安装包、编译打包、构建自定义镜像、网页端崩溃故障排查方案

端口说明表

端口协议归属服务作用
21115TCPhbbsNAT类型探测,用来判断客户端是内网还是公网
21116TCP+UDPhbbs核心端口。TCP:设备注册、心跳维持;UDP:P2P点对点打洞,缺一不可
21117TCPhbbr中继端口。P2P直连失败时,远程桌面流量走这个端口中转
21118TCPhbbsWeb网页客户端信令端口(网页版RustDesk需要),不用网页端可关闭
21119TCPhbbrWeb网页客户端中继端口(网页版RustDesk需要),不用网页端可关闭
21114TCPrustdesk-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客户端 → 设置 → 网络

  1. 服务器:local.wuanwanghao.top:21116
  2. 密钥:[id_ed25519.pub的内容]
  3. 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

安全说明

  1. 鉴权逻辑:客户端必须填写正确公钥,才能注册设备到服务;仅知道域名,没有公钥无法注册。
  2. 兜底安全:每一台被控主机,务必在RustDesk设置永久访问密码。就算设备注册成功,无访问密码不能进入桌面。
  3. 风险提示:公钥一旦外泄,其他人可以使用该公钥注册设备。不要随意把公钥发给他人。
  4. 可选增强:如需开启设备ID白名单(只允许指定设备注册,公钥泄露也不怕),在hbbs启动命令末尾增加 --allow-id 设备ID1,设备ID2

示例:hbbs -r local.wuanwanghao.top:21117 --allow-id 设备ID1,设备ID2

故障排查

  1. 容器启动后无id_ed25519.pub:等待30秒或重启hbbs,服务初始化完成自动生成密钥。
  2. 客户端无法注册:检查iStoreOS防火墙端口放行、域名A记录解析是否指向软路由公网IP。
  3. P2P无法直连:依靠hbbr中继转发流量,21117端口必须放行。
  4. Web网页客户端无法访问:确认21118、21119端口放行。
  5. API后台空白/看不到在线设备:确认21114端口放行;检查网桥配置;确认密钥目录挂载正确,api可以读取id_ed25519.pub。
  6. ✅【重点新增】WebClient网页远程画面正常,几秒后浏览器标签卡死、无响应、崩溃
    • 根因:前端WebRTC WebCodecs的VideoFrame对象没有释放,内存泄漏,属于webclient前端代码缺陷,容器后端服务本身正常。Chrome内核更容易触发,Edge浏览器GC策略更友好,可延长会话时间。关闭硬件编码只能延缓,不能根治。
    • 排查步骤:
      1. 打开浏览器任务管理器(Shift+Esc),观察标签内存持续上涨不回落,确认内存泄漏。
      2. 优先使用Edge浏览器访问webclient2;Chrome极易快速OOM崩溃。
      3. 被控端RustDesk设置:关闭硬件编码,仅保留H.264软编码;分辨率锁定1280×720,帧率5~10fps,码率限制500kbps以内。
      4. 使用限制:单次网页远程会话尽量不超过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] 是占位符,部署的时候替换:

  1. [自行复制输出内容] → 执行cat id_ed25519.pub拿到的公钥
  2. 设备ID1,设备ID2 → 你的RustDesk设备ID

备注:iStoreOS环境如果wget下载github慢,可以把linux‑amd64.tar.gz在电脑本地下载完成后上传至软路由~/rustdesk‑api‑build目录,跳过wget步骤,直接执行解压命令tar -zxvf linux-amd64.tar.gz -C ./release