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

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

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

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

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

【问题讨论】:

    标签: git heroku


    【解决方案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 服务器。

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

    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> 来做到这一点。 注意--remote 标志将告诉 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 应用运行单个网络测功机。
    • 为您的 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
        猜你喜欢
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 1970-01-01
        相关资源
        最近更新 更多