目次
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)
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を入れてください。

※ルーターの設定画面や機能は環境によって違うので、画像の通りとは限りません
ルーター再起動後に、Raspberry Pi上のローカルIPを確認します。
ip addr
eth0やwlan0に自身で設定したローカルIPが書かれていていればOKです。
最後に外部からの通信が通るように、ポート開放を行います。
外部(WAN)の80番をRaspberry Pi(LAN)の80番へ、外部の443番をRaspberry Piの443番へ転送する設定をします。(ハイフンがありますが、80-81のように幅を持たせられます。今回は必要なし。)
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
-
SSLタブ
- SSL Certificate: Request a new SSL Certificate
- Force SSL: ON
- Email Address: 自分のメールアドレス
-
Terms of Serviceに同意して
Saveをクリック
しばらく待って、ステータスが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を外部公開する手順をまとめてみました。
初の記事投稿なので、読みづらい部分もあったかもしれませんが、自分の備忘録も兼ねて共有させていただきました。
この記事が少しでも皆さんのお役に立てたら幸いです。



