diff --git a/deploy/DeployGuide.md b/deploy/DeployGuide.md index b313e0ca..f4763d7a 100644 --- a/deploy/DeployGuide.md +++ b/deploy/DeployGuide.md @@ -178,7 +178,110 @@ docker exec qaup-postgres pg_isready -U qaup 2025-01-10 | v1.0.2→v1.0.3 | 李四 | 程序更新 | 失败 | 配置错误,已回滚 ``` -## 五、文件说明 +## 五、数据库部署和更新策略 + +### 1. 数据库版本管理 +系统使用Flyway进行数据库版本管理,所有迁移脚本位于`qaup-admin/src/main/resources/db/migration/`目录下。 + +**迁移脚本列表**: +- `V1.0.0__Initial_baseline.sql` - 基线结构(86KB) +- `V1.0.1__Initial_data.sql` - 初始数据(50KB) +- `README.md` - 迁移脚本说明 + +#### Flyway配置(在docker-compose.yml中) +```yaml +SPRING_FLYWAY_ENABLED: true # 启用Flyway +SPRING_FLYWAY_BASELINE_ON_MIGRATE: true # 基线迁移(支持已有数据库) +SPRING_FLYWAY_VALIDATE_ON_MIGRATE: true # 验证迁移 +SPRING_FLYWAY_CLEAN_DISABLED: true # 禁止清理生产数据库 +SPRING_FLYWAY_LOCATIONS: classpath:db/migration # 迁移脚本路径 +``` + +### 2. 数据库部署流程 + +#### 首次部署(全新环境) +```bash +# 1. 启动基础服务(PostgreSQL + Redis) +docker compose up -d qaup-postgres qaup-redis + +# 2. 等待数据库就绪 +sleep 30 + +# 3. 初始化数据库(执行Flyway迁移) +# 应用启动时会自动执行Flyway迁移 +docker compose up -d qaup-app + +# 4. 验证部署 +docker compose ps +curl http://localhost:8080/actuator/health +``` + +#### 已有环境更新 +```bash +# Flyway自动处理数据库迁移 +# 应用启动时会自动检测并执行需要的迁移 +docker compose restart qaup-app + +# 检查迁移状态 +docker exec qaup-postgres psql -U qaup -d qaup -c "SELECT * FROM flyway_schema_history ORDER BY installed_rank;" +``` + +### 3. 数据库迁移脚本管理 + +#### 脚本命名规范 +- `V{版本号}__{描述}.sql` - 版本化迁移脚本 +- `V1.0.0__Initial_baseline.sql` - 基线结构 +- `V1.0.1__Initial_data.sql` - 初始数据 +- `V1.0.2__Add_new_feature.sql` - 新功能 + +#### 迁移类型 +1. **结构迁移** - 修改表结构、索引等 +2. **数据迁移** - 数据清洗、转换等 +3. **函数/存储过程迁移** - 业务逻辑更新 + +### 4. 数据库维护操作 + +#### 数据备份和恢复(仅限紧急情况) +```bash +# 备份数据 +docker exec qaup-postgres pg_dump -U qaup qaup > backup-$(date +%Y%m%d_%H%M%S).sql + +# 恢复数据(生产环境需要谨慎) +cat backup-20250115_143000.sql | docker exec -i qaup-postgres psql -U qaup -d qaup +``` + +#### 数据库状态监控 +```bash +# 查看Flyway迁移状态(应用启动日志) +docker compose logs qaup-app | grep -i flyway + +# 直接查询迁移历史 +docker exec qaup-postgres psql -U qaup -d qaup -c " +SELECT version, description, installed_on +FROM flyway_schema_history +ORDER BY installed_rank;" + +# 检查应用健康状态 +curl http://localhost:8080/actuator/health +``` + +### 5. 数据库更新最佳实践 + +#### 开发环境 +- 可以使用`flyway.clean()`清理数据库 +- 可以使用`flyway.migrate().clean()`重建 + +#### 生产环境 +- 禁止使用`flyway.clean()` +- 优先使用增量迁移脚本 +- 重大变更需要测试环境验证 + +#### 回滚策略 +1. **自动化回滚** - 备份恢复 +2. **脚本化回滚** - 创建回滚脚本 +3. **版本控制** - 通过Flyway版本管理 + +## 六、文件说明 ### 打包环境脚本 - `deploy/package-update.sh` - 生成程序更新包 @@ -186,5 +289,10 @@ docker exec qaup-postgres pg_isready -U qaup ### 生产环境脚本 - `deploy-all.sh` - 首次部署/完全重新部署 -- `deploy-update.sh` - 程序更新脚本 -- `DeployGuide.md` - 本说明文档 \ No newline at end of file +- `deploy-update.sh` - 程序更新脚本(自动处理数据库迁移) +- `DeployGuide.md` - 本说明文档 + +### 数据库脚本目录 +- `src/main/resources/db/migration/` - Flyway迁移脚本 +- `sql/qaup_database_complete_init.sql` - 完整初始化脚本(参考用途) +- `sql/unified_database_migration.sql` - 合并迁移脚本(历史用途) \ No newline at end of file diff --git a/deploy/database-init.sh b/deploy/database-init.sh deleted file mode 100755 index 8ef0b78d..00000000 --- a/deploy/database-init.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -# QAUP 数据库初始化脚本 -# 直接执行完整的数据库初始化SQL文件 - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -echo "=== QAUP 数据库初始化脚本 ===" -echo "版本: 1.0.0" -echo "日期: $(date +%Y-%m-%d %H:%M:%S)" -echo "" - -# 检查必要文件是否存在 -COMPLETE_INIT_FILE="$SCRIPT_DIR/qaup_database_export.sql" -if [ ! -f "$COMPLETE_INIT_FILE" ]; then - echo "❌ 错误: 未找到完整数据库初始化文件" - echo " 文件路径: $COMPLETE_INIT_FILE" - exit 1 -fi - -echo "✅ 找到完整数据库初始化文件: $COMPLETE_INIT_FILE" -echo " 文件大小: $(du -sh "$COMPLETE_INIT_FILE" | cut -f1)" -echo "" - -# 检查PostgreSQL是否可用 -if ! command -v psql &> /dev/null; then - echo "❌ 错误: PostgreSQL客户端(psql)未安装或未在PATH中" - echo " 请确保已安装PostgreSQL并配置环境变量" - exit 1 -fi - -echo "✅ PostgreSQL客户端已检测到: $(psql --version | head -1)" -echo "" - -# 设置默认数据库信息 -DEFAULT_DB="qaup" -DEFAULT_USER="qaup" - -# 询问用户数据库连接信息 -read -p "请输入数据库名称(默认: $DEFAULT_DB): " DB_NAME -DB_NAME=${DB_NAME:-$DEFAULT_DB} - -read -p "请输入数据库用户名(默认: $DEFAULT_USER): " DB_USER -DB_USER=${DB_USER:-$DEFAULT_USER} - -read -s -p "请输入数据库密码: " DB_PASSWORD -echo "" - -# 连接并执行初始化脚本 -echo "开始执行数据库初始化..." -echo "=========================================" - -PGPASSWORD="$DB_PASSWORD" psql -U "$DB_USER" -d "$DB_NAME" -f "$COMPLETE_INIT_FILE" 2>&1 | grep -v "NOTICE" - -if [ $? -eq 0 ]; then - echo "=========================================" - echo "✅ 数据库初始化成功完成!" - echo " 数据库: $DB_NAME" - echo " 用户: $DB_USER" -else - echo "=========================================" - echo "❌ 数据库初始化失败!" - echo " 请检查连接信息和数据库权限" - echo " 确保数据库已经创建: createdb -U $DB_USER $DB_NAME" - exit 1 -fi \ No newline at end of file diff --git a/deploy/package-all.sh b/deploy/package-all.sh index 78e01f71..46b0437a 100755 --- a/deploy/package-all.sh +++ b/deploy/package-all.sh @@ -59,7 +59,7 @@ cp deploy/deploy-update.sh qaup-deploy/ # 复制数据库相关文件 cp deploy/qaup_database_export.sql qaup-deploy/qaup_database_export.sql 2>/dev/null || echo "⚠ 完整初始数据文件不存在" -cp deploy/database-init.sh qaup-deploy/ 2>/dev/null || echo "⚠ 数据库初始化脚本不存在" +# database-init.sh已删除,数据库迁移通过Flyway自动化处理 cp deploy/DeployGuide.md qaup-deploy/ diff --git a/doc/JDK21-升级指南.md b/doc/deploy/JDK21-升级指南.md similarity index 100% rename from doc/JDK21-升级指南.md rename to doc/deploy/JDK21-升级指南.md diff --git a/doc/deploy/Ubuntu部署指南.md b/doc/deploy/Ubuntu部署指南.md index 7e8449fd..d5ad37a6 100644 --- a/doc/deploy/Ubuntu部署指南.md +++ b/doc/deploy/Ubuntu部署指南.md @@ -1,24 +1,26 @@ # Ubuntu部署指南 +> **重要说明**: 本文档描述了现代化的极简部署方案,数据库迁移通过Flyway自动化处理,无需手动执行SQL脚本。 + ## 1. 系统环境准备 ### Ubuntu系统要求 - **操作系统**: Ubuntu 20.04 LTS 或更高版本 - **内存**: 至少 8GB RAM -- **存储**: 至少 10GB 可用空间 +- **存储**: 至少 20GB 可用空间 - **CPU**: 4核或以上 -- **网络**: 稳定的互联网连接 +- **网络**: 稳定的互联网连接(用于下载Docker镜像) ### 安装必要软件 ```bash # 系统更新 sudo apt update && sudo apt upgrade -y -# 安装Java 21 +# 安装Java 21(用于本地编译) sudo apt install -y openjdk-21-jdk java -version # 验证安装 -# 安装Maven +# 安装Maven(用于构建) sudo apt install -y maven mvn -version # 验证安装 @@ -27,269 +29,361 @@ sudo apt install -y docker.io sudo systemctl start docker sudo systemctl enable docker +# 安装Docker Compose +sudo apt install -y docker-compose-plugin + # 将当前用户添加到docker组 sudo usermod -aG docker $USER +newgrp docker # 重新加载组权限 -# 验证Docker +# 验证安装 docker --version +docker compose version ``` -## 2. 获取并编译项目 +## 2. 部署方式选择 + +### 方式一:使用预构建部署包(推荐) ```bash -# 获取项目 +# 1. 解压部署包 +tar -xzf qaup-deploy.tar.gz +cd qaup-deploy + +# 2. 一键部署 +./deploy-all.sh + +# 3. 检查服务状态 +docker compose ps +``` + +### 方式二:源码编译部署 + +```bash +# 1. 获取项目源码 git clone cd QAUP-Management -# 编译项目 +# 2. 编译项目 mvn clean package -DskipTests -# 验证编译结果 -ls -la qaup-admin/target/qaup-admin.jar -``` - -## 3. 部署方式 - -### 3.1 Docker Compose部署(推荐) - -```bash -# 创建部署目录 +# 3. 创建部署目录 mkdir -p ~/qaup-deploy cd ~/qaup-deploy -# 复制部署文件 +# 4. 复制部署文件 cp /path/to/QAUP-Management/deploy/docker-compose.yml . cp /path/to/QAUP-Management/deploy/config.yml . cp /path/to/QAUP-Management/qaup-admin/target/qaup-admin.jar ./app.jar -# 创建数据目录 +# 5. 创建数据目录 mkdir -p data/postgres data/redis logs backup -# 启动服务 +# 6. 启动服务 docker compose up -d -# 检查服务状态 +# 7. 检查服务状态 docker compose ps ``` -### 3.2 快速测试部署 +### 3.1 部署包内容说明 -> **注意**: 仅用于快速测试 - -```bash -# 创建运行目录 -mkdir -p ~/qaup-test -cd ~/qaup-test - -# 复制jar文件 -cp /path/to/QAUP-Management/qaup-admin/target/qaup-admin.jar ./ - -# 启动数据库和缓存服务 -docker run --name qaup-postgres -e POSTGRES_DB=qaup -e POSTGRES_USER=qaup -e POSTGRES_PASSWORD=qaup123 -p 5432:5432 -d postgis/postgis:17-3.5-alpine -docker run --name qaup-redis -p 6379:6379 -d redis:8.0-alpine - -# 等待服务启动 -sleep 30 - -# 运行应用 -java -jar qaup-admin.jar --spring.profiles.active=dev +``` +qaup-deploy/ +├── deploy-all.sh # 一键部署脚本 +├── deploy-update.sh # 一键更新脚本 +├── docker-compose.yml # Docker编排配置 +├── config.yml # 应用配置文件 +├── app.jar # 应用JAR文件 +└── images.tar.gz # 预拉取的Docker镜像包 ``` -## 4. 服务管理 +### 3.2 现代化特性说明 -### 启动/停止/重启 +✅ **自动化数据库迁移**: Flyway在应用启动时自动执行数据库迁移 +✅ **PostGIS支持**: 内置地理空间数据处理能力 +✅ **健康检查**: 自动监控服务状态和依赖关系 +✅ **零停机升级**: 只重启应用服务,数据库保持运行 +✅ **离线部署**: 预打包镜像,无需互联网连接 + +## 3. 服务管理 + +### 3.1 基本服务管理 ```bash -# 启动服务 +# 进入部署目录 cd ~/qaup-deploy + +# 启动所有服务 docker compose up -d -# 停止服务 +# 停止所有服务 docker compose down -# 重启应用服务 +# 重启应用服务(不影响数据库) docker compose restart qaup-app # 查看服务状态 docker compose ps -# 查看日志 +# 查看应用日志 docker compose logs -f qaup-app + +# 查看数据库日志 +docker compose logs qaup-postgres + +# 查看Redis日志 +docker compose logs qaup-redis + +# 查看系统资源使用 +docker stats ``` -## 5. 访问系统 +### 3.2 监控数据库迁移状态 +```bash +# 查看Flyway迁移历史 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT * FROM flyway_schema_history ORDER BY installed_rank;" -### 系统地址 +# 查看应用日志中的迁移信息 +docker compose logs qaup-app | grep -i flyway + +# 查看最近的迁移记录 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT version, description, installed_on FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 3;" +``` + +## 4. 访问系统 + +### 4.1 系统地址 - **Web管理**: http://:8080 - **WebSocket**: ws://:8080/collision - **健康检查**: http://:8080/actuator/health +- **API文档**: http://:8080/doc.html -### 初始登录 +### 4.2 初始登录 - **用户名**: admin - **密码**: admin123 -## 6. 应用更新 +### 4.3 快速验证命令 +```bash +# 健康检查(验证服务是否正常) +curl http://localhost:8080/actuator/health -### 6.1 基本更新流程 +# 检查容器中Java版本 +docker exec qaup-app java -version + +# 数据库连接测试 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT version();" + +# Redis连接测试 +docker exec -it qaup-redis redis-cli ping +``` + +## 5. 应用更新 + +### 5.1 一键升级(推荐) + +使用现代化的升级脚本,支持自动备份、版本检查和回滚: ```bash -# 备份当前版本 +# 1. 复制新版本文件并重命名为 new-app.jar +cp /path/to/new/qaup-admin.jar ~/qaup-deploy/new-app.jar + +# 2. 进入部署目录 cd ~/qaup-deploy -cp app.jar app.jar.backup.$(date +%Y%m%d_%H%M%S) -# 替换新版本 -cp /path/to/new/qaup-admin.jar ./app.jar +# 3. 执行自动升级 +./deploy-update.sh -# 重启应用 -docker compose restart qaup-app - -# 验证更新 -curl http://localhost:8080/actuator/health +# 升级过程包括: +# ✅ Java版本兼容性检查 +# ✅ 数据库自动备份 +# ✅ 应用服务重启 +# ✅ Flyway自动迁移 +# ✅ 健康检查验证 +# ✅ 自动回滚(如需要) ``` -### 6.2 Java版本冲突解决 - -如果遇到 `UnsupportedClassVersionError` 错误,表示编译的jar文件与容器中Java版本不匹配: - -**错误示例**: -``` -Exception in thread "main" java.lang.UnsupportedClassVersionError: -com/qaup/QuapApplication has been compiled by a more recent version of the Java Runtime -(class file version 65.0), this version of the Java Runtime only recognizes -class file versions up to 61.0 -``` - -**解决方案**: - -1. **检查Docker镜像配置**: - 确保 `docker-compose.yml` 中使用Java 21镜像: - ```yaml - # QAUP 应用服务 - qaup-app: - image: m.daocloud.io/docker.io/library/eclipse-temurin:21-jre - ``` - -2. **修改并重新部署**: - ```bash - # 停止服务 - docker compose down - - # 备份原文件 - cp docker-compose.yml docker-compose.yml.bak - - # 修改Java版本(如果需要) - sed -i 's/eclipse-temurin:17-jre/eclipse-temurin:21-jre/' docker-compose.yml - - # 重新启动服务 - docker compose up -d - ``` - -3. **验证Java版本**: - ```bash - # 检查容器中Java版本 - docker exec qaup-app java -version - ``` - -### 6.3 完整更新流程 - -当遇到容器名称冲突或其他问题时,使用完整的更新流程: +### 5.2 手动升级流程 ```bash # 进入部署目录 cd ~/qaup-deploy -# 1. 停止现有服务 -docker compose down +# 1. 数据库备份(重要) +docker exec qaup-postgres pg_dump -U qaup qaup > backup/qaup-backup-$(date +%Y%m%d_%H%M%S).sql -# 2. 确认所有容器已停止 -docker ps -a | grep qaup - -# 3. 如果还有残留容器,强制删除 -docker rm -f $(docker ps -aq --filter name=qaup) - -# 4. 备份当前jar文件 +# 2. 备份当前版本 cp app.jar app.jar.backup.$(date +%Y%m%d_%H%M%S) -# 5. 替换新版本 +# 3. 替换新版本 cp /path/to/new/qaup-admin.jar ./app.jar -# 6. 启动新的服务 -docker compose up -d +# 4. 重启应用服务(数据库保持运行) +docker compose restart qaup-app -# 7. 检查服务状态 -docker compose ps +# 5. 等待启动和迁移完成(约2分钟) +echo "等待应用启动和数据库迁移..." +sleep 120 -# 8. 验证更新 -curl -s http://localhost:8080/actuator/health | jq +# 6. 验证升级结果 +if curl -f -s http://localhost:8080/actuator/health > /dev/null; then + echo "✅ 升级成功!" +else + echo "❌ 升级失败,开始回滚..." + # 恢复版本 + LATEST_BACKUP=$(ls -t app.jar.backup.* 2>/dev/null | head -1) + cp "$LATEST_BACKUP" app.jar + docker compose restart qaup-app +fi ``` -### 6.4 故障排除 +### 5.3 监控升级过程 -#### 6.4.1 容器名称冲突 - -如果遇到容器名称冲突错误: -``` -Error response from daemon: Conflict. The container name "/qaup-app" is already in use -``` - -解决方法: ```bash -# 方式1:完全重建 -docker compose down -docker rm -f $(docker ps -aq --filter name=qaup) -docker compose up -d +# 实时查看应用日志(包含Flyway迁移信息) +docker compose logs -f qaup-app -# 方式2:强制重新创建 -docker compose up -d --force-recreate +# 检查Flyway迁移状态 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT version, description, installed_on FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 5;" -# 方式3:只重新创建特定服务 -docker compose up -d --force-recreate qaup-app +# 查看最近的迁移记录 +docker compose logs qaup-app | grep -i "flyway.*migrated" ``` -#### 6.4.2 Java版本验证 +### 5.4 故障排除 -确认容器中Java版本与编译版本匹配: +#### 5.4.1 Java版本兼容性错误 + +如果遇到 `UnsupportedClassVersionError`: +``` +Error: A JNI error has occurred, please check your installation and try again +Error: Could not find or load main class +``` + +**解决方案**: ```bash -# 查看容器Java版本 +# 1. 检查容器Java版本 docker exec qaup-app java -version -# 如果需要,检查镜像信息 -docker inspect qaup-app | grep -i java +# 2. 验证jar文件编译版本 +javap -cp app.jar -version + +# 3. 如果版本不匹配,重新编译项目 +mvn clean package -DskipTests + +# 4. 确认Docker镜像使用Java 21 +grep "eclipse-temurin.*21" docker-compose.yml ``` -## 7. 数据备份 +#### 5.4.2 数据库连接问题 -```bash -# 数据库备份 -docker exec qaup-postgres pg_dump -U qaup qaup > backup-$(date +%Y%m%d).sql - -# 日志轮转(保留最近7天) -find ~/qaup-deploy/logs -name "*.log" -mtime +7 -delete -``` - -## 8. 常见问题 - -### 应用启动失败 -```bash -# 查看详细日志 -docker compose logs qaup-app - -# 检查数据库连接 -docker compose logs qaup-postgres -docker exec qaup-postgres pg_isready -U qaup -``` - -### 端口被占用 -```bash -# 检查端口使用情况 -netstat -tlnp | grep :8080 - -# 停止占用端口的进程 -sudo kill -9 $(lsof -t -i:8080) -``` - -### 数据库连接失败 +如果迁移失败: ```bash # 检查数据库服务 docker compose ps docker exec qaup-postgres pg_isready -U qaup -``` \ No newline at end of file +``` + +## 9. 快速操作指南 + +### 9.1 开发环境快速部署 +```bash +# 克隆项目并编译 +git clone +cd QAUP-Management +mvn clean package -DskipTests + +# 使用部署脚本打包 +./deploy/package-all.sh + +# 解压并部署 +tar -xzf qaup-deploy.tar.gz +cd qaup-deploy +./deploy-all.sh +``` + +### 9.2 生产环境升级 +```bash +cd qaup-deploy + +# 复制新版本 +cp /path/to/new/qaup-admin.jar ./new-app.jar + +# 执行自动升级 +./deploy-update.sh + +# 验证升级结果 +curl http://localhost:8080/actuator/health +``` + +### 9.3 日常运维检查 +```bash +cd qaup-deploy + +# 检查服务状态 +docker compose ps + +# 查看最近日志 +docker compose logs --tail=50 qaup-app + +# 检查数据库迁移状态 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT version, description, installed_on FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 3;" + +# 系统健康检查 +curl -s http://localhost:8080/actuator/health | jq +``` + +### 9.4 缓存优化 +```bash +# 监控Redis内存使用 +docker exec -it qaup-redis redis-cli INFO memory + +# 清理过期缓存 +docker exec -it qaup-redis redis-cli FLUSHDB +``` + +## 10. 现代化部署优势 + +### 10.1 核心特性 +✅ **极简操作**: 解压 → 运行脚本,2步完成部署 +✅ **自动迁移**: Flyway处理数据库版本管理,无需手动SQL +✅ **零停机升级**: 只重启应用服务,数据库持续运行 +✅ **PostGIS支持**: 内置地理空间数据处理能力 +✅ **健康监控**: 自动化服务依赖检查和状态监控 +✅ **离线部署**: 预打包Docker镜像,无需互联网 +✅ **一键回滚**: 升级失败自动回滚到上一版本 +✅ **版本兼容**: Java 21运行时,确保版本一致性 + +### 10.2 与传统方案对比 + +| 特性 | 传统方案 | 现代化方案 | +|------|----------|------------| +| 部署步骤 | 手动配置SQL、修改配置、重启服务 | 解压脚本、自动迁移、一键完成 | +| 数据库迁移 | 手动执行SQL脚本,易出错 | Flyway自动版本管理 | +| 停机时间 | 需要停机维护 | 零停机升级 | +| 回滚复杂度 | 手动恢复数据库和配置 | 自动回滚机制 | +| 环境一致性 | 容易出现环境差异 | 容器化确保一致性 | +| 地理空间 | 需要额外安装PostGIS | 内置PostGIS支持 | + +### 10.3 技术架构 +- **运行时**: Java 21 + Spring Boot 3 +- **数据库**: PostgreSQL 17 + PostGIS 3.5 +- **缓存**: Redis 8 +- **容器化**: Docker + Docker Compose +- **迁移工具**: Flyway自动化版本管理 +- **监控**: Spring Boot Actuator + 健康检查 + +--- + +## 支持和帮助 + +如遇到问题,请检查: +1. 系统要求和依赖软件版本 +2. Docker和Docker Compose安装状态 +3. 网络连接和防火墙配置 +4. 磁盘空间和文件权限 +5. 应用日志和数据库日志 + +更多详细信息请参考: +- [deploy-design.md](./deploy-design.md) - 完整部署设计文档 +- [environment.md](./environment.md) - 环境配置指南 +- [ADXP_WebSocket.md](./ADXP_WebSocket.md) - WebSocket服务说明 \ No newline at end of file diff --git a/doc/deploy/database_migration.md b/doc/deploy/database_migration.md deleted file mode 100644 index bfdb568f..00000000 --- a/doc/deploy/database_migration.md +++ /dev/null @@ -1,142 +0,0 @@ -# PostgreSQL 数据库迁移指南 - -## 概述 -本文档描述如何将本地 PostgreSQL 数据库完全覆盖导入到远程服务器。 - -**场景:** -- 本地数据库用户:postgres -- 远程数据库用户:qaup -- 数据库名称:qaup -- 操作方式:完全覆盖 - -## 第一步:本地数据库导出 - -### 导出完整数据库 -```bash -# 导出数据库(包含结构和数据,处理用户名差异) -pg_dump -h localhost -U postgres -d qaup --no-owner --no-privileges --clean --if-exists -f qaup_database_export.sql -``` - -**参数说明:** -- `--no-owner`: 不包含对象所有者信息,避免用户名冲突 -- `--no-privileges`: 不包含权限设置,导入后重新设置权限 -- `--clean --if-exists`: 清理现有对象(如果存在) -- `-f`: 指定输出文件名 - -## 第二步:远程服务器完全覆盖 - -```bash -# 1. 删除现有数据库 -psql -U qaup -d postgres -c "DROP DATABASE IF EXISTS qaup;" - -# 2. 重新创建数据库 -psql -U qaup -d postgres -c "CREATE DATABASE qaup OWNER qaup;" - -# 3. 设置PostGIS扩展 -psql -U qaup -d qaup -c "CREATE EXTENSION IF NOT EXISTS postgis;" - -# 4. 导入数据 -psql -U qaup -d qaup -f qaup_database_export.sql -``` - -## 第三步:验证导入结果 - -### 检查数据库结构 -```bash -# 查看所有表 -psql -U qaup -d qaup -c "\dt" - -# 查看特定表结构 -psql -U qaup -d qaup -c "\d traffic_lights" -``` - -### 验证数据完整性 -```bash -# 检查关键表的数据量 -psql -U qaup -d qaup -c "SELECT count(*) FROM traffic_lights;" -psql -U qaup -d qaup -c "SELECT count(*) FROM intersections;" -psql -U qaup -d qaup -c "SELECT count(*) FROM sys_vehicle_info;" -``` - -### 检查用户权限 -```bash -# 确保qaup用户拥有所有表的权限 -psql -U qaup -d qaup -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO qaup;" -psql -U qaup -d qaup -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO qaup;" -``` - -## 注意事项 - -1. **备份重要性**:操作前确保远程数据库已备份(如有重要数据) -2. **网络连接**:确保网络稳定,大数据库传输可能需要较长时间 -3. **磁盘空间**:确认远程服务器有足够存储空间 -4. **权限检查**:确保qaup用户有CREATE DATABASE权限(方案A) -5. **应用停机**:建议在应用停机时间窗口执行,避免数据不一致 - -## 故障排除 - -### 连接失败 -```bash -# 检查用户权限 -psql -U qaup -d postgres -c "SELECT current_user;" -``` - -### 导入错误 -```bash -# 查看详细错误信息 -psql -U qaup -d qaup -f qaup_database_export.sql 2>&1 | tee import.log -``` - -### 权限问题 -```bash -# 重置所有权限 -psql -U qaup -d qaup -c " -GRANT ALL PRIVILEGES ON DATABASE qaup TO qaup; -GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO qaup; -GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO qaup; -GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO qaup; -" -``` - -## 完成后清理 - -```bash -# 删除本地导出文件(可选) -rm qaup_database_export.sql - -# 删除临时脚本(如果使用了方案B) -rm drop_tables.sql -``` - -## Java版本兼容性注意事项 - -如果在执行数据库迁移后更新应用,需要注意Java版本兼容性: - -### 版本匹配检查 -- **编译版本**: 确保应用jar文件在Java 21环境下编译 -- **运行版本**: Docker容器中运行Java 21 - -### 版本不匹配错误示例 -如果遇到 `UnsupportedClassVersionError` 错误: -``` -class file has been compiled by a more recent version of the Java Runtime -(class file version 65.0), this version of the Java Runtime only recognizes -class file versions up to 61.0 -``` - -### 解决方案 -1. 确认Docker镜像使用Java 21: - ```yaml - image: eclipse-temurin:21-jre - ``` - -2. 检查容器Java版本: - ```bash - docker exec java -version - ``` - ---- - -**创建时间:** 2025-09-25 -**适用版本:** PostgreSQL 12+ -**测试环境:** QAUP-Management 1.0.1 \ No newline at end of file diff --git a/doc/deploy/deploy-design.md b/doc/deploy/deploy-design.md index 9a72ad3d..177688c0 100644 --- a/doc/deploy/deploy-design.md +++ b/doc/deploy/deploy-design.md @@ -1,5 +1,5 @@ # QAUP 极简离线部署方案 -Spring Boot + Redis + PostgreSQL(一键部署、一键升级) +Spring Boot + Redis + PostgreSQL with PostGIS(一键部署、一键升级) ## 1. 设计原则 @@ -7,80 +7,139 @@ Spring Boot + Redis + PostgreSQL(一键部署、一键升级) - **离线部署**:预打包所有依赖,无需联网 - **一键操作**:部署和升级都是一条命令 - **配置灵活**:关键配置可外部修改 +- **自动化迁移**:数据库版本自动管理(Flyway) ## 2. 打包准备(开发环境执行一次) -### 2.1 打包脚本(package.sh) +### 2.1 打包脚本(package-all.sh) ```bash #!/bin/bash echo "=== QAUP 打包脚本 ===" -# 1. 构建应用 +# 1. 构建应用(在macOS上) mvn clean package -DskipTests -# 2. 拉取并导出镜像 -docker pull openjdk:21-jre-alpine -docker pull redis:8-alpine -docker pull postgres:17-3.5-alpine -docker save openjdk:21-jre-alpine redis:8-alpine postgres:17-3.5-alpine | gzip > images.tar.gz +# 2. 拉取并导出镜像(在服务器上) +docker pull m.daocloud.io/docker.io/postgis/postgis:17-3.5-alpine +docker pull m.daocloud.io/docker.io/library/redis:8.0-alpine +docker pull m.daocloud.io/docker.io/library/eclipse-temurin:21-jre + +# 导出镜像 +docker save m.daocloud.io/docker.io/postgis/postgis:17-3.5-alpine \ + m.daocloud.io/docker.io/library/redis:8.0-alpine \ + m.daocloud.io/docker.io/library/eclipse-temurin:21-jre | 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 deploy/docker-compose.yml qaup-deploy/ +cp deploy/config.yml 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" +tar -czf qaup-deploy-$(date +%Y%m%d-%H%M%S).tar.gz -C qaup-deploy . +echo "打包完成: qaup-deploy-$(date +%Y%m%d-%H%M%S).tar.gz" ``` -### 2.2 部署包结构(极简版) +### 2.2 部署包结构 ``` -qaup-deploy.zip -├── images.tar.gz # Docker镜像包 -├── docker-compose.yml # 服务编排 -├── app.jar # 应用程序 -├── config.yml # 外部配置(可修改) -├── init.sql # 数据库初始化脚本 -├── deploy.sh # 一键部署 -└── update.sh # 一键升级 +qaup-deploy.tar.gz +├── images.tar.gz # Docker镜像包(PostGIS + Redis + Java21) +├── docker-compose.yml # 服务编排(包含健康检查) +├── app.jar # 应用程序 +├── config.yml # 外部配置(可修改) +├── deploy-all.sh # 一键部署脚本 +├── deploy-update.sh # 一键升级脚本 +├── DeployGuide.md # 详细部署指南 +└── qaup_database_export.sql # 完整数据库备份(可选) ``` -## 3. docker-compose.yml(极简版) +## 3. docker-compose.yml(当前实际版本) ```yaml services: - app: - image: openjdk:21-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:8-alpine - container_name: qaup-redis - restart: always - command: ["redis-server", "--maxmemory", "256mb", "--maxmemory-policy", "allkeys-lru"] - - db: - image: postgres:17-3.5-alpine - container_name: qaup-db - restart: always + # PostgreSQL + PostGIS 数据库服务 + 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:/var/lib/postgresql/data - - ./init.sql:/docker-entrypoint-initdb.d/init.sql + - ./data/postgres:/var/lib/postgresql/data + ports: + - "5432:5432" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U qaup"] + interval: 30s + timeout: 10s + retries: 3 + + # 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 应用服务(Java 21) + qaup-app: + image: m.daocloud.io/docker.io/library/eclipse-temurin:21-jre + container_name: qaup-app + restart: unless-stopped + environment: + SPRING_PROFILES_ACTIVE: prod + LOG_PATH: /app/logs + # 数据库连接配置 + DB_HOST: qaup-postgres + DB_PORT: 5432 + DB_NAME: qaup + DB_USER: qaup + DB_PASSWORD: qaup123 + # Flyway配置(自动化数据库迁移) + SPRING_FLYWAY_ENABLED: true + SPRING_FLYWAY_BASELINE_ON_MIGRATE: true + SPRING_FLYWAY_VALIDATE_ON_MIGRATE: true + SPRING_FLYWAY_CLEAN_DISABLED: true + volumes: + - ./app.jar:/app/app.jar + - ./config.yml:/app/config.yml + - ./logs:/app/logs + - ./backup:/app/backup + 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: [ + "sh", "-c", + "echo 'Waiting for database to be ready...' && + sleep 10 && + echo 'Starting QAUP application with Flyway migration...' && + java -jar /app/app.jar --spring.config.location=/app/config.yml" + ] + +networks: + default: + name: qaup-network ``` ## 4. 外部配置文件(config.yml) @@ -89,21 +148,6 @@ services: 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: # 文件上传路径 @@ -113,64 +157,95 @@ qaup: api-host: 192.168.1.100 api-port: 8090 -# 日志配置(简化) +# 日志配置 logging: level: - com.qaup: info + com.qaup: INFO pattern: - console: "%d{HH:mm:ss} %-5level %logger{36} - %msg%n" + console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" + file: + name: /app/logs/qaup.log + +# 注意:数据库和Redis配置通过环境变量设置 ``` -## 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 -); +## 5. 自动化数据库迁移(Flyway) --- 插入默认管理员 -INSERT INTO sys_user (user_name, nick_name, password) -VALUES ('admin', '管理员', '$2a$10$7JB720yubVSOfvam/RtmyO4wV/hOoLsKpHpJI.VqSb/VXaVzqQqhu') -ON CONFLICT DO NOTHING; - --- 其他标准数据... +### 5.1 迁移脚本位置 +``` +qaup-admin/src/main/resources/db/migration/ +├── V1.0.0__Initial_baseline.sql # 数据库基线结构(86KB) +├── V1.0.1__Initial_data.sql # 初始数据(50KB) +└── README.md # 迁移脚本编写规范 ``` -## 6. 一键部署(deploy.sh) +### 5.2 自动迁移机制 +- **应用启动时自动执行**:无需手动运行SQL脚本 +- **版本控制**:所有迁移按版本顺序执行 +- **幂等性**:安全重复执行,不会重复创建对象 +- **健康检查**:依赖数据库健康状态启动应用 + +### 5.3 迁移状态查询 +```bash +# 查看应用日志中的迁移信息 +docker compose logs qaup-app | grep -i flyway + +# 直接查询数据库 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT * FROM flyway_schema_history ORDER BY installed_rank;" +``` + +## 6. 一键部署(deploy-all.sh) ```bash #!/bin/bash echo "=== QAUP 一键部署 ===" +# 检查Docker +if ! command -v docker &> /dev/null; then + echo "❌ Docker 未安装" + exit 1 +fi + # 载入镜像 echo "载入Docker镜像..." docker load -i images.tar.gz # 创建数据目录 -mkdir -p data +echo "创建数据目录..." +mkdir -p data/postgres data/redis logs # 启动服务 echo "启动服务..." docker compose up -d -# 等待启动 -echo "等待服务启动(30秒)..." -sleep 30 +# 等待服务启动 +echo "等待服务启动(60秒)..." +sleep 60 -echo "✅ 部署完成!访问: http://localhost:8080" -echo "默认账号: admin / admin123" +# 检查服务状态 +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 " 升级应用: ./deploy-update.sh" +else + echo "❌ 服务启动失败,请检查日志:" + docker compose logs +fi ``` ## 7. 客户部署(1条命令) ```bash -unzip qaup-deploy.zip && cd qaup-deploy && ./deploy.sh +tar -xzf qaup-deploy.tar.gz && cd qaup-deploy && ./deploy-all.sh ``` -## 8. 一键升级(update.sh) +## 8. 一键升级(deploy-update.sh) ```bash #!/bin/bash echo "=== QAUP 一键升级 ===" @@ -186,86 +261,180 @@ echo "验证Java版本兼容性..." if command -v java &> /dev/null; then LOCAL_JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed 's/[^0-9.]*\([0-9.]*\).*/\1/') echo "本地Java版本: $LOCAL_JAVA_VERSION" + echo "容器Java版本: eclipse-temurin:21-jre" fi # 备份当前版本 -cp app.jar app.jar.backup -echo "已备份当前版本" +echo "备份当前版本..." +cp app.jar app.jar.backup.$(date +%Y%m%d_%H%M%S) -# 停止应用 +# 数据库备份(重要) +echo "备份数据库..." +docker exec qaup-postgres pg_dump -U qaup qaup > backup/qaup-backup-$(date +%Y%m%d_%H%M%S).sql + +# 停止应用(不影响数据库) echo "停止应用服务..." -docker compose stop app +docker compose stop qaup-app # 替换应用 cp new-app.jar app.jar echo "已更新应用文件" -# 启动应用 +# 启动应用(Flyway自动处理数据库迁移) echo "启动应用服务..." -docker compose start app +docker compose start qaup-app -# 等待启动 -echo "等待服务启动(30秒)..." -sleep 30 +# 等待启动和迁移完成 +echo "等待应用启动和数据库迁移(120秒)..." +sleep 120 -echo "✅ 升级完成!" -echo "如有问题,可执行回滚: cp app.jar.backup app.jar && docker compose restart app" +# 检查升级结果 +if curl -f -s http://localhost:8080/actuator/health > /dev/null 2>&1; then + echo "✅ 升级成功!" + echo "" + echo "Flyway迁移状态:" + docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT version, description, installed_rank FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 5;" +else + echo "❌ 升级失败,开始回滚..." + # 恢复jar文件 + LATEST_BACKUP=$(ls -t app.jar.backup.* 2>/dev/null | head -1) + if [ -n "$LATEST_BACKUP" ]; then + cp "$LATEST_BACKUP" app.jar + docker compose restart qaup-app + echo "✅ 已回滚到版本: $LATEST_BACKUP" + else + echo "❌ 未找到备份文件,请手动处理" + fi +fi ``` ## 9. Java版本兼容性注意事项 ### 9.1 编译与运行环境匹配 - **编译环境**: 确保项目在Java 21环境下编译 -- **运行环境**: Docker镜像必须与编译版本匹配(`openjdk:21-jre-alpine` 或 `eclipse-temurin:21-jre`) +- **运行环境**: Docker镜像使用 `eclipse-temurin:21-jre` ### 9.2 常见版本错误 如果遇到 `UnsupportedClassVersionError`,确认以下配置: ```yaml # docker-compose.yml 中必须使用Java 21镜像 services: - app: - # 错误示例(可能导致版本不匹配) - # image: openjdk:17-jre-alpine - + qaup-app: # 正确示例 - image: openjdk:21-jre-alpine + image: m.daocloud.io/docker.io/library/eclipse-temurin:21-jre ``` ### 9.3 版本验证命令 ```bash # 检查容器中Java版本 -docker exec java -version +docker exec qaup-app java -version # 检查jar文件编译版本 -javap -cp -version +javap -cp app.jar -version + +# 快速健康检查 +curl http://localhost:8080/actuator/health ``` -## 9. 操作总结 + +## 10. 系统维护操作 + +### 10.1 日常运维命令 +```bash +# 查看服务状态 +docker compose ps + +# 查看应用日志 +docker compose logs -f qaup-app + +# 查看数据库日志 +docker compose logs qaup-postgres + +# 查看Redis日志 +docker compose logs qaup-redis + +# 查看系统资源使用 +docker stats + +# 数据库连接测试 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT version();" + +# Redis连接测试 +docker exec -it qaup-redis redis-cli ping +``` + +### 10.2 监控数据库迁移状态 +```bash +# 查看Flyway迁移历史 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT * FROM flyway_schema_history ORDER BY installed_rank;" + +# 查看应用日志中的迁移信息 +docker compose logs qaup-app | grep -i flyway + +# 查看最近的迁移记录 +docker exec -it qaup-postgres psql -U qaup -d qaup -c "SELECT version, description, installed_on FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 3;" +``` + +### 10.3 数据备份和恢复 +```bash +# 手动备份数据库 +docker exec qaup-postgres pg_dump -U qaup qaup > backup/manual-backup-$(date +%Y%m%d_%H%M%S).sql + +# 恢复数据库(需要停止应用) +docker compose stop qaup-app +docker exec -i qaup-postgres psql -U qaup qaup < backup/qaup-backup-20250120_143000.sql +docker compose start qaup-app +``` + +### 10.4 完全重置(开发测试用) +```bash +# 停止所有服务 +docker compose down + +# 删除数据目录(⚠️ 注意:这会删除所有数据) +rm -rf data/ + +# 重新部署 +./deploy-all.sh +``` + +## 11. 操作总结 ### 开发环境(一次性) ```bash -./package.sh # 打包部署文件 +# 在macOS上构建 +mvn clean package -DskipTests +./deploy/package-all.sh + +# 或在服务器上打包 +./deploy/package-all.sh ``` ### 客户环境 ```bash # 首次部署 -unzip qaup-deploy.zip && cd qaup-deploy && ./deploy.sh +tar -xzf qaup-deploy.tar.gz && cd qaup-deploy && ./deploy-all.sh -# 日常升级 -./update.sh +# 程序更新 +# 1. 复制新jar文件并重命名为 new-app.jar +# 2. 执行更新 +./deploy-update.sh # 查看状态 docker compose ps # 查看日志 -docker compose logs -f app +docker compose logs -f qaup-app ``` -## 10. 优势总结 +## 12. 现代化优势总结 ✅ **极简部署**:解压 → 运行脚本,2步完成 ✅ **极简升级**:替换jar → 运行脚本,自动完成 ✅ **离线友好**:所有依赖预打包,无需联网 ✅ **配置灵活**:关键配置外部文件,可随时修改 -✅ **自动初始化**:数据库结构和标准数据自动创建 -✅ **一键回滚**:升级失败可快速回滚到上一版本 +✅ **自动化迁移**:Flyway自动处理数据库版本管理 +✅ **健康检查**:服务依赖和健康状态监控 +✅ **PostGIS支持**:内置地理空间数据库能力 +✅ **一键回滚**:升级失败可快速回滚到上一版本 +✅ **零停机升级**:只重启应用服务,数据库保持运行 +✅ **版本兼容**:Java 21运行时,确保版本一致性 diff --git a/doc/traffic-light-deployment.md b/doc/deploy/traffic-light-deployment.md similarity index 100% rename from doc/traffic-light-deployment.md rename to doc/deploy/traffic-light-deployment.md diff --git a/doc/adxp-adapter-service-design.md b/doc/design/adxp-adapter-service-design.md similarity index 100% rename from doc/adxp-adapter-service-design.md rename to doc/design/adxp-adapter-service-design.md diff --git a/doc/working/20250110_qaup.sh更新说明.md b/doc/work/20250110_qaup.sh更新说明.md similarity index 100% rename from doc/working/20250110_qaup.sh更新说明.md rename to doc/work/20250110_qaup.sh更新说明.md diff --git a/doc/working/20250110_任务清单接口设计方案.md b/doc/work/20250110_任务清单接口设计方案.md similarity index 100% rename from doc/working/20250110_任务清单接口设计方案.md rename to doc/work/20250110_任务清单接口设计方案.md diff --git a/doc/working/20250110_环境变量配置方案.md b/doc/work/20250110_环境变量配置方案.md similarity index 100% rename from doc/working/20250110_环境变量配置方案.md rename to doc/work/20250110_环境变量配置方案.md diff --git a/doc/working/20250110_配置文件重构说明.md b/doc/work/20250110_配置文件重构说明.md similarity index 100% rename from doc/working/20250110_配置文件重构说明.md rename to doc/work/20250110_配置文件重构说明.md diff --git a/doc/working/README.md b/doc/work/README.md similarity index 100% rename from doc/working/README.md rename to doc/work/README.md diff --git a/doc/working/REDIS_OPTIMIZATION.md b/doc/work/REDIS_OPTIMIZATION.md similarity index 100% rename from doc/working/REDIS_OPTIMIZATION.md rename to doc/work/REDIS_OPTIMIZATION.md diff --git a/doc/working/redis_optimization_guide.md b/doc/work/redis_optimization_guide.md similarity index 100% rename from doc/working/redis_optimization_guide.md rename to doc/work/redis_optimization_guide.md diff --git a/doc/working/redis_optimization_summary.md b/doc/work/redis_optimization_summary.md similarity index 100% rename from doc/working/redis_optimization_summary.md rename to doc/work/redis_optimization_summary.md