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