16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Proxmox + n8n + NPM + Tailscaleで作る、セキュアな自動化サーバの構築

Last updated at Posted at 2025-12-15

はじめに

自宅サーバ (Proxmox VE) 上に構築した n8n に対し、Nginx Proxy Manager (NPM) を用いて「管理画面」と「Webhookエンドポイント」を別々のドメイン・ネットワーク経路で制御する構成を作成しました。

「管理画面はVPN経由でのみアクセスさせたいが、Webhookは外部サービスから叩けるように公開したい」という要件に対する解法の一つとして、設定手順を共有します。

前提環境と構成

本記事は以下の環境・前提に基づいています。

  • ハイパーバイザ: Proxmox VE
  • ドメイン管理:
    • AWS (Route53): 外部公開用(Webhook用)
    • DuckDNS: 内部管理用(Tailscale IPに紐付け)
  • ネットワーク:
    • Tailscale: 管理者アクセスの経路として使用
    • ルータ: YAMAHA RTX830 (静的IPマスカレード設定)

構成の概要:

  • webhook.<AWSドメイン> → インターネット公開 (Webhook受信専用)
  • n8n.<DuckDNSドメイン> → Tailscale経由 (管理画面アクセス用)

詳細な構成図は以下を参照してください。
https://x.com/yut_720/status/1994254119788531986?s=20

※ Proxmox自体のインストール解説は省略します。

1. Nginx Proxy Managerのインストール

Proxmox VE Helper-Scriptsを使用して、LXCコンテナとしてインストールします。
https://community-scripts.github.io/ProxmoxVE/scripts?id=nginxproxymanager

サイト内の How to install からコマンドをコピーします。

image.png

Proxmoxのホストシェルに貼り付けて実行します。
インストールオプションを聞かれますが、基本的には Default 設定を選択して進めます。

image.png

注意
スクリプト実行中は画面を閉じないでください。LXCにIPアドレスが割り振られ、完了メッセージが表示されるまで待機します。

SDN (Software Defined Network) を使用している方は、この段階でネットワーク設定を変更し、LXCを再起動してください。

以下の画面が表示されたらインストール完了です。

image.png

ブラウザでポート 81 にアクセスし、初期アカウントでログインします。

Email:    admin@example.com
Password: changeme

ログイン後、すぐにメールアドレスとパスワードの変更を求められるので、自身のものに変更してください。

2. ドメインとSSLの設定

Nginx Proxy Manager (以下NPM) に2種類のドメインを設定し、SSL証明書(Let's Encrypt)を取得します。

2-1. AWS管理ドメイン (Webhook用)

用途: 外部からのWebhook受信用
ドメイン例: webhook.example.com (AWS Route53で管理)

NPMの SSL Certificates > Add SSL Certificate を選択し、以下のように設定します。

スクリーンショット 2025-12-15 9.52.08.png

  • Domain Names: 取得したいドメインを入力
  • DNS Challenge: Route53を使用するため有効化
  • Credentials: AWSの aws_access_key_idaws_secret_access_key を入力

2-2. DuckDNSドメイン (管理画面用)

用途: 管理画面へのアクセス (Tailscale経由)
ドメイン例: my-home.duckdns.org

同様にSSL証明書を取得します。
ワイルドカード証明書を含めると、今後サブドメインを増やす際に便利です。

スクリーンショット 2025-12-15 10.44.45.png

  • Domain Names: <ドメイン>, *.<ドメイン> の形式で入力
  • DNS Challenge: DuckDNSを選択
  • Credentials: DuckDNSで発行されたTokenを入力

image.png

2つの証明書ステータスが「Healthy」になれば準備完了です。

3. n8nのインストール

NPMと同様に、Proxmox VE Helper-Scriptsを使用してインストールします。
https://community-scripts.github.io/ProxmoxVE/scripts?id=n8n

インストールオプションはデフォルトで問題ありません。

環境変数の設定 (重要)

インストール完了後、n8nのLXCコンソールを開き、Webhookの受取URLをAWS管理のドメインに固定する設定を行います。

設定ファイルを開きます。

nano /opt/n8n.env

以下の行を追記(または修正)します。

WEBHOOK_URL=https://webhook.<AWS管理ドメイン>

※ ポート番号を含める必要がある場合は :<ポート番号> を付与してください。

編集後、設定を反映させるためにLXCを再起動します。
ポート 5678 で管理画面にアクセスし、アカウント登録画面が表示されれば完了です。

4. n8nをプロキシに紐づける

ここが本設定の肝となります。内部アクセスと外部アクセスを分離するための設定を行います。

4-1. Access Listの作成 (内部アクセスの制限)

管理画面へのアクセスを「LAN内」と「Tailscale経由」のみに制限するためのリストを作成します。

NPMの Access Lists から新規作成します。

image.png

  • LAN: ご自宅のネットワーク帯域 (例: 192.168.1.0/24)
  • Tailscale: 100.64.0.0/10 (Tailscale利用者共通の範囲)

※ DuckDNSの解決先をTailscale IPにしている時点で外部からはアクセスできませんが、多層防御として設定することを推奨します。

4-2. 管理画面用プロキシの設定

DuckDNSドメインを使用して、管理画面へアクセスする設定です。

image.png

  • Forward Host: n8nのIPアドレス
  • Forward Port: 5678
  • Websockets Support: 必ず有効化 (n8nのUI動作に必須)
  • Access List: 先ほど作成したリストを選択
  • SSL: DuckDNSの証明書を選択し、Force SSLを有効化

4-3. Webhook用プロキシの設定

AWS管理ドメインを使用して、Webhookのみを受け入れる設定です。
ここには少し特殊な設定を行います。

image.png

Detailsタブ:

  • Forward Host/Port: ダミーの設定を入力します (例: 127.0.0.1: 80)。
    • ※ ルートパス(/)へのアクセスは弾きたいため、あえて繋がらない、または空の場所へ向けます。

Custom Locationsタブ:
特定のパス(Webhookのエンドポイント)のみをn8nへ転送します。

image.png

  • Location: /webhook
  • Forward Host: n8nのIPアドレス
  • Forward Port: 5678

同様に /webhook-test も作成しておくと、テスト実行時のWebhookも受信できます。

Advancedタブ:
ポート変換対策の設定とルートパスへアクセスした時に404を返答する設定を行います。

image.png

# ポート変換を行っている環境で、リダイレクト時のポート番号ズレを防ぐ設定
listen <外部公開用ポート> ssl;
listen [::]:<外部公開用ポート> ssl;

# ルートパスなど、Custom Locations以外へのアクセスは404を返す
location / {
  return 404;
}

4-4. ルータとDNSの設定

DNS (AWS Route53):
webhook.<AWS管理ドメイン> のAレコードを、自宅のグローバルIPに向けます。

ルータ (静的IPマスカレード/ポートフォワーディング):
外部からの443番ポート(HTTPS)へのアクセスを、NPMのIPアドレスへ転送します。
※以下はYAMAHA RTX830の例です。

image.png

  • 内側アドレス: NPMのIPアドレス (例: 192.168.100.2)
  • ポート: HTTPSなので通常は 443 ですが、ルータの管理画面等と競合する場合は適宜変換してください。
    • NPM側はLXCの構成により 443 で待ち受けているため、ポート変換時は注意してください。

LAN内からのアクセスについて(ヘアピンNAT)
IPv6 IPoE環境などでは、LAN内からグローバルIP(webhook.<AWSドメイン>)へのアクセスができない場合があります(NATループバック問題)。
その際は、ルータのDNS設定やPCのhostsファイルで、ドメイン名をNPMのローカルIPに解決させる等の対策が必要です。

動作確認

最後に以下の確認を行います。

  1. 管理画面: Tailscale接続状態で https://n8n.<DuckDNSドメイン> にアクセスできること。
  2. Webhook: n8nでWebhookノードを作成し、外部ネットワーク(スマホの4G等)から https://webhook.<AWSドメイン>/webhook/... を叩いて反応があること。
動作確認用のワークフローを置いておきます。
{
  "name": "My workflow",
  "nodes": [
    {
      "parameters": {
        "path": "3914ccae-2ff4-40c4-a81e-4d2416893022",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [0, 0],
      "id": "2c38d40f-71ae-4460-ad97-3fb742b757fc",
      "name": "Webhook",
      "webhookId": "3914ccae-2ff4-40c4-a81e-4d2416893022"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "{\"message\": \"このメッセージが見えているということは正常にWebhookを受信できたということです\"}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [208, 0],
      "id": "b2e96816-af60-4871-a503-2bc055132733",
      "name": "Respond to Webhook"
    }
  ],
  "pinData": {},
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ab33a39e-0c4b-4519-856f-5f90f8042e29",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "dd58200ba572d485c22e37b95925694673f2dc4c644dc2d18a8f3d1895015dbe"
  },
  "id": "za2sr58qutGsFx2Q",
  "tags": []
}

おわりに

n8nをセルフホストすることで、高機能な自動化環境を低コストで構築できます。
Nginx Proxy Managerと組み合わせることで、セキュリティと利便性を両立した運用が可能になりますので、ぜひ試してみてください。

16
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?