#!/bin/bash # ============================================ # 海外预约系统 - 自动部署脚本 # ============================================ set -e # 遇到错误立即退出 # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 项目根目录 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" # 检测 docker compose 命令 if docker compose version > /dev/null 2>&1; then DOCKER_COMPOSE="docker compose" elif docker-compose version > /dev/null 2>&1; then DOCKER_COMPOSE="docker-compose" else echo -e "${RED}错误: 未找到 docker compose 命令${NC}" exit 1 fi echo -e "${BLUE}============================================${NC}" echo -e "${BLUE} 海外预约系统 - 自动部署脚本${NC}" echo -e "${BLUE}============================================${NC}" echo "" # 检查 Docker 是否运行 check_docker() { echo -e "${YELLOW}[1/5] 检查 Docker 环境...${NC}" if ! docker info > /dev/null 2>&1; then echo -e "${RED}错误: Docker 未运行,请先启动 Docker${NC}" exit 1 fi echo -e "${GREEN}✓ Docker 运行正常 (使用 $DOCKER_COMPOSE)${NC}" } # 检查环境变量文件 check_env() { echo -e "${YELLOW}[2/5] 检查环境配置...${NC}" if [ ! -f "$SCRIPT_DIR/.env" ]; then echo -e "${YELLOW} .env 文件不存在,从模板创建...${NC}" cp "$SCRIPT_DIR/.env.example" "$SCRIPT_DIR/.env" echo -e "${YELLOW} 请编辑 $SCRIPT_DIR/.env 配置数据库等信息${NC}" echo -e "${RED} 首次部署请先配置 .env 文件后重新运行脚本${NC}" exit 1 fi echo -e "${GREEN}✓ 环境配置已就绪${NC}" } # 构建 Admin 前端 build_admin() { echo -e "${YELLOW}[3/5] 构建 Admin 前端...${NC}" cd "$PROJECT_ROOT/admin" # 检查 node_modules if [ ! -d "node_modules" ]; then echo -e "${YELLOW} 安装依赖...${NC}" npm install fi echo -e "${YELLOW} 执行构建...${NC}" npm run build # 复制构建产物 echo -e "${YELLOW} 复制构建产物到 server/admin-dist...${NC}" rm -rf "$SCRIPT_DIR/admin-dist" cp -r dist "$SCRIPT_DIR/admin-dist" echo -e "${GREEN}✓ Admin 构建完成${NC}" } # 构建并启动 Docker 服务 deploy_docker() { echo -e "${YELLOW}[4/5] 构建并启动 Docker 服务...${NC}" cd "$SCRIPT_DIR" # 停止旧容器(如果存在) echo -e "${YELLOW} 停止旧容器...${NC}" $DOCKER_COMPOSE down 2>/dev/null || true # 构建并启动 echo -e "${YELLOW} 构建镜像并启动容器...${NC}" $DOCKER_COMPOSE up -d --build echo -e "${GREEN}✓ Docker 服务已启动${NC}" } # 检查服务状态 check_status() { echo -e "${YELLOW}[5/5] 检查服务状态...${NC}" sleep 3 # 检查容器状态 echo "" $DOCKER_COMPOSE ps echo "" # 等待服务就绪 echo -e "${YELLOW} 等待服务就绪...${NC}" for i in {1..30}; do if curl -s http://localhost:2701/health > /dev/null 2>&1; then echo -e "${GREEN}✓ 服务已就绪${NC}" break fi if [ $i -eq 30 ]; then echo -e "${YELLOW} 服务启动中,请稍后检查...${NC}" fi sleep 1 done } # 显示访问信息 show_info() { echo "" echo -e "${GREEN}============================================${NC}" echo -e "${GREEN} 部署完成!${NC}" echo -e "${GREEN}============================================${NC}" echo "" echo -e " 访问地址:" echo -e " Admin 后台: ${BLUE}http://localhost:2701/admin${NC}" echo -e " API 接口: ${BLUE}http://localhost:2701/api/v1${NC}" echo -e " 健康检查: ${BLUE}http://localhost:2701/health${NC}" echo "" echo -e " 常用命令:" echo -e " 查看日志: ${YELLOW}cd server && $DOCKER_COMPOSE logs -f${NC}" echo -e " 停止服务: ${YELLOW}cd server && $DOCKER_COMPOSE down${NC}" echo -e " 重启服务: ${YELLOW}cd server && $DOCKER_COMPOSE restart${NC}" echo "" } # 主流程 main() { check_docker check_env build_admin deploy_docker check_status show_info } # 处理命令行参数 case "${1:-}" in --skip-build) echo -e "${YELLOW}跳过 Admin 构建${NC}" check_docker check_env deploy_docker check_status show_info ;; --restart) echo -e "${YELLOW}重启服务${NC}" cd "$SCRIPT_DIR" $DOCKER_COMPOSE restart check_status ;; --stop) echo -e "${YELLOW}停止服务${NC}" cd "$SCRIPT_DIR" $DOCKER_COMPOSE down echo -e "${GREEN}✓ 服务已停止${NC}" ;; --logs) cd "$SCRIPT_DIR" $DOCKER_COMPOSE logs -f ;; --help) echo "用法: ./deploy.sh [选项]" echo "" echo "选项:" echo " (无参数) 完整部署(构建 Admin + 启动服务)" echo " --skip-build 跳过 Admin 构建,直接部署" echo " --restart 重启服务" echo " --stop 停止服务" echo " --logs 查看日志" echo " --help 显示帮助" ;; *) main ;; esac