Open7

DifyをCloudRunとsupabase、upstashを使ってほぼ無料でデプロイする方法

kotamatkotamat

DifyはDBにpostgres、キャッシュにRedisを使っている。
また、ベクトルDBは複数選択可能ではあるが、Postgresのvectorを使うことも可能なので、postgresで統一させちゃう。
これらをRDSとかで立てようとするとイニシャルで料金がかかってしまうので避けたい。
supabaseはPostgresを安価に、upstashはRedisを安価に使えるので、これらを使う。

まず、supabaseとupstashでアカウントを作成し、DBを作成する。

作成するうえで特に困ることはないので、そのままコンソールをポチポチするだけでOK

supabase: https://supabase.com/
upstash: https://upstash.com/

作成するとHOSTやpasswordなど必要な情報がコンソールに表示されるので、それをdifyのdocker-compose.yamlに反映させる。

変更箇所は結構多く、以下をapiとworkerそれぞれに適用する必要がある

      DB_USERNAME: postgres
      DB_PASSWORD: difyai123456
      DB_HOST: db
      DB_PORT: 5432
      DB_DATABASE: dify
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_USERNAME: ''
      REDIS_PASSWORD: difyai123456
      REDIS_DB: 0
      REDIS_USE_SSL: 'false'
      CELERY_BROKER_URL: redis://:difyai123456@redis:6379/1
      VECTOR_STORE: weaviate
      PGVECTOR_HOST: pgvector
      PGVECTOR_PORT: 5432
      PGVECTOR_USER: postgres
      PGVECTOR_PASSWORD: difyai123456
      PGVECTOR_DATABASE: dify
kotamatkotamat

VECTOR_STOREをpgvecto_rsで使う場合は以下を変える

      PGVECTO_RS_HOST: pgvector
      PGVECTO_RS_PORT: 5432
      PGVECTO_RS_USER: postgres
      PGVECTO_RS_PASSWORD: difyai123456
      PGVECTO_RS_DATABASE: dify

ただ、supabaseはこの拡張機能が入ってなさそうなので使えないかも

kotamatkotamat

ストレージのことを忘れていたが、CloudRunにデプロイするという関係上localのストレージ領域は使えない。
RSA鍵を生成しているらしく、ストレージの指定がないとモデルの選定などができないためこの設定は必須。
GCPファミリーということでGoogle Cloud Storageを使いたいところではあるが、以下の不具合があるためそのままでは使えない。
以下のPRでパッチリクエストを作成してみた。
https://github.com/langgenius/dify/pull/4296

上記がマージされれば、Cloud Runに紐づけるService Accountがバケットへのアクセス権限を持っていればストレージを使えるはず。

マージされるまではデフォルトのImageは使えないので、以下を使う
https://hub.docker.com/repository/docker/kotamat/dify-api/general

kotamatkotamat

デフォルトのnginxの設定では、docker compose upを想定したプロキシー設定になっているので、そのままではCloud Runのマルチコンテナは使えない。

/docker/nginx/conf.d/default.conf

http://api:5001
みたいになっているところ(コンテナ名をホスト名に指定しているところ)を127.0.0.1に変更する必要がある。

そのまま書き換えるとナンセンスなので、nginxのdockerで使える templates を使うと汎用的に使えてよい

https://hub.docker.com/_/nginx#:~:text=Using environment variables in nginx configuration (new in 1.19)

この辺を変更して以下にimageを反映している。
https://hub.docker.com/repository/docker/kotamat/dify-nginx/general