DEPLOYMENT.md 5.0 KB

生产环境部署文档

服务器: 172.16.0.4(内网)/ 111.228.6.214(公网) 域名: www.etotem.com.cn / cfc.etotem.com.cn / cf-club.iwintrue.com / ai.etotem.com.cn


服务架构

公网 (111.228.6.214)
  └─ Nginx (80 → 443)               — 反向代理 + SSL 终端
       ├─ www.etotem.com.cn          — 公司官网静态站
       │    ├─ /admin/               → /app/pro/cfc/frontend/ (管理端 SPA)
       │    └─ /api/                 → Spring Boot :9082
       ├─ cfc.etotem.com.cn          — 后端 API 主站
       │    ├─ /admin/               → /app/pro/cfc/frontend/ (管理端 SPA)
       │    ├─ /admin/api/           → Spring Boot :9082
       │    ├─ /api/                 → Spring Boot :9082
       │    └─ /                     → Spring Boot :9082
       ├─ cf-club.iwintrue.com       — 俱乐部静态站
       │    └─ /api/                 → Spring Boot :9082
       └─ ai.etotem.com.cn           — AI LangGraph 服务
            └─ /                     → Docker :9000

Spring Boot (cfc-backend) :9082
  ├─ MySQL 127.0.0.1:3306/zxyj      — 主库
  ├─ Redis 127.0.0.1:6379           — 缓存
  └─ Sfms 只读源 (RDS 阿里云)        — 可选

后端部署

# 1. 构建
cd /app/cfc/cfc-backend
mvn clean package -Dmaven.test.skip=true -Dmaven.compile.fork=true

# 2. 复制 JAR
cp target/cfc-backend-1.0.0.jar /app/pro/cfc/backend/

# 3. 重启(start.sh 自动 kill 旧进程 + 启动新进程)
bash /app/pro/cfc/backend/start.sh

# 4. 验证
curl -s -o /dev/null -w "%{http_code}" http://localhost:9082/api/
# 预期返回 401(需要 JWT 令牌)

配置文件

路径 说明
/app/pro/cfc/backend/cfc-backend-1.0.0.jar 可执行 JAR
/app/pro/cfc/backend/config/application-prod.yml 生产配置
/app/pro/cfc/backend/config/application.yml 公共配置
/app/pro/cfc/backend/app.pid 进程 PID 文件

启动脚本 (/app/pro/cfc/backend/start.sh)

#!/bin/bash
APP_DIR="/app/pro/cfc/backend"
JAR="$APP_DIR/cfc-backend-1.0.0.jar"
PID_FILE="$APP_DIR/app.pid"
JAVA_OPTS="-Xmx2g -Xms512m -XX:+CrashOnOutOfMemoryError"

# 停止旧进程
if [ -f "$PID_FILE" ]; then kill $(cat "$PID_FILE"); sleep 3; fi
fuser -k 9082/tcp 2>/dev/null; sleep 2

# 启动新进程
nohup java $JAVA_OPTS -jar "$JAR" \
  --spring.profiles.active=prod \
  --spring.config.location="$APP_DIR/config/" \
  > /dev/null 2>&1 &
echo $! > "$PID_FILE"

日志

文件 说明
/app/pro/cfc/backend/cfc-backend.log 应用日志(Logback,自动滚动)
滚动策略 50MB/文件,保留 7 天,总计 ≤500MB
日志级别 com.etotem.cfc: warn,INFO 级仅启动/请求日志

前端管理端部署 (cfc-web)

# 1. 构建
cd /app/cfc/cfc-web
npm run build

# 2. 部署
rsync -a --delete dist/ /app/pro/cfc/frontend/

注意: 前端部署后无需重启后端,Nginx 直接读取静态文件。


网站静态站部署 (cfc-web 官网部分)

cd /app/cfc/cfc-web
npm run build
rsync -a --delete dist/ /app/cfc/web/

数据库

属性
主机 127.0.0.1:3306
数据库 zxyj
用户 zxyj
密码 zxyj@123
引擎 MariaDB

迁移

  • 唯一入口: DatabaseInitializer.runMigrations()(Spring Boot 启动时自动执行)
  • 所有 DDL 幂等: 可重复执行,失败时 WARN 级别记录,不会阻塞启动
  • 同步 schema.sql: 每次新表/新列后同步更新 /app/cfc/cfc-backend/src/main/resources/schema.sql

Nginx

配置 路径
主配置 /etc/nginx/sites-available/etotem
符号链接 /etc/nginx/sites-enabled/etotem
SSL 证书 /etc/ohttps/certificates/(Let's Encrypt,每日 3:00 cron 自动续期)
# 验证配置
nginx -t

# 重载
nginx -s reload

小程序 (cfc-frontend)

  • 不在服务器构建
  • 本地开发后,用微信开发者工具导入 /app/cfc/cfc-frontend/ 根目录
  • 微信开发者工具中上传代码 → 微信公众平台提交审核 → 发布
  • API 地址通过 config.jsuni.getAccountInfoSync() 自动适配环境

重启流程速查

# 一键部署后端
cd /app/cfc/cfc-backend && mvn clean package -Dmaven.test.skip=true -Dmaven.compile.fork=true && \
  cp target/cfc-backend-1.0.0.jar /app/pro/cfc/backend/ && \
  bash /app/pro/cfc/backend/start.sh

# 重载 Nginx(不改配置无需执行)
nginx -s reload

关键约束

条目 规则
端口冲突 启动后端前必须释放 9082(fuser -k 9082/tcp
构建验证 mvn clean compile 通过后才能 package
日志清理 无需手动清理,Logback 自动滚动
SSL 续期 每日 3:00 自动执行 acme.sh --cron
SFMS 只读源 生产环境已禁用(sfms.datasource.enabled: false