DifyをCloudRunとsupabase、upstashを使ってほぼ無料でデプロイする方法
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
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はこの拡張機能が入ってなさそうなので使えないかも
ストレージのことを忘れていたが、CloudRunにデプロイするという関係上localのストレージ領域は使えない。
RSA鍵を生成しているらしく、ストレージの指定がないとモデルの選定などができないためこの設定は必須。
GCPファミリーということでGoogle Cloud Storageを使いたいところではあるが、以下の不具合があるためそのままでは使えない。
以下のPRでパッチリクエストを作成してみた。
上記がマージされれば、Cloud Runに紐づけるService Accountがバケットへのアクセス権限を持っていればストレージを使えるはず。
マージされるまではデフォルトのImageは使えないので、以下を使う
DifyはDB以外にもworker、api、web、nginxといったコンテナを立てる必要がある。
この辺はCloudRunのマルチコンテナを使うことで解決できる。
yamlを作成してデプロイする方法が推奨されるが、面倒なのでgcloud cliを使ってデプロイする方法を使う。(Makefile変えるだけで使えるしね)
デフォルトのnginxの設定では、docker compose upを想定したプロキシー設定になっているので、そのままではCloud Runのマルチコンテナは使えない。
/docker/nginx/conf.d/default.conf
の
http://api:5001
みたいになっているところ(コンテナ名をホスト名に指定しているところ)を127.0.0.1に変更する必要がある。
そのまま書き換えるとナンセンスなので、nginxのdockerで使える templates を使うと汎用的に使えてよい
この辺を変更して以下にimageを反映している。
2024/05/15時点で、PRがマージされたので、次のバージョンからは
の対応は必要なくなりそうenvの設定の話だが、SecretManagerに.envファイル化したものをアップロードしておき、それをpath指定でコンテナにマウントするのが手っ取り早そう。