Files
juzi/deploy/README.md
T
xsl 43a5373233 docs: add development-machine handoff and server deploy configs
换开发机继续开发。新机器只需要拉仓库 + 自备工具链 + 单独拷贝两个机密文件,
服务器/聚石塔/SAE 全部沿用,不需要重建。

- docs/HANDOFF-2026-11-02.md:开发机交接(环境、仓库地图、三套测试、
  本地怎么跑、云端资源清单、上线方式、11 条关键结论、9 项待办、故障对照表)
- deploy/:服务器侧配置入库(原先只存在于机器上)
  - systemd/juzi-taobao.service(18081,独立数据目录与凭据文件)
  - nginx/tb-location.conf(/tb/ 反代 + 只放行聚石塔 NAT EIP)
  - add-tb-nginx.sh(幂等插入,先备份,nginx -t 通过才 reload)
  - README.md(重建与回滚步骤)
- tools/env-java.ps1:优先用仓库内便携工具链,缺失时回退 JAVA_HOME/PATH,
  换机器不用再下便携 JDK/Maven
- README.md:交接文档入口更新
2026-11-01 23:34:26 +08:00

4.7 KiB
Raw Blame History

deploy —— 1me.xajuzi.com 上的「淘宝专用」Node 实例

这份目录存放不在 git 里自动生效的服务器侧配置:systemd unit、nginx 片段、安装脚本。 换机器/换人接手时,按本文重建即可。

拓扑

淘宝小程序(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 打包传上去):

# 本地仓库根目录
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/
# 服务器上
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. 淘宝凭据

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

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

# 本地
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. 验收

# 服务器本机(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 的路径):

curl -s https://1me.xajuzi.com/tb/api/health   # 期望 {"ok":true}

回滚

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