report-detect/deploy-production.sh

180 lines
4.5 KiB
Bash
Raw Normal View History

2026-03-16 11:57:07 +08:00
#!/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