From 4720bda29bee313806d769ad6bbcd36e30b4f3fd Mon Sep 17 00:00:00 2001 From: zhengkunwang <31820853+zhengkunwang223@users.noreply.github.com> Date: Mon, 23 Sep 2024 18:32:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20OpenResty=20=E5=A2=9E=E5=8A=A0=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=89=A9=E5=B1=95=20(#6556)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/app/dto/nginx.go | 8 ++ agent/app/dto/request/nginx.go | 1 + agent/app/dto/response/nginx.go | 15 ++- agent/app/service/nginx.go | 42 ++++++-- frontend/src/api/interface/nginx.ts | 19 ++-- frontend/src/api/modules/nginx.ts | 2 +- frontend/src/lang/modules/en.ts | 7 ++ frontend/src/lang/modules/tw.ts | 5 + frontend/src/lang/modules/zh.ts | 5 + .../website/nginx/module/build/index.vue | 96 +++++++++++++++++++ .../website/website/nginx/module/index.vue | 61 +++++++----- .../website/nginx/module/operate/index.vue | 31 ++++-- 12 files changed, 235 insertions(+), 57 deletions(-) create mode 100644 frontend/src/views/website/website/nginx/module/build/index.vue diff --git a/agent/app/dto/nginx.go b/agent/app/dto/nginx.go index 54908c53a..df1f09821 100644 --- a/agent/app/dto/nginx.go +++ b/agent/app/dto/nginx.go @@ -84,3 +84,11 @@ type NginxUpstreamServer struct { var LBAlgorithms = map[string]struct{}{"ip_hash": {}, "least_conn": {}} var RealIPKeys = map[string]struct{}{"X-Forwarded-For": {}, "X-Real-IP": {}, "CF-Connecting-IP": {}} + +type NginxModule struct { + Name string `json:"name"` + Script string `json:"script"` + Packages []string `json:"packages"` + Params string `json:"params"` + Enable bool `json:"enable"` +} diff --git a/agent/app/dto/request/nginx.go b/agent/app/dto/request/nginx.go index 37eaeaed1..946eeedc0 100644 --- a/agent/app/dto/request/nginx.go +++ b/agent/app/dto/request/nginx.go @@ -109,6 +109,7 @@ type NginxRedirectUpdate struct { type NginxBuildReq struct { TaskID string `json:"taskID" validate:"required"` + Mirror string `json:"mirror" validate:"required"` } type NginxModuleUpdate struct { diff --git a/agent/app/dto/response/nginx.go b/agent/app/dto/response/nginx.go index 415d7b26c..4a48e654a 100644 --- a/agent/app/dto/response/nginx.go +++ b/agent/app/dto/response/nginx.go @@ -69,9 +69,14 @@ type NginxProxyCache struct { } type NginxModule struct { - Name string `json:"name"` - Script string `json:"script"` - Packages []string `json:"packages"` - Params string `json:"params"` - Enable bool `json:"enable"` + Name string `json:"name"` + Script string `json:"script"` + Packages string `json:"packages"` + Params string `json:"params"` + Enable bool `json:"enable"` +} + +type NginxBuildConfig struct { + Mirror string `json:"mirror"` + Modules []NginxModule `json:"modules"` } diff --git a/agent/app/service/nginx.go b/agent/app/service/nginx.go index e80ad0e2e..bc07e31e4 100644 --- a/agent/app/service/nginx.go +++ b/agent/app/service/nginx.go @@ -37,7 +37,7 @@ type INginxService interface { ClearProxyCache() error Build(req request.NginxBuildReq) error - GetModules() ([]response.NginxModule, error) + GetModules() (*response.NginxBuildConfig, error) UpdateModule(req request.NginxModuleUpdate) error } @@ -179,7 +179,7 @@ func (n NginxService) Build(req request.NginxBuildReq) error { return err } var ( - modules []response.NginxModule + modules []dto.NginxModule addModuleParams []string addPackages []string ) @@ -211,6 +211,7 @@ func (n NginxService) Build(req request.NginxBuildReq) error { if err != nil { return err } + envs["CONTAINER_PACKAGE_URL"] = req.Mirror envs["RESTY_CONFIG_OPTIONS_MORE"] = "" envs["RESTY_ADD_PACKAGE_BUILDDEPS"] = "" if len(addModuleParams) > 0 { @@ -239,16 +240,16 @@ func (n NginxService) Build(req request.NginxBuildReq) error { return nil } -func (n NginxService) GetModules() ([]response.NginxModule, error) { +func (n NginxService) GetModules() (*response.NginxBuildConfig, error) { nginxInstall, err := getAppInstallByKey(constant.AppOpenresty) if err != nil { return nil, err } fileOp := files.NewFileOp() - var modules []response.NginxModule + var modules []dto.NginxModule moduleConfigPath := path.Join(nginxInstall.GetPath(), "build", "module.json") if !fileOp.Stat(moduleConfigPath) { - return modules, nil + return nil, nil } moduleContent, err := fileOp.GetContent(moduleConfigPath) if err != nil { @@ -257,7 +258,25 @@ func (n NginxService) GetModules() ([]response.NginxModule, error) { if len(moduleContent) > 0 { _ = json.Unmarshal(moduleContent, &modules) } - return modules, nil + var resList []response.NginxModule + for _, module := range modules { + resList = append(resList, response.NginxModule{ + Name: module.Name, + Script: module.Script, + Packages: strings.Join(module.Packages, ","), + Params: module.Params, + Enable: module.Enable, + }) + } + envs, err := gotenv.Read(nginxInstall.GetEnvPath()) + if err != nil { + return nil, err + } + + return &response.NginxBuildConfig{ + Mirror: envs["CONTAINER_PACKAGE_URL"], + Modules: resList, + }, nil } func (n NginxService) UpdateModule(req request.NginxModuleUpdate) error { @@ -266,7 +285,9 @@ func (n NginxService) UpdateModule(req request.NginxModuleUpdate) error { return err } fileOp := files.NewFileOp() - var modules []response.NginxModule + var ( + modules []dto.NginxModule + ) moduleConfigPath := path.Join(nginxInstall.GetPath(), "build", "module.json") if !fileOp.Stat(moduleConfigPath) { _ = fileOp.CreateFile(moduleConfigPath) @@ -278,6 +299,7 @@ func (n NginxService) UpdateModule(req request.NginxModuleUpdate) error { if len(moduleContent) > 0 { _ = json.Unmarshal(moduleContent, &modules) } + switch req.Operate { case "create": for _, module := range modules { @@ -285,10 +307,10 @@ func (n NginxService) UpdateModule(req request.NginxModuleUpdate) error { return buserr.New("ErrNameIsExist") } } - modules = append(modules, response.NginxModule{ + modules = append(modules, dto.NginxModule{ Name: req.Name, Script: req.Script, - Packages: strings.Split(req.Packages, " "), + Packages: strings.Split(req.Packages, ","), Params: req.Params, Enable: true, }) @@ -296,7 +318,7 @@ func (n NginxService) UpdateModule(req request.NginxModuleUpdate) error { for i, module := range modules { if module.Name == req.Name { modules[i].Script = req.Script - modules[i].Packages = strings.Split(req.Packages, " ") + modules[i].Packages = strings.Split(req.Packages, ",") modules[i].Params = req.Params modules[i].Enable = req.Enable break diff --git a/frontend/src/api/interface/nginx.ts b/frontend/src/api/interface/nginx.ts index 5f5b4b5d1..aba13b71e 100644 --- a/frontend/src/api/interface/nginx.ts +++ b/frontend/src/api/interface/nginx.ts @@ -31,22 +31,23 @@ export namespace Nginx { export interface NginxBuildReq { taskID: string; + mirror: string; } export interface NginxModule { - name: string; - script?: string; - packages?: string[]; - enable: boolean; - params: string; - } - - export interface NginxModuleUpdate { - operate: string; name: string; script?: string; packages?: string; enable: boolean; params: string; } + + export interface NginxBuildConfig { + mirror: string; + modules: NginxModule[]; + } + + export interface NginxModuleUpdate extends NginxModule { + operate: string; + } } diff --git a/frontend/src/api/modules/nginx.ts b/frontend/src/api/modules/nginx.ts index dd6061f91..bba625fe7 100644 --- a/frontend/src/api/modules/nginx.ts +++ b/frontend/src/api/modules/nginx.ts @@ -31,7 +31,7 @@ export const BuildNginx = (req: Nginx.NginxBuildReq) => { }; export const GetNginxModules = () => { - return http.get(`/openresty/modules`); + return http.get(`/openresty/modules`); }; export const UpdateNginxModule = (req: Nginx.NginxModuleUpdate) => { diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 6c02b91ea..cd54c553f 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -2260,6 +2260,13 @@ const message = { build: 'Build', buildWarn: 'Building OpenResty requires reserving a certain amount of CPU and memory, which may take a long time, please be patient', + mirrorUrl: 'Software Source', + paramsHelper: 'For example: --add-module=/tmp/ngx_brotli', + packagesHelper: 'For example: git, curl (separated by commas)', + scriptHelper: + 'Scripts to execute before compilation, usually for downloading module source code, installing dependencies, etc.', + buildHelper: + 'Click build after adding/modifying a module. OpenResty will automatically restart upon successful build.', }, ssl: { create: 'Apply', diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts index 83156de9e..ef3cfeded 100644 --- a/frontend/src/lang/modules/tw.ts +++ b/frontend/src/lang/modules/tw.ts @@ -2104,6 +2104,11 @@ const message = { module: '模組', build: '建構', buildWarn: '建構 OpenResty 需要預留一定的 CPU 和內存,時間較長,請耐心等待', + mirrorUrl: '軟體源', + paramsHelper: '例如:--add-module=/tmp/ngx_brotli', + packagesHelper: '例如:git,curl 以逗號分割', + scriptHelper: '編譯之前執行的腳本,通常用於下載模組原始碼,安裝依賴等', + buildHelper: '添加/修改模組後點擊構建,構建成功後會自動重啟 OpenResty', }, ssl: { create: '申請證書', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index cbe44afb6..ce76bd942 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -2105,6 +2105,11 @@ const message = { module: '模块', build: '构建', buildWarn: '构建 OpenResty 需要预留一定的 CPU 和内存,时间较长,请耐心等待', + mirrorUrl: '软件源', + paramsHelper: '例如:--add-module=/tmp/ngx_brotli', + packagesHelper: '例如:git,curl 按,分割', + scriptHelper: '编译之前执行的脚本,一般为下载模块源码,安装依赖等', + buildHelper: '添加/修改模块之后点击构建,构建成功后会自动重启 OpenResty', }, ssl: { create: '申请证书', diff --git a/frontend/src/views/website/website/nginx/module/build/index.vue b/frontend/src/views/website/website/nginx/module/build/index.vue new file mode 100644 index 000000000..a7d150a7d --- /dev/null +++ b/frontend/src/views/website/website/nginx/module/build/index.vue @@ -0,0 +1,96 @@ + + diff --git a/frontend/src/views/website/website/nginx/module/index.vue b/frontend/src/views/website/website/nginx/module/index.vue index 21bc78ab0..cd75da649 100644 --- a/frontend/src/views/website/website/nginx/module/index.vue +++ b/frontend/src/views/website/website/nginx/module/index.vue @@ -4,40 +4,46 @@ - +