Hello, so I have few apps under an umbrella, lets say the names are linesdk, hibiki, and hibiki_web. So linesdk have a plug where you pass a secret key as the opts. hibiki_web is the app which runs the cowboy server and routes request to the linesdk plug. The secret key that needs to be passed is inside the :hibiki :channel_secret config. Here are some snippets
defmodule Hibiki.Config do
def channel_secret, do: Application.fetch_env!(:hibiki, :channel_secret)
end
defmodule HibikiWeb.Router do
...
post("/hibiki",
to: LineSdk.Plug,
init_opts: [
channel_secret: Hibiki.Config.channel_secret(),
handler: Hibiki.WebhookHandler
]
)
...
end
defmodule LineSdk.Plug do
use Plug.Builder
...
plug(:validate, builder_opts())
...
def validate(
%Plug.Conn{
assigns: %{raw_body: raw_body}
} = conn,
opts
) do
with {:ok, signature} <- get_signature(conn),
{:ok, _} <-
LineSdk.Auth.validate_message(
raw_body,
opts[:channel_secret],
signature
) do
conn
else
{:error, err} ->
conn
|> send_resp(400, "#{err}")
|> halt
end
end
...
end
And the plug access the channel_secret using opts[:channel_secret]
.
Now, these piece of code is running fine in my local development. But when I build the release into a docker image and deploy it, somehow the opts[:channel_secret]
became nil
while the opts[:handler]
is not changing.
The weider thing is when use the release binary remote
command and run Hibiki.Config.channel_secret()
it does returns the correct value.
This is after I refactor the plug from hibiki_web to linesdk. Before it was fine. But in both cases, it is still the hibiki_web app that calls the Hibiki.Config.channel_secret()
but somehow when the released app is running it returns nil
. Can anybody help me? Thank you very much!