Skip to content

rustdesk自建

使用方式

mkdir rustdesk
touch docker-compose.yml
touch start.sh
chmod +x start.sh

docker-compose.yml

version: '3'

services:
  hbbr:
    container_name: hbbr
    image: rustdesk/rustdesk-server:1.1.14
    command: hbbr
    restart: always
    ports:
      - "21117:21117"
    volumes:
      - ./rust-desk:/root
    networks:
      - rustdesk-net

  hbbs:
    container_name: hbbs
    image: rustdesk/rustdesk-server:1.1.14
    command: hbbs
    restart: always
    ports:
      - "21115:21115"
      - "21116:21116/tcp"
      - "21116:21116/udp"
    volumes:
      - ./rust-desk:/root
    depends_on:
      - hbbr
    networks:
      - rustdesk-net

networks:
  rustdesk-net:
    driver: bridge

启动脚本

#!/bin/bash

# RustDesk 远程桌面服务启动脚本
# 用于快速部署和管理 RustDesk 服务

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印带颜色的消息
print_info() {
    echo -e "${BLUE}[信息]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[成功]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[警告]${NC} $1"
}

print_error() {
    echo -e "${RED}[错误]${NC} $1"
}

# 检查 Docker 是否安装
check_docker() {
    if ! command -v docker &> /dev/null; then
        print_error "Docker 未安装,请先安装 Docker"
        exit 1
    fi

    if ! command -v docker compose &> /dev/null; then
        print_error "Docker Compose 未安装,请先安装 Docker Compose"
        exit 1
    fi
}

# 检查端口是否可用
check_ports() {
    print_info "检查端口占用情况..."

    local ports=(21115 21116 21117 21118 21119)
    local occupied_ports=()

    for port in "${ports[@]}"; do
        if netstat -tuln | grep -q ":$port "; then
            occupied_ports+=($port)
        fi
    done

    if [ ${#occupied_ports[@]} -gt 0 ]; then
        print_warning "以下端口已被占用: ${occupied_ports[*]}"
        print_warning "请确保这些端口可用或修改配置文件中的端口设置"
    else
        print_success "所需端口都可用"
    fi
}

# 创建数据目录
create_directories() {
    print_info "创建数据目录..."
    mkdir -p ./data/hbbs ./data/hbbr
    print_success "数据目录创建完成"
}

# 配置防火墙
configure_firewall() {
    print_info "配置防火墙规则..."

    # 检查是否有 ufw
    if command -v ufw &> /dev/null; then
        print_info "使用 ufw 配置防火墙..."
        ufw allow 21115/tcp >/dev/null 2>&1 || true
        ufw allow 21116/tcp >/dev/null 2>&1 || true
        ufw allow 21116/udp >/dev/null 2>&1 || true
        ufw allow 21117/tcp >/dev/null 2>&1 || true
        ufw allow 21118/tcp >/dev/null 2>&1 || true
        ufw allow 21119/tcp >/dev/null 2>&1 || true
        print_success "ufw 防火墙规则配置完成"
    elif command -v firewall-cmd &> /dev/null; then
        print_info "使用 firewall-cmd 配置防火墙..."
        firewall-cmd --permanent --add-port=21115/tcp >/dev/null 2>&1 || true
        firewall-cmd --permanent --add-port=21116/tcp >/dev/null 2>&1 || true
        firewall-cmd --permanent --add-port=21116/udp >/dev/null 2>&1 || true
        firewall-cmd --permanent --add-port=21117/tcp >/dev/null 2>&1 || true
        firewall-cmd --permanent --add-port=21118/tcp >/dev/null 2>&1 || true
        firewall-cmd --permanent --add-port=21119/tcp >/dev/null 2>&1 || true
        firewall-cmd --reload >/dev/null 2>&1 || true
        print_success "firewall-cmd 防火墙规则配置完成"
    else
        print_warning "未检测到支持的防火墙工具,请手动配置防火墙"
        print_warning "需要开放端口: 21115-21119 (TCP), 21116 (UDP)"
    fi
}

# 启动服务
start_services() {
    print_info "启动 RustDesk 服务..."

    # 拉取最新镜像
    print_info "拉取最新的 Docker 镜像..."
    docker compose pull

    # 启动服务
    docker compose up -d

    print_success "RustDesk 服务启动完成"
}

# 显示服务状态
show_status() {
    print_info "检查服务状态..."
    sleep 5

    echo ""
    print_info "容器状态:"
    docker compose ps

    echo ""
    print_info "服务日志 (最近10行):"
    docker compose logs --tail=10
}

# 获取服务器信息
get_server_info() {
    echo ""
    print_info "获取服务器配置信息..."

    # 等待密钥文件生成
    local max_wait=30
    local wait_time=0

    while [ ! -f "./data/hbbs/id_ed25519.pub" ] && [ $wait_time -lt $max_wait ]; do
        sleep 1
        wait_time=$((wait_time + 1))
    done

    if [ -f "./data/hbbs/id_ed25519.pub" ]; then
        local public_key=$(cat ./data/hbbs/id_ed25519.pub)
        local server_ip=$(curl -s ifconfig.me 2>/dev/null || echo "请手动获取服务器公网IP")

        echo ""
        print_success "RustDesk 服务器配置信息:"
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        echo -e "📡 ${BLUE}ID 服务器:${NC}     $server_ip:21116"
        echo -e "🔄 ${BLUE}中继服务器:${NC}   $server_ip:21117"
        echo -e "🔑 ${BLUE}服务器密钥:${NC}   $public_key"
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        echo ""
        print_info "客户端配置步骤:"
        echo "1. 下载 RustDesk 客户端: https://rustdesk.com/"
        echo "2. 点击 ID 右侧的设置按钮(三个点)"
        echo "3. 选择 'ID/中继服务器'"
        echo "4. 输入上述服务器信息"
        echo ""
    else
        print_warning "密钥文件尚未生成,请稍后运行以下命令获取密钥:"
        echo "cat ./data/hbbs/id_ed25519.pub"
    fi
}

# 显示帮助信息
show_help() {
    echo "RustDesk 远程桌面服务管理脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  start     启动 RustDesk 服务"
    echo "  stop      停止 RustDesk 服务"
    echo "  restart   重启 RustDesk 服务"
    echo "  status    查看服务状态"
    echo "  logs      查看服务日志"
    echo "  key       显示服务器密钥"
    echo "  info      显示服务器配置信息"
    echo "  update    更新 RustDesk 服务"
    echo "  help      显示帮助信息"
    echo ""
}

# 主函数
main() {
    local action=${1:-start}

    case $action in
        "start")
            print_info "开始部署 RustDesk 远程桌面服务..."
            check_docker
            check_ports
            create_directories
            configure_firewall
            start_services
            show_status
            get_server_info
            ;;
        "stop")
            print_info "停止 RustDesk 服务..."
            docker compose down
            print_success "RustDesk 服务已停止"
            ;;
        "restart")
            print_info "重启 RustDesk 服务..."
            docker compose restart
            print_success "RustDesk 服务已重启"
            ;;
        "status")
            docker compose ps
            ;;
        "logs")
            docker compose logs -f
            ;;
        "key")
            if [ -f "./data/hbbs/id_ed25519.pub" ]; then
                print_info "服务器公钥:"
                cat ./data/hbbs/id_ed25519.pub
            else
                print_error "密钥文件不存在,请先启动服务"
            fi
            ;;
        "info")
            get_server_info
            ;;
        "update")
            print_info "更新 RustDesk 服务..."
            docker compose pull
            docker compose up -d
            print_success "RustDesk 服务更新完成"
            ;;
        "help"|"--help"|"-h")
            show_help
            ;;
        *)
            print_error "未知操作: $action"
            show_help
            exit 1
            ;;
    esac
}

# 进入脚本目录
cd "$(dirname "$0")"

# 执行主函数
main "$@"