优化网络检测并自动选择速度最快的APT镜像源

This commit is contained in:
jingrow 2025-08-15 20:24:21 +08:00
parent dae130cf46
commit c6d3b456d9

241
jsite.sh
View File

@ -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
}