タグ: PostgreSQL

  • n8n Dockerインストール完全ガイド|docker-composeで本番環境を構築する手順

    n8n Dockerインストール完全ガイド|docker-composeで本番環境を構築する手順

    n8nをDockerでセルフホストすれば、実行回数無制限で月額コストを大幅に削減できます。この記事では、ローカル開発環境から本番環境まで、Docker/Docker Composeを使ったn8nのインストール手順を解説します。

    前提条件

    必要な環境

    • Docker Engine 20.10以上
    • Docker Compose v2以上
    • メモリ:最低2GB(推奨4GB以上)
    • ストレージ:10GB以上の空き容量

    Dockerのインストール確認

    以下のコマンドでDockerがインストールされているか確認します。

    
    docker –version
    docker compose version
    

    バージョン情報が表示されればOKです。未インストールの場合は、Docker公式サイトからDocker Desktopをインストールしてください。

    方法1:docker runで手軽に起動(ローカル開発向け)

    最もシンプルな方法です。ローカルでn8nを試したい場合に最適です。

    基本の起動コマンド

    
    docker run -it –rm 
      –name n8n 
      -p 5678:5678 
      -v n8n_data:/home/node/.n8n 
      n8nio/n8n
    

    起動後、ブラウザで http://localhost:5678 にアクセスするとn8nの画面が表示されます。

    コマンドの解説

    オプション 説明
    -it 対話モード(ログをターミナルに表示)
    –rm コンテナ停止時に自動削除
    –name n8n コンテナ名を指定
    -p 5678:5678 ポートマッピング
    -v n8n_data:/home/node/.n8n データ永続化(名前付きボリューム)

    バックグラウンドで起動

    ターミナルを閉じてもn8nを動かし続けたい場合は、-dオプションを使用します。

    
    docker run -d 
      –name n8n 
      -p 5678:5678 
      -v n8n_data:/home/node/.n8n 
      –restart unless-stopped 
      n8nio/n8n
    

    –restart unless-stopped により、PCを再起動してもn8nが自動起動します。

    方法2:Docker Compose(推奨)

    設定をファイルで管理できるDocker Composeを使う方法です。環境変数やデータベース連携が簡単に設定でき、本番運用にも対応できます。

    ディレクトリ構成

    
    n8n/
    ├── docker-compose.yml
    ├── .env
    └── n8n_data/          # データ永続化用(自動作成)
    

    基本のdocker-compose.yml

    まずはシンプルな構成から始めましょう。

    
    services:
      n8n:
        image: n8nio/n8n
        container_name: n8n
        ports:
          - “5678:5678″
        environment:
          - GENERIC_TIMEZONE=Asia/Tokyo
          - TZ=Asia/Tokyo
        volumes:
          - n8n_data:/home/node/.n8n
        restart: unless-stopped
    
    volumes:
      n8n_data:
    

    .envファイル

    環境変数は.envファイルで管理すると便利です。

    
    # タイムゾーン
    GENERIC_TIMEZONE=Asia/Tokyo
    TZ=Asia/Tokyo
    

    起動コマンド

    
    # 起動
    docker compose up -d
    
    # ログ確認
    docker compose logs -f n8n
    
    # 停止
    docker compose down
    
    # 停止(ボリューム削除も含む)
    docker compose down -v
    

    方法3:PostgreSQL連携(本番環境向け)

    本番環境では、デフォルトのSQLiteではなくPostgreSQLを使用することを推奨します。データの信頼性とパフォーマンスが向上します。

    docker-compose.yml(PostgreSQL版)

    
    services:
      n8n:
        image: n8nio/n8n
        container_name: n8n
        ports:
          - “5678:5678″
        environment:
          - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
          - TZ=${TZ}
          - 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:15
        container_name: n8n-postgres
        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
        restart: unless-stopped
    
    volumes:
      n8n_data:
      postgres_data:
    

    .env(PostgreSQL版)

    
    # タイムゾーン
    GENERIC_TIMEZONE=Asia/Tokyo
    TZ=Asia/Tokyo
    
    # PostgreSQL設定
    POSTGRES_USER=n8n
    POSTGRES_PASSWORD=your_secure_password_here
    POSTGRES_DB=n8n
    
    # n8n暗号化キー(認証情報の暗号化に使用)
    # 以下のコマンドで生成: openssl rand -hex 32
    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here
    

    暗号化キーの生成

    N8N_ENCRYPTION_KEYは認証情報の暗号化に使用される重要なキーです。以下のコマンドで生成してください。

    
    openssl rand -hex 32
    

    重要:このキーは変更するとすべての認証情報が復号できなくなります。必ずバックアップしてください。

    方法4:HTTPS対応(外部公開向け)

    n8nを外部に公開する場合は、HTTPSが必要です。TraefikまたはCaddyをリバースプロキシとして使用します。

    docker-compose.yml(Traefik版)

    
    services:
      traefik:
        image: traefik:v2.10
        container_name: traefik
        command:
          - “–api.insecure=false”
          - “–providers.docker=true”
          - “–providers.docker.exposedbydefault=false”
          - “–entrypoints.web.address=:80″
          - “–entrypoints.websecure.address=:443″
          - “–certificatesresolvers.letsencrypt.acme.tlschallenge=true”
          - “–certificatesresolvers.letsencrypt.acme.email=${SSL_EMAIL}”
          - “–certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json”
          - “–entrypoints.web.http.redirections.entrypoint.to=websecure”
        ports:
          - “80:80″
          - “443:443″
        volumes:
          - traefik_data:/letsencrypt
          - /var/run/docker.sock:/var/run/docker.sock:ro
        restart: unless-stopped
    
      n8n:
        image: n8nio/n8n
        container_name: n8n
        environment:
          - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
          - N8N_HOST=${N8N_HOST}
          - N8N_PORT=5678
          - N8N_PROTOCOL=https
          - WEBHOOK_URL=<a href="https://${N8N_HOST}/" target="_blank" rel="noopener">https://${N8N_HOST}/</a>
          - 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
        labels:
          - “traefik.enable=true”
          - “traefik.http.routers.n8n.rule=Host(<code>${N8N_HOST}</code>)”
          - “traefik.http.routers.n8n.entrypoints=websecure”
          - “traefik.http.routers.n8n.tls.certresolver=letsencrypt”
          - “traefik.http.services.n8n.loadbalancer.server.port=5678″
        depends_on:
          postgres:
            condition: service_healthy
        restart: unless-stopped
    
      postgres:
        image: postgres:15
        container_name: n8n-postgres
        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
        restart: unless-stopped
    
    volumes:
      n8n_data:
      postgres_data:
      traefik_data:
    

    .env(HTTPS版)

    
    # ドメイン設定
    N8N_HOST=n8n.example.com
    SSL_EMAIL=admin@example.com
    
    # タイムゾーン
    GENERIC_TIMEZONE=Asia/Tokyo
    TZ=Asia/Tokyo
    
    # PostgreSQL設定
    POSTGRES_USER=n8n
    POSTGRES_PASSWORD=your_secure_password_here
    POSTGRES_DB=n8n
    
    # n8n暗号化キー
    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here
    

    初期設定

    オーナーアカウントの作成

    n8nに初めてアクセスすると、オーナーアカウントの作成画面が表示されます。

    1. メールアドレスを入力
    2. 名前を入力
    3. パスワードを設定
    4. 「Next」または「Set up」をクリック

    このアカウントがn8nの管理者アカウントになります。

    タイムゾーンの確認

    設定画面でタイムゾーンが「Asia/Tokyo」になっていることを確認してください。スケジュール実行の時刻に影響します。

    n8nのアップデート

    Docker Composeの場合

    
    # 最新イメージを取得
    docker compose pull
    
    # コンテナを再作成(データは保持)
    docker compose up -d
    

    特定バージョンを指定

    docker-compose.ymlのimageを変更してバージョンを固定できます。

    
    services:
      n8n:
        image: n8nio/n8n:1.70.0  # バージョン指定
    

    バージョン確認

    n8nの画面左下に現在のバージョンが表示されます。また、以下のコマンドでも確認できます。

    
    docker exec n8n n8n –version
    

    バックアップと復元

    データのバックアップ

    PostgreSQL使用時

    
    # データベースのバックアップ
    docker exec n8n-postgres pg_dump -U n8n n8n > backup_$(date +%Y%m%d).sql
    

    SQLite使用時(デフォルト)

    
    # ボリュームのバックアップ
    docker run –rm -v n8n_data:/data -v $(pwd):/backup alpine tar cvf /backup/n8n_backup.tar /data
    

    ワークフローのエクスポート

    n8nのUI上からもワークフローをJSONファイルとしてエクスポートできます。

    1. ワークフロー一覧画面を開く
    2. エクスポートしたいワークフローを選択
    3. 「…」メニューから「Download」を選択

    トラブルシューティング

    コンテナが起動しない

    
    # ログを確認
    docker compose logs n8n
    
    # コンテナの状態を確認
    docker compose ps
    

    ポートが使用中

    5678ポートが他のアプリケーションで使用されている場合は、docker-compose.ymlのポートマッピングを変更します。

    
    ports:
      - “15678:5678″  # ホスト側を15678に変更
    

    パーミッションエラー

    n8nはUID 1000で動作します。ボリュームマウント時に権限エラーが出る場合は、以下を実行します。

    
    sudo chown -R 1000:1000 ./n8n_data
    

    PostgreSQLに接続できない

    • depends_onでpostgresの起動を待っているか確認
    • healthcheckが正常に動作しているか確認
    • .envファイルの認証情報が正しいか確認
    
    # PostgreSQLの状態確認
    docker compose exec postgres pg_isready -U n8n
    

    主要な環境変数

    環境変数 説明 デフォルト値
    GENERIC_TIMEZONE タイムゾーン UTC
    N8N_HOST ホスト名 localhost
    N8N_PORT ポート番号 5678
    N8N_PROTOCOL プロトコル(http/https) http
    WEBHOOK_URL Webhook用のベースURL
    N8N_ENCRYPTION_KEY 認証情報の暗号化キー
    DB_TYPE データベースタイプ sqlite
    NODE_FUNCTION_ALLOW_EXTERNAL Functionノードで許可する外部パッケージ
    EXECUTIONS_DATA_PRUNE 実行履歴の自動削除 true
    EXECUTIONS_DATA_MAX_AGE 実行履歴の保持期間(時間) 336

    セキュリティのベストプラクティス

    • N8N_ENCRYPTION_KEYを必ず設定:認証情報を暗号化
    • PostgreSQLを外部に公開しない:Dockerネットワーク内のみでアクセス
    • HTTPSを使用:外部公開時は必須
    • 強力なパスワード:オーナーアカウントとDB認証
    • 定期的なバックアップ:データとワークフローを保護
    • 最新バージョンを維持:セキュリティパッチの適用

    まとめ

    n8nをDockerでインストールする方法を解説しました。

    方法 用途 難易度
    docker run お試し・ローカル開発 簡単
    Docker Compose(基本) ローカル開発・小規模運用 簡単
    Docker Compose + PostgreSQL 本番環境 中程度
    Docker Compose + PostgreSQL + HTTPS 外部公開・本番環境 やや複雑

    ローカルで試すなら「docker run」、本番運用なら「PostgreSQL + HTTPS」構成がおすすめです。

    n8nの基本的な使い方は、セルフホストの詳細についてはも参考にしてください。

  • 【本番運用】n8n PostgreSQL永続化の完全ガイド|Docker設定・バックアップ・移行手順

    【本番運用】n8n PostgreSQL永続化の完全ガイド|Docker設定・バックアップ・移行手順

    n8nはデフォルトでSQLiteを使用しますが、本番運用ではPostgreSQLへの移行が推奨されます。

    SQLiteはファイルベースで手軽ですが、同時接続やスケーリングに制限があります。PostgreSQLを使用することで、データの永続化、バックアップ、高可用性を実現できます。

    この記事では、n8nのPostgreSQL永続化について、Docker Compose設定から環境変数、バックアップ、SQLiteからの移行まで、本番運用に必要な技術を詳しく解説します。

    なぜPostgreSQLが必要か?SQLiteとの比較

    SQLiteの特徴と限界

    項目 SQLite PostgreSQL
    アーキテクチャ ファイルベース クライアント・サーバー型
    同時接続 制限あり(書き込みロック) 多数の同時接続に対応
    スケーリング 単一インスタンスのみ Queue Mode / Worker対応
    バックアップ ファイルコピー pg_dump / レプリケーション
    高可用性 非対応 レプリケーション対応
    推奨用途 開発・テスト・小規模 本番・大規模ワークフロー

    PostgreSQLが必要なケース

    • Webhookを多数受け付ける
    • ワークフローの実行頻度が高い
    • 複数ワーカーでの分散処理(Queue Mode)
    • データの確実なバックアップが必要
    • 本番環境での安定運用

    Docker Composeによる構築

    n8nとPostgreSQLをDocker Composeで構築する方法を解説します。

    ディレクトリ構成


    n8n-production/
    ├── docker-compose.yml
    ├── .env
    └── backups/

    .envファイル


    # PostgreSQL設定
    POSTGRES_USER=n8n
    POSTGRES_PASSWORD=your_strong_password_here
    POSTGRES_DB=n8n

    # n8n設定
    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here
    N8N_BASIC_AUTH_USER=admin
    N8N_BASIC_AUTH_PASSWORD=your_admin_password
    N8N_HOST=n8n.yourdomain.com
    N8N_PROTOCOL=https
    WEBHOOK_URL=https://n8n.yourdomain.com/
    GENERIC_TIMEZONE=Asia/Tokyo

    重要:N8N_ENCRYPTION_KEYは32文字以上のランダムな文字列を設定してください。このキーは認証情報の暗号化に使用され、変更すると既存の認証情報が読めなくなります。

    docker-compose.yml


    version: '3.8'

    services:
    postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: always
    environment:
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=${POSTGRES_DB}
    volumes:
    - postgres_data:/var/lib/postgresql/data
    networks:
    - n8n-network
    healthcheck:
    test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER}']
    interval: 10s
    timeout: 5s
    retries: 5

    n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: always
    ports:
    - "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設定
    - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
    - N8N_BASIC_AUTH_ACTIVE=true
    - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
    - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
    - N8N_HOST=${N8N_HOST}
    - N8N_PORT=5678
    - N8N_PROTOCOL=${N8N_PROTOCOL}
    - NODE_ENV=production
    - WEBHOOK_URL=${WEBHOOK_URL}
    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    volumes:
    - n8n_data:/home/node/.n8n
    networks:
    - n8n-network
    depends_on:
    postgres:
    condition: service_healthy

    volumes:
    postgres_data:
    n8n_data:

    networks:
    n8n-network:
    driver: bridge

    起動手順


    # ディレクトリ作成
    mkdir -p n8n-production && cd n8n-production

    # .envとdocker-compose.ymlを作成(上記内容)

    # 起動
    docker compose up -d

    # ログ確認
    docker compose logs -f n8n

    環境変数の詳細解説

    データベース関連

    環境変数 説明 デフォルト値
    DB_TYPE データベースタイプ sqlite(postgresdbに変更)
    DB_POSTGRESDB_HOST PostgreSQLホスト名 localhost
    DB_POSTGRESDB_PORT PostgreSQLポート 5432
    DB_POSTGRESDB_DATABASE データベース名 n8n
    DB_POSTGRESDB_USER ユーザー名 postgres
    DB_POSTGRESDB_PASSWORD パスワード
    DB_POSTGRESDB_SCHEMA スキーマ名 public

    SSL接続(マネージドDB向け)

    AWS RDSやCloud SQLなどのマネージドデータベースを使用する場合、SSL接続が必要です。

    環境変数 説明
    DB_POSTGRESDB_SSL_CA CA証明書のパス
    DB_POSTGRESDB_SSL_CERT クライアント証明書のパス
    DB_POSTGRESDB_SSL_KEY クライアント秘密鍵のパス
    DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED 証明書検証(true/false)

    暗号化キー


    N8N_ENCRYPTION_KEY=your_32_char_encryption_key_here

    重要なポイント

    • 認証情報(Credentials)の暗号化に使用
    • 設定しないと起動時に自動生成される
    • キーを変更すると既存の認証情報が復号できなくなる
    • 必ず安全な場所にバックアップすること

    キーの生成方法


    # OpenSSLでランダムな32文字を生成
    openssl rand -hex 16

    .n8nディレクトリの永続化

    PostgreSQLを使用しても、.n8nディレクトリの永続化は引き続き必要です。

    .n8nディレクトリに保存されるデータ

    • 暗号化キー(N8N_ENCRYPTION_KEYを設定しない場合)
    • インスタンスログ
    • Source Control機能のアセット
    • 一時ファイル

    ボリュームマッピング


    volumes:
    - n8n_data:/home/node/.n8n

    または、ホストディレクトリにマッピング:


    volumes:
    - ./n8n-data:/home/node/.n8n

    バックアップ戦略

    本番運用では、定期的なバックアップが必須です。

    PostgreSQLのバックアップ

    手動バックアップ(pg_dump)


    # バックアップ実行
    docker exec n8n-postgres pg_dump -U n8n -d n8n > backup_$(date +%Y%m%d_%H%M%S).sql

    # 圧縮してバックアップ
    docker exec n8n-postgres pg_dump -U n8n -d n8n | gzip > backup_$(date +%Y%m%d).sql.gz

    自動バックアップスクリプト


    #!/bin/bash
    # backup.sh

    BACKUP_DIR="/path/to/backups"
    DATE=$(date +%Y%m%d_%H%M%S)
    RETENTION_DAYS=7

    # PostgreSQLバックアップ
    docker exec n8n-postgres pg_dump -U n8n -d n8n | gzip > ${BACKUP_DIR}/n8n_db_${DATE}.sql.gz

    # n8n_dataボリュームのバックアップ
    docker run --rm -v n8n_data:/data -v ${BACKUP_DIR}:/backup alpine
    tar czf /backup/n8n_data_${DATE}.tar.gz -C /data .

    # 古いバックアップの削除
    find ${BACKUP_DIR} -name "*.gz" -mtime +${RETENTION_DAYS} -delete

    echo "Backup completed: ${DATE}"

    cronで自動実行


    # 毎日午前3時にバックアップ
    0 3 * * * /path/to/backup.sh >> /var/log/n8n-backup.log 2>&1

    リストア手順

    PostgreSQLのリストア


    # 圧縮ファイルからリストア
    gunzip -c backup_20250101.sql.gz | docker exec -i n8n-postgres psql -U n8n -d n8n

    # 非圧縮ファイルからリストア
    cat backup.sql | docker exec -i n8n-postgres psql -U n8n -d n8n

    n8n_dataボリュームのリストア


    # 既存ボリュームを削除(注意)
    docker volume rm n8n_data

    # 新しいボリュームを作成してリストア
    docker run --rm -v n8n_data:/data -v /path/to/backups:/backup alpine
    tar xzf /backup/n8n_data_20250101.tar.gz -C /data

    SQLiteからPostgreSQLへの移行

    既存のSQLite環境からPostgreSQLに移行する手順です。

    移行方法の選択肢

    方法 メリット デメリット
    ワークフローのエクスポート/インポート 確実、クリーン 実行履歴は移行されない
    SQLダンプの変換 データ完全移行 スキーマ差異の調整が必要
    新規構築 シンプル 再設定が必要

    推奨:ワークフローのエクスポート/インポート

    Step 1:ワークフローのエクスポート

    1. n8nの管理画面にログイン
    2. 各ワークフローを開いて「Export」→ JSONファイルを保存
    3. または、CLIでエクスポート:


    # 全ワークフローをエクスポート
    docker exec n8n n8n export:workflow --all --output=/home/node/.n8n/workflows.json

    Step 2:認証情報のエクスポート


    # 認証情報をエクスポート(暗号化されたまま)
    docker exec n8n n8n export:credentials --all --output=/home/node/.n8n/credentials.json

    Step 3:PostgreSQL環境の構築

    上記のdocker-compose.ymlを使用して新しい環境を構築します。

    重要:N8N_ENCRYPTION_KEYは元の環境と同じ値を使用してください。

    Step 4:データのインポート


    # ワークフローのインポート
    docker exec n8n n8n import:workflow --input=/home/node/.n8n/workflows.json

    # 認証情報のインポート
    docker exec n8n n8n import:credentials --input=/home/node/.n8n/credentials.json

    本番運用のベストプラクティス

    ヘルスチェックの設定


    healthcheck:
    test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER}']
    interval: 10s
    timeout: 5s
    retries: 5

    PostgreSQLの準備が完了してからn8nを起動することで、接続エラーを防ぎます。

    リスタートポリシー


    restart: always

    コンテナが停止した場合に自動的に再起動します。

    リソース制限


    services:
    n8n:
    deploy:
    resources:
    limits:
    cpus: '2'
    memory: 2G
    reservations:
    cpus: '0.5'
    memory: 512M

    ログ管理


    services:
    n8n:
    logging:
    driver: "json-file"
    options:
    max-size: "10m"
    max-file: "3"

    リバースプロキシとSSL

    本番環境では、Nginx / TraefikなどのリバースプロキシでSSL終端を行います。

    Nginxの設定例


    server {
    listen 443 ssl http2;
    server_name n8n.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/n8n.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.yourdomain.com/privkey.pem;

    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_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;
    chunked_transfer_encoding off;
    proxy_buffering off;
    proxy_cache off;
    }
    }

    Queue Modeでのスケーリング

    大規模なワークフロー処理には、Queue Mode + Redisを使用します。

    Queue Mode構成


    version: '3.8'

    services:
    postgres:
    # ... 上記と同じ

    redis:
    image: redis:7-alpine
    container_name: n8n-redis
    restart: always
    volumes:
    - redis_data:/data
    networks:
    - n8n-network
    healthcheck:
    test: ['CMD', 'redis-cli', 'ping']
    interval: 10s
    timeout: 5s
    retries: 5

    n8n:
    # ... 基本設定に以下を追加
    environment:
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_BULL_REDIS_PORT=6379

    n8n-worker:
    image: n8nio/n8n:latest
    container_name: n8n-worker
    restart: always
    command: worker
    environment:
    # n8nと同じDB設定
    - DB_TYPE=postgresdb
    - DB_POSTGRESDB_HOST=postgres
    # ... その他の設定
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_BULL_REDIS_PORT=6379
    depends_on:
    - postgres
    - redis

    volumes:
    postgres_data:
    redis_data:
    n8n_data:

    トラブルシューティング

    よくある問題と解決方法

    問題 原因 解決方法
    DB接続エラー PostgreSQLが起動していない healthcheckとdepends_onを設定
    認証情報が読めない 暗号化キーが異なる N8N_ENCRYPTION_KEYを確認
    SQLiteにフォールバック DB_TYPE未設定 環境変数を確認
    Permission denied ボリュームの権限問題 UID/GID設定またはchown
    起動時にハング マイグレーション中 初回起動時は時間がかかる

    ログの確認方法


    # n8nのログ
    docker compose logs -f n8n

    # PostgreSQLのログ
    docker compose logs -f postgres

    # 全サービスのログ
    docker compose logs -f

    データベース接続の確認


    # PostgreSQLに直接接続
    docker exec -it n8n-postgres psql -U n8n -d n8n

    # テーブル一覧を確認
    dt

    # ワークフロー数を確認
    SELECT COUNT(*) FROM workflow_entity;

    よくある質問(FAQ)

    Q. SQLiteからPostgreSQLへの移行は必須ですか?

    A. 必須ではありませんが、本番運用では強く推奨されます。SQLiteは同時書き込みに制限があり、Webhookを多数受け付けるような使い方では問題が発生する可能性があります。

    Q. マネージドPostgreSQL(RDS、Cloud SQL)は使えますか?

    A. はい、使用できます。接続情報を環境変数で設定し、必要に応じてSSL接続を設定してください。

    Q. N8N_ENCRYPTION_KEYを忘れた場合はどうなりますか?

    A. 既存の認証情報が復号できなくなります。ワークフロー自体は残りますが、認証情報は再設定が必要です。キーは必ずバックアップしてください。

    Q. PostgreSQLのバージョンは何を使うべきですか?

    A. PostgreSQL 13以上が推奨です。2025年現在、PostgreSQL 15または16が安定しており推奨されます。

    Q. 実行履歴(Executions)はどこに保存されますか?

    A. PostgreSQLのexecution_entityテーブルに保存されます。実行履歴が増えるとディスク容量を消費するため、定期的なクリーンアップまたは保持期間の設定を検討してください。

    まとめ

    この記事では、n8nのPostgreSQL永続化について解説しました。

    本番運用のための必須設定

    • DB_TYPE=postgresdb で PostgreSQLを指定
    • N8N_ENCRYPTION_KEY を固定値で設定
    • .n8nディレクトリのボリューム永続化
    • PostgreSQLデータのボリューム永続化

    運用のポイント

    • healthcheckでPostgreSQLの準備完了を待つ
    • 定期的なバックアップ(pg_dump + ボリューム)
    • 暗号化キーの安全な管理
    • リバースプロキシでSSL終端

    スケーリング時の追加設定

    • Queue Mode + Redis
    • n8n-workerの追加

    PostgreSQLを使用することで、n8nの安定性と信頼性が大きく向上します。本番環境では必ずPostgreSQLを使用し、適切なバックアップ戦略を実装してください。