【Dify × heroku】DifyのDockerデプロイに関するWiki
概要
DifyをHeroku上で動作させるために、APIとWebの2つのDockerfileを利用します。データベースはHerokuのPostgreSQLアドオンを使用します。
追記に書きましたが、このやり方はバッドプラクティスです。
おすすめしないです笑
背景
本当はDockerComopseがサポートされている環境で、Difyの恩恵にあやかりたかった。
herokuはDockerComposeはサポートしておらず、Dockerfileごとのデプロイしかできないため、
やむを得ず労力を割くという流れ。
(ECSとか使えるならそっちの方が楽だしスマート。)
手順
1. Herokuアプリケーションの作成
まず、DifyのAPI用とWeb用の2つのアプリケーションを作成します。
# API用アプリケーションを作成
heroku create dify-api-app
Web用アプリケーションを作成
heroku create dify-web-app
2. PostgreSQLアドオンの追加
API側のアプリケーションにPostgreSQLアドオンを追加します。
私はherokuのGUIからやりました。
これにより、HerokuはDATABASE_URL環境変数を自動的に設定します。
3. APIのDockerfileのデプロイ
DifyのAPI用のDockerfileをHerokuにデプロイします。以下の手順で実行します。
# API用アプリケーションをHerokuコンテナにログイン
heroku container:login
# API用DockerイメージをHerokuにプッシュ
heroku container:push web --app dify-api-app
# デプロイ
heroku container:release web --app dify-api-app
エラーが出る場合
デプロイ時に以下のエラーが発生する場合があります。
Error: This command is for Docker apps only. Switch stacks by running heroku stack:set container. Or, to deploy ⬢ dify-api-app with heroku-22, run git push heroku main instead.
このエラーは、Herokuがデフォルトでコンテナを利用したデプロイをサポートしていないため発生します。この場合、次の手順でスタックを変更します。
Herokuのスタックをcontainerに変更:
heroku stack:set container --app dify-api-app
スタックを変更した後、再度Dockerイメージをプッシュします。
heroku container:push web --app dify-api-app
最後にアプリケーションをリリースします。
heroku container:release web --app dify-api-app
4. WebのDockerfileのデプロイ
同様に、DifyのWeb用Dockerfileをdify-web-appにデプロイします。
# Web用アプリケーションをHerokuコンテナにログイン
heroku container:login
# Web用DockerイメージをHerokuにプッシュ
heroku container:push web --app dify-web-app
# デプロイ
heroku container:release web --app dify-web-app
5. 環境変数の設定
必要に応じて、環境変数を設定します。例えば、Redisが必要な場合は次のように設定します。
私はGUIでやります。
必要な環境変数を設定
これも私はGUIでやりますが。
heroku config:set REDIS_URL=redis://:password@redis_host:6379 --app dify-api-app
6. アプリケーションの確認
それぞれのアプリケーションが正しく動作しているか確認します。
# APIアプリケーションのログを確認
heroku logs --tail --app dify-api-app
# Webアプリケーションのログを確認
heroku logs --tail --app dify-web-app
また、以下のコマンドでデプロイされたアプリケーションをブラウザで確認できます。
# APIをブラウザで開く
heroku open --app dify-api-app
# Webをブラウザで開く
heroku open --app dify-web-app
まとめ
Herokuに2つのアプリケーションを作成し、APIとWebのDockerfileをそれぞれデプロイします。
API側でPostgreSQLアドオンを利用し、Web側はフロントエンドとして機能します。
必要に応じて、Redisやその他の環境変数も設定します。
これにより、Heroku上でDifyのAPIとWebをDockerを使ってデプロイできます。
追記
環境変数の設定してて思ったが、、、ファイルの扱いとか色々面倒だな。
やっぱりこのやり方はバッドプラクティスだと思う。。。
Discussion