1. 为什么选择Docker Compose来部署RustDesk服务器?

如果你用过RustDesk,肯定知道它是个好东西——开源、免费、流畅,自己搭服务器就能完全掌控远程桌面连接,数据安全自己说了算。但说到自建服务器,很多朋友第一步就被劝退了:又是拉镜像,又是写一长串docker run命令,还要配置网络、挂载目录、设置重启策略,步骤繁琐不说,命令敲错一个字母就得重来,管理起来更是头疼。

我自己刚开始也是用docker run一条条命令去部署hbbshbbr这两个核心服务。部署一次还行,但后来服务器迁移,或者想调整配置参数,就得翻历史记录,把那些长得要命的命令再找出来,一不小心就配错了。更麻烦的是,这两个服务是相互依赖的,启动顺序、网络配置都得手动保证一致,维护成本其实不低。

直到我开始用Docker Compose,整个部署体验完全变了。你可以把它理解为一个“服务编排器”或者“一键部署脚本”。以前你需要手动执行的两个docker run命令,现在只需要写在一个叫docker-compose.yml的配置文件里。部署时,一条命令docker-compose up -d,两个服务就按你定义好的方式,乖乖地一起跑起来了。这不仅仅是省了几行命令,更重要的是带来了几个实实在在的好处:

第一,配置即文档。 你的所有部署设置——用什么镜像、容器叫什么名字、映射哪些端口、挂载什么目录、使用什么网络模式——都白纸黑字地写在了YAML文件里。半年后你再看,或者换一个运维同事来接手,他看一眼这个文件就知道整个服务是怎么跑的,完全不用去猜历史命令。

第二,管理极度简化。 想同时启动、停止、重启或查看hbbshbbr的状态?不用再分别操作两个容器了。一句docker-compose start/stop/restart/ps就能搞定所有服务。想清理环境?docker-compose down一键就能移除所有相关的容器、网络,干净利落。

第三,环境一致性得到保证。 Compose文件确保了每次部署,两个服务的配置(尤其是网络模式host、重启策略always)都是完全一致的,彻底避免了因为手动输入错误导致一个服务用host网络、另一个用bridge网络这种尴尬的、难以排查的问题。

第四,为未来扩展铺平道路。 今天你只部署RustDesk,明天可能想加上一个Nginx做反代,或者配一个Prometheus来监控。你只需要在同一个docker-compose.yml文件里继续添加服务定义就行,所有服务都能被统一管理。这种可维护性和可扩展性,是单打独斗的docker run命令很难比拟的。

所以,如果你打算认真搭建一个用于个人或小团队生产环境的RustDesk服务器,我强烈建议直接从Docker Compose开始。它把部署从一项“一次性手工活”,变成了一个可重复、可版本控制、易于管理的“基础设施代码”过程。接下来,我就带你从零开始,一步步搭建一个高可用、易维护的RustDesk服务器。

2. 部署前的准备工作:环境与规划

在动手敲命令之前,花几分钟做好准备工作,能让你后面的部署过程顺畅无比,少踩很多坑。这部分咱们主要搞定三件事:服务器环境、网络规划,还有关键信息的确认。

2.1 服务器环境检查

首先,你需要一台服务器。云服务商的VPS或者你自己家里的有公网IP的机器都行。操作系统推荐用主流的Linux发行版,比如Ubuntu 22.04 LTS或者CentOS Stream 8/9。我这里以Ubuntu为例,但原理是相通的。

登录服务器后,第一件事是检查并安装必要的软件:

  1. Docker Engine:这是基石。确保你的系统已经安装了Docker。如果没有,可以用官方脚本快速安装。打开终端,执行:

    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    

    安装完成后,运行sudo docker --version确认安装成功。为了避免每次都要sudo,可以把当前用户加入docker组:sudo usermod -aG docker $USER,然后退出终端重新登录生效。

  2. Docker Compose:这是我们今天的主角。虽然现在Docker Desktop通常自带,但在Linux服务器上我们需要单独安装。推荐安装独立的Compose插件(v2版本),它是docker命令的一个子命令,用起来更统一。

    # 下载最新的docker-compose插件二进制文件
    sudo curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
    # 赋予执行权限
    sudo chmod +x /usr/local/bin/docker-compose
    # 验证安装
    docker compose version
    

    看到版本号输出,就说明安装成功了。注意,我们用的是docker compose(两个词中间有空格),这是新版的命令格式。

2.2 关键信息确认与规划

这一步至关重要,直接决定了你的RustDesk服务能否被外界访问。

  1. 服务器的公网IP或域名:这是客户端连接时必须填写的地址。

    • 公网IP:最简单直接。你可以在服务器上运行curl -4 ifconfig.mecurl ip.sb来获取。记下这个IP。
    • 域名:更推荐的方式。去域名服务商那里买一个域名(比如your-company.com),然后添加一条A记录,将子域名(例如rustdesk.your-company.com)解析到你服务器的公网IP。用域名的好处是,即使服务器IP变了,你只需要更新DNS解析,所有客户端配置无需修改。
  2. 数据存储目录规划:RustDesk服务器运行时会生成一些关键数据,比如自动生成的密钥对、运行日志等。我们需要在宿主机上创建目录,并挂载到容器内,这样即使容器销毁,数据也不会丢失。 我习惯在/opt目录下创建:

    sudo mkdir -p /opt/rustdesk/{hbbs,hbbr}
    

    这样,/opt/rustdesk/hbbs目录就给hbbs服务用,/opt/rustdesk/hbbrhbbr服务用。目录权限也要设置好,让Docker能写入:

    sudo chown -R $USER:$USER /opt/rustdesk
    sudo chmod -R 755 /opt/rustdesk
    
  3. 防火墙端口确认:RustDesk服务需要开放一系列端口。请确保你的服务器安全组(云服务商控制台)和系统防火墙(如ufwfirewalld)放行了以下端口:

    • TCP: 21115-21119:这是核心端口范围。hbbshbbr的通信主要依赖这些端口。
    • UDP: 21116:这个端口必须同时开放TCP和UDP协议,用于ID注册和心跳检测,对UDP打洞成功至关重要。

    以Ubuntu的ufw为例,开放命令如下:

    sudo ufw allow 21115:21119/tcp
    sudo ufw allow 21116/udp
    sudo ufw reload
    

准备工作做完,心里就有底了。服务器环境就绪,IP/域名在手,数据目录规划好,端口大门敞开,接下来我们就可以开始编写那个“一劳永逸”的编排文件了。

3. 编写Docker Compose文件:从入门到精通

现在进入核心环节——创建docker-compose.yml文件。这个文件就是我们整个部署方案的“蓝图”。我会逐行解释,并给你一个生产环境可用的完整模板,同时对比之前docker run命令的写法,让你看清Compose带来的清晰与优雅。

3.1 基础服务定义:让hbbs和hbbr跑起来

首先,在你规划好的目录,比如/opt/rustdesk下,创建这个文件:

cd /opt/rustdesk
nano docker-compose.yml

然后,我们把最基本的服务结构写进去。先看一个最简版本,它实现了和之前两条docker run命令完全一样的功能:

version: '3.8'

services:
  hbbs:
    image: rustdesk/rustdesk-server:latest
    container_name: rustdesk-hbbs
    command: hbbs -r your-server-address.com -k your_custom_key_here
    network_mode: "host"
    volumes:
      - ./hbbs:/root
    restart: always

  hbbr:
    image: rustdesk/rustdesk-server:latest
    container_name: rustdesk-hbbr
    command: hbbr
    network_mode: "host"
    volumes:
      - ./hbbr:/root
    restart: always

我们来拆解一下每一部分的含义:

  • version: '3.8':指定Compose文件的格式版本。用3.x版本兼容性比较好。
  • services::下面定义的就是我们要运行的所有容器服务。
  • hbbs:hbbr::这是我们给服务起的名字,你可以按喜好修改,但后面命令里要用到。
  • image::指定使用的Docker镜像,这里就是官方的rustdesk/rustdesk-server
  • container_name::指定运行起来的容器叫什么名字,方便我们管理时识别。如果不指定,Docker会生成一个随机名字。
  • command::覆盖容器启动时默认执行的命令。这是核心配置!
    • 对于hbbs,我们必须通过-r参数指定服务器地址(替换your-server-address.com为你的IP或域名)。-k参数用于设置一个自定义的密钥,增强安全性(可选,但强烈建议设置)。
    • 对于hbbr,通常只需要hbbr这个命令本身。
  • network_mode: "host":这是关键配置!它让容器直接使用宿主机的网络栈。这意味着容器内开放的端口(21115-21119)就是直接在宿主机上开放的,省去了复杂的端口映射配置,性能也最好。RustDesk官方推荐这种模式。
  • volumes::数据卷挂载。格式是宿主机目录:容器内目录。这里我们把当前目录下的hbbshbbr文件夹(就是之前创建的那两个),分别挂载到两个容器的/root目录。这样容器内生成的所有文件(包括密钥、日志)都会持久化保存在宿主机上。
  • restart: always:重启策略。设置为always后,只要容器异常退出,或者宿主机重启,Docker都会自动重新启动这个容器,极大地提高了服务的可用性。

对比一下传统的docker run命令: 以前部署hbbs,你需要敲这么一长串:

docker run --restart=always --name hbbs -v /opt/rustdesk/hbbs:/root -td --net=host rustdesk/rustdesk-server hbbs -r your-server-address.com -k your_custom_key_here

现在,所有参数都清晰地组织在了YAML文件里。哪个更易读、更易维护,一目了然。

3.2 进阶配置:让服务更健壮、更易管理

基础版本能跑,但我们可以做得更好。下面我分享几个在实际生产环境中非常实用的进阶配置。

1. 资源限制与日志管理: 防止某个服务异常占用过多资源,影响宿主机的稳定,同时控制日志文件大小,避免磁盘被撑爆。

services:
  hbbs:
    # ... 其他配置同上 ...
    deploy:
      resources:
        limits:
          cpus: '1.0'   # 限制最多使用1个CPU核心
          memory: 512M   # 限制最多使用512MB内存
    logging:
      driver: "json-file"
      options:
        max-size: "10m" # 单个日志文件最大10MB
        max-file: "3"   # 最多保留3个日志文件(滚动覆盖)

deploy部分通常在Swarm集群中使用,但在单机Compose下,resources限制依然有效。logging配置确保了容器日志不会无限增长。

2. 健康检查与依赖关系: 虽然hbbrhbbs没有严格的启动顺序依赖,但我们可以通过健康检查来监控服务状态,并在管理上建立逻辑依赖。

services:
  hbbs:
    # ... 其他配置 ...
    healthcheck:
      test: ["CMD", "timeout", "5", "bash", "-c", "echo > /dev/tcp/127.0.0.1/21116"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  hbbr:
    # ... 其他配置 ...
    depends_on:
      hbbs:
        condition: service_started

这里给hbbs定义了一个健康检查:每30秒尝试连接本地的21116端口(hbbs的核心端口),超时5秒,重试3次。hbbr服务通过depends_on指定,在hbbs启动之后才开始启动。这更多是一种最佳实践,让服务启动更有秩序。

3. 环境变量与配置文件分离: 把服务器地址、密钥等敏感或易变的信息从Compose文件里抽出来,用环境变量管理,更安全、更灵活。 首先,创建一个.env文件在docker-compose.yml同级目录:

RUSTDESK_SERVER_ADDR=rustdesk.your-company.com
RUSTDESK_KEY=your_very_strong_secret_key_123!

然后,修改docker-compose.yml中的command部分:

command: hbbs -r $${RUSTDESK_SERVER_ADDR} -k $${RUSTDESK_KEY}

注意,在Compose文件里引用环境变量需要双美元符号$$进行转义。这样,当你需要修改地址或密钥时,只需改.env文件,无需动核心的YAML配置。记得把.env文件加入.gitignore,不要提交到代码仓库。

把这些进阶配置组合起来,你就得到了一个非常健壮、接近生产级别的部署模板。它不仅能让服务跑起来,还能跑得稳、管得好。

4. 一键部署与日常运维全指南

配置文件写好之后,部署就变成了最简单的环节。我们来看看如何用几条命令搞定一切,以及日后如何轻松地进行管理。

4.1 启动服务与验证

docker-compose.yml文件所在的目录(/opt/rustdesk),执行一条命令:

docker compose up -d

这个-d参数代表“后台运行”。执行后,Docker Compose会做以下几件事:

  1. 检查镜像本地是否存在,不存在则自动从Docker Hub拉取。
  2. 按照文件定义,依次创建并启动hbbshbbr两个服务(容器)。
  3. 将服务放入后台运行。

启动完成后,立刻用以下命令检查状态:

docker compose ps

你应该能看到两个服务的状态都是Up。这比分别运行docker ps | grep hbbsdocker ps | grep hbbr要方便得多。

验证服务是否真正工作:

  1. 查看日志:启动初期,查看日志能帮你快速定位问题。

    # 查看所有服务的日志
    docker compose logs
    # 实时跟踪hbbs的日志
    docker compose logs -f hbbs
    

    hbbs的启动日志中,你应该能看到类似[INFO] Public key: xxxxxxxxxxxxxx的信息。这个公钥(或者你自定义的Key)就是待会客户端要填的。

  2. 检查端口监听:在宿主机上运行ss -tulnp | grep 2111,应该能看到21115-21119端口的TCP监听,以及21116端口的UDP监听。

  3. 验证密钥文件:由于我们挂载了数据卷,密钥文件应该已经生成在宿主机上。

    cat /opt/rustdesk/hbbs/id_ed25519.pub
    

    这个文件里的字符串就是你的公钥。如果启动时指定了-k参数,这里就是你自定义的密钥。

4.2 日常运维命令大全

有了Compose,日常管理变得异常统一和简单。下面这些命令请收好:

  • 停止服务docker compose stop。这会让容器停止,但不会删除它们。
  • 启动服务docker compose start。启动已停止的服务。
  • 重启服务docker compose restart。常用于应用配置更新后。
  • 停止并移除容器、网络docker compose down注意:这会把容器删掉,但不会删除我们挂载的数据卷(/opt/rustdesk/hbbshbbr目录里的数据是安全的)。如果想连数据卷一起清理,用docker compose down -v(慎用!)。
  • 查看实时日志docker compose logs -f
  • 进入容器内部docker compose exec hbbs bash。如果你想检查容器内的文件或执行一些调试命令,这个很有用。
  • 更新服务(例如镜像更新后)
    # 拉取最新镜像
    docker compose pull
    # 重新创建并启动容器(使用新镜像)
    docker compose up -d
    # 清理旧的、已停止的容器和未使用的镜像
    docker system prune -f
    

4.3 客户端配置与连接测试

服务端搭好了,最后一步就是在你的电脑或手机上配置RustDesk客户端。

  1. 获取配置信息

    • ID服务器:填写你的服务器公网IP或域名(即-r参数设置的值)。
    • 中继服务器:和ID服务器填一样的地址。
    • API服务器:留空即可。
    • Key:填写你在docker-compose.yml中通过-k参数设置的自定义密钥,或者查看/opt/rustdesk/hbbs/id_ed25519.pub文件得到的公钥。
  2. 在客户端设置:打开RustDesk客户端,进入“设置” -> “网络”。在“ID服务器”和“中继服务器”栏填入你的服务器地址,在“Key”栏填入密钥。点击“确定”或“应用”。

  3. 测试连接

    • 在客户端主界面,你应该能看到本机的ID。
    • 尝试用另一台也配置了相同服务器的设备,输入这个ID进行连接。
    • 如果一切正常,你会看到连接请求,接受后即可开始远程控制。

常见问题排查

  • 连接不上:首先检查服务器防火墙和安全组是否已正确开放所有必需的端口(TCP:21115-21119, UDP:21116)。在服务器上用telnet 你的服务器IP 21116命令从外部网络测试端口连通性。
  • Key不匹配:确保客户端填写的Key与服务器端hbbs容器生成的或你自定义的完全一致,注意不要有多余的空格。
  • 查看服务端日志:使用docker compose logs hbbsdocker compose logs hbbr,看是否有明显的错误信息。

走到这一步,恭喜你,一个由Docker Compose编排的、高可用的RustDesk服务器就已经稳稳地运行在你的掌控之下了。整个部署过程从一堆零散的命令,变成了一个可版本化、可重复执行的清晰定义文件。以后无论是迁移服务器,还是增加新的辅助服务,你都会感谢今天选择了Compose这个方式。

更多推荐