概要
- 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
にプロキシを設定する
{
"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 を設定
-
docker compose down
-
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
-
docker compose up -d
を実行
(4) APIを利用したコンテナに対してSSL証明書設定
langgenius/dify-api
を利用したコンテナ(docker-api-1
、docker-worker-1
、docker-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
というエラーが表示、またはログに記載され追加できない
-
独自証明書を配置(例では
docker-compose.yaml
から../../ssl_certs/ex_ca.crt
の位置) -
docker compose down
でコンテナを停止 -
docker-compose.yaml
を編集-
api
、worker
およびplugin_daemon
に追加する -
entrypoint.sh
のパスがplugin_daemon
とapi
、worker
で異なる以外は同じ - この設定により編集した証明書がコンテナに複写される
追加 api environmentservices: 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 volumesservices: 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 entrypointservices: 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 environmentservices: 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 volumesservices: 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 entrypointservices: worker: entrypoint: # Append certificates to certifi's CA bundle - /bin/bash - -c - | update-ca-certificates /entrypoint.sh
追加 plugin_daemon environmentservices: 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 volumesservices: 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 entrypointservices: plugin_daemon: entrypoint: # Append certificates to certifi's CA bundle - /bin/bash - -c - | update-ca-certificates /app/entrypoint.sh
-
-
docker compose up
ordocker compose up -d
でコンテナを起動
(5) APIを利用したコンテナに対してプロキシ除外設定
langgenius/dify-api
を利用したコンテナ(docker-api-1
、docker-worker-1
)からコンテナのベクターストアのアドレスhttp://weaviate
にアクセスするための設定。
docker-api-1
、docker-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
)が表示、またはログに記載され実行できない。
-
docker compose down
でコンテナを停止 -
docker-compose.yaml
を編集-
api
とworker
に追加する(内容は同じ) - この設定に(環境変数として
no_proxy
にweaviate
を指定)よりベクターストアのコンテナweaviate
にapi
とworker
からアクセス可能となる - 内部のLLMサービスなどにアクセスしたい場合はプライベートアドレスを適宜追加で指定する(下記の設定は
172.17.0.0/16
のプライベートアドレスの指定例。)
追加 api environmentservices: 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 environmentservices: 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 environmentservices: 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'
-
-
docker compose up
ordocker compose up -d
でコンテナを起動
参考