--- title: Checkpoint 2026-09-29 15:52:48 UTC [2365e8d4b5] type: checkpoint permalink: main/projects/25464650-ed5d-440e-b362-190f2852d451/checkpoint-2026-09-29-15-52-48-utc-2365e8d4b5 stable_id: de804d80-c991-45b0-ae0b-9b07f573f022 scope: project memory_type: checkpoint project_id: 25464650-ed5d-440e-b362-190f2852d451 usage_profile_id: 0c9feb46-d06e-43cd-9ef0-c5813c84a998 status: active revision: 1 request_id: nixmsg-ckpt-20260929-1552b created_at: '2026-09-29T15:52:48.620315+00:00' updated_at: '2026-09-29T15:52:48.620315+00:00' tags: - nixmsg - design --- 完成:用户补充并已写入需求(记忆 9cea62eb-5435-4fb1-af51-9699bb182b1a revision 2)。单机不做集群;设备 1000 以内,可能有嵌入式;发送时可选择对方不在线是否保留;离线消息必须有过期时间,超时销毁;弱网也要尽量送达。 原因:数据面仍用 MQTT,离线邮箱用自己的 SQLite,不能只靠 broker 会话队列。 建议(尚未经用户明确说开工,不得当作已裁定决定):单机 Docker Compose。Mosquitto 负责在线长连接与 QoS 1 重传。FastAPI 加 SQLite 负责设备密码、在线查询,以及可选离线邮箱(按消息 TTL,上线后按序补发,超时删除)。对外一个 WebSocket 端口;极小嵌入式若跑不动 WebSocket,再单独开 1883。传达语义是至少一次,消息带 ID 供接收方去重。在线抖动靠 MQTT 重传;已经离线且选择保留时才进 SQLite。不要用 EMQX,不要做集群。 验证:未写代码。 下一步:等用户说开工后再搭 Docker Compose 骨架。 给下个会话:项目 ID 25464650-ed5d-440e-b362-190f2852d451,目录 e:/code/NixMsg,仓库仍为空。