存储后端
Molore的存储设计是本地优先的直接推论:一个 SQLite 单库装下全部结构化数据与两类检索索引(sqlite-vec 向量、FTS5 全文),数据不出机器;对象存储(MinIO/S3)是可选件,只服务于 E2EE 同步快照。本页讲各存储组件的职责与代码位置、附件与图片的访问口径、数据目录纪律与备份纪律。
组件总览
| 组件 | 技术 | 代码位置 | 说明 |
|---|---|---|---|
| 主库 | SQLite 单库 | backend/data/psb.db(线上) | 全部业务数据,WAL 模式;单文件即完整备份单元 |
| 向量索引 | sqlite-vec | app/services/vec_index.py | vec0 虚拟表,按维度分影子表 vec_embeddings_{dim},cosine 距离;全库统一 bge-m3 1024 维 |
| 全文索引 | FTS5 BM25 | app/services/fts_index.py | Note/KnowledgeUnit/BrowserClip/Document 四类内容的关键词影子索引(移植自腾讯 TencentDB-Agent-Memory 的 FTS5 设计) |
| 对象存储 | MinIO / 任意 S3 | app/api/v1/endpoints/sync.py | 可选;未配置时回落本地目录,仅用于 E2EE 同步快照 |
| 附件/图片 | 本地文件 + 静态路径 | /uploads/{file_path} | 上传文件按用户数据目录落盘,经静态路径访问 |
功能清单
- SQLite 单库:结构化数据、索引、配置、账本全在一个文件里;迁移走
app/core/db_migrations.py的幂等迁移链(run_schema_migrations),任何「建一次长期复用」的库文件都必须过这个入口而不是create_all。 - 向量通道:sqlite-vec 以扩展方式加载(
sqlite_vec.load),vec0 虚拟表按维度分影子表,embedding_id辅助列映射回Embedding.id;桌面端无 sqlite-vec 时检索自动降级关键词通道。 - 全文通道:FTS5 倒排索引覆盖四类内容,与向量通道两路融合(weighted)供检索层使用。
- 对象存储可选:
sync.py中 boto3 客户端惰性初始化,S3_ACCESS_KEY/S3_SECRET_KEY未配置即返回 None 并回落本地目录data/sync_snapshots/;bucket 不可达、初始化异常同样回落——MinIO(部署走/s3/路径风格)是增强不是依赖。 - 附件与图片访问:上传文件经
/uploads/{file_path}静态路径访问;图片文档入图谱时富化image_url(app/api/v1/endpoints/graphify.py),前端图谱节点详情出缩略图。
数据目录口径
| 形态 | 数据目录 |
|---|---|
| 桌面安装版 | %APPDATA%\psb-desktop\data\ |
| 便携版 / EXE 同级 | 程序同级 data\(优先于 %APPDATA%) |
| 云端服务 | backend/data/(psb.db、sync_snapshots/ 等) |
铁律:持久数据绝不落安装目录(血泪#4)——安装目录会被升级覆盖,数据目录独立才能保证卸载重装、覆盖升级不丢数据。PyInstaller 打包形态下 _internal 不可写,用户插件、日志、快照一律落数据目录(app/plugins/manager.py 中 frozen 分支即按 PSB_DATA_DIR 定位用户插件目录)。
备份纪律
- 主库在线备份用 SQLite 自带
.backup:sqlite3 data/psb.db ".backup '/backup/psb-YYYYMMDD.db'"——在线一致快照,不需要停服;恢复=停服、替换文件、重启(完整命令见 运维手册)。 - 图谱快照:永远放语料目录之外。图谱版本快照留存在
{space}/snapshots/(每空间帽 5 份,swap 前自动留底);把备份放进corpus/会被图谱语料扫描当内容建图(曾扫出 2210 个垃圾节点,血泪#72)。 - 拉取远端库做本地复现时同样走
.backup再压缩传输,sha256 双端核对。
E2EE 快照保险箱
端到端加密的云同步快照是存储层的另一块:快照在用户端加密后上传,服务器只存密文(.enc)。
- 加密上下文固定:AAD 常量
BACKUP_AAD = "psb-backup:v1"(app/services/sync_crypto.py),恢复时必须显式传expectedAad='psb-backup:v1'才能解开——防密文被搬到其他上下文误用。 - 存储后端二选一:配置了 S3/MinIO 走对象存储,否则落本地
data/sync_snapshots/{user_id}/{snapshot_id}.enc。 - 密码学细节与操作步骤见 端到端加密云同步。