跳到主內容

部署到 Heroku

在本指南中,你將設定一個使用 Prisma ORM 和 PostgreSQL 的 Node.js 伺服器並將其部署到 Heroku。該應用程式暴露了一個 REST API,並使用 Prisma Client 來處理從資料庫中獲取、建立和刪除記錄的操作。

Heroku 是一個雲平臺即服務 (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。起點將是Prisma Heroku 示例,它包含一個帶有幾個預配置 REST 端點和一個簡單前端的 Express.js 伺服器。

注意:指南中的各種檢查點可讓你驗證操作步驟是否正確。

關於將 GraphQL 伺服器部署到 Heroku 的說明

雖然示例使用的是 REST,但相同的原則也適用於 GraphQL 伺服器,主要區別在於 GraphQL 伺服器通常只有一個 GraphQL API 端點,而不是像 REST 那樣為每個資源提供一個路由。

先決條件

  • Heroku 賬戶。
  • 已安裝 Heroku CLI
  • 已安裝 Node.js。
  • 已安裝 PostgreSQL CLI psql

注意:Heroku 不提供免費計劃,因此需要提供賬單資訊。

Prisma ORM 工作流

Prisma ORM 的核心是 Prisma schema —— 一個宣告性配置,你可以在其中定義資料模型以及其他與 Prisma ORM 相關的配置。Prisma schema 也是 Prisma Client 和 Prisma Migrate 的單一事實來源。

在本指南中,你將使用 Prisma Migrate 來建立資料庫 schema。Prisma Migrate 基於 Prisma schema,透過生成並在資料庫上執行 .sql 遷移檔案來工作。

Migrate 包含兩個主要工作流:

  • 在本地開發期間使用 prisma migrate dev 建立和應用遷移
  • 使用 prisma migrate deploy 將生成的遷移應用到生產環境

為簡潔起見,本指南不介紹如何使用 prisma migrate dev 建立遷移。相反,它側重於生產工作流,並使用示例程式碼中包含的 Prisma schema 和 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 schema (prisma/schema.prisma) 的 datasource 塊中透過 env("DATABASE_URL") 宣告。

6. 推送部署

透過將更改推送到 Heroku 應用倉庫來部署應用

git push heroku main

這將觸發構建並將你的應用程式部署到 Heroku。Heroku 還將執行 npx prisma migrate deploy 命令,該命令在部署應用之前執行遷移以建立資料庫 schema(如 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 狀態:將呼叫 REST API 狀態端點,該端點返回 {"up":true}
  • 填充資料:將使用測試 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 時,Heroku 會設定 PORT 環境變數。請確保你繫結到 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 能夠成功連線到資料庫。

總結

恭喜!你已成功將使用 Prisma ORM 的 Node.js 應用部署到 Heroku。

你可以在此 GitHub 倉庫中找到示例的原始碼。

要深入瞭解 Prisma Client 的 API,請檢視 src/index.js 檔案中的路由處理程式。

© . This site is unofficial and not affiliated with Prisma Data, Inc.