I have added server: true
to my code but my Mix release still doesn’t work. Did I miss anything?
My code is live on Quoc-Anh Nguyen / tools · GitLab
I have added server: true
to my code but my Mix release still doesn’t work. Did I miss anything?
My code is live on Quoc-Anh Nguyen / tools · GitLab
Please show us the full command sequence
I have a bash script to build the release build.sh · main · Quoc-Anh Nguyen / tools · GitLab.
Then I use PORT=4000 MIX_ENV=prod _build/prod/rel/tools/bin/tools start
to start the server.
Hi,
please share the whole sequence, ie. how you built your release.
“It doesn’t work” has no meaning to anyone other than yourself. Please explain:
Really sorry guys!
Well I’m trying to build a Mix release and try to run it. My expectation is it should work like mix phx:server
.
Here is the reproducible steps:
./build.sh
to create a mix releasePORT=4000 MIX_ENV=prod _build/prod/rel/tools/bin/tools start
to start the serverlocalhost:4000
via both browsers and curl
. Both throw errors and the problem is there is no Phoenix server bind to any port.My expectation is the server should start and bind itself to port 4000.
and the errors are?
There is no error when I run the start
command. No log, nothing. So I believe the server doesn’t start with my command.
what you mean by “no log, nothing”? Did it quit without printing anything, or hang in there not printing anything?
If you run netstat -lnt | grep 4000
do you see the listening port?
By the way, MIX_ENV=prod
is unnecessary on the command line to run the release. After the release, there is no mix anymore.
I mean it just hangs in there without printing anything.
netstat -lnt | grep 4000
returns no listening port.
I am going to assume that you have DATABASE_URL
and SECRET_KEY_BASE
defined in the shell to run the release, otherwise, it will raise. Can you unset one of them, and see that it actually raises?
I have set them, and managed to run PORT=4000 mix phx.server'
but I can see what the OP is
describing. when you run
PORT=4000 _build/prod/rel/tools/bin/tools start
the shel hangs idle
I have tweaked the configs to run exclusively on port 4000 and still does not work within the release.
these are the env var based on dev.exs
export DATABASE_URL="ecto://postgres:postgres@localhost/tools_dev"
export SECRET_KEY_BASE="mKdPiT3RyM8WSSvS1YBqkxf0ACRYPZsI8v72ewbg46T"
Currently, I use envs from .envrc.example
.
If I remove DATABASE_URL
, it throws an error and exits.
** (RuntimeError) environment variable DATABASE_URL is missing.
For example: ecto://USER:PASS@HOST/DATABASE
(stdlib 3.16.1) erl_eval.erl:685: :erl_eval.do_apply/6
(stdlib 3.16.1) erl_eval.erl:446: :erl_eval.expr/5
(stdlib 3.16.1) erl_eval.erl:123: :erl_eval.exprs/5
(elixir 1.13.0) src/elixir.erl:289: :elixir.recur_eval/3
(elixir 1.13.0) src/elixir.erl:274: :elixir.eval_forms/3
(elixir 1.13.0) lib/code.ex:404: Code.validated_eval_string/3
(elixir 1.13.0) lib/config.ex:260: Config.__eval__!/3
(elixir 1.13.0) lib/config/reader.ex:92: Config.Reader.read!/2
{"init terminating in do_boot",{#{'__exception__'=>true,'__struct__'=>'Elixir.RuntimeError',message=><<101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,32,68,65,84,65,66,65,83,69,95,85,82,76,32,105,115,32,109,105,115,115,105,110,103,46,10,70,111,114,32,101,=ERROR REPORT==== 8-Dec-2021::20:35:57.227647 ===
Error in process <0.9.0> on node 'tools@Quoc-Anhs-MacBook-Pro' with exit value:
{#{'__exception__' => true,'__struct__' => 'Elixir.RuntimeError',
message =>
<<"environment variable DATABASE_URL is missing.\nFor example: ecto://USER:PASS@HOST/DATABASE\n">>},
[{erl_eval,do_apply,6,
[{file,"erl_eval.erl"},
{line,685},
{error_info,#{module => 'Elixir.Exception'}}]},
{erl_eval,expr,5,[{file,"erl_eval.erl"},{line,446}]},
{erl_eval,exprs,5,[{file,"erl_eval.erl"},{line,123}]},
{elixir,recur_eval,3,[{file,"src/elixir.erl"},{line,289}]},
{elixir,eval_forms,3,[{file,"src/elixir.erl"},{line,274}]},
{'Elixir.Code',validated_eval_string,3,[{file,120,97,109,112,108,101,58,32,101,99,116,111,58,47,47,85,83,69,82,58,8"lib/code.ex"},{line,404}]},
{'Elixir.Config','__eval__!',3,[{file,"lib/config.ex"},{line,260}]},
{'Elixir.Config.Reader','read!',2,
[{file,"lib/config/reader.ex"},{line,92}]}]}
0,65,83,83,64,72,79,83,84,47,68,65,84,65,66,65,83,69,10>>},[{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,685},{error_info,#{module=>'Elixir.Exception'}}]},{erl_eval,expr,5,[{file,"erl_eval.erl"},{line,446}]},{erl_eval,exprs,5,[{file,"erl_eval.erl"},{line,123}]},{elixir,recur_eval,3,[{file,"src/elixir.erl"},{line,289}]},{elixir,eval_forms,3,[{file,"src/elixir.erl"},{line,274}]},{'Elixir.Code',validated_eval_string,3,[{file,"lib/code.ex"},{line,404}]},{'Elixir.Config','__eval__!',3,[{file,"lib/config.ex"},{line,260}]},{'Elixir.Config.Reader','read!',2,[{file,"lib/config/reader.ex"},{line,92}]}]}}
init terminating in do_boot ({,[{erl_eval,do_apply,6,[{_},{_},{_}]},{erl_eval,expr,5,[{_},{_}]},{erl_eval,exprs,5,[{_},{_}]},{elixir,recur_eval,3,[{_},{_}]},{elixir,eval_forms,3,[{_},{_}]},{Elixir.Cod
Crash dump is being written to: erl_crash.dump...done```
If you cannot figure it out, and since it looks it is a “hello world” app I would advice you to start over and follow these guide.
I think the issue is this: Your application is called :tools
which is already taken by a standard erlang application:
https://www.erlang.org/doc/apps/tools/index.html
So the release process got confused and release that application instead. Therefore, there is nothing of your own code in the release.
There are only two hard things in Computer Science: cache invalidation and naming things.
– Phil Karlton
That’s the moral of this struggle. OTP applicaions have a flat name space, and one have to dodge the following:
Maybe the mix phx.new
can be enhanced to check for potential name collisions.
Wow, nice catch! Thank you.
Let me try with another name.