tva
← コラム

n8n「実行データが大きすぎます」エラーの解決:セルフホスト環境の修正ガイド

n8nをセルフホストすると、ワークフローを回数制限なく実行でき、環境を完全に管理できます。ただし、大規模なデータセットを扱う複雑なワークフローでは、自分でサーバー設定を修正しなければならない厄介なエラーが発生することがあります。個別のノードをテストする際に「Please execute the whole workflow, rather than just the node. (Existing execution data is too large.)」と表示されたら、ペイロードサイズの上限に達しています。この記事では、原因を特定し、設定を修正・最適化して、本番運用に対応するn8n環境を整える方法を紹介します。

問題:ワークフローをテストできなくなる

n8nインスタンスを構築し、安定したWebhook機能を設定した後、ファイル、大きなAPIレスポンス、データセットを処理する高度なワークフローを作り始めると、この問題に遭遇することがあります。ワークフロー全体を実行すると正常に動くのに、1つのノードだけをテストしたり、部分実行を試みたりすると、n8nがエラーを表示します。

これは、n8nが部分的な実行データに対して16MBのデフォルト制限を持っているために発生します。この制限はシンプルなワークフローには十分ですが、実際のデータ量を処理し始めるとすぐにボトルネックになります。

このガイドで解決すること

このガイドに沿って設定すると、次の状態を実現できます。

  • ✅ ペイロードサイズの上限を16MBから256MBまたは任意の値に引き上げ
  • ✅ 大規模なデータセットを扱う複雑なワークフローの部分実行
  • ✅ サーバーのRAM容量を考慮した適切なリソース割り当て
  • ✅ メモリ使用量を継続的に追跡する監視環境
  • ✅ ファイル処理ワークフローに対応した本番環境の設定
  • ✅ 設定変更時のバックアップとロールバック手順

前提条件

  • 正常に動作するn8n環境(できれば当社のHetzner構築ガイドに沿って構築したもの)
  • Dockerコンテナで実行中のn8n
  • サーバーへのSSHアクセス
  • Docker Composeの環境変数に関する基本的な知識
  • 最低3GBの利用可能RAM(256MBペイロード制限に推奨)

根本原因の理解

セルフホスト型n8nにペイロード制限がある理由

部分実行(個別ノードのテスト)を行う際、n8nはワークフローの状態とデータをシリアライズしてバックエンドに送信する必要があります。これには以下が含まれます:

  • 前のノードからのすべての入力データ
  • ワークフローロジックとノード設定
  • 実行コンテキストと変数
  • バイナリデータとファイルの内容

初期設定のN8N_PAYLOAD_SIZE_MAX=16(16MiB、値の単位はMiB)は、一般的なAPIレスポンスや単純なデータ処理を想定しています。しかし、現在のワークフローでは、次のような処理を行うことも多くあります。

❌ 16MBを超えやすい処理:

  • ファイルのアップロードと処理(PDF、画像、スプレッドシート)
  • データソースからの大規模なAPIレスポンス
  • 一括データ変換
  • 処理を進めるうちにデータが蓄積する複数ステップのワークフロー

✅ 修正後に可能になること:

  • 大規模なデータセットを使った部分実行
  • ファイル処理ワークフローのテスト
  • 複雑なデータ変換のノード単位でのデバッグ

不足している設定

解決の鍵は、リクエストのペイロードサイズの上限をMiB単位で設定する環境変数N8N_PAYLOAD_SIZE_MAXです。部分実行のためにエディターが送信するデータも対象です。リクエストが上限を超えると、n8nはHTTP 413を返し、エディターにこのエラーが表示されます。n8n Cloudではn8nがこの設定を管理します。セルフホスト環境では控えめな初期値の16MiBが使われます。

ステップ1:現在のセットアップを診断

サーバーリソースの確認

ペイロードの上限を引き上げる前に、サーバーがより多くのメモリ割り当てに対応できることを確認します。

# Check available memory
free -h

# Check current Docker container memory usage
docker stats --no-stream | grep n8n

# Check total system resources
htop

メモリ要件:

  • 64MBペイロード制限:最低1GBの利用可能RAM
  • 128MBペイロード制限:最低2GBの利用可能RAM
  • 256MBペイロード制限:最低3GBの利用可能RAM

現在の制限の確認

N8N_PAYLOAD_SIZE_MAXが設定されているか確認します:

# Navigate to your n8n directory (adjust path as needed)
cd /opt/n8n

# Check current environment variables
cat docker-compose.yml | grep -A 30 "environment:"

# Look for payload size configuration
grep "N8N_PAYLOAD_SIZE_MAX" docker-compose.yml || echo "Not configured - using 16MB default"

エラーの再現テスト

問題を再現するためのテストワークフローを作成します:

  1. n8nインターフェースを開く
  2. 大規模なデータセットを使うワークフローを作成する(例:16MBを超えるレスポンスを返すAPIへのHTTP Request)
  3. 下流の1つのノードだけを実行してみる
  4. 「Existing execution data is too large」エラーが表示されることを確認する

ステップ2:主な問題を修正し、ペイロードの上限を引き上げる

単一のn8nインスタンスの場合

n8nを1つだけ運用している場合は、次の手順で設定します。

cd /opt/n8n

# Create backup first
cp docker-compose.yml docker-compose.yml.backup_$(date +%Y%m%d_%H%M)

# Edit the configuration
nano docker-compose.yml

既存の設定にN8N_PAYLOAD_SIZE_MAX環境変数を追加します:

version: '3'

services:
  n8n:
    image: n8nio/n8n:latest
    restart: always
    environment:
      - N8N_HOST=n8n.yourdomain.com
      - NODE_ENV=production
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
      - N8N_EMAIL_MODE=smtp
      - N8N_SMTP_HOST=mailserver
      - N8N_SMTP_PORT=25
      - N8N_SMTP_SSL=false
      - N8N_SMTP_USER=
      - N8N_SMTP_PASS=
      - [email protected]
      - N8N_TRUST_PROXY_HEADER=true
      - N8N_RUNNERS_ENABLED=true
      - WEBHOOK_URL=https://n8n.yourdomain.com
      # ADD THIS LINE - Increases payload limit to 256MB (value in MiB)
      - N8N_PAYLOAD_SIZE_MAX=256
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`n8n.yourdomain.com`)"
      - "traefik.http.routers.n8n.entrypoints=https"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

複数のn8nインスタンスの場合

複数のn8nインスタンスを運用している場合は、それぞれの設定を更新します。

# First instance
cd /opt/n8n
cp docker-compose.yml docker-compose.yml.backup_$(date +%Y%m%d_%H%M)
sed -i '/N8N_RUNNERS_ENABLED=true/a\      - N8N_PAYLOAD_SIZE_MAX=256' docker-compose.yml

# Second instance (adjust path as needed)
cd /opt/n8n-team2
cp docker-compose.yml docker-compose.yml.backup_$(date +%Y%m%d_%H%M)
sed -i '/N8N_RUNNERS_ENABLED=true/a\      - N8N_PAYLOAD_SIZE_MAX=256' docker-compose.yml

コンテナの再起動

変更を適用します:

# For single instance
cd /opt/n8n
docker compose down && docker compose up -d

# For multiple instances
cd /opt/n8n
docker compose down && docker compose up -d
cd /opt/n8n-team2
docker compose down && docker compose up -d

# Verify containers are running
docker ps | grep n8n

ステップ3:修正の検証

コンテナログの確認

コンテナが正常に起動したことを確認します:

# Check main instance logs (adjust container name as needed)
docker logs n8n-n8n-1 --tail 20

# Check for any startup errors
docker logs n8n-n8n-1 | grep -i "error\|failed\|warning"

ペイロードの上限変更をテストする

エラーが出ていたテスト用ワークフローに戻ります。

  1. 大規模なデータセットを使うワークフローを開く
  2. 下流の単一ノードを実行してみる
  3. 「Existing execution data is too large」エラーが解消されたことを確認する
  4. 部分実行が正しく動作することを確認

メモリ使用量の監視

変更後はシステムリソースの使用状況を監視します。

# Monitor memory usage over time
watch -n 5 'free -h && echo "--- Docker Stats ---" && docker stats --no-stream | grep n8n'

ステップ4:サーバーに合わせた最適化

サーバーRAM別の推奨ペイロードサイズ

ハードウェアに適したペイロードサイズを選択します:

# For servers with 2GB RAM or less
- N8N_PAYLOAD_SIZE_MAX=64   # 64 MiB

# For servers with 4GB RAM  
- N8N_PAYLOAD_SIZE_MAX=128  # 128 MiB

# For servers with 8GB+ RAM
- N8N_PAYLOAD_SIZE_MAX=256  # 256 MiB

# For high-performance servers with 16GB+ RAM
- N8N_PAYLOAD_SIZE_MAX=512  # 512 MiB

メモリ使用量の計算

メモリ要件を見積もります:

# Calculate safe payload size (should be <20% of available RAM)
echo "Available RAM: $(free -h | awk 'NR==2{print $7}')"
echo "Current payload limit: $(docker exec n8n-n8n-1 env | grep N8N_PAYLOAD_SIZE_MAX || echo '16 (default, MiB)')"

# Monitor actual usage during large workflow executions
docker stats n8n-n8n-1 | grep -E "MEM|n8n"

よくある問題のトラブルシューティング

問題:設定変更後にコンテナが起動しない

症状:

  • 起動直後にコンテナが終了
  • DockerでのOOMKilledステータス
  • サーバーが応答しなくなる

解決策:

# Check container exit reason
docker logs n8n-n8n-1

# Reduce payload size if out of memory
cd /opt/n8n
sed -i 's/N8N_PAYLOAD_SIZE_MAX=256/N8N_PAYLOAD_SIZE_MAX=64/' docker-compose.yml
docker compose up -d

問題:ペイロードサイズのエラーが続く

症状:

  • 設定変更後もエラーが続く
  • 環境変数が有効になっていないように見える

解決策:

# Verify environment variable is set correctly
docker exec n8n-n8n-1 env | grep N8N_PAYLOAD_SIZE_MAX

# If missing, recreate container with force
docker compose down
docker compose up -d --force-recreate

# Check if the value is being read
docker logs n8n-n8n-1 | grep -i payload

問題:サーバーの性能が低下する

症状:

  • 応答時間が長くなる
  • メモリ使用量が多い
  • スワップファイルの使用量の増加

解決策:

# Monitor system performance
vmstat 1 5
iostat -x 1 5

# Check swap usage
swapon --show

# Reduce payload size if needed
# From 256MB to 128MB
sed -i 's/N8N_PAYLOAD_SIZE_MAX=256/N8N_PAYLOAD_SIZE_MAX=128/' docker-compose.yml
docker compose down && docker compose up -d

高度な設定

ペイロードの上限ごとにインスタンスを分ける

上限はワークフローごとではなく、n8nインスタンスごとに適用されます。高度な運用では、上限の異なる複数のインスタンスを使う構成を検討します。

# High-capacity instance for file processing
n8n-files:
  image: n8nio/n8n:latest
  environment:
    - N8N_PAYLOAD_SIZE_MAX=512  # 512 MiB
    - N8N_HOST=files.yourdomain.com

# Standard instance for regular workflows  
n8n-standard:
  image: n8nio/n8n:latest
  environment:
    - N8N_PAYLOAD_SIZE_MAX=64   # 64 MiB
    - N8N_HOST=workflows.yourdomain.com

コンテナリソース制限

システム過負荷を防ぐために明示的なメモリ制限を設定します:

services:
  n8n:
    image: n8nio/n8n:latest
    environment:
      - N8N_PAYLOAD_SIZE_MAX=256
    deploy:
      resources:
        limits:
          memory: 2G      # Maximum memory usage
        reservations:
          memory: 1G      # Soft reservation, not a hard guarantee
    # ... rest of configuration

ペイロード使用量の監視

n8nはペイロードサイズを直接報告しないため、代わりにコンテナのメモリ使用量に対してアラートを設定します。このスクリプトは、docker statsがメモリをMiB単位で報告することを前提としています。

#!/bin/bash
# Create monitoring script: /opt/monitor-payload.sh

CONTAINER_NAME="n8n-n8n-1"
MEMORY_LIMIT_MB=1500  # Alert if memory usage exceeds this

CURRENT_MEMORY=$(docker stats --no-stream --format "{{.MemUsage}}" $CONTAINER_NAME | cut -d'/' -f1 | sed 's/MiB//')

if (( $(echo "$CURRENT_MEMORY > $MEMORY_LIMIT_MB" | bc -l) )); then
    echo "WARNING: n8n memory usage high: ${CURRENT_MEMORY}MB" | logger
    # Add notification logic (email, Slack, etc.)
fi

セキュリティの考慮事項

リソース消費型DoSへの対策

ペイロードの上限を大きくすると、悪用される可能性があります。リバースプロキシでリクエストサイズを制限してください。ただし、その上限(バイト単位)はN8N_PAYLOAD_SIZE_MAXが定めるサイズ以上にします。そうしないと、大きなリクエストがプロキシによってHTTP 413で拒否されます。

# Add to Traefik labels for request size limiting
labels:
  - "traefik.http.middlewares.payload-limit.buffering.maxRequestBodyBytes=268435456"  # 256MB max request, matches N8N_PAYLOAD_SIZE_MAX
  - "traefik.http.routers.n8n.middlewares=payload-limit"

ワークフロー固有の制限

ワークフローベースの制限を検討します:

# Monitor workflows with large payloads
docker exec n8n-n8n-1 n8n execute --help

# Log large executions
(crontab -l 2>/dev/null; echo "*/10 * * * * docker logs n8n-n8n-1 | grep -i 'payload\|memory' >> /var/log/n8n-payload.log") | crontab -

パフォーマンス最適化

バイナリデータの処理

ファイル処理ワークフローでは、バイナリデータの保存方法を最適化します。なお、N8N_BINARY_DATA_TTLはn8n 1.9.0以降は効果がありません。n8nは実行データを整理・削除する際にバイナリデータも削除します。

environment:
  - N8N_PAYLOAD_SIZE_MAX=256
  - N8N_DEFAULT_BINARY_DATA_MODE=filesystem  # Store files on disk, not in memory
  - N8N_BINARY_DATA_TTL=1440                 # Clean up files after 24 hours

データベース最適化

大きなペイロードはデータベースのパフォーマンスに影響を与える可能性があります:

# Monitor database size growth
du -sh /opt/n8n/data/

# Clean up old executions more aggressively
# Add to docker-compose.yml environment:
# - EXECUTIONS_DATA_MAX_AGE=168  # 7 days instead of default 14
# - EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000

バックアップと復旧

設定のバックアップ方針

変更を行う前に必ずバックアップします:

#!/bin/bash
# Create backup script: /opt/backup-n8n-config.sh

BACKUP_DIR="/opt/backups/n8n-configs"
mkdir -p $BACKUP_DIR

# Backup all n8n docker-compose files
for instance in n8n n8n-team2; do
    if [ -d "/opt/$instance" ]; then
        cp "/opt/$instance/docker-compose.yml" "$BACKUP_DIR/${instance}-$(date +%Y%m%d_%H%M).yml"
    fi
done

# Delete backups older than 10 days
find $BACKUP_DIR -name "*.yml" -mtime +10 -delete

迅速なロールバック手順

変更を元に戻す必要がある場合:

# List available backups
ls -la /opt/n8n/docker-compose.yml.backup_*

# Restore specific backup
cd /opt/n8n
cp docker-compose.yml.backup_20241206_1430 docker-compose.yml
docker compose down && docker compose up -d

コストとパフォーマンスへの影響

メモリコスト分析

ペイロード制限の増加はサーバーコストに影響します:

Server RAM Requirements:
- 16MB limit (default): 1GB RAM sufficient
- 64MB limit: 2GB RAM recommended  
- 128MB limit: 4GB RAM recommended
- 256MB limit: 8GB RAM recommended
- 512MB limit: 16GB RAM recommended

Hetzner Cloud Costs (legacy plans, deprecated by Hetzner in June 2024; check current pricing):
- CX11 (2GB RAM): €4.51/month
- CX21 (4GB RAM): €8.46/month  
- CX31 (8GB RAM): €16.07/month

パフォーマンスのメリット

ペイロードの上限を引き上げると、次の処理が可能になります。

  • ファイル処理:ドキュメント、画像、動画の処理
  • データ統合:大規模なAPIレスポンスの処理
  • 一括操作:データセットの効率的な変換
  • デバッグ:複雑なワークフローのノードごとのテスト

まとめ

N8N_PAYLOAD_SIZE_MAXを初期値の16MBからサーバーに適した値へ引き上げることで、これまで部分実行ではできなかった高度なワークフロー処理が可能になります。今回設定した256MBの上限は、サーバーの安定性を保ちつつ、実際の用途の大半に対応します。

この設定の主な利点

  • 生産性:サイズ制限を大幅に減らして、複雑なワークフローをノードごとにデバッグ
  • 処理能力:ファイルと大規模なデータセットを効率的に処理
  • 費用対効果:4GB RAMのサーバーで128MBの上限を月額10ユーロ未満で運用(上記の旧Hetzner CX21プランの料金)
  • 信頼性:適切なリソース管理を備え、本番環境で検証された設定
  • 拡張性:ワークフローが複雑になるにつれて上限を容易に調整

この設定は、当社の最初のn8n構築ガイドとWebhookのトラブルシューティングガイドを基に、企業向けのデータ処理ワークフローに対応する、本番運用可能な自動化プラットフォームを構築するものです。

大量のデータや特殊なペイロード要件がある場合は、用途に合わせた最適化と適切なサーバーリソースの配分について、自動化の専門家への相談を検討してください。

tvaについて

tvaは、データベースシステム、クラウド環境、グローバルなサプライチェーンのインフラを総合的に管理します。体系的なアプローチで厳格なセキュリティ対策と性能最適化を組み合わせ、戦略的なアドバイザリーサービスを通じてデジタル機能と物理的資産を精密に調整します。すべての支援案件で、最高水準の業務品質とコンプライアンスを維持します。

当社のサービスや、その他の自動化チュートリアルの詳細は、tva.sgをご覧ください。

関連記事