Difyをnginxのサブパス以下に配置する方法

AI

はじめに

Dify を別途 https 化した nginx のサブディレクトリ(例: /dify)に配置する機会がありました。
手順が少し複雑だったため、同じような構成を検討している方の参考になるように、また自分への備忘録としてまとめます。

前提

  • Difyバージョン: 1.13.0

構成の概要

  • Difyは Docker Compose でデプロイ(ポート 8080 で待ち受け)
  • nginxは別の Docker Compose コンテナで稼働(network_mode: host
  • nginxはポート 80 かつ host モードでリクエストを受け、/dify 配下をDifyへプロキシする

手順

1. リポジトリのクローン

git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env

2. 外部nginxの立ち上げ

DifyのDockerコンテナとは別の外部nginxコンテナを以下の構成で立てています。
適当なディレクトリで以下のファイルを作成します。

docker-compose.yml:

name: host-nginx

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
    network_mode: host

default.conf:

server {
    listen 80;
    server_name localhost;

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }

    # /dify へのアクセスをリバースプロキシでlocalhostの8080に転送
    location /dify {
        proxy_pass http://localhost:8080/dify;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

network_mode: host を使うことで、外部nginxコンテナからホストのポート8080(Dify側のnginx)へ直接アクセスできます。

以下のコマンドでnginxを起動します。

docker compose up -d

3. .env の設定

サブディレクトリを使う場合、各種URLの設定が必要です。以下のように .env を編集します。

CONSOLE_API_URL=http://localhost/dify
CONSOLE_WEB_URL=http://localhost/dify
SERVICE_API_URL=http://localhost/dify
TRIGGER_URL=http://localhost/dify
APP_API_URL=http://localhost/dify
APP_WEB_URL=http://localhost/dify
EXPOSE_NGINX_PORT=8080

4. docker-compose.yml の web サービスをビルドに変更

DifyのフロントエンドはNext.jsで構築されています。
Next.jsはベースパスをビルド時に埋め込む必要があるため、NEXT_PUBLIC_BASE_PATH をビルド引数として渡してカスタムビルドを行います。

docker/docker-compose.ymlweb サービスを以下のように変更します。

  web:
    # image: langgenius/dify-web:1.13.0
    build:
      context: ../web
      dockerfile: Dockerfile
      args:
        - NEXT_PUBLIC_BASE_PATH=/dify
    restart: always

5. default.conf.template の設定

Dify同梱のnginxの設定ファイル(docker/nginx/default.conf.template)を以下の内容に置き換えます。
各ロケーションで /dify へのアクセスをそれぞれのバックエンドエンドポイントへ転送しています。

server {
    listen ${NGINX_PORT};
    server_name ${NGINX_SERVER_NAME};

    location /dify/console/api {
      proxy_pass http://api:5001/console/api;
      include proxy.conf;
    }

    location /dify/api {
      proxy_pass http://api:5001/api;
      include proxy.conf;
    }

    location /dify/v1 {
      proxy_pass http://api:5001/v1;
      include proxy.conf;
    }

    location /dify/files {
      proxy_pass http://api:5001/files;
      include proxy.conf;
    }

    location /dify/explore {
      proxy_pass http://web:3000/dify/explore;
      include proxy.conf;
    }

    location /dify/e/ {
      proxy_pass http://plugin_daemon:5002/e/;
      proxy_set_header Dify-Hook-Url $scheme://$host$request_uri;
      include proxy.conf;
    }

    location /dify {
      proxy_pass http://web:3000/dify;
      include proxy.conf;
    }

    location /dify/mcp {
      proxy_pass http://api:5001/mcp;
      include proxy.conf;
    }

    location /dify/triggers {
      proxy_pass http://api:5001/triggers;
      include proxy.conf;
    }

    ${ACME_CHALLENGE_LOCATION}
    ${HTTPS_CONFIG}
}

ポイント

API(バックエンド)側はベースパスの変更に対応していません。
そのため、nginxの設定で /dify/console/apiapi:5001/console/api のように、サブディレクトリのプレフィックスを除去してバックエンドへ転送する設定が必要でした。

おわりに

今回はこのような構成でDifyをサブディレクトリに配置しました。
試行錯誤しながらだったので少し複雑になってしまいました。
より良い方法をご存知の方がいればぜひ教えてください。

コメント

タイトルとURLをコピーしました