cf45f98a8a88c5b1eaf299a7a9ca28bd1a45be41
work #04 (2026-07-03):user 重申 sync 目标强调 timer/service/依赖/编码格式 全链路审计,发现 5 处 systemd unit drift:work #01 (4h timeout) 和 work #02 (morning.timer) 代码改了但没 cp 到 /etc/systemd/system/,等于没修。 根因:deployment 与 repo 各自演进无任何告警机制。 修复:在 daily_sync_check 加 _check_systemd_drift() 段,对比 bin/systemd/ 与 /etc/systemd/system/ 下所有 market-sync* unit: - missing_in_etc (未部署) → status=not_deployed - drifted (两边有但内容不一致, SHA256 比对) → status=drifted - orphan_in_etc (/etc 有 repo 没维护, 捕获僵尸 unit) → status=orphan drift 合入 alerts 让 webhook 也带;report schema_version 1→2。 立即验证:跑 daily_check 抓到 5 处 drift(4 未部署 + 1 内容不一致), status=warning 让 webhook 自动发出——以后任何 deployment drift 都逃不掉。 Co-Authored-By: Claude <noreply@anthropic.com>
market_data_sync
A 股市场数据定时同步与管理框架。
把 akshare / baostock / 新浪 / 雪球 / 麦蕊智数 等多个数据源接入到 MySQL 库,提供:
- 后台线程调度器(time-based + interval-based,交易日感知)
- 多数据源 + 自动降级 + 健康度监控
dataset_registry同步状态机(运行中 / 成功 / 失败 / 中断恢复)- FastAPI 管理接口(手动触发、状态查询、失败重试)
- CLI 入口(手动跑任务、查看状态)
📖 详细架构说明见 docs/ARCHITECTURE.md
快速开始
# 1. 准备环境(首次)
cp .env.example .env # 编辑 .env 填写真实 MySQL 凭据 + XUEQIU_TOKEN
chmod +x start.sh
./start.sh # 自动创建 .venv + 装依赖 + 启动 API(http://localhost:8100)
# 2. 常用命令
./start.sh worker # 仅启动调度器(无 web)
./start.sh list # 列出所有同步任务
./start.sh sync kline_daily # 手动触发一次(dataset_id 即可)
./start.sh status # 查看调度器/数据源/同步任务状态
./start.sh datasources # 查看数据源健康度
./start.sh reseed # 重新 seed 默认配置到 config 表
# 3. 一键全量同步(首次接入)
python bin/runall_once.py
# 4. 跑测试
.venv/bin/pytest tests/ -v
项目结构
app/
├── core/ # 核心抽象(config / db / sync / scheduler / datasource base)
├── sources/ # 数据源实现(5 个)
├── tasks/ # 同步任务实现(8 个)
├── api/ # FastAPI 管理接口
└── entrypoints/ # 进程入口(cli + worker)
bin/ # 一次性脚本
docs/ # 架构文档
tests/ # 单元测试
内置同步任务
| dataset_id | 触发时间 | 说明 |
|---|---|---|
stock_basic |
交易日 09:00 | 全市场股票基础信息 + 股本 |
kline_daily |
交易日 15:40 | 增量日 K 线(OHLCV,多源交叉) |
kline_index |
交易日 15:50 | 六大指数日线 |
kline_5min |
交易日 16:00 | 增量 5 分钟 K 线 |
moneyflow |
交易日 16:30 | 资金流(主力/大/中/小单净额) |
industry_sector |
周一 09:30 | 股票-行业映射(Baostock) |
share_snapshot |
交易日 09:30 | 股本快照(雪球) |
market_regime |
交易日 16:00 | 市场情绪(衍生源) |
添加新数据源
- 在
app/sources/新建my_source.py,继承DataSource - 在
app/core/datasource/registry.py的build_default_registry()注册
添加新同步任务
- 在
app/tasks/新建task_xxx.py,继承SyncTask,设置dataset_id - 在
app/tasks/__init__.py的TASKS字典注册 - (可选)在
app/core/sync/registry.py的SYNC_DEFINITIONS加条目
License
私有
Description
Languages
Python
94.6%
Shell
5.4%