优化:已知问题
This commit is contained in:
220
deploy-prod.sh
Executable file
220
deploy-prod.sh
Executable file
@@ -0,0 +1,220 @@
|
||||
#!/bin/bash
|
||||
|
||||
# AI Chat 生产环境部署脚本
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 日志函数
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# 检查必要的工具
|
||||
check_requirements() {
|
||||
log_info "检查部署环境..."
|
||||
|
||||
if ! command -v docker &> /dev/null; then
|
||||
log_error "Docker 未安装,请先安装 Docker"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
log_error "Docker Compose 未安装,请先安装 Docker Compose"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "环境检查通过"
|
||||
}
|
||||
|
||||
# 创建必要的目录
|
||||
create_directories() {
|
||||
log_info "创建必要的目录..."
|
||||
|
||||
mkdir -p logs/nginx
|
||||
mkdir -p logs/proxy
|
||||
mkdir -p ssl
|
||||
mkdir -p backups
|
||||
|
||||
log_success "目录创建完成"
|
||||
}
|
||||
|
||||
# 备份当前部署
|
||||
backup_current() {
|
||||
if [ -d "dist" ]; then
|
||||
log_info "备份当前部署..."
|
||||
timestamp=$(date +%Y%m%d_%H%M%S)
|
||||
tar -czf "backups/backup_${timestamp}.tar.gz" dist/ logs/ 2>/dev/null || true
|
||||
log_success "备份完成: backups/backup_${timestamp}.tar.gz"
|
||||
fi
|
||||
}
|
||||
|
||||
# 构建应用
|
||||
build_app() {
|
||||
log_info "构建应用..."
|
||||
|
||||
if [ ! -f "package.json" ]; then
|
||||
log_error "package.json 不存在,请确保在项目根目录运行此脚本"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查是否有pnpm
|
||||
if command -v pnpm &> /dev/null; then
|
||||
log_info "使用 pnpm 安装依赖..."
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm run build:h5
|
||||
elif command -v npm &> /dev/null; then
|
||||
log_info "使用 npm 安装依赖..."
|
||||
npm ci
|
||||
npm run build:h5
|
||||
else
|
||||
log_error "未找到 npm 或 pnpm"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "dist" ]; then
|
||||
log_error "构建失败,dist 目录不存在"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "应用构建完成"
|
||||
}
|
||||
|
||||
# 部署应用
|
||||
deploy_app() {
|
||||
local mode=$1
|
||||
|
||||
log_info "开始部署应用 (模式: $mode)..."
|
||||
|
||||
case $mode in
|
||||
"basic")
|
||||
docker-compose -f docker-compose.prod.yml down 2>/dev/null || true
|
||||
docker-compose -f docker-compose.prod.yml up -d --build
|
||||
;;
|
||||
"https")
|
||||
if [ ! -f "ssl/fullchain.pem" ] || [ ! -f "ssl/privkey.pem" ]; then
|
||||
log_warning "SSL证书不存在,请先配置SSL证书"
|
||||
log_info "将使用基础模式部署..."
|
||||
docker-compose -f docker-compose.prod.yml down 2>/dev/null || true
|
||||
docker-compose -f docker-compose.prod.yml up -d --build
|
||||
else
|
||||
docker-compose -f docker-compose.prod.yml --profile https down 2>/dev/null || true
|
||||
docker-compose -f docker-compose.prod.yml --profile https up -d --build
|
||||
fi
|
||||
;;
|
||||
"monitoring")
|
||||
docker-compose -f docker-compose.prod.yml --profile monitoring down 2>/dev/null || true
|
||||
docker-compose -f docker-compose.prod.yml --profile monitoring up -d --build
|
||||
;;
|
||||
*)
|
||||
log_error "未知的部署模式: $mode"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
log_success "应用部署完成"
|
||||
}
|
||||
|
||||
# 等待服务启动
|
||||
wait_for_service() {
|
||||
log_info "等待服务启动..."
|
||||
|
||||
local max_attempts=30
|
||||
local attempt=1
|
||||
|
||||
while [ $attempt -le $max_attempts ]; do
|
||||
if curl -s http://localhost/health > /dev/null 2>&1; then
|
||||
log_success "服务启动成功"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "等待服务启动... ($attempt/$max_attempts)"
|
||||
sleep 2
|
||||
((attempt++))
|
||||
done
|
||||
|
||||
log_warning "服务启动超时,请检查日志"
|
||||
return 1
|
||||
}
|
||||
|
||||
# 显示部署信息
|
||||
show_deployment_info() {
|
||||
log_success "🎉 部署完成!"
|
||||
echo ""
|
||||
echo "📋 部署信息:"
|
||||
echo " - 访问地址: http://localhost"
|
||||
echo " - 健康检查: http://localhost/health"
|
||||
echo " - 日志目录: ./logs/"
|
||||
echo ""
|
||||
echo "🔧 管理命令:"
|
||||
echo " - 查看状态: docker-compose -f docker-compose.prod.yml ps"
|
||||
echo " - 查看日志: docker-compose -f docker-compose.prod.yml logs -f"
|
||||
echo " - 停止服务: docker-compose -f docker-compose.prod.yml down"
|
||||
echo " - 重启服务: docker-compose -f docker-compose.prod.yml restart"
|
||||
echo ""
|
||||
echo "📊 监控:"
|
||||
echo " - 容器状态: docker stats"
|
||||
echo " - 系统资源: htop"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
echo "🚀 AI Chat 生产环境部署脚本"
|
||||
echo "================================"
|
||||
|
||||
# 检查参数
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "请选择部署模式:"
|
||||
echo "1) 基础模式 (HTTP)"
|
||||
echo "2) HTTPS模式"
|
||||
echo "3) 监控模式"
|
||||
echo "4) 仅构建"
|
||||
echo ""
|
||||
read -p "请输入选择 (1-4): " choice
|
||||
|
||||
case $choice in
|
||||
1) MODE="basic" ;;
|
||||
2) MODE="https" ;;
|
||||
3) MODE="monitoring" ;;
|
||||
4) MODE="build-only" ;;
|
||||
*) log_error "无效选择"; exit 1 ;;
|
||||
esac
|
||||
else
|
||||
MODE=$1
|
||||
fi
|
||||
|
||||
# 执行部署步骤
|
||||
check_requirements
|
||||
create_directories
|
||||
backup_current
|
||||
build_app
|
||||
|
||||
if [ "$MODE" != "build-only" ]; then
|
||||
deploy_app $MODE
|
||||
wait_for_service
|
||||
show_deployment_info
|
||||
else
|
||||
log_success "构建完成,跳过部署"
|
||||
fi
|
||||
}
|
||||
|
||||
# 运行主函数
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user