Enabling the server in a release, how does it work?

The release docs of Phoenix say to put

config :my_app, MyApp.Endpoint, server: true

in config/prod.secret.exs. However, while that file is processed when the release task runs, it is not processed when the release starts. The application resource file of Phoenix has serve_endpoints to false, and the resource file of the Phoenix application itself does not include application environment.

How does that flag end up in the release? Where is it stored and loaded?

I suspect the key is the :persistent flag. Need to connect the dots from where is the flag set, to how persistent flags survive compilation.

The configuration of your config/config.exs files is - as you probably already know - evaluated at build time. In case of a release this is when you’re assembling the release.

The fully evaluated configuration is then written to the sys.config file in your release folder (which is an erlang file). Assuming you have an app called my_app and built a release for the prod environment with the app version 0.1.0 you can find it at _build/prod/rel/my_app/releases/0.1.0/sys.config.

Here is how it looks for a project of ours (with sensitive configuration replaced with ***):

[{distillery,
     [{config_providers,
          [{'Elixir.Distillery.Releases.Config.Providers.Elixir',
               [<<"${RELEASE_ROOT_DIR}/etc/config.exs">>]}]}]},
 {sasl,[{errlog_type,error},{sasl_error_logger,false}]},
 {facts,
     [{ecto_repos,['Elixir.MyApp.Repo']},
      {generators,[{binary_id,true}]},
      {'Elixir.MyAppWeb.Gettext',[{default_locale,<<"de">>}]}]},
      {'Elixir.MyAppWeb.Endpoint',
          [{url,[{host,<<"***">>}]},
           {secret_key_base, <<"***">>},
           {render_errors,
               [{view,'Elixir.MyAppWeb.ErrorView'},
                {accepts,[<<"html">>,<<"json">>]}]},
           {pubsub,
               [{name,'Elixir.MyApp.PubSub'},
                {adapter,'Elixir.Phoenix.PubSub.PG2'}]},
           {live_view,[{signing_salt,<<"***">>}]}]}]},
 {phoenix,[{json_library,'Elixir.Jason'}]},
 {logger,
     [{console,
          [{format,<<"$time $metadata[$level] $message\n">>},
           {metadata,[request_id]}]},
      {level,info}]},
 {sentry,
     [{included_environments,[<<"production">>,<<"staging">>]},
      {enable_source_code_context,true}]}].

While this particular project is using distillery to assemble the release the process is fundamentally the same of you use elixir releases.

1 Like

Aaahh, indeed, I believe there was a day in which I knew that, had totally forgotten it. Thanks!