Search code examples
herokudeploymentelixirphoenix-frameworkdevelopment-environment

Building a dev environment in Heroku for Phoenix


I'm trying to set up Phoenix 1.2 so that I have two Heroku environments: one for dev/testing (which will keep the this-app-12345.herokuapp.com url), and a standard production environment.

Currently, I set up my app the usual way:

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

This gives me a Heroku instance:

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

I then add the buildpacks, change the config/ files and run git push heroku master and everything works.

Now I'd like to create another Heroku instance, to which I can also deploy. If I run heroku create again, I get:

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

If I replace the url in prod.exs with the new instance...

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]],

...and then commit and run git push heroku master, it will still deploy to first-instance-12345.herokuapp.com, which isn't what I want.

Re-running buildpacks doesn't help either.

$ 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.

Is there a standard method (or any method) to get Phoenix to deploy to multiple heroku environments? (And hopefully specify which one/s on deploy)


Solution

  • The standard way to deploy an app to multiple Heroku apps is to add multiple remotes to the repo and push to the one you want to deploy to. Making that change to config/prod.exs will have no effect on where the app is deployed.

    Here's how to add the two remotes:

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

    Now you can deploy to the first one using:

    $ git push first master
    

    and to the second using:

    $ git push second master