381 lines
11 KiB
Bash
Executable File
381 lines
11 KiB
Bash
Executable File
#!/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 "🚀 可以开始部署了!" |