部署到 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 页面。
本指南的重点是展示如何使用 Prisma ORM 将项目部署到 Heroku。 起点将是Prisma Heroku 示例,其中包含一个 Express.js 服务器,其中包含几个预配置的 REST 端点和一个简单的前端。
注意: 本指南中各种检查点允许您验证是否正确执行了这些步骤。
关于将 GraphQL 服务器部署到 Heroku 的说明
虽然该示例使用 REST,但相同的原则适用于 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 remote 添加到您的本地存储库。 将提交推送到此 remote 将触发部署。
检查点: git remote -v
应显示您应用程序的 Heroku git remote
heroku https://git.heroku.com/your-app-name.git (fetch)
heroku https://git.heroku.com/your-app-name.git (push)
如果您没有看到 heroku remote,请使用以下命令添加它
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
命令,该命令执行迁移以在部署应用之前创建数据库模式(如 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 状态:将调用 REST API 状态端点,该端点返回
{"up":true}
。 - 种子数据:将使用测试
user
和post
填充数据库。返回创建的用户。 - 加载 feed:将加载数据库中所有
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: http://localhost: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 可以成功连接到数据库。
总结
恭喜!您已成功将带有 Prisma ORM 的 Node.js 应用部署到 Heroku。
您可以在此 GitHub 仓库中找到该示例的源代码。
要更深入地了解 Prisma Client 的 API,请查看 src/index.js
文件中的路由处理程序。