#!/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 "🚀 可以开始部署了!"