ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Open Notebook Docker Compose 多容器部署实战:从 docker-compose.yml 到 AI 供应商配置的完整指南

Open Notebook Docker Compose 多容器部署实战:从 docker-compose.yml 到 AI 供应商配置的完整指南 Open Notebook Docker Compose 多容器部署实战从 docker-compose.yml 到 AI 供应商配置的完整指南【免费下载链接】open-notebookAn Open Source implementation of Notebook LM with more flexibility and features项目地址: https://gitcode.com/GitHub_Trending/op/open-notebook本文以 Open Notebook 官方安装文档 Docker Compose 安装指南 为主体完整讲解如何通过多容器方式部署 Open Notebook包括docker-compose.yml每个服务、每个环境变量的含义与底层实现印证、启动与验证流程、Ollama 本地模型扩展、常用运维命令以及常见故障排查。读完本文你可以独立完成一次可复现、可维护的 Open Notebook 本地部署并理解容器内 API、后台 Worker 与前端三个进程的组织方式。部署架构概览两个容器四类进程Open Notebook 的推荐部署方式是 Docker Compose 多容器方案官方文档将其定位为“适合大多数用户”的安装路径。整个栈由两个容器组成surrealdb基于surrealdb/surrealdb:v2镜像的 SurrealDB 数据库使用 RocksDB 引擎持久化到./surreal_data目录负责存储笔记本、来源、笔记、凭据等全部业务数据open_notebook基于lfnovo/open_notebook:v1-latest镜像的应用容器对外暴露 8502Web UI与 5055REST API两个端口。值得强调的是open_notebook容器并不是只跑一个进程。查看 Dockerfile 与 supervisord.conf 可以确认镜像通过 supervisord 在容器内同时管理三个进程——apiuvicorn api.main:app --host 0.0.0.0 --port 5055即 FastAPI 后端见 supervisord.confworkersurreal-commands-worker后台任务进程并发数由OPEN_NOTEBOOK_WORKER_MAX_TASKS控制默认 5见 supervisord.conffrontendNext.js 前端服务端口 8502且会先执行 scripts/wait-for-api.sh 等待 API 就绪后再启动见 supervisord.conf。这解释了文档中“首次启动可能需要 20~30 秒”的现象需要数据库、API、前端依次就绪。另外两个容器之间通过 Compose 内部网络连接如SURREAL_URLws://surrealdb:8000/rpc因此宿主机端口 8000 仅用于本地调试数据库端口被刻意绑定到127.0.0.1以避免默认凭据暴露在网络中——这一点在根目录 docker-compose.yml 的注释中有明确说明。前置条件开始部署前需要准备Docker Desktop或任意支持docker compose的 Docker 环境约5~10 分钟时间至少一个 AI 供应商的API Key新手推荐 OpenAI也可选择 Anthropic、Google、Groq 等或后续使用 Ollama 本地模型。镜像同时发布于 Docker Hublfnovo/open_notebook与 GitHub Container Registryghcr.io/lfnovo/open-notebook。若 Docker Hub 拉取受限可将镜像地址替换为 GHCR 的等价标签其余配置不变。第一步准备 docker-compose.yml获取官方docker-compose.yml有三种方式从仓库根目录直接复制官方文件推荐或在本地按下面的内容手工创建。以下即为官方完整配置与仓库根目录 docker-compose.yml 一致services: surrealdb: image: surrealdb/surrealdb:v2 # Credentials default to root:root for a zero-config local setup. Before # exposing this instance to a network, set SURREAL_USER / SURREAL_PASSWORD # in a .env file (see .env.example) — they are applied here and to the # open_notebook service below, so the two always stay in sync. # List (exec) form so each interpolated value stays a single argument — # a password containing spaces would otherwise be split into several. command: [start, --log, info, --user, ${SURREAL_USER:-root}, --pass, ${SURREAL_PASSWORD:-root}, rocksdb:/mydata/mydatabase.db] user: root # Required for bind mounts on Linux ports: # Bound to localhost only: the open_notebook service reaches this over # the internal compose network regardless, so the host port is purely # for local debugging (e.g. Surrealist, surreal sql). Exposing this # on 0.0.0.0 would let anyone who can reach the host connect with the # default root:root credentials. - 127.0.0.1:8000:8000 volumes: - ./surreal_data:/mydata environment: - SURREAL_EXPERIMENTAL_GRAPHQLtrue restart: always pull_policy: always open_notebook: image: lfnovo/open_notebook:v1-latest ports: - 8502:8502 # Web UI - 5055:5055 # REST API environment: # REQUIRED: Change this to your own secret string # This encrypts your API keys in the database - OPEN_NOTEBOOK_ENCRYPTION_KEYchange-me-to-a-secret-string # Database connection. SURREAL_USER / SURREAL_PASSWORD default to root:root # for local use; override them in a .env file before exposing the instance # (the same values configure the surrealdb service above). - SURREAL_URLws://surrealdb:8000/rpc - SURREAL_USER${SURREAL_USER:-root} - SURREAL_PASSWORD${SURREAL_PASSWORD:-root} - SURREAL_NAMESPACEopen_notebook - SURREAL_DATABASEopen_notebook volumes: - ./notebook_data:/app/data depends_on: - surrealdb restart: always pull_policy: always关键配置逐项解读surrealdb 服务command采用exec列表形式而非字符串拼接每个插值变量保持为独立参数若密码包含空格字符串形式会被 shell 拆分成多个参数导致认证失败user: root是 Linux bind mount 的必需项Docker 以 root 创建宿主机挂载目录而 SurrealDB 默认以非 root 用户运行会因权限不足报Permission denied详见后文故障排查rocksdb:/mydata/mydatabase.db指定 RocksDB 存储引擎与数据文件位置配合./surreal_data:/mydata卷实现数据持久化SURREAL_EXPERIMENTAL_GRAPHQLtrue启用实验性 GraphQL 接口${SURREAL_USER:-root}语法表示从.env读取SURREAL_USER未定义时回退为root。该变量同时作用于数据库服务端启动参数和应用侧连接参数保证两边凭据始终同步端口绑定127.0.0.1:8000:8000宿主端口仅供本地调试如连接 Surrealist 图形客户端或surreal sqlCLI应用容器通过 Compose 内部网络直连surrealdb:8000。open_notebook 服务OPEN_NOTEBOOK_ENCRYPTION_KEY是必填项用于加密数据库中存储的 AI 供应商凭据API Key。官方环境参考文档环境变量参考强调丢失或更换此密钥后已存储的凭据将无法解密因此务必妥善保存SURREAL_URLws://surrealdb:8000/rpc通过 Compose 服务名surrealdb解析无需关心宿主机端口./notebook_data:/app/data挂载用户数据目录。结合 Dockerfile 可以看到/app/data下还承载着 Docling、Crawl4AI 等可选重运行时的缓存wheels、Chromium、HuggingFace 模型首次启动启用后下载一次即可在重启与升级间复用depends_on: surrealdb声明启动顺序依赖仓库根目录的 docker-compose.yml 还保留了若干注释掉的可选环境变量按需取消注释即可OPEN_NOTEBOOK_ENABLE_DOCLINGtrue启用 Docling 内容处理引擎含 OCR 与图片来源支持依赖较大的 ML 栈OPEN_NOTEBOOK_ENABLE_CRAWL4AItrue容器内安装本地 Crawl4AI自带 Chromium 浏览器CRAWL4AI_API_URLhttp://crawl4ai:11235改用远程 Crawl4AI 服务器跳过本地安装OPEN_NOTEBOOK_WORKER_MAX_TASKS1单 GPU / 本地 LLM 场景下调低后台任务并发避免并行请求压垮模型。这些运行时安装由 scripts/docker-entrypoint.sh 在 supervisord 启动前完成。编辑文件将change-me-to-a-secret-string替换为你自己的随机字符串任意字符串均可例如my-super-secret-key-123可选若要使用非默认的root:root数据库凭据在docker-compose.yml同目录创建.env文件写入SURREAL_USER...与SURREAL_PASSWORD...两个服务会自动读取同一份值。完整格式可参考仓库的 .env.example其中还列出了OPENAI_API_KEY、CHUNK_SIZE、CHUNK_OVERLAP、API_URL等可选配置。第二步启动服务在docker-compose.yml所在目录打开终端docker compose up -d等待 15~20 秒首次拉取镜像会更久预期看到类似✅ surrealdb running on :8000 ✅ open_notebook running on :8502 (UI) and :5055 (API)检查状态docker compose ps第三步验证安装API 健康检查curl http://localhost:5055/health # 应返回: {status: healthy}该端点由 FastAPI 应用直接提供源码见 api/main.py 中的app.get(/health)处理器。前端访问浏览器打开http://localhost:8502应看到 Open Notebook 界面。若前端白屏或报错通常是前端仍在等待 APIsupervisord 中的 frontend 程序会先执行等待脚本稍候重试即可。第四步配置 AI 供应商进入Settings → API Keys点击Add Credential选择供应商如 OpenAI、Anthropic、Google填写名称并粘贴 API KeyKey 在对应供应商官网申请点击Save点击Test Connection应显示连接成功点击Discover Models → Register Models完成模型发现与注册。这些操作对应后端的路由实现api/routers/credentials.py、api/routers/providers.py凭据经OPEN_NOTEBOOK_ENCRYPTION_KEY加密后存入 SurrealDB。除 UI 外也支持在.env中以OPENAI_API_KEY等环境变量方式注入官方文档推荐 UI 配置以获得更好的安全性与灵活性见 .env.example 注释。第五步创建第一个笔记本点击New Notebook名称填写如 My Research描述 Getting started点击Create。至此一个完整可用的 Open Notebook 实例部署完成。进阶配置加入 Ollama 本地模型若希望使用免费、私密的本地模型官方提供了现成示例 examples/docker-compose-ollama.yml。该文件在基础栈之上增加了一个ollama服务ollama: image: ollama/ollama:latest ports: - 11434:11434 volumes: - ollama_models:/root/.ollama restart: always volumes: ollama_models:手动添加时把上述ollama服务与顶层volumes段并入你现有的docker-compose.yml即可。然后重启并拉取模型示例文件的用法注释给出的命令是docker exec open_notebook-ollama-1 ollama pull mistral实际容器名以docker ps输出为准docker compose restart docker exec ollama容器名 ollama pull mistral在设置界面中配置 OllamaSettings → API KeysAdd Credential→ 选择OllamaBase URL 填http://ollama:11434容器间以服务名互访不要填localhostSave后Test ConnectionDiscover Models → Register Models。环境变量参考变量用途示例 / 默认值OPEN_NOTEBOOK_ENCRYPTION_KEY凭据加密密钥必填my-secret-keySURREAL_URL数据库连接地址ws://surrealdb:8000/rpcSURREAL_USER数据库用户默认rootSURREAL_PASSWORD数据库密码默认rootSURREAL_NAMESPACE数据库命名空间open_notebookSURREAL_DATABASE数据库名open_notebookAPI_URLAPI 对外 URL反向代理 / 自定义域名时设置http://localhost:5055OPEN_NOTEBOOK_EMBEDDING_BATCH_SIZE覆盖 embedding 批大小CPU-only 或严格限流的本地 provider 建议调小纯 CPU 本地环境推荐8默认50OPEN_NOTEBOOK_WORKER_MAX_TASKSWorker 并发任务数默认5单 GPU / 本地 LLM 建议1补充说明依据环境变量参考OPEN_NOTEBOOK_ENCRYPTION_KEY支持以_FILE后缀引用 Docker secrets变量名大小写敏感等号两侧不能有空格OPEN_NOTEBOOK_WORKER_MAX_TASKS在worker 启动时从进程环境读取在 Docker 中放在environment:下即可生效。常用运维操作# 停止服务 docker compose down # 查看日志全部 / 指定服务容器内服务名为 api、worker、frontend docker compose logs -f docker compose logs -f open_notebook容器名 # 重启 docker compose restart # 升级到最新版本 docker compose down docker compose pull docker compose up -d # 删除所有数据含命名卷 docker compose down -v注意两个细节由于数据库端口只绑定到127.0.0.1如需在另一台机器上用 SurrealDB 客户端调试需临时修改端口映射并配合强凭据docker compose down -v会同时删除./surreal_data、./notebook_data等 bind mount 之外的命名卷数据操作前请备份。故障排查“Cannot connect to API” 错误确认 Docker 正在运行docker ps确认服务状态docker compose ps查看 API 日志docker compose logs容器内实际日志来自 supervisord 管理的 api 进程可用docker logs open_notebook容器名查看首次启动服务可能需要 20~30 秒耐心等待。端口冲突若提示 “Port 8502 already in use”修改宿主端口映射ports: - 8503:8502 # 改用 8503 - 5055:5055 # API 端口保持不变然后访问http://localhost:8503。凭据问题进入Settings → API Keys对相应凭据点击Test Connection失败时到供应商官网核验 Key 是否有效确认账户有可用额度必要时删除并重新创建该凭据。数据库连接问题查看 SurrealDB 日志定位原因docker compose logs surrealdb重置数据库会清空数据docker compose down -v docker compose up -d数据库权限被拒Linux若 SurrealDB 日志中出现Permission denied或Failed to create RocksDB directorydocker compose logs surrealdb | grep -i permission原因是 SurrealDB 以非 root 用户运行而 Docker 创建的 bind mount 目录属主为 root。按本文“关键配置逐项解读”所述给 surrealdb 服务加上user: root官方 compose 文件已内置该修复然后docker compose down -v docker compose up -d重启。其他部署形态与后续步骤除标准多容器方案外examples/ 目录提供了更多带注释的变体配置examples/docker-compose-ollama.yml内置 Ollama 的本地 AI 方案免费、隐私优先examples/docker-compose-single.yml单容器一体化部署含容器内 SurrealDB官方标注已弃用将在 v2 移除examples/docker-compose-dev.yml面向贡献者与开发者的开发栈。后续建议路径添加内容Sources、笔记本、文档配置模型偏好Settings → Models探索功能Chat、搜索、Transformations深入文档用户指南、配置参考。生产环境部署请额外阅读 安全加固 与 反向代理配置务必将SURREAL_USER/SURREAL_PASSWORD改为强凭据、替换OPEN_NOTEBOOK_ENCRYPTION_KEY、避免将 8000 端口暴露到公网并在自定义域名下显式设置API_URLDockerfile 说明该变量用于让前端连接正确的 API 地址未设置时按请求自动推断。【免费下载链接】open-notebookAn Open Source implementation of Notebook LM with more flexibility and features项目地址: https://gitcode.com/GitHub_Trending/op/open-notebook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表