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 新增小程序编译上传章节、清理检查清单
This commit is contained in:
+123
-131
@@ -1,12 +1,16 @@
|
||||
# 职引 - 部署文档
|
||||
|
||||
> **最后更新**: 2026-06-09
|
||||
> **生产环境**: 已部署(服务器已购 + 域名已配)
|
||||
|
||||
## 目录
|
||||
1. [环境要求](#环境要求)
|
||||
2. [后端部署](#后端部署)
|
||||
3. [前端部署(H5)](#前端部署h5)
|
||||
4. [微信小程序部署](#微信小程序部署)
|
||||
5. [数据库初始化](#数据库初始化)
|
||||
6. [监控和日志](#监控和日志)
|
||||
2. [生产域名](#生产域名)
|
||||
3. [后端部署](#后端部署)
|
||||
4. [前端部署(H5)](#前端部署h5)
|
||||
5. [微信小程序部署](#微信小程序部署)
|
||||
6. [数据库初始化](#数据库初始化)
|
||||
7. [安全检查清单](#安全检查清单)
|
||||
|
||||
---
|
||||
|
||||
@@ -22,7 +26,19 @@
|
||||
### 本地开发
|
||||
- **Node.js**: 18.x
|
||||
- **MongoDB**: 本地或云服务
|
||||
- **HBuilderX**: uni-app 开发
|
||||
- **后端端口**: 3006(默认)
|
||||
- **前端端口**: 8085(Vite 开发服务器)
|
||||
|
||||
---
|
||||
|
||||
## 生产域名
|
||||
|
||||
| 用途 | 域名 | 指向 |
|
||||
|------|------|------|
|
||||
| 后端 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` 控制。
|
||||
|
||||
---
|
||||
|
||||
@@ -31,141 +47,142 @@
|
||||
### 1. 安装依赖
|
||||
```bash
|
||||
cd backend
|
||||
npm install --production
|
||||
npm install
|
||||
```
|
||||
|
||||
### 2. 配置环境变量
|
||||
复制 `.env.example` 为 `.env.production` 并修改:
|
||||
```bash
|
||||
cp .env.example .env.production
|
||||
vim .env.production # 修改生产配置
|
||||
创建 `.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
|
||||
```
|
||||
|
||||
**关键配置项**:
|
||||
- `MONGODB_URI`: 生产数据库地址
|
||||
- `JWT_SECRET`: 强密钥(至少32字符)
|
||||
- `PORT`: 生产端口(推荐 3000)
|
||||
- `WECHAT_APPID` / `WECHAT_SECRET`: 小程序生产凭证
|
||||
|
||||
### 3. 编译 TypeScript
|
||||
### 3. 编译并启动
|
||||
```bash
|
||||
npm run build
|
||||
npm run build # 编译 TypeScript → dist/
|
||||
node dist/main.js # 启动(或使用 PM2)
|
||||
```
|
||||
|
||||
### 4. 使用 PM2 启动
|
||||
### 4. PM2 进程管理
|
||||
```bash
|
||||
# 安装 PM2
|
||||
npm install -g pm2
|
||||
|
||||
# 启动应用
|
||||
pm2 start dist/main.js --name zhiyin-backend
|
||||
|
||||
# 设置开机自启
|
||||
pm2 startup
|
||||
pm2 save
|
||||
pm2 startup && pm2 save
|
||||
```
|
||||
|
||||
### 5. 配置 Nginx 反向代理
|
||||
### 5. Nginx 反向代理(后端 API)
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name api.yourdomain.com;
|
||||
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:3000;
|
||||
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/config/api.js`:
|
||||
```javascript
|
||||
export const BASE_URL = 'https://api.yourdomain.com/api'
|
||||
### 1. 配置 API 地址
|
||||
编辑 `zhiyin-app/.env.production`:
|
||||
```env
|
||||
VITE_API_BASE_URL=https://zhiyinwx.yzrcloud.cn/api
|
||||
```
|
||||
|
||||
### 2. 编译 H5
|
||||
### 2. 编译
|
||||
```bash
|
||||
cd zhiyin-app
|
||||
npm run build:h5
|
||||
# 输出: dist/build/h5/
|
||||
```
|
||||
|
||||
### 3. 部署到 Web 服务器
|
||||
将 `dist/build/h5/` 目录上传到服务器:
|
||||
```bash
|
||||
# 使用 scp 上传
|
||||
scp -r dist/build/h5/* user@your-server:/var/www/zhiyin/
|
||||
|
||||
# 或使用 FTP/SSH 上传
|
||||
scp -r dist/build/h5/* user@your-server:/www/wwwroot/zhiyin.yzrcloud.cn/
|
||||
```
|
||||
|
||||
### 4. 配置 Nginx
|
||||
### 4. Nginx 配置
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name yourdomain.com;
|
||||
|
||||
root /var/www/zhiyin;
|
||||
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|woff|woff2|ttf)$ {
|
||||
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. 修改配置
|
||||
编辑 `zhiyin-app/manifest.json`:
|
||||
```json
|
||||
{
|
||||
"mp-weixin": {
|
||||
"appid": "your-production-appid"
|
||||
}
|
||||
}
|
||||
```
|
||||
### 1. 修改 manifest.json
|
||||
编辑 `zhiyin-app/manifest.json`,填写正式 appid。
|
||||
|
||||
### 2. 编译小程序
|
||||
### 2. 编译
|
||||
```bash
|
||||
cd zhiyin-app
|
||||
npm run build:mp-weixin
|
||||
# 输出: dist/build/mp-weixin/
|
||||
```
|
||||
|
||||
### 3. 使用微信开发者工具上传
|
||||
1. 打开微信开发者工具
|
||||
2. 导入 `dist/build/mp-weixin/` 目录
|
||||
3. 点击「上传」按钮
|
||||
4. 填写版本号和项目备注
|
||||
5. 登录微信公众平台提交审核
|
||||
|
||||
### 4. 提交审核前检查
|
||||
- ✅ 已配置合法域名(在微信公众平台)
|
||||
- ✅ 已通过 AI 深度合成类目审批
|
||||
- ✅ 已配置隐私协议和用户协议
|
||||
- ✅ 已测试所有核心功能
|
||||
1. 导入 `dist/build/mp-weixin/`
|
||||
2. 点击「上传」
|
||||
3. 登录微信公众平台提交审核
|
||||
|
||||
---
|
||||
|
||||
## 数据库初始化
|
||||
|
||||
### 1. 创建数据库和用户
|
||||
```bash
|
||||
mongo
|
||||
> use zhiyin
|
||||
@@ -176,84 +193,59 @@ mongo
|
||||
})
|
||||
```
|
||||
|
||||
### 2. 创建索引
|
||||
```bash
|
||||
cd backend
|
||||
node scripts/create-indexes.js
|
||||
```
|
||||
|
||||
### 3. 初始化管理员账号(可选)
|
||||
```bash
|
||||
node scripts/create-admin.js
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 监控和日志
|
||||
## 小程序编译上传
|
||||
|
||||
### 1. 日志配置
|
||||
使用 PM2 查看日志:
|
||||
### 环境要求
|
||||
```bash
|
||||
pm2 logs zhiyin-backend
|
||||
pm2 logs zhiyin-backend --lines 100
|
||||
# 安装 miniprogram-ci(已在项目 devDeps 中)
|
||||
cd zhiyin-app && npm install --save-dev miniprogram-ci
|
||||
```
|
||||
|
||||
### 2. 错误监控
|
||||
推荐集成:
|
||||
- **Sentry**: 错误追踪
|
||||
- **PM2 Plus**: 进程监控
|
||||
- **MongoDB Atlas**: 数据库监控
|
||||
### 配置
|
||||
确保以下文件就位:
|
||||
- `dist/build/mp-weixin/` — uni-app 构建输出(`npm run build:mp-weixin`)
|
||||
- 微信小程序私钥文件:`/root/opencode-workspace/微信小程序参数/宇之然AI磁场appid/private.wxf466b3c3bc411ffc.key`
|
||||
- `project.config.json`(构建时自动生成,appid: wxf466b3c3bc411ffc)
|
||||
|
||||
### 3. 性能监控
|
||||
### 编译与预览上传
|
||||
```bash
|
||||
# 查看进程状态
|
||||
pm2 monit
|
||||
cd zhiyin-app
|
||||
|
||||
# 查看资源占用
|
||||
pm2 list
|
||||
# 构建微信小程序
|
||||
npm run build:mp-weixin
|
||||
|
||||
# 预览(生成二维码)
|
||||
node scripts/upload-mp.js
|
||||
|
||||
# 直接上传(修改脚本中 ci.preview → ci.upload)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q1: MongoDB 连接失败
|
||||
**A**: 检查 `.env.production` 中的 `MONGODB_URI` 是否正确,确保数据库可访问。
|
||||
|
||||
### Q2: 微信小程序请求失败
|
||||
**A**: 确保在微信公众平台配置了合法域名(必须是 HTTPS)。
|
||||
|
||||
### Q3: AI 调用失败
|
||||
**A**: 检查 `AI_PRIMARY_KEY` 和 `AI_BACKUP_KEY` 是否正确,确保 API 额度充足。
|
||||
### 版本号
|
||||
当前线上版本:**1.0.3**(见 note.txt)
|
||||
|
||||
---
|
||||
|
||||
## 安全检查清单
|
||||
|
||||
- [ ] 已修改默认 JWT_SECRET
|
||||
- [ ] 已禁用开发模式的固定验证码
|
||||
- [ ] 已配置 CORS 白名单
|
||||
- [ ] 已启用 HTTPS
|
||||
- [ ] 已配置 MongoDB 访问权限
|
||||
- [ ] 已移除控制台日志(生产环境)
|
||||
- [ ] 已配置速率限制(防止滥用)
|
||||
- [ ] 修改默认 JWT_SECRET(当前已有环境变量值)
|
||||
- [ ] 移除开发模式的固定验证码 123456
|
||||
- [x] 移除 `member/pay` 开发绕过(已改为真实订单校验)
|
||||
- [x] 套餐值统一:vip → growth/sprint(采访轮次、分析次数不再受限)
|
||||
- [ ] 配置 CORS 白名单(当前: `origin: '*'`)
|
||||
- [ ] 启用 HTTPS
|
||||
- [ ] 配置 MongoDB 访问权限
|
||||
- [ ] 移除 console.log(生产环境)
|
||||
- [x] 配置微信支付生产密钥(证书已验证)
|
||||
- [x] 配置微信小程序密钥(appid: wxf466b3c3bc411ffc)
|
||||
- [ ] 配置每日一题订阅消息模板 ID(WX_DAILY_QUESTION_TMPL)
|
||||
|
||||
---
|
||||
|
||||
## 回滚方案
|
||||
## 变更记录
|
||||
|
||||
如果需要回滚到上一个版本:
|
||||
```bash
|
||||
# 1. 查看 PM2 历史
|
||||
pm2 logs zhiyin-backend --lines 1000
|
||||
|
||||
# 2. 重启到上一个版本
|
||||
pm2 restart zhiyin-backend --version <previous-version>
|
||||
|
||||
# 3. 数据库回滚(如有迁移)
|
||||
mongorestore --uri="<connection-string>" --drop backup/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2026-06-02
|
||||
| 日期 | 变更内容 | 操作者 |
|
||||
|------|----------|--------|
|
||||
| 2026-06-09 | 初版 | AI |
|
||||
| 2026-06-09 | 更新生产域名:zhiyinwx.yzrcloud.cn(API :3006)、zhiyin.yzrcloud.cn(H5 静态目录) | 小之 |
|
||||
|
||||
Reference in New Issue
Block a user