Fail-fast secrets in stage/prod via EVENTHUB_ENV. Refs EventHub/EventHubBack#25

This commit is contained in:
2026-07-07 19:52:04 +03:00
parent 018bf85b87
commit cf8e6bcc07
10 changed files with 855 additions and 583 deletions
+55 -26
View File
@@ -3,6 +3,15 @@
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
case infra_secrets:validate_startup() of
ok ->
start_application();
{error, Reason} ->
io:format("~nFATAL: secret validation failed: ~p~n", [Reason]),
{error, Reason}
end.
start_application() ->
case infra_sup:start_link() of
{ok, Pid} ->
% Определяем список узлов кластера, если режим CLUSTER_MODE=true
@@ -48,8 +57,10 @@ start(_StartType, _StartArgs) ->
start_swagger_http(), % Swagger UI и спецификация (8447)
application:ensure_all_started(prometheus),
application:ensure_all_started(prometheus_cowboy),
init_default_admins(),
{ok, Pid};
case init_default_admins() of
ok -> {ok, Pid};
{error, Reason} -> {error, Reason}
end;
Error ->
Error
end.
@@ -199,31 +210,49 @@ start_swagger_http() ->
init_default_admins() ->
case core_admin:list_all() of
[] ->
% Суперадмин
SuperEmail = list_to_binary(os:getenv("ADMIN_SUPER_EMAIL", "superadmin@eventhub.local")),
SuperPass = list_to_binary(os:getenv("ADMIN_SUPER_PASSWORD", "123456")),
{ok, _} = core_admin:create(SuperEmail, SuperPass, superadmin),
io:format("Default superadmin created: ~s~n", [SuperEmail]),
% Админ
AdminEmail = list_to_binary(os:getenv("ADMIN_EMAIL", "admin@eventhub.local")),
AdminPass = list_to_binary(os:getenv("ADMIN_PASSWORD", "123456")),
{ok, _} = core_admin:create(AdminEmail, AdminPass, admin),
io:format("Default admin created: ~s~n", [AdminEmail]),
% Модератор
ModerEmail = list_to_binary(os:getenv("ADMIN_MODER_EMAIL", "moderator@eventhub.local")),
ModerPass = list_to_binary(os:getenv("ADMIN_MODER_PASSWORD", "123456")),
{ok, _} = core_admin:create(ModerEmail, ModerPass, moderator),
io:format("Default moderator created: ~s~n", [ModerEmail]),
% Поддержка
SupportEmail = list_to_binary(os:getenv("ADMIN_SUPPORT_EMAIL", "support@eventhub.local")),
SupportPass = list_to_binary(os:getenv("ADMIN_SUPPORT_PASSWORD", "123456")),
{ok, _} = core_admin:create(SupportEmail, SupportPass, support),
io:format("Default support created: ~s~n", [SupportEmail]);
seed_default_admins();
_ ->
io:format("Admins already exist. Skipping creation.~n")
io:format("Admins already exist. Skipping creation.~n"),
ok
end.
seed_default_admins() ->
Admins = [
{superadmin, "ADMIN_SUPER_EMAIL", "superadmin@eventhub.local",
"ADMIN_SUPER_PASSWORD", "123456"},
{admin, "ADMIN_EMAIL", "admin@eventhub.local",
"ADMIN_PASSWORD", "123456"},
{moderator, "ADMIN_MODER_EMAIL", "moderator@eventhub.local",
"ADMIN_MODER_PASSWORD", "123456"},
{support, "ADMIN_SUPPORT_EMAIL", "support@eventhub.local",
"ADMIN_SUPPORT_PASSWORD", "123456"}
],
lists:foldl(fun seed_admin/2, ok, Admins).
seed_admin({Role, EmailKey, DefaultEmail, PassKey, DefaultPass}, ok) ->
case admin_credentials(EmailKey, DefaultEmail, PassKey, DefaultPass) of
{error, _} = Err -> Err;
{ok, {Email, Pass}} ->
{ok, _} = core_admin:create(Email, Pass, Role),
io:format("Default ~p created: ~s~n", [Role, Email]),
ok
end;
seed_admin(_, Err) -> Err.
admin_credentials(EmailKey, DefaultEmail, PassKey, DefaultPass) ->
case infra_secrets:is_dev() of
true ->
{ok, {list_to_binary(os:getenv(EmailKey, DefaultEmail)),
list_to_binary(os:getenv(PassKey, DefaultPass))}};
false ->
case infra_secrets:require_admin_seed_email(EmailKey) of
{error, _} = Err -> Err;
{ok, Email} ->
case infra_secrets:require_admin_seed_password(PassKey) of
{error, _} = Err -> Err;
{ok, Pass} -> {ok, {Email, Pass}}
end
end
end.
get_env_int(Key, Default) ->