# 查价中台 — 服务器部署指南

将本项目**整个目录**上传到 Linux 服务器后，按下列步骤操作。

## 一、服务器要求

| 项 | 建议 |
|----|------|
| 系统 | Ubuntu 22.04 / Debian 12 |
| CPU | 2 核+ |
| 内存 | **4GB+**（RPA 浏览器占内存） |
| 磁盘 | 20GB+ |
| 软件 | Docker 24+、Docker Compose V2 |
| 网络 | 可访问 `www.mothership.com` |

```bash
# 安装 Docker（如未安装）
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker "$USER"
# 重新登录后生效
```

## 二、上传与配置（人工填写）

```bash
cd /opt/chajia          # 你的项目目录

# 1. 复制环境变量模板
cp deploy/.env.production.example .env

# 2. 编辑 .env — 必须修改以下项（搜索 CHANGE_ME）：
nano .env
```

### 必须人工填写的项

| 变量 | 说明 |
|------|------|
| `MYSQL_ROOT_PASSWORD` | 数据库强密码 |
| `JWT_SECRET` | 随机密钥，例：`openssl rand -base64 32` |
| `PUBLIC_DOMAIN` | 对外域名，如 `quote.yourcompany.com` |
| `HOST_SERVICE_TOKENS` | 给外部系统的 API Token（JSON 单行） |
| `CUSTOMER_REGISTRY` | 客户 ID，与 token 中 `customerId` 一致 |
| `MOTHERSHIP_EMAIL` / `MOTHERSHIP_PASSWORD` | 仅当 Mothership 要求登录时填写 |

### 可选修改

| 变量 | 说明 |
|------|------|
| `APP_PORT` | 默认 3000，仅本机监听 |
| `RPA_SELECTOR_*` | Mothership 页面改版时需更新 |

## 三、一键部署

```bash
chmod +x deploy/install.sh
bash deploy/install.sh
```

脚本将自动：构建镜像 → 启动 MySQL/Redis/Web/Worker/Scheduler → 数据库迁移 → 种子数据。

### 配置 Nginx 反代（对外提供 HTTPS API）

**仅 HTTP（内网或临时测试）：**

```bash
# 先改 deploy/nginx/chajia.http.conf 里的 server_name，或设置 .env 的 PUBLIC_DOMAIN
bash deploy/install.sh --nginx-http
```

**HTTPS（生产推荐）：**

```bash
# 1. 安装 nginx、certbot
sudo apt install -y nginx certbot python3-certbot-nginx

# 2. 先 HTTP 部署拿到证书
bash deploy/install.sh --nginx-http
sudo certbot certonly --nginx -d quote.yourcompany.com

# 3. 切换 HTTPS 配置（install 会按 PUBLIC_DOMAIN 替换域名）
bash deploy/install.sh --nginx-ssl
```

或手动复制并修改：

- `deploy/nginx/chajia.http.conf` → `/etc/nginx/sites-available/chajia`
- `deploy/nginx/chajia.ssl.conf` → 有证书后使用

## 四、部署后检查清单（人工）

- [ ] `docker compose -f deploy/docker-compose.yml ps` 五个服务均为 `Up`
- [ ] `curl -I http://127.0.0.1:3000` 返回 200/307
- [ ] 浏览器打开 `https://你的域名/admin/alerts` 能进管理端
- [ ] **修改默认管理员密码**（seed 默认：`admin_demo` / `Demo@123`）
- [ ] 用外部 Token 调 `POST /api/addresses/mothership-candidates` 返回 `code: 0`
- [ ] 完整询价：`POST /api/quotes` → 轮询 `GET /api/quotes/{id}` 得到 4 档报价
- [ ] 防火墙：只开放 **80/443**，**不要**暴露 3306/6379/3000

## 五、给外部系统的调用说明

**Base URL：** `https://你的域名`

**请求头：**

```http
Authorization: Bearer <HOST_SERVICE_TOKENS 里的 token>
X-Customer-Id: CUST_001
Content-Type: application/json
```

**流程：**

1. `POST /api/addresses/mothership-candidates` — 地址联想  
2. `POST /api/quotes` — 提交询价  
3. `GET /api/quotes/{quote_id}` — 每 2 秒轮询，最长约 30 秒  

详细字段见 `docs/查价系统-PRD.md` 第 4、5 章，或 [`deploy/API.md`](./API.md)。  
**第三方完整对接文档：** [`deploy/第三方对接指南.md`](./第三方对接指南.md)（含自测脚本 `scripts/test-host-api.ps1` / `.sh`）。

## 六、常用运维命令

```bash
# 查看日志
docker compose -f deploy/docker-compose.yml logs -f next-app
docker compose -f deploy/docker-compose.yml logs -f rpa-worker

# 重启
docker compose -f deploy/docker-compose.yml restart

# 停止
docker compose -f deploy/docker-compose.yml down

# 更新代码后重新部署
git pull
bash deploy/install.sh
```

## 七、目录说明

```
deploy/
├── .env.production.example   # 生产环境变量模板 → 复制为项目根 .env
├── docker-compose.yml        # 生产 Compose（MySQL/Redis 不对外暴露）
├── install.sh                # 一键部署脚本
├── nginx/
│   ├── chajia.http.conf      # HTTP 反代
│   └── chajia.ssl.conf       # HTTPS 反代
└── README.md                 # 本文件
```

## 八、故障排查

| 现象 | 处理 |
|------|------|
| 询价一直 `processing` | 查 `rpa-worker` 日志；确认 `RPA_MOCK_MODE=false` 且 Worker 在运行 |
| 地址联想 503 | Worker 未就绪或 Mothership 不可达 |
| RPA 登录失败 | 填写 `MOTHERSHIP_EMAIL/PASSWORD`；或检查 `.rpa` 卷内 storageState |
| 迁移失败 | `docker compose -f deploy/docker-compose.yml run --rm rpa-worker npx prisma migrate deploy` |

## 九、安全提醒

- 勿将 `.env` 提交到 Git  
- 每个外部系统使用独立 Service Token  
- 生产环境 `RPA_MOCK_MODE` 必须为 `false`  
- 定期备份 `mysql_data` 卷：`docker volume inspect chajia-prod_mysql_data`

## 十、使用宝塔 / 已有 MySQL（不用 Docker 内置库）

若数据库已在宝塔创建（库名 `chajia`，字符集 `utf8mb4`）：

1. 上传并导入 [`deploy/database/chajia.sql`](../database/chajia.sql)（或 `chajia.sql.gz`）
2. 详见 [`deploy/database/README.md`](../database/README.md)
3. 在 `.env` 设置 `DATABASE_URL` 指向宝塔 MySQL，并调整 compose **去掉** `mysql` 服务或勿启动它

