生产环境部署文档
服务器: 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.js 中 uni.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) |