Since this post’s title is very descriptive and the first one that comes up when you search about the topic on the forum, I want to document an alternative in case someone ends up here trying to find a solution. The documentation currently states that you can also pass a MFA tuple to Plug.Static:
:from- the file system path to read static assets from. It can be either: a string containing a file system path, an atom representing the application name (where assets will be served frompriv/static), a tuple containing the application name and the directory to serve assets from (besidespriv/static), or an MFA tuple.
This is also, exactly how Livebook does it (see):
plug Plug.Static,
at: "/",
from: {__MODULE__, :static_from, []},
gzip: true,
only: LivebookWeb.static_paths()
@doc false
def static_from(), do: Path.join(Livebook.Config.priv_path(), "static")
This means you can change static_from to something like the following and resolve the path properly at runtime as well:
# endpoint.exs
def static_from(), do: Application.get_env(:app, :path)
# runtime.exs
config :app, path: System.get_env("RUNTIME_PATH")






















