1
0

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 で外部PostgreSQL(Aurora/RDS等)に切り替えたら、SSL付近でつまづいた話

1
Posted at

はじめに

セルフホスト版のDifyをEC2上で動かしていて、DB をデフォルトのローカルPostgreSQLコンテナから、外部のマネージドPostgreSQL(Aurora/RDS等)へ切り替えようとしたところ、SSLの設定で引っかかって起動で詰まったのでメモです。

何が起きたか(症状)

やりたいこと:

  • EC2上で動かしているDify のDB を外部PostgreSQL(Aurora/RDS等)へ切り替えたい

やったこと:

  • dify/docker/.envDB_HOST / DB_USERNAME / DB_PASSWORD などを外部DBに変更

詰まったこと:

  • 起動時に 「SSL」系のエラーplugin_daemon がDB接続に失敗

原因(整理)

原因はだいたいこの3つでした。

  1. セルフホストのデフォルト構成では、ローカルPostgresへ SSLなし相当で繋がる前提
  2. 一方で接続先(Aurora/RDS等)の設定・ポリシーで SSL接続が必須になっていた
  3. 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_MODErequire にしないと接続できません。
DB_SSL_MODE の想定値は disable / require です。参考:dify-plugin-daemon

Dify の docker-compose.yaml は 自動生成で、直接編集しても再生成で消えます。
公式ファイルの先頭にも「直接編集するな。.env.exampledocker-compose-template.yaml を更新して再生成しろ」と明記されています。

そのため、以下の 4点セットで 「生成元 → 再生成」 まで行います。

  1. .env.exampleDB_SSL_MODE を追加
  2. .env に実値(require)を設定
  3. docker-compose-template.yamlplugin_daemonDB_SSL_MODE を追加
  4. generate_docker_compose を実行して docker-compose.yaml を再生成

1. docker/.env.exampleDB_SSL_MODE を追加

generate_docker_compose.env.example を読んで x-shared-env(共通環境変数ブロック)を作るので、ここにキーが無いと生成物に載りません。

docker/.env.example
# 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. .envDB_SSL_MODE=require を設定

dify/docker/.env
 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.yamlplugin_daemonDB_SSL_MODE を追加

docker-compose-template.yaml
# 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.yamlDB_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.yamlenv.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

参考

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?