diff --git a/api/settings/settings.go b/api/settings/settings.go index c0bab080..245ab690 100644 --- a/api/settings/settings.go +++ b/api/settings/settings.go @@ -1,6 +1,7 @@ package settings import ( + "fmt" "github.com/0xJacky/Nginx-UI/api" "github.com/0xJacky/Nginx-UI/internal/cron" "github.com/0xJacky/Nginx-UI/internal/nginx" @@ -19,22 +20,52 @@ func GetServerName(c *gin.Context) { func GetSettings(c *gin.Context) { settings.NginxSettings.AccessLogPath = nginx.GetAccessLogPath() settings.NginxSettings.ErrorLogPath = nginx.GetErrorLogPath() + settings.NginxSettings.ConfigDir = nginx.GetConfPath() + settings.NginxSettings.PIDPath = nginx.GetPIDPath() + + if settings.NginxSettings.ReloadCmd == "" { + settings.NginxSettings.ReloadCmd = "nginx -s reload" + } + + if settings.NginxSettings.RestartCmd == "" { + pidPath := nginx.GetPIDPath() + daemon := nginx.GetSbinPath() + if daemon == "" { + settings.NginxSettings.RestartCmd = + fmt.Sprintf("start-stop-daemon --stop --quiet --oknodo --retry=TERM/30/KILL/5"+ + " --pidfile %s && nginx", pidPath) + return + } + + settings.NginxSettings.RestartCmd = + fmt.Sprintf("start-stop-daemon --start --quiet --pidfile %s --exec %s", pidPath, daemon) + } + c.JSON(http.StatusOK, gin.H{ + "app": cSettings.AppSettings, "server": cSettings.ServerSettings, - "nginx": settings.NginxSettings, - "openai": settings.OpenAISettings, - "logrotate": settings.LogrotateSettings, + "database": settings.DatabaseSettings, "auth": settings.AuthSettings, + "casdoor": settings.CasdoorSettings, + "cert": settings.CertSettings, + "http": settings.HTTPSettings, + "logrotate": settings.LogrotateSettings, + "nginx": settings.NginxSettings, + "node": settings.NodeSettings, + "openai": settings.OpenAISettings, + "terminal": settings.TerminalSettings, + "webauthn": settings.WebAuthnSettings, }) } func SaveSettings(c *gin.Context) { var json struct { - Server cSettings.Server `json:"server"` - Nginx settings.Nginx `json:"nginx"` + Auth settings.Auth `json:"auth"` + Cert settings.Cert `json:"cert"` + Http settings.HTTP `json:"http"` + Node settings.Node `json:"node"` Openai settings.OpenAI `json:"openai"` Logrotate settings.Logrotate `json:"logrotate"` - Auth settings.Auth `json:"auth"` } if !api.BindAndValid(c, &json) { @@ -46,11 +77,12 @@ func SaveSettings(c *gin.Context) { go cron.RestartLogrotate() } - cSettings.ProtectedFill(cSettings.ServerSettings, &json.Server) - cSettings.ProtectedFill(settings.NginxSettings, &json.Nginx) + cSettings.ProtectedFill(settings.AuthSettings, &json.Auth) + cSettings.ProtectedFill(settings.CertSettings, &json.Cert) + cSettings.ProtectedFill(settings.HTTPSettings, &json.Http) + cSettings.ProtectedFill(settings.NodeSettings, &json.Node) cSettings.ProtectedFill(settings.OpenAISettings, &json.Openai) cSettings.ProtectedFill(settings.LogrotateSettings, &json.Logrotate) - cSettings.ProtectedFill(settings.AuthSettings, &json.Auth) err := settings.Save() if err != nil { diff --git a/app/src/api/settings.ts b/app/src/api/settings.ts index bf27a158..f3404eaa 100644 --- a/app/src/api/settings.ts +++ b/app/src/api/settings.ts @@ -1,16 +1,114 @@ import http from '@/lib/http' +export interface AppSettings { + page_size: number + jwt_secret: string +} + +export interface ServerSettings { + host: string + port: number + run_mode: 'debug' | 'release' +} + +export interface DatabaseSettings { + name: string +} + +export interface AuthSettings { + ip_white_list: string[] + ban_threshold_minutes: number + max_attempts: number +} + +export interface CasdoorSettings { + endpoint: string + client_id: string + client_secret: string + certificate_path: string + organization: string + application: string + redirect_uri: string +} + +export interface CertSettings { + email: string + ca_dir: string + renewal_interval: number + recursive_nameservers: string[] + http_challenge_port: string +} + +export interface HTTPSettings { + github_proxy: string + insecure_skip_verify: boolean +} + +export interface LogrotateSettings { + enabled: boolean + cmd: string + interval: number +} + +export interface NginxSettings { + access_log_path: string + error_log_path: string + config_dir: string + log_dir_white_list: string[] + pid_path: string + reload_cmd: string + restart_cmd: string +} + +export interface NodeSettings { + name: string + secret: string +} + +export interface OpenaiSettings { + model: string + base_url: string + proxy: string + token: string +} + +export interface TerminalSettings { + start_cmd: string +} + +export interface WebauthnSettings { + rp_display_name: string + rpid: string + rp_origins: string[] +} + export interface BannedIP { ip: string attempts: number expired_at: string } +export interface Settings { + app: AppSettings + server: ServerSettings + database: DatabaseSettings + auth: AuthSettings + casdoor: CasdoorSettings + cert: CertSettings + http: HTTPSettings + logrotate: LogrotateSettings + nginx: NginxSettings + node: NodeSettings + openai: OpenaiSettings + terminal: TerminalSettings + webauthn: WebauthnSettings +} + const settings = { - get(): Promise { + get(): Promise { return http.get('/settings') }, - save(data: T) { + save(data: Settings) { return http.post('/settings', data) }, get_server_name(): Promise<{ name: string }> { diff --git a/app/src/views/preference/AuthSettings.vue b/app/src/views/preference/AuthSettings.vue index 9279e7be..7eb16ea4 100644 --- a/app/src/views/preference/AuthSettings.vue +++ b/app/src/views/preference/AuthSettings.vue @@ -3,10 +3,9 @@ import { message } from 'ant-design-vue' import type { Ref } from 'vue' import dayjs from 'dayjs' import PasskeyRegistration from './components/Passkey.vue' -import type { BannedIP } from '@/api/settings' +import type { BannedIP, Settings } from '@/api/settings' import setting from '@/api/settings' import type { customRender } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer' -import type { Settings } from '@/views/preference/typedef' import TOTP from '@/views/preference/components/TOTP.vue' const data: Settings = inject('data') as Settings @@ -62,13 +61,41 @@ function removeBannedIP(ip: string) {

{{ $gettext('Authentication Settings') }}

- + > +

+ {{ $gettext('Webauthn') }} +

+
+

+ {{ $gettext('RPID') }} +

+

{{ data.webauthn.rpid }}

+
+
+

+ {{ $gettext('RP Display Name') }} +

+

{{ data.webauthn.rp_display_name }}

+
+
+

+ {{ $gettext('RP Origins') }} +

+
+ {{ origin }} +
+
+ +

{{ $gettext('Throttle') }}

-

+ +

{{ $gettext('Banned IPs') }}

diff --git a/app/src/views/preference/BasicSettings.vue b/app/src/views/preference/BasicSettings.vue index 1fc74472..929dd3f7 100644 --- a/app/src/views/preference/BasicSettings.vue +++ b/app/src/views/preference/BasicSettings.vue @@ -1,7 +1,5 @@ + + + + diff --git a/app/src/views/preference/LogrotateSettings.vue b/app/src/views/preference/LogrotateSettings.vue index 03a188ba..ac4dbd93 100644 --- a/app/src/views/preference/LogrotateSettings.vue +++ b/app/src/views/preference/LogrotateSettings.vue @@ -1,5 +1,5 @@ diff --git a/app/src/views/preference/NginxSettings.vue b/app/src/views/preference/NginxSettings.vue index 513eb9a5..b504d3f0 100644 --- a/app/src/views/preference/NginxSettings.vue +++ b/app/src/views/preference/NginxSettings.vue @@ -1,30 +1,38 @@ diff --git a/app/src/views/preference/OpenAISettings.vue b/app/src/views/preference/OpenAISettings.vue index 18fcee47..5f1bc50b 100644 --- a/app/src/views/preference/OpenAISettings.vue +++ b/app/src/views/preference/OpenAISettings.vue @@ -1,5 +1,5 @@