Open Notebookをセルフホストする方法:Docker導入、モデル設定、データ保護

Docker ComposeでOpen Notebookをセルフホストし、暗号化キーとDB認証情報を設定して、クラウドまたはローカルモデルを接続し、コンテナ状態、ログ、テスト資料で導入を検証します。

Open Notebookは、資料を使った学習と調査のためのオープンソースアプリです。PDF、Webページ、音声、動画、Office文書を取り込み、それらのソースを基に検索、チャット、ノート整理、Podcast生成を行えます。一般的なチャットツールとの違いは、資料、引用、モデル設定、ノートを自分のワークスペースで管理できる点です。

セルフホストは完全オフラインと同義ではありません。OpenAI、Anthropic、Googleなどのクラウドモデルを選ぶと、モデルに渡すコンテキストは外部サービスへ送信されます。処理経路をローカルに保つには、アプリとモデルの両方をローカル運用する必要があります。

導入前の準備

公式クイックスタートではDocker Desktopが必要です。LinuxサーバーではDocker EngineとComposeプラグインを利用できます。最初に確認します。

1
2
docker --version
docker compose version

さらに次を用意します。

  • データベースとアプリデータを保存する永続化ディレクトリ。
  • ランダムな OPEN_NOTEBOOK_ENCRYPTION_KEY
  • 外部公開する場合はドメイン、HTTPS、アクセス制御。
  • クラウドモデルのAPI Key、または接続可能なOllama/LM Studioサービス。

公式Composeファイルを取得する

無関係なプロジェクトにデータを混在させないよう、専用ディレクトリを作ります。

1
2
3
mkdir open-notebook
cd open-notebook
curl -o docker-compose.yml https://raw.githubusercontent.com/lfnovo/open-notebook/main/docker-compose.yml

古いブログ記事からComposeをコピーしないでください。イメージ、ポート、データベース設定は変わる可能性があるため、公式リポジトリの現行ファイルを使います。

起動前に必ず変更する設定

docker-compose.yml または対応する .env で暗号化キーを設定します。

1
OPEN_NOTEBOOK_ENCRYPTION_KEY=独自の長いランダム文字列に変更

このキーはデータベース内のAPI Keyを保護します。導入後に不用意に変更すると、保存済みの認証情報を復号できなくなる可能性があります。

公式のローカル例ではSurrealDBに root:root を使えますが、localhostに限定したテスト用です。LANや公開環境ではデータベースのユーザーとパスワードも設定します。

1
2
SURREAL_USER=open_notebook_user
SURREAL_PASSWORD=長いランダムパスワードに変更

データベースのデバッグポートは 127.0.0.1:8000 に限定したままにします。利便性だけを理由に 0.0.0.0:8000 へ変更しないでください。

コンテナを起動して確認する

1
2
docker compose up -d
docker compose ps

起動を待ってから次を開きます。

1
http://localhost:8502

8502 はWeb UI、5055 はREST API、8000 はSurrealDBのローカルデバッグポートです。docker compose ps でアプリとデータベースの両方が稼働していることを確認します。

ページを開けない場合は、先にログを確認します。

1
2
docker compose logs --tail=100 open_notebook
docker compose logs --tail=100 surrealdb

最初のモデルを設定する

Web UIで次の操作を行います。

  1. Modelsを開く。
  2. OpenAI、Anthropic、Google、Ollama、LM StudioなどのProviderを選ぶ。
  3. API Keyまたはローカルサービスのアドレスを追加する。
  4. Testで接続を確認する。
  5. Sync Modelsでモデル一覧を同期し、使用するモデルを選ぶ。
  6. Default Model Assignmentsで既定モデルを自動または手動で割り当てる。

すべてのProviderがLLM、Embedding、音声認識、音声合成を同時に提供するわけではありません。チャットは動くのに資料検索が失敗する場合、チャットモデルを交換し続けるのではなくEmbeddingモデルを確認してください。

小さな資料セットで検証する

最初から全資料を取り込まないでください。テスト用Notebookを作り、次の3点だけを追加します。

  1. テキストをコピーできる短いPDF。
  2. 公開Webページ1件。
  3. 手書きのテストノート1件。

次を順番に確認します。

  • ソースの解析が完了する。
  • PDF内の特徴的な文を検索できる。
  • 回答にソースまたは引用が表示される。
  • 新しいノートを再度開ける。
  • コンテナ再起動後も資料が残る。

最後の確認により、surreal_datanotebook_data などの永続化ディレクトリが機能していると判断できます。

よくある問題

8502番ポートが使用中

Composeのホスト側ポートを変更します。

1
2
ports:
  - "18502:8502"

変更後は http://localhost:18502 を開きます。コンテナ内部のポートは 8502 のままです。

データベースが再起動を繰り返す

最初にSurrealDBのログを確認します。Linuxでは、マウント先に書き込み権限がない、または古いデータベースファイルと新しいイメージの互換性がないことが主な原因です。権限を変更する前にデータをバックアップし、最初の対処として永続化ディレクトリを削除しないでください。

モデルのTestは成功するがQ&Aが失敗する

既定LLM、Embeddingモデル、ソース解析状態の順に確認します。プライベートなモデルサーバーでは、コンテナからホストへ接続できるかも確認してください。コンテナ内の localhost はそのコンテナ自身であり、OllamaやLM Studioを実行するホストとは限りません。

更新とバックアップ

更新前にCompose、.env、データベース、アプリデータをバックアップし、次を実行します。

1
2
3
docker compose pull
docker compose up -d
docker compose ps

docker-compose.yml だけのバックアップでは不十分です。復旧には永続化データ、暗号化キー、データベース認証情報が必要です。

Open NotebookとNotebookLMの選び方

サーバーを管理せずすぐに使いたく、Googleによるホスティングを受け入れられるならNotebookLMが簡単です。セルフホスト、複数Provider、REST API、独自ワークフロー、ローカルモデルが必要ならOpen Notebookが適しています。その代わり、アップデート、バックアップ、アクセス制御、モデル費用を自分で管理します。

参考資料