#!/bin/bash # 情感博物馆优化部署脚本 # 作者: emotion-museum # 日期: 2025-07-21 # # 使用方法: # ./deploy-optimized.sh # 默认部署,不备份 # ./deploy-optimized.sh --backup # 启用备份 # ./deploy-optimized.sh backend # 仅部署后端 # ./deploy-optimized.sh frontend # 仅部署前端 # ./deploy-optimized.sh check # 健康检查 # ./deploy-optimized.sh --backup backend # 备份并部署后端 set -e # 配置变量 REMOTE_HOST="root@47.111.10.27" REMOTE_WEB_DIR="/data/www/emotion/happy" REMOTE_JAR_DIR="/data/builds" ENABLE_BACKUP=false DEPLOY_TARGET="all" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } # 解析命令行参数 parse_args() { while [[ $# -gt 0 ]]; do case $1 in --backup) ENABLE_BACKUP=true shift ;; backend|frontend|check) DEPLOY_TARGET="$1" shift ;; -h|--help) show_help exit 0 ;; *) log_error "未知参数: $1" show_help exit 1 ;; esac done } # 显示帮助信息 show_help() { echo "情感博物馆优化部署脚本" echo "" echo "使用方法:" echo " $0 [选项] [目标]" echo "" echo "选项:" echo " --backup 启用备份(默认关闭)" echo " -h, --help 显示帮助信息" echo "" echo "目标:" echo " backend 仅部署后端服务" echo " frontend 仅部署前端" echo " check 健康检查" echo " (无参数) 部署前端和后端" echo "" echo "示例:" echo " $0 # 快速部署,不备份" echo " $0 --backup # 完整部署,启用备份" echo " $0 backend # 仅部署后端" echo " $0 --backup frontend # 备份并部署前端" } # 检查SSH连接 check_connection() { log_info "检查远程服务器连接..." if ssh -o ConnectTimeout=10 "$REMOTE_HOST" "echo 'SSH连接成功'" > /dev/null 2>&1; then log_success "远程服务器连接正常" else log_error "无法连接到远程服务器: $REMOTE_HOST" exit 1 fi } # 检查中间件状态 check_middleware() { log_info "检查中间件状态..." local middleware_status=$(ssh "$REMOTE_HOST" " mysql_status=\$(docker ps | grep emotion-mysql | wc -l) redis_status=\$(docker ps | grep emotion-redis | wc -l) nacos_status=\$(docker ps | grep emotion-nacos | wc -l) if [ \$mysql_status -eq 1 ] && [ \$redis_status -eq 1 ] && [ \$nacos_status -eq 1 ]; then echo 'running' else echo 'stopped' fi ") if [ "$middleware_status" = "running" ]; then log_success "中间件运行正常 (MySQL/Redis/Nacos)" return 0 else log_warning "中间件未完全运行,建议先执行: ./restart-middleware.sh" echo "是否继续部署?(y/N)" read -r confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then log_info "部署已取消" exit 0 fi fi } # 清理构建文件 cleanup_build_files() { log_info "清理历史构建文件..." # 清理后端构建文件 if [ -d "backend" ]; then find backend -name "target" -type d -exec rm -rf {} + 2>/dev/null || true log_success "后端构建文件已清理" fi # 清理前端构建文件 if [ -d "web-flowith" ]; then rm -rf web-flowith/dist web-flowith/node_modules/.vite 2>/dev/null || true log_success "前端构建文件已清理" fi } # 备份远程文件 backup_remote_files() { if [ "$ENABLE_BACKUP" = true ]; then log_info "备份远程文件..." local backup_dir="backup_$(date +%Y%m%d_%H%M%S)" ssh "$REMOTE_HOST" " mkdir -p /data/backups/$backup_dir # 备份JAR文件 if [ -d '$REMOTE_JAR_DIR' ]; then cp -r $REMOTE_JAR_DIR /data/backups/$backup_dir/jars 2>/dev/null || true fi # 备份前端文件 if [ -d '$REMOTE_WEB_DIR' ]; then cp -r $REMOTE_WEB_DIR /data/backups/$backup_dir/web 2>/dev/null || true fi echo '备份完成: /data/backups/$backup_dir' " log_success "远程文件已备份" else log_info "跳过备份(使用 --backup 启用备份)" fi } # 构建后端 build_backend() { log_info "构建后端服务..." cd backend # 清理并构建 ./build-all.sh if [ $? -eq 0 ]; then log_success "后端构建完成" cd .. else log_error "后端构建失败" cd .. exit 1 fi } # 部署后端 deploy_backend() { log_info "部署后端服务..." cd backend # 使用现有的部署脚本 ./deploy-remote.sh if [ $? -eq 0 ]; then log_success "后端部署完成" cd .. else log_error "后端部署失败" cd .. exit 1 fi } # 部署前端 deploy_frontend() { log_info "部署前端文件..." # 创建临时目录 mkdir -p /tmp/emotion-frontend-deploy # 复制前端文件 cp web-flowith/index.html /tmp/emotion-frontend-deploy/ 2>/dev/null || true cp -r web-flowith/src /tmp/emotion-frontend-deploy/ 2>/dev/null || true cp -r web-flowith/public /tmp/emotion-frontend-deploy/ 2>/dev/null || true # 创建优化的index.html cat > /tmp/emotion-frontend-deploy/index.html << 'EOF'