From c8c0446308358cc23f112b73085f623be4e9995d Mon Sep 17 00:00:00 2001 From: Jacky Date: Sat, 26 Oct 2024 13:00:52 +0800 Subject: [PATCH] chore: prepare v2.0.0-beta.37 --- api/system/install.go | 4 +- app/components.d.ts | 2 - app/package.json | 6 +-- app/pnpm-lock.yaml | 39 ++++++---------- app/src/version.json | 2 +- go.mod | 2 +- go.sum | 4 ++ img.png | Bin 40441 -> 0 bytes internal/{kernal => kernel}/boot.go | 3 +- .../{kernal => kernel}/register_acme_user.go | 2 +- internal/{kernal => kernel}/skip_install.go | 2 +- main.go | 44 +++++++++++++----- settings/server_v1.go | 6 +-- settings/server_v1_test.go | 2 +- settings/settings.go | 11 ++++- 15 files changed, 75 insertions(+), 54 deletions(-) delete mode 100644 img.png rename internal/{kernal => kernel}/boot.go (98%) rename internal/{kernal => kernel}/register_acme_user.go (96%) rename internal/{kernal => kernel}/skip_install.go (99%) diff --git a/api/system/install.go b/api/system/install.go index 533b39ea..bfac832c 100644 --- a/api/system/install.go +++ b/api/system/install.go @@ -2,7 +2,7 @@ package system import ( "github.com/0xJacky/Nginx-UI/api" - "github.com/0xJacky/Nginx-UI/internal/kernal" + "github.com/0xJacky/Nginx-UI/internal/kernel" "github.com/0xJacky/Nginx-UI/model" "github.com/0xJacky/Nginx-UI/query" "github.com/0xJacky/Nginx-UI/settings" @@ -58,7 +58,7 @@ func InstallNginxUI(c *gin.Context) { } // Init model - kernal.InitDatabase() + kernel.InitDatabase() pwd, _ := bcrypt.GenerateFromPassword([]byte(json.Password), bcrypt.DefaultCost) diff --git a/app/components.d.ts b/app/components.d.ts index 89bb9ba5..42e75225 100644 --- a/app/components.d.ts +++ b/app/components.d.ts @@ -49,8 +49,6 @@ declare module 'vue' { APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] APopover: typeof import('ant-design-vue/es')['Popover'] AProgress: typeof import('ant-design-vue/es')['Progress'] - ARadioButton: typeof import('ant-design-vue/es')['RadioButton'] - ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] AResult: typeof import('ant-design-vue/es')['Result'] ARow: typeof import('ant-design-vue/es')['Row'] ASelect: typeof import('ant-design-vue/es')['Select'] diff --git a/app/package.json b/app/package.json index 6b5674b4..627c3db1 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "nginx-ui-app-next", "type": "module", - "version": "2.0.0-beta.36", + "version": "2.0.0-beta.37", "packageManager": "pnpm@9.12.2", "scripts": { "dev": "vite --host", @@ -54,10 +54,10 @@ "@antfu/eslint-config": "^3.8.0", "@iconify-json/fa": "1.1.5", "@iconify-json/tabler": "1.1.95", - "@iconify/tools": "3.0.5", + "@iconify/tools": "^4.0.7", "@iconify/types": "^2.0.0", "@iconify/utils": "^2.1.33", - "@iconify/vue": "4.1.1", + "@iconify/vue": "^4.1.2", "@simplewebauthn/types": "^11.0.0", "@types/lodash": "^4.17.12", "@types/nprogress": "^0.2.3", diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index 5dee75a9..b3e016cf 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -127,8 +127,8 @@ importers: specifier: 1.1.95 version: 1.1.95 '@iconify/tools': - specifier: 3.0.5 - version: 3.0.5 + specifier: ^4.0.7 + version: 4.0.7 '@iconify/types': specifier: ^2.0.0 version: 2.0.0 @@ -136,8 +136,8 @@ importers: specifier: ^2.1.33 version: 2.1.33 '@iconify/vue': - specifier: 4.1.1 - version: 4.1.1(vue@3.5.12(typescript@5.6.3)) + specifier: ^4.1.2 + version: 4.1.2(vue@3.5.12(typescript@5.6.3)) '@simplewebauthn/types': specifier: ^11.0.0 version: 11.0.0 @@ -1329,8 +1329,8 @@ packages: '@iconify-json/tabler@1.1.95': resolution: {integrity: sha512-Qg+VpKgSImpA9g2ger17cWIBvirlixUplTXshu/miegBCfaicYEyyX2pCilCJEuujeNVh47+ySD7CoBJS2f6pQ==} - '@iconify/tools@3.0.5': - resolution: {integrity: sha512-NYhdaOK/pPTInlNRQHP1iaOMQtu6XfIjhYh8KBUqAiKlmSWwjWYT4bm8RpNgtgEmYAYrm2PY28A2OGBP35pA1w==} + '@iconify/tools@4.0.7': + resolution: {integrity: sha512-zOJxKIfZn96ZRGGvIWzDRLD9vb2CsxjcLuM+QIdvwWbv6SWhm49gECzUnd4d2P0sq9sfodT7yCNobWK8nvavxQ==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -1338,8 +1338,8 @@ packages: '@iconify/utils@2.1.33': resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} - '@iconify/vue@4.1.1': - resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==} + '@iconify/vue@4.1.2': + resolution: {integrity: sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA==} peerDependencies: vue: '>=3' @@ -1514,9 +1514,6 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} - '@types/cheerio@0.22.35': - resolution: {integrity: sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==} - '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -3384,10 +3381,6 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} @@ -6080,19 +6073,21 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify/tools@3.0.5': + '@iconify/tools@4.0.7': dependencies: '@iconify/types': 2.0.0 '@iconify/utils': 2.1.33 - '@types/cheerio': 0.22.35 '@types/tar': 6.1.13 + axios: 1.7.7 cheerio: 1.0.0 + domhandler: 5.0.3 extract-zip: 2.0.1 - local-pkg: 0.4.3 + local-pkg: 0.5.0 pathe: 1.1.2 svgo: 3.3.2 tar: 6.2.1 transitivePeerDependencies: + - debug - supports-color '@iconify/types@2.0.0': {} @@ -6109,7 +6104,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@iconify/vue@4.1.1(vue@3.5.12(typescript@5.6.3))': + '@iconify/vue@4.1.2(vue@3.5.12(typescript@5.6.3))': dependencies: '@iconify/types': 2.0.0 vue: 3.5.12(typescript@5.6.3) @@ -6295,10 +6290,6 @@ snapshots: '@trysound/sax@0.2.0': {} - '@types/cheerio@0.22.35': - dependencies: - '@types/node': 22.7.9 - '@types/cookie@0.6.0': {} '@types/debug@4.1.12': @@ -8637,8 +8628,6 @@ snapshots: load-tsconfig@0.2.5: {} - local-pkg@0.4.3: {} - local-pkg@0.5.0: dependencies: mlly: 1.7.2 diff --git a/app/src/version.json b/app/src/version.json index ecfa7a49..e09f2c99 100644 --- a/app/src/version.json +++ b/app/src/version.json @@ -1 +1 @@ -{"version":"2.0.0-beta.36","build_id":1,"total_build":365} \ No newline at end of file +{"version":"2.0.0-beta.37","build_id":1,"total_build":366} \ No newline at end of file diff --git a/go.mod b/go.mod index 2046747a..a35ba12c 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/spf13/cast v1.7.0 github.com/stretchr/testify v1.9.0 github.com/tufanbarisyildirim/gonginx v0.0.0-20241013191809-e73b7dd454e8 - github.com/uozi-tech/cosy v1.9.8 + github.com/uozi-tech/cosy v1.9.9 github.com/uozi-tech/cosy-driver-sqlite v0.2.0 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.28.0 diff --git a/go.sum b/go.sum index 6e283a2d..778a2e8c 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,7 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -760,6 +761,7 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -1674,6 +1676,8 @@ github.com/uozi-tech/cosy v1.9.4 h1:oG5TbrS8XUpZnQ++9gxI5if0++uJ7h9nMPZPNeDgly0= github.com/uozi-tech/cosy v1.9.4/go.mod h1:aQI/OU3EVF125K5ECgSg3+CTfG4cp5XOkr++DEP/Fas= github.com/uozi-tech/cosy v1.9.8 h1:c3xKdG9Pa3PqRVjxr2teDjAGe0PNcFs1X5/fCiROkbY= github.com/uozi-tech/cosy v1.9.8/go.mod h1:aQI/OU3EVF125K5ECgSg3+CTfG4cp5XOkr++DEP/Fas= +github.com/uozi-tech/cosy v1.9.9 h1:hA8R9Q0JuykDG1G6WO62cgi2oxJyONrjdg525Xu7AG0= +github.com/uozi-tech/cosy v1.9.9/go.mod h1:aQI/OU3EVF125K5ECgSg3+CTfG4cp5XOkr++DEP/Fas= github.com/uozi-tech/cosy-driver-mysql v0.2.2 h1:22S/XNIvuaKGqxQPsYPXN8TZ8hHjCQdcJKVQ83Vzxoo= github.com/uozi-tech/cosy-driver-mysql v0.2.2/go.mod h1:EZnRIbSj1V5U0gEeTobrXai/d1SV11lkl4zP9NFEmyE= github.com/uozi-tech/cosy-driver-postgres v0.2.1 h1:OICakGuT+omva6QOJCxTJ5Lfr7CGXLmk/zD+aS51Z2o= diff --git a/img.png b/img.png deleted file mode 100644 index c1c9d3fbd826974d2279bd7afc8f90e6e1910649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40441 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 YMH9ZEzc%n|G690VXl78Q?-uj_0O$VRU;qFB diff --git a/internal/kernal/boot.go b/internal/kernel/boot.go similarity index 98% rename from internal/kernal/boot.go rename to internal/kernel/boot.go index 8cb59659..5a7eb57f 100644 --- a/internal/kernal/boot.go +++ b/internal/kernel/boot.go @@ -1,4 +1,4 @@ -package kernal +package kernel import ( "crypto/rand" @@ -27,7 +27,6 @@ func Boot() { defer recovery() async := []func(){ - settings.Init, InitJsExtensionType, InitDatabase, InitNodeSecret, diff --git a/internal/kernal/register_acme_user.go b/internal/kernel/register_acme_user.go similarity index 96% rename from internal/kernal/register_acme_user.go rename to internal/kernel/register_acme_user.go index 445b5204..3ace3f41 100644 --- a/internal/kernal/register_acme_user.go +++ b/internal/kernel/register_acme_user.go @@ -1,4 +1,4 @@ -package kernal +package kernel import ( "github.com/0xJacky/Nginx-UI/query" diff --git a/internal/kernal/skip_install.go b/internal/kernel/skip_install.go similarity index 99% rename from internal/kernal/skip_install.go rename to internal/kernel/skip_install.go index bc146467..364b6a24 100644 --- a/internal/kernal/skip_install.go +++ b/internal/kernel/skip_install.go @@ -1,4 +1,4 @@ -package kernal +package kernel import ( "github.com/0xJacky/Nginx-UI/model" diff --git a/main.go b/main.go index d33be71a..6933ff8c 100644 --- a/main.go +++ b/main.go @@ -3,34 +3,57 @@ package main import ( "flag" "fmt" - "github.com/0xJacky/Nginx-UI/internal/kernal" - "github.com/0xJacky/Nginx-UI/internal/nginx" + "github.com/0xJacky/Nginx-UI/internal/kernel" "github.com/0xJacky/Nginx-UI/model" "github.com/0xJacky/Nginx-UI/router" "github.com/0xJacky/Nginx-UI/settings" + "github.com/gin-gonic/gin" "github.com/jpillora/overseer" + "github.com/pkg/errors" "github.com/uozi-tech/cosy" + cKernel "github.com/uozi-tech/cosy/kernel" "github.com/uozi-tech/cosy/logger" + cRouter "github.com/uozi-tech/cosy/router" cSettings "github.com/uozi-tech/cosy/settings" + "net/http" "time" ) func Program(confPath string) func(state overseer.State) { return func(state overseer.State) { defer logger.Sync() - + defer logger.Info("Server exited") cosy.RegisterModels(model.GenerateAllModel()...) - cosy.RegisterAsyncFunc(kernal.Boot, router.InitRouter) + cosy.RegisterAsyncFunc(kernel.Boot, router.InitRouter) + + // Initialize settings package + settings.Init(confPath) - if state.Listener != nil { - cosy.SetListener(state.Listener) + // Set gin mode + gin.SetMode(cSettings.ServerSettings.RunMode) - cosy.Boot(confPath) + // Initialize logger package + logger.Init(cSettings.ServerSettings.RunMode) + defer logger.Sync() - logger.Infof("Nginx configuration directory: %s", nginx.GetConfPath()) + if state.Listener == nil { + return + } + // Gin router initialization + cRouter.Init() + + // Kernel boot + cKernel.Boot() + + addr := fmt.Sprintf("%s:%d", cSettings.ServerSettings.Host, cSettings.ServerSettings.Port) + srv := &http.Server{ + Addr: addr, + Handler: cRouter.GetEngine(), + } + if err := srv.Serve(state.Listener); err != nil && !errors.Is(err, http.ErrServerClosed) { + logger.Fatalf("listen: %s\n", err) } - logger.Info("Server exited") } } @@ -39,8 +62,7 @@ func main() { flag.StringVar(&confPath, "config", "app.ini", "Specify the configuration file") flag.Parse() - settings.Migrate(confPath) - cSettings.Init(confPath) + settings.Init(confPath) overseer.Run(overseer.Config{ Program: Program(confPath), diff --git a/settings/server_v1.go b/settings/server_v1.go index 27e78d50..db7d3390 100644 --- a/settings/server_v1.go +++ b/settings/server_v1.go @@ -100,7 +100,7 @@ func mergeStructs(src, dst interface{}) { return } -func Migrate(confPath string) { +func migrate(confPath string) { logger.Init("debug") Conf, err := ini.LoadSources(ini.LoadOptions{ Loose: true, @@ -160,7 +160,7 @@ func Migrate(confPath string) { for name, ptr := range migrated.Iterator() { err = Conf.Section(name).MapTo(ptr) if err != nil { - logger.Error("Migrate.MapTo %s err: %v", name, err) + logger.Error("migrate.MapTo %s err: %v", name, err) } } @@ -187,7 +187,7 @@ func Migrate(confPath string) { for section, ptr := range migrated.Iterator() { err = Conf.Section(section).ReflectFrom(ptr) if err != nil { - logger.Fatalf("Migrate.ReflectFrom %s err: %v", section, err) + logger.Fatalf("migrate.ReflectFrom %s err: %v", section, err) } } diff --git a/settings/server_v1_test.go b/settings/server_v1_test.go index a59c5791..8276024a 100644 --- a/settings/server_v1_test.go +++ b/settings/server_v1_test.go @@ -121,5 +121,5 @@ RPOrigins = http://localhost:3002,http://127.0.0.1:3002` t.Fatalf("Failed to write config to file: %v", err) } - Migrate(confName) + migrate(confName) } diff --git a/settings/settings.go b/settings/settings.go index 4b90f728..bdb81919 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -64,7 +64,16 @@ func init() { settings.WithoutSonyflake() } -func Init() { +func Init(confPath string) { + migrate(confPath) + + settings.Init(confPath) + + // Set Default Port + if settings.ServerSettings.Port == 0 { + settings.ServerSettings.Port = 9000 + } + for prefix, ptr := range envPrefixMap { parseEnv(ptr, prefix+"_") }