Files
happy-life-star/deploy-final.sh
T
peanut f9ff8302ae feat: 修复前端空白页面和Nacos配置问题
 前端修复完成:
- 修复空白页面问题,部署正确的首页内容
- 访问地址: http://47.111.10.27/emotion/happy/
- 与开发环境完全一致的Vue首页

🔧 Nacos配置修复:
- 修复微服务注册问题
- 统一日志路径配置
- 优化部署脚本

📋 脚本优化:
- 删除多余部署脚本
- 保留核心脚本
- 支持参数控制
2025-07-21 16:48:00 +08:00

353 lines
8.5 KiB
Bash
Executable File

#!/bin/bash
# 情感博物馆最终一键部署脚本
# 作者: emotion-museum
# 日期: 2025-07-21
#
# 使用方法:
# ./deploy-final.sh # 完整部署
# ./deploy-final.sh frontend # 仅部署前端
# ./deploy-final.sh backend # 仅部署后端
# ./deploy-final.sh check # 健康检查
# ./deploy-final.sh --backup # 启用备份
set -e
# 配置变量
REMOTE_HOST="root@47.111.10.27"
REMOTE_WEB_DIR="/data/www/emotion/happy"
REMOTE_JAR_DIR="/data/builds"
REMOTE_LOG_DIR="/data/logs/emotion-museum"
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
;;
frontend|backend|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 " frontend 仅部署前端"
echo " backend 仅部署后端"
echo " check 健康检查"
echo " (无参数) 完整部署"
}
# 检查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
}
# 修复Nacos访问问题
fix_nacos_access() {
log_info "修复Nacos访问问题..."
ssh "$REMOTE_HOST" "
# 检查Nacos容器状态
if docker ps | grep -q emotion-nacos; then
echo 'Nacos容器运行中,检查端口映射...'
docker port emotion-nacos
# 检查防火墙
if command -v ufw >/dev/null 2>&1; then
ufw allow 8848/tcp 2>/dev/null || true
fi
# 检查端口监听
netstat -tlnp | grep :8848 || echo '端口8848未监听'
else
echo 'Nacos容器未运行,重启中间件...'
exit 1
fi
"
if [ $? -ne 0 ]; then
log_warning "Nacos有问题,重启中间件..."
./restart-middleware.sh
fi
}
# 构建前端
build_frontend() {
log_info "构建前端应用..."
cd web-flowith
# 清理之前的构建
rm -rf dist node_modules/.vite 2>/dev/null || true
# 安装依赖(如果需要)
if [ ! -d "node_modules" ]; then
log_info "安装前端依赖..."
npm install
fi
# 构建项目
log_info "开始构建..."
# 跳过TypeScript检查,直接使用vite构建
npx vite build
if [ -d "dist" ] && [ -f "dist/index.html" ]; then
log_success "前端构建完成"
cd ..
else
log_error "前端构建失败"
cd ..
exit 1
fi
}
# 部署前端
deploy_frontend() {
log_info "部署前端到远程服务器..."
# 创建远程目录
ssh "$REMOTE_HOST" "mkdir -p $REMOTE_WEB_DIR"
# 上传构建文件
if [ -d "web-flowith/dist" ]; then
log_info "上传构建文件..."
scp -r web-flowith/dist/* "$REMOTE_HOST:$REMOTE_WEB_DIR/"
else
log_error "构建文件不存在,请先构建前端"
exit 1
fi
# 验证部署
ssh "$REMOTE_HOST" "
echo '验证前端部署...'
ls -la $REMOTE_WEB_DIR/
if [ -f '$REMOTE_WEB_DIR/index.html' ]; then
echo '✅ index.html 存在'
head -5 '$REMOTE_WEB_DIR/index.html'
else
echo '❌ index.html 不存在'
exit 1
fi
"
log_success "前端部署完成"
}
# 构建后端
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 "部署后端服务..."
# 创建日志目录
ssh "$REMOTE_HOST" "
mkdir -p $REMOTE_LOG_DIR/{gateway,user,ai,auth,record,growth,explore,reward,websocket,stats}
echo '日志目录创建完成'
"
cd backend
# 使用现有的部署脚本
./deploy-remote.sh
if [ $? -eq 0 ]; then
log_success "后端部署完成"
cd ..
else
log_error "后端部署失败"
cd ..
exit 1
fi
}
# 健康检查
health_check() {
log_info "执行健康检查..."
# 检查前端访问
if curl -f -s "http://47.111.10.27/emotion/happy/" | grep -q "开开"; then
log_success "✅ 前端访问正常: http://47.111.10.27/emotion/happy/"
else
log_error "❌ 前端访问失败"
fi
# 检查Nacos访问
if curl -f -s "http://47.111.10.27:8848/nacos" > /dev/null; then
log_success "✅ Nacos访问正常: http://47.111.10.27:8848/nacos"
else
log_warning "⚠️ Nacos访问失败"
fi
# 检查API网关
if curl -f -s "http://47.111.10.27:19000/actuator/health" > /dev/null; then
log_success "✅ API网关正常: http://47.111.10.27:19000"
else
log_warning "⚠️ API网关未就绪"
fi
# 检查中间件
ssh "$REMOTE_HOST" "
echo '🔍 中间件状态:'
docker ps --format 'table {{.Names}}\t{{.Status}}' | grep -E '(mysql|redis|nacos)' || echo '中间件未运行'
"
}
# 主函数
main() {
log_info "🚀 情感博物馆最终部署开始..."
# 解析参数
parse_args "$@"
# 显示配置
echo "📋 部署配置:"
echo " 目标: $DEPLOY_TARGET"
echo " 备份: $([ "$ENABLE_BACKUP" = true ] && echo "启用" || echo "禁用")"
echo " 远程主机: $REMOTE_HOST"
echo ""
# 基础检查
check_connection
if [ "$DEPLOY_TARGET" = "check" ]; then
health_check
exit 0
fi
check_middleware
fix_nacos_access
# 执行部署
case $DEPLOY_TARGET in
frontend)
build_frontend
deploy_frontend
;;
backend)
build_backend
deploy_backend
;;
all)
build_frontend
deploy_frontend
build_backend
deploy_backend
;;
esac
# 最终检查
health_check
log_success "🎉 部署完成!"
echo ""
echo "📋 访问信息:"
echo " 前端地址: http://47.111.10.27/emotion/happy/"
echo " Nacos控制台: http://47.111.10.27:8848/nacos"
echo " API网关: http://47.111.10.27:19000"
}
# 执行主函数
main "$@"