# 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 → 运行脚本，自动完成  
✅ **离线友好**：所有依赖预打包，无需联网  
✅ **配置灵活**：关键配置外部文件，可随时修改  
✅ **自动初始化**：数据库结构和标准数据自动创建  
✅ **一键回滚**：升级失败可快速回滚到上一版本
