Files
zhiyin/docs/DEPLOYMENT.md
yuzhiran 9276ab9028 v4.2 冲刺版+每日推送+支付修复+全量代码评审
## 新增功能
- 冲刺版 ¥49.9/月:完整支付→激活→权益扣减链路
- 每日一题定时推送(@nestjs/schedule,早8点微信订阅消息)
- miniprogram-ci 编译上传脚本(scripts/upload-mp.js)

## Bug修复
- 套餐值统一:vip→growth/sprint(interview轮次限制、analyze次数检查)
- member/pay 移除开发绕过:改为订单校验后激活
- progress→report 参数名不匹配:id→interviewId
- result.vue resume.create() 参数传错(对象→独立参数)
- resume.vue analyze请求缺少Authorization header
- bank.vue contribution请求缺少Authorization header
- member.vue startPay() 缺少try/catch导致网络错误崩溃
- login.vue 调试面板 v-if="true" 生产泄漏

## 配置
- 微信支付生产证书就位(商户号1113760598)
- .env 清理冗余文件(删除.example/.production)
- WX_NOTIFY_URL 更新为 zhiyinwx.yzrcloud.cn

## 文档
- PROJECT-STATUS.md v4.1→v4.2,状态全面更新
- DEPLOYMENT.md 新增小程序编译上传章节、清理检查清单
2026-06-09 20:03:05 +08:00

252 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 职引 - 部署文档
> **最后更新**: 2026-06-09
> **生产环境**: 已部署(服务器已购 + 域名已配)
## 目录
1. [环境要求](#环境要求)
2. [生产域名](#生产域名)
3. [后端部署](#后端部署)
4. [前端部署(H5](#前端部署h5)
5. [微信小程序部署](#微信小程序部署)
6. [数据库初始化](#数据库初始化)
7. [安全检查清单](#安全检查清单)
---
## 环境要求
### 生产服务器
- **操作系统**: Linux (Ubuntu 20.04+ / CentOS 7+)
- **Node.js**: 18.x 或更高版本
- **MongoDB**: 4.4+ (或 MongoDB Atlas 云服务)
- **Nginx**: 1.18+ (反向代理)
- **PM2**: 进程管理
### 本地开发
- **Node.js**: 18.x
- **MongoDB**: 本地或云服务
- **后端端口**: 3006(默认)
- **前端端口**: 8085Vite 开发服务器)
---
## 生产域名
| 用途 | 域名 | 指向 |
|------|------|------|
| 后端 API(小程序服务端) | `https://zhiyinwx.yzrcloud.cn` | Nginx → `http://localhost:3006` |
| H5 网页端 | `https://zhiyin.yzrcloud.cn` | 静态目录 `/www/wwwroot/zhiyin.yzrcloud.cn` |
端口固定为 **3006**,由 `main.ts``process.env.PORT || 3006` 控制。
---
## 后端部署
### 1. 安装依赖
```bash
cd backend
npm install
```
### 2. 配置环境变量
创建 `.env` 文件(参考 `backend/.env`):
```env
MONGODB_URI=mongodb://localhost:27017/zhiyin
JWT_SECRET=your-strong-secret-at-least-32-chars
PORT=3006
AI_PRIMARY_KEY=your-deepseek-key
AI_BACKUP_KEY=your-nvidia-key
WECHAT_APPID=your-appid
WECHAT_MCHID=your-mchid
WECHAT_API_KEY=your-api-v3-key
WECHAT_SERIAL_NO=your-cert-serial
WECHAT_PRIVATE_KEY_PATH=/path/to/apiclient_key.pem
WX_DAILY_QUESTION_TMPL=在微信公众平台配置的订阅消息模板ID
```
### 3. 编译并启动
```bash
npm run build # 编译 TypeScript → dist/
node dist/main.js # 启动(或使用 PM2
```
### 4. PM2 进程管理
```bash
npm install -g pm2
pm2 start dist/main.js --name zhiyin-backend
pm2 startup && pm2 save
```
### 5. Nginx 反向代理(后端 API
```nginx
server {
listen 443 ssl http2;
server_name zhiyinwx.yzrcloud.cn;
ssl_certificate /etc/nginx/ssl/yzrcloud.cn.pem;
ssl_certificate_key /etc/nginx/ssl/yzrcloud.cn.key;
location / {
proxy_pass http://localhost:3006;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
# HTTP → HTTPS 跳转
server {
listen 80;
server_name zhiyinwx.yzrcloud.cn;
return 301 https://$host$request_uri;
}
```
---
## 前端部署(H5
### 1. 配置 API 地址
编辑 `zhiyin-app/.env.production`
```env
VITE_API_BASE_URL=https://zhiyinwx.yzrcloud.cn/api
```
### 2. 编译
```bash
cd zhiyin-app
npm run build:h5
# 输出: dist/build/h5/
```
### 3. 部署到 Web 服务器
```bash
scp -r dist/build/h5/* user@your-server:/www/wwwroot/zhiyin.yzrcloud.cn/
```
### 4. Nginx 配置
```nginx
server {
listen 443 ssl http2;
server_name zhiyin.yzrcloud.cn;
root /www/wwwroot/zhiyin.yzrcloud.cn;
index index.html;
ssl_certificate /etc/nginx/ssl/yzrcloud.cn.pem;
ssl_certificate_key /etc/nginx/ssl/yzrcloud.cn.key;
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# HTTP → HTTPS 跳转
server {
listen 80;
server_name zhiyin.yzrcloud.cn;
return 301 https://$host$request_uri;
}
```
---
## 微信小程序部署
### 1. 修改 manifest.json
编辑 `zhiyin-app/manifest.json`,填写正式 appid。
### 2. 编译
```bash
cd zhiyin-app
npm run build:mp-weixin
# 输出: dist/build/mp-weixin/
```
### 3. 使用微信开发者工具上传
1. 导入 `dist/build/mp-weixin/`
2. 点击「上传」
3. 登录微信公众平台提交审核
---
## 数据库初始化
```bash
mongo
> use zhiyin
> db.createUser({
user: "zhiyin",
pwd: "strong-password",
roles: [{ role: "readWrite", db: "zhiyin" }]
})
```
---
## 小程序编译上传
### 环境要求
```bash
# 安装 miniprogram-ci(已在项目 devDeps 中)
cd zhiyin-app && npm install --save-dev miniprogram-ci
```
### 配置
确保以下文件就位:
- `dist/build/mp-weixin/` — uni-app 构建输出(`npm run build:mp-weixin`
- 微信小程序私钥文件:`/root/opencode-workspace/微信小程序参数/宇之然AI磁场appid/private.wxf466b3c3bc411ffc.key`
- `project.config.json`(构建时自动生成,appid: wxf466b3c3bc411ffc
### 编译与预览上传
```bash
cd zhiyin-app
# 构建微信小程序
npm run build:mp-weixin
# 预览(生成二维码)
node scripts/upload-mp.js
# 直接上传(修改脚本中 ci.preview → ci.upload
```
### 版本号
当前线上版本:**1.0.3**(见 note.txt
---
## 安全检查清单
- [ ] 修改默认 JWT_SECRET(当前已有环境变量值)
- [ ] 移除开发模式的固定验证码 123456
- [x] 移除 `member/pay` 开发绕过(已改为真实订单校验)
- [x] 套餐值统一:vip → growth/sprint(采访轮次、分析次数不再受限)
- [ ] 配置 CORS 白名单(当前: `origin: '*'`
- [ ] 启用 HTTPS
- [ ] 配置 MongoDB 访问权限
- [ ] 移除 console.log(生产环境)
- [x] 配置微信支付生产密钥(证书已验证)
- [x] 配置微信小程序密钥(appid: wxf466b3c3bc411ffc
- [ ] 配置每日一题订阅消息模板 IDWX_DAILY_QUESTION_TMPL
---
## 变更记录
| 日期 | 变更内容 | 操作者 |
|------|----------|--------|
| 2026-06-09 | 初版 | AI |
| 2026-06-09 | 更新生产域名:zhiyinwx.yzrcloud.cnAPI :3006)、zhiyin.yzrcloud.cnH5 静态目录) | 小之 |