
Open Notebook 基于 EasyPanel 模板的一鍵部署模板結構、服務編排與環境變量全解析【免費下載鏈接】open-notebookAn Open Source implementation of Notebook LM with more flexibility and features項目地址: https://gitcode.com/GitHub_Trending/op/open-notebookEasyPanel 是一個圖形化的自托管應用面板通過模板 可填寫表單的方式即可完成多服務應用的部署。Open Notebook 在 examples/easypanel 目錄中提供了一套官方 EasyPanel 模板把「Open Notebook 應用 SurrealDB 數據庫」兩個服務封裝為一個可復用的部署單元。讀完本文你將掌握該模板meta.yaml與index.ts的文件格式、每個配置字段的含義了解兩個服務各自暴露的端口、環境變量與持久化卷并能夠在 EasyPanel 中完成從模板導入、密碼設置到首次登錄配置 AI Provider 的完整實操流程。模板定位一次點擊拉起「應用 數據庫」這套模板位于倉庫 examples/easypanel/ 目錄由meta.yaml與index.ts兩個文件組成遵循 EasyPanel 官方模板倉庫easypanel-io/templates的目錄與代碼約定meta.yaml描述模板元數據與用戶輸入input schema即 EasyPanel 創建模板時展示給用戶的表單index.ts實現generate(input)函數把用戶的表單輸入展開為具體的 EasyPanel services 定義。模板部署后會創建兩個服務服務角色網絡可見性說明Open Notebook應用Next.js 前端 Python 后端對外暴露入口端口8502通過域名直接訪問反向代理友好SurrealDB v2數據庫僅項目內部網絡可見通過ws://...:8000/rpc供應用連接數據持久化在卷中倉庫根目錄的 examples/README.md 也明確說明該 easypanel 模板可直接復制進官方 EasyPanel 模板倉庫并在 EasyPanel templates playground 中測試。meta.yaml模板元數據與輸入表單定義examples/easypanel/meta.yaml 完整描述了模板的名稱、說明、安裝指引、變更日志、標簽與輸入項。其中schema部分是 EasyPanel 渲染創建表單的依據共定義了 5 個輸入字段字段類型標題默認值是否必填用途appServiceNamestringApp Service Nameopen-notebook是應用服務的名稱appServiceImagestringApp Service Imagelfnovo/open_notebook:1.10.0是Open Notebook 鏡像及版本標簽databaseServiceNamestringDatabase Service Namesurrealdb是數據庫服務的名稱databaseServiceImagestringDatabase Service Imagesurrealdb/surrealdb:v2是SurrealDB v2 官方鏡像appPasswordstringOpen Notebook Password空否應用登錄密碼留空則自動生成值得注意的細節appServiceImage默認值被固定為lfnovo/open_notebook:1.10.0模板首個版本發布于 2026-06-19。與之對照倉庫根目錄 docker-compose.yml 使用的是滾動標簽lfnovo/open_notebook:v1-latest。因此在 EasyPanel 上通過該模板部署后如需升級版本應修改這個輸入項的鏡像標簽。meta.yaml中還包含面向模板市場的展示信息description介紹 Open Notebook 是開源自托管的 notebook 與研究型工作區支持收集資料、記筆記、搜索、與內容對話及生成播客instructions給出部署后的引導文案benefits與features分別說明模板帶來的部署價值與產品能力源碼收集、notebook 組織、帶引用的 AI 問答、播客生成changeLog、links、contributors、tags則服務于模板倉庫的版本與分類管理。index.ts一次 generate 調用編排兩個服務examples/easypanel/index.ts 是整個模板的核心邏輯。它從~templates-utils引入Output、randomPassword、randomString、Services等輔助工具在generate(input)內完成密鑰生成與服務定義export function generate(input: Input): Output { const services: Services []; const appPassword input.appPassword || randomPassword(); // 用戶未填 → 自動生成 const databasePassword randomPassword(); // 數據庫密碼隨機生成 const encryptionKey randomString(64); // 加密密鑰隨機生成64 字符 // ...push SurrealDB service、push Open Notebook service... return { services }; }三個關鍵密鑰的生成策略正好呼應meta.yaml中benefits聲明的 Secure defaultsappPassword優先取用戶在表單中填寫的密碼留空則調用randomPassword()生成一個隨機密碼并寫入應用服務環境變量OPEN_NOTEBOOK_PASSWORDREADME 中對該行為有專門說明databasePassword每次模板創建都隨機生成encryptionKey每次模板創建都生成 64 字符的隨機串作為OPEN_NOTEBOOK_ENCRYPTION_KEY。每次在 EasyPanel 中執行模板創建都會重新走一遍generate()也就意味著會生成一組全新的隨機密鑰與數據庫密碼它們被持久化在應用服務app service的環境變量中。服務一私有部署的 SurrealDB v2模板把 SurrealDB 設計為項目內部私有服務不對外暴露任何域名或宿主端口應用在項目網絡中通過內部 DNS 訪問。其服務定義要點如下{ type: app, data: { serviceName: input.databaseServiceName, env: [SURREAL_EXPERIMENTAL_GRAPHQLtrue].join(\n), source: { type: image, image: input.databaseServiceImage }, deploy: { command: [ start, --log info, --user root, --pass ${databasePassword}, --bind 0.0.0.0:8000, rocksdb:/mydata/mydatabase.db, ].join( ), }, mounts: [{ type: volume, name: surreal-data, mountPath: /mydata }], }, }幾點值得展開啟動命令使用rocksdb:/mydata/mydatabase.db即讓 SurrealDB 以RocksDB 存儲引擎運行數據文件落在容器內/mydata/mydatabase.db卷surreal-data掛載到/mydata保證數據庫文件在容器重建后依然存在端口8000僅對項目網絡內部開放日志級別為info憑據為root 隨機生成的密碼SURREAL_EXPERIMENTAL_GRAPHQLtrue開啟 SurrealDB 的實驗性 GraphQL 支持這與倉庫根目錄 docker-compose.yml 中 surrealdb 服務保持一致的配置習慣。由于該服務在模板中并未配置domains它不會被 EasyPanel 暴露到公網這正是數據庫私密這一安全設計的體現。服務二Open Notebook 應用與它的全部環境變量應用服務承載了 Open Notebook 的 Web UINext.js 前端與內部 REST APIFastAPI通過domains把 EasyPanel 自動分配的域名映射到容器端口8502。模板為該服務注入了一批環境變量它們是理解整套模板如何工作的鑰匙env: [ API_URLhttps://$(PRIMARY_DOMAIN), INTERNAL_API_URLhttp://localhost:5055, OPEN_NOTEBOOK_ENCRYPTION_KEY${encryptionKey}, OPEN_NOTEBOOK_PASSWORD${appPassword}, SURREAL_URLws://$(PROJECT_NAME)_${input.databaseServiceName}:8000/rpc, SURREAL_USERroot, SURREAL_PASSWORD${databasePassword}, SURREAL_NAMESPACEopen_notebook, SURREAL_DATABASEopen_notebook, ].join(\n), // domains: [{ host: $(EASYPANEL_DOMAIN), port: 8502 }] // mounts: [{ type: volume, name: notebook-data, mountPath: /app/data }]下面逐一說明每個變量的作用以及它們在 Open Notebook 運行時中的落點數據庫連接變量環境變量值作用SURREAL_URLws://$(PROJECT_NAME)_databaseServiceName:8000/rpcSurrealDB 的 WebSocket RPC 地址$(PROJECT_NAME)_surrealdb是 EasyPanel 項目內部網絡的域名規則SURREAL_USERroot數據庫用戶名與 SurrealDB 服務啟動參數一致SURREAL_PASSWORD隨機生成數據庫密碼與 SurrealDB 服務啟動參數中的--pass相同SURREAL_NAMESPACEopen_notebookSurrealDB 命名空間SURREAL_DATABASEopen_notebookSurrealDB 數據庫名namespace/database兩級命名對應 SurrealDB 的數據組織模型在倉庫根目錄 docker-compose.yml 的多容器編排中使用的是同一組值open_notebook/open_notebook而 examples/docker-compose-single.yml 這類單容器場景則需覆蓋為ws://localhost:8000/rpc。EasyPanel 模板選擇 WebSocket RPCws://而非http://作為連接協議與官方 compose 部署保持一致。認證與加密變量OPEN_NOTEBOOK_PASSWORD應用登錄密碼這是模板中與用戶體驗直接相關的一個變量。若在創建表單中填寫了密碼EasyPanel 會把它寫入應用服務環境變量若留空模板會生成隨機密碼并同樣以OPEN_NOTEBOOK_PASSWORD存儲見 README 與meta.yaml的instructions。運行時層面該變量驅動內置的密碼認證中間件從源碼 api/auth.py 看其認證器通過get_secret_from_env(OPEN_NOTEBOOK_PASSWORD)讀取密碼并支持OPEN_NOTEBOOK_PASSWORD_FILE的 Docker secrets 形式倉庫變更記錄 CHANGELOG.md 同時說明——當OPEN_NOTEBOOK_PASSWORD未設置時認證被完全禁用本地零配置部署場景而一旦設置即啟用登錄保護前端對應 LoginForm.tsx 登錄頁。因此 EasyPanel 部署務必設置該密碼。OPEN_NOTEBOOK_ENCRYPTION_KEY加密密鑰用于在數據庫中加密保存用戶配置的各類 AI Provider API Key。字段級加密實現位于 open_notebook/utils/encryption.py它接受任意字符串作為密鑰通過 SHA-256 派生并轉換為 Fernet 密鑰再使用 FernetAES-128-CBC HMAC-SHA256 認證加密完成加解密。該文件明確要求生產部署必須顯式設置此變量否則存儲 API Key 時會因ValueError失敗。模板每次創建都通過randomString(64)生成強隨機密鑰比人工設置的弱口令安全得多。前端反向代理相關變量API_URLhttps://$(PRIMARY_DOMAIN)瀏覽器端發起請求時使用的 API 基址。$(PRIMARY_DOMAIN)與后續domains中使用的$(EASYPANEL_DOMAIN)指向同一個公網域名。INTERNAL_API_URLhttp://localhost:5055Next.js 服務端把/api/*請求內部轉發到 REST API運行在localhost:5055所用地址。兩個變量分工的源碼依據非常清晰。前端運行時配置 frontend/src/lib/config.ts 會先請求服務端/config接口獲取apiUrl而/config路由的實現 frontend/src/app/config/route.ts 明確注釋了為什么需要兩個變量API_URL供瀏覽器直接訪問、可以是https://your-domain.com這類公網地址INTERNAL_API_URL則供 Next.js rewrites 在服務端做代理轉發默認http://localhost:5055。再看 Next.js 配置 frontend/next.config.tsrewrites()把/api/:path*代理到INTERNAL_API_URL對應的后端注釋直接說明——反向代理只需把流量導到 8502Next.js 負責內部把請求路由到 5055 的 API。這正是meta.yaml中 Reverse-proxy friendly benefit 所描述的設計只有前端端口8502被暴露。數據持久化應用服務的卷notebook-data被掛載到容器內/app/data。為什么是這個路徑因為 Open Notebook 的數據根目錄DATA_FOLDER ./data定義在 open_notebook/config.py容器工作目錄下即/app/data其中包含 LangGraph 檢查點 SQLitesqlite-db/checkpoints.sqlite、上傳文件目錄uploads/、播客輸出目錄podcasts/以及 tiktoken 緩存目錄。把整個/app/data持久化為卷可以確保會話檢查點、上傳的源文件、生成的播客音頻與分詞緩存都在容器重建后保留。數據庫數據則由獨立的surreal-data卷承載與應用數據卷相互隔離。端到端部署實操流程結合 README 的 Testing 章節與meta.yaml的instructions一次完整的部署包含以下步驟第 1 步把模板放進 EasyPanel 模板倉庫將 examples/easypanel 整個目錄復制到本地克隆的easypanel-io/templates倉庫中目錄名改為templates/open-notebookcp -r examples/easypanel path-to-easypanel-io/templates/templates/open-notebook第 2 步啟動 EasyPanel 模板開發環境在easypanel-io/templates倉庫根目錄運行模板 playgroundnpm run devplayground 會讀取模板目錄下的meta.yaml與index.ts渲染出與正式創建時一致的表單方便你在導入實例前驗證輸入項與生成的 services JSON 是否符合預期。第 3 步在 EasyPanel 實例中創建模板并部署打開 EasyPanel 面板通過模板管理導入上述目錄生成的模板 JSON在創建表單中至少確認appServiceName、appServiceImage、databaseServiceName、databaseServiceImage四個必填項均有合理默認值通常無需改動在 Open Notebook Password 字段設置一個應用密碼。若留空EasyPanel 會生成隨機密碼并把OPEN_NOTEBOOK_PASSWORD寫入應用服務環境變量可在服務環境變量面板中查看提交創建。模板會依次生成 SurrealDB 服務與 Open Notebook 服務、掛載兩個持久化卷、注入全部環境變量。第 4 步首次登錄并配置 AI Provider部署完成后打開 EasyPanel 為應用分配的域名流量經 EasyPanel 入口轉發到容器的 8502 端口使用你設置的密碼登錄。隨后進入Settings API Keys頁面配置所需的 AI 提供方密鑰如 OpenAI、Anthropic 或 Ollama 等本地模型。這也是meta.yaml中instructions明確引導的流程。安全與運維要點基于模板實現與倉庫源碼可以總結出以下運維注意事項數據庫與加密密鑰僅在創建時生成一次databasePassword與encryptionKey由generate()在模板創建時生成并固化在服務環境中。如果日后重新從模板創建新服務或重建項目會得到一組全新密鑰不會自動沿用舊值。OPEN_NOTEBOOK_ENCRYPTION_KEY必須保持穩定API Key 在入庫前經 Fernet 加密見 open_notebook/utils/encryption.py。一旦更換密鑰已存儲的加密憑據將無法解密解密函數會針對看似加密但密鑰錯誤的數據拋出配置檢查提示因此在已有數據的環境上切勿隨意改動該變量。登錄密碼用于保護 Web 界面與 API設置OPEN_NOTEBOOK_PASSWORD即啟用了內置密碼認證未設置時認證完全禁用本地/內網零配置場景可用。公網部署務必通過表單或環境變量設置強密碼。升級方式把模板輸入項appServiceImage從默認的lfnovo/open_notebook:1.10.0改為更新的發布標簽后重新部署即可完成鏡像升級容器內/app/data與數據庫卷中的數據會隨卷保留。僅暴露前端端口模板刻意不向數據庫服務配置域名公網入口只有映射到 8502 的應用域名后端 5055 僅在容器內部被 Next.js 代理訪問外部無法直接觸達減小了攻擊面。與官方 Docker Compose 部署的對照如果你想在 EasyPanel 之外使用傳統編排方式倉庫提供了等價的參考實現docker-compose.yml標準的雙容器部署surrealdb open_notebook環境變量集合與 EasyPanel 模板幾乎一一對應SURREAL_URL使用服務名ws://surrealdb:8000/rpc可作為理解 EasyPanel 模板字段含義的權威對照examples/docker-compose-single.yml單容器形態不推薦用于生產README 亦標注為 deprecated需要把SURREAL_URL覆蓋為ws://localhost:8000/rpc完整的環境變量參考見 docs/5-CONFIGURATION/environment-reference.md安裝總覽見 docs/1-INSTALLATION/index.md。綜上這套 EasyPanel 模板把 Open Notebook 的應用 SurrealDB部署濃縮為一個表單、一次點擊meta.yaml定義人機交互的表單index.ts負責把表單翻譯成包含隨機密鑰、內部網絡尋址、持久化卷與反向代理友好配置的兩個服務。理解了OPEN_NOTEBOOK_PASSWORD、OPEN_NOTEBOOK_ENCRYPTION_KEY與API_URL/INTERNAL_API_URL/SURREAL_*這組環境變量的作用你就能在任何支持 EasyPanel 的自托管主機上穩定、安全地跑起一套屬于自己的 Open Notebook 研究空間。【免費下載鏈接】open-notebookAn Open Source implementation of Notebook LM with more flexibility and features項目地址: https://gitcode.com/GitHub_Trending/op/open-notebook創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考