#!/bin/bash # ============================================ # 一键部署脚本 (Linux) # 用于服务器环境部署前后端 # ============================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 配置变量(根据实际情况修改) FRONTEND_DEPLOY_DIR="/var/www/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,从模板创建...${NC}" cp config.docker.yaml config.yaml echo -e "${RED}请编辑 backend/config.yaml 配置数据库和密钥后重新运行${NC}" exit 1 fi # 创建数据目录 mkdir -p data # 检查是否需要重新构建镜像 NEED_BUILD=false # 检查镜像是否存在 if ! docker image inspect lq-label-backend:latest > /dev/null 2>&1; then echo "镜像不存在,需要构建..." NEED_BUILD=true fi # 检查 requirements.txt 或 Dockerfile 是否有变更 if [ -f ".last_build_hash" ]; then CURRENT_HASH=$(md5sum requirements.txt Dockerfile 2>/dev/null | md5sum | cut -d' ' -f1) LAST_HASH=$(cat .last_build_hash) if [ "$CURRENT_HASH" != "$LAST_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 . # 保存构建哈希 md5sum requirements.txt Dockerfile 2>/dev/null | md5sum | cut -d' ' -f1 > .last_build_hash else echo "镜像无变更,跳过构建" 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 (根据 Nginx 配置)" 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"