Docker ComposeとPostgreSQLによるn8n構築ガイド:セルフホスト型ワークフロー自動化

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

n8nワークフロー自動化のデプロイモデル比較

エンジニアリングチームがZapierやMakeに毎月50ドル〜数百ドルを支払うことなく、GitLab、Jira、Slack、社内CRMシステムなどをシームレスに連携させたい場合、n8nは常に有力な選択肢となります。しかし、実際の運用にあたってどのインフラ構成を採用すべきかは、事前によく検討しておく必要があります。

  • モデル1: n8n Cloud(SaaS) — 月額サブスクリプション(2,500実行で月額20ユーロ〜)を支払い、サーバー設定の手間をかけることなく公式のインフラ上ですぐに利用できます。
  • モデル2: 単一Dockerコンテナ(SQLite) — n8nio/n8nイメージをプルし、ホスト側のディレクトリをマウントして、デフォルトのSQLiteデータベースで直接起動する構成です。
  • モデル3: Docker Compose + PostgreSQL構成 — n8nアプリケーションとPostgreSQLデータベースを2つの独立したコンテナに分離し、環境変数とDocker内部ネットワークで一元管理します。

各構成のメリット・デメリット分析

処理トラフィック量やデータの機密性に応じて、各選択肢にはそれぞれ適したユースケースがあります。

1. n8n Cloud

  • メリット: インフラの保守運用コストがゼロ。自動でバージョンアップが行われ、SSL証明書やドメイン管理も標準で統合されています。
  • デメリット: ワークフロー数や実行数が増えるにつれてコストが急増します。また、APIトークンや顧客情報などの機密データが外部サーバーを経由することになります。

2. 単一Dockerコンテナ(SQLite)

  • メリット: docker runコマンド1つで30秒以内に構築可能。機能検証や個人のデモ環境として非常に適しています。
  • デメリット: 10〜20件のWebhookが同時にトリガーされると、SQLiteのデータベースロックが発生しやすくなります。また、コンテナ障害時のデータバックアップも複雑でリスクを伴います。

3. Docker Compose + PostgreSQL

  • メリット: PostgreSQLにより、数百件の同時実行もスムーズに処理できます。VPS上でデータを完全に自己管理でき、自動バックアップの設定が容易で、負荷増大時にはn8nワーカーのスケールアウトにも対応可能です。
  • デメリット: Linuxの管理、Docker、およびNginxなどのリバースプロキシ設定に関する基本的な知識が必要です。

以前のプロジェクトで、フラッシュセール時にファイル書き込みのボトルネックが原因で、SQLiteを使用したn8nコンテナがクラッシュを繰り返すというインシデントを経験しました。決済ゲートウェイからのWebhookが3時間以上も停止してしまったのです。この教訓は明白でした。実務で稼働させる本番システムでは、データの損失や予期せぬサービス停止を防ぐために、データベースを独立したPostgreSQLサービスとして分離することが必須要件となります。

なぜDocker Compose + PostgreSQLが本番環境に最適なのか?

チーム全体で利用する安定した自動化基盤を構築したい場合、Docker Compose + PostgreSQLの組み合わせがコストと信頼性のバランスにおいて最も優れた選択肢となります。

手頃なスペックのVPS(2 vCPU、4GB RAMで月額約10〜15ドル)であっても、I/Oボトルネックを起こすことなく1日数万件のトリガーを十分に処理できます。また、システム構成全体をコード(IaC)として管理できるため、Gitによるバージョン管理や同期も容易です。

Docker ComposeとPostgreSQLによるn8n構築手順ステップバイステップ

ステップ1: ディレクトリの準備と権限設定

VPSにSSH接続し、永続データ保存用のディレクトリ構造を作成します。

mkdir -p /opt/n8n-stack/n8n_data /opt/n8n-stack/postgres_data
cd /opt/n8n-stack
# コンテナ内のnodeユーザー(UID 1000)に権限を付与
sudo chown -R 1000:1000 n8n_data

ステップ2: 環境変数ファイル(.env)の作成

機密情報を.envファイルに分離して管理し、パスワードの漏洩を防ぎます。

nano .env

ファイルに以下の設定内容を記述します。

# ドメイン名とタイムゾーン
DOMAIN_NAME=automation.yourdomain.com
GENERIC_TIMEZONE=Asia/Ho_Chi_Minh

# PostgreSQLデータベース情報
POSTGRES_USER=n8n_admin
POSTGRES_PASSWORD=MatKhauBaoMatCucManh_2026
POSTGRES_DB=n8n_db

# 認証情報の暗号化キー(32文字以上のランダムな文字列を生成)
N8N_ENCRYPTION_KEY=b8f3e1a9c4d2095f8e7123456789abcd

ステップ3: docker-compose.ymlの作成

docker-compose.ymlファイルを作成し、postgresとn8nの2つのサービスを定義します。

services:
  postgres:
    image: postgres:16-alpine
    container_name: n8n_postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - n8n_network

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n_app
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - 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}
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - TZ=${GENERIC_TIMEZONE}
      - WEBHOOK_URL=https://${DOMAIN_NAME}/
      - N8N_HOST=${DOMAIN_NAME}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
    volumes:
      - ./n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - n8n_network

networks:
  n8n_network:
    driver: bridge

ステップ4: サービスの起動とログの確認

バックグラウンドでサービス群を起動します。

docker compose up -d

コンテナの状態を確認し、起動ログを追跡します。

docker compose ps
docker compose logs -f n8n

ログに準備完了のメッセージやEditor is now accessible via...と表示されれば、データベースとの接続が正常に完了しています。

ステップ5: NginxリバースプロキシとSSLの設定

セキュリティ確保のためポート5678は127.0.0.1にのみ公開しているため、トラフィックの転送とSSL証明書の処理を行うリバースプロキシとしてNginxを構成します。n8nのドラッグ&ドロップUIでリアルタイム状態を表示できるよう、Nginxの設定でWebSocketをサポートする必要があります。

server {
    server_name automation.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_cache off;
    }
}

Let’s EncryptのCertbotを使用して、次のコマンドで無料のSSL証明書を取得・設定します:sudo certbot --nginx -d automation.yourdomain.com。完了後、ドメインにアクセスして初期オーナーアカウントを設定できます。

ステップ6: 毎日のデータベース自動バックアップ設定

重要なワークフローや認証情報を安全に保護するために、毎晩PostgreSQLのデータを自動エクスポートするcronジョブを設定します。

# cron設定を開く
crontab -e

# 毎日午前2:00にバックアップを実行する行を追加
0 2 * * * docker exec -t n8n_postgres pg_dump -U n8n_admin n8n_db | gzip > /opt/n8n-stack/backups/n8n_db_$(date +\%F).sql.gz

これでn8n環境の構築は完了です。リバースプロキシ配下で安全に稼働し、定期的なデータバックアップ体制も整ったため、チーム全体の業務自動化フローを安心して運用できます。

Share: