feat(HEL-382): 搭建 datahub 底座和盘后正式数据链路
新增独立 xiaobai-datahub 服务(SQLite WAL、Tushare 盘后发布、/v1 契约和管理后台),不改现站页面与数据链路。 Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
co-authored by
Cursor
multica-agent
parent
c2ebc0ab91
commit
3498dd7a4b
@@ -0,0 +1,78 @@
|
||||
# xiaobai-datahub
|
||||
|
||||
独立行情数据中枢(HEL-382 / P0)。与 `xiaobai-review` 同仓库、不同容器、不共享数据库文件。
|
||||
本阶段不部署现网;只提供可本地运行、可自测的底座和盘后正式数据链路。
|
||||
|
||||
## 做什么
|
||||
|
||||
- SQLite WAL `datahub.db`,容器名 `xiaobai-datahub`,端口 `8766`
|
||||
- Tushare 盘后正式数据:交易日历、股票主档、daily、daily_basic、adj_factor、index_daily、moneyflow、stk_auction
|
||||
- 暂存 → 校验 → 整批原子发布 → 可回滚
|
||||
- `/v1` 稳定接口(`X-Datahub-Token`)
|
||||
- `/admin/` 最小管理后台(总览 / 数据源 / 调度 / 发布 / 数据集 / 审计)
|
||||
- 东财/腾讯/同花顺/选股宝/AKShare/iFinD 适配器位已预留,本阶段不拉实时源
|
||||
|
||||
## 单位口径(相对现站)
|
||||
|
||||
现站 `xiaobai-review` 按 Tushare 原始单位入库、展示时再换算。中枢在归一化层一次换算:
|
||||
|
||||
| 字段 | Tushare / 现站 | 中枢 canonical |
|
||||
|---|---|---|
|
||||
| `daily.amount` / `index_daily.amount` | 千元 | 元(×1000) |
|
||||
| `daily.vol` / `index_daily.vol` | 手 | 股(×100) |
|
||||
| `moneyflow.*_amount` | 万元 | 元(×1e4) |
|
||||
| `daily_basic.total_mv` / `circ_mv` | 万元 | 元(×1e4) |
|
||||
| `stk_auction.amount` | 元 | 元 |
|
||||
|
||||
差异为口径升级,golden 测试按上表对照,不为 0 的字段都有说明。
|
||||
|
||||
## 本地启动(不走 Docker)
|
||||
|
||||
```bash
|
||||
cd xiaobai-datahub
|
||||
python -m venv .venv && .venv/bin/pip install -r requirements.txt
|
||||
cp .env.example .env
|
||||
# 填入 DATAHUB_ENCRYPTION_KEY / DATAHUB_TOKEN / DATAHUB_ADMIN_PASSWORD / TUSHARE_TOKEN
|
||||
# 生成 Fernet 密钥:
|
||||
# python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||||
.venv/bin/python server.py --host 127.0.0.1 --port 8766
|
||||
```
|
||||
|
||||
- 管理后台:http://127.0.0.1:8766/admin/
|
||||
- 存活检查:http://127.0.0.1:8766/livez (无需 token)
|
||||
- `/v1/*` 必须带请求头 `X-Datahub-Token`
|
||||
|
||||
## Docker(独立 compose,不改现网 review 服务)
|
||||
|
||||
```bash
|
||||
cd xiaobai-datahub
|
||||
cp .env.example .env # 填密钥
|
||||
mkdir -p data
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
仓库根目录另有 `compose.datahub.yaml`,供总工以后与现有 `compose.yaml` 叠加部署,本卡不执行现网 `up`。
|
||||
|
||||
## 自测
|
||||
|
||||
```bash
|
||||
cd xiaobai-datahub
|
||||
python -m unittest discover -s tests -v
|
||||
```
|
||||
|
||||
不调用真实 Tushare;用内存/临时库和假适配器。
|
||||
|
||||
## 备份
|
||||
|
||||
每日 00:40 任务把 `datahub.db` 备份到 `data/backups/`(保留 14 份)。也可手动:
|
||||
|
||||
```bash
|
||||
python -c "from pathlib import Path; from datahub.db import HubDB; HubDB(Path('data/datahub.db')).backup_to(Path('data/backups/manual.db'))"
|
||||
```
|
||||
|
||||
## 安全
|
||||
|
||||
- 密钥只以 `configured / 末4位 / 更新时间` 出现在后台,不进日志、不进 `/v1`
|
||||
- 回滚、补数需重新输入密码 + 确认词
|
||||
- 容器非 root(uid 10002)、read_only、cap_drop ALL
|
||||
Reference in New Issue
Block a user