Dify 1.0.0 を proxy がある環境にインストール (Dify 1.1.1 にも対応)

AI

ubuntu server 24.04 にインストールする手順です。Dify は docker compose でインストールします。

Dify 1.1.1 も同じ手順でインストールできました。

proxyサーバは、 192.168.100.1:8080 とします。

システム全体にproxy を設定

まずは、システム全体に proxy の設定をします。

1. 環境変数を設定する

システム全体で HTTP/HTTPS/FTP プロキシを使用する場合、/etc/environment に環境変数を設定します。

vi /etc/environment

以下のようにプロキシの設定を追加する(192.168.100.1:8080 の部分は環境に応じて変更)。

http_proxy="http://192.168.100.1:8080/"
https_proxy="http://192.168.100.1:8080/"
ftp_proxy="http://192.168.100.1:8080/"
no_proxy="localhost,127.0.0.1,::1"
HTTP_PROXY="http://192.168.100.1:8080/"
HTTPS_PROXY="http://192.168.100.1:8080/"
FTP_PROXY="http://192.168.100.1:8080/"
NO_PROXY="localhost,127.0.0.1,::1"

再起動して設定を反映します。

再起動できない場合は、以下のコマンドで、現在開いているターミナルに環境変数を反映します。

source /etc/environment

2. APT のプロキシ設定

APT (パッケージ管理) にプロキシを適用するには、/etc/apt/apt.conf.d/95proxy に設定を記述します。

vi /etc/apt/apt.conf.d/95proxies

以下を追加。

Acquire::http::Proxy "http://192.168.100.1:8080/";
Acquire::https::Proxy "http://192.168.100.1:8080/";

3. systemd のプロキシ設定

systemd を利用するサービスにもプロキシを適用する場合、systemd の環境変数を設定します。

vi /etc/systemd/system.conf

以下を追加:

DefaultEnvironment="http_proxy=http://192.168.100.1:8080/" DefaultEnvironment="https_proxy=http://192.168.100.1:8080/"

systemctl を再起動:

systemctl daemon-reexec

Docker のインストール

1. システムの更新

sudo apt update
sudo apt upgrade

2. 必要なパッケージのインストール

Docker のインストールに必要なパッケージをインストールします・

sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common

3. Docker の公式 GPG キーを追加

Docker の公式 GPG キーをシステムに追加します。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4. Docker リポジトリの追加

Docker のリポジトリをシステムに追加します。

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

5. Docker のインストール

パッケージリストを更新し、Docker をインストールします。​

sudo apt updatesudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

6. Docker Compose プラグインのインストール

Docker Compose を使用するためのプラグインをインストールします。​

sudo apt install -y docker-compose-plugin

7. Docker の動作確認

Docker が正しくインストールされたか確認します。​

docker --version
docker compose version

8. Docker のproxyの設定

Docker デーモンがプロキシ経由で通信できるように設定します。

mkdir -p /etc/systemd/system/docker.service.d
vi /etc/systemd/system/docker.service.d/http-proxy.conf

​以下の内容を記述します。

[Service]
Environment="HTTP_PROXY=http://192.168.100.1:8080"
Environment="HTTPS_PROXY=http://192.168.100.1:8080"

設定後、以下のコマンドで設定をリロードし、Docker を再起動します。

sudo systemctl daemon-reload
sudo systemctl restart docker

9. 動作確認

sudo docker run hello-world

上手くいっていれば、Hello World のメッセージが出る。

Hello from Docker!
This message shows that your installation appears to be working correctly.

下にもう少しメッセージが出ます。

Dify のインストールと設定

面倒なので root で作業する。

sudo -i

1. Dify 1.0.0 をクローンする

git clone https://github.com/langgenius/dify.git --branch 1.0.0 

2. Dify の設定

cd dify/docker
cp .env.example .env
cp docker-compose.yaml docker-compose.yaml.org   # バックアップとしてコピーしておく

.env の末尾に以下の設定を追加する (環境変数と競合するので MY_ を付けています。特に NO_PROXY の設定に重要)

vi .env
# Proxy
MY_HTTP_PROXY=http://192.168.100.1:8080
MY_HTTPS_PROXY=http://192.168.100.1:8080
MY_NO_PROXY=localhost,127.0.0.1,dify.local,weaviate,qdrant,lindorm,unstructured,sandbox,ssrf_proxy,elasticsearch,kibana,plugin_daemon,172.18.0.0/16

docker-compose.yaml を編集して。以下の proxy の設定を追記する。

      HTTP_PROXY: ${MY_HTTP_PROXY}
HTTPS_PROXY: ${MY_HTTPS_PROXY}
NO_PROXY: ${MY_NO_PROXY}

追記する場所は、services: の次のサービスの environment: のところに入れていきます。(全部必要かどうかは不明。api は最低限必須。)

  • api: (必須)
  • worker:
  • web:
  • db ?
  • redis: ?
  • plugin_daemon: (必須)
  • ssrf_proxy:
  • nginx:
  • weaviate:
  • qdrant: ?
  • pgvector: ?
  • pgvecto-rs: ?
  • chroma: ?
  • oceanbase: ?
  • oracle: ?
  • elasticsearch: ?
  • kibana: ? (※ もともと NO_PROXY があるので、オリジナルはコメントアウトする)

※ 下8個はいらなそうに見えたのがだ、なかったらプラグインがインストールできなかった(個別の確認はしていません)

※ PROXYの設定を付けられないのもあります。(sandbox, cerbot, couchbase-server,etcd,minio,milvus-standalone,opensearch,opensearch-dashboards,myscale,unstructured)

api はこんな感じになります。同様に残り16個書きます。

services:
  # API service
  api:
    image: langgenius/dify-api:1.0.0
    restart: always
    environment:
      # Use the shared environment variables.
      <<: *shared-api-worker-env
      # Startup mode, 'api' starts the API server.
      MODE: api
      SENTRY_DSN: ${API_SENTRY_DSN:-}
      SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}      SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}      PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800}
      INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}      HTTP_PROXY: ${MY_HTTP_PROXY}
      HTTPS_PROXY: ${MY_HTTPS_PROXY}
      NO_PROXY: ${MY_NO_PROXY}
    depends_on:
      - db
      - redis
    volumes:
      # Mount the storage directory to the container, for storing user files.      - ./volumes/app/storage:/app/api/storage
    networks:
      - ssrf_proxy_network
      - default

ssrf_proxy の squid に proxy を設定

vi ssrf_proxy/squid.conf.template

以下のように記入

赤字のところを追記。青字の部分は自分の環境に合わせて書き換えます。

:
:
################################## Proxy Server ################################
http_port ${HTTP_PORT}
coredump_dir ${COREDUMP_DIR}
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims
refresh_pattern \/InRelease$ 0 0% 0 refresh-ims
refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims
refresh_pattern .               0       20%     4320

# cache_dir ufs /var/spool/squid 100 16 256
# upstream proxy, set to your own upstream proxy IP to avoid SSRF attacks
# cache_peer 172.1.1.1 parent 3128 0 no-query no-digest no-netdb-exchange default

# 上位プロキシを設定(外部ネットワークへのアクセスを有効化)
# ただし、sandbox は直接接続するようにする
cache_peer 192.168.100.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

################################## Reverse Proxy To Sandbox ################################
http_port ${REVERSE_PROXY_PORT} accel vhost
cache_peer ${SANDBOX_HOST} parent ${SANDBOX_PORT} 0 no-query originserver
acl src_all src all
http_access allow src_all

3. docker の起動

docker compose up -d

初回起動時は、コンテナをダウンロードしてくるので少し時間がかかります。

以下のようにネットワークが2つと、コンテナが 10個起動されます。

4. 起動後の初回アクセス

以下のURL にブラウザからアクセスします。

http://<hostのIP>/

初期設定画面が出るので、ユーザーを登録します。

ユーザー登録後、ログインします。

5. LLM を登録

  1. 右上のユーザーアイコンから設定を選択する
  2. 左の列から「モデルプロバイダー」を選択する
  3. モデルプロバイダーもプラグインになっているので、利用するものを選択してインストールする
  4. 必要に応じてAPIキーなどを設定する
  5. システムモデルの設定をする
    • 最低限、システム推論モデルと埋め込みモデルを設定する

6. 実験する

チャットボットかチャットフローを作って試す。

停止・再起動

1. docker の停止

docker compose down

2. 再起動

docker compose down
docker compose up -d

3. 特定コンテナだけ再起動

docker compose restart api

または

docker restart docker-api-1

デバッグ

上手くいかない時の考え方と対処法

考えれる主な原因

  • proxy の設定ミス、proxy の設定もれ
  • NO_PROXY の設定もれ
  • firewall や iptables の設定
  • 上位の Porxy の制限に引っかかっている

可能なら proxy を立てる

Proxy のログを見ると分かりやすいので、host に squid で proxy を立てて、ログを見れるようにすると原因が分かりやすい。

/etc/squid/squid.conf

# 上位プロキシを設定
cache_peer 192.168.100.1 parent 8080 0 no-query default
never_direct allow all

# ログを有効化
cache_log /var/log/squid/cache.log
access_log /var/log/squid/access.log

※ 会社の proxy などは、proxy サーバからの接続を拒否する場合があるので注意が必要

以下のようにして、ログを監視。

tail -f /var/log/squid/access.log

見るべき場所

docker-api-1 のPROXY設定を確認

docker exec -it docker-api-1 env | grep PROXY
SANDBOX_HTTPS_PROXY=http://ssrf_proxy:3128
SANDBOX_HTTP_PROXY=http://ssrf_proxy:3128
HTTPS_PROXY=http://192.168.100.1:8080
SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128
HTTP_PROXY=http://192.168.100.1:8080
SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128
NO_PROXY=localhost,127.0.0.1,dify.local,weaviate,qdrant,lindorm,unstructured,sandbox,ssrf_proxy,elasticsearch,kibana,plugin_daemon,172.18.0.0/16
SSRF_REVERSE_PROXY_PORT=8194
NGINX_PROXY_SEND_TIMEOUT=3600s
NGINX_PROXY_READ_TIMEOUT=3600s

docker-api-1 から外部に出れるか確認 (URL はどこか繋がりそうなところ)

docker exec -it docker-api-1 curl -I https://api.openai.com

ここまでは最低限、通る必要がある

docker-api-1 のエラーログを監視する

docker logs docker-api-1 --tail=50 -f

この状態で画面を操作してみる