Files
alibaba/docs/superpowers/plans/2026-07-15-deploy-test-env.md
T
2026-08-27 16:12:37 +08:00

6.4 KiB

线上测试环境部署(1Panel + alibaba 库 + OpenResty 站点)

实际部署方案(2026-07-17)。对应 spec §11.2「测试环境:公网 IP + 端口 + HTTP」。

目标服务器

  • 公网 IP:219.157.255.213,Ubuntu 24.04,主机 kt-W580G20
  • 登录用户:kt(sudo 免密,不在 docker 组但 sudo docker 可用)
  • 已装:Docker 28.0.1 + compose v2.33.1、Node v20(前端 build 用 docker node 镜像)
  • 镜像加速:/etc/docker/daemon.json → https://docker.1panel.live
  • 已有 1Panel + OpenResty(管理所有站点,占 80/443)

SSH 访问(本机 → 服务器)

  • 本机密钥:C:\Users\30997\.ssh\alibb_deploy(ed25519,无 passphrase)
  • 连接(用 Windows 自带 OpenSSH,Git Bash 的 ssh 因私钥权限 644 被拒):
    /c/Windows/System32/OpenSSH/ssh.exe -i 'C:\Users\30997\.ssh\alibb_deploy' kt@219.157.255.213 '...'
    
  • 或本机 ~/.ssh/config 加别名(Windows 路径 IdentityFile):
    Host alibb
      HostName 219.157.255.213
      User kt
      IdentityFile C:\Users\30997\.ssh\alibb_deploy
    

架构

浏览器 ──http:23010──► 1Panel OpenResty 站点(alibb)
                         ├─ /          → 站点 index(前端 dist 静态)
                         └─ /api/*     → backend 容器(:8080)
后端容器(alibb-backend,Express)──► 1Panel MySQL(alibaba 库,:3306)
扩展(抓 alibaba)──POST──► http://219.157.255.213:23010/api/ingest
  • 后端:~/alibb-server/backend,docker compose(backend 服务,build 本地 Dockerfile,映射 127.0.0.1:8080)。连 1Panel 已有的 MySQL(容器 1Panel-mysql-sLiG,库 alibaba,密码 wecbni5zRRnZrMMh)。env:JWT_SECRET/INGEST_TOKEN/ADMIN_PASSWORD 强随机(存服务器 ~/alibb-secrets.txt)。
  • 前端:~/alibb-server/frontend,docker build 出 dist → 复制到 1Panel 站点目录 /opt/1panel/apps/openresty/openresty/www/sites/alibb/index。用 1Panel 的 OpenResty serve(不再单独起 nginx 容器)。
  • 站点:1Panel 建的「alibb」站点,listen 23010,server_name 219.157.255.213,root = 站点 index,/api 反代到 backend:8080(容器名),try_files SPA fallback,client_max_body_size 50m。站点 conf 在 /opt/1panel/apps/openresty/openresty/conf/conf.d/alibb.conf(1Panel 管理,改后要在面板重载 OpenResty,别手改被覆盖)。
  • 访问:http://219.157.255.213:23010(admin / ADMIN_PASSWORD)

部署步骤(从零)

1. SSH 密钥(本机生成 + 上传 kt)

# 本机 Git Bash 生成
ssh-keygen -t ed25519 -f ~/.ssh/alibb_deploy -N ""
# 上传到 kt(用密码)
/c/Windows/System32/OpenSSH/scp.exe -i ... ~/.ssh/alibb_deploy.pub kt@219.157.255.213:... # 或 ssh-copy-id

2. 传代码(本机 → 服务器 ~/alibb-server)

cd /d && tar -czf ~/alibb-server.tgz --exclude='alibb-server/*/node_modules' --exclude='*/dist' --exclude='*/.git' alibb-server
/c/Windows/System32/OpenSSH/scp.exe -i ... 'C:\Users\30997\alibb-server.tgz' kt@219.157.255.213:/tmp/
# 服务器解压
... 'tar xzf /tmp/alibb-server.tgz -C ~'

3. 后端 build + up(连 alibaba 库)

cd ~/alibb-server/backend
# 生成线上密钥(替换 compose dev 值)
JWT_SECRET=$(openssl rand -hex 32); INGEST_TOKEN=$(openssl rand -hex 24); ADMIN_PASSWORD=$(openssl rand -hex 16)
sed -i -e "s/dev-ingest-token-1234/$INGEST_TOKEN/" -e "s/dev-jwt-secret-1234/$JWT_SECRET/" -e "s/admin-password-1234/$ADMIN_PASSWORD/" docker-compose.yml
# compose 改成连 1Panel mysql(alibaba 库)+ backend 端口映射 127.0.0.1:8080
sudo docker compose build backend
sudo docker compose up -d

4. 前端 build → 复制站点

cd ~/alibb-server/frontend
sudo docker run --rm -v "$PWD":/app -w /app node:22-alpine sh -c 'npm ci && npm run build'
SITE=/opt/1panel/apps/openresty/openresty/www/sites/alibb/index
sudo rm -rf "$SITE"/* && sudo cp -r dist/. "$SITE"/ && sudo chmod -R a+rX "$SITE"

5. 站点 conf(1Panel 面板配或 alibb.conf)

1Panel 面板建站点「alibb」(域名/IP 219.157.255.213,端口 23010,根目录 = 站点 index),再配:

  • 伪静态:try_files $uri $uri/ /index.html;(SPA 路由刷新)
  • 反向代理:/api/ → http://backend:8080(容器名,同 docker 网络;或 http://127.0.0.1:8080)
  • 或直接编辑 alibb.conf(root + /api proxy + try_files + client_max_body_size 50m),面板重载 OpenResty。

6. 安全组放 23010(云控制台)

TCP 23010 入站;服务器防火墙 sudo ufw allow 23010/tcp(若开)。

7. 验证

curl http://219.157.255.213:23010/              # 200(index.html)
curl http://219.157.255.213:23010/inquiries     # 200(SPA fallback)
curl http://219.157.255.213:23010/api/health    # {"ok":true}

浏览器开 http://219.157.255.213:23010 → admin / ADMIN_PASSWORD 登录。

8. 扩展配置

popup:serverUrl http://219.157.255.213:23010 + token(~/alibb-secrets.txt 的 INGEST_TOKEN)→ 授权 → 启用推送 → 抓取。

增量更新(改代码后)

  • 后端改:传变更文件 → cd ~/alibb-server/backend && sudo docker compose build backend && sudo docker compose up -d(migrate 自动跑)。
  • 前端改:传变更 → 服务器 npm run build → 复制 dist 到站点(Step 4)。
  • 扩展改:本机改 → chrome://extensions 刷新扩展(用户操作)。

常用运维

操作 命令
后端日志 sudo docker compose logs -f backend
重启后端 sudo docker compose restart backend
查库 sudo docker exec -e MYSQL_PWD=wecbni5zRRnZrMMh 1Panel-mysql-sLiG mysql -ualibaba alibaba
清询盘重抓 ... mysql ... -e "SET FOREIGN_KEY_CHECKS=0; TRUNCATE chat_messages; TRUNCATE inquiries; SET FOREIGN_KEY_CHECKS=1;"(customers 保留,重抓 upsert 更新)

已知限制

  • 折叠面板字段抓不到:客户资料折叠面板里的 手机/座机/商业类型/销售平台/公司官网,alibaba 检查 event.isTrusted(只接受真实鼠标点击),扩展 JS 无法展开。这些字段大部分买家本就是"-"(alibaba 默认隐藏联系方式)。保留抓其他全部(基本信息 + 行为数据 + 店内行为 + 最近询盘产品图)。
  • 风控:抓取间隔已随机化(randSleep),降低被识别为爬虫的概率;大量抓取建议分批 + 中途暂停。
  • MySQL 公网暴露:1Panel 的 mysql 映射 0.0.0.0:3306(1Panel 默认,非本次部署),建议后续在 1Panel 收紧为本地。

仓库

  • 扩展:d:/alibb(master)
  • 后端:d:/alibb-server/backend(master)
  • 前端:d:/alibb-server/frontend(main)
  • 服务器代码:~/alibb-server/{backend,frontend}