5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(2025年6月25日更新 1.0以降対応)Difyをプロキシ環境(独自証明書が必要)でローカルデプロイする手順

Last updated at Posted at 2025-01-28

概要

  • Difyを、プロキシおよび独自証明書が必要な環境に対してローカルデプロイする際に必要な設定を記載します。各設定がない場合のエラー(ログ等に表示)についても可能な限り記載しています
  • ✨1.0.0以降に対応した手順を追加(plugin-daemon対応)
  • ✨証明書についてca-certificatesを利用した方法に変更
  • 記載違い等あれば遠慮なくご指摘ください

ローカルデプロイ時のライセンスについて

Difyのローカルデプロイ利用は、ライセンスを十分に確認の上ご利用ください。2025年1月28日時点では、商業利用は可能、ただし作成できるテナント(ワークスペース)は1つのみ、ロゴの変更不可などの制限(制限を外す場合は商業ライセンスが必要)などの条件があります。

前提条件

  • Ubuntu 24.04.2 LTS
  • Docker以外のホスト環境はプロキシ設定済み(参考
  • Dockerは既にインストール済み
  • 検証Difyのバージョンは1.4.3

手順

  • プロキシはサンプルとしてhttp://192.168.1.1:8080を記載

(1) Docker全体のプロキシの設定

公式ドキュメントに従い、プロキシの設定を行います。

1. docker image pullが利用するプロキシを設定

この設定でdocker image pullがプロキシを経由するようになる。NO_PROXYを記載してもよいが、docker image pullでしか利用されないため省略しても構わない

未設定時はdockerイメージがプルされない

# Dockerデーモンの設定を編集  
sudo systemctl edit docker
書き込む内容の例
[Service]
Environment="HTTP_PROXY=http://192.168.1.1:8080"
Environment="HTTPS_PROXY=http://192.168.1.1:8080"
# デーモンの設定を更新
sudo systemctl daemon-reload
# Docker デーモンを再起動
sudo systemctl restart docker    

2. ビルドおよび起動したコンテナで利用するプロキシを設定

この設定でビルドおよび起動したコンテナから外部のサービスに接続可能となる

未設定時はDify内に外部LLMサービスを追加できない(404エラーなど)

~/.docker/config.jsonにプロキシを設定する

~/.docker/config.json
{
  "proxies": {
    "default": {
      "httpProxy": "http://192.168.1.1:8080",
      "httpsProxy": "http://192.168.1.1:8080"
    }
  }
}

ただしこちらにあるようにビルド時およびすべての起動したコンテナに反映されるため確認のうえ設定すること。

少なくともno_proxyは後述のようにdocker-compose.yamlへ記載しイメージごと指定すると影響が少ないと思われる。

今回は影響範囲と作業量を踏まえ、プロキシはconfig.jsonに記載しno_proxyのみdocker-compose.yamlへの設定としたが、利用するイメージにより異なると思われる

(2) Difyのデプロイ

この作業でDifyが起動可能となる

cp .env.example .envを忘れていた場合は、docker-weaviate-1コンテナが起動しない

公式の手順に従い設置する

git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d
  • ログを確認したい場合はdocker compose upで起動する
  • サイズが大きくネットワークによってgit cloneに失敗する場合は、別環境(Windowsなどでも可)でクローンしVSCodeなどでコピーする方法でもよい

(3) ssrf_proxy の squid に proxy を設定

  1. docker compose down

  2. dify/docker/ssrf_proxy/squid.conf.templateを編集。# cache_peer 172.1.1.1 parent 3128 0 no-query no-digest no-netdb-exchange defaultの行の後に記載

    抜粋
    # 上位プロキシを設定(外部ネットワークへのアクセスを有効化)
    # ただし、sandbox は直接接続するようにする
    cache_peer 192.168.1.1 parent 8080 0 no-query no-digest no-netdb-exchange default
    acl sandbox_server dstdomain sandbox
    never_direct deny sandbox_server
    never_direct allow all
    forwarded_for delete
    
  3. docker compose up -dを実行

(4) APIを利用したコンテナに対してSSL証明書設定

langgenius/dify-apiを利用したコンテナ(docker-api-1docker-worker-1docker-plugin_daemon-1)から外部にプロキシ経由でアクセス時に外部証明書を利用するための設定となる。
venvで利用している証明書に独自証明書を追加する必要がある。
こちらの対処では証明書に追記が繰り返されることへの対策となる

ca-certificatesを利用した方法に変更。

設定していない場合は、外部LLMサービスを追加時に[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificateというエラーが表示、またはログに記載され追加できない

plugin_daemonに設定していない場合は、プラグイン追加時にinvalid peer certificate: UnknownIssuerというエラーが表示、またはログに記載され追加できない

  1. 独自証明書を配置(例ではdocker-compose.yamlから../../ssl_certs/ex_ca.crtの位置)

  2. docker compose downでコンテナを停止

  3. docker-compose.yamlを編集

    • apiworkerおよびplugin_daemonに追加する
    • entrypoint.shのパスがplugin_daemonapiworkerで異なる以外は同じ
    • この設定により編集した証明書がコンテナに複写される
    追加 api environment
    services:
      api:
        environment:
          SSL_CERT_FILE: /etc/ssl/certs/ca-certificates.crt
          REQUESTS_CA_BUNDLE: /usr/local/share/ca-certificates/extra/ex_ca.pem
          PIP_EXTRA_ARGS: "--native-tls"
    
    追加 api volumes
    services:
      api:
        volumes:
          # Added line to mount the SSL certificate
          - ../../ssl_certs/ex_ca.crt:/usr/local/share/ca-certificates/ex_ca.crt
          - ../../ssl_certs/ex_ca.crt:/usr/local/share/ca-certificates/extra/ex_ca.pem
    
    追加 api entrypoint
    services:
      api:
        entrypoint: 
          # Append certificates to certifi's CA bundle
          # Append certificates to certifi's CA bundle
          - /bin/bash
          - -c 
          - |
            update-ca-certificates
            /entrypoint.sh
    
    追加 worker environment
    services:
      worker:
        environment:
          SSL_CERT_FILE: /etc/ssl/certs/ca-certificates.crt
          REQUESTS_CA_BUNDLE: /usr/local/share/ca-certificates/extra/ex_ca.pem
          PIP_EXTRA_ARGS: "--native-tls"
    
    追加 worker volumes
    services:
      worker:
        volumes:
          # Added line to mount the SSL certificate
          - ../../ssl_certs/ex_ca.crt:/usr/local/share/ca-certificates/ex_ca.crt
          - ../../ssl_certs/ex_ca.crt:/usr/local/share/ca-certificates/extra/ex_ca.pem
    
    追加 worker entrypoint
    services:
      worker:
        entrypoint: 
          # Append certificates to certifi's CA bundle
          - /bin/bash
          - -c 
          - |
            update-ca-certificates
            /entrypoint.sh
    
    追加 plugin_daemon environment
    services:
      plugin_daemon:
        environment:
          SSL_CERT_FILE: /etc/ssl/certs/ca-certificates.crt
          REQUESTS_CA_BUNDLE: /usr/local/share/ca-certificates/extra/ex_ca.pem
          PIP_EXTRA_ARGS: "--native-tls"
    
    追加 plugin_daemon volumes
    services:
      plugin_daemon:
        volumes:
          # Added line to mount the SSL certificate
          - ../../ssl_certs/ex_ca.crt:/usr/local/share/ca-certificates/ex_ca.crt
          - ../../ssl_certs/ex_ca.crt:/usr/local/share/ca-certificates/extra/ex_ca.pem
    
    追加 plugin_daemon entrypoint
    services:
      plugin_daemon:
        entrypoint: 
          # Append certificates to certifi's CA bundle
          - /bin/bash
          - -c 
          - |
            update-ca-certificates
            /app/entrypoint.sh
    
  4. docker compose up or docker compose up -dでコンテナを起動

(5) APIを利用したコンテナに対してプロキシ除外設定

langgenius/dify-apiを利用したコンテナ(docker-api-1docker-worker-1)からコンテナのベクターストアのアドレスhttp://weaviateにアクセスするための設定。
docker-api-1docker-worker-1は外部LLMサービスを利用のためにプロキシ設定は必要だが、ベクターストアコンテナの利用にはプロキシ除外が必要なため。
plugin_daemonに内部アクセスが必要か(プロキシ除外が必要か)は未調査だが念のため追加している

内部LLMなどの利用にも関連する設定となる。

weaviateを設定していない場合は、ナレッジのインデックス作成とインデックス検索でエラー(Meta endpoint! Unexpected status code: 503, with response body: None.)が表示、またはログに記載され実行できない。
docker-worker-1で設定がない場合はインデックス作成に失敗し、docker-api-1で設定がない場合はインデックス検索に失敗する。

sandboxを設定していない場合は、コードブロックの実行でエラー(Run failed: Code execution service is unavailable)が表示、またはログに記載され実行できない。

  1. docker compose downでコンテナを停止

  2. docker-compose.yamlを編集

    • apiworkerに追加する(内容は同じ)
    • この設定に(環境変数としてno_proxyweaviateを指定)よりベクターストアのコンテナweaviateapiworkerからアクセス可能となる
    • 内部のLLMサービスなどにアクセスしたい場合はプライベートアドレスを適宜追加で指定する(下記の設定は172.17.0.0/16のプライベートアドレスの指定例。)
    追加 api environment
    services:
      api:
        environment:
          no_proxy: 'localhost,127.0.0.1,dify.local,weaviate,qdrant,lindorm,unstructured,sandbox,ssrf_proxy,elasticsearch,kibana,plugin_daemon,172.17.0.0/16'
    
    追加 worker environment
    services:
      worker:
        environment:
          no_proxy: 'localhost,127.0.0.1,dify.local,weaviate,qdrant,lindorm,unstructured,sandbox,ssrf_proxy,elasticsearch,kibana,plugin_daemon,172.17.0.0/16'
    
    追加 plugin_daemon environment
    services:
      plugin_daemon:
        environment:
          no_proxy: 'localhost,127.0.0.1,dify.local,weaviate,qdrant,lindorm,unstructured,sandbox,ssrf_proxy,elasticsearch,kibana,plugin_daemon,172.17.0.0/16'
    
  3. docker compose up or docker compose up -dでコンテナを起動

参考

5
4
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
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?