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