架构
Raiznet 分为三层。本页区分 今日 运行的内容与 设计阶段 的内容 —— 完整图景请参阅 路线图。
边缘层 —— ESP32 传感器
所有设备运行相同的基础固件。模式由配置决定,而非硬件:
| 模式 | 供电 | 行为 |
|---|---|---|
sensor_mains | 市电 | 始终在线,保持 Wi-Fi 活动;未来为邻居提供 ESP-NOW 中继 |
sensor_battery | 电池 | 大部分时间休眠,按计划唤醒 |
gateway | 市电 | 仅中继 —— 将 ESP-NOW 设备桥接到 Wi-Fi(计划中) |
每个设备都有相同的身份模型:在配置时(由硬件 TRNG)生成的 Ed25519 密钥对,存储于闪存,用于对每个遥测数据包签名。参考固件还会在其强制门户中从 BIP-39 助记词生成所有者身份 —— 参阅 设备生命周期。
网格层 —— 服务器节点
每个服务器都是一个对等节点。不存在“主服务器”。节点 今日 所做的:
- 通过 HTTP(
POST /v1/telemetry)接收已签名的遥测并验证每个签名 - 在摄取时应用按字段的 隐私策略
- 将读数存储于 两个本地 SQLite 数据库(公共/私有)
- 在两个端口上暴露 HTTP API:一个公共,一个本地
设计阶段 (ADR-004):节点将把公共数据持久化为已签名的仅追加事件日志,并与同一 网络 中的其他节点点对点复制 —— 先在已配置的对等节点之间通过 HTTP,然后通过基于 pubkey 拨号的传输(借助社区运行的中继)。复制尚未实现 —— 今日节点彼此独立。
服务器可以在任何运行 Node.js 的地方运行:VPS、Raspberry Pi、迷你 PC、通过 Termux 的 Android。为面向极小的 ARM 主板(静态二进制),节点的 Rust 重新实现(raiznetd)正在进行中 —— 参阅 路线图。
单进程中的双端点
单个服务器进程暴露两个 HTTP 接口:
| 端点 | 默认端口 | 绑定 | devices 路由访问 | 认证 |
|---|---|---|---|---|
| 公共 | :3000 | 0.0.0.0 | raiznet_public.db | 无(仅公共数据) |
| 本地 | :3001 | 127.0.0.1 | raiznet_private.db | 暂无 —— 计划中: 所有者质询-响应 |
WARNING
在所有者认证落地前,本地端点的唯一保护是其回环绑定。请通过 Tailscale/VPN 远程访问 —— 切勿直接暴露。
两个数据库
| 数据库 | 来源 | 内容 | 服务方 |
|---|---|---|---|
raiznet_public.db | 公共摄取(复制计划中) | 可向网络公开的设备与读数 | 公共端点 |
raiznet_private.db | 仅本地摄取 | local_only 设备 + 排除在公共侧之外的字段 | 仅本地端点 |
通过隔离实现安全: 公共端点上的查询无法返回私有数据,因为私有数据库的连接根本不可用。隔离在数据库层强制执行,而非 API 层。
客户端层
| 客户端 | 描述 | 状态 |
|---|---|---|
| CLI | 运维与调试工具 | 仓库内 |
| Web 仪表盘 | 可视化 UI | 仓库内 |
| 公共网关 | 暴露在互联网上的节点 —— 只是另一个对等节点,无特权数据 | 计划中 |
| 桌面应用(Tauri) | 捆绑完整节点 + UI,离线工作 | 未来阶段 |
| 移动应用 | React Native 或 Capacitor | 未来阶段 |