n8n を知ったのは「Zapier が高すぎる」という不満からでした
個人開発者として複数のサービスをまたいだ自動化を構築しようとしたとき、最初に当たった壁が費用でした。Zapier の有料プランは月額$29〜、Make は月額$16〜。小さなプロジェクトには見合いません。
そこで出会ったのが n8n(en-eight-en と読みます)です。オープンソースで、セルフホストすれば費用はサーバー代だけ。そして最近の AI エージェント連携機能が充実したことで、私の開発環境の中核ツールになりました。ここで扱うのはその実践的な構築方法をお伝えします。
n8n の概念を整理しつつ、Zapier / Make との違い
n8n は「フェアコード」ライセンスで公開されているワークフロー自動化ツールです。GUIで視覚的にフローを構築でき、400以上のサービスと連携できます。
Zapier や Make との最大の違いはデータの自由度です。n8n はワークフロー内で任意の JavaScript / Python を実行でき、データの加工・変換に制約がありません。また、セルフホストすることでデータが自分のサーバーに留まるため、機密情報を扱うフローでも安心して使えます。
一方でデメリットも正直に言うと、Zapier に比べてUIが複雑で学習曲線があります。簡単な2ステップ自動化なら Zapier のほうが早い場面もあります。n8n が本領を発揮するのは、複雑な条件分岐・データ変換・AI との連携が絡むフローです。
セルフホスト環境の構築
Docker Compose を使った最速構築
# docker-compose.yml
version: '3.8'
services:
n8n:
image: docker.n8nio/n8n:latest
restart: always
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=your_secure_password
- N8N_HOST=your-domain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://your-domain.com/
- GENERIC_TIMEZONE=Asia/Tokyo
volumes:
- n8n_data:/home/node/.n8n
- /local-files:/files
volumes:
n8n_data:
# 起動
docker compose up -d
# ログ確認
docker compose logs -f n8n
これだけで http://localhost:5678 にアクセスできます。本番環境では Nginx でリバースプロキシを設定し、Let's Encrypt で HTTPS を有効にします。
VPS(月額$6程度)への本番デプロイ
私が実際に使っている構成は、DigitalOcean の $6/月 Droplet(1vCPU / 1GB RAM)+ Nginx + Let's Encrypt です。n8n 単体なら 512MB RAM で動きますが、AI ノードで大量データを処理する場合は 1GB 以上を推奨します。
# Nginx 設定(/etc/nginx/sites-available/n8n)
server {
server_name your-domain.com;
location / {
proxy_pass http://localhost:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# Webhook タイムアウトは長めに
proxy_read_timeout 300s;
}
}
AI エージェント連携の実装
n8n の AI ノードは 2024 年後半から急速に充実しました。現在は Claude・Gemini・OpenAI をノードとして組み込め、AI エージェントのオーケストレーションまで n8n 内で完結します。
Claude との連携設定
n8n の「Credentials」で Anthropic の API キーを登録し、ワークフローに「Anthropic Chat Model」ノードを追加するだけです。パラメータとして渡せる主な設定:
// n8n のコードノードで動的プロンプトを生成する例
const emailBody = $json.email_body;
const sender = $json.sender_name;
return {
prompt: `以下のメールを分類してください。
送信者: ${sender}
本文: ${emailBody}
カテゴリ(サポート/営業/その他)と優先度(高/中/低)をJSONで返してください。
形式: {"category": "...", "priority": "...", "summary": "..."}`
};
実用的なフロー1:メール自動分類システム
これは私が実際に運用している構成です。
Gmail トリガー(新着メール)
│
├─ フィルター: 迷惑メール・広告を除外
│
├─ Claude ノード: メール内容を分析・分類
│ プロンプト: カテゴリ・優先度・要約を JSON で返す
│
├─ Switch ノード: カテゴリで分岐
│ ├─ サポート → Notion データベースにチケット作成
│ ├─ 営業 → Slack の #sales チャンネルに通知
│ └─ その他 → Gmail ラベル付けのみ
│
└─ 完了通知
このフロー実装のポイントは、Claude に返す形式を厳密に JSON で指定することです。曖昧な形式指定だと後続のノードでのパースに失敗します。
実用的なフロー2:週次レポート自動生成
スケジューラー(毎週月曜 9:00)
│
├─ Google Analytics ノード: 先週のトラフィックデータ取得
├─ Google Search Console: 検索パフォーマンスデータ取得
├─ Notion ノード: 先週のタスク完了数取得
│
├─ コードノード: データを整形してプロンプトに組み込む
│
├─ Gemini ノード: レポート本文を生成
│ (Gemini 2.5 Pro は長文生成が安定していて好み)
│
└─ Gmail ノード: 自分宛にレポートを送信
実用的なフロー3:SNS 投稿の自動スケジューリング
Notion トリガー(新規コンテンツ追加)
│
├─ Claude ノード: 各プラットフォーム向けに本文を最適化
│ ├─ X(Twitter): 280文字以内
│ ├─ LinkedIn: プロフェッショナルトーン
│ └─ Instagram: ハッシュタグ最適化
│
├─ 承認ステップ(Slack で内容確認 → ボタン承認)
│
└─ Buffer / Hootsuite ノード: 各プラットフォームに予約投稿
n8n AI エージェントモードの活用
最近の n8n では「AI エージェント」ノードが追加され、単純な LLM 呼び出しを超えた自律型エージェントを構築できます。
AI エージェントノード
├─ System Prompt: 「あなたはデータ分析エージェントです。ツールを使って...」
├─ ツール: Calculator, HTTP Request, Code Executor
└─ モデル: Claude 3.5 Sonnet
エージェントが自ら「計算が必要だから Calculator を使おう」「データが足りないから HTTP でフェッチしよう」と判断して動きます。私はこれをコンテンツのリサーチ収集フローに使っています。
セキュリティで注意すべき3点
n8n をセルフホストする際に実際に痛い目を見た教訓です。
1. Webhook URL は推測されにくいパスにする
デフォルトの /webhook/ パスをそのまま使うと、スキャナーに叩かれます。/webhook/a7f3k9m2b6/ のようにランダム文字列を含めましょう。
2. API キーは環境変数で管理する
ワークフロー内に直接 API キーを書かないこと。n8n の Credentials 機能または .env ファイルで管理します。
3. 定期バックアップを設定する
n8n_data ボリュームには全ワークフロー・認証情報が含まれます。毎日 S3 や Backblaze B2 にバックアップするスクリプトを別ワークフローで動かしておくことをおすすめします。
個人開発者の視点から(実体験メモ)
次のステップ
n8n の基本が整ったら、カスタムノードの作成に挑戦してみてください。既存のインテグレーションでカバーされていないサービスも、Node.js で簡単にノード化できます。また、n8n Cloud(有料ですが管理不要)と比較した上で、運用コストと手間のバランスを判断するのも一つの選択です。
自動化は「作って終わり」ではなく「育てるもの」です。小さく始めて、少しずつ複雑さを増やしていくのが長続きのコツです。
本記事の設定例は n8n v1.x 系で動作確認しています。バージョンによってUI・ノード名が異なる場合があります。