383 lines
10 KiB
Bash
Executable File
383 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 情绪博物馆环境安装脚本
|
|
# 作者: EmotionMuseum Team
|
|
# 版本: 1.0.0
|
|
# 日期: 2025-07-13
|
|
# 说明: 安装部署所需的基础环境
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# 日志函数
|
|
log_info() {
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
log_step() {
|
|
echo -e "${BLUE}[STEP]${NC} $1"
|
|
}
|
|
|
|
# 检测操作系统
|
|
detect_os() {
|
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
if [ -f /etc/redhat-release ]; then
|
|
OS="centos"
|
|
PKG_MANAGER="yum"
|
|
elif [ -f /etc/debian_version ]; then
|
|
OS="ubuntu"
|
|
PKG_MANAGER="apt"
|
|
else
|
|
OS="linux"
|
|
PKG_MANAGER="unknown"
|
|
fi
|
|
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
|
OS="macos"
|
|
PKG_MANAGER="brew"
|
|
else
|
|
log_error "不支持的操作系统: $OSTYPE"
|
|
exit 1
|
|
fi
|
|
|
|
log_info "检测到操作系统: $OS"
|
|
}
|
|
|
|
# 更新系统包管理器
|
|
update_package_manager() {
|
|
log_step "更新系统包管理器..."
|
|
|
|
case $PKG_MANAGER in
|
|
"yum")
|
|
sudo yum update -y
|
|
sudo yum install -y wget curl git unzip
|
|
;;
|
|
"apt")
|
|
sudo apt update
|
|
sudo apt upgrade -y
|
|
sudo apt install -y wget curl git unzip software-properties-common
|
|
;;
|
|
"brew")
|
|
if ! command -v brew &> /dev/null; then
|
|
log_info "安装Homebrew..."
|
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
fi
|
|
brew update
|
|
;;
|
|
*)
|
|
log_error "不支持的包管理器: $PKG_MANAGER"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
log_info "系统包管理器更新完成"
|
|
}
|
|
|
|
# 安装Java 17
|
|
install_java() {
|
|
log_step "安装Java 17..."
|
|
|
|
if command -v java &> /dev/null; then
|
|
JAVA_VERSION=$(java -version 2>&1 | head -n1 | cut -d'"' -f2 | cut -d'.' -f1)
|
|
if [ "$JAVA_VERSION" = "17" ]; then
|
|
log_info "Java 17已安装"
|
|
return
|
|
else
|
|
log_warn "检测到Java版本: $JAVA_VERSION,将安装Java 17"
|
|
fi
|
|
fi
|
|
|
|
case $PKG_MANAGER in
|
|
"yum")
|
|
sudo yum install -y java-17-openjdk java-17-openjdk-devel
|
|
;;
|
|
"apt")
|
|
sudo apt install -y openjdk-17-jdk openjdk-17-jre
|
|
;;
|
|
"brew")
|
|
brew install openjdk@17
|
|
echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
|
|
;;
|
|
esac
|
|
|
|
# 设置JAVA_HOME
|
|
JAVA_HOME_PATH=$(dirname $(dirname $(readlink -f $(which java))))
|
|
echo "export JAVA_HOME=$JAVA_HOME_PATH" >> ~/.bashrc
|
|
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> ~/.bashrc
|
|
|
|
if [ "$OS" = "macos" ]; then
|
|
echo "export JAVA_HOME=$JAVA_HOME_PATH" >> ~/.zshrc
|
|
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> ~/.zshrc
|
|
fi
|
|
|
|
log_info "Java 17安装完成"
|
|
}
|
|
|
|
# 安装Maven
|
|
install_maven() {
|
|
log_step "安装Maven..."
|
|
|
|
if command -v mvn &> /dev/null; then
|
|
MVN_VERSION=$(mvn -version | head -n1 | cut -d' ' -f3)
|
|
log_info "Maven已安装,版本: $MVN_VERSION"
|
|
return
|
|
fi
|
|
|
|
MAVEN_VERSION="3.9.6"
|
|
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"
|
|
|
|
cd /tmp
|
|
wget $MAVEN_URL
|
|
sudo tar -xzf apache-maven-${MAVEN_VERSION}-bin.tar.gz -C /opt/
|
|
sudo ln -sf /opt/apache-maven-${MAVEN_VERSION} /opt/maven
|
|
|
|
echo "export MAVEN_HOME=/opt/maven" >> ~/.bashrc
|
|
echo "export PATH=\$MAVEN_HOME/bin:\$PATH" >> ~/.bashrc
|
|
|
|
if [ "$OS" = "macos" ]; then
|
|
echo "export MAVEN_HOME=/opt/maven" >> ~/.zshrc
|
|
echo "export PATH=\$MAVEN_HOME/bin:\$PATH" >> ~/.zshrc
|
|
fi
|
|
|
|
log_info "Maven安装完成"
|
|
}
|
|
|
|
# 安装Node.js和npm
|
|
install_nodejs() {
|
|
log_step "安装Node.js和npm..."
|
|
|
|
if command -v node &> /dev/null; then
|
|
NODE_VERSION=$(node -v)
|
|
log_info "Node.js已安装,版本: $NODE_VERSION"
|
|
if command -v npm &> /dev/null; then
|
|
NPM_VERSION=$(npm -v)
|
|
log_info "npm已安装,版本: $NPM_VERSION"
|
|
return
|
|
fi
|
|
fi
|
|
|
|
# 使用NodeSource安装最新LTS版本
|
|
case $PKG_MANAGER in
|
|
"yum")
|
|
curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
|
|
sudo yum install -y nodejs
|
|
;;
|
|
"apt")
|
|
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
|
|
sudo apt-get install -y nodejs
|
|
;;
|
|
"brew")
|
|
brew install node
|
|
;;
|
|
esac
|
|
|
|
# 配置npm镜像源
|
|
npm config set registry https://registry.npmmirror.com
|
|
|
|
log_info "Node.js和npm安装完成"
|
|
}
|
|
|
|
# 安装Docker
|
|
install_docker() {
|
|
log_step "安装Docker..."
|
|
|
|
if command -v docker &> /dev/null; then
|
|
DOCKER_VERSION=$(docker --version | cut -d' ' -f3 | cut -d',' -f1)
|
|
log_info "Docker已安装,版本: $DOCKER_VERSION"
|
|
else
|
|
case $PKG_MANAGER in
|
|
"yum")
|
|
sudo yum install -y yum-utils
|
|
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
|
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
;;
|
|
"apt")
|
|
sudo apt-get remove docker docker-engine docker.io containerd runc || true
|
|
sudo apt-get install -y ca-certificates curl gnupg lsb-release
|
|
sudo mkdir -p /etc/apt/keyrings
|
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
sudo apt-get update
|
|
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
;;
|
|
"brew")
|
|
log_info "请手动安装Docker Desktop for Mac"
|
|
log_info "下载地址: https://www.docker.com/products/docker-desktop"
|
|
return
|
|
;;
|
|
esac
|
|
|
|
log_info "Docker安装完成"
|
|
fi
|
|
|
|
# 启动Docker服务
|
|
if [ "$OS" != "macos" ]; then
|
|
sudo systemctl start docker
|
|
sudo systemctl enable docker
|
|
|
|
# 将当前用户添加到docker组
|
|
sudo usermod -aG docker $USER
|
|
log_warn "请重新登录以使docker组权限生效"
|
|
fi
|
|
}
|
|
|
|
# 安装Docker Compose
|
|
install_docker_compose() {
|
|
log_step "安装Docker Compose..."
|
|
|
|
if command -v docker-compose &> /dev/null; then
|
|
COMPOSE_VERSION=$(docker-compose --version | cut -d' ' -f3 | cut -d',' -f1)
|
|
log_info "Docker Compose已安装,版本: $COMPOSE_VERSION"
|
|
return
|
|
fi
|
|
|
|
# 安装最新版本的Docker Compose
|
|
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d'"' -f4)
|
|
sudo curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
sudo chmod +x /usr/local/bin/docker-compose
|
|
|
|
log_info "Docker Compose安装完成"
|
|
}
|
|
|
|
# 配置系统优化
|
|
configure_system() {
|
|
log_step "配置系统优化..."
|
|
|
|
if [ "$OS" != "macos" ]; then
|
|
# 增加文件描述符限制
|
|
echo "* soft nofile 65536" | sudo tee -a /etc/security/limits.conf
|
|
echo "* hard nofile 65536" | sudo tee -a /etc/security/limits.conf
|
|
|
|
# 配置内核参数
|
|
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
|
|
echo "net.core.somaxconn=65535" | sudo tee -a /etc/sysctl.conf
|
|
|
|
sudo sysctl -p
|
|
fi
|
|
|
|
log_info "系统优化配置完成"
|
|
}
|
|
|
|
# 验证安装
|
|
verify_installation() {
|
|
log_step "验证安装结果..."
|
|
|
|
echo ""
|
|
echo "=== 环境验证结果 ==="
|
|
|
|
# 验证Java
|
|
if command -v java &> /dev/null; then
|
|
JAVA_VERSION=$(java -version 2>&1 | head -n1)
|
|
log_info "✅ Java: $JAVA_VERSION"
|
|
else
|
|
log_error "❌ Java未安装"
|
|
fi
|
|
|
|
# 验证Maven
|
|
if command -v mvn &> /dev/null; then
|
|
MVN_VERSION=$(mvn -version | head -n1)
|
|
log_info "✅ Maven: $MVN_VERSION"
|
|
else
|
|
log_error "❌ Maven未安装"
|
|
fi
|
|
|
|
# 验证Node.js
|
|
if command -v node &> /dev/null; then
|
|
NODE_VERSION=$(node -v)
|
|
log_info "✅ Node.js: $NODE_VERSION"
|
|
else
|
|
log_error "❌ Node.js未安装"
|
|
fi
|
|
|
|
# 验证npm
|
|
if command -v npm &> /dev/null; then
|
|
NPM_VERSION=$(npm -v)
|
|
log_info "✅ npm: $NPM_VERSION"
|
|
else
|
|
log_error "❌ npm未安装"
|
|
fi
|
|
|
|
# 验证Docker
|
|
if command -v docker &> /dev/null; then
|
|
DOCKER_VERSION=$(docker --version)
|
|
log_info "✅ Docker: $DOCKER_VERSION"
|
|
else
|
|
log_error "❌ Docker未安装"
|
|
fi
|
|
|
|
# 验证Docker Compose
|
|
if command -v docker-compose &> /dev/null; then
|
|
COMPOSE_VERSION=$(docker-compose --version)
|
|
log_info "✅ Docker Compose: $COMPOSE_VERSION"
|
|
else
|
|
log_error "❌ Docker Compose未安装"
|
|
fi
|
|
|
|
echo ""
|
|
log_info "环境验证完成"
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
echo "🚀 开始安装情绪博物馆部署环境..."
|
|
echo ""
|
|
|
|
detect_os
|
|
update_package_manager
|
|
install_java
|
|
install_maven
|
|
install_nodejs
|
|
install_docker
|
|
install_docker_compose
|
|
configure_system
|
|
verify_installation
|
|
|
|
echo ""
|
|
log_info "🎉 环境安装完成!"
|
|
log_warn "请重新登录或执行 'source ~/.bashrc' 以使环境变量生效"
|
|
|
|
if [ "$OS" = "macos" ]; then
|
|
log_warn "macOS用户请执行 'source ~/.zshrc' 以使环境变量生效"
|
|
fi
|
|
}
|
|
|
|
# 处理命令行参数
|
|
case "${1:-}" in
|
|
"java")
|
|
detect_os
|
|
install_java
|
|
;;
|
|
"maven")
|
|
detect_os
|
|
install_maven
|
|
;;
|
|
"node")
|
|
detect_os
|
|
install_nodejs
|
|
;;
|
|
"docker")
|
|
detect_os
|
|
install_docker
|
|
install_docker_compose
|
|
;;
|
|
"verify")
|
|
verify_installation
|
|
;;
|
|
*)
|
|
main
|
|
;;
|
|
esac
|