# React 离线检索演示运行手册
本手册用于启动 React + Nginx + gateway + FastAPI + PostgreSQL/pgvector 的同源离线演示。当前页面只展示合成数据的检索和重排结果,不调用百炼,不生成大模型答案,也不构成地质勘查结论。
## 1. 一键启动
首次运行先创建本地数据库 Secret:
```bash
make setup-hooks
bash scripts/init-local-secrets.sh
docker compose up -d --build web
docker compose --profile tools run --rm seed-demo-offline
```
`web` 的依赖链会依次等待 `db -> migrate -> api -> gateway`。离线 seed 完成后刷新页面,即可看到 20/20/20 的演示数据状态。
访问入口:
- React 演示:
- FastAPI Swagger:
- 数据库 readiness:
- synthetic 状态:
## 2. 推荐演示流程
1. 确认页面顶部持续显示“合成数据、离线模式、不调用云端模型”。
2. 确认切片、向量和可检索计数均为 20。
3. 选择示例问题或输入“花岗斑岩 铜矿化”,设置返回 3 条。
4. 提交检索,查看合成标题、证据摘录、页码、演示排序分和不透明 citation ID。
5. 说明 citation ID 尚不能打开真实报告页,当前没有 LLM 生成答案。
6. 缩窄浏览器到移动宽度,验证表单和来源卡片仍可完整阅读。
## 3. 本地前端开发
先让 Docker Web/API 链保持运行,再启动 Vite:
```bash
cd frontend
npm ci
npm run dev
```
Vite 只监听 `127.0.0.1`,并把 `/api`、`/health` 和 `/openapi.json` 代理到本机 Docker Web 入口。前端 API 基址保持同源,构建产物中不存在数据库地址或百炼凭证。
后端 OpenAPI 改变后重新生成类型:
```bash
cd frontend
npm run generate:api
npm run typecheck
```
生成脚本会检查 demo status/search 路径是否存在,然后覆盖 `src/api/schema.generated.ts`;生成结果必须随 API 契约变更一起提交。
## 4. 质量门禁
```bash
make verify
docker compose --env-file .env.example ps -a
```
统一门禁包括:
- Secret、Markdown 链接和 Git diff 检查;
- Ruff、严格 mypy 和 pytest;
- Prettier、ESLint、严格 TypeScript、Vitest 和 Vite production build;
- Compose 配置与网络/Secret 合同测试。
容器级验收还应确认:
- 只有 `web` 发布 `127.0.0.1:8000`;
- `web` 和 `gateway` 没有 Secret;
- `api` 只连接 internal data 网络,公网 socket 探测失败;
- `gateway` 公网 socket 探测失败;Web 因普通 edge 网络可技术性出网,但无 Secret、无数据网络和挂载,此残余风险记录于 ADR-0004;
- `/api`、健康检查和 Swagger 经 Web 同源代理可用;
- SSE 响应在 gateway 与 Nginx 均不被整体缓冲。
## 5. 停止与清理
停止容器但保留 PostgreSQL 数据:
```bash
docker compose down
```
不要在需要保留验收数据时使用 `docker compose down -v`。该命令会删除 PostgreSQL volume。
## 6. 当前边界
已实现的是可运行的离线检索演示;尚未实现登录、真实知识库、文件上传、OCR、生成答案、可点击原文页、会话、反馈、正式评测面板和真实百炼模型探测。只有轮换后的新 Key 完成三模型 smoke 后,Stage 1 才能标记为完成,Stage 2 也不能因页面可见而提前标记为完成。