From c6d3b456d948338c08560c7fc1e1cefbe60ae1b3 Mon Sep 17 00:00:00 2001 From: jingrow Date: Fri, 15 Aug 2025 20:24:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BD=91=E7=BB=9C=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E5=B9=B6=E8=87=AA=E5=8A=A8=E9=80=89=E6=8B=A9=E9=80=9F?= =?UTF-8?q?=E5=BA=A6=E6=9C=80=E5=BF=AB=E7=9A=84APT=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jsite.sh | 241 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 166 insertions(+), 75 deletions(-) diff --git a/jsite.sh b/jsite.sh index 4f9cd0d..9fd5c0f 100644 --- a/jsite.sh +++ b/jsite.sh @@ -264,25 +264,44 @@ export DEBCONF_NONINTERACTIVE_SEEN=true export UCF_FORCE_CONFNEW=1 export UCF_FORCE_CONFOLD=1 -# 网络连通性检测 +# 优化curl配置,提高下载速度和稳定性 +export CURL_CONNECT_TIMEOUT=5 +export CURL_MAX_TIME=30 +export CURL_RETRY=2 +export CURL_RETRY_DELAY=1 + +# 网络连通性检测和最佳镜像源选择 check_network_connectivity() { - log_info "检测网络连通性..." + log_info "检测网络连通性并选择最佳镜像源..." local test_urls=( "https://mirrors.aliyun.com" "https://registry.npmmirror.com" "https://gitee.com" "https://mirrors.ustc.edu.cn" - "https://raw.githubusercontent.com" + "https://mirrors.tuna.tsinghua.edu.cn" + "https://mirrors.cloud.tencent.com" + "https://mirrors.huaweicloud.com" ) local network_ok=false + local best_mirror="" + local fastest_time=999 + for url in "${test_urls[@]}"; do - log_info "测试连接: $url" - if curl -fsSL --connect-timeout 5 --max-time 10 "$url" >/dev/null 2>&1; then - log_success "网络连接正常: $url" + log_info "测试连接速度: $url" + local start_time=$(date +%s%N) + if curl -fsSL --connect-timeout 3 --max-time 8 "$url" >/dev/null 2>&1; then + local end_time=$(date +%s%N) + local response_time=$(( (end_time - start_time) / 1000000 )) + log_success "网络连接正常: $url (响应时间: ${response_time}ms)" + + if [ $response_time -lt $fastest_time ]; then + fastest_time=$response_time + best_mirror="$url" + fi + network_ok=true - break else log_warning "网络连接失败: $url" fi @@ -293,6 +312,12 @@ check_network_connectivity() { return 1 fi + # 设置全局最佳镜像源 + if [ -n "$best_mirror" ]; then + export BEST_MIRROR="$best_mirror" + log_success "选择最佳镜像源: $best_mirror (响应时间: ${fastest_time}ms)" + fi + log_success "网络连通性检测完成" } @@ -309,52 +334,46 @@ configure_apt_mirrors() { # 检测系统版本 local codename=$(lsb_release -cs 2>/dev/null || echo "jammy") - # 创建新的源列表,使用多个国内镜像源(按优先级排序) + # 根据网络检测结果选择最佳镜像源 + local primary_mirror="https://mirrors.aliyun.com" + if [ -n "$BEST_MIRROR" ]; then + case "$BEST_MIRROR" in + *"aliyun"*) primary_mirror="https://mirrors.aliyun.com" ;; + *"npmmirror"*) primary_mirror="https://mirrors.aliyun.com" ;; + *"tencent"*) primary_mirror="https://mirrors.cloud.tencent.com" ;; + *"huawei"*) primary_mirror="https://mirrors.huaweicloud.com" ;; + *"ustc"*) primary_mirror="https://mirrors.ustc.edu.cn" ;; + *"tuna"*) primary_mirror="https://mirrors.tuna.tsinghua.edu.cn" ;; + *) primary_mirror="https://mirrors.aliyun.com" ;; + esac + log_info "根据网络检测结果选择APT主镜像源: $primary_mirror" + fi + + # 创建新的源列表,使用最佳镜像源作为主要源 cat > /etc/apt/sources.list << EOF -# 1. 阿里云镜像源(国内最快) +# 主要镜像源(根据网络检测结果选择) +deb $primary_mirror/ubuntu/ ${codename} main restricted universe multiverse +deb $primary_mirror/ubuntu/ ${codename}-security main restricted universe multiverse +deb $primary_mirror/ubuntu/ ${codename}-updates main restricted universe multiverse +deb $primary_mirror/ubuntu/ ${codename}-proposed main restricted universe multiverse +deb $primary_mirror/ubuntu/ ${codename}-backports main restricted universe multiverse + +# 备用镜像源(按速度排序) deb https://mirrors.aliyun.com/ubuntu/ ${codename} main restricted universe multiverse -deb https://mirrors.aliyun.com/ubuntu/ ${codename}-security main restricted universe multiverse -deb https://mirrors.aliyun.com/ubuntu/ ${codename}-updates main restricted universe multiverse -deb https://mirrors.aliyun.com/ubuntu/ ${codename}-proposed main restricted universe multiverse -deb https://mirrors.aliyun.com/ubuntu/ ${codename}-backports main restricted universe multiverse - -# 2. 腾讯云镜像源(备用) deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename} main restricted universe multiverse -deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename}-security main restricted universe multiverse -deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename}-updates main restricted universe multiverse -deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename}-proposed main restricted universe multiverse -deb https://mirrors.cloud.tencent.com/ubuntu/ ${codename}-backports main restricted universe multiverse - -# 3. 华为云镜像源(备用) deb https://mirrors.huaweicloud.com/ubuntu/ ${codename} main restricted universe multiverse -deb https://mirrors.huaweicloud.com/ubuntu/ ${codename}-security main restricted universe multiverse -deb https://mirrors.huaweicloud.com/ubuntu/ ${codename}-updates main restricted universe multiverse -deb https://mirrors.huaweicloud.com/ubuntu/ ${codename}-proposed main restricted universe multiverse -deb https://mirrors.huaweicloud.com/ubuntu/ ${codename}-backports main restricted universe multiverse - -# 4. 中科大镜像源(备用) deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename} main restricted universe multiverse -deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename}-security main restricted universe multiverse -deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename}-updates main restricted universe multiverse -deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename}-proposed main restricted universe multiverse -deb https://mirrors.ustc.edu.cn/ubuntu/ ${codename}-backports main restricted universe multiverse - -# 5. 清华大学镜像源(备用) deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename} main restricted universe multiverse -deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-security main restricted universe multiverse -deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-updates main restricted universe multiverse -deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-proposed main restricted universe multiverse -deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${codename}-backports main restricted universe multiverse -# 源码镜像源(使用阿里云,速度最快) -deb-src https://mirrors.aliyun.com/ubuntu/ ${codename} main restricted universe multiverse -deb-src https://mirrors.aliyun.com/ubuntu/ ${codename}-security main restricted universe multiverse -deb-src https://mirrors.aliyun.com/ubuntu/ ${codename}-updates main restricted universe multiverse -deb-src https://mirrors.aliyun.com/ubuntu/ ${codename}-proposed main restricted universe multiverse -deb-src https://mirrors.aliyun.com/ubuntu/ ${codename}-backports main restricted universe multiverse +# 源码镜像源 +deb-src $primary_mirror/ubuntu/ ${codename} main restricted universe multiverse +deb-src $primary_mirror/ubuntu/ ${codename}-security main restricted universe multiverse +deb-src $primary_mirror/ubuntu/ ${codename}-updates main restricted universe multiverse +deb-src $primary_mirror/ubuntu/ ${codename}-proposed main restricted universe multiverse +deb-src $primary_mirror/ubuntu/ ${codename}-backports main restricted universe multiverse EOF - log_success "APT镜像源配置完成" + log_success "APT镜像源配置完成 (主镜像源: $primary_mirror)" } # 日志函数 @@ -452,21 +471,21 @@ install_nodejs() { if [ ! -d "/home/jingrow/.nvm" ]; then log_info "下载并安装nvm..." - # 尝试多个NVM下载源,按优先级排序(国内镜像优先) + # 使用更快的国内镜像源,避免GitHub连接问题 local nvm_install_success=false local nvm_sources=( "https://gitee.com/mirrors/nvm/raw/v0.40.3/install.sh" - "https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.3/install.sh" "https://npmmirror.com/mirrors/nvm/v0.40.3/install.sh" "https://mirrors.ustc.edu.cn/nvm/v0.40.3/install.sh" - "https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh" + "https://mirrors.tuna.tsinghua.edu.cn/nvm/v0.40.3/install.sh" + "https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.3/install.sh" ) for nvm_source in "${nvm_sources[@]}"; do log_info "尝试从 $nvm_source 下载nvm..." - # 设置较短的超时时间,避免长时间等待 - if su - jingrow -c "curl -fsSL --connect-timeout 10 --max-time 60 '$nvm_source' | bash"; then + # 使用更短的超时时间和更快的下载设置 + if su - jingrow -c "curl -fsSL --connect-timeout 5 --max-time 30 --retry 2 --retry-delay 1 '$nvm_source' | bash"; then log_success "nvm安装完成 (来源: $nvm_source)" nvm_install_success=true break @@ -476,7 +495,39 @@ install_nodejs() { done if [ "$nvm_install_success" = false ]; then - log_error "所有NVM下载源都失败,请检查网络连接" + log_error "所有NVM下载源都失败,尝试使用离线安装方式..." + + # 离线安装方式:直接下载nvm压缩包 + log_info "尝试离线安装方式..." + local offline_sources=( + "https://gitee.com/mirrors/nvm/archive/v0.40.3.tar.gz" + "https://npmmirror.com/mirrors/nvm/v0.40.3/nvm-0.40.3.tar.gz" + ) + + for offline_source in "${offline_sources[@]}"; do + log_info "尝试下载nvm压缩包: $offline_source" + if su - jingrow -c " + cd /tmp + curl -fsSL --connect-timeout 5 --max-time 30 --retry 2 '$offline_source' -o nvm.tar.gz + "; then + log_info "nvm压缩包下载成功,开始解压安装..." + if su - jingrow -c " + cd /tmp + tar -xzf nvm.tar.gz + mv nvm-0.40.3 /home/jingrow/.nvm + chown -R jingrow:jingrow /home/jingrow/.nvm + rm -f nvm.tar.gz + "; then + log_success "nvm离线安装完成" + nvm_install_success=true + break + fi + fi + done + fi + + if [ "$nvm_install_success" = false ]; then + log_error "所有NVM安装方式都失败,请检查网络连接或手动安装" return 1 fi else @@ -485,14 +536,55 @@ install_nodejs() { # 加载nvm并安装node.js log_info "安装Node.js v$NODE_VERSION..." + + # 配置nvm使用国内镜像源,提高下载速度 + log_info "配置nvm使用国内镜像源..." su - jingrow -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - nvm install $NODE_VERSION - nvm use $NODE_VERSION - nvm alias default $NODE_VERSION + + # 设置nvm使用国内镜像源 + export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ + export NVM_IOJS_ORG_MIRROR=https://npmmirror.com/mirrors/iojs/ + + # 显示配置信息 + echo 'NVM镜像源配置:' + echo ' Node.js: \$NVM_NODEJS_ORG_MIRROR' + echo ' io.js: \$NVM_IOJS_ORG_MIRROR' " + log_info "开始下载和安装Node.js v$NODE_VERSION (这可能需要几分钟)..." + if su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + + # 设置nvm使用国内镜像源 + export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ + export NVM_IOJS_ORG_MIRROR=https://npmmirror.com/mirrors/iojs/ + + # 安装Node.js,使用更快的下载设置 + nvm install $NODE_VERSION --latest-npm + "; then + log_success "Node.js v$NODE_VERSION 下载完成" + + log_info "配置Node.js环境..." + su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + nvm use $NODE_VERSION + nvm alias default $NODE_VERSION + + # 验证安装 + echo 'Node.js版本:' + node -v + echo 'npm版本:' + npm -v + " + else + log_error "Node.js安装失败" + return 1 + fi + # 配置npm使用国内镜像源,按优先级排序 log_info "配置npm使用国内镜像源..." su - jingrow -c " @@ -617,34 +709,33 @@ install_pm2() { # 设置PM2开机自启 log_info "配置PM2开机自启..." - # 获取PM2 startup命令的输出,避免交互式阻塞 - local startup_output=$(su - jingrow -c " + # 直接执行PM2 startup命令,创建systemd服务文件 + log_info "执行PM2 startup命令创建systemd服务..." + su - jingrow -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - pm2 startup 2>&1 - " 2>/dev/null) + pm2 startup systemd -u jingrow --hp /home/jingrow + " - # 检查是否成功生成systemd服务 - if echo "$startup_output" | grep -q "systemd"; then - log_success "PM2 systemd服务文件生成成功" + # 检查服务文件是否创建成功 + if [ -f "/etc/systemd/system/pm2-jingrow.service" ]; then + log_success "PM2 systemd服务文件创建成功" - # 提取systemd命令并执行(避免交互式提示) - local systemd_cmd=$(echo "$startup_output" | grep -E "sudo.*systemctl" | head -1) - if [ -n "$systemd_cmd" ]; then - log_info "执行systemd命令: $systemd_cmd" - # 移除sudo前缀,因为当前已经是root用户 - local clean_cmd=$(echo "$systemd_cmd" | sed 's/^sudo //') - if eval "$clean_cmd" 2>/dev/null; then - log_success "PM2 systemd服务启用成功" - else - log_warning "PM2 systemd服务启用失败,请手动执行: $systemd_cmd" - fi + # 启用systemd服务 + log_info "启用PM2 systemd服务..." + systemctl enable pm2-jingrow + if [ $? -eq 0 ]; then + log_success "PM2 systemd服务已启用" + else + log_warning "PM2 systemd服务启用失败" fi - elif echo "$startup_output" | grep -q "init.d"; then - log_success "PM2 init.d脚本生成成功" + + # 重新加载systemd配置 + systemctl daemon-reload + log_success "systemd配置已重新加载" else - log_warning "PM2开机启动配置可能失败,输出: $startup_output" - log_info "请手动执行: su - jingrow -c 'pm2 startup'" + log_warning "PM2 systemd服务文件创建失败" + log_info "请手动执行: su - jingrow -c 'pm2 startup systemd -u jingrow --hp /home/jingrow'" fi }