Herokuへのデプロイ
このガイドでは、PostgreSQLでPrisma ORMを使用するNode.jsサーバーをセットアップし、Herokuにデプロイします。このアプリケーションはREST APIを公開し、Prisma Clientを使用してデータベースからレコードのフェッチ、作成、削除を処理します。
Herokuは、サービスとしてのクラウドプラットフォーム(PaaS)です。一般的なサーバーレスデプロイモデルとは対照的に、Herokuでは、リクエストがなくてもアプリケーションは常に実行されています。これは、PostgreSQLデータベースの接続制限のためにいくつかの利点があります。詳細については、一般的なデプロイメントドキュメントを確認してください。
通常、Herokuはコミット時の自動デプロイのためにGitリポジトリと統合されています。GitHubリポジトリからHerokuにデプロイするか、ソースをHerokuがアプリごとに作成するGitリポジトリにプッシュすることでデプロイできます。このガイドでは、後者のアプローチを使用します。つまり、コードをHeroku上のアプリのリポジトリにプッシュすると、ビルドがトリガーされ、アプリケーションがデプロイされます。
このアプリケーションには、次のコンポーネントがあります。
- バックエンド:PostgreSQLデータベース(Herokuでホストされているなど)に対してデータベース操作を処理するためにPrisma Clientを使用するリソースエンドポイントを備えたExpress.jsで構築されたNode.js REST API。
- フロントエンド:APIと対話するための静的なHTMLページ。
このガイドの焦点は、Prisma ORMを使用してプロジェクトをHerokuにデプロイする方法を示すことです。出発点は、Prisma Herokuの例です。これには、いくつかの事前構成されたRESTエンドポイントとシンプルなフロントエンドを備えたExpress.jsサーバーが含まれています。
注:ガイド全体を通して、ステップを正しく実行したかどうかを検証できるさまざまなチェックポイントがあります。
HerokuへのGraphQLサーバーのデプロイに関する注記
例ではRESTを使用していますが、GraphQLサーバーにも同じ原則が適用されます。主な違いは、RESTのようにリソースごとにルートを持つのではなく、通常は単一のGraphQL APIエンドポイントを持つことです。
前提条件
- Herokuアカウント。
- Heroku CLIがインストールされていること。
- Node.jsがインストールされていること。
- PostgreSQL CLI
psql
がインストールされていること。
注:Herokuは無料プランを提供していないため、課金情報が必要です。
Prisma ORMワークフロー
Prisma ORMの中核は、Prismaスキーマです。これは、データモデルとその他のPrisma ORM関連の構成を定義する宣言型構成です。Prismaスキーマは、Prisma ClientとPrisma Migrateの両方にとって信頼できる唯一の情報源でもあります。
このガイドでは、Prisma Migrateを使用してデータベーススキーマを作成します。Prisma MigrateはPrismaスキーマに基づいており、データベースに対して実行される.sql
マイグレーションファイルを生成することで機能します。
Migrateには、2つの主要なワークフローが付属しています。
prisma migrate dev
を使用したローカル開発中のマイグレーションの作成と適用prisma migrate deploy
を使用した生成されたマイグレーションのプロダクションへの適用
簡潔にするために、このガイドでは、prisma migrate dev
でマイグレーションがどのように作成されるかについては説明しません。むしろ、プロダクションワークフローに焦点を当て、例のコードに含まれているPrismaスキーマとSQLマイグレーションを使用します。
Herokuのリリースフェーズを使用して、アプリケーションが開始される前にマイグレーションが適用されるように、prisma migrate deploy
コマンドを実行します。
Prisma Migrateでマイグレーションがどのように作成されるかの詳細については、最初から始めるガイドを確認してください。
1. 例をダウンロードして依存関係をインストールする
ターミナルを開き、任意の場所に移動します。アプリケーションコードを保持するディレクトリを作成し、例のコードをダウンロードします。
mkdir prisma-heroku
cd prisma-heroku
curl https://codeload.github.com/prisma/prisma-examples/tar.gz/latest | tar -xz --strip=3 prisma-examples-latest/deployment-platforms/heroku
チェックポイント: ls -1
は以下を示すはずです。
ls -1
Procfile
README.md
package.json
prisma
public
src
依存関係をインストールします。
npm install
注:
Procfile
は、Herokuにアプリケーションを起動するために必要なコマンド(つまり、npm start
)と、リリースフェーズ中に実行するコマンド(つまり、npx prisma migrate deploy
)を伝えます。
2. アプリケーション用のGitリポジトリを作成する
前のステップで、コードをダウンロードしました。このステップでは、デプロイのためにHerokuにプッシュできるように、コードからリポジトリを作成します。
これを行うには、ソースコードフォルダからgit init
を実行します。
git init
> Initialized empty Git repository in /Users/alice/prisma-heroku/.git/
main
ブランチをデフォルトブランチとして使用するには、次のコマンドを実行します。
git branch -M main
リポジトリが初期化されたら、ファイルを追加してコミットします。
git add .
git commit -m 'Initial commit'
チェックポイント: git log -1
はコミットを示すはずです。
git log -1
commit 895534590fdd260acee6396e2e1c0438d1be7fed (HEAD -> main)
3. Heroku CLIログイン
CLIでHerokuにログインしていることを確認してください。
heroku login
これにより、ターミナルからHerokuにデプロイできます。
チェックポイント: heroku auth:whoami
はユーザー名を表示するはずです。
heroku auth:whoami
> your-email
4. Herokuアプリを作成する
アプリケーションをHerokuにデプロイするには、アプリを作成する必要があります。これは、次のコマンドで実行できます。
heroku apps:create your-app-name
注:
your-app-name
の代わりに、任意のユニークな名前を使用してください。
チェックポイント: HerokuアプリのURLとリポジトリが表示されるはずです。
heroku apps:create your-app-name
> Creating ⬢ your-app-name... done
> https://your-app-name.herokuapp.com/ | https://git.heroku.com/your-app-name.git
Herokuアプリを作成すると、Herokuが作成したgitリモートがローカルリポジトリに追加されます。このリモートにコミットをプッシュすると、デプロイがトリガーされます。
チェックポイント: git remote -v
は、アプリケーションのHeroku gitリモートを表示するはずです。
heroku https://git.heroku.com/your-app-name.git (fetch)
heroku https://git.heroku.com/your-app-name.git (push)
herokuリモートが表示されない場合は、次のコマンドを使用して追加します。
heroku git:remote --app your-app-name
5. PostgreSQLデータベースをアプリケーションに追加する
Herokuでは、アプリケーションの一部としてPostgreSQLデータベースをプロビジョニングできます。
次のコマンドでデータベースを作成します。
heroku addons:create heroku-postgresql:hobby-dev
チェックポイント: データベースが作成されたことを確認するには、以下が表示されるはずです。
Creating heroku-postgresql:hobby-dev on ⬢ your-app-name... free
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pg:copy
Created postgresql-parallel-73780 as DATABASE_URL
注:Herokuは、アプリがHerokuで実行されているときに
DATABASE_URL
環境変数を自動的に設定します。Prisma ORMは、Prismaスキーマ(prisma/schema.prisma
)のdatasourceブロックでenv("DATABASE_URL")
として宣言されているため、この環境変数を使用します。
6. プッシュしてデプロイする
Herokuアプリリポジトリに変更をプッシュして、アプリをデプロイします。
git push heroku main
これにより、ビルドがトリガーされ、アプリケーションがHerokuにデプロイされます。Herokuは、npx prisma migrate deploy
コマンドも実行し、アプリをデプロイする前にデータベーススキーマを作成するためのマイグレーションを実行します(Procfile
のrelease
ステップで定義されているように)。
チェックポイント: git push
は、ビルドおよびリリースフェーズからのログを出力し、デプロイされたアプリのURLを表示します。
remote: -----> Launching...
remote: ! Release command declared: this new release will not be available until the command succeeds.
remote: Released v5
remote: https://your-app-name.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
remote: Running release command...
remote:
remote: Prisma schema loaded from prisma/schema.prisma
remote: Datasource "db": PostgreSQL database "your-db-name", schema "public" at "your-db-host.compute-1.amazonaws.com:5432"
remote:
remote: 1 migration found in prisma/migrations
remote:
remote: The following migration have been applied:
remote:
remote: migrations/
remote: └─ 20210310152103_init/
remote: └─ migration.sql
remote:
remote: All migrations have been successfully applied.
remote: Waiting for release.... done.
注:Herokuは、アプリケーションがバインドされている
PORT
環境変数も設定します。
7. デプロイされたアプリケーションをテストする
プレビューURLを介してデプロイしたAPIと対話するために、静的なフロントエンドを使用できます。
ブラウザでプレビューURLを開きます。URLはhttps://APP_NAME.herokuapp.com
のようになります。以下が表示されるはずです。
ボタンを使用すると、REST APIにリクエストを送信してレスポンスを表示できます。
- APIステータスの確認:
{"up":true}
を返すREST APIステータスエンドポイントを呼び出します。 - シードデータ:テスト用の
user
とpost
でデータベースをシードします。作成されたユーザーを返します。 - フィードをロード:データベース内のすべての
users
を関連するprofiles
とともにロードします。
Prisma ClientのAPIの詳細については、src/index.js
ファイルのルートハンドラーを参照してください。
heroku logs --tail
コマンドを使用して、アプリケーションのログを表示できます。
2020-07-07T14:39:07.396544+00:00 app[web.1]:
2020-07-07T14:39:07.396569+00:00 app[web.1]: > prisma-heroku@1.0.0 start /app
2020-07-07T14:39:07.396569+00:00 app[web.1]: > node src/index.js
2020-07-07T14:39:07.396570+00:00 app[web.1]:
2020-07-07T14:39:07.657505+00:00 app[web.1]: 🚀 Server ready at: https://#:12516
2020-07-07T14:39:07.657526+00:00 app[web.1]: ⭐️ See sample requests: http://pris.ly/e/ts/rest-express#3-using-the-rest-api
2020-07-07T14:39:07.842546+00:00 heroku[web.1]: State changed from starting to up
Heroku固有の注意点
このガイドで取り上げているHerokuに関連する実装の詳細と、繰り返す価値のあるものがいくつかあります。
- ポートバインディング:Webサーバーは、接続を受け入れることができるようにポートにバインドします。Herokuにデプロイする場合、
PORT
環境変数はHerokuによって設定されます。デプロイ後にアプリケーションがリクエストを受け入れることができるように、process.env.PORT
にバインドしてください。一般的なパターンは、process.env.PORT
へのバインドを試行し、次のようにプリセットポートにフォールバックすることです。
const PORT = process.env.PORT || 3000
const server = app.listen(PORT, () => {
console.log(`app running on port ${PORT}`)
})
- データベースURL:Herokuのプロビジョニングプロセスの一部として、
DATABASE_URL
構成変数がアプリの構成に追加されます。これには、アプリがデータベースにアクセスするために使用するURLが含まれています。schema.prisma
ファイルがenv("DATABASE_URL")
を使用していることを確認して、Prisma Clientがデータベースに正常に接続できるようにしてください。
まとめ
おめでとうございます!Node.jsアプリをPrisma ORMとともにHerokuに正常にデプロイしました。
例のソースコードは、このGitHubリポジトリにあります。
Prisma ClientのAPIの詳細については、src/index.js
ファイルのルートハンドラーを参照してください。