From 3d822eb6d995b4bf4f28e405f574f71572fce06c Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Tue, 5 Aug 2025 14:37:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BB=BA=E7=AB=8B=E6=96=B0=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/.env.template | 3 + deploy/docker-compose.prod.yml | 1 + deploy/docker-compose.yml | 1 + deploy/simple/DeployGuide.md | 274 ++++++++++++++++++++++ deploy/simple/build-jar.sh | 45 ++++ deploy/simple/build-update.sh | 110 +++++++++ deploy/simple/config.yml | 68 ++++++ deploy/simple/create-init-sql.sh | 71 ++++++ deploy/simple/deploy.sh | 47 ++++ deploy/simple/docker-compose.yml | 67 ++++++ deploy/simple/package.sh | 73 ++++++ deploy/simple/update.sh | 46 ++++ doc/deploy/deploy-design.md | 236 +++++++++++++++++++ qaup-admin/src/main/resources/logback.xml | 2 +- 14 files changed, 1043 insertions(+), 1 deletion(-) create mode 100644 deploy/simple/DeployGuide.md create mode 100644 deploy/simple/build-jar.sh create mode 100644 deploy/simple/build-update.sh create mode 100644 deploy/simple/config.yml create mode 100644 deploy/simple/create-init-sql.sh create mode 100755 deploy/simple/deploy.sh create mode 100644 deploy/simple/docker-compose.yml create mode 100755 deploy/simple/package.sh create mode 100755 deploy/simple/update.sh create mode 100644 doc/deploy/deploy-design.md diff --git a/deploy/.env.template b/deploy/.env.template index 994e879b..e60226d4 100644 --- a/deploy/.env.template +++ b/deploy/.env.template @@ -58,6 +58,9 @@ DATA_DIR=./data # 日志存储目录 LOG_DIR=./logs +# 应用日志路径(容器内路径) +LOG_PATH=/app/logs + # 备份存储目录 BACKUP_DIR=./backup diff --git a/deploy/docker-compose.prod.yml b/deploy/docker-compose.prod.yml index ba6c7831..975199cf 100644 --- a/deploy/docker-compose.prod.yml +++ b/deploy/docker-compose.prod.yml @@ -36,6 +36,7 @@ services: # 生产环境变量 environment: SPRING_PROFILES_ACTIVE: prod + LOG_PATH: /app/logs # 安全配置 MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: health,info,metrics MANAGEMENT_ENDPOINT_HEALTH_SHOW_DETAILS: when_authorized diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 50dbbb42..fe4301a1 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -88,6 +88,7 @@ services: # 应用配置 SERVER_PORT: 8080 UPLOAD_PATH: /app/uploadPath + LOG_PATH: /app/logs # JVM 配置 JVM_OPTS: ${JVM_OPTS:--Dname=qaup-admin.jar -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m} diff --git a/deploy/simple/DeployGuide.md b/deploy/simple/DeployGuide.md new file mode 100644 index 00000000..0f91f5f8 --- /dev/null +++ b/deploy/simple/DeployGuide.md @@ -0,0 +1,274 @@ +# QAUP 系统部署和更新说明 + +## 开发环境操作 + +### 生成程序更新文件 + +当代码修改后,需要生成新的jar文件供客户更新: + +#### 方式一:生成完整更新包(推荐给不熟悉的客户) +```bash +./deploy/simple/build-update.sh +``` +生成包含详细说明的更新包: +- `qaup-admin.jar` - 应用程序 +- `UPDATE-INSTRUCTIONS.md` - 详细更新说明 +- `VERSION-INFO.txt` - 版本信息 + +#### 方式二:快速生成jar文件(适合熟悉的客户) +```bash +./deploy/simple/build-jar.sh +``` +直接生成带时间戳的jar文件,方便快速传输。 + +### 生成完整部署包 +```bash +./deploy/simple/package.sh +``` +生成包含所有组件的完整部署包,用于首次部署或重大版本更新。 + +--- + +## 客户环境操作 + +### 首次部署 + +### 1. 解压部署包 +```bash +unzip qaup-deploy-20250105-143022.zip +cd qaup-deploy +``` + +### 2. 执行部署 +```bash +./deploy.sh +``` + +### 3. 验证部署 +```bash +# 检查服务状态 +docker compose ps + +# 访问系统 +curl http://localhost:8080/actuator/health +``` + +## 程序更新(仅更新jar文件) + +### 更新前准备 + +1. **确认当前系统状态**: + ```bash + cd qaup-deploy + docker compose ps + ``` + +2. **备份重要数据**(可选但推荐): + ```bash + # 备份数据库 + docker exec qaup-postgres pg_dump -U qaup qaup > backup-$(date +%Y%m%d).sql + + # 备份配置文件 + cp config.yml config.yml.backup + ``` + +### 更新步骤 + +### 1. 准备新版本文件 + +#### 如果收到的是完整更新包(.zip文件): +```bash +# 解压更新包 +unzip qaup-update-20250105-143022.zip +cd qaup-update-20250105-143022 + +# 查看更新说明 +cat UPDATE-INSTRUCTIONS.md + +# 复制jar文件到部署目录 +cd ../qaup-deploy +cp ../qaup-update-20250105-143022/qaup-admin.jar new-app.jar +``` + +#### 如果收到的是jar文件: +```bash +cd qaup-deploy +cp /path/to/qaup-admin-20250105-143022.jar new-app.jar +``` + +### 2. 执行程序更新 +```bash +./update.sh +``` + +### 3. 验证更新结果 +```bash +# 检查服务状态 +docker compose ps + +# 检查应用日志 +docker compose logs -f qaup-app + +# 访问系统确认功能正常 +curl http://localhost:8080/actuator/health +``` + +## 更新失败处理 + +如果更新失败,脚本会自动尝试回滚。如果自动回滚也失败: + +### 手动回滚: +```bash +# 停止应用 +docker compose stop qaup-app + +# 恢复备份文件 +cp app.jar.backup.* app.jar + +# 启动应用 +docker compose start qaup-app +``` + +### 检查问题: +```bash +# 查看应用日志 +docker compose logs qaup-app + +# 查看所有服务状态 +docker compose ps -a +``` + +## 配置文件更新 + +如果新版本需要更新配置文件: + +1. **备份当前配置**: + ```bash + cp config.yml config.yml.backup + ``` + +2. **更新配置**: + ```bash + # 编辑配置文件 + vi config.yml + ``` + +3. **重启应用**: + ```bash + docker compose restart qaup-app + ``` + +## 常见问题 + +### Q: 更新后无法访问系统 +A: 检查端口是否被占用,查看应用日志: +```bash +docker compose logs qaup-app +netstat -tlnp | grep 8080 +``` + +### Q: 数据库连接失败 +A: 检查数据库服务状态: +```bash +docker compose logs qaup-postgres +docker exec qaup-postgres pg_isready -U qaup +``` + +### Q: 如何完全重新部署 +A: 如果更新出现严重问题,可以重新部署: +```bash +# 停止所有服务 +docker compose down + +# 清理数据(注意:这会删除所有数据) +rm -rf data/ + +# 重新部署 +./deploy.sh +``` + +## 完整系统重新部署 + +如果需要重新部署整个系统(包括更新Docker镜像、配置等): + +### 1. 获取新的部署包 +```bash +# 解压新的部署包到新目录 +unzip qaup-deploy-new-20250110-100000.zip +cd qaup-deploy-new +``` + +### 2. 迁移数据(如果需要保留数据) +```bash +# 从旧系统备份数据 +cd ../qaup-deploy +docker exec qaup-postgres pg_dump -U qaup qaup > ../data-backup.sql + +# 停止旧系统 +docker compose down + +# 在新系统中恢复数据 +cd ../qaup-deploy-new +./deploy.sh +docker exec -i qaup-postgres psql -U qaup qaup < ../data-backup.sql +``` + +## 操作流程总结 + +### 开发环境 → 客户环境流程 + +#### 程序更新流程: +``` +开发环境: +1. 代码修改完成 +2. ./deploy/simple/build-jar.sh # 生成jar文件 +3. 发送jar文件给客户 + +客户环境: +1. cd qaup-deploy +2. cp new-jar-file.jar new-app.jar # 重命名文件 +3. ./update.sh # 执行更新 +4. 验证更新结果 +``` + +#### 完整部署流程: +``` +开发环境: +1. ./deploy/simple/package.sh # 生成完整部署包 +2. 发送部署包给客户 + +客户环境: +1. unzip qaup-deploy-xxx.zip # 解压部署包 +2. cd qaup-deploy +3. ./deploy.sh # 执行部署 +4. 验证部署结果 +``` + +## 更新记录 + +建议记录每次更新的信息: +- 更新时间 +- 版本号 +- 更新人员 +- 更新类型(程序更新/完整部署) +- 是否成功 +- 遇到的问题 + +示例: +``` +2025-01-05 14:30 - v1.0.1 → v1.0.2 - 张三 - 程序更新 - 成功 +2025-01-10 09:15 - v1.0.2 → v1.0.3 - 李四 - 程序更新 - 失败,已回滚 +2025-01-15 16:00 - v1.0.3 → v1.1.0 - 王五 - 完整部署 - 成功 +``` + +## 文件说明 + +### 开发环境脚本: +- `deploy/simple/build-jar.sh` - 快速生成jar文件 +- `deploy/simple/build-update.sh` - 生成完整更新包 +- `deploy/simple/package.sh` - 生成完整部署包 + +### 客户环境脚本: +- `deploy.sh` - 首次部署脚本 +- `update.sh` - 程序更新脚本 +- `UPGRADE-README.md` - 本说明文档 \ No newline at end of file diff --git a/deploy/simple/build-jar.sh b/deploy/simple/build-jar.sh new file mode 100644 index 00000000..97c8c33d --- /dev/null +++ b/deploy/simple/build-jar.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# QAUP 快速构建jar文件脚本 +# 用于快速生成jar文件供客户更新使用 + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" + +# 颜色输出 +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' + +print_message() { + echo -e "${1}${2}${NC}" +} + +print_message $BLUE "=== QAUP 快速构建 ===" + +# 构建应用 +print_message $BLUE "构建应用..." +cd "$PROJECT_ROOT" +mvn clean package -DskipTests -q + +# 检查并复制jar文件 +JAR_FILE="$PROJECT_ROOT/qaup-admin/target/qaup-admin.jar" +if [ -f "$JAR_FILE" ]; then + # 复制到当前目录,方便传输 + OUTPUT_NAME="qaup-admin-$(date +%Y%m%d-%H%M%S).jar" + cp "$JAR_FILE" "$OUTPUT_NAME" + + print_message $GREEN "✅ 构建完成: $OUTPUT_NAME" + print_message $BLUE "文件大小: $(du -sh "$OUTPUT_NAME" | cut -f1)" + + echo "" + echo "客户更新步骤:" + echo "1. 将 $OUTPUT_NAME 上传到服务器 qaup-deploy 目录" + echo "2. 重命名: cp $OUTPUT_NAME new-app.jar" + echo "3. 执行更新: ./update.sh" +else + echo "❌ jar文件构建失败" + exit 1 +fi \ No newline at end of file diff --git a/deploy/simple/build-update.sh b/deploy/simple/build-update.sh new file mode 100644 index 00000000..b6135d3b --- /dev/null +++ b/deploy/simple/build-update.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +# QAUP 程序更新打包脚本 +# 用于生成仅包含jar文件的更新包 + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' + +print_message() { + echo -e "${1}${2}${NC}" +} + +print_message $BLUE "=== QAUP 程序更新打包 ===" + +# 1. 构建应用 +print_message $BLUE "构建应用..." +cd "$PROJECT_ROOT" +mvn clean package -DskipTests -q + +# 检查jar文件是否生成成功 +JAR_FILE="$PROJECT_ROOT/qaup-admin/target/qaup-admin.jar" +if [ ! -f "$JAR_FILE" ]; then + print_message $RED "❌ jar文件构建失败" + exit 1 +fi + +# 2. 创建更新包目录 +UPDATE_DIR="qaup-update-$(date +%Y%m%d-%H%M%S)" +mkdir -p "$UPDATE_DIR" + +# 3. 复制jar文件 +print_message $BLUE "准备更新文件..." +cp "$JAR_FILE" "$UPDATE_DIR/qaup-admin.jar" + +# 4. 创建更新说明 +cat > "$UPDATE_DIR/UPDATE-INSTRUCTIONS.md" << 'EOF' +# QAUP 程序更新包 + +## 包含内容 +- `qaup-admin.jar` - 新版本应用程序 + +## 更新步骤 + +### 1. 上传文件到服务器 +将 `qaup-admin.jar` 上传到服务器的 qaup-deploy 目录 + +### 2. 重命名文件 +```bash +cd qaup-deploy +cp qaup-admin.jar new-app.jar +``` + +### 3. 执行更新 +```bash +./update.sh +``` + +### 4. 验证更新 +```bash +# 检查服务状态 +docker compose ps + +# 检查应用日志 +docker compose logs -f qaup-app + +# 访问系统确认功能正常 +curl http://localhost:8080/actuator/health +``` + +## 注意事项 +- 更新前建议备份数据库 +- 如果更新失败,脚本会自动回滚 +- 如有问题,请查看完整的部署更新说明文档 +EOF + +# 5. 创建版本信息 +cat > "$UPDATE_DIR/VERSION-INFO.txt" << EOF +QAUP 程序更新包 +构建时间: $(date) +构建主机: $(hostname) +Git提交: $(git rev-parse --short HEAD 2>/dev/null || echo "未知") +Maven版本: $(mvn --version | head -1) +Java版本: $(java -version 2>&1 | head -1) +文件大小: $(du -sh "$JAR_FILE" | cut -f1) +文件MD5: $(md5sum "$JAR_FILE" | cut -d' ' -f1) +EOF + +# 6. 创建更新包 +PACKAGE_NAME="${UPDATE_DIR}.zip" +zip -r "$PACKAGE_NAME" "$UPDATE_DIR/" + +# 7. 清理临时目录 +rm -rf "$UPDATE_DIR" + +print_message $GREEN "✅ 程序更新包创建完成: $PACKAGE_NAME" +print_message $BLUE "包大小: $(du -sh "$PACKAGE_NAME" | cut -f1)" + +echo "" +echo "使用说明:" +echo "1. 将 $PACKAGE_NAME 发送给客户" +echo "2. 客户解压后按照 UPDATE-INSTRUCTIONS.md 操作" +echo "3. 或者直接发送 qaup-admin.jar 文件给客户" \ No newline at end of file diff --git a/deploy/simple/config.yml b/deploy/simple/config.yml new file mode 100644 index 00000000..bd82582f --- /dev/null +++ b/deploy/simple/config.yml @@ -0,0 +1,68 @@ +# QAUP 生产环境配置 +server: + port: 8080 + +# 数据库配置 +spring: + datasource: + url: jdbc:postgresql://qaup-postgres:5432/qaup + username: postgres + password: 123456 + driver-class-name: org.postgresql.Driver + type: com.alibaba.druid.pool.DruidDataSource + druid: + initial-size: 5 + min-idle: 5 + max-active: 20 + max-wait: 60000 + validation-query: SELECT 1 + test-while-idle: true + + # Redis配置 + data: + redis: + host: qaup-redis + port: 6379 + database: 0 + timeout: 10s + + # JPA配置 + jpa: + hibernate: + ddl-auto: none + show-sql: false + +# 应用配置 +qaup: + name: QAUP + version: 1.0.1 + profile: /app/uploads + # 外部接口配置(客户可修改) + external: + airport-api: + base-url: http://192.168.1.100:8090 + username: dianxin + password: dianxin@123 + vehicle-api: + base-url: http://192.168.1.100:8090 + +# 日志配置 +logging: + level: + com.qaup: info + org.springframework: warn + pattern: + console: "%d{HH:mm:ss} %-5level %logger{36} - %msg%n" + +# 数据采集配置 +data: + collector: + interval: 250 + detection: + interval: 1000 + +# 坐标系统配置 +coordinate-system: + airport: + center-longitude: 120.0834104 + center-latitude: 36.35406879 \ No newline at end of file diff --git a/deploy/simple/create-init-sql.sh b/deploy/simple/create-init-sql.sh new file mode 100644 index 00000000..b7d28009 --- /dev/null +++ b/deploy/simple/create-init-sql.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +# 创建简化的数据库初始化脚本 +# 从现有的数据库架构文件生成init.sql + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" + +echo "=== 创建数据库初始化脚本 ===" + +# 输出文件 +INIT_SQL="$SCRIPT_DIR/init.sql" + +# 创建初始化脚本 +cat > "$INIT_SQL" << 'EOF' +-- QAUP 数据库初始化脚本 +-- 简化版本:只创建必要的扩展和导入数据 + +-- 创建PostGIS扩展 +CREATE EXTENSION IF NOT EXISTS postgis; +CREATE EXTENSION IF NOT EXISTS postgis_topology; + +-- 显示扩展信息 +SELECT 'PostGIS扩展安装完成' as message; + +EOF + +# 如果存在数据库架构文件,追加到初始化脚本 +SCHEMA_FILE="$PROJECT_ROOT/deploy/docker/postgres/qaup_database_schema.sql" +if [ -f "$SCHEMA_FILE" ]; then + echo "-- 导入数据库架构" >> "$INIT_SQL" + cat "$SCHEMA_FILE" >> "$INIT_SQL" + echo "✓ 已添加数据库架构" +else + echo "⚠ 未找到数据库架构文件: $SCHEMA_FILE" +fi + +# 添加完整初始数据(优先使用完整数据文件) +COMPLETE_DATA_FILE="$PROJECT_ROOT/deploy/docker/postgres/export/initial_data_complete.sql" +if [ -f "$COMPLETE_DATA_FILE" ]; then + echo "" >> "$INIT_SQL" + echo "-- 导入完整初始数据" >> "$INIT_SQL" + cat "$COMPLETE_DATA_FILE" >> "$INIT_SQL" + echo "✓ 已添加完整初始数据文件" +else + echo "⚠ 未找到完整初始数据文件: $COMPLETE_DATA_FILE" + echo "-- 注意:数据库将只包含基础结构,无初始数据" >> "$INIT_SQL" +fi + +# 添加完成信息 +cat >> "$INIT_SQL" << 'EOF' + +-- 显示数据库信息 +SELECT + current_database() as database_name, + current_user as current_user, + version() as postgresql_version; + +-- 显示表数量 +SELECT + schemaname, + COUNT(*) as table_count +FROM pg_tables +WHERE schemaname = 'public' +GROUP BY schemaname; + +SELECT 'QAUP数据库初始化完成' as message; +EOF + +echo "✅ 初始化脚本创建完成: $INIT_SQL" +echo "文件大小: $(du -sh "$INIT_SQL" | cut -f1)" \ No newline at end of file diff --git a/deploy/simple/deploy.sh b/deploy/simple/deploy.sh new file mode 100755 index 00000000..dd36d290 --- /dev/null +++ b/deploy/simple/deploy.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# QAUP 一键部署脚本 + +set -e + +echo "=== QAUP 一键部署 ===" + +# 检查Docker +if ! command -v docker &> /dev/null; then + echo "❌ Docker 未安装" + exit 1 +fi + +# 载入镜像 +echo "载入Docker镜像..." +docker load -i images.tar.gz + +# 创建数据目录 +echo "创建数据目录..." +mkdir -p data/postgres data/redis logs + +# 启动服务 +echo "启动服务..." +docker compose up -d + +# 等待服务启动 +echo "等待服务启动(60秒)..." +sleep 60 + +# 检查服务状态 +if curl -f -s http://localhost:8080/actuator/health > /dev/null 2>&1; then + echo "✅ 部署成功!" + echo "" + echo "访问地址: http://localhost:8080" + echo "数据库: localhost:5432 (qaup/qaup123)" + echo "Redis: localhost:6379" + echo "" + echo "管理命令:" + echo " 查看状态: docker compose ps" + echo " 查看日志: docker compose logs -f qaup-app" + echo " 停止服务: docker compose down" + echo " 升级应用: ./update.sh" +else + echo "❌ 服务启动失败,请检查日志:" + docker compose logs +fi \ No newline at end of file diff --git a/deploy/simple/docker-compose.yml b/deploy/simple/docker-compose.yml new file mode 100644 index 00000000..ed4f6c24 --- /dev/null +++ b/deploy/simple/docker-compose.yml @@ -0,0 +1,67 @@ +services: + # PostgreSQL 数据库服务 + qaup-postgres: + image: m.daocloud.io/docker.io/postgis/postgis:17-3.5-alpine + container_name: qaup-postgres + restart: unless-stopped + environment: + POSTGRES_DB: qaup + POSTGRES_USER: qaup + POSTGRES_PASSWORD: qaup123 + volumes: + - ./data/postgres:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro + ports: + - "5432:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U qaup"] + interval: 30s + timeout: 10s + retries: 5 + + # Redis 缓存服务 + qaup-redis: + image: m.daocloud.io/docker.io/library/redis:8.0-alpine + container_name: qaup-redis + restart: unless-stopped + command: ["redis-server", "--maxmemory", "256mb", "--maxmemory-policy", "allkeys-lru"] + volumes: + - ./data/redis:/data + ports: + - "6379:6379" + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 30s + timeout: 10s + retries: 3 + + # QAUP 应用服务 + qaup-app: + image: m.daocloud.io/docker.io/library/eclipse-temurin:17-jre + container_name: qaup-app + restart: unless-stopped + environment: + SPRING_PROFILES_ACTIVE: prod + LOG_PATH: /app/logs + volumes: + - ./app.jar:/app/app.jar + - ./config.yml:/app/config.yml + - ./logs:/app/logs + ports: + - "8080:8080" + depends_on: + qaup-postgres: + condition: service_healthy + qaup-redis: + condition: service_healthy + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 120s + command: ["java", "-jar", "/app/app.jar", "--spring.config.location=/app/config.yml"] + +networks: + default: + name: qaup-network \ No newline at end of file diff --git a/deploy/simple/package.sh b/deploy/simple/package.sh new file mode 100755 index 00000000..8601e171 --- /dev/null +++ b/deploy/simple/package.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +# QAUP 简化打包脚本 +# 基于现有复杂方案,简化为一键打包 + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' + +print_message() { + echo -e "${1}${2}${NC}" +} + +print_message $BLUE "=== QAUP 简化打包脚本 ===" + +# 1. 构建应用 +print_message $BLUE "构建应用..." +cd "$PROJECT_ROOT" +mvn clean package -DskipTests -q + +# 2. 准备镜像版本(使用国内镜像加速器) +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:17-jre" + +print_message $BLUE "拉取基础镜像..." +docker pull $POSTGRES_IMAGE +docker pull $REDIS_IMAGE +docker pull $OPENJDK_IMAGE + +# 3. 导出镜像(只导出基础镜像,不需要构建自定义镜像) +print_message $BLUE "导出镜像..." +mkdir -p qaup-deploy +docker save $POSTGRES_IMAGE $REDIS_IMAGE $OPENJDK_IMAGE | gzip > qaup-deploy/images.tar.gz + +# 5. 复制必要文件 +print_message $BLUE "准备部署文件..." +cp qaup-admin/target/qaup-admin.jar qaup-deploy/app.jar +cp deploy/simple/docker-compose.yml qaup-deploy/ +cp deploy/simple/config.yml qaup-deploy/ + +# 复制数据库相关文件 +mkdir -p qaup-deploy/sql +cp deploy/docker/postgres/qaup_database_schema.sql qaup-deploy/sql/ 2>/dev/null || echo "⚠ 数据库架构文件不存在" +cp deploy/docker/postgres/export/initial_data_complete.sql qaup-deploy/sql/ 2>/dev/null || echo "⚠ 完整初始数据文件不存在" + +# 创建数据库初始化脚本 +./deploy/simple/create-init-sql.sh +cp deploy/simple/init.sql qaup-deploy/ + +cp deploy/simple/deploy.sh qaup-deploy/ +cp deploy/simple/update.sh qaup-deploy/ +cp deploy/simple/UPGRADE-README.md qaup-deploy/ + +# 6. 创建部署包 +PACKAGE_NAME="qaup-deploy-$(date +%Y%m%d-%H%M%S).zip" +cd qaup-deploy && zip -r ../$PACKAGE_NAME . && cd .. + +print_message $GREEN "✅ 打包完成: $PACKAGE_NAME" +print_message $BLUE "部署包大小: $(du -sh $PACKAGE_NAME | cut -f1)" + +echo "" +echo "部署说明:" +echo "1. 将 $PACKAGE_NAME 传输到目标服务器" +echo "2. unzip $PACKAGE_NAME && cd qaup-deploy" +echo "3. ./deploy.sh" \ No newline at end of file diff --git a/deploy/simple/update.sh b/deploy/simple/update.sh new file mode 100755 index 00000000..6df51ed2 --- /dev/null +++ b/deploy/simple/update.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# QAUP 一键升级脚本 + +set -e + +echo "=== QAUP 一键升级 ===" + +# 检查新版本文件 +if [ ! -f "new-app.jar" ]; then + echo "❌ 请先将新版本文件重命名为 new-app.jar" + echo " 例如: cp qaup-admin-1.0.2.jar new-app.jar" + exit 1 +fi + +# 备份当前版本 +echo "备份当前版本..." +cp app.jar app.jar.backup.$(date +%Y%m%d-%H%M%S) + +# 停止应用 +echo "停止应用服务..." +docker compose stop qaup-app + +# 替换应用 +echo "更新应用文件..." +cp new-app.jar app.jar + +# 启动应用 +echo "启动应用服务..." +docker compose start qaup-app + +# 等待启动 +echo "等待服务启动(30秒)..." +sleep 30 + +# 检查服务状态 +if curl -f -s http://localhost:8080/actuator/health > /dev/null 2>&1; then + echo "✅ 升级成功!" + echo "备份文件已保存,如有问题可手动回滚" +else + echo "❌ 升级失败,尝试回滚..." + docker compose stop qaup-app + cp app.jar.backup.* app.jar 2>/dev/null || echo "未找到备份文件" + docker compose start qaup-app + echo "请检查日志: docker compose logs qaup-app" +fi \ No newline at end of file diff --git a/doc/deploy/deploy-design.md b/doc/deploy/deploy-design.md new file mode 100644 index 00000000..2d6f6918 --- /dev/null +++ b/doc/deploy/deploy-design.md @@ -0,0 +1,236 @@ +# QAUP 极简离线部署方案 +Spring Boot + Redis + PostgreSQL(一键部署、一键升级) + +## 1. 设计原则 + +- **极简优先**:最少的文件,最少的步骤 +- **离线部署**:预打包所有依赖,无需联网 +- **一键操作**:部署和升级都是一条命令 +- **配置灵活**:关键配置可外部修改 + +## 2. 打包准备(开发环境执行一次) + +### 2.1 打包脚本(package.sh) +```bash +#!/bin/bash +echo "=== QAUP 打包脚本 ===" + +# 1. 构建应用 +mvn clean package -DskipTests + +# 2. 拉取并导出镜像 +docker pull openjdk:17-jre-alpine +docker pull redis:7-alpine +docker pull postgres:15-alpine +docker save openjdk:17-jre-alpine redis:7-alpine postgres:15-alpine | gzip > images.tar.gz + +# 3. 准备部署包 +mkdir -p qaup-deploy +cp qaup-admin/target/qaup-admin.jar qaup-deploy/app.jar +cp deploy/simple/* qaup-deploy/ +cp images.tar.gz qaup-deploy/ + +# 4. 打包 +cd qaup-deploy && zip -r ../qaup-deploy-$(date +%Y%m%d).zip . +echo "打包完成: qaup-deploy-$(date +%Y%m%d).zip" +``` + +### 2.2 部署包结构(极简版) +``` +qaup-deploy.zip +├── images.tar.gz # Docker镜像包 +├── docker-compose.yml # 服务编排 +├── app.jar # 应用程序 +├── config.yml # 外部配置(可修改) +├── init.sql # 数据库初始化脚本 +├── deploy.sh # 一键部署 +└── update.sh # 一键升级 +``` + +## 3. docker-compose.yml(极简版) +```yaml +services: + app: + image: openjdk:17-jre-alpine + container_name: qaup-app + restart: always + ports: + - "8080:8080" + volumes: + - ./app.jar:/app.jar + - ./config.yml:/config.yml + command: ["java", "-jar", "/app.jar", "--spring.config.location=/config.yml"] + depends_on: + - db + - redis + + redis: + image: redis:7-alpine + container_name: qaup-redis + restart: always + command: ["redis-server", "--maxmemory", "256mb", "--maxmemory-policy", "allkeys-lru"] + + db: + image: postgres:15-alpine + container_name: qaup-db + restart: always + environment: + POSTGRES_DB: qaup + POSTGRES_USER: qaup + POSTGRES_PASSWORD: qaup123 + volumes: + - ./data:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql +``` + +## 4. 外部配置文件(config.yml) +```yaml +# 服务器配置 +server: + port: 8080 + +# 数据库配置 +spring: + datasource: + url: jdbc:postgresql://qaup-db:5432/qaup + username: qaup + password: qaup123 + driver-class-name: org.postgresql.Driver + + # Redis配置 + data: + redis: + host: qaup-redis + port: 6379 + database: 0 + +# 应用配置 +qaup: + # 文件上传路径 + profile: /tmp/uploads + # 外部接口配置(客户可修改) + external: + api-host: 192.168.1.100 + api-port: 8090 + +# 日志配置(简化) +logging: + level: + com.qaup: info + pattern: + console: "%d{HH:mm:ss} %-5level %logger{36} - %msg%n" +``` + +## 5. 数据库初始化(init.sql) +```sql +-- 创建基础表结构 +CREATE TABLE IF NOT EXISTS sys_user ( + user_id SERIAL PRIMARY KEY, + user_name VARCHAR(30) NOT NULL, + nick_name VARCHAR(30) NOT NULL, + password VARCHAR(100) DEFAULT '', + status CHAR(1) DEFAULT '0', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- 插入默认管理员 +INSERT INTO sys_user (user_name, nick_name, password) +VALUES ('admin', '管理员', '$2a$10$7JB720yubVSOfvam/RtmyO4wV/hOoLsKpHpJI.VqSb/VXaVzqQqhu') +ON CONFLICT DO NOTHING; + +-- 其他标准数据... +``` + +## 6. 一键部署(deploy.sh) +```bash +#!/bin/bash +echo "=== QAUP 一键部署 ===" + +# 载入镜像 +echo "载入Docker镜像..." +docker load -i images.tar.gz + +# 创建数据目录 +mkdir -p data + +# 启动服务 +echo "启动服务..." +docker compose up -d + +# 等待启动 +echo "等待服务启动(30秒)..." +sleep 30 + +echo "✅ 部署完成!访问: http://localhost:8080" +echo "默认账号: admin / admin123" +``` + +## 7. 客户部署(1条命令) +```bash +unzip qaup-deploy.zip && cd qaup-deploy && ./deploy.sh +``` + +## 8. 一键升级(update.sh) +```bash +#!/bin/bash +echo "=== QAUP 一键升级 ===" + +# 检查新版本文件 +if [ ! -f "new-app.jar" ]; then + echo "❌ 请先将新版本文件重命名为 new-app.jar" + exit 1 +fi + +# 备份当前版本 +cp app.jar app.jar.backup +echo "已备份当前版本" + +# 停止应用 +echo "停止应用服务..." +docker compose stop app + +# 替换应用 +cp new-app.jar app.jar +echo "已更新应用文件" + +# 启动应用 +echo "启动应用服务..." +docker compose start app + +# 等待启动 +echo "等待服务启动(30秒)..." +sleep 30 + +echo "✅ 升级完成!" +echo "如有问题,可执行回滚: cp app.jar.backup app.jar && docker compose restart app" +``` +## 9. 操作总结 + +### 开发环境(一次性) +```bash +./package.sh # 打包部署文件 +``` + +### 客户环境 +```bash +# 首次部署 +unzip qaup-deploy.zip && cd qaup-deploy && ./deploy.sh + +# 日常升级 +./update.sh + +# 查看状态 +docker compose ps + +# 查看日志 +docker compose logs -f app +``` + +## 10. 优势总结 + +✅ **极简部署**:解压 → 运行脚本,2步完成 +✅ **极简升级**:替换jar → 运行脚本,自动完成 +✅ **离线友好**:所有依赖预打包,无需联网 +✅ **配置灵活**:关键配置外部文件,可随时修改 +✅ **自动初始化**:数据库结构和标准数据自动创建 +✅ **一键回滚**:升级失败可快速回滚到上一版本 diff --git a/qaup-admin/src/main/resources/logback.xml b/qaup-admin/src/main/resources/logback.xml index 0431dd27..fdacf927 100644 --- a/qaup-admin/src/main/resources/logback.xml +++ b/qaup-admin/src/main/resources/logback.xml @@ -1,7 +1,7 @@ - +