本文へスキップ
n8n

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

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

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

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

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

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

SQLiteの特徴と限界

項目SQLitePostgreSQL
アーキテクチャファイルベースクライアント・サーバー型
同時接続制限あり(書き込みロック)多数の同時接続に対応
スケーリング単一インスタンスのみ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=n8nPOSTGRES_PASSWORD=your_strong_password_herePOSTGRES_DB=n8n
# n8n設定N8N_ENCRYPTION_KEY=your_32_char_encryption_key_hereN8N_BASIC_AUTH_USER=adminN8N_BASIC_AUTH_PASSWORD=your_admin_passwordN8N_HOST=n8n.yourdomain.comN8N_PROTOCOL=httpsWEBHOOK_URL=https://n8n.yourdomain.com/GENERIC_TIMEZONE=Asia/Tokyo

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

docker-compose.yml

version: '3.8'
services:postgres:image: postgres:15-alpinecontainer_name: n8n-postgresrestart: alwaysenvironment:- POSTGRES_USER=${POSTGRES_USER}- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}- POSTGRES_DB=${POSTGRES_DB}volumes:- postgres_data:/var/lib/postgresql/datanetworks:- n8n-networkhealthcheck:test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER}']interval: 10stimeout: 5sretries: 5n8n:image: n8nio/n8n:latestcontainer_name: n8nrestart: alwaysports:- "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/.n8nnetworks:- n8n-networkdepends_on:postgres:condition: service_healthyvolumes: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_HOSTPostgreSQLホスト名localhost
DB_POSTGRESDB_PORTPostgreSQLポート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_CACA証明書のパス
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 alpinetar 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 alpinetar 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: 10stimeout: 5sretries: 5

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

リスタートポリシー

restart: always

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

リソース制限

services:n8n:deploy:resources:limits:cpus: '2'memory: 2Greservations: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-alpinecontainer_name: n8n-redisrestart: alwaysvolumes:- redis_data:/datanetworks:- n8n-networkhealthcheck:test: ['CMD', 'redis-cli', 'ping']interval: 10stimeout: 5sretries: 5n8n:# ... 基本設定に以下を追加environment:- EXECUTIONS_MODE=queue- QUEUE_BULL_REDIS_HOST=redis- QUEUE_BULL_REDIS_PORT=6379n8n-worker:image: n8nio/n8n:latestcontainer_name: n8n-workerrestart: alwayscommand: workerenvironment:# n8nと同じDB設定- DB_TYPE=postgresdb- DB_POSTGRESDB_HOST=postgres# ... その他の設定- EXECUTIONS_MODE=queue- QUEUE_BULL_REDIS_HOST=redis- QUEUE_BULL_REDIS_PORT=6379depends_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を使用し、適切なバックアップ戦略を実装してください。

関連記事・公式資料

【初心者向け】n8nローカルインストール完全ガイド|Dockerで5分で始める方法n8nをDockerでローカルPCにインストールする方法を初心者向けに解説。Docker Desktopの設定からn8nの起動、アップデート方法、トラブルシューティングまで、画面操作とコマンド両方の手順を紹介します。www.tentspace.net 【5分で完了】n8nローカルインストール方法|Windows・Mac対応の初心者向け手順ガイドn8nをローカルPCにインストールする方法を初心者向けに解説。Docker Desktopとnpxによる2つの方法を手順付きで紹介。完全無料でワークフロー数・実行回数が無制限。5〜10分でセットアップ完了。www.tentspace.net n8n公式:データベース設定docs.n8n.io