Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions priv/templates/nova.template
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@
{template, "nova/sup.erl", "{{name}}/src/{{name}}_sup.erl"}.
{template, "nova/router.erl", "{{name}}/src/{{name}}_router.erl"}.
{template, "nova/controller.erl", "{{name}}/src/controllers/{{name}}_main_controller.erl"}.
{template, "nova/health_controller.erl", "{{name}}/src/controllers/{{name}}_health_controller.erl"}.
{template, "nova/rebar.config", "{{name}}/rebar.config"}.
{template, "nova/vm.args.src", "{{name}}/config/vm.args.src"}.

{file, "nova/favicon.ico", "{{name}}/priv/assets/favicon.ico"}.
{file, "nova/controller.dtl", "{{name}}/src/views/{{name}}_main.dtl"}.
{file, "nova/.tool-versions", "{{name}}/.tool-versions"}.
{file, "nova/.gitignore", "{{name}}/.gitignore"}.
{template, "nova/Dockerfile", "{{name}}/Dockerfile"}.
{file, "nova/.dockerignore", "{{name}}/.dockerignore"}.
{template, "nova/fly.toml", "{{name}}/fly.toml"}.
10 changes: 10 additions & 0 deletions priv/templates/nova/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
_build
.rebar3
.rebar
.git
log
logs
erl_crash.dump
rebar3.crashdump
*.beam
*.o
29 changes: 29 additions & 0 deletions priv/templates/nova/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
ARG ERLANG_VERSION
ARG REBAR_VERSION

FROM erlang:${ERLANG_VERSION} AS builder

RUN wget -q "https://github.com/erlang/rebar3/releases/download/${REBAR_VERSION}/rebar3" -O /usr/local/bin/rebar3 && \
chmod +x /usr/local/bin/rebar3

WORKDIR /app

COPY rebar.config rebar.lock ./
RUN rebar3 compile --deps_only

COPY . .
RUN rebar3 as prod release

FROM debian:bookworm-slim

RUN apt-get update && \
apt-get install -y --no-install-recommends libncurses5 libssl3 libstdc++6 && \
rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY --from=builder /app/_build/prod/rel/{{name}} ./

EXPOSE 8080

CMD ["bin/{{name}}", "foreground"]
35 changes: 35 additions & 0 deletions priv/templates/nova/fly.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
app = '{{name}}'
primary_region = 'ams'

[build]

[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = 'stop'
auto_start_machines = true
min_machines_running = 0
processes = ['app']

[checks]
[checks.health]
grace_period = "10s"
interval = "15s"
method = "GET"
path = "/healthz"
port = 8080
timeout = "5s"
type = "http"

[checks.ready]
grace_period = "15s"
interval = "15s"
method = "GET"
path = "/readyz"
port = 8080
timeout = "5s"
type = "http"

[[vm]]
size = 'shared-cpu-1x'
memory = '512mb'
20 changes: 20 additions & 0 deletions priv/templates/nova/health_controller.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-module({{name}}_health_controller).
-export([
healthz/1,
readyz/1
]).

healthz(_Req) ->
{json, #{status => <<"ok">>}}.

readyz(_Req) ->
ready_response(check_ready()).

ready_response(true) ->
{json, #{status => <<"ready">>}};
ready_response(false) ->
{status, 503, #{}, #{status => <<"unavailable">>}}.

check_ready() ->
Apps = application:which_applications(),
lists:keymember({{name}}, 1, Apps).
5 changes: 3 additions & 2 deletions priv/templates/nova/prod_sys.config.src
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
{logger_level, info},
{logger,
[{handler, default, logger_std_h,
#{level => error,
config => #{file => "log/erlang.log"}}}
#{formatter => {nova_jsonlogger, #{new_line => true}}}}
]}
]},
{nova, [
{shutdown_delay, 5000},
{shutdown_drain_timeout, 15000},
{use_stacktrace, false},
{environment, prod},
{cowboy_configuration, #{
Expand Down
19 changes: 14 additions & 5 deletions priv/templates/nova/router.erl
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,23 @@
]).

%% The Environment-variable is defined in your sys.config in {nova, [{environment, Value}]}
routes(_Environment) ->
routes(Environment) ->
[
#{
prefix => "",
security => false,
routes => [
{"/", fun {{name}}_main_controller:index/1, #{methods => [get]}},
{"/heartbeat", fun(_) -> {status, 200} end, #{methods => [get]}}
]
routes => base_routes() ++ dev_routes(Environment)
}
].

base_routes() ->
[
{"/", fun {{name}}_main_controller:index/1, #{methods => [get]}},
{"/healthz", fun {{name}}_health_controller:healthz/1, #{methods => [get]}},
{"/readyz", fun {{name}}_health_controller:readyz/1, #{methods => [get]}}
].

dev_routes(dev) ->
[{"/assets/[...]", "assets"}];
dev_routes(_) ->
[].
9 changes: 5 additions & 4 deletions priv/templates/nova/vm.args.src
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
-sname '{{name}}'

-setcookie {{name}}_cookie
## Distributed Erlang is disabled by default.
## Uncomment the lines below if you need distribution.
## -sname '{{name}}'
## -setcookie {{name}}_cookie

+K true
+A30
+A30
33 changes: 33 additions & 0 deletions priv/templates/nova_kura.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{description, "Nova project with Kura (PostgreSQL ORM)"}.
{variables, [
{name, "project", "Name of the project"}
]}.

{dir, "{{name}}"}.
{dir, "{{name}}/priv"}.
{dir, "{{name}}/priv/assets"}.
{dir, "{{name}}/config"}.
{dir, "{{name}}/src/controllers"}.
{dir, "{{name}}/src/views"}.
{dir, "{{name}}/src/schemas"}.
{dir, "{{name}}/src/migrations"}.

{template, "nova_kura/dev_sys.config.src", "{{name}}/config/dev_sys.config.src"}.
{template, "nova_kura/prod_sys.config.src", "{{name}}/config/prod_sys.config.src"}.
{template, "nova_kura/app.src", "{{name}}/src/{{name}}.app.src"}.
{template, "nova_kura/app.erl", "{{name}}/src/{{name}}_app.erl"}.
{template, "nova_kura/sup.erl", "{{name}}/src/{{name}}_sup.erl"}.
{template, "nova_kura/repo.erl", "{{name}}/src/{{name}}_repo.erl"}.
{template, "nova/router.erl", "{{name}}/src/{{name}}_router.erl"}.
{template, "nova/controller.erl", "{{name}}/src/controllers/{{name}}_main_controller.erl"}.
{template, "nova/health_controller.erl", "{{name}}/src/controllers/{{name}}_health_controller.erl"}.
{template, "nova_kura/rebar.config", "{{name}}/rebar.config"}.
{template, "nova/vm.args.src", "{{name}}/config/vm.args.src"}.

{file, "nova/favicon.ico", "{{name}}/priv/assets/favicon.ico"}.
{file, "nova/controller.dtl", "{{name}}/src/views/{{name}}_main.dtl"}.
{file, "nova/.tool-versions", "{{name}}/.tool-versions"}.
{file, "nova/.gitignore", "{{name}}/.gitignore"}.
{template, "nova/Dockerfile", "{{name}}/Dockerfile"}.
{file, "nova/.dockerignore", "{{name}}/.dockerignore"}.
{template, "nova/fly.toml", "{{name}}/fly.toml"}.
13 changes: 13 additions & 0 deletions priv/templates/nova_kura/app.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-module({{name}}_app).

-behaviour(application).

-export([start/2, stop/1]).

start(_StartType, _StartArgs) ->
{ok, Pid} = {{name}}_sup:start_link(),
ok = kura:start({{name}}_repo),
{ok, Pid}.

stop(_State) ->
ok.
19 changes: 19 additions & 0 deletions priv/templates/nova_kura/app.src
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
{application, {{name}}, [
{description, "{{name}} managed by Nova"},
{vsn, git},
{registered, []},
{mod, {{{name}}_app, []}},
{included_applications, []},
{applications, [
kernel,
stdlib,
nova,
kura
]},
{env, []},
{modules, []},
{maintainers, []},
{licenses, ["Apache 2.0"]},
{links, []}
]}.
36 changes: 36 additions & 0 deletions priv/templates/nova_kura/dev_sys.config.src
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-

[
{kernel, [
{logger_level, debug},
#{formatter => {flatlog, #{
map_depth => 3,
term_depth => 50,
colored => true,
template => [colored_start, "[\033[1m", level, "\033[0m", colored_start,"] [", time, "]",
colored_end, " ", msg, " (", mfa, ")\n"]
}}}
]},
{nova, [
{use_stacktrace, true},
{environment, dev},
{cowboy_configuration, #{
port => 8080
}},
{dev_mode, true},
{bootstrap_application, {{name}}},
{plugins, [
{pre_request, nova_request_plugin, #{decode_json_body => true}}
]}
]},
{{{name}}, [
{{{name}}_repo, #{
database => <<"{{name}}_dev">>,
hostname => <<"localhost">>,
port => 5432,
username => <<"postgres">>,
password => <<"postgres">>,
pool_size => 10
}}
]}
].
37 changes: 37 additions & 0 deletions priv/templates/nova_kura/prod_sys.config.src
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-

[
{kernel, [
{logger_level, info},
{logger,
[{handler, default, logger_std_h,
#{formatter => {nova_jsonlogger, #{new_line => true}}}}
]}
]},
{nova, [
{shutdown_delay, 5000},
{shutdown_drain_timeout, 15000},
{use_stacktrace, false},
{environment, prod},
{cowboy_configuration, #{
port => 8080
}},
{dev_mode, false},
{bootstrap_application, {{name}}},
{plugins, [
{pre_request, nova_request_plugin, #{decode_json_body => true}}
]}
]},
{{{name}}, [
{{{name}}_repo, #{
database => <<"{{name}}_prod">>,
hostname => <<"localhost">>,
port => 5432,
username => <<"postgres">>,
password => <<"postgres">>,
pool_size => 20
}}
]}
%% In production, set DATABASE_URL environment variable instead.
%% The repo init/1 callback will parse it automatically.
].
82 changes: 82 additions & 0 deletions priv/templates/nova_kura/rebar.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-

{erl_opts, [debug_info]}.
{src_dirs, [{"src", [{recursive, true}]}]}.
{shell, [{config, "./config/dev_sys.config.src"}]}.

{erlydtl_opts, [
{doc_root, "src/views"},
{recursive, true},
{libraries, [
{nova_erlydtl_inventory, nova_erlydtl_inventory}
]},
{default_libraries, [nova_erlydtl_inventory]}
]}.

{deps, [
nova,
kura,
%% Used for logging - Change if needed
{flatlog, "0.1.2"}
]}.

%% Release profiles
%% To create a release just run
%% rebar3 as prod release
{relx, [
{release, {{{name}}, git}, [
{{name}},
sasl
]},
{mode, dev},
{sys_config_src, "./config/dev_sys.config.src"},
{vm_args_src, "./config/vm.args.src"}
]}.

{profiles, [
{prod, [
{relx, [
{mode, prod},
{sys_config_src, "./config/prod_sys.config.src"}
]}
]},
{test, [
{erl_opts, [nowarn_export_all, warnings_as_errors, {i, "test/util"}]},
{deps, [
{meck, "1.1.0"}
]},
{ct_opts, [{sys_config, "./config/dev_sys.config.src"}]},
{extra_src_dirs, [{"test", [{recursive, true}]}]},
{xref_extra_paths, ["test"]}
]}
]}.

{dialyzer, [{plt_apps, all_deps}]}.

%% Plugins for rebar3
{project_plugins, [
{rebar3_erlydtl_plugin, ".*",
{git, "https://github.com/erlydtl/rebar3_erlydtl_plugin.git", {branch, "master"}}},
{rebar3_nova, ".*",
{git, "https://github.com/novaframework/rebar3_nova.git", {branch, "master"}}},
{erlfmt, "~>1.7"}
]}.

{erlfmt, [
write,
{files, [
"rebar.config",
"src/*.app.src",
"src/**/{*.erl, *.hrl}",
"test/**/{*.erl, *.hrl}"
]},
{exclude_files, ["config/vm.args.src", "config/prod_sys.config.src"]}
]}.

{xref_checks, [
undefined_function_calls,
undefined_functions,
locals_not_used,
deprecated_function_calls,
deprecated_functions
]}.
Loading