# 职引 - 部署文档

> **最后更新**: 2026-07-04 12:51
> **生产环境**: 已部署（服务器已购 + 域名已配）

## 目录
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（默认）
- **前端端口**: 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` 控制。

---

## 后端部署

### 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
# 构建含 SEO 文件（robots.txt, sitemap.xml, 数字人头像）
npm run build:h5
# 部署所有产物
scp -r dist/build/h5/* user@your-server:/www/wwwroot/zhiyin.yzrcloud.cn/
# 或者使用服务端脚本（自动复制 static/、robots.txt、sitemap.xml）
```

### 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.22**（小程序上传版本，git tag v1.0.21 + 脚本末位自增 1）

---

## 安全检查清单

- [ ] 修改默认 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）

---

## 变更记录

| 日期 | 变更内容 | 操作者 |
|------|----------|--------|
| 2026-06-09 | 初版 | AI |
| 2026-06-09 | 更新生产域名：zhiyinwx.yzrcloud.cn（API :3006）、zhiyin.yzrcloud.cn（H5 静态目录） | 小之 |
| 2026-06-21 | 更新部署版本至 v1.0.16；小程序上传工具使用 git tag 自动获取版本号 | 小之 |
| 2026-06-21 | v4.8 SEO + 分享全面优化：部署新增 robots.txt、sitemap.xml、static/ 目录；版本号自动注入（Vite define）；13 页面微信分享全部开启；上传脚本版本号末位自增 1 | AI |
| 2026-07-04 | v4.10 引力值变动记录系统 + 前端 401/错误处理完善；v1.0.21 发布；H5 + 小程序全量部署 | AI |
| 2026-07-04 | ASR 语音识别 AAC→WAV 转换修复 + share.vue 分享记录去重修复；后端 + H5 + 小程序 v1.0.22 部署 | AI |
