架构总览
系统边界
CosRay 采集链路采用三端分工:
- Firmware:采集数据、按固定二进制协议组包、通过 BLE 发送
- App:接收 BLE 分片、拼接 512B 包、解析为 DTO 并调用 HTTP API
- Backend:统一承接鉴权、设备归属校验、IoTDB 写入和元数据管理
数据流
text
ESP32 Firmware -> Android App -> Django Backend -> PostgreSQL + IoTDBFirmware
- 定义 Muon 与 Timeline 包结构
- 维护 BLE 特征与分片发送逻辑
- 不承担云端业务规则和用户隔离
App
- 负责 BLE 连接、分片重组、DTO 映射
- 管理 JWT 登录态与上传请求
- 不应重新定义后端业务真值
Backend
- 统一对外契约出口
- 定义 JWT、设备 CRUD、数据包上传行为
- 按用户隔离设备,并将事件写入 IoTDB
真值来源
后端行为真值
core/api.pycore/models.pycore/schemas.pycore/services.pycore/validators.py
跨端契约真值
- Firmware:
CosRay-Detector-Firmware/main/typedefs.h - App DTO:
CosRay-App/app/src/main/java/com/grid/cosrayapp/core/network/model/DevicePacketDtos.kt - App 协议映射:
CosRay-App/app/src/main/java/com/grid/cosrayapp/data/telemetry/FirmwarePacketMapper.kt
后端模块
API 层
- 认证:注册、登录、刷新、校验、当前用户
- 设备:列表、创建、详情、更新、删除
- 上传:统一入口
POST /api/mu-packets/
领域与契约层
Detector作为关系型元数据实体- Pydantic Schema 统一请求/响应结构
- 错误码对外保持稳定语义
基础设施层
- PostgreSQL:用户与设备元数据
- IoTDB:Muon / Timeline 时序数据
- Redis 或本地缓存:限流与 refresh token 撤销控制
文档治理原则
- 不再保留“需求文档 / 设计文档 / 计划文档”并列作为主入口。
- 文档按维护任务拆分,围绕接口、协议、部署和运维组织。
- App 与 Firmware 只在站内保留必要摘要,完整实现保持在各自仓库。
服务组件
- Django ASGI 应用 通过
uvicorn托管,单体模块按照 Django App 模式划分。 - 数据库
- PostgreSQL:使用官方镜像,
cosray数据库承载用户/设备表。 - IoTDB:时序数据,单实例部署,必须通过
SessionPool复用连接。
- PostgreSQL:使用官方镜像,
- 缓存/队列
- Redis(可选):用于限流计数、refresh token 黑名单,以及未来的异步任务。
- 外部依赖
- 邮件服务(SMTP)用于账户验证与通知。
- Sentry/Prometheus/Grafana 针对日志与指标。
部署架构
本项目使用 docker-compose 统一本地和生产部署模式:
docker-compose.local.yml展示开发环境,包含后端服务、PostgreSQL、IoTDB, 所有配置来自.env。docker-compose.production.yml在 CI/CD 中由./scripts/deploy.sh调用, 通过 Kubernetes 或云 VM 运行,敏感变量通过 Vault/Secrets 管理。
生产中的典型拓扑:
text
Ingress → HPA Nginx → Gunicorn/uvicorn → Django
│
├── PostgreSQL 主从 读写分离
└── IoTDB 集群 (后续规划)- 证书与 TLS:前端负载均衡层负责 HTTPS 终端,加密内部流量。
- 备份:每日 PostgreSQL dump 与 IoTDB snapshot,存储至对象存储。
扩展性与演进
- 多区域部署: API 与 IoTDB 支持跨区写入,后端仓库里
services.iotdb已预留 region 参数。 - 插件机制:
core/services.py使用策略模式,未来可添加新的时序存储或解析器。 - 版本控制: 所有对外契约(API path、错误码、Schema)均在
core/schemas.py明确声明,并 在docs/api.md通过生成脚本维持同步。
请在新增内容后继续保持架构文档简洁、易读。如需迁移到其他格式(PlantUML、Mermaid), 可在 docs/architecture-diagrams 下创建相应文件并在此处引用。