1
votes

I'm confused on how the host: parameter in the Endpoint configuration in Phoenix works.

I'm deploying to different Heroku apps (prod and staging) with different URLs, respectively. I want to configure the Host URL to be dynamic, coming from an environment variable, like so:

config :testapp, TestApp.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [scheme: "https", host: {:system, "HOST"}, port: 443],
  cache_static_manifest: "priv/static/manifest.json",
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  secret_key_base: System.get_env("SECRET_KEY_BASE")

However, after deploy, my asset URLs no longer have the unique hash set by phoenix.digest, which is a deal breaker.

Interestingly, when I hardcode the URL:

config :testapp, TestApp.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [scheme: "https", host: "someapp-staging.herokuapp.com", port: 443],
  cache_static_manifest: "priv/static/manifest.json",
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  secret_key_base: System.get_env("SECRET_KEY_BASE")

Even if it doesn't match the Heroku app url, everything still seems to work fine, and the asset URLs are correct. E.g. I can deploy to an app with an URL foo.herokuapp.com and everything still works.

The configuration above is from prod.exs, I'm using the elixir and phoenix static custom buildpacks, with the following config:

# elixir_buildpack.config

# Elixir version
elixir_version=1.2.3

# Always rebuild from scratch on every deploy?
always_rebuild=true

# ENV variables
config_vars_to_export=(DATABASE_URL HOST)

and

# phoenix_static_buildpack.config

# We can set the version of Node to use for the app here
node_version=5.10.0

# We can set the version of NPM to use for the app here
npm_version=3.8.3

# ENV variables
config_vars_to_export=(DATABASE_URL HOST)

I could probably introduce a separate staging.exs config file and set MIX_ENV=staging, but I would like to understand:

1) Why using {:system, "HOST"} breaks digested asset URLs

2) Why any string works fine on different applications and URLs

Any help is appreciated!

1

1 Answers

0
votes

Heroku does not have an environment variable named HOST by default (though PORT is available). I'd double check that you've added it as a config variable in your Heroku settings.

The command heroku run printenv is handy as it will output both base environment variables and config vars added manually or by add-ons.