从同一个git仓库部署两个独立的Heroku应用程序

31

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

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

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

注意(在标记为重复之前):有几个类似的问题。大多数涉及将一个应用程序部署到两个 Heroku 应用程序上-通常是为了分别进行演示和生产。我要部署 两个 应用程序到两个 heroku 应用程序上。(关于演示与生产的问题

6个回答

28

rdegges提供的解决方案不幸地已经无法使用了。请参阅:

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

来自Heroku文档。因此,您将无法在Procfile中同时公开Web应用程序的apiweb

最新的解决方案

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

假设您有一个单一的代码库,其中包含几个不同的应用程序...或者至少具有运行几个不同应用程序的能力。或者,您是Google,有自己的单仓库?

在任何情况下,您如何在Heroku上管理此问题?您不需要这样做。Heroku应用程序假定一个仓库对应一个应用程序。

进入Multi Procfile构建包,每个应用程序都有一个Procfile!

我已经在使用yarn工作区(一个仓库中有多个Node和React应用程序)的存储库上多月使用此构建包,一切正常。


你好, 请问您能解释一下以下步骤吗: "对于每个应用程序,请设置PROCFILE=相对路径/到/代码库中的Procfile,当然:heroku buildpacks:add -a https://github.com/heroku/heroku-buildpack-multi-procfile"我有两个procfiles,一个在根目录下,另一个在backend文件夹下。 procfile1 = web: npm run build procfile2 = api: node backend/server“对于每个应用程序,请设置PROCFILE=相对路径/到/代码库中的Procfile”这是什么意思? 需要做什么?谢谢 - danikoren
1
@danikoren 这里的 PROCFILE 是一个环境变量。您可以在 Heroku 文档中了解更多信息:https://devcenter.heroku.com/articles/config-vars#managing-config-vars 您需要拥有两个 Heroku 应用程序,一个用于前端,一个用于后端,并分别将 PROCFILE 环境变量设置为每个 Procfile 的路径。我在这里写了一篇更详细的文章:https://medium.com/inato/how-to-setup-heroku-with-yarn-workspaces-d8eac0db0256如果有帮助,请告诉我。 - laugri
谢谢! 所有应用程序启动的顺序是什么? 我只需要运行“git push heroku master”吗,两个Procfile都会运行吗? 我的后端应用程序似乎无法运行。 - danikoren
那么关于slug,它们共享同一个吗? - Jalal Sordo

20

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

在这个前提下,以下是你需要逐步执行的操作:

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

以下是你可能想要的Procfile样例:

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

在我上面的例子中:我定义了两种类型的Heroku dynos——一个叫做web,另一个叫做api。对于每一个dyno,你都需要告诉Heroku运行什么命令来启动相应的服务器。在这个例子中,我会运行node web/index.js来启动我的网站,node api/index.js来启动我的API服务。
  1. 创建两个新的Heroku应用程序。您可以通过多次运行heroku create <desired-app-name> --remote <desired-app-name>来完成此操作。注意--remote标志将告诉Heroku在同一存储库中为每个应用程序创建一个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
    

这些命令将会:

  • 为你的 Web 服务器 Heroku 应用程序运行单个 web dyno。
  • 为你的 API 服务器 Heroku 应用程序运行单个 API dyno。

如上所述,使用 ps:scale 命令,你可以控制 Heroku 运行来自你的 Procfile 的命令类型以及每种命令实例的数量。

希望这能帮到你!


2
啊,当你想要推送你的主分支时,你可以这样做: git push heroku-api master; git push heroku-web master; 它会将你的代码部署到两个项目中 =) 而不是通常的 git push heroku master ,因为现在你有了两个远程仓库: heroku-webheroku-api。希望这样讲可以让你明白! - rdegges
这很棒,但你还需要安装依赖项。我通过在运行子文件夹中的应用程序的脚本中放置 npm install 来实现。虽然不是完美的,但我不知道如何在推送时执行此操作。 - Piotr Buda
你不必这样做,它会在推送时自动安装它们。 - rdegges
3
这对我没有用,因为Heroku说没有“web进程类型”。我该如何告诉Heroku,比如说,“api”是我的应用的web进程类型? - Sergio Tapia
2
Heroku 最近似乎改变了他们的行为。这个以前是可以工作的。现在看起来需要你拥有两个完全不同的 Procfiles 才能做到这一点。 - rdegges
显示剩余2条评论

9
如果您有两个独立的应用程序,那么您可以简单地将存储库子树推送到每个应用程序。
一次设置远程仓库。
heroku git:remote --remote heroku-client -a client-app
heroku git:remote --remote heroku-server -a server-app

然后你可以通过将子树推送到远程进行部署

git subtree push --prefix client heroku-client master
git subtree push --prefix server heroku-server master

(其中 --prefix 指向应用程序的根目录)

1
我如何使用 git subtree push 强制推送? - Dorki
我如何在使用子树时推送之前添加提交? - Dorki

0

由于Heroku不允许有多个Procfile,并且它应该只有一个web键用于HTTP流量和端口分配。因此,这就是我如何克服这个限制的方法(通过环境变量进行动态入口点)

  • 假设我们有两个Heroku应用程序,请为每个应用程序的每个入口点定义一个环境变量。

    • 应用程序1:INDEX_PATH='./1/index.js'
    • 应用程序2:INDEX_PATH='./2/index.js'
  • 创建Procfile并包含以下内容:

web: npm run start-heroku

在 `package.json` 文件中添加以下脚本。
"start-heroku": "node heroku.js",
  • 创建 heroku.js 文件,并添加以下内容
const Path = require('path')

require(Path.join(__dirname, process.env.INDEX_PATH))

现在,当我们部署 App 1 时,Heroku 将执行 Procfile (web),该文件将执行 heroku.js 并根据 INDEX_PATH 环境变量启动目标应用程序!

0
我们可以将自定义脚本添加到 package.json 文件中的 npm 脚本中,以部署 git 目录中的特定文件夹。请查看 package.json 文件中的以下代码:
"scripts": {
    "start": "node app.js",
    "publishheroku": "cd ../../ && git subtree push --prefix nodeapps/appone heroku-app-one master || true"
  },

然后你可以运行npm run-script publishheroku 进行部署。

另外,请查看link以获取详细说明。


-2

我遇到了类似的问题。在我的情况下,我有一个单一的 GitHub 存储库,其中包含一个 React 前端文件夹和另一个 API 文件夹。

经过一番搜索,我找到了一个构建包,可以让我在 Heroku 上部署子文件夹。我使用了这个构建包,并在 Heroku 上创建了几个项目,以部署 API 和 React 前端。

该构建包是 https://github.com/timanovsky/subdir-heroku-buildpack

我在下面的文章中写了一篇详细的步骤文章,附带截图。

https://www.realpythonproject.com/how-to-setup-automated-deployment-for-multiple-apps-under-a-single-github-repository-in-heroku/


1
欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面无法访问。仅仅提供链接的答案可能会被删除。 - jmoerdyk
谢谢您的反馈!我会更新我的答案。 - Rahul Banerjee
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - aerial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接