#!/bin/bash # 情绪博物馆服务器一键安装脚本 # 适用于全新的Linux服务器 # 支持 Ubuntu/Debian/CentOS/RHEL set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 配置变量 PACKAGE_URL="https://github.com/your-repo/releases/download/v1.0.0/emotion-museum-1.0.0-20250713_111829.tar.gz" PACKAGE_SHA256="900d585f575b1619e74296496e2fe22f2c2e71b6ad8901d7cab82634765cc10d" INSTALL_DIR="/opt/emotion-museum" SERVICE_USER="emotion" 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" } # 检查是否为root用户 check_root() { if [[ $EUID -ne 0 ]]; then log_error "此脚本需要root权限运行" echo "请使用: sudo $0" exit 1 fi } # 检测操作系统 detect_os() { if [[ -f /etc/os-release ]]; then . /etc/os-release OS=$NAME VER=$VERSION_ID else log_error "无法检测操作系统" exit 1 fi log_info "检测到操作系统: $OS $VER" } # 更新系统包 update_system() { log_step "更新系统包..." if [[ "$OS" == *"Ubuntu"* ]] || [[ "$OS" == *"Debian"* ]]; then apt-get update apt-get upgrade -y apt-get install -y curl wget git unzip elif [[ "$OS" == *"CentOS"* ]] || [[ "$OS" == *"Red Hat"* ]]; then yum update -y yum install -y curl wget git unzip else log_warn "未知的操作系统,请手动安装必要的软件包" fi } # 安装Docker install_docker() { log_step "安装Docker..." if command -v docker &> /dev/null; then log_info "Docker已安装: $(docker --version)" return fi # 使用官方安装脚本 curl -fsSL https://get.docker.com | sh # 启动Docker服务 systemctl start docker systemctl enable docker # 创建docker组并添加用户 groupadd -f docker log_info "Docker安装完成" } # 安装Docker Compose install_docker_compose() { log_step "安装Docker Compose..." if command -v docker-compose &> /dev/null; then log_info "Docker Compose已安装: $(docker-compose --version)" return fi # 下载Docker Compose curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose # 创建软链接 ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose log_info "Docker Compose安装完成" } # 配置防火墙 configure_firewall() { log_step "配置防火墙..." if command -v ufw &> /dev/null; then # Ubuntu/Debian UFW ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw --force enable log_info "UFW防火墙配置完成" elif command -v firewall-cmd &> /dev/null; then # CentOS/RHEL firewalld firewall-cmd --permanent --add-port=22/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload log_info "firewalld防火墙配置完成" else log_warn "未检测到防火墙,请手动配置" fi } # 创建服务用户 create_service_user() { log_step "创建服务用户..." if id "$SERVICE_USER" &>/dev/null; then log_info "用户 $SERVICE_USER 已存在" else useradd -r -s /bin/bash -d "$INSTALL_DIR" "$SERVICE_USER" usermod -aG docker "$SERVICE_USER" log_info "用户 $SERVICE_USER 创建完成" fi } # 下载部署包 download_package() { log_step "下载部署包..." # 创建安装目录 mkdir -p "$INSTALL_DIR" cd "$INSTALL_DIR" # 下载部署包 if [[ -n "$PACKAGE_URL" ]]; then log_info "从URL下载部署包..." wget -O emotion-museum.tar.gz "$PACKAGE_URL" else log_error "请提供部署包URL或手动上传部署包到 $INSTALL_DIR" echo "手动上传后请运行: $0 --install-only" exit 1 fi # 验证校验和 if [[ -n "$PACKAGE_SHA256" ]]; then echo "$PACKAGE_SHA256 emotion-museum.tar.gz" | sha256sum -c if [[ $? -eq 0 ]]; then log_info "部署包校验通过" else log_error "部署包校验失败" exit 1 fi fi # 解压部署包 tar -xzf emotion-museum.tar.gz rm emotion-museum.tar.gz # 查找解压后的目录 EXTRACT_DIR=$(find . -maxdepth 1 -type d -name "emotion-museum-*" | head -n 1) if [[ -n "$EXTRACT_DIR" ]]; then mv "$EXTRACT_DIR"/* . rmdir "$EXTRACT_DIR" fi # 设置权限 chown -R "$SERVICE_USER:$SERVICE_USER" "$INSTALL_DIR" chmod +x *.sh log_info "部署包下载和解压完成" } # 配置环境 configure_environment() { log_step "配置环境..." cd "$INSTALL_DIR" # 复制环境变量模板 if [[ ! -f .env ]]; then cat > .env << 'EOF' # 数据库配置 MYSQL_ROOT_PASSWORD=EmotionMuseum2024! MYSQL_DATABASE=emotion_museum MYSQL_USER=emotion MYSQL_PASSWORD=EmotionDB2024! # Redis配置 REDIS_PASSWORD= # Nacos配置 NACOS_AUTH_ENABLE=false # 应用配置 SPRING_PROFILES_ACTIVE=docker TZ=Asia/Shanghai # Coze API配置 (与开发环境一致) COZE_API_TOKEN=pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO EOF fi log_info "环境配置完成" log_warn "请编辑 $INSTALL_DIR/.env 文件,设置正确的Coze API Token" } # 创建系统服务 create_systemd_service() { log_step "创建系统服务..." cat > /etc/systemd/system/emotion-museum.service << EOF [Unit] Description=Emotion Museum Application Requires=docker.service After=docker.service [Service] Type=oneshot RemainAfterExit=yes WorkingDirectory=$INSTALL_DIR ExecStart=/usr/local/bin/docker-compose up -d ExecStop=/usr/local/bin/docker-compose down User=$SERVICE_USER Group=$SERVICE_USER [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable emotion-museum log_info "系统服务创建完成" } # 启动服务 start_services() { log_step "启动服务..." cd "$INSTALL_DIR" # 切换到服务用户执行 sudo -u "$SERVICE_USER" ./deploy.sh log_info "服务启动完成" } # 验证部署 verify_deployment() { log_step "验证部署..." sleep 30 # 等待服务启动 # 检查服务状态 cd "$INSTALL_DIR" sudo -u "$SERVICE_USER" ./manage.sh status # 健康检查 sudo -u "$SERVICE_USER" ./manage.sh health log_info "部署验证完成" } # 显示部署信息 show_deployment_info() { local server_ip=$(curl -s ifconfig.me 2>/dev/null || echo "unknown") echo "" log_info "🎉 情绪博物馆部署完成!" echo "" echo "📱 访问地址:" echo " 前端应用: http://$server_ip" echo " API网关: http://$server_ip:9000" echo " Nacos: http://$server_ip:8848/nacos (nacos/nacos)" echo "" echo "📁 安装目录: $INSTALL_DIR" echo "👤 服务用户: $SERVICE_USER" echo "" echo "🔧 管理命令:" echo " cd $INSTALL_DIR" echo " sudo -u $SERVICE_USER ./manage.sh status # 查看状态" echo " sudo -u $SERVICE_USER ./manage.sh logs # 查看日志" echo " sudo -u $SERVICE_USER ./manage.sh restart # 重启服务" echo "" echo "⚠️ 重要提醒:" echo " 1. 请编辑 $INSTALL_DIR/.env 文件,设置正确的Coze API Token" echo " 2. 生产环境请修改数据库密码" echo " 3. 建议配置HTTPS证书" echo "" } # 主安装流程 main_install() { echo "🚀 开始安装情绪博物馆..." echo "" check_root detect_os update_system install_docker install_docker_compose configure_firewall create_service_user download_package configure_environment create_systemd_service start_services verify_deployment show_deployment_info } # 仅安装(假设部署包已存在) install_only() { echo "🚀 开始安装情绪博物馆(跳过下载)..." echo "" check_root detect_os update_system install_docker install_docker_compose configure_firewall create_service_user # 检查部署包是否存在 if [[ ! -f "$INSTALL_DIR/deploy.sh" ]]; then log_error "部署包不存在,请先上传部署包到 $INSTALL_DIR" exit 1 fi configure_environment create_systemd_service start_services verify_deployment show_deployment_info } # 显示帮助信息 show_help() { echo "情绪博物馆服务器安装脚本" echo "" echo "用法: $0 [选项]" echo "" echo "选项:" echo " --install-only 仅安装(跳过下载,假设部署包已存在)" echo " --help 显示帮助信息" echo "" echo "示例:" echo " $0 # 完整安装(包括下载)" echo " $0 --install-only # 仅安装(跳过下载)" echo "" } # 处理命令行参数 case "${1:-}" in "--install-only") install_only ;; "--help") show_help ;; "") main_install ;; *) echo "未知选项: $1" show_help exit 1 ;; esac