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に初めてアクセスすると、オーナーアカウントの作成画面が表示されます。
- メールアドレスを入力
- 名前を入力
- パスワードを設定
- 「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ファイルとしてエクスポートできます。
- ワークフロー一覧画面を開く
- エクスポートしたいワークフローを選択
- 「…」メニューから「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の基本的な使い方は、セルフホストの詳細についてはも参考にしてください。

