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

自宅サーバにn8nとdifyをインストールしてHTTPS アクセスするまで

Last updated at Posted at 2025-05-19

やりたかったこと

  • 自宅の Ubuntu 24.04 サーバに n8ndify をインストール
  • Mac から HTTPS 経由でアクセス
  • IP アドレス固定なし(mDNS で n8n.localdify.local に名前解決)
  • TLS 証明書は mkcert で自前発行(ブラウザ警告なし)
ブラウザ (https://dify.local) -> ホスト Nginx (443) -> dify (8081)
ブラウザ (https://n8n.local) ──► ホスト Nginx (443) -> n8n (5678)

経緯

  • 同一PCでdifyとn8nを動かしており、それぞれにhttpsアクセスする必要があった
    • n8nはlocalhost以外はhttpsが必要なため
    • difyはマイク有効化にhttpsが必要なため
  • 普通にhostname.localをhttps化するとport 443が干渉するため、nginxで個別のアドレスをルーティングするようにした

免責

  • 色々試した中で成功に寄与したと思われる手順をピックアップしていますが、無駄な手順や間違いが含まれているかもしれません。ご了承ください。

手順

n8n のインストール

docker-compose作成

公式のdockerコマンドをdocker-composeで実行できるようにしておきます。

mkdir n8n
cd n8n
nano docker-compose.yaml

以下を記載

docker-compose.yaml
services:
  n8n:
    image: n8nio/n8n:latest
    ports: ["5678:5678"]
    volumes: [n8n_data:/home/node/.n8n]
    environment:
      - N8N_PROTOCOL=http
      - N8N_HOST=n8n.local
      - N8N_PORT=5678
      - WEBHOOK_URL=https://n8n.local/
volumes:
  n8n_data: {}

environmentはChatGPTが含めるように教えてくれたのですが、本当に必要かは不明です。

サービス化

systemdでサービス化しておきます。

/etc/systemd/system/n8n.service
[Unit]
Description=Start n8n via Docker Compose
After=docker.service network-online.target
Requires=docker.service

[Service]
WorkingDirectory=/path/to/docker/compose/dir/
ExecStart=/usr/bin/docker compose up
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
Restart=always

[Install]
WantedBy=multi-user.target
# サービスに登録
sudo systemctl enable n8n
# 起動
sudo systemctl start n8n
# 状態確認
sudo systemctl status n8n
# 状態確認(curl)
curl localhost:5678

起動がうまくいっていなさそうであれば、docker compose upを直接実行するなどしてデバッグしてください。

difyのインストール

公式のQuick Startに基本従いますが、portだけdocker-compose.override.yamlを作成して8081に変更しておきます。80はnginxが使うためです。

git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
nano docker-compose.override.yaml

以下を記載します。

docker-compose.override.yaml
services:
  nginx:
    ports:
      - "8081:80"   # ホストの 8081 にマッピング

サービス化

n8n同様にsystemdでサービス化しておきます。
serviceファイルもほぼn8nと同じです。

/etc/systemd/system/n8n.service
[Unit]
Description=Start dify via Docker Compose
After=docker.service network-online.target
Requires=docker.service

[Service]
WorkingDirectory=/path/to/docker/compose/dir/
ExecStart=/usr/bin/docker compose up
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
Restart=always

[Install]
WantedBy=multi-user.target
# サービスに登録
sudo systemctl enable dify
# 起動
sudo systemctl start dify
# 状態確認
sudo systemctl status dify
# 状態確認(curl)
curl localhost:8081

起動がうまくいっていなさそうであれば、docker compose upを直接実行するなどしてデバッグしてください。

docker compose up -d

mkcertで自己署名CA+証明書発行

mkcertを使ってhttps://n8n.local および https://dify.local でアクセスするための自己署名CAと証明書を発行します。
作成されるファイル名はn8n.local*ですが、mkcert n8n.local dify.localのコマンドによりdifyの情報も合わせて書かれています。

sudo apt install -y mkcert libnss3-tools
mkcert -install
mkcert n8n.local dify.local
sudo mkdir -p /srv/ssl
sudo mv n8n.local+1.pem /srv/ssl/
sudo mv n8n.local+1-key.pem /srv/ssl/

ホストOSのNginx設定

n8n.local、dify.localへのアクセスをルーティングする処理を書きます。

sudo apt install -y nginx

/etc/nginx/sites-available/apps.conf を作成:

/etc/nginx/sites-available/apps.conf
# ---------- n8n ----------
server {
    listen 443 ssl http2;
    server_name n8n.local;

    ssl_certificate     /srv/ssl/n8n.local+1.pem;
    ssl_certificate_key /srv/ssl/n8n.local+1-key.pem;

    location / {
        proxy_pass         http://127.0.0.1:5678;   # n8n コンテナ
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

# ---------- dify ----------
server {
    listen 443 ssl http2;
    server_name dify.local;

    ssl_certificate     /srv/ssl/n8n.local+1.pem;   # 同じ PEM が使える
    ssl_certificate_key /srv/ssl/n8n.local+1-key.pem;

    location / {
        proxy_pass         http://127.0.0.1:8081;   # dify コンテナ
        proxy_http_version 1.1;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

# 80 番への HTTP はまとめて HTTPS へリダイレクト
server {
    listen 80;
    server_name n8n.local dify.local;
    return 301 https://$host$request_uri;
}

有効化して再起動:

sudo ln -s /etc/nginx/sites-available/apps.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl restart nginx

mDNS(.local 名前解決)設定

n8n.localとdify.localを同一LAN内で名前解決できるように設定します。

sudo apt install -y avahi-utils

hostのIPアドレスを動的に取得して、localと紐づけるシェルを作ります。

/usr/local/bin/avahi-aliases.shを作成:

/usr/local/avahi-aliases.sh
IP=$(hostname -I | awk '{print $1}')
/usr/bin/avahi-publish -a -R n8n.local  "$IP" &
/usr/bin/avahi-publish -a -R dify.local "$IP" &

実行権限を付与します。

sudo chmod +x /usr/local/bin/avahi-aliases.sh

サービスからこのシェルを実行するようにします。

/etc/systemd/system/avahi-aliases.serviceを作成:

/etc/systemd/system/avahi-aliases.service
[Unit]
Description=Publish mDNS aliases for n8n & dify
After=avahi-daemon.service network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/avahi-aliases.sh
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now avahi-aliases.service

クライアント(mac)側でCA信頼

前節までの手順でhttpsアクセスが可能になりますが、ブラウザの警告が出てしまいます。
これを消すための設定をします。

ホストで発行したrootCA.pemをクライアントに登録します。
クライアントがmacなのでキーチェーンアクセスを使って登録します。

ホストOSでmkcert -CAROOTを実行しrootCA.pem(公開鍵)の場所を確認します。
ubuntuの場合、~/.local/share/mkcertなどにあると思います。

場所がわかったらrootCA.pemをscpなどでクライアント側にコピーします。

コピーできたら、クライアント側でキーチェーンアクセスを起動し、システムの証明書一覧にrootCA.pemをドラッグ&ドロップします。
するとmkcertで始まる新規の証明書が一覧に追加されるのでダブルクリックします。

image.png

ダブルクリックで表示された画面で証明書を「常に信頼」に設定します。

image.png

最後にブラウザを再起動します。

動作確認

  1. https://n8n.local → n8n ダッシュボードが表示される
  2. https://dify.local → dify が表示される
  3. Mac のブラウザで証明書警告なし(鍵アイコン緑)
1
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
1
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?