|
|
# 本次更新说明(2026-07-22a)— CC iframe 直登 + 对接文档 §2.5
|
|
|
|
|
|
| 项目 | 说明 |
|
|
|
|------|------|
|
|
|
| 打包文件 | **`上传到服务器/chajia-code-20260722a.zip`**(仅代码,约 0.75MB) |
|
|
|
| 对接文档 | **`上传到服务器/文档/api对接文档.md`**(v1.2) |
|
|
|
| 适用场景 | 服务器已有项目,增量覆盖代码 |
|
|
|
| 是否改库 | **否** |
|
|
|
| 是否改 `.env` | **否**(勿覆盖) |
|
|
|
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
|
|
|
|
|
|
### 本次代码要点
|
|
|
|
|
|
- `/embed-demo`:宿主传 `login_type` + `api_key` 自动登录,**跳过登录页**;成功后剥离 URL 敏感参数
|
|
|
- 生产嵌入 Cookie:`SameSite=None; Secure`(跨站 iframe)
|
|
|
- 密码 / Key 登录统一两模块门户(MotherShip / Flock)
|
|
|
- 对接文档 v1.2:§2.5 网页嵌入完整说明(参数、iframe 示例、排错)
|
|
|
|
|
|
### 上传与更新
|
|
|
|
|
|
```bash
|
|
|
cp .env .env.backup.$(date +%Y%m%d)
|
|
|
# 解压 chajia-code-20260722a.zip 覆盖代码后:
|
|
|
chmod +x deploy/update-code-only-bt-host-mysql.sh
|
|
|
bash deploy/update-code-only-bt-host-mysql.sh
|
|
|
```
|
|
|
|
|
|
CC iframe 示例:
|
|
|
|
|
|
```text
|
|
|
https://if.dev.51track.vip/embed-demo?login_type=api_key&api_key=<API_Key>&embed=1
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
# 历史:本次更新说明(2026-07-21d)— 嵌入门户两模块统一(密码=Key)
|
|
|
|
|
|
| 项目 | 说明 |
|
|
|
|------|------|
|
|
|
| 打包文件 | **`上传到服务器/chajia-code-20260721d.zip`**(仅代码) |
|
|
|
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
|
|
|
| 是否改库 | **否** |
|
|
|
| 是否改 `.env` | **否**(勿覆盖) |
|
|
|
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
|
|
|
|
|
|
### 本次代码要点
|
|
|
|
|
|
- 账号密码登录与 API Key 登录同一门户:仅 **MotherShip / Flock Freight** 两模块
|
|
|
- 模块内切换「免账号 / 登录后」;登录后可配置官网账密
|
|
|
- 含 21c:单位换算、选项互斥提示、MS/Flock 稳定性修复
|
|
|
|
|
|
### 上传与更新
|
|
|
|
|
|
```bash
|
|
|
cp .env .env.backup.$(date +%Y%m%d)
|
|
|
# 解压 chajia-code-20260721d.zip 覆盖代码后:
|
|
|
chmod +x deploy/update-code-only-bt-host-mysql.sh
|
|
|
bash deploy/update-code-only-bt-host-mysql.sh
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
# 历史:本次更新说明(2026-07-21c)— 单位换算 / 选项互斥提示 / MS+Flock 稳定性
|
|
|
|
|
|
| 项目 | 说明 |
|
|
|
|------|------|
|
|
|
| 打包文件 | **`上传到服务器/chajia-code-20260721c.zip`**(仅代码) |
|
|
|
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
|
|
|
| 是否改库 | **否**(本次无新 migration) |
|
|
|
| 是否改 `.env` | **否**(保留现有即可;勿用包内覆盖) |
|
|
|
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
|
|
|
|
|
|
### 本次代码要点
|
|
|
|
|
|
- API 重量/尺寸公制换算(`kg/t`、`cm/m` → `lb/in`,进一)
|
|
|
- MotherShip:地址确认假阳性修复;附加服务 appointment 超时加固;登录态选项互斥提示(禁住宅提货等)
|
|
|
- Flock:调度 radio 点击降级;登录态选项提示(冷藏须温控、易无价地点/包装)
|
|
|
- 询价失败中文原因展示增强
|
|
|
|
|
|
### 上传与更新(推荐)
|
|
|
|
|
|
```powershell
|
|
|
# 开发机:
|
|
|
# X:\work\chajia\上传到服务器\chajia-code-20260721c.zip
|
|
|
# X:\work\chajia\上传到服务器\代码\
|
|
|
```
|
|
|
|
|
|
服务器(项目根目录,勿覆盖 `.env`):
|
|
|
|
|
|
```bash
|
|
|
cp .env .env.backup.$(date +%Y%m%d)
|
|
|
# 解压 zip 覆盖代码目录后:
|
|
|
chmod +x deploy/update-code-only-bt-host-mysql.sh
|
|
|
bash deploy/update-code-only-bt-host-mysql.sh
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
# 历史:本次更新说明(2026-07-21)— 嵌入 Key 登录 / 中文报错 / 预警中文化
|
|
|
|
|
|
| 项目 | 说明 |
|
|
|
|------|------|
|
|
|
| 打包文件 | **`chajia-code-20260721.zip`**(仅代码,约 0.74MB) |
|
|
|
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
|
|
|
| 是否改库 | **否**(本次无新 migration) |
|
|
|
| 是否改 `.env` | **否**(保留现有即可) |
|
|
|
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
|
|
|
|
|
|
### 本次代码要点
|
|
|
|
|
|
- `/embed-demo`:账号密码 / API Key 双登录;Key 登录后 4 路线门户(MotherShip/Flock × 免账号/登录后)
|
|
|
- 承运商账密明文回显 + 可保存修改;登录失败 `PROVIDER_LOGIN_FAILED` 中文提示
|
|
|
- 查价失败 / 管理端预警详情:英文 Playwright 日志译中文(含 `locator.waitFor`)
|
|
|
|
|
|
### 上传与更新(推荐)
|
|
|
|
|
|
```powershell
|
|
|
# 开发机已生成:
|
|
|
# X:\work\chajia\chajia-code-20260721.zip
|
|
|
# X:\work\chajia\上传到服务器\代码\
|
|
|
```
|
|
|
|
|
|
服务器(项目根目录,勿覆盖 `.env`):
|
|
|
|
|
|
```bash
|
|
|
cp .env .env.backup.$(date +%Y%m%d)
|
|
|
# 解压 zip 覆盖代码目录后:
|
|
|
chmod +x deploy/update-code-only-bt-host-mysql.sh
|
|
|
bash deploy/update-code-only-bt-host-mysql.sh
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
# 历史:本次更新说明(2026-07-16)— Flock Freight + MotherShip 登录查价 + 客户承运商账密
|
|
|
|
|
|
## 更新主题
|
|
|
|
|
|
| 项目 | 说明 |
|
|
|
|------|------|
|
|
|
| 打包时间 | 2026-07-16(安全增量包) |
|
|
|
| 适用场景 | **服务器已有查价项目**,增量同步本地大更新 |
|
|
|
| 是否改库 | **仅本机 DataGrip 跑 SQL**;服务器上不改库、不跑 migrate;勿重导 `chajia.sql` |
|
|
|
| 是否改 `.env` | **保留**已有 `.env`,**必须追加**下方 Flock / 轮询变量 |
|
|
|
| 是否必须清 Redis | **建议**(避免旧报价缓存) |
|
|
|
| 是否必须重建镜像 | **是**(next-app + rpa-worker 均有大量新代码) |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 安全更新铁律(省磁盘 / 不伤现网)
|
|
|
|
|
|
1. **只覆盖 `代码/`**:不要上传/解压 `数据库/`(增量更新勿导入 SQL)
|
|
|
2. **绝对勿覆盖服务器 `.env`**:上传包不含根目录 `.env`;覆盖前先 `cp .env .env.backup.$(date +%Y%m%d)`
|
|
|
3. **勿停其他无关容器**:只操作本项目 compose 文件 `deploy/docker-compose.bt-host-mysql.yml`
|
|
|
4. **省磁盘**:解压后立刻删 zip;构建前 `df -h`;构建后可 `docker image prune -f`(勿加 `-a`,避免误删正在用的镜像)
|
|
|
5. **防 SSH 断线**:`nohup bash deploy/install-bt-host-mysql.sh > /tmp/chajia-deploy.log 2>&1 &`
|
|
|
6. **构建慢属正常**:`npm ci` + `npm run build` 常需 10–30 分钟,勿反复 Ctrl+C 重开并行构建
|
|
|
|
|
|
---
|
|
|
|
|
|
## 本次必上传 / 必生效的变更清单(勿遗漏)
|
|
|
|
|
|
### A. 代码(打包脚本 `代码/` 已覆盖)
|
|
|
|
|
|
| 模块 | 关键路径 | 说明 |
|
|
|
|------|----------|------|
|
|
|
| Flock 嵌入 UI | `components/flock/`、`app/api/flock/` | 第二报价源表单 / 两档结果 / 轮询 |
|
|
|
| Flock RPA | `workers/rpa/flock*`、`lib/flock/`、`modules/flock/` | Direct + DOM 回退、登录态、队列 `flock-quote` |
|
|
|
| MotherShip 登录查价 | `workers/rpa/mothership-logged-in-quote.ts`、`components/mothership/`、`lib/rpa/mothership-login-context.ts` | 登录态填表刮价 |
|
|
|
| 地址联想 | `app/api/addresses/mothership-suggest/`、`lib/address/` | 登录态选址 |
|
|
|
| 客户承运商账密 | `modules/customer/provider-credentials.ts`、`app/api/admin/customers/.../provider-credentials/`、`app/admin/customers/` | 按客户配置 MotherShip/Flock 官网账密 |
|
|
|
| 中间件 | `middleware.ts` | 放行 `/api/flock`、`/api/addresses` |
|
|
|
| Prisma | `prisma/schema.prisma` + `prisma/migrations/` | 见下方迁移 |
|
|
|
| 依赖清单 | `package.json` / `package-lock.json` | Docker `npm ci` 用 |
|
|
|
|
|
|
### B. 数据库变更(二选一)
|
|
|
|
|
|
| Migration | 作用 |
|
|
|
|-----------|------|
|
|
|
| `20260709175000_service_api_key_ciphertext` | `service_api_key.token_ciphertext` |
|
|
|
| `20260715094000_customer_provider_credential` | 新表 `customer_provider_credential` |
|
|
|
|
|
|
- **推荐**:本机 DataGrip 执行 `deploy/datagrip-manual-migrate-20260716.sql`(服务器零改库)
|
|
|
- **禁止混用**:DataGrip 改过库后,不要再跑 `install-bt-host-mysql.sh` 的自动 migrate
|
|
|
|
|
|
### C. `.env` 必须追加(生产)
|
|
|
|
|
|
```env
|
|
|
# ── Flock Freight(默认关;开启才出现报价源切换)──
|
|
|
FLOCK_RPA_ENABLED=true
|
|
|
FLOCK_QUOTE_URL=https://app.flockfreight.com/get-a-quote
|
|
|
FLOCK_QUOTE_MODE=direct_then_dom
|
|
|
FLOCK_STORAGE_STATE_PATH=.rpa/flock-storage.json
|
|
|
FLOCK_MIN_QUOTES=1
|
|
|
FLOCK_QUOTE_WAIT_MS=20000
|
|
|
FLOCK_POLL_TIMEOUT_MS=210000
|
|
|
NEXT_PUBLIC_FLOCK_POLL_TIMEOUT_MS=210000
|
|
|
FLOCK_WORKER_REUSE_SESSION=false
|
|
|
FLOCK_SESSION_MAX_ROTATIONS=1
|
|
|
|
|
|
# 可选:全局 Flock 登录(优先推荐在管理端「客户管理」按客户配置账密)
|
|
|
# FLOCK_LOGIN_EMAIL=
|
|
|
# FLOCK_LOGIN_PASSWORD=
|
|
|
|
|
|
# MotherShip 登录查价:优先管理端客户账密;也可继续用全局:
|
|
|
# MOTHERSHIP_EMAIL=
|
|
|
# MOTHERSHIP_PASSWORD=
|
|
|
```
|
|
|
|
|
|
**Docker 生产禁止**(若存在请删除/注释):
|
|
|
|
|
|
```env
|
|
|
# RPA_BROWSER_CHANNEL=chrome
|
|
|
```
|
|
|
|
|
|
容器内无系统 Chrome;设了会启动失败。
|
|
|
|
|
|
**已有项保留**:`MASTER_LOGIN_PASSWORD`、`JWT_SECRET`、`DATABASE_URL`、`HOST_SERVICE_TOKENS`、`RPA_DWELL_MS` 等不要丢。
|
|
|
|
|
|
### D. 管理端部署后必配(数据,非文件)
|
|
|
|
|
|
1. 打开 `/admin/customers`,为需要登录态查价的客户配置 **MotherShip / Flock** 官网邮箱密码
|
|
|
2. 未配置时:Flock 可能走无痕/弱注册路径(不稳定);MotherShip 登录查价会缺凭据失败
|
|
|
|
|
|
---
|
|
|
|
|
|
## 本次主要功能(相对服务器 2026-07-10 版)
|
|
|
|
|
|
1. **Flock Freight** 第二报价源(嵌入切换、Direct API 优先 + DOM 回退、串行锁、轮询 210s)
|
|
|
2. **MotherShip 登录后查价**(客户账密 → storage / 登录页 → 填表刮价)
|
|
|
3. **客户级承运商账密**(加密存库,管理端只读查看)
|
|
|
4. **MotherShip 地址联想 API**(登录态选址)
|
|
|
5. 历次能力保留:万能登录密码、客户 API Key、Priority1、加价、embed-demo
|
|
|
|
|
|
---
|
|
|
|
|
|
## 零、开发机打包(Windows)
|
|
|
|
|
|
```powershell
|
|
|
cd X:\work\chajia
|
|
|
powershell -ExecutionPolicy Bypass -File deploy\pack-server-upload.ps1
|
|
|
Compress-Archive -Path "上传到服务器\*" -DestinationPath "chajia-upload-20260716.zip" -Force
|
|
|
```
|
|
|
|
|
|
生成目录:
|
|
|
|
|
|
```
|
|
|
上传到服务器/
|
|
|
├── README.md
|
|
|
├── RELEASE-NOTES.md ← 本文件(操作步骤)
|
|
|
├── 辅助脚本/
|
|
|
├── 代码/ ← 上传此目录全部内容(增量更新只传这个)
|
|
|
└── 数据库/ ← 本次增量更新不必上传、不必导入
|
|
|
```
|
|
|
|
|
|
**推荐上传方式(省磁盘)**:只把 **`代码/`** 打成 zip(或整包解压后只覆盖 `代码/`),**不要**把 `数据库/` 传到服务器。
|
|
|
|
|
|
```powershell
|
|
|
# 更省空间的上传包(仅代码,约数 MB~十几 MB)
|
|
|
Compress-Archive -Path "上传到服务器\代码\*" -DestinationPath "chajia-code-20260716.zip" -Force
|
|
|
```
|
|
|
|
|
|
服务器解压后:用 `代码/` 覆盖 `/home/project/chajia/`,**保留 `.env`**。
|
|
|
**推荐走下方「方式 B」**(DataGrip 改库 + 代码-only 脚本),不要用会自动 migrate 的安装脚本。
|
|
|
|
|
|
---
|
|
|
|
|
|
## 一、服务器更新步骤(场景 B:已有旧版)
|
|
|
|
|
|
### 1. 备份
|
|
|
|
|
|
```bash
|
|
|
cd /home/project/chajia
|
|
|
cp .env .env.backup.$(date +%Y%m%d)
|
|
|
```
|
|
|
|
|
|
### 2. 上传代码
|
|
|
|
|
|
用 **`代码/`** 覆盖 `/home/project/chajia/`。**勿覆盖 `.env`**。
|
|
|
确认存在:`deploy/datagrip-manual-migrate-20260716.sql`、`deploy/update-code-only-bt-host-mysql.sh`。
|
|
|
|
|
|
### 3. 追加 `.env`(勿整文件替换)
|
|
|
|
|
|
```bash
|
|
|
cd /home/project/chajia
|
|
|
|
|
|
grep -q '^FLOCK_RPA_ENABLED=' .env || cat >> .env <<'EOF'
|
|
|
|
|
|
# --- 2026-07-16 Flock Freight ---
|
|
|
FLOCK_RPA_ENABLED=true
|
|
|
FLOCK_QUOTE_URL=https://app.flockfreight.com/get-a-quote
|
|
|
FLOCK_QUOTE_MODE=direct_then_dom
|
|
|
FLOCK_STORAGE_STATE_PATH=.rpa/flock-storage.json
|
|
|
FLOCK_MIN_QUOTES=1
|
|
|
FLOCK_QUOTE_WAIT_MS=20000
|
|
|
FLOCK_POLL_TIMEOUT_MS=210000
|
|
|
NEXT_PUBLIC_FLOCK_POLL_TIMEOUT_MS=210000
|
|
|
FLOCK_WORKER_REUSE_SESSION=false
|
|
|
FLOCK_SESSION_MAX_ROTATIONS=1
|
|
|
EOF
|
|
|
|
|
|
grep -q '^MASTER_LOGIN_PASSWORD=' .env || echo 'MASTER_LOGIN_PASSWORD=mmgy2026master' >> .env
|
|
|
sed -i '/^RPA_BROWSER_CHANNEL=chrome/d' .env || true
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
### 方式 B(推荐)— DataGrip 只改库 SQL + 服务器只更新代码
|
|
|
|
|
|
#### B1. 本机 DataGrip(唯一改库步骤)
|
|
|
|
|
|
1. 连 `192.168.2.14` → 库 **`chajia`**
|
|
|
2. console 粘贴并执行 `deploy/datagrip-manual-migrate-20260716.sql`(或下方两段 DDL)
|
|
|
3. 刷新表列表:应有 `customer_provider_credential`;`service_api_key` 有 `token_ciphertext`
|
|
|
4. **服务器上不要跑任何改库命令**
|
|
|
|
|
|
#### B2. 服务器只更新代码/镜像(不碰库)
|
|
|
|
|
|
```bash
|
|
|
cd /home/project/chajia
|
|
|
chmod +x deploy/update-code-only-bt-host-mysql.sh
|
|
|
bash deploy/update-code-only-bt-host-mysql.sh
|
|
|
```
|
|
|
|
|
|
#### B3. 清 Redis(建议)
|
|
|
|
|
|
```bash
|
|
|
docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml exec redis redis-cli FLUSHDB
|
|
|
```
|
|
|
|
|
|
**以后禁止**再跑 `install-bt-host-mysql.sh`(会自动 migrate,与 DataGrip 手改冲突)。
|
|
|
|
|
|
---
|
|
|
|
|
|
### 方式 A(不推荐本次)— 安装脚本自动改库
|
|
|
|
|
|
仅当你**不用** DataGrip、接受服务器自动 `migrate deploy` 时:
|
|
|
|
|
|
```bash
|
|
|
chmod +x deploy/install-bt-host-mysql.sh
|
|
|
nohup bash deploy/install-bt-host-mysql.sh > /tmp/chajia-deploy.log 2>&1 &
|
|
|
```
|
|
|
|
|
|
**注意**:方式 B 与方式 A **不要混用**。
|
|
|
|
|
|
---
|
|
|
|
|
|
### 4. 部署后数据配置
|
|
|
|
|
|
1. 管理端登录:`admin_demo` + 万能密码(或库内密码)
|
|
|
2. **客户管理** → 为目标客户写入 MotherShip / Flock 官网账密
|
|
|
3. 确认客户 embed 密码 / API Key 仍可用
|
|
|
|
|
|
---
|
|
|
|
|
|
## 二、验收
|
|
|
|
|
|
| 检查项 | 操作 | 预期 |
|
|
|
|--------|------|------|
|
|
|
| 容器 | `docker compose ... ps` | next-app / rpa-worker / scheduler / redis 均为 Up |
|
|
|
| 管理端 | `/login` | 可进 `/admin/customers`,可查看承运商账密 |
|
|
|
| MotherShip 匿名 | `/embed-demo` → MotherShip | 询价出 4 档或明确失败码 |
|
|
|
| MotherShip 登录 | 已配账密客户 + 登录查价开关 | 出承运商价卡(非空超时) |
|
|
|
| Flock | 切换 Flock 报价源 | 出两档结果;超时约 210s 内有终态 |
|
|
|
| 库表 | DataGrip | 有 `token_ciphertext` 列 + `customer_provider_credential` 表 |
|
|
|
|
|
|
Worker 日志:
|
|
|
|
|
|
```bash
|
|
|
docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml logs -f rpa-worker --tail 100
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 三、失败排查
|
|
|
|
|
|
| 现象 | 处理 |
|
|
|
|------|------|
|
|
|
| embed 无 Flock 切换 | `.env` 缺 `FLOCK_RPA_ENABLED=true` 或未重建 next-app |
|
|
|
| Flock 一直转圈后超时 | 查 rpa-worker;确认客户/全局登录账密;看是否撞报价上限 |
|
|
|
| MotherShip 登录查价失败 | 管理端是否已配该客户 MotherShip 账密 |
|
|
|
| `chrome is not found` | 删除 `RPA_BROWSER_CHANNEL=chrome` 后重建 rpa-worker |
|
|
|
| Duplicate column / table | 该 DDL 已执行过,跳过即可 |
|
|
|
| 构建 OOM | 用方式 B 串行脚本;或加 Swap;勿并行多个 compose build |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 四、回滚
|
|
|
|
|
|
还原更新前目录 / zip,恢复 `.env.backup.*`,再执行方式 B 的 build/up(或方式 A 安装脚本)。
|
|
|
库表回滚需在 DataGrip 手工:`DROP TABLE customer_provider_credential`;`ALTER TABLE service_api_key DROP COLUMN token_ciphertext`(仅确认无依赖后)。
|
|
|
|
|
|
---
|
|
|
|
|
|
# 历史更新说明(2026-07-10)— 管理员万能登录密码
|
|
|
|
|
|
## 更新主题
|
|
|
|
|
|
| 项目 | 说明 |
|
|
|
|------|------|
|
|
|
| 打包时间 | 2026-07-10 |
|
|
|
| 适用场景 | **服务器已有查价项目**,增量更新代码 |
|
|
|
| 是否改库 | **否**(安装脚本仍会 `prisma migrate deploy`) |
|
|
|
| 是否改 `.env` | **保留**已有 `.env`,**须追加** `MASTER_LOGIN_PASSWORD`(见下) |
|
|
|
| 是否必须清 Redis | **否** |
|
|
|
|
|
|
### 本次主要功能
|
|
|
|
|
|
1. **管理员万能登录密码**:`.env` 配置 `MASTER_LOGIN_PASSWORD` 后,可用该密码登录管理端与 embed-demo
|
|
|
2. **安全**:未配置则禁用;`timingSafeEqual` 防时序攻击
|
|
|
|
|
|
```env
|
|
|
MASTER_LOGIN_PASSWORD=mmgy2026master
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
# 历史更新说明(2026-07-07)— Priority1 网络重试 + 加价展示
|
|
|
|
|
|
详见仓库 git 历史与更早打包记录。完整运维命令、场景 A 首次部署见同目录打包后的说明或 `deploy/服务器更新说明.md`。
|