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

Terminal window
mkdir open-notebook && cd open-notebook
services:
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

启动

Terminal window
docker compose up -d

等 15-20 秒(第一次启动 SurrealDB 要初始化),然后验证一下:

Terminal window
# 检查容器状态
docker compose ps
# 检查 API 是否就绪
curl http://localhost:5055/health
# 预期输出: {"status":"healthy"}

看到 healthy 就说明跑起来了。浏览器打开 http://localhost:8502

配置 AI 提供商

进到 Web UI 之后,左侧菜单 → Settings → API Keys → Add Credential。

这里以 DeepSeek 为例(国内最推荐):

  1. Provider 选 DeepSeek
  2. Name 随便填,比如 “DeepSeek”
  3. API Key 填你的 DeepSeek API Key(去 platform.deepseek.com 申请)
  4. Save,然后 Test Connection
  5. 测试通过后,点 Discover Models,勾选模型 → Register Models

同样方法可以加 OpenAI、Anthropic 等,也可以同时配多个。

模型推荐组合

DeepSeek 搞定对话了,但 Open Notebook 还有 Embedding(向量检索)STT(语音转文字)TTS(文字转语音) 三个能力需要配。以下是我跑过的推荐组合:

完整配置速查

能力推荐模型提供商费用说明
ChatDeepSeek V3DeepSeek~¥1 / 百万 token国内直连,中文强,日常首选
Embeddingtext-embedding-3-smallOpenAI$0.02 / 百万 token检索精度高,也可用默认的 all-MiniLM-L6-v2
STTWhisper-1OpenAI$0.006 / 分钟中文识别好,API 稳
TTStts-1OpenAI$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.575ms⭐⭐⭐$5 / 月起

如果你是播客重度用户,追求最自然的语音效果,加配 ElevenLabs 值得。日常文档问答的话,OpenAI tts-1 够用了。

实践中的推荐组合

说真的,大部分人的使用场景就是上传文档、提问、看回答。三步配置就够了:

Chat: DeepSeek V3 ← 国内最优解
Embedding: OpenAI embedding-3 ← 或者默认的 all-MiniLM-L6-v2

TTS / 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/data
2 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:

启动后拉一个模型:

Terminal window
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

  1. Name 填项目名,比如「2026 密码管理器横评」
  2. Description 写个简短描述
  3. 点 Create

进到 Notebook 里就可以上传文件了。拖拽或者点击上传区域,支持:

  • PDF、Word (docx)、Excel (xlsx)、PPT (pptx)
  • 视频 mp4、音频 mp3/wav/m4a
  • 网页链接(直接粘贴 URL)
  • YouTube 链接
  • EPUB 电子书
  • 纯文本、Markdown

上传完等它处理(后台在做 embedding),然后就可以在右侧对话框里提问了。每次回答都会标注引用了哪份文档的哪个位置。

日常维护

Terminal window
# 查看日志
docker compose logs -f
# 只看 API 的日志
docker compose logs -f open_notebook
# 重启
docker compose restart
# 升级到最新版
docker compose down
docker compose pull
docker 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 NotebookGoogle 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 更对口。