はじめに
セルフホスト版のDifyをEC2上で動かしていて、DB をデフォルトのローカルPostgreSQLコンテナから、外部のマネージドPostgreSQL(Aurora/RDS等)へ切り替えようとしたところ、SSLの設定で引っかかって起動で詰まったのでメモです。
何が起きたか(症状)
やりたいこと:
- EC2上で動かしているDify のDB を外部PostgreSQL(Aurora/RDS等)へ切り替えたい
やったこと:
-
dify/docker/.envのDB_HOST/DB_USERNAME/DB_PASSWORDなどを外部DBに変更
詰まったこと:
- 起動時に 「SSL」系のエラーで
plugin_daemonがDB接続に失敗
原因(整理)
原因はだいたいこの3つでした。
- セルフホストのデフォルト構成では、ローカルPostgresへ SSLなし相当で繋がる前提
- 一方で接続先(Aurora/RDS等)の設定・ポリシーで SSL接続が必須になっていた
-
plugin_daemonにはDB_SSL_MODEがあるが、Dify側のドキュメントや.env.exampleだけ見てると気づきにくい
実際、Difyの docker/.env.example にはDB接続情報(DB_TYPE/DB_HOST/...)は載っていても、少なくとも現行の例(v1.11.0)では DB_SSL_MODE は見当たりません。
👇️DB_SSL_MODE について書いてない。
解消法(結論)
plugin_daemon のDBが「SSL必須(強制)」な環境だと、DB_SSL_MODE を require にしないと接続できません。
DB_SSL_MODE の想定値は disable / require です。参考:dify-plugin-daemon
Dify の docker-compose.yaml は 自動生成で、直接編集しても再生成で消えます。
公式ファイルの先頭にも「直接編集するな。.env.example か docker-compose-template.yaml を更新して再生成しろ」と明記されています。
そのため、以下の 4点セットで 「生成元 → 再生成」 まで行います。
-
.env.exampleにDB_SSL_MODEを追加 -
.envに実値(require)を設定 -
docker-compose-template.yamlのplugin_daemonにDB_SSL_MODEを追加 -
generate_docker_composeを実行してdocker-compose.yamlを再生成
1. docker/.env.example に DB_SSL_MODE を追加
generate_docker_compose は .env.example を読んで x-shared-env(共通環境変数ブロック)を作るので、ここにキーが無いと生成物に載りません。
# Database type, supported values are `postgresql` and `mysql`
DB_TYPE=postgresql
# For MySQL, only `root` user is supported for now
DB_USERNAME=postgres
DB_PASSWORD=difyai123456
DB_HOST=db_postgres
DB_PORT=5432
DB_DATABASE=dify
+ DB_SSL_MODE=disable
2. .env に DB_SSL_MODE=require を設定
DB_TYPE=postgresql
DB_USERNAME=postgres
DB_PASSWORD=<パスワード>
DB_HOST=<Aurora等のエンドポイント>
DB_PORT=5432
DB_DATABASE=dify
+DB_SSL_MODE=require
3. docker-compose-template.yaml の plugin_daemon に DB_SSL_MODE を追加
# plugin daemon
plugin_daemon:
image: langgenius/dify-plugin-daemon:0.5.1-local
restart: always
environment:
# Use the shared environment variables.
<<: *shared-api-worker-env
DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin}
+ DB_SSL_MODE: ${DB_SSL_MODE:-disable}
SERVER_PORT: ${PLUGIN_DAEMON_PORT:-5002}
4. generate_docker_composeを実行して、docker-compose.yamlの再生成
以下を実行します。
cd dify/docker
python3 generate_docker_compose
生成後、docker-compose.yaml に DB_SSL_MODE が反映されたことを確認:
grep -n "DB_SSL_MODE" docker-compose.yaml
私の環境の場合、以下のように出力されました。
63: DB_SSL_MODE: ${DB_SSL_MODE:-disable}
917: DB_SSL_MODE: ${DB_SSL_MODE:-disable}
感想
👇️こちらには、SSL_MODEについて書いてあります。これを見つけることができなければ、ずっと接続できませんでした。南無阿弥陀仏。
というか、そもそもソースコードで対応しておいてよ😿
これ余談なんですけど・・・
使用するベクトルDBをTiDBに変更する際、該当箇所のコメントを見るとVECTOR_STORE=tidbと書けば動くように思えますが、実際は以下のようにtidb_vectorと書かなければ動きません。(接続できません)
# ------------------------------
# Vector Database Configuration
# ------------------------------
# The type of vector store to use.
# Supported values are `weaviate`, `oceanbase`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `opengauss`, `tablestore`,`vastbase`,`tidb`,`tidb_on_qdrant`,`baidu`,`lindorm`,`huawei_cloud`,`upstash`, `matrixone`, `clickzetta`, `alibabacloud_mysql`.
VECTOR_STORE=tidb_vector
↓そもそも、tidbすら記載なし。ドキュメントの更新が間に合っていないのでしょう😿
This document may be outdated. Please refer to the latest configuration files:
・ docker-compose.yaml
・ env.example
それなら、docker-compose-templete.yamlやenv.exampleの方は更新しておいてよ😿
ちなみに:rds.force_ssl=0 にすれば(暫定的に)すぐ繋がる
Aurora PostgreSQL の場合、
rds.force_ssl=1になっていると、クライアントが 非SSL(SSL off / no encryption) で接続しようとしたときに拒否されます。
そのため、DBクラスターパラメータグループでrds.force_ssl=0に変更すれば、非SSL接続も許可されるようになり、アプリ側のSSL設定なしでも とりあえず接続できる状態にできます。
ただし、これは 通信の暗号化を必須にしない(=安全性が下がる) 設定なので、検証や一時回避用途向けです。運用ではrds.force_ssl=1のまま、アプリ側でsslmode=require等を設定するほうが一般的です。
著:Copilot