Update ru
This commit is contained in:
75
ru
75
ru
@@ -21,15 +21,9 @@ log_success() { echo -e "${GREEN}[成功]${NC} $1"; }
|
|||||||
log_warning() { echo -e "${YELLOW}[警告]${NC} $1"; }
|
log_warning() { echo -e "${YELLOW}[警告]${NC} $1"; }
|
||||||
log_error() { echo -e "${RED}[错误]${NC} $1"; }
|
log_error() { echo -e "${RED}[错误]${NC} $1"; }
|
||||||
|
|
||||||
# 简单输出函数(不带颜色,用于复杂输出)
|
|
||||||
echo_info() { echo "[信息] $1"; }
|
|
||||||
echo_success() { echo "[成功] $1"; }
|
|
||||||
echo_warning() { echo "[警告] $1"; }
|
|
||||||
echo_error() { echo "[错误] $1"; }
|
|
||||||
|
|
||||||
# 安全清理函数
|
# 安全清理函数
|
||||||
cleanup() {
|
cleanup() {
|
||||||
echo_info "执行清理操作..."
|
echo "执行清理操作..."
|
||||||
rm -f /tmp/rustdesk_keys
|
rm -f /tmp/rustdesk_keys
|
||||||
unset admin_password
|
unset admin_password
|
||||||
}
|
}
|
||||||
@@ -40,7 +34,7 @@ trap cleanup EXIT INT TERM
|
|||||||
# 检查命令是否存在
|
# 检查命令是否存在
|
||||||
check_command() {
|
check_command() {
|
||||||
if ! command -v "$1" &>/dev/null; then
|
if ! command -v "$1" &>/dev/null; then
|
||||||
echo_error "必需命令 '$1' 未找到"
|
echo "错误: 必需命令 '$1' 未找到"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
@@ -50,33 +44,30 @@ check_command() {
|
|||||||
check_port() {
|
check_port() {
|
||||||
local port=$1
|
local port=$1
|
||||||
|
|
||||||
# 验证端口范围
|
|
||||||
if [[ ! "$port" =~ ^[0-9]+$ ]] || [[ "$port" -lt 1024 || "$port" -gt 65535 ]]; then
|
if [[ ! "$port" =~ ^[0-9]+$ ]] || [[ "$port" -lt 1024 || "$port" -gt 65535 ]]; then
|
||||||
echo_error "端口号 $port 无效 (必须是1024-65535)"
|
echo "错误: 端口号 $port 无效 (必须是1024-65535)"
|
||||||
return 2
|
return 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检查端口占用
|
|
||||||
local port_in_use=false
|
local port_in_use=false
|
||||||
|
|
||||||
if command -v netstat &>/dev/null; then
|
if command -v netstat &>/dev/null; then
|
||||||
if netstat -tuln 2>/dev/null | grep -q ":${port}[[:space:]]"; then
|
if netstat -tuln 2>/dev/null | grep -q ":${port}[[:space:]]"; then
|
||||||
echo_warning "端口 $port 被占用 (netstat)"
|
echo "警告: 端口 $port 被占用 (netstat)"
|
||||||
port_in_use=true
|
port_in_use=true
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if command -v ss &>/dev/null; then
|
if command -v ss &>/dev/null; then
|
||||||
if ss -tuln 2>/dev/null | grep -q ":${port}[[:space:]]"; then
|
if ss -tuln 2>/dev/null | grep -q ":${port}[[:space:]]"; then
|
||||||
echo_warning "端口 $port 被占用 (ss)"
|
echo "警告: 端口 $port 被占用 (ss)"
|
||||||
port_in_use=true
|
port_in_use=true
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检查 Docker 容器占用
|
|
||||||
if command -v docker &>/dev/null; then
|
if command -v docker &>/dev/null; then
|
||||||
if docker ps --format "table {{.Ports}}" 2>/dev/null | grep -q ":${port}->"; then
|
if docker ps --format "table {{.Ports}}" 2>/dev/null | grep -q ":${port}->"; then
|
||||||
echo_warning "端口 $port 被 Docker 容器占用"
|
echo "警告: 端口 $port 被 Docker 容器占用"
|
||||||
port_in_use=true
|
port_in_use=true
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -88,7 +79,7 @@ check_port() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# 检查 Docker 环境
|
# 检查 Docker 环境(修复版)
|
||||||
check_docker() {
|
check_docker() {
|
||||||
log_info "检查 Docker 环境..."
|
log_info "检查 Docker 环境..."
|
||||||
|
|
||||||
@@ -102,21 +93,17 @@ check_docker() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检查 Docker Compose
|
# 检查 Docker Compose 并直接返回命令
|
||||||
local compose_cmd=""
|
|
||||||
if command -v docker-compose &>/dev/null; then
|
if command -v docker-compose &>/dev/null; then
|
||||||
compose_cmd="docker-compose"
|
|
||||||
log_info "使用 docker-compose"
|
log_info "使用 docker-compose"
|
||||||
|
echo "docker-compose"
|
||||||
elif docker compose version &>/dev/null; then
|
elif docker compose version &>/dev/null; then
|
||||||
compose_cmd="docker compose"
|
|
||||||
log_info "使用 docker compose"
|
log_info "使用 docker compose"
|
||||||
|
echo "docker compose"
|
||||||
else
|
else
|
||||||
log_error "Docker Compose 未安装"
|
log_error "Docker Compose 未安装"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log_success "Docker 环境检查通过"
|
|
||||||
echo "$compose_cmd"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 创建目录结构
|
# 创建目录结构
|
||||||
@@ -134,13 +121,11 @@ create_directories() {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# 设置权限
|
|
||||||
sudo chmod 755 "$SCRIPT_DIR"
|
sudo chmod 755 "$SCRIPT_DIR"
|
||||||
sudo chmod 755 "$SCRIPT_DIR/server"
|
sudo chmod 755 "$SCRIPT_DIR/server"
|
||||||
sudo chmod 755 "$SCRIPT_DIR/api"
|
sudo chmod 755 "$SCRIPT_DIR/api"
|
||||||
sudo chmod 755 "$SCRIPT_DIR/db"
|
sudo chmod 755 "$SCRIPT_DIR/db"
|
||||||
|
|
||||||
# 设置所有权
|
|
||||||
if [[ "$(id -u)" -ne 0 ]]; then
|
if [[ "$(id -u)" -ne 0 ]]; then
|
||||||
sudo chown -R "$(id -u):$(id -g)" "$SCRIPT_DIR"
|
sudo chown -R "$(id -u):$(id -g)" "$SCRIPT_DIR"
|
||||||
fi
|
fi
|
||||||
@@ -152,7 +137,6 @@ setup_fixed_key() {
|
|||||||
|
|
||||||
log_info "设置固定客户端密钥..."
|
log_info "设置固定客户端密钥..."
|
||||||
|
|
||||||
# 备份现有密钥
|
|
||||||
if [[ -f "$server_dir/id_ed25519" || -f "$server_dir/id_ed25519.pub" ]]; then
|
if [[ -f "$server_dir/id_ed25519" || -f "$server_dir/id_ed25519.pub" ]]; then
|
||||||
local backup_dir="$SCRIPT_DIR/backup_$(date +%Y%m%d_%H%M%S)"
|
local backup_dir="$SCRIPT_DIR/backup_$(date +%Y%m%d_%H%M%S)"
|
||||||
mkdir -p "$backup_dir"
|
mkdir -p "$backup_dir"
|
||||||
@@ -161,20 +145,14 @@ setup_fixed_key() {
|
|||||||
log_info "旧密钥备份到: $backup_dir"
|
log_info "旧密钥备份到: $backup_dir"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 清理旧密钥
|
|
||||||
rm -f "$server_dir/id_ed25519" "$server_dir/id_ed25519.pub"
|
rm -f "$server_dir/id_ed25519" "$server_dir/id_ed25519.pub"
|
||||||
|
|
||||||
# 写入固定公钥
|
|
||||||
echo "$FIXED_KEY_PUB" > "$server_dir/id_ed25519.pub"
|
echo "$FIXED_KEY_PUB" > "$server_dir/id_ed25519.pub"
|
||||||
|
|
||||||
# 创建空的私钥文件
|
|
||||||
touch "$server_dir/id_ed25519"
|
touch "$server_dir/id_ed25519"
|
||||||
|
|
||||||
# 设置文件权限
|
|
||||||
chmod 644 "$server_dir/id_ed25519.pub"
|
chmod 644 "$server_dir/id_ed25519.pub"
|
||||||
chmod 600 "$server_dir/id_ed25519"
|
chmod 600 "$server_dir/id_ed25519"
|
||||||
|
|
||||||
# 验证密钥文件
|
|
||||||
if [[ -f "$server_dir/id_ed25519.pub" ]]; then
|
if [[ -f "$server_dir/id_ed25519.pub" ]]; then
|
||||||
local saved_key=$(cat "$server_dir/id_ed25519.pub")
|
local saved_key=$(cat "$server_dir/id_ed25519.pub")
|
||||||
if [[ "$saved_key" == "$FIXED_KEY_PUB" ]]; then
|
if [[ "$saved_key" == "$FIXED_KEY_PUB" ]]; then
|
||||||
@@ -200,13 +178,11 @@ generate_password() {
|
|||||||
get_ip_address() {
|
get_ip_address() {
|
||||||
local local_ip public_ip
|
local local_ip public_ip
|
||||||
|
|
||||||
# 获取本地IP
|
|
||||||
local_ip=$(hostname -I | awk '{print $1}' | head -1)
|
local_ip=$(hostname -I | awk '{print $1}' | head -1)
|
||||||
if [[ -z "$local_ip" ]]; then
|
if [[ -z "$local_ip" ]]; then
|
||||||
local_ip="127.0.0.1"
|
local_ip="127.0.0.1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 获取公网IP(带超时)
|
|
||||||
public_ip=$(curl -s --connect-timeout 3 -m 5 ifconfig.me 2>/dev/null || echo "无法获取")
|
public_ip=$(curl -s --connect-timeout 3 -m 5 ifconfig.me 2>/dev/null || echo "无法获取")
|
||||||
|
|
||||||
echo "$local_ip" "$public_ip"
|
echo "$local_ip" "$public_ip"
|
||||||
@@ -220,15 +196,15 @@ validate_input() {
|
|||||||
case $type in
|
case $type in
|
||||||
"project_name")
|
"project_name")
|
||||||
[[ "$value" =~ ^[a-zA-Z0-9_-]+$ ]] && return 0
|
[[ "$value" =~ ^[a-zA-Z0-9_-]+$ ]] && return 0
|
||||||
echo_error "项目名称只能包含字母、数字、连字符和下划线"
|
echo "错误: 项目名称只能包含字母、数字、连字符和下划线"
|
||||||
;;
|
;;
|
||||||
"port")
|
"port")
|
||||||
[[ "$value" =~ ^[0-9]+$ ]] && [[ "$value" -ge 1024 && "$value" -le 65535 ]] && return 0
|
[[ "$value" =~ ^[0-9]+$ ]] && [[ "$value" -ge 1024 && "$value" -le 65535 ]] && return 0
|
||||||
echo_error "端口号必须是 1024-65535 之间的数字"
|
echo "错误: 端口号必须是 1024-65535 之间的数字"
|
||||||
;;
|
;;
|
||||||
"password")
|
"password")
|
||||||
[[ -n "$value" && ${#value} -ge 8 ]] && return 0
|
[[ -n "$value" && ${#value} -ge 8 ]] && return 0
|
||||||
echo_error "密码不能为空且至少 8 位"
|
echo "错误: 密码不能为空且至少 8 位"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
return 1
|
return 1
|
||||||
@@ -241,7 +217,6 @@ get_user_input() {
|
|||||||
local default_hbbs_port="21116"
|
local default_hbbs_port="21116"
|
||||||
local default_hbbr_port="21117"
|
local default_hbbr_port="21117"
|
||||||
|
|
||||||
# 读取项目名称
|
|
||||||
while true; do
|
while true; do
|
||||||
read -p "请输入项目名称(默认: $default_project): " input_project
|
read -p "请输入项目名称(默认: $default_project): " input_project
|
||||||
project_name=$(echo "$input_project" | xargs)
|
project_name=$(echo "$input_project" | xargs)
|
||||||
@@ -252,7 +227,6 @@ get_user_input() {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# 读取端口配置
|
|
||||||
local ports=("api_port" "hbbs_port" "hbbr_port")
|
local ports=("api_port" "hbbs_port" "hbbr_port")
|
||||||
local defaults=("$default_api_port" "$default_hbbs_port" "$default_hbbr_port")
|
local defaults=("$default_api_port" "$default_hbbs_port" "$default_hbbr_port")
|
||||||
local descriptions=("API服务端口" "ID服务器端口" "中继服务器端口")
|
local descriptions=("API服务端口" "ID服务器端口" "中继服务器端口")
|
||||||
@@ -268,7 +242,7 @@ get_user_input() {
|
|||||||
declare -g "${ports[i]}=$port_val"
|
declare -g "${ports[i]}=$port_val"
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
echo_warning "端口 $port_val 已被占用"
|
echo "警告: 端口 $port_val 已被占用"
|
||||||
read -p "是否强制使用此端口?(y/N): " use_occupied_port
|
read -p "是否强制使用此端口?(y/N): " use_occupied_port
|
||||||
if [[ "$use_occupied_port" =~ ^[Yy]$ ]]; then
|
if [[ "$use_occupied_port" =~ ^[Yy]$ ]]; then
|
||||||
declare -g "${ports[i]}=$port_val"
|
declare -g "${ports[i]}=$port_val"
|
||||||
@@ -279,7 +253,6 @@ get_user_input() {
|
|||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
|
||||||
# 密码处理
|
|
||||||
read -p "是否生成随机管理员密码?(y/N): " use_random_pwd
|
read -p "是否生成随机管理员密码?(y/N): " use_random_pwd
|
||||||
if [[ "$use_random_pwd" =~ ^[Yy]$ ]]; then
|
if [[ "$use_random_pwd" =~ ^[Yy]$ ]]; then
|
||||||
admin_password=$(generate_password)
|
admin_password=$(generate_password)
|
||||||
@@ -295,12 +268,11 @@ get_user_input() {
|
|||||||
admin_password="$password1"
|
admin_password="$password1"
|
||||||
break
|
break
|
||||||
elif [[ "$password1" != "$password2" ]]; then
|
elif [[ "$password1" != "$password2" ]]; then
|
||||||
echo_error "两次输入的密码不一致"
|
echo "错误: 两次输入的密码不一致"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 显示配置摘要
|
|
||||||
local ip_info=($(get_ip_address))
|
local ip_info=($(get_ip_address))
|
||||||
local local_ip="${ip_info[0]}"
|
local local_ip="${ip_info[0]}"
|
||||||
local public_ip="${ip_info[1]}"
|
local public_ip="${ip_info[1]}"
|
||||||
@@ -332,7 +304,6 @@ generate_compose_file() {
|
|||||||
local ip_info=($(get_ip_address))
|
local ip_info=($(get_ip_address))
|
||||||
local local_ip="${ip_info[0]}"
|
local local_ip="${ip_info[0]}"
|
||||||
|
|
||||||
# 生成 JWT 密钥
|
|
||||||
local jwt_key=$(openssl rand -base64 32 2>/dev/null ||
|
local jwt_key=$(openssl rand -base64 32 2>/dev/null ||
|
||||||
echo "fallback_jwt_key_$(date +%s)")
|
echo "fallback_jwt_key_$(date +%s)")
|
||||||
|
|
||||||
@@ -403,7 +374,7 @@ EOF
|
|||||||
log_success "Docker Compose 配置文件已生成: $file_path"
|
log_success "Docker Compose 配置文件已生成: $file_path"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 部署服务
|
# 部署服务(修复版)
|
||||||
deploy_service() {
|
deploy_service() {
|
||||||
local project_name="$1" admin_password="$2"
|
local project_name="$1" admin_password="$2"
|
||||||
local compose_cmd="$3"
|
local compose_cmd="$3"
|
||||||
@@ -419,13 +390,13 @@ deploy_service() {
|
|||||||
# 停止现有服务
|
# 停止现有服务
|
||||||
if docker ps -a --filter "name=${project_name}-rustdesk" | grep -q "${project_name}-rustdesk"; then
|
if docker ps -a --filter "name=${project_name}-rustdesk" | grep -q "${project_name}-rustdesk"; then
|
||||||
log_info "停止现有服务..."
|
log_info "停止现有服务..."
|
||||||
$compose_cmd -f "$file_path" down || true
|
eval "$compose_cmd -f \"$file_path\" down" || true
|
||||||
sleep 5
|
sleep 5
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 启动服务
|
# 启动服务
|
||||||
log_info "启动服务..."
|
log_info "启动服务..."
|
||||||
if ! $compose_cmd -f "$file_path" up -d; then
|
if ! eval "$compose_cmd -f \"$file_path\" up -d"; then
|
||||||
log_error "服务启动失败"
|
log_error "服务启动失败"
|
||||||
log_info "尝试查看 Docker 日志..."
|
log_info "尝试查看 Docker 日志..."
|
||||||
docker logs "${project_name}-rustdesk" 2>/dev/null | tail -20 || true
|
docker logs "${project_name}-rustdesk" 2>/dev/null | tail -20 || true
|
||||||
@@ -433,7 +404,7 @@ deploy_service() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# 等待服务启动
|
# 等待服务启动
|
||||||
sleep 10
|
sleep 15
|
||||||
|
|
||||||
# 设置管理员密码
|
# 设置管理员密码
|
||||||
log_info "设置管理员密码..."
|
log_info "设置管理员密码..."
|
||||||
@@ -451,7 +422,7 @@ deploy_service() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# 显示部署信息(简化版,避免颜色问题)
|
# 显示部署信息
|
||||||
show_deployment_info() {
|
show_deployment_info() {
|
||||||
local project_name="$1" api_port="$2" hbbs_port="$3" hbbr_port="$4"
|
local project_name="$1" api_port="$2" hbbs_port="$3" hbbr_port="$4"
|
||||||
local admin_password="$5"
|
local admin_password="$5"
|
||||||
@@ -497,8 +468,8 @@ show_deployment_info() {
|
|||||||
echo "=== 管理命令 ==="
|
echo "=== 管理命令 ==="
|
||||||
echo "查看服务状态: docker ps -f name=${project_name}"
|
echo "查看服务状态: docker ps -f name=${project_name}"
|
||||||
echo "查看服务日志: docker logs ${project_name}-rustdesk"
|
echo "查看服务日志: docker logs ${project_name}-rustdesk"
|
||||||
echo "停止服务: cd $SCRIPT_DIR && docker compose down"
|
echo "停止服务: cd $SCRIPT_DIR && $compose_cmd down"
|
||||||
echo "重启服务: cd $SCRIPT_DIR && docker compose restart"
|
echo "重启服务: cd $SCRIPT_DIR && $compose_cmd restart"
|
||||||
echo
|
echo
|
||||||
echo "=== 重要提示 ==="
|
echo "=== 重要提示 ==="
|
||||||
echo "请确保防火墙已开放以下端口:"
|
echo "请确保防火墙已开放以下端口:"
|
||||||
@@ -520,8 +491,8 @@ main() {
|
|||||||
echo "========================================"
|
echo "========================================"
|
||||||
|
|
||||||
# 检查依赖
|
# 检查依赖
|
||||||
local compose_cmd
|
|
||||||
compose_cmd=$(check_docker)
|
compose_cmd=$(check_docker)
|
||||||
|
log_info "使用命令: $compose_cmd"
|
||||||
|
|
||||||
# 初始化环境
|
# 初始化环境
|
||||||
create_directories
|
create_directories
|
||||||
|
|||||||
Reference in New Issue
Block a user