在Heroku上为Phoenix配置动态端点URL

时间:2016-05-24 09:16:36

标签: heroku elixir phoenix-framework

我对凤凰城端点配置中host:参数如何工作感到困惑。

我分别使用不同的URL部署到不同的Heroku应用程序(prod和staging)。我想将主机URL配置为动态的,来自环境变量,如下所示:

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")

但是,在部署之后,我的资产网址不再具有由phoenix.digest设置的唯一哈希值,这是一个交易破坏者。

有趣的是,当我对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")

即使它与Heroku应用程序网址不匹配,一切似乎仍然正常,资产网址也是正确的。例如。我可以使用网址foo.herokuapp.com部署到应用,但一切仍然有效。

上面的配置来自prod.exs,我使用elixir和phoenix静态自定义buildpacks,使用以下配置:

# 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)

# 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)

我可能会引入一个单独的staging.exs配置文件并设置MIX_ENV=staging,但我想了解一下:

1)为什么使用{:system, "HOST"}打破已消化的资产网址

2)为什么任何字符串在不同的应用程序和URL上都能正常工作

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

默认情况下,Heroku没有名为HOST的环境变量(尽管PORT可用)。我会仔细检查你是否在Heroku设置中将它添加为配置变量。

命令heroku run printenv非常方便,因为它会输出基本环境变量和手动添加的配置变量或附加组件。