Files
alibaba/docs/superpowers/plans/2026-07-15-deploy-test-env.md
T

127 lines
6.4 KiB
Markdown
Raw Normal View History

2026-08-27 16:12:37 +08:00
# 线上测试环境部署(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 被拒):
```bash
/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)
```bash
# 本机 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)
```bash
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 库)
```bash
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 → 复制站点
```bash
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. 验证
```bash
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}`