# 本次更新说明(2026-07-03)— 登录门控 + 多租户加价 ## 更新主题 **管理端登录改造、嵌入演示客户登录、宿主 API 按客户加价** | 项目 | 说明 | |------|------| | 打包时间 | 2026-07-03 | | 适用场景 | 服务器**已有**查价项目,同步本次代码 | | 是否改库 | **不必**重导 `chajia.sql`;安装脚本会自动 `prisma migrate deploy` | | 是否改 `.env` | **保留**服务器已有 `.env`;可删除已废弃的 `NEXT_PUBLIC_EMBED_DEMO_*` | | 是否必须清 Redis | **建议**(避免旧报价缓存) | ### 本次主要变更 1. **管理端** `/login`:不再预填/展示演示账号,须手动输入密码 2. **嵌入演示** `/embed-demo`:客户编号 + 密码 `123456` 登录,按客户展示加价并查价 3. **宿主 API**:按 Token 对应 `customer_id` 加价(如 `CUST_002`) 4. **客户管理**:管理端可签发 API Key,多客户无需改 `.env` 5. seed 默认管理员密码改为 **`kj123456`**(已有库需手动改密,见下方) ### 已有服务器:管理员改密 若 `admin_demo` 仍为旧密码 `Demo@123`,登录管理端后在个人设置改密,或在服务器执行: ```bash cd /home/project/chajia docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml exec rpa-worker \ node -e "const b=require('bcryptjs');b.hash('kj123456',10).then(h=>console.log(h))" ``` 将输出的哈希更新到 `admin_user.password_hash`(用户名 `admin_demo`)。 ### 快速更新步骤(场景 B) ```bash cd /home/project/chajia cp .env .env.backup.$(date +%Y%m%d) # 用 zip 解压后的「代码/」覆盖本目录(勿覆盖 .env) chmod +x deploy/install-bt-host-mysql.sh bash deploy/install-bt-host-mysql.sh docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml exec redis redis-cli FLUSHDB ``` ### 验收 | 页面 | 操作 | 预期 | |------|------|------| | `/login` | `admin_demo` / `kj123456` | 进入管理端 | | `/embed-demo` | `CUST_002` / `123456` | 显示 CUST_002 加价配置并可查价 | | `/embed-demo` | 换 `CUST_001` 登录 | 加价配置变化 | --- # 历史说明(2026-07-01)— 首次上服务器 ## 更新主题 **Priority1 独立询价链路 + 宿主公开 API + 报价展示与解析修复** | 项目 | 说明 | |------|------| | 打包时间 | 2026-07-01 | | 适用场景 | 本地开发已久,**第一次**将完整代码同步到服务器 | | 是否改库 | **首次部署需导入** `数据库/chajia.sql`;仅更新代码时**不必**重导 | | 是否改 `.env` | **首次**从模板复制并填写;**更新时保留**服务器已有 `.env`,仅**追加**下方新变量 | | 是否必须清 Redis | **建议**(避免读到旧报价缓存) | --- ## 本次主要功能(相对服务器旧版) 1. **Priority1** 独立询价(LTL 卡片 / FTL 日历),不再复用 MotherShip 结果面板 2. **宿主公开 API**:`POST /api/host/quote/candidates`、`POST /api/host/quote/submit` 3. **报价解析修复**:承运商、金额以 Feathery 摘要为准,与官网卡片一致 4. **MotherShip** 档位解码放宽(Denver→Boston 等路线) 5. RPA Worker 提速:`RPA_DWELL_MS=0`、`RPA_PRIORITY1_WORKER_FAST=true` 6. **构建修复**:Priority1 类型统一,Docker `npm run build` 可通过 7. **浏览器修复**:Priority1 Worker 使用镜像内置 Chromium(勿在服务器设 `RPA_BROWSER_CHANNEL=chrome`) 8. **暂无报价修复**:Priority1 失败不再误用 MotherShip 历史缓存;无数据时 API 返回明确失败原因 9. **FTL 日历修复**:修复 `Invalid Date`,并按官网真实日期落格显示每日金额 --- ## 重要:`.env` 检查(本次必做) 服务器 `.env` 中 **不要** 出现: ```env RPA_BROWSER_CHANNEL=chrome ``` 若存在请删除或注释。Docker Worker 无系统 Chrome,设此项会报: `Chromium distribution 'chrome' is not found at /opt/google/chrome/chrome` --- ## 零、开发机打包(Windows) 在项目根目录执行: ```powershell cd X:\work\chajia powershell -ExecutionPolicy Bypass -File deploy\pack-server-upload.ps1 ``` 成功后生成目录: ``` 上传到服务器/ ├── README.md # 通用说明 ├── RELEASE-NOTES.md # 本次部署/更新详细步骤(必读)(操作步骤) ├── 辅助脚本/ # API 验收(可选) │ ├── test-denver-boston.sh │ └── test-peachtree-tremont.sh ├── 代码/ # ← 上传此目录全部内容到服务器 └── 数据库/ # 首次部署需导入 ├── chajia.sql ├── chajia.sql.gz └── README.md ``` 将整个 **`上传到服务器`** 文件夹打成 **zip**,用宝塔文件管理 / FTP / `scp` 传到服务器后解压。 --- ## 一、场景判断 | 场景 | 你要做的事 | |------|------------| | **A. 服务器从未装过查价** | 导入数据库 → 上传代码 → 配置 `.env` → 执行安装脚本 | | **B. 服务器已有旧版查价** | 只上传 `代码/` 覆盖 → **勿覆盖 `.env`** → 补全新变量 → 执行安装脚本 | 以下以宝塔 + 宿主机 MySQL + Docker 为例(路径 `/home/project/chajia`,端口 `30325`)。 --- ## 二、场景 A — 全新首次部署 ### 2.1 宝塔 MySQL 1. 创建数据库 **`chajia`**,字符集 **`utf8mb4`** 2. 导入 **`数据库/chajia.sql`** 3. 创建用户 **`chajia`**,授权主机 **`172.%`**(Docker 容器访问宿主机 MySQL) ```sql -- 示例(密码换成宝塔里实际密码) GRANT ALL PRIVILEGES ON chajia.* TO 'chajia'@'172.%'; FLUSH PRIVILEGES; ``` ### 2.2 上传代码 将 **`代码/`** 内**全部文件**上传到: ``` /home/project/chajia/ ``` ### 2.3 配置环境变量 ```bash cd /home/project/chajia cp deploy/.env.bt-host-mysql.example .env nano .env ``` **必改项**(搜索 `CHANGE_ME` 或对照宝塔): | 变量 | 说明 | |------|------| | `APP_PORT` | 对外端口,如 `30325` | | `PUBLIC_HOST` | 服务器内网 IP | | `MYSQL_PASSWORD` | 宝塔 MySQL 用户 `chajia` 的密码 | | `DATABASE_URL` | `mysql://chajia:密码@host.docker.internal:3306/chajia`(密码与上一行一致) | | `JWT_SECRET` | 随机长串 | | `HOST_SERVICE_TOKENS` | 内网 API Token(JSON 单行) | | `CUSTOMER_REGISTRY` | 如 `CUST_001` | 模板已含 Priority1 提速项,确认存在即可: ```env RPA_DWELL_MS=0 RPA_SLOW_MO_MS=0 RPA_PRIORITY1_WORKER_FAST=true RPA_MOCK_MODE=false ``` ### 2.4 安装并启动 ```bash chmod +x deploy/install-bt-host-mysql.sh bash deploy/install-bt-host-mysql.sh ``` 约 **5~15 分钟**(Docker 构建镜像)。完成后脚本会输出内网访问地址。 ### 2.5 防火墙 宝塔 / 安全组放行 **`30325`**(内网即可)。**不要**对公网开放 3306、6379。 --- ## 三、场景 B — 已有旧版,首次同步本地新代码 ### 3.1 备份(强烈建议) ```bash cd /home/project/chajia cp .env .env.backup.$(date +%Y%m%d) # 可选:整目录备份 # cd /home/project && tar czf chajia-backup-$(date +%Y%m%d).tar.gz chajia ``` ### 3.2 上传代码 用 **`代码/`** 覆盖 `/home/project/chajia/`,**不要上传或覆盖 `.env`**。 ### 3.3 补全 `.env` 新变量(在原有基础上追加) 若服务器 `.env` 较旧,用 `nano .env` 检查并补上(没有则加): ```env # Priority1 / Worker 提速 RPA_DWELL_MS=0 RPA_SLOW_MO_MS=0 RPA_QUOTE_POLL_MS=600 RPA_PRIORITY1_WORKER_FAST=true # 宿主公开 API(按需) HOST_PUBLIC_API_ENABLED=true HOST_PUBLIC_DEFAULT_CUSTOMER_ID=CUST_001 # embed-demo 前端 Token(须与 HOST_SERVICE_TOKENS 的 key 一致) NEXT_PUBLIC_EMBED_DEMO_SERVICE_TOKEN=chajia-neibu-2026 NEXT_PUBLIC_EMBED_DEMO_CUSTOMER_ID=CUST_001 ``` 改 `.env` 后需**重建 next-app**(见 3.5)。 ### 3.4 执行更新 ```bash cd /home/project/chajia test -f .env && echo "OK: .env exists" || { echo "ERROR: 缺少 .env"; exit 1; } chmod +x deploy/install-bt-host-mysql.sh bash deploy/install-bt-host-mysql.sh ``` 脚本自动:`docker compose build` → 启动 **next-app + rpa-worker + scheduler + redis** → `prisma migrate deploy`。 ### 3.5 若只改了 `.env` 未改代码 ```bash docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml up -d --build next-app docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml restart rpa-worker scheduler ``` ### 3.6 清空 Redis 报价缓存(建议) ```bash docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml exec redis redis-cli FLUSHDB ``` --- ## 四、部署后检查 ```bash cd /home/project/chajia docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml ps ``` 应看到 **`next-app`、`rpa-worker`、`scheduler`、`redis`** 均为 **Up**。 ```bash curl -I http://127.0.0.1:30325 ``` 浏览器访问(IP 换成实际): | 用途 | 地址 | |------|------| | 嵌入演示 | `http://192.168.2.14:30325/embed-demo` | | 管理端 | `http://192.168.2.14:30325/admin/alerts` | | 默认账号 | `admin_demo` / `Demo@123`(上线后请改密) | 查看 Worker 日志: ```bash docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml logs -f rpa-worker --tail 100 ``` --- ## 五、验收测试 将 `192.168.2.14:30325` 换成实际 **IP:端口**。 ### 5.1 MotherShip 回归(embed-demo → MotherShip) ```bash export CHAJIA_BASE_URL="http://192.168.2.14:30325" export CHAJIA_SERVICE_TOKEN="chajia-neibu-2026" export CHAJIA_CUSTOMER_ID="CUST_001" bash 辅助脚本/test-denver-boston.sh ``` ### 5.2 Priority1(embed-demo 切换到 Priority1) 1. 打开 `/embed-demo`,选择 **Priority1** 2. 填写 LTL 询价(单托 500 lb 等) 3. **预期**:出现官网风格 LTL 卡片;承运商为真实名称(非「未解析承运商」);金额与官网一致 ### 5.3 失败排查 | 现象 | 处理 | |------|------| | `Can't connect to MySQL` / P1000 | `.env` 密码与宝塔不一致;用户未授权 `172.%` | | 询价一直 `processing` | 查 `rpa-worker` 日志;确认 `RPA_MOCK_MODE=false` | | Priority1 承运商/金额不对 | 确认已**重建 rpa-worker 镜像**(必须跑完整 `install-bt-host-mysql.sh`) | | embed-demo 卡「正在查询报价」 | `restart rpa-worker`;检查 `GET /api/quotes/{id}` 是否返回 JSON | | 构建很慢 / 内存不足 | 服务器建议 **4GB+** 内存;构建时勿并发多个 compose build | --- ## 六、常用运维命令 ```bash cd /home/project/chajia COMPOSE="docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml" # 查看日志 $COMPOSE logs -f next-app $COMPOSE logs -f rpa-worker # 重启全部 $COMPOSE restart # 仅重启 Worker(改 RPA 逻辑后建议) $COMPOSE up -d --build rpa-worker # 停止 $COMPOSE down ``` --- ## 七、回滚 保留更新前目录或 zip 备份。出问题时还原文件后: ```bash bash deploy/install-bt-host-mysql.sh ``` --- ## 八、文档索引 | 文档 | 路径 | |------|------| | 打包目录说明 | `上传到服务器/README.md` | | 宝塔部署详解 | `代码/deploy/宝塔部署说明.md` | | API 对接 | `代码/deploy/API.md` | | 第三方对接 | `代码/deploy/第三方对接指南.md` |