从同一个 git repo 部署两个单独的 heroku 应用程序

Posted

技术标签:

【中文标题】从同一个 git repo 部署两个单独的 heroku 应用程序【英文标题】:Deploy two separate heroku apps from same git repo 【发布时间】:2017-05-18 14:35:45 【问题描述】:

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

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

(所以有 2 个 Heroku 应用,一个用于 Web 服务器,一个用于 api 服务器)

注意(在标记为重复之前): 有几个类似的问题。大多数处理将 一个 应用程序部署到 两个 heroku 应用程序 - 通常用于登台与生产。我希望将 两个 应用部署到 两个 heroku 应用。 (Question about staging vs prod)

【问题讨论】:

【参考方案1】:

不幸的是,solution suggested by rdegges 不再起作用了。见:

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

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

最新解决方案

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

假设您有一个代码库,其中包含几个不同的应用程序......或者至少能够运行几个 不同的应用。或者,也许您是 Google 的单一存储库?

无论如何,您如何在 Heroku 上进行管理?你没有。 Heroku 应用程序假设一个 repo 对应一个应用程序。

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

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

【讨论】:

您好,您能否解释一下以下步骤:“对于每个应用程序,设置 PROCFILE=relative/path/to/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 这里PROCFILE 指的是环境变量。您可以在 Heroku 文档中阅读更多相关信息:devcenter.heroku.com/articles/config-vars#managing-config-vars 您需要有两个 Heroku 应用程序,一个用于前端,一个用于后端,并将 PROCFILE 环境变量设置为每个 Procfile 分别。我在这里写了一篇更详细的文章:medium.com/inato/… 如果这有帮助,请告诉我。 谢谢!启动所有应用程序的顺序是什么?我是否只运行“git push heroku master”并且两个procfiles都会运行?我似乎没有让我的后端应用程序运行。 蛞蝓怎么样,他们共用一个吗?【参考方案2】:

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

考虑到这一假设,以下是您要逐步执行的操作:

    进入您的项目文件夹。 在项目的根目录下定义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 服务。

    创建两个新的 Heroku 应用程序。您可以通过多次运行heroku create <desired-app-name> --remote <desired-app-name> 来做到这一点。 注意--remote 标志将告诉 Heroku 在同一个 repo 中为您的每个应用程序创建一个 Git 远程。

    接下来,您需要告诉 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 应用运行单个网络测功机。 为您的 apiserver Heroku 应用运行单个 API dyno。

正如您在上面看到的,使用ps:scale 命令您可以控制 Heroku 将从您的Procfile 运行哪些类型的命令,以及您希望每个命令有多少个实例。

希望这会有所帮助!

【讨论】:

谢谢rdegges,我今天就试试这个。不过问题是——我会做git push heroku-api mastergit push heroku-web master 将我的主分支推送到每个单独的heroku 应用程序吗? 啊,当你想要推送你的 mast 分支时,你会这样做:git push heroku-api master; git push heroku-web master; 将它部署到两个项目 =) 而不是通常的 git push heroku master 你会这样做,因为而不是heroku 遥控器你现在有两个遥控器:heroku-webheroku-api。希望这是有道理的! 这很好,但您也需要安装依赖项。我通过将npm install 放入脚本中以从子文件夹运行我的应用程序来做到这一点。不完美,但我不知道如何在推送时做到这一点。 @rdegges 这对我不起作用,因为 Heroku 说没有web process type。例如,我如何告诉 Heroku,api 是我的应用程序的 Web 进程类型? Heroku 最近改变了他们的行为,看来。这曾经奏效。现在看起来这样做需要您完全拥有两个单独的 Procfile。【参考方案3】:

如果您有两个单独的应用程序,那么您可以简单地将存储库子树推送到每个应用程序。

设置遥控器一次

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 指向应用的根文件夹)

【讨论】:

如何使用git subtree push强制推送? 如何在使用子树推送之前添加提交?【参考方案4】:

我们可以添加自定义脚本,将 git 目录中的特定文件夹部署到 package.json 文件中的 npm 脚本中。检查 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 了解详细说明。

【讨论】:

【参考方案5】:

由于 Heroku 不允许多个 Procfile 并且它应该只有一个 web 键用于 HTTP 流量和端口分配。所以,这就是我克服这个限制的方法(通过 env vars 的动态入口点)

假设我们有两个 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 env var,目标应用程序将启动!

【讨论】:

【参考方案6】:

我遇到了类似的问题。就我而言,我有一个 GitHub 存储库,其中一个文件夹中有一个 React 前端,另一个文件夹中有一个 API。

经过一番谷歌搜索,我找到了一个构建包,可以让我在 Heroku 上部署子文件夹。我使用 buildpack 并在 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/

【讨论】:

欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么存在,然后引用最多您链接到的页面的相关部分,以防目标页面不可用。 Answers that are little more than a link may be deleted. 感谢您的反馈!我会更新我的答案。 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review

以上是关于从同一个 git repo 部署两个单独的 heroku 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Git从composer.json保存部署令牌url,防止推送到repo

部署后如何在 Heroku 中维护不在 git repo 中的文件

使用 Git over OpenSSH 在 windows server 2016 上部署 repo

在同一台服务器上为多个 repos 设置 git

将预先存在的 django git repo 部署到 heroku

Git - 每个分支的单独文件夹。设置它