0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

macで8n8オーケストレーションしてSearXNGとCrawl4AIとDirectusを使うメモ

0
Posted at

MacBook Air M4でn8nオーケストレーションしてSearXNGとCrawl4AIとDirectusを使うメモ

Apple Silicon(M4)環境のMacBook Air上で、AI検索とWebスクレイピング、ヘッドレスCMSを組み合わせた自動化基盤(n8n + SearXNG + Crawl4AI + Directus)をDocker環境で構築するためのメモです。

検索、データ収集・加工、蓄積までを完全ローカル環境で自動連携させる構成を作成します。


1. 開発環境と前提条件

本手順で利用する環境・ツールは以下の通りです。

  • OS: macOS (Apple Silicon / M4)
  • コンテナ環境: Docker Desktop または OrbStack (Apple Silicon対応版)
  • Docker: 仮想化ツール。安定しているが重い。
  • OrbStack: Dockerをより軽量化したもの。不安定な場合もある。
  • 構成OSS:
  • n8n: ワークフロー自動化(オーケストレーション)https://github.com/n8n-io/n8n
  • SearXNG: プライバシー重視のメタ検索エンジン(検索APIとして利用)https://github.com/searxng/searxng
  • Crawl4AI: LLM親和性の高いWebスクレイピングエンジンhttps://github.com/unclecode/crawl4ai
  • Directus: 収集データを構造化して保存するヘッドレスCMS https://github.com/directus
  • PostgreSQL: データベース

2. DockerかOrbStackの環境の準備

MacBook Air M4環境にDocker環境を用意します。パフォーマンスと省電力性の面から OrbStack の利用もおすすめですが、標準の Docker Desktop でも問題なく動作します。

  1. Docker Desktop または OrbStack をインストールします。
  2. ターミナルを開き、Dockerが正しく動いているか確認します。
docker --version
docker compose version

やっぱりOrbStackを試したい

  1. 今回は途中でなんとなくOrbStackを利用しようと思って、Dockerをアンインストールしました。
  2. Dockerのアンインストールは、Dockerを起動して、左下の三をクリック→Troubleshoot⇨Uninstallでアンインストールできます。
  3. OrbStackは次のコマンドでインストール完了します。
  4. brew install --cask orbstack

3. docker-compose.yml の作成と起動

作業用ディレクトリを作成し、各サービスを一度に起動するための docker-compose.yml を作成します。

mkdir m4-n8n-stack
cd m4-n8n-stack

docker-compose.yml を以下の内容で記述します。
つまりコピペ駆動開発。

version: '3.8'

services:
  # --- n8n ---
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=localhost
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - NODE_ENV=production
      - WEBHOOK_URL=http://localhost:5678/
    volumes:
      - n8n_data:/home/node/.n8n

  # --- SearXNG ---
  searxng:
    image: searxng/searxng:latest
    container_name: searxng
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - ./searxng:/etc/searxng
    environment:
      - SEARXNG_BASE_URL=http://localhost:8080/

  # --- Crawl4AI ---
  crawl4ai:
    image: unclecode/crawl4ai:basic
    container_name: crawl4ai
    restart: always
    ports:
      - "11235:11235"

  # --- Directus (DB: PostgreSQL) ---
  directus_db:
    image: postgres:15-alpine
    container_name: directus_db
    restart: always
    environment:
      POSTGRES_USER: directus
      POSTGRES_PASSWORD: directus_password
      POSTGRES_DB: directus
    volumes:
      - db_data:/var/lib/postgresql/data

  directus:
    image: directus/directus:latest
    container_name: directus
    restart: always
    ports:
      - "8055:8055"
    environment:
      KEY: 'generate-some-random-uuid'
      SECRET: 'generate-some-random-secret'
      ADMIN_EMAIL: 'admin@example.com'
      ADMIN_PASSWORD: 'admin_password'
      DB_CLIENT: 'pg'
      DB_HOST: 'directus_db'
      DB_PORT: '5432'
      DB_DATABASE: 'directus'
      DB_USER: 'directus'
      DB_PASSWORD: 'directus_password'
    depends_on:
      - directus_db

volumes:
  n8n_data:
  db_data:

コンテナの起動

Dockerってば、次のコマンドを実行することで起動できます。

docker compose up -d

Pasted Image 1788826569.750931.png

OrbStackを起動した時に次の表示が出た場合は、常に許可して、Mac起動時に入力するパスワードを入力する。

docker-credential-osxleychainがキーチェーンに含まれるキー"Docker Credentials"へアクセスしようとしています。

OrbStack起動後はこんな感じ

Pasted Image 1788829398.2543468.png


4. 各コンテナの初期設定と動作確認

コンテナ起動後、ブラウザで各サービスにアクセスして初期設定を行います。

サービス名 アクセスURL 初期設定・確認事項
n8n http://localhost:5678 初回アクセス時に管理者アカウント(メール・パスワード)を作成
Directus http://localhost:8055 admin@example.com / admin_password でログイン
SearXNG http://localhost:8080 検索画面が表示されるか確認
Crawl4AI http://localhost:11235/health APIヘルスチェック({"status": "ok"} 等の応答)を確認

だいたいこんな感じで起動する

Pasted Image 1788826740.2479482.png


5. SearXNG の API 有効化設定

デフォルトでは SearXNG の JSON API 応答が無効化されているため設定を変更します。

  1. ./searxng/settings.yml を編集します(存在しない場合は生成された設定ファイルを確認)。
  2. search セクションに formats を追加します。
search:
  formats:
    - html
    - json # JSONフォーマットを許可

  1. コンテナを再起動します。
docker compose restart searxng


6. Directusでのデータモデル構築

n8nからスクレイピング結果を保存するためのコレクション(テーブル)を作成します。

Directus ログイン情報(利用後変更してください)

メールアドレス (ADMIN_EMAIL): admin@example.com

パスワード (ADMIN_PASSWORD): admin_password

初回ログイン時個人利用を選択できます

Pasted Image 1788829792.252274.png

  1. Directus管理画面(http://localhost:8055)にログインします。
  2. Settings > Data Model から新しいコレクション(例: articles)を作成します。
  3. 以下のフィールドを追加します:
  • title (Type: Text)
  • url (Type: Text)
  • content (Type: Markdown)
  • crawled_at (Type: Timestamp)

DirectusでToken発行場所

わかりづらいけど、

  1. 👥
  2. ☑️
  3. トークン(英語表記はToken)の右側に🔽が出る位置にマウスを置いてクリック
  4. 編集を選択して、自分で決めたトークンを入力してSAVE

Pasted Image 1788832940.755661.png

DirectusでRole設定

  1. User Rolesを選択
  2. Pasted Image 1788843814.264189.png
  3. publicを選択
  4. Pasted Image 1788843893.764427.png
  5. 先ほど作ったデータを選択して、createとかいったん全てのアクセスをALL許可をぽちぽちする。
  6. Pasted Image 1788843698.26841.png

7. n8nでのオーケストレーション(ワークフロー作成)

n8n上で SearXNG で検索を行い、その結果URLを Crawl4AI でスクレイピングして Directus に保存するフローを作成します。

左上の+をクリックして、 Add Credential を選択してください。

Pasted Image 1788837268.260848.png

  1. Header Authを選択
  2. Name にAuthorizationを入力
  3. Value にあなたのAPIトークンを入力

再度左上+をクリックして今度はAdd Workflowを選択してください。

  1. 画面中央の+をクリックしてAuthentication 項目で Predefined Credential Type を選択します。
  2. Credential Type 欄で Header Auth を選択します。
  3. Credential for Header Auth の選択欄をクリックし、作成しておいた Directus Token を選択します。
  4. 続いて、データの送信先(DirectusのAPIエンドポイント)を設定します。
  5. Method: ドロップダウンから POST を選択します。
  6. URL: Directus の書き込み先アドレスを入力します。URL例: http://localhost:8055/items/articles
  7. Directus の articles テーブルへ保存するデータを設定します。
  8. パラメータ一覧の Send Body を ON(有効) に切り替えます。
  9. Body Content Type で JSON を選択します。
  10. Specify Body で Using JSON を選択します。
  11. 下部に現れる Json テキストエリアに、以下のようなテスト用 JSON を貼り付けたら、右上の Execute Step をクリックしてください。
{
  "related_affiliation": "東京大学",
  "title": "n8nからの接続テスト記事",
  "url": "https://example.com/test-001",
  "media_type": ["news/web"],
  "media_name": "テストメディア",
  "published_at": "2026-09-08",
  "achievement_summary": "n8nのHTTP Requestノードからのデータ送信テストです。",
  "content_markdown": "# テスト本文\n正常に保存されました。"
}

Pasted Image 1788838001.259263.png

[Schedule / Manual Trigger]
       │
       ▼
[HTTP Request: SearXNG] ──(検索クエリ送信・JSON取得)
       │
       ▼
[HTTP Request: Crawl4AI] ──(取得URLのマークダウン抽出)
       │
       ▼
[Directus Node] ──(articlesコレクションに保存)

ノードの設定例

注意点

テスト用としてとりあえずHTTP RequestのSettingではエラーになった時の処理を Continue もしくはContinueでエラーも出力という選択肢にするととりあえず動作する

Pasted Image 1788845973.2670069.png

  1. SearXNG ノード (HTTP Request):
  • Method: GET
  • URL: http://searxng:8080/search
  • Query Parameters:
  • q: 検索キーワード
  • format: json
  1. Crawl4AI ノード (HTTP Request):
  • Method: POST
  • URL: http://crawl4ai:11235/crawl
  • Body Parameters (JSON):
{
  "urls": "={{ $json.results[0].url }}"
}

  1. Directus ノード:
  • Credential: Directusのアクセストークンを設定
  • Resource: Items
  • Operation: Create
  • Collection: articles
  • Fields: title, url, content を前段のノードからマッピング

いったんこんな感じのn8nになります

Pasted Image 1788847415.266199.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?