(最終更新日: 2026年07月02日)
ワークフロー自動化ツールとして、ZapierやMakeの代替として世界中で大人気の「n8n(Community版)」。
今回は、これを自身のVPS(Ubuntu)上に構築し、独自ドメインで安全に公開するまでの手順をステップバイステップで解説します。私も実際に自社サーバーに構築し、日々の業務自動化やAIエージェントのAPI連携にフル活用しています。

本記事のゴールは、単にn8nを動かすだけでなく、企業での実務運用に耐えられる「PostgreSQLデータベース同居型」で構築し、NginxによるリバースプロキシとLet’s EncryptによるSSL通信暗号化を施して安全に運用を開始することです。
n8nをVPS自社環境で構築・セルフホストするメリットとライセンスルール
- SaaS版(クラウド)とVPS自前運用のコスト差と、セルフホストが選ばれる理由
- n8nのFaircodeライセンスの正しい解釈:企業の商用・実務利用は本当に無料?
- AWSやGCPといったメガクラウドと国内VPS(Xserver/ConoHa)のコスト対比
SaaS版(クラウド)とVPS自前運用のコスト差と、セルフホストが選ばれる理由
n8nには公式のSaaS版(クラウド)が存在しますが、スタータープランでも月額約3,000円、ワークフロー数や実行数が増える上位プランでは月額数万円以上のコストが発生します。さらに、実行回数の上限(実行数リミット)があるため、頻繁にループ処理を行うワークフローを回すと、あっという間に上限に達してフリーズしてしまいます。
一方、VPS(仮想専用サーバー)を用いて自社でセルフホスト(自前運用)する場合、かかる費用は月額1,000円〜3,000円程度のサーバー維持費のみです。実行回数や登録するワークフロー数に制限はなく、サーバースペックの許す限り無限に自動化タスクを実行することができます。機密性の高い社内データを外部のSaaS経由で流したくないセキュリティ上の要件からも、多くの企業で自前運用が選ばれています。
n8nのFaircodeライセンスの正しい解釈:企業の商用・実務利用は本当に無料?
n8nを導入する際、最も多くの企業から質問を受けるのがライセンス(利用規約)についてです。n8nはオープンソースのように見えますが、厳密には「Faircode(フェアコード)」ライセンスを採用しています。
このライセンスの要点は、「n8nそのものをSaaSとして別の第三者に再販・有料提供すること」を禁じている点にあります。したがって、一般企業が自社内の業務自動化のためにn8nをサーバーに構築して利用することや、社内ツールとして実務で運用することは、商用利用であっても完全に合法であり、追加のライセンス料金をマイクロソフトやn8n社に支払う必要は一切ありません。規約の範囲内であることを正しく把握して、安心して自社インフラに組み込んでください。
AWSやGCPといったメガクラウドと国内VPS(Xserver/ConoHa)のコスト対比
セルフホスト環境を準備する際、AWS(EC2)やGCP(Compute Engine)といったメガクラウドで稼働させると、月額料金に加え、ネットワーク転送量(データアウト)に応じた重量課金が発生し、Webhooksを頻繁に受け取るn8nでは予期せぬ高額請求を招くことがあります。
実務でのコスト効率を最優先するなら、国内の定額VPSサービスの利用が推奨されます。初期費用が抑えられ、データ転送量も無料または大容量の上限があるため、月々のコストを完全に固定化できます。OS(Ubuntu)イメージも標準テンプレートから1クリックでデプロイできるため、インフラの初期構築工数もメガクラウドより遥かに軽微です。
構築準備:VPSサーバーの初期設定とDockerインフラの整備
- ステップ1:推奨スペック(2GBメモリ〜)のVPSプラン選定とOS初期設定
- ステップ2:SSH鍵認証の設定による外部ハッキング対策の徹底
- ステップ3:Ubuntu / AlmaLinux上へのDockerおよびDocker Composeの導入
ステップ1:推奨スペック(2GBメモリ〜)のVPSプラン選定とOS初期設定
n8nは比較的軽量なソフトウェアですが、重たいデータ処理(PDF解析、大容量JSONのループ展開、生成AIのAPIレスポンス待機など)を行う場合、メモリ消費量が急増します。フリーズや強制終了を避けるため、以下のスペックを満たすサーバーを調達してください。
- CPU: 2 vCPU 以上
- メモリ: 2GB 以上(PostgreSQLなどのデータベースと同居させる場合は4GB以上を強く推奨)
- OS: Ubuntu 22.04 LTS / 24.04 LTS(最もドキュメントが多くトラブルシューティングが容易)
サーバー調達先としては、長期的運用で信頼性の高い Xserver VPS や、日額課金で手軽に試せる KAGOYA CLOUD VPS などが最適です。
ステップ2:SSH鍵認証の設定による外部ハッキング対策の徹底
VPSを開設したら、まず最初に行うべきはサーバーのセキュリティ向上です。初期設定のパスワード認証によるSSH接続のまま運用すると、世界中からのランダムなログイン攻撃(総当たり攻撃)の標的になり、インフラが乗っ取られる危険があります。
必ず、公開鍵と秘密鍵を用いた「SSH鍵認証」によるログイン設定を完了させ、パスワード認証を明示的に無効化(`/etc/ssh/sshd_config` で `PasswordAuthentication no` に設定)してください。また、デフォルトの22番ポートを別の任意のポート番号に変更しておくことで、不要なアクセスログの急増を防ぐことができます。
ステップ3:Ubuntu / AlmaLinux上へのDockerおよびDocker Composeの導入
サーバーの初期設定が完了したら、n8nやデータベースをカプセル化して安全に稼働させるため、Dockerエンジンを導入します。以下のコマンドを入力して最新のDockerとDocker Composeをインストールしてください。
# パッケージリストの更新とアップグレード
sudo apt update && sudo apt upgrade -y
# DockerとDocker Composeのインストール(Ubuntu標準リポジトリを利用)
sudo apt install -y docker.io docker-compose-v2
# 動作確認(バージョンが表示されれば成功です)
docker compose version
# 現在のログインユーザーをdockerグループに追加し、sudoなしでコマンド実行可能にする
sudo usermod -aG docker $USER
# 設定を完全に反映させるためにサーバーを再起動
sudo reboot
本番実務に耐えうる「PostgreSQL同居型」Docker Compose構築手順
- SQLiteはNG?本番運用でPostgreSQL(外部DB)連携が必要な理由
- 【最新テンプレート】docker-compose.yml と環境変数ファイル(.env)の作成
- コンテナの起動コマンドと、初回セットアップ時の初期管理者登録
SQLiteはNG?本番運用でPostgreSQL(外部DB)連携が必要な理由
多くの簡易的な技術ブログでは、n8nの標準データベースである「SQLite」を用いた起動方法が紹介されています。確かに手軽ですが、SQLiteは同時書き込みに弱いため、複数のWebhooksやAPIから並行してデータが送られてくると、データベースファイルのロック競合(Database Lockedエラー)を起こし、n8nサーバー全体のレスポンス停止やコンテナのフリーズを頻繁に引き起こします。
法人の業務自動化などの本番稼働環境では、トランザクションの並行処理に強い「PostgreSQL」をバックエンドデータベースとして構築・連携させることが必須要件です。今回は同一のDocker Composeネットワーク内にPostgreSQLコンテナを組み込み、自動で起動・データ保存ができる構成を作成します。
【最新テンプレート】docker-compose.yml と環境変数ファイル(.env)の作成
n8n用ディレクトリを作成し、PostgreSQL同居型の設定ファイルを記述します。
# 専用ディレクトリの作成と移動
mkdir ~/n8n-docker
cd ~/n8n-docker
# 構成ファイルの新規作成
nano docker-compose.yml
`docker-compose.yml` に以下のテンプレート内容を記述します。
version: '3.8'
services:
postgres:
image: postgres:16-alpine
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "127.0.0.1:5678:5678" # ローカルホストからのみアクセスを許可し、Nginx経由以外の直接アクセスを防ぎます
environment:
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=http # SSL化後に https に変更します
- WEBHOOK_URL=http://${SUBDOMAIN}.${DOMAIN_NAME}/ # SSL化後に https に変更します
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- 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}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
volumes:
db_data:
n8n_data:
次に、環境変数を集中管理する `.env` ファイルを作成します。
nano .env
以下の設定を記述し、ドメイン名やパスワードをご自身の環境に合わせて変更・保存してください。
# ドメイン設定
DOMAIN_NAME=example.com # ← あなたの取得ドメイン名に変更(例: saiteki-ai.com)
SUBDOMAIN=n8n # ← 使用するサブドメイン(例: n8n)
GENERIC_TIMEZONE=Asia/Tokyo
# PostgreSQL接続設定(セキュアなパスワードに変更してください)
POSTGRES_USER=n8n_admin
POSTGRES_PASSWORD=SuperSecurePassword123!
POSTGRES_DB=n8n_database
コンテナの起動コマンドと、初回セットアップ時の初期管理者登録
設定ファイルの保存後、以下のコマンドを実行してコンテナ群をバックグラウンドで一括起動します。
docker compose up -d
初回起動時はイメージのダウンロードに少し時間がかかりますが、「Started」と表示されれば成功です。
ブラウザから `http://[VPSのIPアドレス]:5678`(またはドメイン設定済みの場合は `http://n8n.yourdomain.com:5678`)にアクセスします。ポート競合を防ぐ設定を行っている場合、初期セットアップのアカウント登録画面が表示されます。

ここで管理者のメールアドレスとセキュアなパスワードを設定し、ログインができることを確認してください。なお、ドメイン設定やSSL化を行う前にIPアドレス等からHTTPで直接接続しようとした場合、ブラウザのセキュリティ仕様により以下のようなCookieの制限に関するエラー画面が表示されることがあります。

一時的にIPアドレスでのログイン動作を確認したい場合は、`docker-compose.yml` 内の環境変数に一時的に `- N8N_SECURE_COOKIE=false` を追記して再起動(`docker compose down && docker compose up -d`)することでログインが回避できますが、本番運用の際はセキュリティ保護のため、後述するHTTPS設定(SSL化)を完了させた上で、この設定は無効(またはTrue)に戻してください。
独自ドメインの紐付けとNginxによるリバースプロキシ設定
- ステップ1:DNSサーバーでのAレコード登録(Xserver/お名前.com等)
- ステップ2:Nginxのインストールと安全なリバースプロキシ設定ファイルの書き方
- ステップ3:n8n専用の WEBHOOK_URL 設定とコンテナ側ポートの非公開化
ステップ1:DNSサーバーでのAレコード登録(Xserver/お名前.com等)
n8nに独自ドメインでアクセスできるようにするため、ドメインを取得したDNSサーバー側の設定を行います。まだドメインを取得していない場合は、定額で更新費も明確な Xserverドメイン などでの取得がインフラ管理上推奨されます。
ドメインのDNSレコード管理画面において、以下のようにAレコード(ホスト名:n8n)にVPSのIPアドレスを設定します。

設定の追加後、インターネット上にDNSレコードが浸透してアクセス可能になるまで、数分から最大数時間程度かかりますのでお待ちください。
ステップ2:Nginxのインストールと安全なリバースプロキシ設定ファイルの書き方
n8nにポート番号(`:5678`)なしの標準ポート(80/443)で安全にアクセスさせるため、VPSのフロントエンドにWebサーバー「Nginx」を構築し、内部転送(リバースプロキシ)を行います。
# Nginxのインストール
sudo apt install -y nginx
# n8n用の設定ファイルを新規作成
sudo nano /etc/nginx/sites-available/n8n
設定ファイルに以下の構成を貼り付けます(`n8n.example.com` の部分は必ずご自身のドメインに書き換えてください)。
server {
listen 80;
server_name n8n.example.com; # ← ご自身のサブドメインに書き換え
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_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# n8nのリアルタイム通信(Server Sent Events: SSE)用設定
proxy_buffering off;
proxy_read_timeout 24h;
proxy_connect_timeout 24h;
}
}
設定ファイルを保存後、シンボリックリンクを作成して設定を有効化し、構文チェックを行った上でNginxを再起動します。
# 設定の有効化
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
# Nginx設定の構文エラーチェック
sudo nginx -t
# Nginxの再起動
sudo systemctl restart nginx
ステップ3:n8n専用の WEBHOOK_URL 設定とコンテナ側ポートの非公開化
Nginxを介した80番ポートの転送が動作したことを確認したら、安全のためにセキュリティ設定を変更します。
`docker-compose.yml` に戻り、コンテナ側のポート設定を `- “127.0.0.1:5678:5678″` に固定します。これにより、外部からブラウザで `http://[IPアドレス]:5678` とポートを直接叩くリクエストを遮断し、Nginxのリバースプロキシを経由した「正規のルート」以外からの不正アクセスを防ぐことができます。
Let’s Encryptを用いたSSL化(HTTPS)と自動更新の設定
- ステップ1:Certbotの導入とSSL/TLS証明書の即時発行手順
- ステップ2:Nginx設定ファイルのHTTPS化(443ポート)とHTTP強制リダイレクト
- ステップ3:証明書の自動更新テスト(Dry-run)とcronタスクの確認
ステップ1:Certbotの導入とSSL/TLS証明書の即時発行手順
Webhookを利用する自動化処理では、HTTPS(暗号化通信)が必須要件です。無料の証明書発行機関である「Let’s Encrypt」を利用してSSL/TLS化を行います。
# CertbotおよびNginx用プラグインのインストール
sudo apt install -y certbot python3-certbot-nginx
# 証明書の発行(Nginx設定自動書き換えモード)
sudo certbot --nginx -d n8n.example.com
実行中に連絡用メールアドレスの登録や規約の同意、HTTPアクセスをHTTPSに強制リダイレクトするかの選択(Redirectを選択)を求められます。最終的に「Successfully received certificate」と表示されれば、証明書の取得とNginx設定の書き換えが完了します。
ステップ2:Nginx設定ファイルのHTTPS化(443ポート)とHTTP強制リダイレクト
Certbotにより、`/etc/nginx/sites-available/n8n` ファイル内には自動で443ポート(SSL通信)用の設定および、80ポートからの自動HTTPSリダイレクトルールが自動追記されています。確認のため再度ファイルを開き、設定が正常に行われていることを確認したら、Nginxを再起動します。
sudo systemctl restart nginx
次に、n8nのコンテナ側にもSSL化したことを知らせるため、`docker-compose.yml` を編集します。環境変数の `N8N_PROTOCOL` を `https` に、`WEBHOOK_URL` も `https://${SUBDOMAIN}.${DOMAIN_NAME}/` にそれぞれ書き換えます。その後、`docker compose down && docker compose up -d` を実行して反映します。これにより、Webhookノードが正常なHTTPSのアドレスを出力できるようになります。
ステップ3:証明書の自動更新テスト(Dry-run)とcronタスクの確認
Let’s EncryptのSSL証明書の有効期限は「90日間」です。期限が切れるとアクセス不可になるため、自動更新タスクが正常に登録されているかをテスト(シミュレーション)します。
# 自動更新のシミュレーション(エラーが出なければ問題ありません)
sudo certbot renew --dry-run
Ubuntu環境では、パッケージのインストールと同時に、システムデーモン(systemd)内のタイマー(または `/etc/cron.d/certbot`)に自動更新スクリプトが登録されています。1日2回、自動で有効期限をチェックし、残り30日未満になった時点で証明書が自動更新・Nginxに再ロードされるため、管理者のメンテナンスフリーでの運用が可能です。
本番運用の安全性を高めるアップデート方法とバックアップ
- Dockerイメージの更新手順とn8nコンテナの安全な最新版アップデート
- データベース(PostgreSQL)とn8nボリュームデータの一元バックアップ設計
- メモリ制限回避:コンテナフリーズを防ぐNode.jsのメモリ割当(NODE_OPTIONS)設定
Dockerイメージの更新手順とn8nコンテナの安全な最新版アップデート
n8nは非常に活発に開発が進められており、新機能やバグ修正が頻繁に行われます。稼働中のデータを保持したまま安全にコンテナをアップデートする手順は以下の通りです。
# 1. 構築ディレクトリへ移動
cd ~/n8n-docker
# 2. 最新のDockerイメージをプル(ダウンロード)
docker compose pull
# 3. コンテナを一旦停止し、最新イメージで再起動(ダウンタイムは数秒です)
docker compose down
docker compose up -d
ボリュームボリューム領域(`db_data` および `n8n_data`)にデータが永続化されているため、コンテナを破棄・再起動しても作成したワークフローやユーザーアカウントが消えることはありません。
データベース(PostgreSQL)とn8nボリュームデータの一元バックアップ設計
実務の自動化プロセスを載せる以上、サーバー障害やディスク破損に備えたバックアップ設計は必須です。最も確実な方法は、PostgreSQL内のデータベースデータをダンプファイル(`.sql`)として書き出し、ボリュームデータ(`.n8n`フォルダ)とともに外部ストレージ(S3やセキュアな別ストレージ)へ自動保管することです。
具体的には、以下のようなデータベースダンプスクリプトを作成し、cronによって毎日深夜に自動実行させるタスクを構築しておきましょう。
# PostgreSQLのデータをファイルにダンプするコマンド例
docker compose exec postgres pg_dump -U n8n_admin n8n_database > ~/backup/n8n_db_$(date +%Y%m%d).sql
メモリ制限回避:コンテナフリーズを防ぐNode.jsのメモリ割当(NODE_OPTIONS)設定
n8nはNode.js上で動作するアプリケーションです。標準状態のNode.jsは、コンテナ内の仮想最大メモリ割り当てを低め(約1.5GB程度)に抑えようとします。このため、何十MBものスプレッドシートや大容量画像のやり取りが集中すると、サーバー物理メモリに空きがあっても、Node.jsのメモリ上限値に達した段階でn8nプロセスがクラッシュ(Out of Memory)してしまいます。
これを防止するため、`docker-compose.yml` の `n8n` サービスの環境変数(`environment:`)へ、Node.jsの割り当てメモリ上限を物理スペックに合わせて引き上げる設定値 `NODE_OPTIONS=–max-old-space-size=2048`(2GBメモリ搭載サーバーの場合など。物理メモリ容量の半分から7割程度を目安に設定)を追加してください。この一行を追加するだけで、大量ループや複雑な分析処理中のフリーズリスクを劇的に低減させることができます。
まとめ
以上で、PostgreSQLを採用した実務レベルで止まらない頑強な「自前n8n自動化環境」が完成しました!
国内VPSとDockerを用いるこの構成は、定額コスト(月額数千円〜)を維持したまま、実行回数を気にせずあらゆるビジネス自動化プロセスを回し続けられる最強のインフラです。
SaaS版の制限から解放された自由なセルフホスト環境を活用し、社内の情報漏洩防止や外部APIとの自動連携、独自のAIエージェントの自動駆動などを加速させ、業務自動化の効率を極限まで引き上げていきましょう。
💡 【社内データ×生成AI】自社専用AI定着パッケージのご案内
「n8nを用いた自社専用の自動化・AIワークフロー環境を構築したいが、社内エンジニアのリソースが足りない」「セキュリティやデータガバナンスを担保したセルフホスト設計をプロに丸投げしたい」とお悩みの企業様へ。
弊社では、貴社の業務に合わせたn8nワークフロー設計、DockerやPostgreSQLを用いたセキュアなサーバー構築、外部API連携から運用監視・保守を含めた「自社専用AIエージェント構築・定着支援パッケージ」を提供しています。業務自動化のROI最大化を徹底支援します。


