I have a rebar3 project which has some gen_server implementation. I would like to write an application in such a way, that the release would host that gen_server as an Erlang node in daemon mode.
Example
There is some gen server:
%% file src/my_gen_server.erl
-module(my_gen_server).
-behaviour(gen_server).
...
I would like to compile the project
$ rebar3 release
Then run it as daemon:
_build/prod/rel/myapp/bin/myapp daemon --setcookie biscuit
In a separate terminal session launch Erlang and connect to it:
$ erl -sname test -setcookie biscuit
1> gen_server:call(my_gen_server, test).
response
How do I set this up? By that question I mean: how to make the application be that gen server, and how to make it accept incoming messages from other nodes, possibly at different machines?
I suppose that you mean that you have an "application" project and you want to have that application as the only application in a release.
Add a
relxsection to your rebar.config as explained in the doc and make sure that the application code is reachable, such as having it in./apps/<application>/src/. With this step you have an erlang release starting your application code.In your .app.src file you specify a
Moduleimplementing the application behaviour, usually this module starts a supervisor, but you can start yourgen_serverdirectly here. Just bear in mind that if the process dies, the whole node dies with it, thats why this is discouraged.Regarding your last question, once you have the distributed erlang set up, you can send messages to registered process in nodes with the
{Name :: atom(), node()} ! Message :: term()syntax. You can use the methods in gen_server or erpc too