QAUP_Management/deploy/package-all.sh

381 lines
11 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# QAUP 服务器端打包脚本
# 在Ubuntu打包服务器上运行使用已构建的jar文件进行打包
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'
print_message() {
echo -e "${1}${2}${NC}"
}
print_message $BLUE "=== QAUP 服务器端打包脚本 ==="
# 检查基础环境
print_message $BLUE "1. 检查基础环境..."
# 检查操作系统
if [[ "$OSTYPE" != "linux-gnu"* ]]; then
print_message $YELLOW "⚠️ 警告: 当前操作系统为 $OSTYPE建议在Linux上运行"
fi
# 检查Java 21
if ! command -v java &> /dev/null; then
print_message $RED "❌ Java 未安装"
print_message $BLUE "请安装 Java 21: sudo apt install openjdk-21-jdk"
exit 1
fi
JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed 's/[^0-9.]*\([0-9.]*\).*/\1/')
REQUIRED_VERSION="21"
if [[ "$(printf '%s\n' "$REQUIRED_VERSION" "$JAVA_VERSION" | sort -V | head -n1)" != "$REQUIRED_VERSION" ]]; then
print_message $RED "❌ Java 版本不兼容"
print_message $BLUE "当前版本: $JAVA_VERSION, 需要: $REQUIRED_VERSION+"
exit 1
fi
print_message $GREEN "✓ Java 版本检查通过: $JAVA_VERSION"
# 检查Maven
if ! command -v mvn &> /dev/null; then
print_message $RED "❌ Maven 未安装"
print_message $BLUE "请安装 Maven: sudo apt install maven"
exit 1
fi
print_message $GREEN "✓ Maven 版本: $(mvn -version | head -1)"
# 检查Docker和Docker Compose
if ! command -v docker &> /dev/null; then
print_message $RED "❌ Docker 未安装"
exit 1
fi
DOCKER_VERSION=$(docker --version)
print_message $GREEN "✓ Docker 版本: $DOCKER_VERSION"
if ! docker compose version &> /dev/null && ! docker-compose version &> /dev/null; then
print_message $RED "❌ Docker Compose 未安装"
print_message $BLUE "请安装 Docker Compose: sudo apt install docker-compose"
exit 1
fi
print_message $GREEN "✓ Docker Compose 检查通过"
# 检查磁盘空间至少需要5GB
AVAILABLE_SPACE=$(df . | tail -1 | awk '{print $4}')
REQUIRED_SPACE=$((5 * 1024 * 1024)) # 5GB in KB
if [ "$AVAILABLE_SPACE" -lt "$REQUIRED_SPACE" ]; then
print_message $RED "❌ 磁盘空间不足"
print_message $BLUE "可用空间: $(($AVAILABLE_SPACE / 1024 / 1024))GB, 需要: 5GB"
exit 1
fi
print_message $GREEN "✓ 磁盘空间充足: $(($AVAILABLE_SPACE / 1024 / 1024))GB"
# 检查jar文件
print_message $BLUE "2. 检查jar文件..."
JAR_FILE="qaup-admin/target/qaup-admin.jar"
if [ ! -f "$JAR_FILE" ]; then
print_message $YELLOW "未找到jar文件尝试构建..."
# 尝试构建项目
if [ -f "pom.xml" ]; then
print_message $BLUE "执行 Maven 构建..."
mvn clean package -DskipTests
if [ ! -f "$JAR_FILE" ]; then
print_message $RED "❌ 构建失败: $JAR_FILE 仍然不存在"
exit 1
fi
else
print_message $RED "❌ 未找到jar文件: $JAR_FILE"
print_message $BLUE "请先在macOS上构建jar文件并上传到服务器"
exit 1
fi
fi
print_message $GREEN "✓ 找到jar文件: $JAR_FILE"
print_message $BLUE " 文件大小: $(du -sh $JAR_FILE | cut -f1)"
# 验证jar文件是否为有效的Java应用
if ! jar -tf "$JAR_FILE" > /dev/null 2>&1; then
print_message $RED "❌ jar文件损坏或不是有效的JAR文件"
exit 1
fi
print_message $GREEN "✓ jar文件验证通过"
# 准备镜像版本
print_message $BLUE "3. 准备Docker镜像..."
POSTGRES_IMAGE="m.daocloud.io/docker.io/postgis/postgis:17-3.5-alpine"
REDIS_IMAGE="m.daocloud.io/docker.io/library/redis:8.0-alpine"
OPENJDK_IMAGE="m.daocloud.io/docker.io/library/eclipse-temurin:21-jre"
# 检查网络连接
if ! ping -c 1 m.daocloud.io &> /dev/null; then
print_message $YELLOW "⚠️ 网络连接测试失败,可能影响镜像拉取"
fi
print_message $BLUE "拉取基础镜像..."
print_message $BLUE " - PostgreSQL + PostGIS"
if ! docker pull --platform linux/amd64 $POSTGRES_IMAGE; then
print_message $RED "❌ PostgreSQL镜像拉取失败"
exit 1
fi
print_message $BLUE " - Redis"
if ! docker pull --platform linux/amd64 $REDIS_IMAGE; then
print_message $RED "❌ Redis镜像拉取失败"
exit 1
fi
print_message $BLUE " - Java 21 Runtime"
if ! docker pull --platform linux/amd64 $OPENJDK_IMAGE; then
print_message $RED "❌ Java镜像拉取失败"
exit 1
fi
# 导出镜像
print_message $BLUE "4. 导出Docker镜像..."
mkdir -p qaup-deploy
# 检查磁盘空间(镜像包需要额外空间)
EXPECTED_IMAGE_SIZE=$((2 * 1024)) # 预计2GB
if [ "$AVAILABLE_SPACE" -lt "$((EXPECTED_IMAGE_SIZE * 1024))" ]; then
print_message $YELLOW "⚠️ 磁盘空间可能不足预计需要额外2GB空间"
fi
if ! docker save $POSTGRES_IMAGE $REDIS_IMAGE $OPENJDK_IMAGE | gzip > qaup-deploy/images.tar.gz; then
print_message $RED "❌ 镜像导出失败"
exit 1
fi
IMAGE_SIZE=$(du -sh qaup-deploy/images.tar.gz | cut -f1)
print_message $GREEN "✓ 镜像包大小: $IMAGE_SIZE"
# 复制必要文件
print_message $BLUE "5. 准备部署文件..."
# 复制核心应用文件
cp "$JAR_FILE" qaup-deploy/app.jar
if [ $? -eq 0 ]; then
print_message $GREEN "✓ 应用JAR文件已复制"
else
print_message $RED "❌ 应用JAR文件复制失败"
exit 1
fi
# 复制Docker配置
cp deploy/docker-compose.yml qaup-deploy/ || {
print_message $RED "❌ docker-compose.yml 复制失败"
exit 1
}
print_message $GREEN "✓ Docker编排配置已复制"
# 复制应用配置
cp deploy/config.yml qaup-deploy/ || {
print_message $RED "❌ config.yml 复制失败"
exit 1
}
print_message $GREEN "✓ 应用配置文件已复制"
# 复制部署脚本
cp deploy/deploy-all.sh qaup-deploy/ || {
print_message $RED "❌ deploy-all.sh 复制失败"
exit 1
}
chmod +x qaup-deploy/deploy-all.sh
cp deploy/deploy-update.sh qaup-deploy/ || {
print_message $RED "❌ deploy-update.sh 复制失败"
exit 1
}
chmod +x qaup-deploy/deploy-update.sh
cp deploy/qaup-service.sh qaup-deploy/ || {
print_message $RED "❌ qaup-service.sh 复制失败"
exit 1
}
chmod +x qaup-deploy/qaup-service.sh
print_message $GREEN "✓ 部署脚本已复制并设置执行权限"
# 复制数据库相关文件(可选)
if [ -f "deploy/qaup_database_export.sql" ]; then
cp deploy/qaup_database_export.sql qaup-deploy/qaup_database_export.sql
print_message $GREEN "✓ 数据库导出文件已复制"
else
print_message $YELLOW "⚠️ 数据库导出文件不存在"
fi
# 复制文档文件
if [ -f "deploy/DeployGuide.md" ]; then
cp deploy/DeployGuide.md qaup-deploy/
print_message $GREEN "✓ 部署指南已复制"
else
print_message $YELLOW "⚠️ 部署指南不存在"
fi
# 创建必需目录
mkdir -p qaup-deploy/{backup,logs,data/postgres,data/redis}
print_message $GREEN "✓ 目录结构已创建"
# 创建README文件
cat > qaup-deploy/README.md << 'EOF'
# QAUP 部署包
## 目录结构
```
qaup-deploy/
├── app.jar # 应用JAR文件
├── docker-compose.yml # Docker编排配置
├── config.yml # 应用配置文件
├── deploy-all.sh # 一键部署脚本
├── deploy-update.sh # 一键升级脚本
├── qaup-service.sh # 统一服务管理脚本
├── images.tar.gz # Docker镜像包
├── README.md # 本文件
├── backup/ # 备份目录
├── logs/ # 日志目录
└── data/ # 数据目录
├── postgres/ # PostgreSQL数据
└── redis/ # Redis数据
```
## 快速部署
```bash
# 解压和部署
tar -xzf qaup-deploy.tar.gz
cd qaup-deploy
./deploy-all.sh
# 检查状态
docker compose ps
curl http://localhost:8080/actuator/health
```
## 统一服务管理
```bash
# 使用统一服务管理脚本
./qaup-service.sh help # 查看帮助
./qaup-service.sh start # 启动所有服务
./qaup-service.sh status # 查看服务状态
./qaup-service.sh logs qaup-app # 查看应用日志
./qaup-service.sh health # 健康检查
./qaup-service.sh backup # 数据备份
```
## 应用升级
```bash
# 方法1: 使用统一管理脚本(推荐)
./qaup-service.sh update # 将新版本文件重命名为new-app.jar后使用
# 方法2: 使用专用升级脚本
cp /path/to/new/qaup-admin.jar ./new-app.jar
./deploy-update.sh
```
## 管理命令
```bash
# 查看状态
./qaup-service.sh status
# 或
docker compose ps
# 查看日志
./qaup-service.sh logs qaup-app
# 或
docker compose logs -f qaup-app
# 停止服务
./qaup-service.sh stop
# 或
docker compose down
# 重启应用
./qaup-service.sh restart
# 或
docker compose restart qaup-app
```
## 默认信息
- **Web访问**: http://localhost:8080
- **数据库**: localhost:5432 (qaup/qaup123)
- **Redis**: localhost:6379
- **初始账号**: admin/admin123
## 支持
如遇问题,请查看日志:
```bash
docker compose logs qaup-app
```
EOF
print_message $GREEN "✓ README文件已创建"
# 验证部署包完整性
print_message $BLUE "6. 验证部署包完整性..."
REQUIRED_FILES=("app.jar" "docker-compose.yml" "config.yml" "deploy-all.sh" "deploy-update.sh" "qaup-service.sh" "images.tar.gz")
for file in "${REQUIRED_FILES[@]}"; do
if [ ! -f "qaup-deploy/$file" ]; then
print_message $RED "❌ 缺失必要文件: $file"
exit 1
fi
done
print_message $GREEN "✓ 所有必要文件验证通过"
# 创建部署包
print_message $BLUE "7. 创建部署包..."
PACKAGE_NAME="qaup-deploy-$(date +%Y%m%d-%H%M%S).tar.gz"
if tar -czf "$PACKAGE_NAME" -C qaup-deploy .; then
print_message $GREEN "✅ 打包完成: $PACKAGE_NAME"
else
print_message $RED "❌ 打包失败"
exit 1
fi
PACKAGE_SIZE=$(du -sh "$PACKAGE_NAME" | cut -f1)
DEPLOY_DIR_SIZE=$(du -sh qaup-deploy | cut -f1)
print_message $GREEN "✓ 部署包大小: $PACKAGE_SIZE"
print_message $BLUE " 临时目录大小: $DEPLOY_DIR_SIZE"
# 清理临时文件
print_message $BLUE "8. 清理临时文件..."
rm -rf qaup-deploy
print_message $GREEN "✓ 临时目录已清理"
print_message $GREEN "🎉 打包成功完成!"
echo ""
print_message $BLUE "📋 部署说明(生产环境):"
echo ""
echo "⚠️ 由于生产环境安全要求,必须手工文件上传"
echo ""
echo "1. 按安全策略传输部署包到目标服务器:"
echo " scp $PACKAGE_NAME user@生产服务器IP:/opt/qaup/"
echo " 或使用SFTP、文件传输工具等"
echo ""
echo "2. 在生产服务器执行部署:"
echo " ssh user@生产服务器IP"
echo " cd /opt/qaup"
echo " mkdir qaup-deploy && tar -xzf $PACKAGE_NAME -C qaup-deploy"
echo " cd qaup-deploy"
echo " chmod +x *.sh"
echo " ./deploy-all.sh"
echo ""
echo "3. 详细部署说明请查看:"
echo " - 部署指南: DeployGuide.md"
echo ""
print_message $BLUE "📊 打包统计:"
echo " - 部署包: $PACKAGE_NAME ($PACKAGE_SIZE)"
echo " - Java版本: $JAVA_VERSION"
echo " - 打包时间: $(date)"
echo " - 服务器: $(hostname)"
echo ""
print_message $BLUE "📖 文档信息:"
echo " - 部署指南已包含在部署包中: DeployGuide.md"
echo " - 包含完整的生产环境部署和更新说明"
echo ""
print_message $GREEN "🚀 可以开始部署了!"