#!/bin/bash # ============================================ # 一键部署脚本 (Linux) # 用于服务器环境部署前后端 # ============================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 配置变量(根据实际情况修改) FRONTEND_DEPLOY_DIR="/home/lq/nginx/html_app/lq_label" # 前端部署目录(Nginx root) GIT_BRANCH="main" # Git 分支 echo -e "${GREEN}============================================${NC}" echo -e "${GREEN} LQ Label 一键部署脚本${NC}" echo -e "${GREEN}============================================${NC}" echo # 获取脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # ============================================ # 1. 拉取最新代码 # ============================================ echo -e "${YELLOW}[1/4] 拉取最新代码...${NC}" if [ -d ".git" ]; then git fetch origin git checkout $GIT_BRANCH git pull origin $GIT_BRANCH echo -e "${GREEN}代码更新完成${NC}" else echo -e "${RED}错误: 当前目录不是 Git 仓库${NC}" exit 1 fi # ============================================ # 2. 部署后端 (Docker) # ============================================ echo echo -e "${YELLOW}[2/4] 部署后端服务...${NC}" cd backend # 检查配置文件 if [ ! -f "config.yaml" ]; then echo -e "${YELLOW}未找到 config.yaml,从 config.prod.yaml 创建...${NC}" cp config.prod.yaml config.yaml echo -e "${GREEN}已使用生产环境配置${NC}" fi # 创建导出目录 mkdir -p exports # 检查是否需要重新构建镜像(只有依赖变更才需要) NEED_BUILD=false # 检查镜像是否存在 if ! docker image inspect lq-label-backend:latest > /dev/null 2>&1; then echo "镜像不存在,需要构建..." NEED_BUILD=true fi # 依赖文件哈希(只有这些变更才需要重建镜像) DEPS_HASH=$(md5sum requirements.txt Dockerfile 2>/dev/null | md5sum | cut -d' ' -f1) if [ -f ".last_deps_hash" ]; then LAST_DEPS_HASH=$(cat .last_deps_hash) if [ "$DEPS_HASH" != "$LAST_DEPS_HASH" ]; then echo "检测到依赖或 Dockerfile 变更,需要重建镜像..." NEED_BUILD=true fi else NEED_BUILD=true fi # 执行构建(只在需要时) if [ "$NEED_BUILD" = true ]; then echo "构建 Docker 镜像..." docker build -t lq-label-backend:latest . echo "$DEPS_HASH" > .last_deps_hash echo -e "${GREEN}镜像构建完成${NC}" else echo -e "${GREEN}依赖无变更,跳过镜像构建${NC}" echo "代码已通过 volume 挂载,重启容器即可生效" fi echo "启动后端服务..." docker compose down 2>/dev/null || true docker compose up -d # 等待服务启动 echo "等待服务启动..." sleep 5 # 健康检查 if curl -s http://localhost:8003/health > /dev/null; then echo -e "${GREEN}后端服务启动成功${NC}" else echo -e "${RED}后端服务启动失败,请检查日志: docker compose logs${NC}" exit 1 fi cd "$SCRIPT_DIR" # ============================================ # 3. 部署前端 # ============================================ echo echo -e "${YELLOW}[3/4] 部署前端...${NC}" # 检查前端包是否存在 if [ ! -f "lq_label_dist.tar.gz" ]; then echo -e "${RED}错误: 未找到 lq_label_dist.tar.gz${NC}" echo -e "${YELLOW}请先在 Windows 开发环境运行 build.bat 构建前端${NC}" exit 1 fi # 创建部署目录 sudo mkdir -p "$FRONTEND_DEPLOY_DIR" # 备份旧版本(可选) if [ -d "$FRONTEND_DEPLOY_DIR" ] && [ "$(ls -A $FRONTEND_DEPLOY_DIR 2>/dev/null)" ]; then BACKUP_DIR="${FRONTEND_DEPLOY_DIR}_backup_$(date +%Y%m%d_%H%M%S)" echo "备份旧版本到 $BACKUP_DIR" sudo mv "$FRONTEND_DEPLOY_DIR" "$BACKUP_DIR" sudo mkdir -p "$FRONTEND_DEPLOY_DIR" fi # 解压前端文件 echo "解压前端文件到 $FRONTEND_DEPLOY_DIR" sudo tar -xzvf lq_label_dist.tar.gz -C "$FRONTEND_DEPLOY_DIR" --strip-components=1 # 设置权限 sudo chown -R www-data:www-data "$FRONTEND_DEPLOY_DIR" 2>/dev/null || \ sudo chown -R nginx:nginx "$FRONTEND_DEPLOY_DIR" 2>/dev/null || \ echo "请手动设置目录权限" echo -e "${GREEN}前端部署完成${NC}" # ============================================ # 4. 重载 Nginx # ============================================ echo echo -e "${YELLOW}[4/4] 重载 Nginx 配置...${NC}" # 检查 Nginx 配置 if sudo nginx -t; then sudo systemctl reload nginx || sudo nginx -s reload echo -e "${GREEN}Nginx 重载完成${NC}" else echo -e "${RED}Nginx 配置错误,请检查配置文件${NC}" exit 1 fi # ============================================ # 完成 # ============================================ echo echo -e "${GREEN}============================================${NC}" echo -e "${GREEN} 部署完成!${NC}" echo -e "${GREEN}============================================${NC}" echo echo "前端地址: http://localhost:9101" echo "后端地址: http://localhost:8003" echo "API 文档: http://localhost:8003/docs" echo echo -e "${YELLOW}常用命令:${NC}" echo " 查看后端日志: cd backend && docker compose logs -f" echo " 重启后端: cd backend && docker compose restart" echo " 停止后端: cd backend && docker compose down"