AIに教わる自動化技術:NotebookLMでn8nをセルフホスト&RSS要約フロー構築

に公開

概要

自動化ツールn8nを用いて日々購読しているRSSの内容をGeminiAPIで要約した内容をメール送信するn8nフローを作成した。
またGoogleNotebookLMを用いてDockerの知識0からインストール・設定を行いフローの作成・実用化までを行った。

背景

AI技術の進化に伴いChatGPTだけでなくGoogleNotebookLMというノートブック形式のAIツールやn8nという400種以上の外部サービスを連携可能なワークフロー型の自動化ツールが続々と登場している。こうした昨今のAI技術に置いていかれないよう慣れるためにn8nを使おうと思う。n8nはクラウド版(有料)とセルフホスト版(無料)とがあり、今回自分は無料で使いたいのでセルフホスト版を用いる必要がある。これにDockerというコンテナ技術を用いる必要があるのだが、このDockerが使用するのが難しく過去に使用を断念していた。
今回は上述のGoogleNotebookLMを用いてn8nを活用する為Dockerの使いこなしについて全くの初心者でもわかるようにGooglenotebookLMのAIに指導してもらいながらDockerとn8nの導入について挑戦した記録を共有する。

目標

  1. GoogleNotebookLMの設定
  2. Dockerとセルフホスト版のn8nをインストール・設定
  3. n8nでRSSフィードを定期的に自動取得し内容をGeminiで要約してまとめたものをメール送信するフローの作成
  4. セルフホスト版n8nの認証のためGoogleCloudConsoleでOAuthの設定

GoogleNotebookLMを用いてDockerをインストールし設定を行いn8nをインストールした。またn8nでワークフローを作る際もGoogleNotebookLMを使い設定を行った。Googleのノードを使用するにあたりセルフホスト版ではGoogleCloudを用いて認証情報を取得する必要があるためその設定も行った。

GoogleNotebookLMの設定

まずはDocker版のn8nをインストールし起動までを行う。そのためにGoogleNotebookLMを用いて情報収集を行なう。
GoogleNotebookLMにログインする。
https://notebooklm.google.com/

GoogleNotebookLMのメイン画面。
通常GoogleNotebookLMは手持ちの資料(ソース)をアップロードしそれをもとにAIに質問したり要約してもらったりする。他にも手持ちに資料がない時でも左上のソースのところのAddボタンからウェブサイトを検索から資料を集めてくれる機能がある。今回はこの機能を用いてn8nのセルフホスト版を使うためにソースを集めてもらった。


「ソースを追加」から集めてもらったソース。通常のGeminiやChatGPTではネットに広がる大量のデータから情報を集めてしまうのでデマなどの情報も含まれる可能性がある。しかしこのように情報を絞ることでハルシネーションを最小限に抑えることができる。
後述するが公式ドキュメントなどをソースとして使用するととても強力だ。

ソースを集め終わったので早速チャット欄にプロンプトを入力し、Dockerを用いたn8nのインストール方法を教えてもらう。
チャット欄に「n8nもDockerも全くの初心者。n8nを使うためにDockerを使いこなしたい。何から始めればよいだろうか」と入力。

このようにソースから情報をまとめて丁寧に教えてくれる。


GoogleNotebookLMが生成したチャット画面には参考文献として番号が振られている。こちらから参考元のページに飛ぶことができる。
https://zenn.dev/digilaweb/articles/d2918deeeb5c25
参考元のページ。今までは手作業で参考になりそうな文献を探す必要があったが、GoogleNotebookLMの「ソースを探す」の機能で自動で探してくれる。
今回、GoogleNotebookLMのアドバイスと文献元のページを参考にしながら進めていった。

n8nのインストール・Docker環境構築

  1. まずDocker公式サイトからインストーラをダウンロード。
    https://www.docker.com/products/docker-desktop/
  2. ダウンロードしたインストーラをダブルクリックして起動し、画面の指示に従ってインストールを進める。Docker Desktopの管理画面が表示されれば、準備完了。

n8nをDockerで動かすには、docker-compose.ymlファイルを使用するのが最も一般的で手軽な方法だ。n8nを起動するために作業ディレクトリを作成し、その中にdocker-compose.ymlという名前のファイルを作成する。以下の内容を貼り付ける。

services:
  n8n:
    image: n8nio/n8n:latest
    restart: unless-stopped
    ports:
      - '5678:5678'
    environment:
      - TZ=Asia/Tokyo
      - N8N_ENCRYPTION_KEY=’’任意のランダムなキーを設定’’
    volumes:
      - ./data:/home/node/.n8n

・image: n8nio/n8n:latest: Docker Hubから最新のn8n公式イメージを使用
・restart: unless-stopped: Dockerデーモン起動時やコンテナ停止時に自動で再起動する設定
・ports: - "5678:5678": ホストPCの5678番ポートへのアクセスを、コンテナ内のn8nが使用する5678番ポートに転送
・environment: n8nの動作に必要な環境変数の設定。N8N_ENCRYPTION_KEYはランダムなキーを設定しておく。覚えておく必要はないので乱数でも設定しておく
・volumes: - ./data:/home/node/.n8n: n8nの設定や作成したワークフローのデータが、コンテナを削除しても消えないようにn8n_dataという名前付きボリュームに保存

docker-compose.ymlの作成及び格納が完了したら、コマンドプロンプトまたはPowershellなどからdocker-compose.ymlのディレクトリに移動し、n8nのDockerコンテナを起動するため次のコマンドを実行する。

docker compose up -d


起動するとDockerDesktopのアプリにもContainersの欄に追加された。

以上によりDockerを用いたセルフホスト版のn8nをインストールすることができた。

n8nの設定

次にn8nの設定を行う。上記設定が完了していれば下記URLでn8nにアクセスすることが可能だ。

http://localhost:5678/

上記URLにアクセスしユーザー名パスワードなどの初期設定が完了したら次は実際にn8nでワークフローを作っていく。
今回作りたいフローの参考になりそうなYouTube動画があったのでそれをGoogleNotebookLMのソースに追加する。

参考動画
https://www.youtube.com/watch?v=SPHnWPTql0s
上記をソースへ追加し、この通りにしたいと伝えて進めていく。

ワークフローの構築

N8Nで作成したいワークフローは
”RSSフィードから定期的に更新を受信してAIで要約してメールで送信する”
というもの。同様にGoogleNotebookLMを使用して指示通りに作成した。
作成したワークフローが下記の通り

このフローを説明していく。

ノード1 Schedule Trigger



まずSchedule Triggerというノードでどのタイミングで実行するかを決める。設定画面のHours Between Triggersの欄で何時間おきにフローを実行したいかを設定する。今回は3時間おきに更新内容をGeminiで要約するようにした。
また右上のDocsというメニューをクリックすることでそのノードの公式ドキュメントを読むことができる。エラー発生時や迷ったときは参考にするとよいだろう。

ノード2 RSS Read



ScheduleTriggerの次につなぐノードはRSS Readというもの。これは指定のRSSを読み取るノードで今回の場合InputにScheduleTriggerの起動タイミング時のRSSの内容を取得することができる。パラメータのURLに取得したいRSSのURLを入力する。今回はIT系ニュースサイトのGIGAZINEを登録した。なおRSSのURLは通常のホームページのURLとは違うので注意してほしい。
右上のExecute Stepをクリックすることでそのノードまでのフローを実行できる。

試しに押してみるとInputには先ほどのScheduleTriggerの出力結果が表示され、OutputにはRSS Readで取得したRSSの情報が表示される。このOutputのデータが次のノードへと渡される。

ノード3 IF



IFノードでは条件分岐を作成することが可能。Pythonのifと同じである。今回このIFノードで取得したRSSが現在時刻から3時間以内の更新内容をTrueとして、それ以外(3時間以上前)の記事をFalseとしてOutputするよう設定した。
IFノードの条件設定において通常プログラミング言語を用いた設定は必要ない。しかし前のノードから渡されたデータを参照したりと高度な操作を行う場合はJavaScriptを用いる必要がある。Conditionsにカーソルを合わせるとExpressionを選択する。
今回前のノードで取得したRSSが現在時刻から3時間以内の投稿をTrueとして識別したい。そのためExpressionタブにしてInputには下記内容を設定。

{{ $json["isoDate"] }}

Outputには下記内容を設定する

 {{ $now.minus({hours:3}) }}

また中央のプルダウンメニューは is afterを設定する。

ノード4 Message a model



IFノードで選択したRSSの記事内容をGeminiでAI要約してもらう。
今回RSSフィードの記事内容を要約してもらうのでExpressionタブでJSON形式で書いていく

以下の記事を7行程度で日本語要約してください。

タイトル: {{ $json["title"] }}
本文: {{ $json["content"] || $json["description"] }}
URL: {{ $json["link"] }}

出力は必ず以下のJSON形式で返してください:
{
  "title": "{{ $json["title"] }}",
  "link": "{{ $json["link"] }}",
  "summary": "要約テキスト"
}

何行でまとめてもらうかは個人の好みによるが、3行程度だと内容でなく記事のタイトルのみについてしか言及してくれないことが頻発していたので7行程度で要約してもらうことにした。

ノード5 Code



CodeノードではMessage a modelで作成したデータをメール形式で出力するために形式を変換している。n8nはノーコード・ローコードで作成可能であるが、このCodeノードではしっかりとコーディングを行うことになる。LanguageタブでJavascriptかPythonを選択可能だが、今現在(2025年10月)PythonはBetaとなるためJavascriptを用いるのが無難だろう。
Codeノードで下記Javascriptをコーディングした。

// ========== JST時刻フォーマッタ ==========
function formatJST(date = new Date()) {
  const fmt = new Intl.DateTimeFormat('ja-JP', {
    timeZone: 'Asia/Tokyo',
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    hour12: false,
  });
  const parts = Object.fromEntries(fmt.formatToParts(date).map(p => [p.type, p.value]));
  return `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute}`;
}

// 件名(JST)
const subject = `RSSまとめ ${formatJST()}`;

// ========== 本文(あなたの既存ロジック) ==========
const items = $input.all();
const compiled = [];

for (const item of items) {
  const j = item.json ?? item;

  // ① すでに JSON で来ている(Output Content as JSON = ON)
  if (j.title && j.link && j.summary) {
    compiled.push(`<a href="${j.link}">${j.title}</a><br>${j.summary}<br><br>`);
    continue;
  }

  // ② モデルのテキストから取り出す (content → parts)
  let text =
    j.content?.parts?.[0]?.text ??
    j.content?.parts?.["parts[0]"]?.text ?? // 変なキー名ケース
    j.content?.text ??
    j.text ?? "";

  if (!text) {
    compiled.push("⚠️ モデルのテキストが見つかりませんでした");
    continue;
  }

  // コードフェンス除去
  const cleaned = text.replace(/```json|```/g, "").trim();

  // ③ JSONとしてパース(失敗したら簡易抽出)
  let obj;
  try {
    obj = JSON.parse(cleaned);
  } catch {
    const title = /"title"\s*:\s*"([^"]+)"/.exec(cleaned)?.[1] ?? "(タイトルなし)";
    const link = /"link"\s*:\s*"([^"]+)"/.exec(cleaned)?.[1] ?? "#";
    const summary = /"summary"\s*:\s*"([^"]+)"/.exec(cleaned)?.[1] ?? cleaned;
    obj = { title, link, summary };
  }

  compiled.push(`<a href="${obj.link}">${obj.title}</a><br>${obj.summary}<br><br>`);
}

return [
  {
    json: {
      subject,                         // ← ここをGmailノードの件名で使う
      compiled: compiled.join("\n\n"), // ← 本文(HTML)
    },
  },
];

n8nはローコードではあるが、このCodeノードではしっかりとコーディングを行う必要がある。
残念ながら筆者はJavaScriptの知識がないためChatGPTに依頼して作成している。
GoogleNotebookLMでコーディングの質問をしてもドキュメントにそのような情報は無いと返されるばかりなので、コーディングの際はChatGPTやGeminiなどのチャット型のAIを使うのがよいだろう。

ノード6 Send a Message



Send a messageノードで取得したメールテンプレートをメール送信する。
Credential to connect withでリンクしたGmailアカウントを選択。Toで宛先を指定。
Subjectには件名に指定したい文字を指定。今回GIGAZINEのRSSまとめであることが分かり、また何時点での内容かわかるようにしたいので下記のように設定する

Gigazine {{$json.subject}}

MessageにはCodeで出力した内容を記載する

{{ $json.compiled }}

これでノードの設定はほぼ完了した。次にセルフホスト版のn8nならではの設定を行う。

n8nでGogle OAuth認証の設定

Message a modelノードでGeminiで要約したりSend a MessageノードでGmail送信する際にGoogleアカウントと連携する必要がある。クラウド版のn8nでは簡単に連携ができるのだが、セルフホスト版ではGoogleアカウントの連携の際にGoogle Cloud Consoleで必要な認証情報(クライアントID、クライアントシークレット)を発行しn8nに設定する必要がある。すこし複雑な作業が必要になるが、その手順をまとめる。

  1. GoogleアカウントでGoogleCloudConsoleにログイン
    https://console.cloud.google.com/
    画面上部のプロジェクトドロップダウンから「新しいプロジェクト」を選択し、任意のプロジェクト名を入力して作成する(n8n google credentialsなど)

  2. 左上のナビゲーションメニューから「APIとサービス」→「ライブラリ」へ移動。連携したいN8Nノードに対尾するAPIを検索して有効化する。今回はGmailAPIを選択。

  3. (APIの有効化が初めての場合)OAuth同意画面の構成を行う。「APIとサービス」→「OAuth同意画面」へ移動し「開始」を選択。「アプリ名」と「ユーザーサポートメール」を入力。(例: アプリ名「n8n google api」)。ユーザーサポートメールには自分のGmailアカウントのメールアドレスを設定しておく。

  4. 「APIとサービス」→「認証情報」へ移動。「認証情報を作成」→「OAuthクライアントID」を選択。「アプリケーションの種類」で「ウェブアプリケーション」を選択。「名前」には識別しやすい名前を付けておく。「承認済みのリダイレクトURI」には、n8nの認証画面に表示されている「OAuth Redirect URL」をコピーして貼り付ける。

n8nの認証情報作成画面で、新しい認証情報を作成する際に「Open docs」の下に「OAuth Redirect URL」が表示される。「作成」をクリックすると、「クライアントID」と「クライアントシークレット」が表示されるのでこれをコピーしておく。メモしておくべし。

  1. n8nへの認証情報の登録と最終認証n8nの画面に戻り、Gmailトリガーノードなどの認証情報設定で先ほどコピーした「クライアントID」と「クライアントシークレット」をそれぞれの入力欄にペースト

    情報入力後、n8nの画面下部に表示される「Sign in with Google」ボタンをクリック。Googleの認証画面が表示され画面の指示に従ってGoogleアカウントを選択し必要な権限を付与。

認証が完了すると、n8nの画面に「Account connected」と緑色の帯が表示されれば認証成功。

完成! n8nで作成したワークフローを動かす

ここまで設定出来たらようやくMessage a modelやSend a Messageのノードを使用可能となった。
下に表示されているExecute workflowを押すことでフローを実行できる。

または各ノードを選択し、右上のExecute Stepを選択することでそのノードまでを実行することが可能。テスト作業時に使ってみるとよいだろう。
もしエラーが起きた場合は自分で調べてもよいし、GoogleNotebookLMで質問してみてもよいだろう。特にノードの公式ドキュメントをソースとして読み込ませておけばかなり正確に答えてくれるはずだ。


実際にフローを実行して送られてきたメール。
ScheduleTriggerで指定した時間ごと(今回は3時間)にメールが送られてくる。そしてIFノードで設定した直近3時間以内の更新内容をMessage a modelノードでGeminiAPIを用いて要約された文章がメール本文に記載されている。

以上によりGoogleNotebookLMでDockerインストール・設定を行いn8nフローの作成・実用化までを行った。

おわりに

RSS要約フローの完成と運用

n8nのセルフホスト版により定期的にチェックしていたRSSの記事を開くことなくメール文章から内容を簡易的に確認することが可能になった。
(もうFeedlyの未読を消化する時間とはおさらばです!)
またクラウド版とは違いセルフホスト版であるためクラウドに月額料金を払わずに無料で使用可能である。
欠点としてはDocker版ではPCの電源を切ると動作しないという点があるので、常用するために手持ちの余っている適当なノートPC(Mac)を常時電源ONのサーバーとして使用した。

GoogleNotebookLMの活用と限界

GoogleNotebookLMのソースを探すという機能が便利で今まで自分で自力で探していた参考元を自動で集めてくれる。ほか公式ドキュメント等を読み込ませることで公式情報に基づいた回答がもらえるのも他のChatGPTなどではできないことだろう。

Dockerとn8nの学習に感じたこと

実際のDockerのインストールやn8n環境の構築は自分でWEBサイトの見て行う方がやりやすく感じた。Dockerを学ぶという点でも結局は書籍などで学んだ方が体系的に学ぶことができるだろう。
結局筆者も現在は書籍を買ってDockerを勉強している。

AIコーディングの現在

n8nを使う上ではノーコードではすべて対応するのは困難と感じた。結局はJavascriptやPHPのコーディングスキルが必要となった。筆者はPythonはある程度できるがJavascriptなどのWEB系の言語の知識がなく全てChatGPTに頼ることとなったがここで沼にはまり苦労した。Aiコーディングは前提条件と出力形式をうまく指定してあげないと、プロンプト通りの作成ではあるが実際には動作しないものが出来上がってしまう。AIによりプログラミングスキルは不要になるという意見もあるが、個人的にはまだ過渡期であると考えている。そのためAI全盛期の現代においてもJavascriptなどのプログラミング言語を学ぶ意義は十分あると感じた。

実際にGoogleNotebookLMを使ってみて

GoogleNotebookLMを使用してみて感じたメリットデメリット、をまとめてみる。

メリット

・ソースを絞って分析を行うことができる。
これが一番の魅力と考えられ、チャット型AI(ChatGPTやGemininなど)ではネット上の大量のデータを分析に用いてしまうが、GoogleNotebookLMではソースを絞って分析することができる。n8nの公式ドキュメントをソースとして用いれば公式情報に基づいた正確な情報を得ることができる。
また自身でソースをアップロードしてそれを分析対象とすることもできるので、ネットに転がっていない情報をもとに分析することができる。

デメリット

・コーディングには不向き
n8nのワークフローを作る際にCodeというノードを利用した。この際どのようなコードを書くかをGoogleNotebookLMに相談したが、上手く行かなかった。コーディングをする際はソースを絞るGoogleNotebookLMではなく一般的なチャットAIを使用するのがよいだろう。

実際にn8nを使ってみて

n8nを使用してみて感じたメリットデメリット、をまとめてみる。

メリット

・ローコードでGUI操作でアプリケーションやサービスを連携させ、定型作業を自動化できる。
自動化するプログラムを作ろうとすると高度な知識が必要になるが、n8nを用いればGUI操作で比較的簡単に自動化を行える。今回RSSフィードをGeminiに内容要約させるフローを作成したが、WEB系の専門知識はほぼ無しの筆者でも(なんとか)作成することができた。

デメリット

・ノーコードではない。
今回作成したフローにCodeというノードがあるがここでは普通にコーディングをすることになる。ノーコードではない。
この際GoogleNotebookLMではコーディングが上手くできず、今回はChatGPTを用いることで対応した。

Discussion