#!/bin/bash # # 生产环境自动化部署脚本 # 适用于无互联网的Linux环境(离线依赖包需提前准备) # set -e echo "========================================" echo "报告检测后端 - 自动化部署" echo "========================================" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 检查是否为root用户 if [ "$EUID" -ne 0 ]; then echo -e "${RED}请使用sudo运行此脚本${NC}" exit 1 fi # 1. 检查Java echo "" echo "[1/6] 检查Java环境..." if ! command -v java &> /dev/null; then echo -e "${YELLOW}Java未安装,正在安装...${NC}" if command -v apt-get &> /dev/null; then apt-get update apt-get install -y openjdk-11-jre elif command -v yum &> /dev/null; then yum install -y java-11-openjdk else echo -e "${RED}不支持的包管理器${NC}" exit 1 fi fi JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2) echo -e "${GREEN}✓ Java版本: $JAVA_VERSION${NC}" # 2. 检查Python echo "" echo "[2/6] 检查Python环境..." if ! command -v python3 &> /dev/null; then echo -e "${YELLOW}Python3未安装,正在安装...${NC}" if command -v apt-get &> /dev/null; then apt-get update apt-get install -y python3 python3-venv python3-pip elif command -v yum &> /dev/null; then yum install -y python3 python3-venv fi fi PYTHON_VERSION=$(python3 --version) echo -e "${GREEN}✓ $PYTHON_VERSION${NC}" # 3. 安装Python依赖(使用离线wheel包或在线安装) echo "" echo "[3/6] 安装Python依赖..." DEPLOY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" VENV_DIR="$DEPLOY_DIR/venv-offline" if [ ! -d "$VENV_DIR" ]; then echo "创建Python虚拟环境..." python3 -m venv "$VENV_DIR" source "$VENV_DIR/bin/activate" pip install --upgrade pip -q # 检查是否有离线wheel包 if [ -d "$DEPLOY_DIR/offline-packages" ]; then echo "使用离线wheel包安装依赖..." pip install --no-index --find-links="$DEPLOY_DIR/offline-packages" -r requirements.txt else echo "在线安装Python依赖(这可能需要15-20分钟)..." pip install -r "$DEPLOY_DIR/requirements.txt" -q fi echo -e "${GREEN}✓ Python依赖安装完成${NC}" else echo -e "${GREEN}✓ 虚拟环境已存在${NC}" fi # 4. 创建必要目录 echo "" echo "[4/6] 创建应用目录..." UPLOAD_DIR="$DEPLOY_DIR/data/uploads" PREVIEW_DIR="$DEPLOY_DIR/data/previews" ATTACHMENT_DIR="$DEPLOY_DIR/data/attachments" mkdir -p "$UPLOAD_DIR" mkdir -p "$PREVIEW_DIR" mkdir -p "$ATTACHMENT_DIR" echo -e "${GREEN}✓ 目录创建完成${NC}" # 5. 创建systemd服务 echo "" echo "[5/6] 配置系统服务..." SERVICE_FILE="/etc/systemd/system/report-detect.service" cat > "$SERVICE_FILE" << EOF [Unit] Description=Report Detect Backend Service After=network.target [Service] Type=simple User=$SUDO_USER Group=$SUDO_USER WorkingDirectory=$DEPLOY_DIR Environment="PATH=$VENV_DIR/bin:/usr/bin:/bin" Environment="PYTHONUNBUFFERED=1" ExecStart=/usr/bin/java -Xmx2g -jar $DEPLOY_DIR/report-detect-backend.jar Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable report-detect echo -e "${GREEN}✓ 系统服务配置完成${NC}" # 6. 启动应用 echo "" echo "[6/6] 启动应用..." if systemctl is-active --quiet report-detect; then echo "服务已在运行,正在重启..." systemctl restart report-detect else echo "启动服务..." systemctl start report-detect fi # 等待服务启动 sleep 5 # 检查服务状态 if systemctl is-active --quiet report-detect; then echo -e "${GREEN}✓ 服务启动成功${NC}" echo "" echo "========================================" echo -e "${GREEN}部署完成!${NC}" echo "========================================" echo "" echo "服务状态:" systemctl status report-detect --no-pager | head -10 echo "" echo "常用命令:" echo " 查看日志: sudo journalctl -u report-detect -f" echo " 重启服务: sudo systemctl restart report-detect" echo " 停止服务: sudo systemctl stop report-detect" echo "" echo "API端点:" echo " 健康检查: http://localhost:8080/report-detect-api/actuator/health" echo " Flask API: http://localhost:8081/health" echo "" else echo -e "${RED}✗ 服务启动失败${NC}" echo "" echo "查看日志:" journalctl -u report-detect -n 50 --no-pager exit 1 fi