从同一个 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 中同时使用 api
和 web
来公开 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 master
和git push heroku-web master
将我的主分支推送到每个单独的heroku 应用程序吗?
啊,当你想要推送你的 mast 分支时,你会这样做:git push heroku-api master; git push heroku-web master;
将它部署到两个项目 =) 而不是通常的 git push heroku master
你会这样做,因为而不是heroku
遥控器你现在有两个遥控器:heroku-web
和 heroku-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