メインコンテンツにスキップ

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ページ。

architecture diagram

このガイドの焦点は、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コマンドも実行し、アプリをデプロイする前にデータベーススキーマを作成するためのマイグレーションを実行します(Procfilereleaseステップで定義されているように)。

チェックポイント: 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のようになります。以下が表示されるはずです。

deployed-screenshot

ボタンを使用すると、REST APIにリクエストを送信してレスポンスを表示できます。

  • APIステータスの確認{"up":true}を返すREST APIステータスエンドポイントを呼び出します。
  • シードデータ:テスト用のuserpostでデータベースをシードします。作成されたユーザーを返します。
  • フィードをロード:データベース内のすべての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ファイルのルートハンドラーを参照してください。