Docker 部署 Open Notebook:自托管你的私有 AI 研究助理
前言:为什么需要自托管「NotebookLM」
Google 的 NotebookLM 出来一年多了,东西是好东西 —— 丢 PDF、网页、YouTube 链接进去,AI 帮你读、帮你总结、甚至生成两个 AI 主播聊你材料的播客。但有个硬伤:锁区。
用国内 Google 账号打开就是 location=unsupported,挂了代理也未必救得回来。因为 Google 不止看 IP,还查你的账号地区设置、Play 账单国家、甚至年龄验证状态。网上搜一圈,不少在美国、西班牙的人也遇到过同样的问题,至今没有官方解决方案。
所以就有人做了 Open Notebook—— 一个 MIT 开源、完全自托管的平替。跟原版比,它多了几个你很可能用得上的东西:
- 支持直接上传 Word(docx)、Excel(xlsx)、PPT(pptx),原版只有 PDF 和网页
- 支持视频 mp4 和音频 mp3 / wav,原版只能 YouTube 链接
- 可以接 DeepSeek、OpenAI、Anthropic、Ollama 等 18+ 提供商,不绑 Google
- 播客生成的 AI 主播可以是 1 到 4 个,自定义语音档案
- 有完整 REST API,可以自动化
- 界面支持简体中文
最关键的是:Docker 一行命令,五分钟跑起来,数据全在自己硬盘里。
这篇文章就带你把它部署起来,从零到能上传文档提问。
准备工作
部署之前确认几件事:
- 服务器或 NAS 上已经装了 Docker 和 Docker Compose
- 至少有一个 AI 提供商的 API Key(DeepSeek 国内最友好,后面会详细讲)
- 5-10 分钟时间
如果你的服务器在国内,Docker Hub 有时候拉镜像很慢甚至拉不下来。Open Notebook 也提供了 GitHub Container Registry 镜像(ghcr.io/lfnovo/open-notebook),后面会用上。
双容器部署
Open Notebook 推荐的双容器架构分两层:SurrealDB 管数据存储,Open Notebook 管应用逻辑和 Web UI。拆开的好处是数据库和应用可以独立升级,出问题了也好排查。
整体架构长这样:
┌──────────────────────────┐│ 浏览器 :8502 │└─────────┬────────────────┘ │┌─────────▼────────────────┐│ open_notebook 容器 ││ - Web UI (8502) ││ - REST API (5055) ││ - Python FastAPI ││ - Next.js 前端 │└─────────┬────────────────┘ │ WebSocket┌─────────▼────────────────┐│ surrealdb 容器 ││ - SurrealDB v2 │3 collapsed lines
│ - RocksDB 存储 ││ - 端口 8000 │└──────────────────────────┘[图:Open Notebook 双容器架构图]
docker-compose.yml
新建一个目录,然后创建 docker-compose.yml:
mkdir open-notebook && cd open-notebookservices: surrealdb: image: surrealdb/surrealdb:v2 command: start --log info --user root --pass root rocksdb:/mydata/mydatabase.db user: root ports: - "8000:8000" volumes: - ./surreal_data:/mydata environment: - SURREAL_EXPERIMENTAL_GRAPHQL=true restart: always pull_policy: always
open_notebook:17 collapsed lines
image: lfnovo/open_notebook:v1-latest ports: - "8502:8502" # Web UI - "5055:5055" # REST API environment: - OPEN_NOTEBOOK_ENCRYPTION_KEY=change-me-to-a-secret-string - SURREAL_URL=ws://surrealdb:8000/rpc - SURREAL_USER=root - SURREAL_PASSWORD=root - SURREAL_NAMESPACE=open_notebook - SURREAL_DATABASE=open_notebook volumes: - ./notebook_data:/app/data depends_on: - surrealdb restart: always pull_policy: always启动
docker compose up -d等 15-20 秒(第一次启动 SurrealDB 要初始化),然后验证一下:
# 检查容器状态docker compose ps
# 检查 API 是否就绪curl http://localhost:5055/health# 预期输出: {"status":"healthy"}看到 healthy 就说明跑起来了。浏览器打开 http://localhost:8502。
配置 AI 提供商
进到 Web UI 之后,左侧菜单 → Settings → API Keys → Add Credential。
这里以 DeepSeek 为例(国内最推荐):
- Provider 选 DeepSeek
- Name 随便填,比如 “DeepSeek”
- API Key 填你的 DeepSeek API Key(去 platform.deepseek.com申请)
- 点 Save,然后 Test Connection
- 测试通过后,点 Discover Models,勾选模型 → Register Models
同样方法可以加 OpenAI、Anthropic 等,也可以同时配多个。
模型推荐组合
DeepSeek 搞定对话了,但 Open Notebook 还有 Embedding(向量检索)、STT(语音转文字)、TTS(文字转语音) 三个能力需要配。以下是我跑过的推荐组合:
完整配置速查
| 能力 | 推荐模型 | 提供商 | 费用 | 说明 |
|---|---|---|---|---|
| Chat | DeepSeek V3 | DeepSeek | ~¥1 / 百万 token | 国内直连,中文强,日常首选 |
| Embedding | text-embedding-3-small | OpenAI | $0.02 / 百万 token | 检索精度高,也可用默认的 all-MiniLM-L6-v2 |
| STT | Whisper-1 | OpenAI | $0.006 / 分钟 | 中文识别好,API 稳 |
| TTS | tts-1 | OpenAI | $15 / 百万字符 | 音色自然,低延迟 |
如果你有 AI 代理(LobeHub、AIHubMix 等),OpenAI 这几个模型可以全部走代理 endpoint,一个 Key 搞定 Chat + Embedding + STT + TTS。
语音模型详解
STT(语音转文字) 让你直接上传音频文件提问:
| 模型 | 延迟 | 中文 | 费用 |
|---|---|---|---|
| OpenAI Whisper-1 | 中等 | ⭐⭐⭐ | $0.006 / 分钟 |
| Groq Whisper | 极快 | ⭐⭐ | 免费额度大 |
TTS(文字转语音) 用于播客生成和语音回答:
| 模型 | 延迟 | 中文 | 费用 |
|---|---|---|---|
| OpenAI tts-1 | ~300ms | ⭐⭐⭐ | $15 / 百万字符 |
| ElevenLabs Flash v2.5 | 75ms | ⭐⭐⭐ | $5 / 月起 |
如果你是播客重度用户,追求最自然的语音效果,加配 ElevenLabs 值得。日常文档问答的话,OpenAI tts-1 够用了。
实践中的推荐组合
说真的,大部分人的使用场景就是上传文档、提问、看回答。三步配置就够了:
Chat: DeepSeek V3 ← 国内最优解Embedding: OpenAI embedding-3 ← 或者默认的 all-MiniLM-L6-v2TTS / STT 可以先不配,等真正需要播客或语音输入的时候再加。Open Notebook 支持随时增删提供商,不用担心一开始配错。
单容器方案(备选)
如果你不想管两个容器,Open Notebook 也提供了单容器镜像 lfnovo/open_notebook:v1-latest-single,把 SurrealDB 打包进了同一个镜像。
services: open_notebook: image: lfnovo/open_notebook:v1-latest-single ports: - "8502:8502" - "5055:5055" environment: - OPEN_NOTEBOOK_ENCRYPTION_KEY=change-me-to-a-secret-string - SURREAL_URL=ws://localhost:8000/rpc - SURREAL_USER=root - SURREAL_PASSWORD=root - SURREAL_NAMESPACE=open_notebook - SURREAL_DATABASE=open_notebook volumes: - ./notebook_data:/app/data2 collapsed lines
- ./surreal_single_data:/mydata restart: always启动方式一样:docker compose up -d。
怎么选:
| 场景 | 推荐方案 |
|---|---|
| 长期使用,数据重要 | 双容器(数据库独立,方便备份迁移) |
| 快速体验,不打算长期用 | 单容器(少一个容器,少操一份心) |
| 需要升级数据库版本 | 双容器 |
接入 Ollama(完全离线)
如果你不想花 API 钱,也可以接本地 Ollama 模型,做到真正的离线使用。
在 docker-compose.yml 里追加一个 Ollama 服务:
ollama: image: ollama/ollama:latest ports: - "11434:11434" volumes: - ollama_models:/root/.ollama restart: always
volumes: ollama_models:启动后拉一个模型:
docker exec open-notebook-ollama-1 ollama pull qwen3:7b然后在 Open Notebook 的 API Keys 页面添加 Ollama 凭证,Base URL 填 http://ollama:11434。
但说真的,本地跑 7B 模型做 RAG 检索,精度跟 DeepSeek V3 还是有差距的。个人建议日常用 DeepSeek API,敏感文档用 Ollama—— 两个可以同时配,在 Notebook 里按需切换。
创建第一个 Notebook
AI 提供商配好后,点 New Notebook:
- Name 填项目名,比如「2026 密码管理器横评」
- Description 写个简短描述
- 点 Create
进到 Notebook 里就可以上传文件了。拖拽或者点击上传区域,支持:
- PDF、Word (docx)、Excel (xlsx)、PPT (pptx)
- 视频 mp4、音频 mp3/wav/m4a
- 网页链接(直接粘贴 URL)
- YouTube 链接
- EPUB 电子书
- 纯文本、Markdown
上传完等它处理(后台在做 embedding),然后就可以在右侧对话框里提问了。每次回答都会标注引用了哪份文档的哪个位置。
日常维护
# 查看日志docker compose logs -f
# 只看 API 的日志docker compose logs -f open_notebook
# 重启docker compose restart
# 升级到最新版docker compose downdocker compose pulldocker compose up -d
# 完全清除(包括所有数据)1 collapsed line
docker compose down -v数据文件存在两个目录:./notebook_data(应用数据)和 ./surreal_data(数据库)。建议定期备份这两个目录。
避坑指南
端口冲突
默认端口 8000(SurrealDB)、8502(Web UI)、5055(API)。如果跟已有服务冲突,改映射端口就行:
ports: - "8503:8502" # Web UI 改成 8503大 PDF + 小文件混用时的检索问题
有人实测发现:当你同时上传一份大 PDF(比如几百页)和几个小文本文件时,在总聊天窗口里提问,有时会检索到错误的来源,导致回答不准。
解决方案:点进具体的文档,在文档页面里直接提问。单文档检索的准确率明显更高。
容器首次启动慢
第一次启动 SurrealDB 要初始化 RocksDB,等 20-30 秒。如果看到 502 或者连接拒绝,再多等一会。
CPU 模式下的 embedding 速度
默认的 embedding 模型 all-MiniLM-L6-v2 在 CPU 上跑大文档会慢。如果你有 GPU,或者大量文档需要处理,可以考虑在环境变量里调 embedding 的批量大小:
environment: - OPEN_NOTEBOOK_EMBEDDING_BATCH_SIZE=8减小批量可以避免 CPU 打满导致 OOM。
跟 NotebookLM 原版对比
| Open Notebook | Google NotebookLM | |
|---|---|---|
| 访问 | 自托管,不需要 Google | 需要 Google 账号 + 支持地区 |
| Office 格式 | docx/xlsx/pptx ✅ | 仅 docx |
| 视频 / 音频 | mp4/mp3/wav/m4a ✅ | YouTube 链接 |
| AI 模型 | 18+ 提供商自由选择 | 仅 Gemini |
| 播客 | 1-4 个 AI 主播 | 固定 2 个 |
| 数据隐私 | 全在本地 | Google 云端 |
| 价格 | API 费用(DeepSeek 极低) | 免费但有额度 |
| API | 完整 REST API | 无 |
FAQ
Q: 能不能完全离线? A: 可以。接 Ollama 本地模型,不需要任何外部 API。但本地模型的 RAG 精度比云端模型差一些。
Q: DeepSeek API 一个月要多少钱? A: 极低。DeepSeek V3 的输入价格是每百万 token 约 1 元人民币。日常文档问答场景,每月几块钱就够了。
Q: 多人能用吗? A: 当前版本是单用户。v1.8.5 没有多用户支持。如果你需要团队共享,可以关注后续版本或者看看 AnythingLLM。
Q: 数据存在哪?怎么备份?
A: ./notebook_data 和 ./surreal_data 两个目录。直接用 rsync 或 restic 定时备份这两个目录就行。
Q: 跟 AnythingLLM 比怎么选? A: Open Notebook 的长板是格式支持全 + 播客生成 + 中文 UI,更像 NotebookLM 平替。AnythingLLM 的长板是 Agent/定时任务/MCP/多用户,更像 AI 工作台。如果你主要是上传 Office 文档 + 提问分析,Open Notebook 更对口。