0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Difyをプロキシ環境(独自証明書が必要)でローカルデプロイする手順

Last updated at Posted at 2025-01-28

概要

  • Difyを、プロキシおよび独自証明書が必要な環境に対してローカルデプロイする際に必要な設定を記載します。各設定がない場合のエラー(ログ等に表示)についても可能な限り記載しています
  • 記載違い等あれば遠慮なくご指摘ください

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

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

前提条件

  • Ubuntu 20.04.6 LTS
  • Docker以外のホスト環境はプロキシ設定済み(参考
  • Dockerは既にインストール済み

手順

  • プロキシはサンプルとして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
copy .env.example .env
docker compose up -d
  • ログを確認したい場合はdocker compose upで起動する
  • サイズが大きくネットワークによってgit cloneに失敗する場合は、別環境(Windowsなどでも可)でクローンしVSCodeなどでコピーする方法でもよい

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

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

可能であればca-certificatesを利用した方法が望ましいと想定されるが、docker-compose.yamlの編集での対応手順が不明であったためこの対応としている。

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

  1. 起動しているコンテナdocker-api-1から現在の証明書をホストにコピーする
    コマンド内のPythonバージョン、コピー先は環境に合わせて変更

    docker cp docker-api-1:/app/api/.venv/lib/python3.12/site-packages/certifi/cacert.pem /home/exsample/cacert.pem
    
  2. コピーした証明書を編集し、独自証明書の内容を最後に追加する

  3. 編集した証明書を./volumes/app/ssl_certs/cacert.pemとして配置(必要に応じてsudo)

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

  5. docker-compose.yamlを編集

    • apiworkerに追加する(内容は同じ)
    • この設定により編集した証明書がコンテナに複写される
    • Pythonバージョンは環境に合わせて変更する
    追加 api volumes
    services:
      api:
        volumes:
          # Added line to mount the SSL certificate
          - ./volumes/app/ssl_certs/cacert.pem:/usr/local/share/ca-certificates/cacert.pem
    
    追加 api entrypoint
    services:
      api:
        entrypoint: 
          # Append certificates to certifi's CA bundle
          - /bin/bash
          - -c 
          - |
            cp /usr/local/share/ca-certificates/cacert.pem /app/api/.venv/lib/python3.12/site-packages/certifi/cacert.pem
            /entrypoint.sh
    
    追加 worker volumes
    services:
      worker:
        volumes:
          # Added line to mount the SSL certificate
          - ./volumes/app/ssl_certs/cacert.pem:/usr/local/share/ca-certificates/cacert.pem
    
    追加 worker entrypoint
    services:
      worker:
        entrypoint: 
          # Append certificates to certifi's CA bundle
          - /bin/bash
          - -c 
          - |
            cp /usr/local/share/ca-certificates/cacert.pem /app/api/.venv/lib/python3.12/site-packages/certifi/cacert.pem
            /entrypoint.sh
    
  6. docker compose up or docker compose up -dでコンテナを起動

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

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

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

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

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

  2. docker-compose.yamlを編集

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

参考

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?