149 lines
7.7 KiB
Markdown
149 lines
7.7 KiB
Markdown
# deploy —— 1me.xajuzi.com 上的「淘宝专用」Node 实例
|
||
|
||
这份目录存放**不在 git 里自动生效**的服务器侧配置:systemd unit、nginx 片段、安装脚本。
|
||
换机器/换人接手时,按本文重建即可。
|
||
|
||
## 淘宝拍照语音静态资源
|
||
|
||
`taobao-voice-media.py` 用于修复 `/state/assets/voice/` 的媒体响应。当前已部署:清单内 14 个公开 MP3 和 manifest.json 从 `/home/ubuntu/juzi/h5/assets/voice/` 复制到 `/var/www/juzi-voice-20261102/`,Nginx 在原 HTTPS server 增加该路径的 alias,返回 `audio/mpeg` 并支持 Range/206。此步骤只 reload Nginx,不重启三个业务应用;原 `/state/` 页面、后台认证、数据目录禁用及 `/tb/` 白名单保留。
|
||
|
||
在服务器使用 `sudo python3 /tmp/juzi-voice-media-20261102.py` 执行上传后的脚本;脚本验证清单和路径、拒绝源/目标符号链接、备份配置并执行 `nginx -t`,验证或 reload 失败会回滚。原站点配置备份为 `/etc/nginx/sites-available/juzi.voice-20261102.bak`。若日后更新语音文件,重新执行脚本刷新公开副本。14 条线上音频完整内容已与本地文件逐一比对一致。
|
||
|
||
客户端声音状态见 `[voice] VOICE-20261102-02` 真机 Console 日志;事件包括 loading/canplay/play_requested/playing/error。日志不包含原生错误对象、账号、照片或完整 URL。
|
||
|
||
## 拓扑
|
||
|
||
### 公开视频(2026-11-02)
|
||
|
||
用户指定的 `261026改双仓5.mp4` 已上传,源文件 SHA256 为 `46ae3089e4da884f03313b71809814813b88f1abc92d374dc8210f01db10b026`。视频为 2160×3840 H.264/AAC,约 32 秒;仅用 FFmpeg `-c copy -movflags +faststart` 调整封装,不重编码。
|
||
|
||
- 服务器文件:`/var/www/juzi-media/videos/261026-shuangcang5-46ae3089.mp4`,SHA256 `64790107cce2f78e68668474fb06d2e11acf3d76d9e05b7ccec4f588e89eb02e`。
|
||
- 播放页:`https://1me.xajuzi.com/media/videos/261026-shuangcang5-46ae3089.html`。
|
||
- 二维码:项目内 `deliverables/261026-shuangcang5/video-qr.png`,已解码确认指向上述播放页。
|
||
- 发布脚本:`deploy/publish-video.py`;Nginx 为 `/media/videos/` 单独 alias,禁止目录索引及写入方法,支持 MP4 MIME、Range/206。
|
||
- 本次配置备份:`/etc/nginx/sites-available/juzi.public-video-20261102T113656914226Z.bak`。仅 reload Nginx,三个业务服务未重启。
|
||
- 验证:上传文件哈希一致、公网 HTML 200、MP4 206/32 字节范围请求正常;移动视口 Chromium 已实际开始播放,视频无解码错误。手机淘宝/微信内的具体播放体验仍以扫码为准。
|
||
|
||
微信反馈(能开页、播放卡住)后,另发布 `261026-shuangcang5-mobile-v2.mp4/.html`:720×1280、H.264 Main Level 3.1、AAC、faststart,5,329,575 字节,SHA256 `9f34e5a568230e87fb206f101467db9eb22d31c5951cedb26d02eacad709e33c`。保留原 4K 文件;旧 HTML 也改为播放兼容版,备份在 `/tmp/juzi-public-video-20261102-46ae3089/legacy-player-before-v2.html`。新二维码 `deliverables/261026-shuangcang5/video-qr-mobile-v2.png` 指向新的 HTML 路径以避开旧页面缓存。新增用户点击播放按钮及内联属性、等待/失败提示和直接视频链接;移动视口浏览器通过真实按钮点击已开始播放 720×1280 视频,微信真机仍待用户扫码验证。
|
||
|
||
```
|
||
淘宝小程序(taobao/,AppKey 35486228)
|
||
→ 淘宝云网关(注入 app_key / open_id / sign,单请求 10s / 128KB 上限)
|
||
→ 聚石塔云应用 1me-net(62829) → 私网 CLB 192.168.65.185:80
|
||
→ SAE 应用 nnn(taobao-mvp-backend-0.0.4-forward.jar,mode=forward,纯透传)
|
||
→ 聚石塔 NAT 网关出网(EIP 47.92.113.176)
|
||
→ https://1me.xajuzi.com/tb/ (nginx 白名单只放行上面这个 EIP)
|
||
→ juzi-taobao.service(Node,127.0.0.1:18081,本文档这套配置)
|
||
→ 旷视 Face++ skinanalyze_pro
|
||
```
|
||
|
||
生产 H5(`/state/`)和红书渠道(`/rednote/`)跑在同机另外两个 systemd 服务上,**8080/8081 端口,和本实例完全隔离**。
|
||
|
||
## 三个服务的分工
|
||
|
||
| 服务 | 端口 | 代码目录 | 用途 |
|
||
|---|---|---|---|
|
||
| `juzi-h5.service` | 8080 | `/home/ubuntu/juzi/h5` | 生产 H5(微信登录、报告、后台) |
|
||
| `juzi-rednote.service` | 8081 | `/home/ubuntu/juzi-rednote/current/h5` | 小红书渠道隔离实例 |
|
||
| `juzi-taobao.service` | 18081 | `/home/ubuntu/juzi-tb/h5` | **本目录新增**:淘宝小程序专用 |
|
||
|
||
## 重建步骤
|
||
|
||
### 1. 代码
|
||
|
||
`/home/ubuntu/juzi-tb` 是**独立的一份 h5 代码**(不是生产目录的软链),来自本仓库的 `h5/`。
|
||
部署方式(本地执行,把仓库里的 h5 打包传上去):
|
||
|
||
```powershell
|
||
# 本地仓库根目录
|
||
tar -czf temp/juzi-h5.tgz --exclude=h5/data --exclude=h5/test --exclude=h5/scripts -C . h5
|
||
scp temp/juzi-h5.tgz ubuntu@1me.xajuzi.com:/tmp/
|
||
```
|
||
|
||
```bash
|
||
# 服务器上
|
||
sudo mkdir -p /home/ubuntu/juzi-tb /home/ubuntu/juzi-tb-data
|
||
sudo chown -R ubuntu:ubuntu /home/ubuntu/juzi-tb /home/ubuntu/juzi-tb-data
|
||
chmod 700 /home/ubuntu/juzi-tb-data
|
||
tar -xzf /tmp/juzi-h5.tgz -C /home/ubuntu/juzi-tb
|
||
|
||
# 旷视凭据复用生产那份(gitignored,不随仓库走)
|
||
mkdir -p /home/ubuntu/juzi-tb/reference/facepp-skinanalyze
|
||
cp /home/ubuntu/juzi/reference/facepp-skinanalyze/credentials.env \
|
||
/home/ubuntu/juzi-tb/reference/facepp-skinanalyze/credentials.env
|
||
chmod 600 /home/ubuntu/juzi-tb/reference/facepp-skinanalyze/credentials.env
|
||
```
|
||
|
||
> `h5/server.js` 启动时如果找不到旷视 key 会直接 `exit(1)`,所以这一步不能漏。
|
||
|
||
### 2. 淘宝凭据
|
||
|
||
```bash
|
||
sudo mkdir -p /etc/juzi
|
||
sudo tee /etc/juzi/taobao.env >/dev/null <<'EOF'
|
||
TAOBAO_APP_KEY=35486228
|
||
TAOBAO_APP_SECRET=<35486228 的 AppSecret,向项目负责人索取>
|
||
EOF
|
||
sudo chmod 600 /etc/juzi/taobao.env && sudo chown root:root /etc/juzi/taobao.env
|
||
```
|
||
|
||
这个文件被 `h5/lib/taobao-auth.js` 读取,用于校验云网关签名。**没有它,`/session` 一律 401。**
|
||
|
||
### 3. systemd
|
||
|
||
```bash
|
||
scp deploy/systemd/juzi-taobao.service ubuntu@1me.xajuzi.com:/tmp/
|
||
ssh ubuntu@1me.xajuzi.com "sudo install -m 644 -o root -g root /tmp/juzi-taobao.service /etc/systemd/system/ \
|
||
&& sudo systemctl daemon-reload && sudo systemctl enable --now juzi-taobao && systemctl is-active juzi-taobao"
|
||
```
|
||
|
||
### 4. nginx
|
||
|
||
```bash
|
||
# 本地
|
||
scp deploy/add-tb-nginx.sh deploy/nginx/tb-location.conf ubuntu@1me.xajuzi.com:/tmp/
|
||
|
||
# 服务器
|
||
ssh ubuntu@1me.xajuzi.com "sed -i 's/\r\$//' /tmp/add-tb-nginx.sh && bash /tmp/add-tb-nginx.sh /tmp/tb-location.conf"
|
||
```
|
||
|
||
脚本是幂等的(检测到 `location /tb/` 就跳过),会先备份成 `juzi.bak-tb-<时间戳>`。
|
||
|
||
### 5. 验收
|
||
|
||
```bash
|
||
# 服务器本机(127.0.0.1 在白名单里)
|
||
curl -sk -H 'Host: 1me.xajuzi.com' https://127.0.0.1/tb/api/health
|
||
# 期望 {"ok":true}
|
||
|
||
# 公网(应被白名单挡掉)
|
||
curl -s -o /dev/null -w '%{http_code}\n' https://1me.xajuzi.com/tb/api/health
|
||
# 期望 403
|
||
|
||
# 生产 H5 不受影响
|
||
curl -s -o /dev/null -w '%{http_code}\n' https://1me.xajuzi.com/state/api/health
|
||
# 期望 200
|
||
```
|
||
|
||
最后在聚石塔 SAE 容器里再验一次(这是唯一走 NAT 的路径):
|
||
|
||
```bash
|
||
curl -s https://1me.xajuzi.com/tb/api/health # 期望 {"ok":true}
|
||
```
|
||
|
||
## 回滚
|
||
|
||
```bash
|
||
sudo systemctl disable --now juzi-taobao
|
||
sudo cp /etc/nginx/sites-available/juzi.bak-tb-<时间戳> /etc/nginx/sites-available/juzi
|
||
sudo nginx -t && sudo systemctl reload nginx
|
||
```
|
||
|
||
生产两个服务完全不受影响(端口、目录、数据都是独立的)。
|
||
|
||
## 数据
|
||
|
||
- 运行数据:`/home/ubuntu/juzi-tb-data`(700)—— 照片 `photos/`、原始返回 `results/`、记录 `records.jsonl`、账号 `accounts/`
|
||
- 与生产的 `/home/ubuntu/juzi/h5/data` 完全分开,两边用户/报告不互通
|
||
- **没有任何自动清理**:每次检测约 10–12MB 常驻磁盘,长期要换 OSS + RDS
|