# RustDesk Server 部署指南

开源远程桌面服务器，支持自托管，数据完全自主可控。包含信号服务器（hbbs）和中继服务器（hbbr），客户端支持 Windows、macOS、Linux、iOS、Android。

## 功能特性

- 自建信号服务器（hbbs）+ 中继服务器（hbbr）
- 端到端加密，数据不经过第三方
- 支持 TCP 打洞和中继转发
- 自动生成 Ed25519 密钥对
- 支持仅加密连接模式
- 跨平台客户端支持
- WebSocket 支持（可通过 Nginx 代理）

## 技术栈

| 组件 | 版本 | 说明 |
|------|------|------|
| RustDesk Server | latest | 信号服务器 + 中继服务器 |
| Nginx | 系统包 | 反向代理 + HTTPS（WebSocket） |
| Docker | 最新版 | 容器运行环境 |

## 端口说明

| 端口 | 协议 | 服务 | 说明 |
|------|------|------|------|
| 21115 | TCP | hbbs | NAT 类型测试 |
| 21116 | TCP | hbbs | TCP 打洞 / 连接请求 |
| 21116 | UDP | hbbs | ID 注册 / 心跳 |
| 21117 | TCP | hbbr | 中继流量转发 |
| 21118 | WS | hbbs | WebSocket（仅本地监听） |
| 21119 | WS | hbbr | WebSocket（仅本地监听） |

> **21115、21116、21117 需要从外网可访问**，21118/21119 仅本地通过 Nginx 代理。

## 前置条件

1. 一台 Linux 服务器（Ubuntu 22.04/24.04 推荐）
2. 一个已解析到服务器的域名（如 `rustdesk.example.com`）
3. 服务器 80/443 端口可从外网访问
4. 服务器 21115-21117 端口可从外网访问

## 目录结构

```
rustdesk/
├── docker-compose.yml    # 容器编排（hbbs + hbbr）
├── .env.example          # 配置模板
├── deploy.sh             # 一键部署脚本
├── backup.sh             # 备份脚本
├── uninstall.sh          # 完全卸载脚本
├── nginx/
│   └── rustdesk.conf     # Nginx 反向代理配置
└── README.md             # 本文件
```

服务器上的数据目录：

```
/var/lib/rustdesk/        # RustDesk 数据（密钥对 + 数据库）
/var/backups/rustdesk/    # 备份文件
```

## 快速部署

### 第一步：上传文件到服务器

```bash
# 在本地执行，上传 rustdesk 目录
scp -r rustdesk/ root@<服务器IP>:/opt/rustdesk

# 如果服务器上还没有部署过 base（首台服务或全新服务器），还需上传 base
scp -r base/ root@<服务器IP>:/opt/base
```

### 第二步：登录服务器执行部署

```bash
ssh root@<服务器IP>

# 如果是全新服务器，先安装基础环境
cd /opt/base
cp .env.example .env
bash setup.sh

# 部署 RustDesk
cd /opt/rustdesk
bash deploy.sh
# 首次运行会生成 .env，按提示修改配置后重新运行
vi .env
bash deploy.sh
```

### 第三步：配置域名解析

在域名服务商（如阿里云 DNS）添加 A 记录：

| 记录类型 | 主机记录 | 记录值 |
|----------|----------|--------|
| A | rustdesk | `<服务器公网IP>` |

### 第四步：配置 RustDesk 客户端

1. 下载并安装 [RustDesk 客户端](https://rustdesk.com/zh/)
2. 打开客户端，进入 **设置 → 网络 → ID/中继服务器**
3. 填入以下信息：

| 配置项 | 值 |
|--------|-----|
| ID 服务器 | `rustdesk.yourdomain.com` |
| 中继服务器 | `rustdesk.yourdomain.com` |
| Key | 部署完成时显示的公钥 |

> **公钥获取方法：** 部署脚本完成时会自动显示公钥，也可手动查看：
>
> ```bash
> cat /var/lib/rustdesk/id_ed25519.pub
> ```

## 常用操作

```bash
# 查看服务状态
cd /opt/rustdesk && docker compose ps

# 查看日志
cd /opt/rustdesk && docker compose logs -f

# 重启服务
cd /opt/rustdesk && docker compose restart

# 停止服务
cd /opt/rustdesk && docker compose down

# 备份数据
cd /opt/rustdesk && bash backup.sh

# 查看公钥
cat /var/lib/rustdesk/id_ed25519.pub

# 更新镜像
cd /opt/rustdesk && docker compose pull && docker compose up -d
```

## 安全建议

- 默认开启 `ENCRYPTED_ONLY=1`，仅允许加密连接
- 密钥对文件（`id_ed25519` / `id_ed25519.pub`）是最重要的数据，务必备份
- 如需更换密钥对，删除数据目录中的密钥文件后重启服务即可重新生成
- 建议定期执行 `bash backup.sh` 并将备份异地存储
