From 069e99dc160b3995c1692e5920be67b0cef7dd31 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Mon, 11 May 2026 22:42:00 +0800 Subject: [PATCH] fix apps --- CODE_LOGIC_OVERVIEW.md | 9 ++-- apps/docker/src/docker.app.src | 18 ++++++++ apps/docker/src/docker_app.erl | 18 ++++++++ .../docker => docker/src}/docker_client.erl | 0 .../docker => docker/src}/docker_commands.erl | 0 .../src}/docker_commands_tests.erl | 0 .../src}/docker_container_builder.erl | 0 .../src}/docker_deploy_manager.erl | 2 +- .../docker => docker/src}/docker_deployer.erl | 0 .../docker => docker/src}/docker_events.erl | 0 .../docker => docker/src}/docker_helper.erl | 12 +++++- apps/docker/src/docker_sup.erl | 42 +++++++++++++++++++ .../src}/docker_task_reporter.erl | 0 .../efka_docker_container_builder_tests.erl | 0 apps/efka/src/efka.app.src | 2 +- apps/efka/src/efka_sup.erl | 27 ------------ config/sys.config | 5 ++- docs/container_command_docker_json.md | 12 +++--- 18 files changed, 107 insertions(+), 40 deletions(-) create mode 100644 apps/docker/src/docker.app.src create mode 100644 apps/docker/src/docker_app.erl rename apps/{efka/src/docker => docker/src}/docker_client.erl (100%) rename apps/{efka/src/docker => docker/src}/docker_commands.erl (100%) rename apps/{efka/src/tests => docker/src}/docker_commands_tests.erl (100%) rename apps/{efka/src/docker => docker/src}/docker_container_builder.erl (100%) rename apps/{efka/src/docker => docker/src}/docker_deploy_manager.erl (98%) rename apps/{efka/src/docker => docker/src}/docker_deployer.erl (100%) rename apps/{efka/src/docker => docker/src}/docker_events.erl (100%) rename apps/{efka/src/docker => docker/src}/docker_helper.erl (93%) create mode 100644 apps/docker/src/docker_sup.erl rename apps/{efka/src/docker => docker/src}/docker_task_reporter.erl (100%) rename apps/{efka => docker}/test/efka_docker_container_builder_tests.erl (100%) diff --git a/CODE_LOGIC_OVERVIEW.md b/CODE_LOGIC_OVERVIEW.md index 5e5221b..c19c0a9 100644 --- a/CODE_LOGIC_OVERVIEW.md +++ b/CODE_LOGIC_OVERVIEW.md @@ -44,10 +44,13 @@ WebSocket server: - `service_model`:DETS 服务状态表。 - `efka_subscription`:本地 topic 订阅中心。 - `efka_client`:连接上游 TLS server 的状态机。 + +`docker` application 启动的子进程: + - `docker_task_reporter`:部署任务事件缓冲和转发。 - `docker_deploy_manager`:部署任务管理器。 -`docker_events` 代码存在,但在 `efka_sup` 中被注释掉了,目前默认不会启动。 +`docker_events` 代码存在于 `apps/docker`,但目前默认不会启动。 ## 3. 两条通信链路 @@ -180,7 +183,7 @@ topic 匹配规则: 部署操作: 1. `docker_container_service` 收到 `deploy` 后调用 `docker_deploy_manager:deploy(TaskId, Params)`。 -2. `docker_deploy_manager` 根据 `root_dir` 和参数里的 `container_name/container_dir` 确保容器目录存在。 +2. `docker_deploy_manager` 根据 `docker.root_dir` 和参数里的 `container_name/container_dir` 确保容器目录存在。 3. 它启动一个独立 `docker_deployer` 进程,并 monitor 该部署进程。 4. `docker_deployer` 执行实际部署步骤。 5. 部署过程事件写入 `docker_task_reporter`。 @@ -261,7 +264,7 @@ topic 匹配规则: 关键配置来自 `config/sys.config`: -- `root_dir`:容器相关目录根路径。 +- `docker.root_dir`:容器相关目录根路径。 - `dets_dir`:DETS 文件目录。 - `websocket_server`:本地 WebSocket 监听配置。 - `tls_server_address`:上游 TLS server 地址。 diff --git a/apps/docker/src/docker.app.src b/apps/docker/src/docker.app.src new file mode 100644 index 0000000..2ac7ed5 --- /dev/null +++ b/apps/docker/src/docker.app.src @@ -0,0 +1,18 @@ +{application, docker, + [{description, "Docker integration application"}, + {vsn, "0.1.0"}, + {registered, []}, + {mod, {docker_app, []}}, + {applications, + [ + gun, + kernel, + stdlib + ]}, + {env, [ + {root_dir, "/usr/local/code/efka"} + ]}, + {modules, []}, + {licenses, ["Apache-2.0"]}, + {links, []} + ]}. diff --git a/apps/docker/src/docker_app.erl b/apps/docker/src/docker_app.erl new file mode 100644 index 0000000..5975e71 --- /dev/null +++ b/apps/docker/src/docker_app.erl @@ -0,0 +1,18 @@ +%%%------------------------------------------------------------------- +%% @doc Docker application entry point. +%% @end +%%%------------------------------------------------------------------- + +-module(docker_app). + +-behaviour(application). + +-export([start/2, stop/1]). + +-spec start(term(), term()) -> {ok, pid()} | {error, term()}. +start(_StartType, _StartArgs) -> + docker_sup:start_link(). + +-spec stop(term()) -> ok. +stop(_State) -> + ok. diff --git a/apps/efka/src/docker/docker_client.erl b/apps/docker/src/docker_client.erl similarity index 100% rename from apps/efka/src/docker/docker_client.erl rename to apps/docker/src/docker_client.erl diff --git a/apps/efka/src/docker/docker_commands.erl b/apps/docker/src/docker_commands.erl similarity index 100% rename from apps/efka/src/docker/docker_commands.erl rename to apps/docker/src/docker_commands.erl diff --git a/apps/efka/src/tests/docker_commands_tests.erl b/apps/docker/src/docker_commands_tests.erl similarity index 100% rename from apps/efka/src/tests/docker_commands_tests.erl rename to apps/docker/src/docker_commands_tests.erl diff --git a/apps/efka/src/docker/docker_container_builder.erl b/apps/docker/src/docker_container_builder.erl similarity index 100% rename from apps/efka/src/docker/docker_container_builder.erl rename to apps/docker/src/docker_container_builder.erl diff --git a/apps/efka/src/docker/docker_deploy_manager.erl b/apps/docker/src/docker_deploy_manager.erl similarity index 98% rename from apps/efka/src/docker/docker_deploy_manager.erl rename to apps/docker/src/docker_deploy_manager.erl index 0e4b4af..9cecaa1 100644 --- a/apps/efka/src/docker/docker_deploy_manager.erl +++ b/apps/docker/src/docker_deploy_manager.erl @@ -43,7 +43,7 @@ deploy(TaskId, Params) when is_integer(TaskId), is_map(Params) -> -spec init(list()) -> {ok, #state{}}. init([]) -> erlang:process_flag(trap_exit, true), - {ok, RootDir} = application:get_env(efka, root_dir), + {ok, RootDir} = docker_helper:root_dir(), {ok, #state{root_dir = RootDir}}. -spec handle_call(term(), {pid(), term()}, #state{}) -> {reply, term(), #state{}}. diff --git a/apps/efka/src/docker/docker_deployer.erl b/apps/docker/src/docker_deployer.erl similarity index 100% rename from apps/efka/src/docker/docker_deployer.erl rename to apps/docker/src/docker_deployer.erl diff --git a/apps/efka/src/docker/docker_events.erl b/apps/docker/src/docker_events.erl similarity index 100% rename from apps/efka/src/docker/docker_events.erl rename to apps/docker/src/docker_events.erl diff --git a/apps/efka/src/docker/docker_helper.erl b/apps/docker/src/docker_helper.erl similarity index 93% rename from apps/efka/src/docker/docker_helper.erl rename to apps/docker/src/docker_helper.erl index ef1fffc..138fd0f 100644 --- a/apps/efka/src/docker/docker_helper.erl +++ b/apps/docker/src/docker_helper.erl @@ -10,9 +10,19 @@ -author("anlicheng"). %% API +-export([root_dir/0]). -export([ensure_container_dir/2, ensure_container_dir/3, get_container_dir/2, get_config_file/1]). -export([update_container_config/2]). +-spec root_dir() -> {ok, string()} | undefined. +root_dir() -> + case application:get_env(docker, root_dir) of + {ok, RootDir} -> + {ok, RootDir}; + undefined -> + application:get_env(efka, root_dir) + end. + -spec ensure_container_dir(RootDir :: string(), ContainerName :: binary()) -> {ok, ServerRootDir :: string()}. ensure_container_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(ContainerName) -> ensure_container_dir(RootDir, ContainerName, <<>>). @@ -52,7 +62,7 @@ get_container_dir(RootDir, ContainerName) when is_list(RootDir), is_binary(Conta -spec update_container_config(binary(), binary()) -> ok | {error, binary()}. update_container_config(ContainerName, Config) when is_binary(ContainerName), is_binary(Config) -> - {ok, RootDir} = application:get_env(efka, root_dir), + {ok, RootDir} = root_dir(), case get_container_dir(RootDir, ContainerName) of {ok, ContainerDir} -> ConfigFile = get_config_file(ContainerDir), diff --git a/apps/docker/src/docker_sup.erl b/apps/docker/src/docker_sup.erl new file mode 100644 index 0000000..2fd5ee3 --- /dev/null +++ b/apps/docker/src/docker_sup.erl @@ -0,0 +1,42 @@ +%%%------------------------------------------------------------------- +%% @doc Docker top level supervisor. +%% @end +%%%------------------------------------------------------------------- + +-module(docker_sup). + +-behaviour(supervisor). + +-export([start_link/0]). +-export([init/1]). + +-define(SERVER, ?MODULE). + +-spec start_link() -> {ok, pid()} | ignore | {error, term()}. +start_link() -> + supervisor:start_link({local, ?SERVER}, ?MODULE, []). + +-spec init(list()) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}. +init([]) -> + SupFlags = #{strategy => one_for_one, intensity => 1000, period => 3600}, + ChildSpecs = [ + #{ + id => docker_task_reporter, + start => {docker_task_reporter, start_link, []}, + restart => permanent, + shutdown => 2000, + type => worker, + modules => [docker_task_reporter] + }, + + #{ + id => docker_deploy_manager, + start => {docker_deploy_manager, start_link, []}, + restart => permanent, + shutdown => 2000, + type => worker, + modules => [docker_deploy_manager] + } + ], + + {ok, {SupFlags, ChildSpecs}}. diff --git a/apps/efka/src/docker/docker_task_reporter.erl b/apps/docker/src/docker_task_reporter.erl similarity index 100% rename from apps/efka/src/docker/docker_task_reporter.erl rename to apps/docker/src/docker_task_reporter.erl diff --git a/apps/efka/test/efka_docker_container_builder_tests.erl b/apps/docker/test/efka_docker_container_builder_tests.erl similarity index 100% rename from apps/efka/test/efka_docker_container_builder_tests.erl rename to apps/docker/test/efka_docker_container_builder_tests.erl diff --git a/apps/efka/src/efka.app.src b/apps/efka/src/efka.app.src index 12e2753..16ed106 100644 --- a/apps/efka/src/efka.app.src +++ b/apps/efka/src/efka.app.src @@ -6,10 +6,10 @@ {applications, [ sync, + docker, cowboy, ranch, crypto, - gun, cowlib, inets, ssl, diff --git a/apps/efka/src/efka_sup.erl b/apps/efka/src/efka_sup.erl index 1eb7417..76186ea 100644 --- a/apps/efka/src/efka_sup.erl +++ b/apps/efka/src/efka_sup.erl @@ -48,15 +48,6 @@ init([]) -> modules => ['efka_service_sup'] }, - %#{ - % id => 'docker_events', - % start => {'docker_events', start_link, []}, - % restart => permanent, - % shutdown => 2000, - % type => worker, - % modules => ['docker_events'] - %}, - #{ id => service_model, start => {service_model, start_link, []}, @@ -91,24 +82,6 @@ init([]) -> shutdown => 2000, type => worker, modules => ['efka_heartbeat'] - }, - - #{ - id => 'docker_task_reporter', - start => {'docker_task_reporter', start_link, []}, - restart => permanent, - shutdown => 2000, - type => worker, - modules => ['docker_task_reporter'] - }, - - #{ - id => 'docker_deploy_manager', - start => {'docker_deploy_manager', start_link, []}, - restart => permanent, - shutdown => 2000, - type => worker, - modules => ['docker_deploy_manager'] } ], diff --git a/config/sys.config b/config/sys.config index b0a190d..04be2c8 100644 --- a/config/sys.config +++ b/config/sys.config @@ -1,6 +1,5 @@ [ {efka, [ - {root_dir, "/usr/local/code/efka"}, {dets_dir, "/usr/local/code/tmp/dets/"}, {websocket_server, [ @@ -27,6 +26,10 @@ ]}, + {docker, [ + {root_dir, "/usr/local/code/efka"} + ]}, + %% 系统日志配置,使用 OTP logger {kernel, [ %% 设置 Logger 的 primary log level diff --git a/docs/container_command_docker_json.md b/docs/container_command_docker_json.md index a403996..8ccb519 100644 --- a/docs/container_command_docker_json.md +++ b/docs/container_command_docker_json.md @@ -5,10 +5,10 @@ 对应代码: - command 接收入口:[src/transport/efka_client.erl](/usr/local/code/cloudkit/efka/apps/efka/src/transport/efka_client.erl:177) -- 部署任务管理:[src/docker/docker_deploy_manager.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_deploy_manager.erl:36) -- 部署执行:[src/docker/docker_deployer.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_deployer.erl:39) -- Docker JSON 构造:[src/docker/docker_container_builder.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_container_builder.erl:14) -- Docker API 调用:[src/docker/docker_commands.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_commands.erl:36) +- 部署任务管理:[docker_deploy_manager.erl](/usr/local/code/cloudkit/efka/apps/docker/src/docker_deploy_manager.erl:36) +- 部署执行:[docker_deployer.erl](/usr/local/code/cloudkit/efka/apps/docker/src/docker_deployer.erl:39) +- Docker JSON 构造:[docker_container_builder.erl](/usr/local/code/cloudkit/efka/apps/docker/src/docker_container_builder.erl:14) +- Docker API 调用:[docker_commands.erl](/usr/local/code/cloudkit/efka/apps/docker/src/docker_commands.erl:36) ## 1. 协议入口 @@ -214,7 +214,7 @@ docker_helper:update_container_config(ContainerNameOrId, iolist_to_binary(Config `docker_deploy_manager` 会根据 `container_name` 按系统默认规则确保容器目录存在。目录固定为: ```text -efka.root_dir/container_name/ +docker.root_dir/container_name/ ``` 即使旧客户端在 `params` 中携带 `container_dir`,当前 deploy 流程也会忽略它,避免 HTTP 调用方控制 efka 主机上的写入目录。 @@ -790,7 +790,7 @@ efka 自动补丁后输出: deploy action 的执行流程: -1. 根据 `container_name` 和 `efka.root_dir` 确保默认容器目录存在。 +1. 根据 `container_name` 和 `docker.root_dir` 确保默认容器目录存在。 2. 启动独立部署进程。 3. 部署进程上报任务事件流。 4. 规范化镜像名:如果镜像最后一段没有 tag,则补 `:latest`。