180 lines
4.5 KiB
Bash
180 lines
4.5 KiB
Bash
#!/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
|