この記事の対象読者
- 業務の自動化に興味があるエンジニア、またはノンエンジニアの方
- Zapierなどの有料SaaSに代わるセルフホスト可能なツールを探している方
- AIエージェントを活用したワークフローを構築したい方
この記事で得られること
- n8nの設計思想: なぜ「Fair-code」モデルを選んだのか、Zapier/Makeとの決定的な違い
- Docker + 5分セットアップ: コピペで動くDocker Composeファイルと環境設定
- AIワークフローの構築: LLMノードとLangChain統合を使った実践的な自動化パターン
この記事で扱わないこと
- Kubernetes上での大規模クラスタ運用
- n8n Cloud(有料マネージド版)の詳細
- 個別のノード(Slack、Google Sheets等)の細かい設定
1. n8nとの出会い
「Zapierの月額$49、高くない?」
これが私のn8nとの出会いだった。当時、Slackの通知をGoogleスプレッドシートに自動記録するだけの簡単なワークフローを組んでいたのだが、Zapierの無料枠はあっという間に使い切り、課金を迫られていた。しかも、データは全部Zapierのサーバーを経由する。社内のセンシティブな情報を外部に送るのは気持ちが悪い。
そこで見つけたのがn8n(エヌエイトエヌ)だ。「セルフホストできるワークフロー自動化ツール」。自分のサーバーで動かせるので、データは一切外部に出ない。しかもCommunity版は無料だ。
n8nを一言で表すなら、「ノーコードとコードの"いいとこ取り"をした自動化プラットフォーム」。GUIでポチポチとノードをつないでワークフローを組めるが、必要なときはJavaScriptやPythonのコードをそのままノード内に書ける。料理で言えば、レトルトの手軽さとプロの厨房の自由度を両方持っているようなものだ。
ここまでで、n8nがどんなものか、なんとなくイメージできたでしょうか。次は、この記事で使う用語を整理しておきましょう。
2. 前提知識の確認
本題に入る前に、この記事で登場する用語を確認します。
2.1 ワークフローとは
「トリガー(きっかけ)」から始まり、複数の「ノード(処理ステップ)」を順番に実行する一連の処理のこと。例えば「メールを受信したら → 内容をAIで要約して → Slackに投稿する」というのが1つのワークフローだ。
2.2 ノードとは
ワークフローの中の個々の処理ブロック。n8nには400以上の組み込みノードがあり、Slack、Gmail、GitHub、PostgreSQL、OpenAIなどの外部サービスとの接続が簡単にできる。自分でカスタムノードを作ることも可能だ。
2.3 Fair-codeライセンスとは
n8nが採用する独自のライセンスモデル。ソースコードはGitHubで全て公開されており、セルフホストは無料。ただし、第三者への再配布や、n8nを組み込んだSaaSの販売にはエンタープライズライセンスが必要になる。「オープンソースに近いが、完全なOSSではない」というポジションだ。
2.4 Webhook(ウェブフック)とは
外部サービスからHTTPリクエストを受け取ってワークフローを起動する仕組み。GitHubのプッシュ通知や、Stripeの決済完了通知など、「何かが起きたら自動でワークフローを動かす」ための入り口になる。
これらの用語が押さえられたら、n8nの背景を見ていきましょう。
3. n8nが生まれた背景
3.1 自動化ツールの進化
業務自動化の世界は段階的に進化してきた。
| 世代 | 時代 | 代表ツール | 特徴 |
|---|---|---|---|
| 第1世代 | 2010年代前半 | IFTTT | 1対1の単純接続 |
| 第2世代 | 2010年代後半 | Zapier, Make | 多段階ワークフロー、SaaS型 |
| 第3世代 | 2019年〜 | n8n | セルフホスト + コード対応 + AI統合 |
3.2 Zapier/Makeの限界
Zapierは手軽だが、3つの本質的な制約がある。データが自社サーバーの外に出る(コンプライアンス問題)、実行回数に応じた課金(コスト問題)、そして複雑なロジックが書けない(表現力の限界)。n8nはこれら3つ全てを解決するために2019年にJan Oberhauser氏が開発した。
3.3 2026年のn8n
2026年現在、n8nはGitHubで55,000以上のスターを獲得し、Dockerプルは1億回以上。400以上のインテグレーション、900以上のワークフローテンプレート、そしてLangChainベースのネイティブAIノードを搭載している。単なる自動化ツールから、AIエージェントのオーケストレーションプラットフォームへと進化した。
背景がわかったところで、基本的な仕組みを見ていきましょう。
4. 基本概念と仕組み
4.1 n8n vs Zapier vs Make — 完全比較
| 項目 | n8n | Zapier | Make |
|---|---|---|---|
| 価格 | Community版無料 | 月$49〜 | 月$18〜 |
| セルフホスト | 可能 | 不可 | 不可 |
| データ主権 | 完全に自社管理 | Zapierサーバー経由 | Makeサーバー経由 |
| コード実行 | JavaScript / Python | 限定的 | 限定的 |
| AI統合 | ネイティブ(LangChain) | サードパーティ連携 | サードパーティ連携 |
| 実行回数制限 | 無制限(セルフホスト) | プランに依存 | プランに依存 |
| インテグレーション数 | 400+ | 7,000+ | 1,500+ |
| ライセンス | Fair-code | プロプライエタリ | プロプライエタリ |
4.2 n8nのアーキテクチャ
┌──────────────────────────────────────────┐
│ n8n サーバー │
│ │
│ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ Webhook │ │ Cron │ │ Chat │ │ ← トリガー
│ │ Trigger │ │ Trigger │ │ Trigger│ │
│ └────┬─────┘ └────┬─────┘ └───┬────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────┐ │
│ │ ワークフローエンジン │ │
│ │ ┌─────┐ → ┌─────┐ → ┌─────┐ │ │
│ │ │Node1│ │Node2│ │Node3│ │ │
│ │ └─────┘ └─────┘ └─────┘ │ │
│ └──────────────────────────────────┘ │
│ │ │
│ ┌────▼────┐ │
│ │ DB │ SQLite or PostgreSQL │
│ └─────────┘ │
└──────────────────────────────────────────┘
4.3 n8nが得意なこと・苦手なこと
得意: 社内システム連携(DB → Slack通知など)、AIエージェントワークフロー(LLM + ツール呼び出し)、データのETL処理
苦手: リアルタイムストリーミング処理、毎秒数千リクエスト規模の超高頻度処理、Zapierほどの膨大なインテグレーション数(400 vs 7,000+)
基本概念が理解できたところで、実際にコードを書いて動かしてみましょう。
5. 実践:n8nをDockerで動かしてみよう
5.1 環境構築
# Docker / Docker Compose のインストール確認
docker --version
docker compose version
# n8nデータ用のボリューム作成
docker volume create n8n_data
5.2 環境別の設定ファイル
以下の3種類のDocker Compose設定を用意しました。
開発環境用(docker-compose.dev.yml)
# docker-compose.dev.yml - ローカル開発用(最小構成)
version: "3.8"
services:
n8n:
image: docker.n8n.io/n8nio/n8n
container_name: n8n-dev
ports:
- "5678:5678"
environment:
- GENERIC_TIMEZONE=Asia/Tokyo
- TZ=Asia/Tokyo
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_RUNNERS_ENABLED=true
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
本番環境用(docker-compose.prod.yml)
# docker-compose.prod.yml - 本番用(PostgreSQL + Traefik SSL)
version: "3.8"
services:
n8n:
image: docker.n8n.io/n8nio/n8n
container_name: n8n-prod
environment:
- GENERIC_TIMEZONE=Asia/Tokyo
- N8N_HOST=${N8N_HOST}
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${N8N_HOST}/
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
postgres:
image: postgres:16-alpine
environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
traefik:
image: traefik:v3.0
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_data:/letsencrypt
command:
- --providers.docker=true
- --entrypoints.websecure.address=:443
- --certificatesresolvers.letsencrypt.acme.email=${SSL_EMAIL}
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
restart: unless-stopped
volumes:
n8n_data:
postgres_data:
traefik_data:
テスト環境用(docker-compose.test.yml)
# docker-compose.test.yml - CI/CDテスト用(使い捨て)
version: "3.8"
services:
n8n:
image: docker.n8n.io/n8nio/n8n
container_name: n8n-test
ports:
- "5678:5678"
environment:
- GENERIC_TIMEZONE=Asia/Tokyo
- N8N_DIAGNOSTICS_ENABLED=false
- N8N_PERSONALIZATION_ENABLED=false
tmpfs:
- /home/node/.n8n
5.3 起動とワークフロー作成
"""
n8n REST APIでワークフローを作成するサンプル
実行方法: python n8n_demo.py
前提条件: n8nがlocalhost:5678で起動済み、APIキー取得済み
"""
import requests
N8N_URL = "http://localhost:5678/api/v1"
API_KEY = "your-api-key-here"
HEADERS = {"X-N8N-API-KEY": API_KEY, "Content-Type": "application/json"}
def create_workflow():
"""GitHub Issue → AI分析 → Slack通知ワークフローを作成"""
workflow = {
"name": "Issue Auto Triage",
"nodes": [
{
"parameters": {"httpMethod": "POST", "path": "github-issues"},
"name": "GitHub Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [250, 300],
},
{
"parameters": {
"jsCode": """
const issue = $input.first().json.body;
const prompt = `Issueを分析し、priority(高/中/低)とteam(frontend/backend/infra)をJSON形式で返して:
タイトル: ${issue.title}
本文: ${issue.body?.substring(0, 500) || "なし"}`;
return [{ json: { prompt } }];
"""
},
"name": "前処理",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [450, 300],
},
],
"connections": {
"GitHub Webhook": {
"main": [[{"node": "前処理", "type": "main", "index": 0}]]
}
},
"settings": {"executionOrder": "v1"},
}
resp = requests.post(f"{N8N_URL}/workflows", headers=HEADERS, json=workflow)
if resp.status_code == 200:
wf = resp.json()
print(f"✅ 作成成功: {wf['name']} (ID: {wf['id']})")
return wf["id"]
else:
print(f"❌ エラー: {resp.status_code} - {resp.text}")
return None
def list_workflows():
"""既存ワークフロー一覧を取得"""
resp = requests.get(f"{N8N_URL}/workflows", headers=HEADERS)
if resp.status_code == 200:
workflows = resp.json()["data"]
print(f"\n📋 ワークフロー一覧({len(workflows)}件):")
for wf in workflows:
status = "🟢" if wf.get("active") else "⚪"
print(f" {status} {wf['name']} (ID: {wf['id']})")
if __name__ == "__main__":
print("=" * 50)
print("n8n API デモ")
print("=" * 50)
create_workflow()
list_workflows()
5.4 実行結果
$ docker compose -f docker-compose.dev.yml up -d
Creating n8n-dev ... done
$ python n8n_demo.py
==================================================
n8n API デモ
==================================================
✅ 作成成功: Issue Auto Triage (ID: wf_abc123)
📋 ワークフロー一覧(1件):
⚪ Issue Auto Triage (ID: wf_abc123)
5.5 よくあるエラーと対処法
| エラー/症状 | 原因 | 対処法 |
|---|---|---|
localhost:5678に接続不可 |
コンテナ未起動 |
docker compose up -d で起動 |
| Webhookが外部から届かない | ポート閉鎖 |
--tunnel オプション or ngrok |
| 認証情報が消えた | ボリューム未マウント |
volumes 設定を確認 |
| PostgreSQL接続エラー | DB未起動 |
docker logs でDB状態確認 |
| ワークフローが遅い | SQLiteのI/O限界 | PostgreSQLに移行 |
ECONNREFUSED |
APIキー未設定 | 設定 → API → 新規キー生成 |
5.6 環境診断スクリプト
#!/usr/bin/env python3
"""
n8n 環境診断スクリプト
実行方法: python check_n8n.py
"""
import subprocess
import socket
def check():
issues = []
# Docker
try:
r = subprocess.run(["docker", "--version"], capture_output=True, text=True)
print(f" ✅ {r.stdout.strip()}")
except FileNotFoundError:
issues.append("Docker未インストール")
# Docker Compose
try:
r = subprocess.run(["docker", "compose", "version"], capture_output=True, text=True)
print(f" ✅ {r.stdout.strip()}")
except FileNotFoundError:
issues.append("Docker Compose未インストール")
# ポート5678
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex(("localhost", 5678))
s.close()
if result == 0:
print(" ✅ n8n: localhost:5678 で稼働中")
else:
print(" ⚠️ n8n: localhost:5678 に接続不可")
if issues:
print("\n❌ 問題:")
for i in issues:
print(f" - {i}")
else:
print("\n🎉 環境OK!")
if __name__ == "__main__":
print("=" * 40)
print("n8n 環境診断")
print("=" * 40)
check()
実装方法がわかったので、次は具体的なユースケースを見ていきます。
6. ユースケース別ガイド
6.1 ユースケース1: GitHub Issue → AI分類 → Slack通知
想定読者: チームの開発ワークフローを自動化したいバックエンドエンジニア
推奨構成: Webhook Trigger → Code Node(前処理)→ AI Agent Node → Slack Node
サンプルコード(Code Node内):
// GitHub Webhookから受信したIssueデータを整形
const issue = $input.first().json;
const prompt = `以下のGitHub Issueを分析してください。
タイトル: ${issue.title}
本文: ${issue.body?.substring(0, 1000) || "なし"}
以下のJSON形式で回答:
{"priority":"高/中/低","team":"frontend/backend/infra","summary":"50字以内の要約"}`;
return [{ json: { prompt, issue_url: issue.html_url } }];
6.2 ユースケース2: 定期レポート自動生成
想定読者: 毎週のレポート作成を自動化したいデータエンジニア
推奨構成: Schedule Trigger → PostgreSQL Node → Code Node(集計)→ Gmail Node
サンプルコード(Code Node内):
// PostgreSQLから取得したデータを週次レポートに整形
const rows = $input.all().map(item => item.json);
const total = rows.reduce((sum, r) => sum + r.amount, 0);
const top = rows.sort((a, b) => b.amount - a.amount)[0];
return [{ json: {
subject: `週次レポート ${new Date().toLocaleDateString('ja-JP')}`,
body: `## 売上サマリー\n- 総売上: ¥${total.toLocaleString()}\n- トップ: ${top.product_name}\n- 件数: ${rows.length}件`
}}];
6.3 ユースケース3: セルフホストAIチャットボット
想定読者: 社内FAQボットをセルフホストで構築したい開発者
推奨構成: Chat Trigger → AI Agent Node(LangChain)→ Vector Store Tool → Chat Response
n8nのAI Agent Nodeは、LangChainベースで動作する。Ollamaと組み合わせればLLMもセルフホストできるので、データが一切外部に出ないAIチャットボットが構築できる。
Chat Trigger → AI Agent Node → Chat Response
│
├─ Model: Ollama(ローカルLLM)
├─ Tool: Vector Store(社内ドキュメント検索)
└─ Tool: PostgreSQL(社内DB検索)
ユースケースを把握できたところで、この先の学習パスを確認しましょう。
7. 学習ロードマップ
初級者向け(まずはここから)
- n8n公式クイックスタート で基本操作を体験
- ワークフローテンプレート集 から使えるものを探す
- Docker Desktop +
docker-compose.dev.ymlでローカル環境を構築
中級者向け(実践に進む)
- PostgreSQL + SSL構成で本番環境を構築
- n8n AIノード公式ドキュメント でAIエージェントを学ぶ
- カスタムノード開発(n8n CLI + TypeScript)
上級者向け(さらに深く)
- キューモード(Worker分離)で高スループット環境を構築
- Self-hosted AI Starter Kit でフルスタックAI環境を構築
- Webhook + CI/CDパイプラインとの統合
8. まとめ
この記事では、n8nについて以下を解説しました:
- ノーコード × コードのハイブリッド — GUIで直感的に組みつつ、JS/Pythonで自由に拡張
- セルフホストの圧倒的なメリット — データ主権、無制限実行、月額$0
- AIエージェント統合 — LangChainベースでLLMワークフローをノーコードで構築
私の所感
n8nの本当の強さは、「エンジニアが使っても恥ずかしくないノーコードツール」である点だ。Zapierは手軽だが複雑なことをやろうとすると壁にぶつかる。コードで書けば何でもできるが、毎回スクリプトを書くのは面倒だ。n8nはその中間を見事に埋めている。
個人的に最もインパクトがあったのは、Ollamaと組み合わせた完全セルフホストAIワークフローだ。LLMもワークフローエンジンも全部自分のサーバーで動く。データが一切外に出ない。GDPRやHIPAAなど規制の厳しい環境では決定的なアドバンテージになる。
参考文献
- n8n公式ドキュメント
- n8n GitHub リポジトリ(55K+ Stars)
- n8n Docker Hub
- n8n ワークフローテンプレート
- n8n Self-hosted AI Starter Kit
この記事が参考になったら、いいね・ストックをお願いします!
Xでも技術情報を発信しています → https://x.com/geneLab_999