From 5d03d9a221a96f1b36fed06eaea4effe1b83831e Mon Sep 17 00:00:00 2001 From: jingrow Date: Mon, 11 Aug 2025 17:50:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0npm=EF=BC=8Cnvm=E5=A4=9A?= =?UTF-8?q?=E9=95=9C=E5=83=8F=E6=BA=90=E6=94=AF=E6=8C=81=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=85=88=E4=BD=BF=E7=94=A8=E5=9B=BD=E5=86=85=E9=95=9C=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jsite.sh | 290 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 252 insertions(+), 38 deletions(-) diff --git a/jsite.sh b/jsite.sh index 020ac4e..b42a592 100644 --- a/jsite.sh +++ b/jsite.sh @@ -253,6 +253,99 @@ export DEBCONF_NONINTERACTIVE_SEEN=true export UCF_FORCE_CONFNEW=1 export UCF_FORCE_CONFOLD=1 +# 网络连通性检测 +check_network_connectivity() { + 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" + ) + + local network_ok=false + 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" + network_ok=true + break + else + log_warning "网络连接失败: $url" + fi + done + + if [ "$network_ok" = false ]; then + log_error "所有网络连接测试都失败,请检查网络配置" + return 1 + fi + + log_success "网络连通性检测完成" +} + +# 配置APT使用国内镜像源,提高下载速度 +configure_apt_mirrors() { + log_info "配置APT使用国内镜像源..." + + # 备份原始源列表 + if [ ! -f /etc/apt/sources.list.backup ]; then + cp /etc/apt/sources.list /etc/apt/sources.list.backup + log_info "已备份原始APT源列表" + fi + + # 检测系统版本 + local codename=$(lsb_release -cs 2>/dev/null || echo "jammy") + + # 创建新的源列表,使用多个国内镜像源(按优先级排序) + cat > /etc/apt/sources.list << EOF +# 1. 阿里云镜像源(国内最快) +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 +EOF + + log_success "APT镜像源配置完成" +} + # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" @@ -347,8 +440,34 @@ install_nodejs() { # 下载并安装nvm if [ ! -d "/home/jingrow/.nvm" ]; then log_info "下载并安装nvm..." - su - jingrow -c "curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash" - log_success "nvm安装完成" + + # 尝试多个NVM下载源,按优先级排序(国内镜像优先) + 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" + ) + + 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 + log_success "nvm安装完成 (来源: $nvm_source)" + nvm_install_success=true + break + else + log_warning "从 $nvm_source 下载失败,尝试下一个源..." + fi + done + + if [ "$nvm_install_success" = false ]; then + log_error "所有NVM下载源都失败,请检查网络连接" + return 1 + fi else log_warning "nvm已存在" fi @@ -363,6 +482,33 @@ install_nodejs() { nvm alias default $NODE_VERSION " + # 配置npm使用国内镜像源,按优先级排序 + log_info "配置npm使用国内镜像源..." + su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + + # 1. 淘宝NPM镜像(国内最快) + npm config set registry https://registry.npmmirror.com + + # 2. 阿里云NPM镜像(备用) + npm config set registry https://registry.npm.alibaba-inc.com + + # 3. 腾讯云NPM镜像(备用) + npm config set registry https://mirrors.cloud.tencent.com/npm/ + + # 4. 华为云NPM镜像(备用) + npm config set registry https://mirrors.huaweicloud.com/repository/npm/ + + # 5. 中科大NPM镜像(备用) + npm config set registry https://registry.npm.ustc.edu.cn/ + + # 最终使用淘宝镜像(最快) + npm config set registry https://registry.npmmirror.com + + echo 'npm镜像源配置完成(已配置5个备用源)' + " + # 验证安装 NODE_VERSION_OUTPUT=$(su - jingrow -c 'export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && node -v') NPM_VERSION=$(su - jingrow -c 'export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && npm -v') @@ -371,6 +517,56 @@ install_nodejs() { log_success "npm版本: $NPM_VERSION" } +# 智能NPM安装函数(支持多镜像源回退) +smart_npm_install() { + local package="$1" + local install_dir="$2" + local is_global="${3:-false}" + + local npm_registries=( + "https://registry.npmmirror.com" # 1. 淘宝NPM镜像(国内最快) + "https://registry.npm.alibaba-inc.com" # 2. 阿里云NPM镜像(备用) + "https://mirrors.cloud.tencent.com/npm/" # 3. 腾讯云NPM镜像(备用) + "https://mirrors.huaweicloud.com/repository/npm/" # 4. 华为云NPM镜像(备用) + "https://registry.npm.ustc.edu.cn/" # 5. 中科大NPM镜像(备用) + ) + + local install_success=false + for registry in "${npm_registries[@]}"; do + log_info "尝试从 $registry 安装 $package..." + + local install_cmd="" + if [ "$is_global" = "true" ]; then + install_cmd="npm install -g $package --registry=$registry" + else + if [ -n "$install_dir" ]; then + install_cmd="cd '$install_dir' && npm install --registry=$registry" + else + install_cmd="npm install --registry=$registry" + fi + fi + + if su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + $install_cmd + "; then + log_success "$package 安装成功 (来源: $registry)" + install_success=true + break + else + log_warning "从 $registry 安装失败,尝试下一个源..." + fi + done + + if [ "$install_success" = false ]; then + log_error "所有NPM镜像源都失败,无法安装 $package" + return 1 + fi + + return 0 +} + # 2.5. 安装PM2 install_pm2() { log_info "开始安装PM2..." @@ -400,12 +596,7 @@ install_pm2() { log_warning "PM2已安装,版本: $PM2_VERSION" else log_info "安装PM2..." - su - jingrow -c " - export NVM_DIR=\"\$HOME/.nvm\" - [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - npm install -g pm2 - " - if [ $? -ne 0 ]; then + if ! smart_npm_install "pm2" "" "true"; then log_error "PM2安装失败" return 1 fi @@ -673,8 +864,15 @@ clone_jsite_project() { if [ "$FORCE_UPDATE" = true ]; then log_warning "项目目录已存在,强制更新..." rm -rf "/home/jingrow/jsite/$SITE_NAME" - cd /home/jingrow/jsite - su - jingrow -c "cd /home/jingrow/jsite && git clone $GIT_REPO $SITE_NAME" + cd /home/jingrow/jsite + # 配置Git使用更快的协议和超时设置 + su - jingrow -c " + git config --global http.lowSpeedLimit 0 + git config --global http.lowSpeedTime 999999 + git config --global http.postBuffer 524288000 + git config --global core.compression 9 + cd /home/jingrow/jsite && git clone --depth 1 $GIT_REPO $SITE_NAME + " if [ $? -ne 0 ]; then log_error "项目克隆失败: $GIT_REPO" return 1 @@ -686,7 +884,14 @@ clone_jsite_project() { else cd /home/jingrow/jsite log_info "克隆项目: $GIT_REPO" - su - jingrow -c "cd /home/jingrow/jsite && git clone $GIT_REPO $SITE_NAME" + # 配置Git使用更快的协议和超时设置 + su - jingrow -c " + git config --global http.lowSpeedLimit 0 + git config --global http.lowSpeedTime 999999 + git config --global http.postBuffer 524288000 + git config --global core.compression 9 + cd /home/jingrow/jsite && git clone --depth 1 $GIT_REPO $SITE_NAME + " if [ $? -ne 0 ]; then log_error "项目克隆失败: $GIT_REPO" return 1 @@ -1085,7 +1290,13 @@ install_traefik() { fi # 从Git仓库克隆traefik配置 - su - jingrow -c "cd /home/jingrow && git clone http://git.jingrow.com:3000/go/traefik-docker" + su - jingrow -c " + git config --global http.lowSpeedLimit 0 + git config --global http.lowSpeedTime 999999 + git config --global http.postBuffer 524288000 + git config --global core.compression 9 + cd /home/jingrow && git clone --depth 1 http://git.jingrow.com:3000/go/traefik-docker + " log_success "traefik项目克隆完成" # 设置目录权限 @@ -1121,7 +1332,7 @@ install_docker() { # 安装必要的包(避免交互式配置) apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release - # 选择可用的 Docker APT 仓库与 GPG 地址(带回退) + # 选择可用的 Docker APT 仓库与 GPG 地址(按优先级排序,国内镜像优先) local arch=$(dpkg --print-architecture) local codename=$(lsb_release -cs) local mirror_candidates=( @@ -1180,14 +1391,15 @@ install_docker() { # 创建Docker配置目录 mkdir -p /etc/docker - # 创建或更新daemon.json配置文件 + # 创建或更新daemon.json配置文件(按优先级排序,国内镜像优先) cat > /etc/docker/daemon.json << EOF { "registry-mirrors": [ "https://k487mmwn.mirror.aliyuncs.com", "https://mirror.ccs.tencentyun.com", "https://docker.mirrors.ustc.edu.cn", - "https://hub-mirror.c.163.com" + "https://hub-mirror.c.163.com", + "https://mirrors.tuna.tsinghua.edu.cn" ] } EOF @@ -1291,14 +1503,7 @@ install_project_dependencies() { return 1 fi - su - jingrow -c " - export NVM_DIR=\"\$HOME/.nvm\" - [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - cd /home/jingrow/jsite/$SITE_NAME - npm install - " - - if [ $? -ne 0 ]; then + if ! smart_npm_install "" "/home/jingrow/jsite/$SITE_NAME"; then log_error "项目依赖安装失败" return 1 fi @@ -1325,7 +1530,8 @@ install_project_dependencies() { [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" export NODE_OPTIONS=\"--max-old-space-size=$build_memory_mb\" cd /home/jingrow/jsite/$SITE_NAME - npm run build + # 使用国内镜像源构建项目,提高下载速度 + npm run build --registry=https://registry.npmmirror.com " if [ $? -ne 0 ]; then @@ -1529,7 +1735,13 @@ create_site() { # 克隆项目 log_info "克隆项目: $GIT_REPO" - if ! su - "jingrow" -c "cd '$JSITE_BASE_DIR' && git clone '$GIT_REPO' '$SITE_NAME'"; then + if ! su - "jingrow" -c " + git config --global http.lowSpeedLimit 0 + git config --global http.lowSpeedTime 999999 + git config --global http.postBuffer 524288000 + git config --global core.compression 9 + cd '$JSITE_BASE_DIR' && git clone --depth 1 '$GIT_REPO' '$SITE_NAME' + "; then log_error "项目克隆失败" return 1 fi @@ -1583,7 +1795,13 @@ create_and_start_site() { # 克隆项目 log_info "克隆项目: $GIT_REPO" - if ! su - jingrow -c "cd '$JSITE_BASE_DIR' && git clone '$GIT_REPO' '$SITE_NAME'"; then + if ! su - jingrow -c " + git config --global http.lowSpeedLimit 0 + git config --global http.lowSpeedTime 999999 + git config --global http.postBuffer 524288000 + git config --global core.compression 9 + cd '$JSITE_BASE_DIR' && git clone --depth 1 '$GIT_REPO' '$SITE_NAME' + "; then log_error "项目克隆失败" return 1 fi @@ -1611,12 +1829,7 @@ create_and_start_site() { # 安装项目依赖 log_info "安装项目依赖..." - if ! su - jingrow -c " - export NVM_DIR=\"\$HOME/.nvm\" - [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - cd '$JSITE_BASE_DIR/$SITE_NAME' - npm install - "; then + if ! smart_npm_install "" "$JSITE_BASE_DIR/$SITE_NAME"; then log_error "依赖安装失败" return 1 fi @@ -1753,12 +1966,7 @@ build_site() { # 安装依赖 log_info "安装依赖..." - if ! su - "jingrow" -c " - export NVM_DIR=\"\$HOME/.nvm\" - [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - cd '$JSITE_BASE_DIR/$SITE_NAME' - npm install - "; then + if ! smart_npm_install "" "$JSITE_BASE_DIR/$SITE_NAME"; then log_error "依赖安装失败" return 1 fi @@ -1930,6 +2138,12 @@ main() { create_jingrow_user check_jsite_base_dir + # 检测网络连通性 + check_network_connectivity + + # 配置APT镜像源,提高下载速度 + configure_apt_mirrors + # 根据mode执行不同的任务 case "$MODE" in "deploy")