好的,根据我们排查的结果,我为你重新生成一份完整的、经过验证的部署文档。这份文档已经针对你遇到的持久化问题做了优化,确保密码不会因为容器重启而改变。 --- # RustDesk 自建服务器完整部署文档(CentOS 9 / Docker Compose) ## 一、概述 本文档使用社区 `lejianwen/rustdesk-server-s6` All-in-One 镜像,将 ID 服务器(hbbs)、中继服务器(hbbr)和 Web API 服务器整合到一个容器中,通过 Docker Compose 管理。特别针对数据持久化做了优化,避免重启后管理员密码丢失。 ## 二、环境准备 ### 2.1 开放防火墙端口 ```bash sudo firewall-cmd --permanent --add-port=21114-21119/tcp sudo firewall-cmd --permanent --add-port=21116/udp sudo firewall-cmd --reload ``` > 端口说明: > - 21114:Web 管理后台 > - 21115:hbbs NAT 测试 > - 21116:hbbs TCP 信令 / UDP 心跳 > - 21117:hbbr TCP 中继 > - 21118:hbbs WebSocket > - 21119:hbbr WebSocket ### 2.2 安装 Docker 和 Docker Compose 插件 ```bash curl -fsSL https://get.docker.com | bash sudo systemctl enable --now docker ``` ### 2.3 提高系统文件描述符限制(高并发必需) ```bash echo "* soft nofile 65535" >> /etc/security/limits.conf echo "* hard nofile 65535" >> /etc/security/limits.conf echo "root soft nofile 65535" >> /etc/security/limits.conf echo "root hard nofile 65535" >> /etc/security/limits.conf ``` 修改后**重启服务器**使配置生效。 ## 三、部署服务 ### 3.1 创建项目目录 ```bash mkdir -p ~/rustdesk && cd ~/rustdesk ``` ### 3.2 编写 `docker-compose.yml` 创建文件 `docker-compose.yml`,内容如下(请将 `YOUR_SERVER_IP` 替换为你的服务器内网或公网 IP): ```yaml networks: rustdesk-net: external: false services: rustdesk-server: container_name: rustdesk-server image: lejianwen/rustdesk-server-s6:latest network_mode: "host" environment: - TZ=Asia/Shanghai - RELAY=YOUR_SERVER_IP:21117 - ENCRYPTED_ONLY=1 - RUSTDESK_API_RUSTDESK_ID_SERVER=YOUR_SERVER_IP:21116 - RUSTDESK_API_RUSTDESK_RELAY_SERVER=YOUR_SERVER_IP:21117 - RUSTDESK_API_RUSTDESK_API_SERVER=http://YOUR_SERVER_IP:21114 - RUSTDESK_API_RUSTDESK_KEY_FILE=/data/id_ed25519.pub - RUSTDESK_API_LANG=zh-CN - ALWAYS_USE_RELAY=N - RUSTDESK_API_APP_TOKEN_EXPIRE=87600h volumes: # 持久化 hbbs/hbbr 的设备数据库和密钥 - ./data:/data # 持久化 API 服务的用户数据库(解决密码重置问题) - ./api-data:/app/data restart: unless-stopped ulimits: nofile: soft: 65535 hard: 65535 ``` > **关键点**: > - `volumes` 挂载了两个宿主机目录: > - `./data` → 容器 `/data`:存放 `hbbs`/`hbbr` 的设备数据库(`db_v2.sqlite3`)和密钥(`id_ed25519*`)。 > - `./api-data` → 容器 `/app/data`:存放 API 服务器的用户数据库(`rustdeskapi.db`),**这是管理员密码持久化的关键**。 > - 这样即使容器重建,所有数据都不会丢失,密码保持不变。 ### 3.3 启动服务 ```bash docker compose up -d ``` ### 3.4 获取关键信息 #### 公钥(Key) ```bash cat ./data/id_ed25519.pub ``` 输出类似:`D5Msl1fTdFv92qcguwTEhvNcghhjRLUp+8LAw6AxFlY=` #### 管理员初始密码 ```bash docker compose logs | grep "Admin Password Is:" ``` 输出类似:`Admin Password Is: OXOxH4TJ` > **重要**:首次启动后,请立即登录 Web 后台修改密码,防止忘记。 ## 四、客户端配置 在所有需要连接此服务器的 RustDesk 客户端上: 1. 打开设置 → 网络 2. 填写: - **ID 服务器**:`YOUR_SERVER_IP:21116` - **中继服务器**:`YOUR_SERVER_IP:21117` - **Key**:粘贴上面获取的公钥 - **API 服务器**:`http://YOUR_SERVER_IP:21114`(可选,用于地址簿同步) 3. 保存后,点击客户端主界面的“登录”,使用用户名 `admin` 和上面获取的密码登录。 ## 五、持久化说明 - **设备数据库**:保存在 `./data/db_v2.sqlite3` - **API 用户数据库**:保存在 `./api-data/rustdeskapi.db` - **密钥文件**:保存在 `./data/id_ed25519*` 只要这两个宿主机目录不被删除,无论执行 `docker compose down` 还是重启服务器,所有数据(包括管理员密码、注册设备、地址簿)都会完整保留。 > 若需要备份或迁移,只需打包 `./data` 和 `./api-data` 两个目录即可。 ## 六、常用运维命令 | 操作 | 命令 | |------|------| | 查看日志 | `docker compose logs -f` | | 重启服务(保留数据) | `docker compose restart` | | 修改配置后更新 | `docker compose up -d` | | 停止并删除容器 | `docker compose down` | | 进入容器内部 | `docker exec -it rustdesk-server /bin/sh` | ## 七、故障排查 ### 7.1 客户端 ID 连接失败,但 IP 直连正常 - 检查服务器防火墙是否开放 UDP 21116 端口。 - 查看容器日志:`docker compose logs | grep -i error` - 确认客户端填写的 Key 与服务器 `./data/id_ed25519.pub` 完全一致。 ### 7.2 Web 后台无法登录 - 确认容器正常运行:`docker ps | grep rustdesk-server` - 检查端口 21114 是否被占用:`ss -tlnp | grep 21114` - 若密码忘记,进入容器执行 `/app/apimain reset-admin-pwd <新密码>` 重置。 ### 7.3 重启后密码丢失 - 检查是否挂载了 `./api-data:/app/data`,且该目录下有 `rustdeskapi.db` 文件。 - 若未自动生成,请登录一次 Web 后台并修改密码,数据库会自动创建。 ## 八、升级与迁移 ### 升级镜像 ```bash docker compose pull docker compose up -d ``` ### 迁移到新服务器 1. 打包 `./data` 和 `./api-data` 目录。 2. 新服务器按本文档部署好 Docker。 3. 将两个目录复制到新服务器的项目目录下。 4. 启动 `docker compose up -d`,所有数据保留,密码不变。 --- 这份文档已经针对你遇到的问题做了修正,核心是**两个持久化挂载点**。按照这个步骤操作,以后无论怎么重启,管理员密码都不会再变了。如果有任何问题,随时反馈。