# 部署文档 ## 一、基础设施要求 | 组件 | 版本 | 说明 | |------|------|------| | 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"}`