【问题标题】:Deploy server to heroku both dev and prod将服务器部署到heroku dev和prod
【发布时间】:2020-08-11 12:34:41
【问题描述】:

我有一个 Heroku 应用程序准备好并且可以运行,它连接到我的 github 存储库,并且我的 Node.js(准确地说是 NestJS)服务器项目上有一个 Procfile。 目前发生的情况是,每次我推送我的 repo 项目时,heroku 都会部署服务器:

web npm run start:prod

作为 CI/CD 过程的一部分,我的目标是创建 2 个部署的服务器:

  1. 当推送到 development 分支时 - 在这种情况下运行开发服务器版本
  2. 当推送到master 分支时,在这种情况下部署生产服务器(2 个不同的服务器)。

我的问题是实现这一目标的方法是什么?

我想我应该创建另一个 Heroku 应用程序并将其连接到我的 repo 的开发分支,但是我如何确保我在这里运行开发版本?我应该在这些分支上持有 2 个不同的 Procfiles 吗?我真的必须创建另一个 Heroku 应用程序还是有更好的方法?

【问题讨论】:

  • 这有点不同,Heroku 管道是关于将新代码推广到生产环境,而不是两个单独的分支,尽管它仍然是一个不错的解决方案。

标签: node.js heroku heroku-ci


【解决方案1】:

理想情况下,您永远不应该将您的应用的development 版本部署到公共环境中,因为除其他外,它可能会暴露您的安全漏洞,这些漏洞以后可能会在您的生产服务器上被利用。

您可能正在谈论的是我们所说的staging 环境。这是一个配置与production 完全相同的环境,但我们在将代码部署到production 之前对其进行测试。

Heroku 而言 - 是的,您实际上需要两个 Heroku 应用程序 - 一个用于 production,一个用于 staging

注意staging 环境应该与NODE_ENV=production 一起运行。

就 CI/CD 而言,我已将我的 CD 配置为部署到不同的 Heroku 应用程序,具体取决于向哪个分支推送。 development 转到我们的 staging 应用程序,master 转到我们的 production 应用程序。 (虽然为简单起见,我将分支重命名为 stagingproduction :D)。

我无法为您提供 GitHub Actions 的现成脚本,因为我使用的是 GitLab,尽管 CI/CD 在那里非常相似,但存在细微的差异,但 GutHub Actions 应该有if 的工作条件类似于:

if: github.ref == 'refs/heads/master'
 - dpl --provider=heroku --strategy=api --app=$HEROKU_PROD_APP_NAME --api-key=$HEROKU_PROD_API_KEY

此外,您不应该需要两个 Procfiles,因为如果您想确保您的代码在生产环境中的行为相同,则环境应该配置相同。

【讨论】:

  • 嘿,感谢您的回答,但是如果我也将登台设置为生产,有什么区别?最后我想要实现的是一个服务器 url,我可以调用 api 并且我不在乎用数据向它发送垃圾邮件,因为它将连接到“测试”数据库,而生产将连接到真正的数据库
  • staging 的想法是拥有一个与production 相同的测试环境,但使用不同的数据库,因此您可以在将它们部署到production 之前测试您的版本。通常,各个开发人员机器具有不同的设置、不同的库。数据库位于同一台机器上,文件存储在本地而不是在云上。有很多问题在开发中是无法解决的,但在staging 环境中可以。我们设置NODE_ENV=production 以确保类似生产的代码在那里运行,但我们将其连接到单独的暂存数据库。
  • 如何让它连接到不同的数据库?我正在使用配置来设置数据库数据卡(主机、端口、用户名等),当我使用 NODE_ENV=production 运行它时,它将连接到特定的数据库,我如何在使用 NODE_ENV=production 时将其连接到不同的数据库?
  • 您永远不应该将您的访问凭据放在您的代码中 - 这是一个安全风险。而是使用环境变量。您可以通过 Heroku 中的应用程序设置来设置环境变量,您可以在其中为每个应用程序指定不同的 DATABASE_URL。这样,您的不同应用程序(stagingproduction) 将具有不同的数据库配置,即使它们运行相同的代码也是如此。此外,您的代码中的错误不会导致 staging 应用程序使用 production 数据库,因为它不知道它的访问凭据是什么。
猜你喜欢
  • 2013-09-07
  • 1970-01-01
  • 2021-06-22
  • 2022-01-09
  • 2018-03-29
  • 2022-10-26
  • 2022-01-19
  • 2022-01-04
  • 2017-10-28
相关资源
最近更新 更多