增加npm,nvm多镜像源支持,优先使用国内镜像

This commit is contained in:
jingrow 2025-08-11 17:50:25 +08:00
parent db030150c4
commit a04ce29be6

306
jsite.sh
View File

@ -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" # 1. 阿里云镜像(国内最快)
"https://registry.npmmirror.com" # 2. 淘宝NPM镜像备用
"https://gitee.com" # 3. Gitee代码托管备用
"https://mirrors.ustc.edu.cn" # 4. 中科大镜像(备用)
"https://raw.githubusercontent.com" # 5. GitHub原始源最后回退
)
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" # 1. Gitee镜像国内最快
"https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.3/install.sh" # 2. jsDelivr CDN国内较快
"https://npmmirror.com/mirrors/nvm/v0.40.3/install.sh" # 3. 淘宝NPM镜像
"https://mirrors.ustc.edu.cn/nvm/v0.40.3/install.sh" # 4. 中科大镜像
"https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh" # 5. GitHub原始源最后回退
)
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,15 +1332,15 @@ 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=(
"https://mirrors.aliyun.com/docker-ce"
"https://mirrors.ccs.tencentyun.com/docker-ce"
"https://mirrors.ustc.edu.cn/docker-ce"
"https://mirrors.tuna.tsinghua.edu.cn/docker-ce"
"https://download.docker.com"
"https://mirrors.aliyun.com/docker-ce" # 1. 阿里云镜像(国内最快)
"https://mirrors.ccs.tencentyun.com/docker-ce" # 2. 腾讯云镜像(备用)
"https://mirrors.ustc.edu.cn/docker-ce" # 3. 中科大镜像(备用)
"https://mirrors.tuna.tsinghua.edu.cn/docker-ce" # 4. 清华大学镜像(备用)
"https://download.docker.com" # 5. Docker官方源最后回退
)
local chosen_base=""
local chosen_gpg=""
@ -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://k487mmwn.mirror.aliyuncs.com", # 1. 阿里云镜像(国内最快)
"https://mirror.ccs.tencentyun.com", # 2. 腾讯云镜像(备用)
"https://docker.mirrors.ustc.edu.cn", # 3. 中科大镜像(备用)
"https://hub-mirror.c.163.com", # 4. 网易镜像(备用)
"https://mirrors.tuna.tsinghua.edu.cn" # 5. 清华大学镜像(备用)
]
}
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")