# 线上测试环境部署(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}`