3
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?

【ガイド】ラズパイで作る、HTTPS接続可能なn8nサーバー

3
Last updated at Posted at 2025-12-13

目次

1.はじめに
2.アーキテクチャ
3.手順
4.おまけ
5.さいごに

1. はじめに

自宅でホストしているラズパイのn8nサーバーにHTTPS接続可能な環境を構築しました!

n8nを知らない方向けに、n8nとはワークフロー自動化ツールです。
オープンソースなため自分でホストすれば無料で使えちゃいます!
ただ、HTTPのままだとWebhookがうまく動かなかったり、Google連携などのOAuth認証でエラーが出たりと、不便な点が多いです。
そこで今回の手順を行うことで、それらを解決してフル機能使えるようになります!

初学者向けにかなり細かく書いたので、適宜飛ばして読むことを推奨します。

2. アーキテクチャ

  • 使用ハード
    • Raspberry Pi 5 (Raspberry Pi OS)
  • 使用技術
    • Docker / DockerCompose
    • Nginx Proxy Manager (NPM)
    • n8n
    • nftables (WF)
  • 構成図
    • 外部 → ルーター(ポート開放) → Raspberry Pi (nftables) → Dockerコンテナ (NPM(リバースプロキシ) → n8n)

image.png

3. 手順

3-1. ルーター設定(DHCPとポート開放)

まずRaspberry PiのMACアドレスを調べます。

ip link

# <出力結果>
# 1: lo: ...
# 2: eth0: ...
#     link/ether 12:34:56:78:9a:bc (← こっちが有線 ) brd ...
# 3: wlan0: ...
#     link/ether 12:34:56:78:9a:bd (← こっちが無線 ) brd ...

link/etherの右にあるコロン区切りの12桁がMACアドレスです。
コピーしてください。
eth0かwlan0かは自身のRaspberry Piの通信環境に合わせてください。
 

自身が使っているルーター設定の画面に飛び、DHCPサーバーやIPアドレス割当のような項目を探し、先ほどの自分のMACアドレスとお好きなIPを入れてください。

スクリーンショット 2025-12-13 114431.png
※ルーターの設定画面や機能は環境によって違うので、画像の通りとは限りません
 
 
ルーター再起動後に、Raspberry Pi上のローカルIPを確認します。

ip addr

eth0やwlan0に自身で設定したローカルIPが書かれていていればOKです。
 
 
最後に外部からの通信が通るように、ポート開放を行います。
外部(WAN)の80番をRaspberry Pi(LAN)の80番へ、外部の443番をRaspberry Piの443番へ転送する設定をします。(ハイフンがありますが、80-81のように幅を持たせられます。今回は必要なし。)

スクリーンショット 2025-12-13 165940.png
 
 
再起動が終わればルーターの設定は終了です!

3-2. OSのFW設定

Raspberry Pi OSではFW(ファイヤーウォール)としてデフォルトでnftableが使われているはずです。
設定ファイルを編集していきます。

sudo nano /etc/nftables.conf

エディタが開けたら、既存の設定を消し、以下のように書き換えてください。

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority filter; policy drop;
        iif "lo" accept
        ct state established,related accept
        ip protocol icmp accept
        ip6 nexthdr ipv6-icmp accept
        
        tcp dport 22 accept # SSH用(任意)
        tcp dport 80 accept # HTTP
        tcp dport 443 accept # HTTPS
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}

軽く内容をまとめると

  • input(受信):基本遮断(Drop)でlocalhostと自分が送った通信の返答、あと必要なポートもOK
  • output(送信):基本OK(accept)

forwardチェーンは?と思った方もいるかもですが、ここはDockerが自動管理してくれるので書いていません。(変に書いたら競合したり上書きされたり...)

3-3. ドメイン取得・DDNS

今回はDuckDNSを使いました。
サイトに飛んだあとGoogleアカウントなどでログインすると、sub domainとかかれた入力欄に好きな名前を入れてadd domainを押します。(他人と被るとはじかれます)
入力後は、上の「Duck DNS」と大きく書かれた下にある「token」をコピーしておいてください。
グローバルIPは、ルーターの再起動時などに変わることがあるため、更新用のスクリプトを作成します。

# フォルダ作成と移動
mkdir ~/duckdns
cd ~/duckdns

# スクリプトファイルの作成
nano duck.sh

エディタが開けたら以下の内容を書き込みます。
※YOURDOMAINとYOURTOKENをそれぞれ自分のものに置き換えてください

echo url="https://www.duckdns.org/update?domains=YOURDOMAIN&token=YOURTOKEN&ip=" | curl -k -o ~/duckdns/duck.log -K -

Ctrl + O→Enterで保存し、Ctrl + Xでエディタを終了します。

次にスクリプトに実行権限を与えます。

chmod 700 duck.sh

cronというスケジュール機能で定期実行するようにします。

crontab -e

初めて実行するとエディタの種類を問われるかもしれませんが、よくわからない方はnanoを選択しておいてください。
開けたら末尾に以下の一行を追加します。

*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

5分毎にスクリプトが実行されます。
先ほど同様保存して終了できたらアドレスの自動更新は完了です。

3-4. Dockerのインストール

今回はDocker Composeを使います。
DockerやDocker Composeを知らない人のために簡単に説明しておきます。

  • Docker:アプリを「コンテナ」という箱に閉じ込めて動かせる便利なプラットフォーム
  • Docker Compose:複数のコンテナ(今回はn8nとNPM)をまとめて管理するツール
curl -sSL https://get.docker.com | sh

sudoなしでdockerコマンドを使えるようにユーザーをグループ追加します。

sudo usermod -aG docker $USER

反映のために再起動をかけます。

sudo reboot

3-5. docker-compose.ymlの作成

作業用ディレクトリでdocker-compose.yml(設計図)を作成します。

mkdir ~/nginx_proxy_manager
cd ~/nginx_proxy_manager

nano docker-compose.yml

以下の内容をコピペしてください。(WEBHOOK_URLのYOUR_DOMAINは自分のドメインに変更)

services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginxproxymanager
    restart: unless-stopped  # 再起動時に自動実行、stopで止まる
    ports:
      - '80:80'   # HTTP
      - '81:81'   # 管理画面
      - '443:443' # HTTPS
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - npm_network

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped  # 再起動時に自動実行、stopで止まる
    ports:
      - 5678:5678
    environment:
      - TZ=Asia/Tokyo
      - N8N_SECURE_COOKIE=false
      - WEBHOOK_URL=https://YOUR_DOMAIN  # 自身のドメインに変更
    volumes:
      - ./n8n_data:/home/node/.n8n
    networks:
      - npm_network

networks:
  npm_network:
    driver: bridge

保存できたらコンテナを起動します。

docker compose up -d

立ち上がっているコンテナを確認します。

docker ps

2つのコンテナがUPとなっていたら成功です!
この時点で、Raspberry Pi上からはn8nを使うことができます!
ブラウザでlocalhost:5678と入力することでn8nのアカウント作成画面が表示されるはずです。

3-6. HTTPS化

HTTPS接続するためにSSL認証を通します。
今回使っているNginx Proxy Managerというのは、本来は難しいコマンド入力が必要なHTTPS化設定を、ブラウザ上のクリックだけで完了できるツールです。
Raspberry Piでブラウザを開き、localhost:81(81番ポート)にアクセスします。
初期ログイン情報は以下の通りです。

  • Email: admin@example.com
  • Password: changeme

ログイン後、ユーザー情報の変更を求められるので、自分のメアドとパスワードを入力します。

ログイン後、Proxy Hostsを選択し、Add Proxy Hostをクリックすると設定画面が出てくるので、以下の通り入力します。

  • Detailsタブ
    • Domain Names: 取得したドメイン
    • Scheme: http
    • Forward Hostname/IP: n8n
    • Forward Port: 5678
    • Websockets Support: ON

image.png

  • SSLタブ
    • SSL Certificate: Request a new SSL Certificate
    • Force SSL: ON
    • Email Address: 自分のメールアドレス
    • Terms of Serviceに同意して Saveをクリック

image.png

しばらく待って、ステータスがOnlineになれば、ついに完了です!
別デバイスでモバイル回線などの外部ネットワークからhttps://[自分のドメイン]に接続して、n8nのアカウント作成画面が表示されれば成功です!

4. おまけ

LAN内からhttpsで接続できない場合

この状態でRaspberry Piと同一LAN内からhttpsで始まるURLに接続すると、接続できる方とできない方がいると思います。
これは**NATループバック(ヘアピンNAT)**などと呼ばれる技術に関する問題で、LAN内から投げたパケットをWAN側でルーターが自分宛てだと誤解して破棄したり、LAN側に折り返す経路情報がないことで接続できないことがあります。
自身のルーターにはUターンNAT非対応だったので、LAN内からはローカルIPで接続できるようにしました。
 
 
nftablesの設定ファイルを開きます。

sudo nano /etc/nftables.conf

inputチェーン内に以下の内容を追加します。

        tcp dport 81 ip saddr 192.168.0.0/16 accept  #NPM管理画面
        tcp dport 5678 ip saddr 192.168.0.0/16 accept  #n8n

保存できたら、この設定を適応します。
sudo systemctl restart nftablesをするとdocker側が管理する設定も消えてしまうので、再起動をかけます。

sudo reboot

再起動完了後、同LAN内の別デバイスのブラウザにRaspberry PiのローカルIP:ポート番号と入力すればNPM管理画面(81番)やn8nの画面(5678番)が開けます。

LAN内からの通信なのでhttpでも大きな問題はないです。

5. さいごに

Raspberry PiとDockerを使ってn8nを外部公開する手順をまとめてみました。

初の記事投稿なので、読みづらい部分もあったかもしれませんが、自分の備忘録も兼ねて共有させていただきました。
この記事が少しでも皆さんのお役に立てたら幸いです。

よいn8nライフを!

3
2
2

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
3
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?