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

Herokuへデプロイ

このガイドでは、Prisma ORMとPostgreSQLを使用するNode.jsサーバーをHerokuにセットアップし、デプロイします。このアプリケーションはREST APIを公開し、Prisma Clientを使用してデータベースからのレコードの取得、作成、削除を処理します。

HerokuはPlatform as a Service (PaaS) です。一般的なサーバーレスデプロイメントモデルとは対照的に、Herokuではリクエストがなくてもアプリケーションが常に実行され続けます。これは、PostgreSQLデータベースの接続制限によりいくつかの利点があります。詳細については、一般的なデプロイメントのドキュメントを確認してください。

通常、Herokuはコミット時の自動デプロイのためにGitリポジトリと統合します。GitHubリポジトリからHerokuにデプロイすることも、ソースをHerokuがアプリごとに作成するGitリポジトリにプッシュすることでも可能です。このガイドでは後者のアプローチを使用し、コードをHeroku上のアプリのリポジトリにプッシュすることで、ビルドがトリガーされ、アプリケーションがデプロイされます。

このアプリケーションは以下のコンポーネントで構成されています

  • バックエンド: Express.jsで構築されたNode.js REST API。Prisma Clientを使用してPostgreSQLデータベース(例:Herokuでホストされているもの)に対するデータベース操作を処理するリソースエンドポイントを持ちます。
  • フロントエンド: APIと対話するための静的HTMLページ。

architecture diagram

このガイドの焦点は、Prisma ORMを使用するプロジェクトをHerokuにデプロイする方法を示すことです。開始点となるのは、いくつかの事前設定されたRESTエンドポイントとシンプルなフロントエンドを含むExpress.jsサーバーが含まれているPrisma Herokuの例です。

注: ガイド全体に散りばめられた様々なチェックポイントにより、手順を正しく実行したかどうかを検証できます。

HerokuへのGraphQLサーバーのデプロイに関する注意点

この例ではRESTを使用していますが、同じ原則がGraphQLサーバーにも適用されます。主な違いは、RESTのようにリソースごとにルートがあるのではなく、通常は単一のGraphQL APIエンドポイントを持つ点です。

前提条件

  • Herokuアカウント。
  • Heroku CLIがインストールされていること。
  • Node.jsがインストールされていること。
  • PostgreSQL CLI `psql`がインストールされていること。

注: Herokuには無料プランがないため、請求情報の入力が必要です。

Prisma ORMワークフロー

Prisma ORMの核となるのは、データモデルやその他のPrisma ORM関連の設定を定義する宣言型設定であるPrismaスキーマです。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`のようになるはずです。以下が表示されるはずです

deployed-screenshot

ボタンを使用すると、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が含まれています。Prisma Clientがデータベースに正常に接続できるように、`schema.prisma`ファイルで`env("DATABASE_URL")`が使用されていることを確認してください。

まとめ

おめでとうございます!Prisma ORMを使用したNode.jsアプリをHerokuにデプロイすることに成功しました。

このサンプルのソースコードは、こちらのGitHubリポジトリで確認できます。

Prisma ClientのAPIについてさらに詳しく知るには、`src/index.js`ファイル内のルートハンドラを参照してください。

© . All rights reserved.