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 update
sudo 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個起動されます。
Network docker_default
Network docker_ssrf_proxy_network
Container docker-sandbox-1
Container docker-ssrf_proxy-1
Container docker-weaviate-1
Container docker-redis-1
Container docker-web-1
Container docker-plugin_daemon-1
Container docker-db-1
Container docker-api-1
Container docker-worker-1
Container docker-nginx-1
4. 起動後の初回アクセス
以下のURL にブラウザからアクセスします。
http://<hostのIP>/
初期設定画面が出るので、ユーザーを登録します。
ユーザー登録後、ログインします。
5. LLM を登録
- 右上のユーザーアイコンから設定を選択する
- 左の列から「モデルプロバイダー」を選択する
- モデルプロバイダーもプラグインになっているので、利用するものを選択してインストールする
- 必要に応じてAPIキーなどを設定する
- システムモデルの設定をする
- 最低限、システム推論モデルと埋め込みモデルを設定する
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
この状態で画面を操作してみる