🤖

【Dify × heroku】DifyのDockerデプロイに関するWiki

2024/10/15に公開

概要

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