问题 从同一个git仓库部署两个单独的heroku应用程序


在一个git仓库中,我有两个独立的应用程序(Web服务器和API服务器)。

如何将每个应用程序部署到自己的Heroku应用程序?

(因此有2个heroku应用程序,一个用于Web服务器,一个用于api服务器)

注意(在标记为重复之前): 有几个类似的问题。大多数处理部署  应用到  heroku应用程序 - 通常用于分段与生产。我正在寻求部署  应用程序  heroku应用程序。 (关于升级与生产的问题


5697
2018-01-04 10:25


起源



答案:


我对你的问题的理解是你有一个Git存储库,它包含两个完全独立的程序:一个API服务器和一个Web服务器。

记住这个假设,这是你想要做的,一步一步:

  1. 进入项目文件夹。
  2. 定义一个 Procfile 在项目的根目录。这将告诉Heroku如何运行您的Web服务器和您的API服务器。

以下是您可能想要的方式 Procfile 看(一个例子):

web: node web/index.js
api: node api/index.js

在我上面的例子中:我正在定义两种类型的Heroku dynos - 一种叫做 web 一个叫 api。对于每一个,您需要告诉Heroku运行什么命令来启动适当的服务器。在这个例子中,我会跑 node web/index.js 启动我的网站,和 node api/index.js 启动我的API服务。

  1. 创建两个新的Heroku应用程序。你可以通过运行来做到这一点 heroku create <desired-app-name> --remote <desired-app-name> 多次。 注意:The --remote flag将告诉Heroku为同一个repo中的每个应用程序创建一个Git遥控器。

  2. 接下来,您需要告诉Heroku在一个Heroku应用程序上运行您的实际Web应用程序,并在另一个Heroku应用程序上运行您的API服务。您可以使用Heroku CLI执行此操作:

    $ heroku ps:scale web=1 --remote webserver-app-name
    $ heroku ps:scale api=1 --remote apiserver-app-name
    

这些命令将:

  • 为您的网络服务器Heroku应用程序运行单个web dyno。
  • 为您的apiserver Heroku应用运行单个API dyno。

如您所见,使用 ps:scale 命令你可以控制Heroku将从你的命令运行什么类型的命令 Procfile,以及你想拥有多少个实例。

希望这有帮助!


9
2018-01-04 14:25



谢谢rdegges,我今天就试试吧。问题虽然 - 我会这么做 git push heroku-api master 和 git push heroku-web master 将我的主分支推送到每个单独的heroku应用程序? - Don P
啊,当你想要推动你的桅杆分支时,你会做: git push heroku-api master; git push heroku-web master; 将它部署到两个项目=)而不是通常的 git push heroku master 你会这样做,因为而不是 heroku 遥远的你现在有两个遥控器: heroku-web 和 heroku-api。希望有道理! - rdegges
这很棒,但您还需要以某种方式安装依赖项。我这样做是通过推杆 npm install 在脚本中从子文件夹运行我的应用程序。不完美,但我不知道如何在推动时这样做。 - Piotr Buda
你不必那样做。它会在推送时自动安装它们。 - rdegges
@rdegges这对我不起作用,因为Heroku说没有 web process type。我怎么能告诉Heroku,例如, api 是我的应用程序的Web进程类型? - Sergio Tapia


答案:


我对你的问题的理解是你有一个Git存储库,它包含两个完全独立的程序:一个API服务器和一个Web服务器。

记住这个假设,这是你想要做的,一步一步:

  1. 进入项目文件夹。
  2. 定义一个 Procfile 在项目的根目录。这将告诉Heroku如何运行您的Web服务器和您的API服务器。

以下是您可能想要的方式 Procfile 看(一个例子):

web: node web/index.js
api: node api/index.js

在我上面的例子中:我正在定义两种类型的Heroku dynos - 一种叫做 web 一个叫 api。对于每一个,您需要告诉Heroku运行什么命令来启动适当的服务器。在这个例子中,我会跑 node web/index.js 启动我的网站,和 node api/index.js 启动我的API服务。

  1. 创建两个新的Heroku应用程序。你可以通过运行来做到这一点 heroku create <desired-app-name> --remote <desired-app-name> 多次。 注意:The --remote flag将告诉Heroku为同一个repo中的每个应用程序创建一个Git遥控器。

  2. 接下来,您需要告诉Heroku在一个Heroku应用程序上运行您的实际Web应用程序,并在另一个Heroku应用程序上运行您的API服务。您可以使用Heroku CLI执行此操作:

    $ heroku ps:scale web=1 --remote webserver-app-name
    $ heroku ps:scale api=1 --remote apiserver-app-name
    

这些命令将:

  • 为您的网络服务器Heroku应用程序运行单个web dyno。
  • 为您的apiserver Heroku应用运行单个API dyno。

如您所见,使用 ps:scale 命令你可以控制Heroku将从你的命令运行什么类型的命令 Procfile,以及你想拥有多少个实例。

希望这有帮助!


9
2018-01-04 14:25



谢谢rdegges,我今天就试试吧。问题虽然 - 我会这么做 git push heroku-api master 和 git push heroku-web master 将我的主分支推送到每个单独的heroku应用程序? - Don P
啊,当你想要推动你的桅杆分支时,你会做: git push heroku-api master; git push heroku-web master; 将它部署到两个项目=)而不是通常的 git push heroku master 你会这样做,因为而不是 heroku 遥远的你现在有两个遥控器: heroku-web 和 heroku-api。希望有道理! - rdegges
这很棒,但您还需要以某种方式安装依赖项。我这样做是通过推杆 npm install 在脚本中从子文件夹运行我的应用程序。不完美,但我不知道如何在推动时这样做。 - Piotr Buda
你不必那样做。它会在推送时自动安装它们。 - rdegges
@rdegges这对我不起作用,因为Heroku说没有 web process type。我怎么能告诉Heroku,例如, api 是我的应用程序的Web进程类型? - Sergio Tapia


rdegges建议的解决方案 不幸的是不再工作了。看到:

Web进程类型是特殊的,因为它是唯一将从Heroku的路由器接收HTTP流量的进程类型。其他过程类型可以任意命名。

来自 Heroku文档。所以你将无法拥有 api 和 web 在Procfile中都暴露了Web应用程序。

最新的解决方案

解决这个问题的正确方法是使用Heroku团队提供的这个buildpack: Heroku Multi Procfile buildpack

想象一下,你有一个代码库,其中有几个不同的应用程序......或者至少能够运行一些代码库   不同的应用。或者,也许你是谷歌的单声道回购?

无论如何,你如何在Heroku上管理这个?你没有。 Heroku的   应用程序假设一个repo到一个应用程序。

输入Multi Procfile buildpack,每个应用程序都获得一个Procfile!

我已经在使用纱线工作区(一个仓库中有多个Node和React应用程序)的存储库上使用这个buildpack多个月了,一切正常。


5
2018-01-31 17:19



您好,请您解释以下步骤:“对于每个应用程序,将PROCFILE = relative / path /设置为/ Procfile / in / your / codebase,当然还有:heroku buildpacks:add -a github.com/heroku/heroku-buildpack-multi-procfile”;我有2个procfiles,一个在根目录,另一个在后端文件夹下。 procfile1 = web:npm run build procfile2 = api:node backend / server究竟是什么意思“对于每个应用程序,设置PROCFILE = relative / path / to / procfile / in / your / codebase”这里需要做什么?谢谢 - danikoren
@danikoren在这里 PROCFILE 指环境变量。您可以在Heroku doc中阅读更多相关信息: devcenter.heroku.com/articles/config-vars#managing-config-vars  你需要有两个Heroku应用程序,一个用于你的前端,一个用于你的后端,然后设置 PROCFILE env变量分别为每个Procfile的路径。我在这里写了一篇文章,其中包含更多细节: medium.com/inato/...  如果这有帮助,请告诉我。 - laugri
谢谢!启动所有应用程序的顺序是什么?我只是运行“git push heroku master”并且两个procfiles都会运行吗?我似乎没有让我的后端应用程序运行。 - danikoren