# 生产环境部署文档 > **服务器**: 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 阿里云) — 可选 ``` --- ## 后端部署 ```bash # 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`) ```bash #!/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) ```bash # 1. 构建 cd /app/cfc/cfc-web npm run build # 2. 部署 rsync -a --delete dist/ /app/pro/cfc/frontend/ ``` **注意**: 前端部署后**无需重启后端**,Nginx 直接读取静态文件。 --- ## 网站静态站部署 (cfc-web 官网部分) ```bash 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 自动续期) | ```bash # 验证配置 nginx -t # 重载 nginx -s reload ``` --- ## 小程序 (cfc-frontend) - **不在服务器构建** - 本地开发后,用**微信开发者工具**导入 `/app/cfc/cfc-frontend/` 根目录 - 微信开发者工具中上传代码 → 微信公众平台提交审核 → 发布 - API 地址通过 `config.js` 中 `uni.getAccountInfoSync()` 自动适配环境 --- ## 重启流程速查 ```bash # 一键部署后端 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`) |