280 行
6.7 KiB
Markdown
280 行
6.7 KiB
Markdown
# 部署文档
|
||
|
||
## 一、基础设施要求
|
||
|
||
| 组件 | 版本 | 说明 |
|
||
|------|------|------|
|
||
| JDK | 21 | GraalVM 或 Eclipse Temurin |
|
||
| MySQL | 8.0+ | 4 个独立数据库 |
|
||
| Redis | 7.x | 验证码、会话标记 |
|
||
| Nginx | 1.24+ | 前端静态 + API 反代 |
|
||
| Maven | 3.9+ | 后端构建 |
|
||
| Node.js | 22+ | 前端构建 |
|
||
|
||
---
|
||
|
||
## 二、数据库初始化
|
||
|
||
服务启动时通过 `ddl-auto: update` 自动建表,只需提前创建数据库:
|
||
|
||
```sql
|
||
CREATE DATABASE xuqm_tenant CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
CREATE DATABASE xuqm_im CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
CREATE DATABASE xuqm_push CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
CREATE DATABASE xuqm_update CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
```
|
||
|
||
---
|
||
|
||
## 三、后端构建与启动
|
||
|
||
### 构建
|
||
|
||
```bash
|
||
cd XuqmGroup-Server
|
||
mvn clean package -DskipTests
|
||
```
|
||
|
||
各模块 jar 生成于 `{module}/target/{module}-0.1.0-SNAPSHOT.jar`。
|
||
|
||
### 环境变量
|
||
|
||
**tenant-service**(:8081)
|
||
```bash
|
||
export SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xuqm_tenant?...
|
||
export SPRING_DATASOURCE_USERNAME=xuqm
|
||
export SPRING_DATASOURCE_PASSWORD=your_db_password
|
||
export SPRING_DATA_REDIS_HOST=redis
|
||
export SPRING_MAIL_USERNAME=noreply@xuqm.com
|
||
export SPRING_MAIL_PASSWORD=your_smtp_password
|
||
export JWT_SECRET=your_256bit_secret
|
||
export OPS_ADMIN_USERNAME=admin
|
||
export OPS_ADMIN_PASSWORD=your_ops_password
|
||
```
|
||
|
||
**im-service**(:8082)
|
||
```bash
|
||
export SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xuqm_im?...
|
||
export SPRING_DATASOURCE_USERNAME=xuqm
|
||
export SPRING_DATASOURCE_PASSWORD=your_db_password
|
||
export SPRING_DATA_REDIS_HOST=redis
|
||
export JWT_SECRET=your_256bit_secret_im
|
||
```
|
||
|
||
**push-service**(:8083)
|
||
```bash
|
||
export SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xuqm_push?...
|
||
export SPRING_DATASOURCE_USERNAME=xuqm
|
||
export SPRING_DATASOURCE_PASSWORD=your_db_password
|
||
export JWT_SECRET=your_256bit_secret_push
|
||
# 华为推送
|
||
export HUAWEI_APP_ID=your_huawei_app_id
|
||
export HUAWEI_APP_SECRET=your_huawei_secret
|
||
# 小米推送
|
||
export XIAOMI_APP_SECRET=your_xiaomi_secret
|
||
# iOS APNs
|
||
export APNS_KEY_ID=your_key_id
|
||
export APNS_TEAM_ID=your_team_id
|
||
export APNS_KEY_PATH=/opt/xuqm/apns_key.p8
|
||
export APNS_BUNDLE_ID=com.yourcompany.app
|
||
```
|
||
|
||
**update-service**(:8084)
|
||
```bash
|
||
export SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/xuqm_update?...
|
||
export SPRING_DATASOURCE_USERNAME=xuqm
|
||
export SPRING_DATASOURCE_PASSWORD=your_db_password
|
||
export JWT_SECRET=your_256bit_secret_update
|
||
export UPDATE_UPLOAD_DIR=/data/xuqm/update
|
||
export UPDATE_BASE_URL=https://update.xuqm.com
|
||
```
|
||
|
||
### 启动
|
||
|
||
```bash
|
||
java -jar tenant-service/target/tenant-service-*.jar &
|
||
java -jar im-service/target/im-service-*.jar &
|
||
java -jar push-service/target/push-service-*.jar &
|
||
java -jar update-service/target/update-service-*.jar &
|
||
```
|
||
|
||
---
|
||
|
||
## 四、前端构建与部署
|
||
|
||
```bash
|
||
cd XuqmGroup-Web
|
||
yarn install
|
||
yarn workspace tenant-platform build # dist/ → /var/www/tenant
|
||
yarn workspace ops-platform build # dist/ → /var/www/ops
|
||
```
|
||
|
||
### Nginx 配置
|
||
|
||
```nginx
|
||
# 租户开放平台
|
||
server {
|
||
listen 80;
|
||
server_name tenant.xuqm.com;
|
||
root /var/www/tenant;
|
||
index index.html;
|
||
|
||
location / {
|
||
try_files $uri $uri/ /index.html;
|
||
}
|
||
|
||
location /api/ {
|
||
proxy_pass http://127.0.0.1:8081/api/;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
}
|
||
}
|
||
|
||
# 运营管理平台
|
||
server {
|
||
listen 80;
|
||
server_name ops.xuqm.com;
|
||
root /var/www/ops;
|
||
index index.html;
|
||
|
||
location / {
|
||
try_files $uri $uri/ /index.html;
|
||
}
|
||
|
||
location /api/ {
|
||
proxy_pass http://127.0.0.1:8081/api/;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
}
|
||
}
|
||
|
||
# IM WebSocket 反代
|
||
server {
|
||
listen 80;
|
||
server_name im.xuqm.com;
|
||
|
||
location /ws/im {
|
||
proxy_pass http://127.0.0.1:8082;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection "upgrade";
|
||
proxy_read_timeout 86400;
|
||
}
|
||
|
||
location /api/im/ {
|
||
proxy_pass http://127.0.0.1:8082/api/im/;
|
||
}
|
||
}
|
||
|
||
# 版本管理文件服务
|
||
server {
|
||
listen 80;
|
||
server_name update.xuqm.com;
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:8084/;
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 五、Docker Compose(可选)
|
||
|
||
```yaml
|
||
version: '3.9'
|
||
|
||
services:
|
||
mysql:
|
||
image: mysql:8.0
|
||
environment:
|
||
MYSQL_ROOT_PASSWORD: root
|
||
MYSQL_USER: xuqm
|
||
MYSQL_PASSWORD: xuqm_password
|
||
volumes:
|
||
- mysql_data:/var/lib/mysql
|
||
ports:
|
||
- "3306:3306"
|
||
|
||
redis:
|
||
image: redis:7-alpine
|
||
ports:
|
||
- "6379:6379"
|
||
|
||
tenant-service:
|
||
image: eclipse-temurin:21-jre
|
||
volumes:
|
||
- ./XuqmGroup-Server/tenant-service/target:/app
|
||
command: java -jar /app/tenant-service-0.1.0-SNAPSHOT.jar
|
||
environment:
|
||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/xuqm_tenant?...
|
||
SPRING_DATA_REDIS_HOST: redis
|
||
ports:
|
||
- "8081:8081"
|
||
depends_on: [mysql, redis]
|
||
|
||
im-service:
|
||
image: eclipse-temurin:21-jre
|
||
volumes:
|
||
- ./XuqmGroup-Server/im-service/target:/app
|
||
command: java -jar /app/im-service-0.1.0-SNAPSHOT.jar
|
||
ports:
|
||
- "8082:8082"
|
||
depends_on: [mysql, redis]
|
||
|
||
push-service:
|
||
image: eclipse-temurin:21-jre
|
||
volumes:
|
||
- ./XuqmGroup-Server/push-service/target:/app
|
||
command: java -jar /app/push-service-0.1.0-SNAPSHOT.jar
|
||
ports:
|
||
- "8083:8083"
|
||
depends_on: [mysql]
|
||
|
||
update-service:
|
||
image: eclipse-temurin:21-jre
|
||
volumes:
|
||
- ./XuqmGroup-Server/update-service/target:/app
|
||
- update_files:/data/xuqm/update
|
||
command: java -jar /app/update-service-0.1.0-SNAPSHOT.jar
|
||
environment:
|
||
UPDATE_UPLOAD_DIR: /data/xuqm/update
|
||
ports:
|
||
- "8084:8084"
|
||
depends_on: [mysql]
|
||
|
||
volumes:
|
||
mysql_data:
|
||
update_files:
|
||
```
|
||
|
||
---
|
||
|
||
## 六、发版流程汇总
|
||
|
||
| 平台 | 步骤 |
|
||
|------|------|
|
||
| **后端** | `mvn clean package` → 替换 jar → 重启服务 |
|
||
| **前端** | `yarn build` → 替换 `dist/` → Nginx 无需重启 |
|
||
| **Android SDK** | 修改版本号 → `./gradlew publish` → Nexus |
|
||
| **iOS SDK (SPM)** | 修改版本号 → `git tag x.y.z && git push origin x.y.z` |
|
||
| **iOS SDK (CocoaPods)** | `pod repo push xuqm-specs XuqmSDK.podspec` |
|
||
| **RN SDK** | 修改 `package.json` version → `npm publish` |
|
||
| **Vue3 SDK** | 修改 `package.json` version → `npm run build && npm publish` |
|
||
| **HarmonyOS SDK** | 修改 `oh-package.json5` version → `ohpm publish` |
|
||
|
||
---
|
||
|
||
## 七、健康检查
|
||
|
||
各服务均暴露 Spring Actuator 端点:
|
||
|
||
```bash
|
||
curl http://localhost:8081/actuator/health
|
||
curl http://localhost:8082/actuator/health
|
||
curl http://localhost:8083/actuator/health
|
||
curl http://localhost:8084/actuator/health
|
||
```
|
||
|
||
正常返回:`{"status":"UP"}`
|