Files
yunrui_asset/install.sh
T

459 lines
12 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ============================================================================
# IDC设备管理系统 - Linux 安装引导脚本
# ============================================================================
#
# 功能:检测并安装 Node.js,然后运行 install.js
#
# 使用方法:
# 方式1 - 直接运行:
# chmod +x install.sh && ./install.sh
#
# 方式2 - 一键安装(推荐):
# curl -fsSL https://your-domain/install.sh | bash
#
# 方式3 - 从 GitHub
# curl -fsSL https://raw.githubusercontent.com/xxx/xxx/main/install.sh | bash
#
# ============================================================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
CYAN='\033[0;36m'
BRIGHT='\033[1m'
RESET='\033[0m'
# 日志函数
log_info() { echo -e "${CYAN}${RESET} $1"; }
log_success() { echo -e "${GREEN}${RESET} $1"; }
log_warning() { echo -e "${YELLOW}${RESET} $1"; }
log_error() { echo -e "${RED}${RESET} $1"; }
log_step() { echo -e "\n${BRIGHT}${CYAN}$1${RESET}"; }
log_divider() { echo -e "${YELLOW}$(printf '─%.0s' {1..60})${RESET}"; }
# 脚本版本
SCRIPT_VERSION="1.0.0"
MIN_NODE_VERSION=16
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 显示欢迎信息
show_banner() {
echo -e "
${BRIGHT}${CYAN}
╔══════════════════════════════════════════════════════════╗
║ IDC设备管理系统 - Linux 安装引导脚本 v${SCRIPT_VERSION}
║ Linux Bootstrap Installation Script ║
╚══════════════════════════════════════════════════════════╝
${RESET}"
}
# 检测 Linux 发行版
detect_distro() {
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "$ID"
elif [ -f /etc/redhat-release ]; then
echo "rhel"
else
echo "unknown"
fi
}
# 检查是否为 root 用户
is_root() {
[ "$(id -u)" -eq 0 ]
}
# 获取 sudo 前缀
get_sudo() {
if is_root; then
echo ""
else
echo "sudo"
fi
}
# 检查命令是否存在
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# 获取 Node.js 版本号
get_node_version() {
if command_exists node; then
node -e "console.log(process.versions.node.split('.')[0])"
else
echo "0"
fi
}
# 检查 Node.js 版本
check_node_version() {
local version=$(get_node_version)
[ "$version" -ge "$MIN_NODE_VERSION" ]
}
# 安装 Node.js - Ubuntu/Debian
install_node_debian() {
local sudo=$(get_sudo)
log_info "使用 NodeSource 安装 Node.js 20.x..."
# 安装 curl(如果没有)
if ! command_exists curl; then
log_info "安装 curl..."
$sudo apt-get update -qq
$sudo apt-get install -y -qq curl
fi
# 添加 NodeSource 源
log_info "添加 NodeSource 源..."
curl -fsSL https://deb.nodesource.com/setup_20.x | $sudo -E bash -
# 安装 Node.js
log_info "安装 Node.js..."
$sudo apt-get install -y -qq nodejs
# 验证安装
if command_exists node; then
log_success "Node.js $(node -v) 安装成功"
return 0
else
return 1
fi
}
# 安装 Node.js - CentOS/RHEL/Fedora
install_node_rhel() {
local sudo=$(get_sudo)
log_info "使用 NodeSource 安装 Node.js 20.x..."
# 安装 curl(如果没有)
if ! command_exists curl; then
log_info "安装 curl..."
$sudo yum install -y -q curl
fi
# 添加 NodeSource 源
log_info "添加 NodeSource 源..."
curl -fsSL https://rpm.nodesource.com/setup_20.x | $sudo bash -
# 安装 Node.js
log_info "安装 Node.js..."
$sudo yum install -y -q nodejs
# 验证安装
if command_exists node; then
log_success "Node.js $(node -v) 安装成功"
return 0
else
return 1
fi
}
# 安装 Node.js - Arch Linux
install_node_arch() {
local sudo=$(get_sudo)
log_info "使用 pacman 安装 Node.js..."
$sudo pacman -S --noconfirm nodejs npm
if command_exists node; then
log_success "Node.js $(node -v) 安装成功"
return 0
else
return 1
fi
}
# 安装 Node.js - 使用 nvm
install_node_nvm() {
log_info "使用 nvm 安装 Node.js..."
# 安装 nvm
if [ ! -d "$HOME/.nvm" ]; then
log_info "安装 nvm..."
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
fi
# 加载 nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# 安装 Node.js 20
log_info "安装 Node.js 20..."
nvm install 20
nvm use 20
nvm alias default 20
if command_exists node; then
log_success "Node.js $(node -v) 安装成功"
return 0
else
return 1
fi
}
# 自动安装 Node.js
auto_install_node() {
local distro=$(detect_distro)
log_step "自动安装 Node.js"
log_info "检测到 Linux 发行版: $distro"
case $distro in
ubuntu|debian)
install_node_debian
;;
centos|rhel|fedora|rocky|almalinux)
install_node_rhel
;;
arch|manjaro)
install_node_arch
;;
*)
log_warning "未知发行版,尝试使用 nvm 安装..."
install_node_nvm
;;
esac
}
# 显示手动安装指引
show_manual_install_guide() {
echo -e "
${BRIGHT}Node.js 手动安装指引:${RESET}
${YELLOW}Ubuntu/Debian:${RESET}
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
${YELLOW}CentOS/RHEL/Fedora:${RESET}
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo yum install -y nodejs
${YELLOW}Arch Linux:${RESET}
sudo pacman -S nodejs npm
${YELLOW}使用 nvm(推荐开发者):${RESET}
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20
${YELLOW}验证安装:${RESET}
node -v # 应显示 v20.x.x
npm -v # 应显示 10.x.x
${CYAN}安装完成后,请重新运行此脚本继续安装 IDC设备管理系统${RESET}
"
}
# 检查并安装依赖
check_and_install_dependencies() {
log_step "检查系统依赖"
local sudo=$(get_sudo)
local distro=$(detect_distro)
local needs_install=()
# 检查 git
if ! command_exists git; then
needs_install+=("git")
fi
# 检查 curl
if ! command_exists curl; then
needs_install+=("curl")
fi
# 检查 wget(可选)
if ! command_exists wget; then
needs_install+=("wget")
fi
if [ ${#needs_install[@]} -gt 0 ]; then
log_info "需要安装依赖: ${needs_install[*]}"
case $distro in
ubuntu|debian)
$sudo apt-get update -qq
$sudo apt-get install -y -qq "${needs_install[@]}"
;;
centos|rhel|fedora|rocky|almalinux)
$sudo yum install -y -q "${needs_install[@]}"
;;
arch|manjaro)
$sudo pacman -S --noconfirm "${needs_install[@]}"
;;
*)
log_warning "无法自动安装依赖,请手动安装: ${needs_install[*]}"
return 1
;;
esac
log_success "依赖安装完成"
else
log_success "系统依赖已满足"
fi
}
# 主函数
main() {
show_banner
# 检查是否在正确的目录
if [ ! -f "$SCRIPT_DIR/install.js" ]; then
log_error "未找到 install.js 文件"
log_info "请在项目根目录运行此脚本"
exit 1
fi
# 检查 Node.js
log_step "检查 Node.js 环境"
if command_exists node; then
local node_version=$(get_node_version)
log_info "检测到 Node.js: $(node -v)"
if check_node_version; then
log_success "Node.js 版本满足要求 (>= v$MIN_NODE_VERSION)"
else
log_warning "Node.js 版本过低 (v$node_version < v$MIN_NODE_VERSION)"
echo -e "\n${YELLOW}请选择操作:${RESET}"
echo " 1) 自动升级 Node.js 到 v20(推荐)"
echo " 2) 显示手动安装指引"
echo " 3) 退出"
read -p "请选择 [1-3]: " choice
case $choice in
1)
auto_install_node || {
log_error "Node.js 升级失败"
show_manual_install_guide
exit 1
}
# 重新加载环境
export PATH="/usr/bin:$HOME/.nvm/versions/node/v20*/bin:$PATH"
hash -r
;;
2)
show_manual_install_guide
exit 0
;;
3)
log_info "已取消安装"
exit 0
;;
*)
log_error "无效选择"
exit 1
;;
esac
fi
else
log_warning "未检测到 Node.js"
echo -e "\n${YELLOW}请选择操作:${RESET}"
echo " 1) 自动安装 Node.js v20(推荐)"
echo " 2) 显示手动安装指引"
echo " 3) 退出"
read -p "请选择 [1-3]: " choice
case $choice in
1)
check_and_install_dependencies
auto_install_node || {
log_error "Node.js 安装失败"
show_manual_install_guide
exit 1
}
# 重新加载环境
export PATH="/usr/bin:$HOME/.nvm/versions/node/v20*/bin:$PATH"
hash -r
;;
2)
show_manual_install_guide
exit 0
;;
3)
log_info "已取消安装"
exit 0
;;
*)
log_error "无效选择"
exit 1
;;
esac
fi
# 检查 npm
log_step "检查 npm"
if command_exists npm; then
log_success "npm $(npm -v)"
else
log_warning "npm 未安装,尝试自动安装..."
local distro=$(detect_distro)
local sudo=$(get_sudo)
case $distro in
ubuntu|debian)
$sudo apt-get update -qq
$sudo apt-get install -y -qq npm
;;
centos|rhel|fedora|rocky|almalinux)
$sudo yum install -y -q npm
;;
arch|manjaro)
$sudo pacman -S --noconfirm npm
;;
*)
# 尝试使用 Node.js 自带的 corepack 启用 npm
if command_exists corepack; then
log_info "尝试使用 corepack 启用 npm..."
corepack enable
corepack prepare npm@latest --activate
else
log_error "无法自动安装 npm,请手动安装"
echo -e "\n${YELLOW}手动安装 npm${RESET}"
echo " Ubuntu/Debian: sudo apt-get install npm"
echo " CentOS/RHEL: sudo yum install npm"
echo " 或重新安装 Node.js: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs"
exit 1
fi
;;
esac
# 再次检查 npm
if command_exists npm; then
log_success "npm $(npm -v) 安装成功"
else
log_error "npm 安装失败,请手动安装"
exit 1
fi
fi
log_divider
log_success "环境检查通过!"
# 运行 install.js
log_step "启动安装程序"
log_info "正在运行 install.js..."
echo ""
cd "$SCRIPT_DIR"
node install.js "$@"
}
# 运行主函数
main "$@"