此服务监控 Obsidian 保险库目录,并将 Markdown 文件的元数据及全文内容索引到一个 SQLite 数据库中。我最初是为我的 mcp-server 项目构建了它,但后来改用了一个使用 Obsidian 插件 API 的实现。尽管如此,我认为这个服务仍然可以作为一个无偏见的笔记索引器或同步工具(参见“未来步骤”下的注释),因此我将其发布在这里。
它跟踪 Obsidian 保险库中的文件更改(创建、修改、删除)并将所有信息存储在 SQLite 中,可通过 Docker 卷访问。它捕获以下内容:
uv(可选,但推荐)克隆仓库:
git clone https://github.com/pmmvr/obsidian-index-service.git
cd obsidian-index-service
设置虚拟环境:
使用 uv(推荐):
uv venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows
使用 python(标准方法):
python -m venv .venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows
安装依赖项:
uv(推荐):
uv sync # 从 uv.lock 安装
uv pip install pytest pytest-bdd pytest-mock # 用于测试
pip:
pip install -e .
pip install pytest pytest-bdd pytest-mock 用于测试
设置环境变量:
export OBSIDIAN_VAULT_PATH=/path/to/vault
export DB_PATH=/path/to/notes.sqlite
运行:
python main.py
使用 uv:
uv run python main.py
一次性扫描:
python main.py --scan-only
或者使用 uv:
uv run python main.py --scan-only
--vault-path:保险库目录路径--db-path:SQLite 数据库路径--scan-only:仅扫描而不监视docker-compose up -d
允许其他服务读取数据库(例如,用于扫描更改):
docker-compose.yml 中使用与 obsidian-index-service 相同的卷:
services:
your-service:
image: your-image
volumes:
- ${DB_VOLUME_PATH:-./data}:/data:ro # 只读挂载
Obsidian Index Service 写入 /data/notes.sqlite(挂载为读写),而其他服务(如 mcp-server)读取它。SQLite 的 WAL 模式处理并发访问。Obsidian 索引服务通过以下过程运行:
启动 (ObsidianIndexService.__init__)
DatabaseConnection)NoteProcessor)数据库初始化 (DatabaseConnection.__init__)
初始保险库扫描 (NoteProcessor.scan_vault)
NoteOperations.insert_note)持续监控 (FileWatcher.watch)
文件处理 (NoteProcessor.process_note)
NoteOperations.upsert_note)优雅关闭 (ObsidianIndexService.shutdown)
该服务在后台运行,持续使 SQLite 数据库与 Obsidian 保险库保持同步。其他应用程序可以使用此数据库来访问笔记元数据,而无需直接解析 Markdown 文件。
运行测试:
pytest
经过一些重构,我可以将其视为一个同步工具:
sync_status 和 remote_id 列。--sync 以手动或连续触发同步。