#!/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