diff --git a/ru b/ru index 860ae9d..18085d2 100644 --- a/ru +++ b/ru @@ -1,17 +1,44 @@ #!/bin/bash -echo "强制修复密钥问题..." +set -e # 出现任何错误立即退出 -cd rustdesk-unified-keys +echo "🚀 RustDesk 服务器一键部署脚本" +echo "========================================" -# 完全重置 -docker-compose down 2>/dev/null || true -rm -rf server/* +# 检查 Docker 是否安装 +if ! command -v docker &> /dev/null; then + echo "❌ Docker 未安装,请先安装 Docker" + exit 1 +fi -# 重新生成密钥到正确位置 -mkdir -p server keys +# 检查 Docker Compose 是否可用 +if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then + echo "❌ Docker Compose 不可用,请先安装 Docker Compose" + exit 1 +fi -# 在server目录生成固定密钥(容器内的/root目录) +# 使用 docker compose(新版本)或 docker-compose(旧版本) +DOCKER_COMPOSE_CMD="docker-compose" +if command -v docker &> /dev/null && docker compose version &> /dev/null; then + DOCKER_COMPOSE_CMD="docker compose" +fi + +# 创建工作目录 +WORK_DIR="rustdesk-unified-keys" +cd "$WORK_DIR" 2>/dev/null || mkdir -p "$WORK_DIR" && cd "$WORK_DIR" + +echo "📁 工作目录: $(pwd)" + +# 完全重置现有服务 +echo "🔄 清理现有服务..." +$DOCKER_COMPOSE_CMD down --remove-orphans 2>/dev/null || true +rm -rf server/* keys/* api-data/* 2>/dev/null || true + +# 创建必要的目录结构 +mkdir -p server keys api-data + +# 生成固定密钥到 server 目录(容器内的 /root 目录) +echo "🔑 生成加密密钥..." cat > server/id_ed25519 << 'EOF' -----BEGIN PRIVATE KEY----- MC4CAQAwBQYDK2VwBCIEIAE8qD6H5JkG9T5s8s7XaYz1UvP6wQ3rN2tLbKj1mG @@ -24,7 +51,7 @@ MCowBQYDK2VwAyEA2Q1Dp4q8q5V7s9kLx2mBwT3zN8rR6vY1zUj5tKfE= -----END PUBLIC KEY----- EOF -# 复制到keys目录备份 +# 备份密钥到 keys 目录 cp server/id_ed25519 keys/ cp server/id_ed25519.pub keys/ @@ -32,35 +59,64 @@ cp server/id_ed25519.pub keys/ chmod 600 server/id_ed25519 chmod 644 server/id_ed25519.pub -# 检测IP -RELAY_SERVER=$(curl -s --connect-timeout 5 http://ipinfo.io/ip || curl -s --connect-timeout 5 http://ifconfig.me || hostname -I | awk '{print $1}') -echo "RELAY_SERVER=$RELAY_SERVER" > .env +# 检测公网 IP +echo "🌐 检测服务器公网 IP..." +RELAY_SERVER="" +IP_SERVICES=( + "http://ipinfo.io/ip" + "http://ifconfig.me" + "http://icanhazip.com" + "http://ident.me" +) -# 使用完整的docker-compose配置 +for service in "${IP_SERVICES[@]}"; do + if RELAY_SERVER=$(curl -s --connect-timeout 3 "$service"); then + if [[ "$RELAY_SERVER" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "✅ 从 $service 获取到 IP: $RELAY_SERVER" + break + fi + fi +done + +# 如果通过服务获取失败,使用本地IP +if [[ -z "$RELAY_SERVER" || ! "$RELAY_SERVER" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + RELAY_SERVER=$(hostname -I | awk '{print $1}') + echo "⚠️ 使用本地 IP: $RELAY_SERVER" +fi + +# 保存环境变量 +cat > .env << EOF +# RustDesk 服务器配置 +RELAY_SERVER=$RELAY_SERVER +FIXED_KEY=2Q1Dp4q8q5V7s9kLx2mBwT3zN8rR6vY1zUj5tKfE= +TIMEZONE=Asia/Shanghai +EOF + +# 创建完整的 docker-compose 配置 cat > docker-compose.yml << EOF services: rustdesk: container_name: rustdesk-server ports: - - "21114:21114" - - "21115:21115" - - "21116:21116" + - "21114:21114" # API 服务器 + - "21115:21115" # 网页客户端 + - "21116:21116" # ID 服务器 - "21116:21116/udp" - - "21117:21117" - - "21118:21118" - - "21119:21119" + - "21117:21117" # 中继服务器 + - "21118:21118" # 备用端口 + - "21119:21119" # 备用端口 image: lejianwen/rustdesk-server-s6:latest environment: - - RELAY=${RELAY_SERVER} + - RELAY=\${RELAY_SERVER} - ENCRYPTED_ONLY=1 - - MUST_LOGIN=N - - TZ=Asia/Shanghai - - RUSTDESK_API_RUSTDESK_ID_SERVER=${RELAY_SERVER}:21116 - - RUSTDESK_API_RUSTDESK_RELAY_SERVER=${RELAY_SERVER}:21117 - - RUSTDESK_API_RUSTDESK_API_SERVER=http://${RELAY_SERVER}:21114 - - RUSTDESK_API_RUSTDESK_KEY=2Q1Dp4q8q5V7s9kLx2mBwT3zN8rR6vY1zUj5tKfE= + - MUST_LOGIN=y + - TZ=\${TIMEZONE} + - RUSTDESK_API_RUSTDESK_ID_SERVER=\${RELAY_SERVER}:21116 + - RUSTDESK_API_RUSTDESK_RELAY_SERVER=\${RELAY_SERVER}:21117 + - RUSTDESK_API_RUSTDESK_API_SERVER=http://\${RELAY_SERVER}:21114 + - RUSTDESK_API_RUSTDESK_KEY=\${FIXED_KEY} - RUSTDESK_API_RUSTDESK_KEY_FILE=/root/id_ed25519.pub - - RUSTDESK_API_JWT_KEY=2Q1Dp4q8q5V7s9kLx2mBwT3zN8rR6vY1zUj5tKfE= + - RUSTDESK_API_JWT_KEY=\${FIXED_KEY} - RUSTDESK_API_LANG=zh-CN - RUSTDESK_API_APP_WEB_CLIENT=1 - RUSTDESK_API_APP_REGISTER=false @@ -70,48 +126,84 @@ services: - ./server:/root - ./api-data:/app/data restart: unless-stopped + healthcheck: + test: ["CMD", "netstat", "-ltn"] + interval: 30s + timeout: 10s + retries: 3 networks: - rustdesk-net: - driver: bridge + default: + name: rustdesk-network EOF -echo "验证密钥文件:" +echo "✅ 配置文件创建完成" + +# 验证密钥文件 +echo "🔍 验证密钥文件:" ls -la server/ -echo "公钥内容:" +echo "📄 公钥内容:" cat server/id_ed25519.pub -echo "启动服务..." -docker-compose up -d +# 启动服务 +echo "🔄 启动 RustDesk 服务..." +$DOCKER_COMPOSE_CMD up -d -sleep 15 -echo "服务状态:" -docker-compose ps +# 等待服务启动 +echo "⏳ 等待服务启动..." +for i in {1..30}; do + if $DOCKER_COMPOSE_CMD ps | grep -q "Up"; then + echo "✅ 服务启动成功" + break + fi + sleep 2 + echo -n "." +done -echo "查看密钥相关日志:" -docker-compose logs --tail=50 | grep -i "key\|Key" +sleep 5 -echo "重置管理员密码: 3459635287" -docker exec -it rustdesk-server ./apimain reset-admin-pwd 3459635287 +# 显示服务状态 +echo "📊 服务状态:" +$DOCKER_COMPOSE_CMD ps -echo "=== 最终验证 ===" -SERVER_KEY=$(docker-compose logs | grep "Key:" | tail -1 | awk '{print $NF}') +# 重置管理员密码 +echo "🔐 重置管理员密码..." +if docker exec -it rustdesk-server ./apimain reset-admin-pwd 3459635287 2>/dev/null; then + echo "✅ 管理员密码已重置: 3459635287" +else + echo "⚠️ 密码重置可能失败,请手动检查" +fi + +# 验证部署 +echo "🔍 验证部署结果..." +SERVER_KEY=$($DOCKER_COMPOSE_CMD logs 2>/dev/null | grep "Key:" | tail -1 | awk '{print $NF}' || echo "") FIXED_KEY="2Q1Dp4q8q5V7s9kLx2mBwT3zN8rR6vY1zUj5tKfE=" +echo "=== 部署验证结果 ===" echo "服务器使用密钥: $SERVER_KEY" echo "期望固定密钥: $FIXED_KEY" if [ "$SERVER_KEY" = "$FIXED_KEY" ]; then echo "✅ 密钥匹配成功!" - echo "客户端连接密钥: $FIXED_KEY" else echo "❌ 密钥不匹配!" echo "调试信息:" - docker-compose logs --tail=20 | grep -i key + $DOCKER_COMPOSE_CMD logs --tail=20 | grep -i key 2>/dev/null || echo "未找到相关日志" fi -echo "=== 客户端配置 ===" -echo "ID服务器: ${RELAY_SERVER}:21116" -echo "中继服务器: ${RELAY_SERVER}:21117" -echo "API服务器: http://${RELAY_SERVER}:21114" -echo "密钥: 2Q1Dp4q8q5V7s9kLx2mBwT3zN8rR6vY1zUj5tKfE=" +# 显示最终配置信息 +echo "" +echo "🎉 RustDesk 服务器部署完成!" +echo "========================================" +echo "📋 客户端配置信息:" +echo " ID 服务器: ${RELAY_SERVER}:21116" +echo " 中继服务器: ${RELAY_SERVER}:21117" +echo " API 服务器: http://${RELAY_SERVER}:21114" +echo " 密钥: 2Q1Dp4q8q5V7s9kLx2mBwT3zN8rR6vY1zUj5tKfE=" +echo " 管理员密码: 3459635287" +echo "" +echo "🔧 管理命令:" +echo " 查看日志: cd $WORK_DIR && $DOCKER_COMPOSE_CMD logs -f" +echo " 重启服务: cd $WORK_DIR && $DOCKER_COMPOSE_CMD restart" +echo " 停止服务: cd $WORK_DIR && $DOCKER_COMPOSE_CMD down" +echo "========================================"