【问题标题】:Building a dev environment in Heroku for Phoenix在 Heroku 中为 Phoenix 构建开发环境
【发布时间】:2017-05-06 05:02:26
【问题描述】:

我正在尝试设置 Phoenix 1.2,以便我拥有两个 Heroku 环境:一个用于开发/测试(将保留 this-app-12345.herokuapp.com url)和一个标准生产环境。

目前,我以通常的方式设置我的应用程序:

mix phoenix.new my_app
cd my_app
mix ecto.create
mix ecto.migrate
git init && git add . && git commit -m "Initial commit"
heroku create

这给了我一个 Heroku 实例:

Creating app... done, ⬢ first-instance-12345
https://first-instance-12345.herokuapp.com/ | https://git.heroku.com/first-instance-12345.git

然后我添加构建包,更改 config/ 文件并运行 git push heroku master,一切正常。

现在我想创建另一个 Heroku 实例,我也可以将其部署到该实例。如果我再次运行heroku create,我会得到:

Creating app... done, ⬢ second-instance-23456
https://second-instance-23456.herokuapp.com/ | https://git.heroku.com/second-instance-23456.git

如果我用新实例替换 prod.exs 中的 url...

config :my_app,  MyApp.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [scheme: "https", host: "second-instance-23456.herokuapp.com", port: 443], force_ssl: [rewrite_on: [:x_forwarded_proto]],

...然后提交并运行git push heroku master,它仍然会部署到 first-instance-12345.herokuapp.com,这不是我想要的。

重新运行 buildpack 也无济于事。

$ heroku buildpacks:add https://github.com/HashNuke/heroku-buildpack-elixir
 ▸    The buildpack https://github.com/HashNuke/heroku-buildpack-elixir is already set on your app.
$ heroku buildpacks:add https://github.com/gjaldon/phoenix-static-buildpack
 ▸    The buildpack https://github.com/gjaldon/phoenix-static-buildpack is already set on your app.

是否有标准方法(或任何方法)让 Phoenix 部署到多个 Heroku 环境? (并希望指定部署哪个/s)

【问题讨论】:

    标签: heroku deployment elixir phoenix-framework development-environment


    【解决方案1】:

    将应用程序部署到多个 Heroku 应用程序的标准方法是将多个遥控器添加到存储库并推送到您要部署到的那个。对 config/prod.exs 进行更改不会影响应用的部署位置。

    添加两个遥控器的方法如下:

    $ git remote add first https://git.heroku.com/first-instance-12345.git
    $ git remote add second https://git.heroku.com/second-instance-23456.git
    

    现在您可以使用以下命令部署到第一个:

    $ git push first master
    

    到第二个使用:

    $ git push second master
    

    【讨论】:

    • 得到这个:remote: -----> Building dependencies remote: Installing node modules (package.json) remote: npm ERR! addLocal Could not install /tmp/build_281dbc927c24aa3bb5ad67f310924ca2/deps/phoenix remote: npm ERR! enoent This is most likely not a problem with npm itself remote: npm ERR! enoent and is related to npm not being able to find a file. ...有中间步骤吗?
    • remote: - Node version not specified in package.json....我添加了 ` "engines": { "npm": "7.6.0" }`,但无济于事。
    • 这只发生在新的(第二个)遥控器上吗?尝试将所有构建包添加到第二个应用程序:heroku buildpacks:add --app second-instance-23456 https://github.com/...(就像您为第一个不带 --app 参数的应用程序所做的那样),然后再次推送。
    • 问题是我没有在创建时指定应用程序。请参阅上面的编辑,并随时根据自己的喜好进行编辑。
    • 如果您已经创建了应用程序,实际上您不需要这样做。您可以使用我之前评论中的命令将 buildpack 添加到任何现有应用程序中。
    【解决方案2】:

    当然,最好的方法是使用@dogbert 所写的两个不同的实例。 还要记住更改 Heroku 的 Procfile,因为您想使用不同的环境运行应用程序,例如。

    # Procfile for prod
    web: MIX_ENV=prod mix phoenix.server
    
    # Procfile for dev
    web: MIX_ENV=dev mix phoenix.server
    

    对于这两种环境,您都需要应用迁移:

    heroku run MIX_ENV=<env> ecto.migrate
    

    【讨论】:

    • 假设我有两个 heroku 应用,foo 和 bar,每个都有自己的app-name-12345.herokuapp.com 地址,我用git push foo|bar master 推送。 Heroku 只知道它们是 foo 和 bar;它不知道是开发/登台还是生产。是否在 Procfile 中指出?
    • 是的,Procfile 用于告诉 heroku 应该调用哪个命令。在这种情况下,您可以使用 MIX_ENV 变量控制触发的环境。
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多