221 lines
5.5 KiB
Bash
Executable File
221 lines
5.5 KiB
Bash
Executable File
#!/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 "$@"
|