appointment_system/server/deploy.sh
2025-12-20 18:04:10 +08:00

190 lines
5.2 KiB
Bash
Executable File

#!/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