You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chajia/deploy/服务器更新说明.md

370 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 本次更新说明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 TokenJSON 单行) |
| `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
```
**515 分钟**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 Priority1embed-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` |