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 でも問題なく動作します。
- Docker Desktop または OrbStack をインストールします。
- ターミナルを開き、Dockerが正しく動いているか確認します。
docker --version
docker compose version
やっぱりOrbStackを試したい
- 今回は途中でなんとなくOrbStackを利用しようと思って、Dockerをアンインストールしました。
- Dockerのアンインストールは、Dockerを起動して、左下の三をクリック→Troubleshoot⇨Uninstallでアンインストールできます。
- OrbStackは次のコマンドでインストール完了します。
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
OrbStackを起動した時に次の表示が出た場合は、常に許可して、Mac起動時に入力するパスワードを入力する。
docker-credential-osxleychainがキーチェーンに含まれるキー"Docker Credentials"へアクセスしようとしています。
OrbStack起動後はこんな感じ
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"} 等の応答)を確認 |
だいたいこんな感じで起動する
5. SearXNG の API 有効化設定
デフォルトでは SearXNG の JSON API 応答が無効化されているため設定を変更します。
-
./searxng/settings.ymlを編集します(存在しない場合は生成された設定ファイルを確認)。 -
searchセクションにformatsを追加します。
search:
formats:
- html
- json # JSONフォーマットを許可
- コンテナを再起動します。
docker compose restart searxng
6. Directusでのデータモデル構築
n8nからスクレイピング結果を保存するためのコレクション(テーブル)を作成します。
Directus ログイン情報(利用後変更してください)
メールアドレス (ADMIN_EMAIL): admin@example.com
パスワード (ADMIN_PASSWORD): admin_password
初回ログイン時個人利用を選択できます
- Directus管理画面(
http://localhost:8055)にログインします。 -
Settings > Data Model から新しいコレクション(例:
articles)を作成します。 - 以下のフィールドを追加します:
-
title(Type: Text) -
url(Type: Text) -
content(Type: Markdown) -
crawled_at(Type: Timestamp)
DirectusでToken発行場所
わかりづらいけど、
- 👥
- ☑️
- トークン(英語表記はToken)の右側に🔽が出る位置にマウスを置いてクリック
- 編集を選択して、自分で決めたトークンを入力してSAVE
DirectusでRole設定
7. n8nでのオーケストレーション(ワークフロー作成)
n8n上で SearXNG で検索を行い、その結果URLを Crawl4AI でスクレイピングして Directus に保存するフローを作成します。
左上の+をクリックして、 Add Credential を選択してください。
- Header Authを選択
- Name にAuthorizationを入力
- Value にあなたのAPIトークンを入力
再度左上+をクリックして今度はAdd Workflowを選択してください。
- 画面中央の+をクリックしてAuthentication 項目で Predefined Credential Type を選択します。
- Credential Type 欄で Header Auth を選択します。
- Credential for Header Auth の選択欄をクリックし、作成しておいた Directus Token を選択します。
- 続いて、データの送信先(DirectusのAPIエンドポイント)を設定します。
- Method: ドロップダウンから POST を選択します。
- URL: Directus の書き込み先アドレスを入力します。URL例: http://localhost:8055/items/articles
- Directus の articles テーブルへ保存するデータを設定します。
- パラメータ一覧の Send Body を ON(有効) に切り替えます。
- Body Content Type で JSON を選択します。
- Specify Body で Using JSON を選択します。
- 下部に現れる 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正常に保存されました。"
}
[Schedule / Manual Trigger]
│
▼
[HTTP Request: SearXNG] ──(検索クエリ送信・JSON取得)
│
▼
[HTTP Request: Crawl4AI] ──(取得URLのマークダウン抽出)
│
▼
[Directus Node] ──(articlesコレクションに保存)
ノードの設定例
注意点
テスト用としてとりあえずHTTP RequestのSettingではエラーになった時の処理を Continue もしくはContinueでエラーも出力という選択肢にするととりあえず動作する
- SearXNG ノード (HTTP Request):
-
Method:
GET -
URL:
http://searxng:8080/search - Query Parameters:
-
q:検索キーワード -
format:json
- Crawl4AI ノード (HTTP Request):
-
Method:
POST -
URL:
http://crawl4ai:11235/crawl - Body Parameters (JSON):
{
"urls": "={{ $json.results[0].url }}"
}
- Directus ノード:
- Credential: Directusのアクセストークンを設定
- Resource: Items
- Operation: Create
-
Collection:
articles -
Fields:
title,url,contentを前段のノードからマッピング











