diff --git a/api/system/router.go b/api/system/router.go
index e9b516d9..df536442 100644
--- a/api/system/router.go
+++ b/api/system/router.go
@@ -11,6 +11,7 @@ func InitPublicRouter(r *gin.RouterGroup) {
}
func InitPrivateRouter(r *gin.RouterGroup) {
+ r.GET("settings/server/name", GetServerName)
r.GET("settings", GetSettings)
r.POST("settings", SaveSettings)
diff --git a/api/system/settings.go b/api/system/settings.go
index b09bc3c3..ea7f8c7c 100644
--- a/api/system/settings.go
+++ b/api/system/settings.go
@@ -6,9 +6,14 @@ import (
"github.com/0xJacky/Nginx-UI/settings"
"github.com/gin-gonic/gin"
"net/http"
- "reflect"
)
+func GetServerName(c *gin.Context) {
+ c.JSON(http.StatusOK, gin.H{
+ "name": settings.ServerSettings.Name,
+ })
+}
+
func GetSettings(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"server": settings.ServerSettings,
@@ -35,10 +40,10 @@ func SaveSettings(c *gin.Context) {
go cron.RestartLogrotate()
}
- fillSettings(&settings.ServerSettings, &json.Server)
- fillSettings(&settings.NginxSettings, &json.Nginx)
- fillSettings(&settings.OpenAISettings, &json.Openai)
- fillSettings(&settings.LogrotateSettings, &json.Logrotate)
+ settings.ProtectedFill(&settings.ServerSettings, &json.Server)
+ settings.ProtectedFill(&settings.NginxSettings, &json.Nginx)
+ settings.ProtectedFill(&settings.OpenAISettings, &json.Openai)
+ settings.ProtectedFill(&settings.LogrotateSettings, &json.Logrotate)
err := settings.Save()
if err != nil {
@@ -48,16 +53,3 @@ func SaveSettings(c *gin.Context) {
GetSettings(c)
}
-
-func fillSettings(targetSettings interface{}, newSettings interface{}) {
- s := reflect.TypeOf(targetSettings).Elem()
- vt := reflect.ValueOf(targetSettings).Elem()
- vn := reflect.ValueOf(newSettings).Elem()
-
- // copy the values from new to target settings if it is not protected
- for i := 0; i < s.NumField(); i++ {
- if s.Field(i).Tag.Get("protected") != "true" {
- vt.Field(i).Set(vn.Field(i))
- }
- }
-}
diff --git a/app.example.ini b/app.example.ini
index f0e97bcf..8657d406 100644
--- a/app.example.ini
+++ b/app.example.ini
@@ -15,6 +15,7 @@ HttpHost = 0.0.0.0
CertRenewalInterval = 7
RecursiveNameservers =
SkipInstallation = false
+Name =
[nginx]
AccessLogPath = /var/log/nginx/access.log
diff --git a/app/src/api/settings.ts b/app/src/api/settings.ts
index 6a8088f6..09146ba9 100644
--- a/app/src/api/settings.ts
+++ b/app/src/api/settings.ts
@@ -8,6 +8,10 @@ const settings = {
save(data: any) {
return http.post('/settings', data)
},
+
+ get_server_name() {
+ return http.get('/settings/server/name')
+ },
}
export default settings
diff --git a/app/src/components/EnvIndicator/EnvIndicator.vue b/app/src/components/EnvIndicator/EnvIndicator.vue
index 868d6d43..8630fbdb 100644
--- a/app/src/components/EnvIndicator/EnvIndicator.vue
+++ b/app/src/components/EnvIndicator/EnvIndicator.vue
@@ -4,6 +4,7 @@ import { storeToRefs } from 'pinia'
import { useRouter } from 'vue-router'
import { computed, watch } from 'vue'
import { useSettingsStore } from '@/pinia'
+import settings from '@/api/settings'
const settingsStore = useSettingsStore()
@@ -25,6 +26,12 @@ watch(node_id, async () => {
await router.push('/dashboard')
location.reload()
})
+
+const { server_name } = storeToRefs(useSettingsStore())
+
+settings.get_server_name().then(r => {
+ server_name.value = r.name
+})
@@ -35,7 +42,7 @@ watch(node_id, async () => {
v-if="is_local"
class="env-name"
>
- {{ $gettext('Local') }}
+ {{ server_name || $gettext('Local') }}
> = inject('errors') as Recor
+
+
+
diff --git a/app/src/views/preference/OpenAISettings.vue b/app/src/views/preference/OpenAISettings.vue
index 58c124ad..024cfaca 100644
--- a/app/src/views/preference/OpenAISettings.vue
+++ b/app/src/views/preference/OpenAISettings.vue
@@ -23,7 +23,13 @@ const models = shallowRef([
-
+
import { message } from 'ant-design-vue'
import type { Ref } from 'vue'
+import { storeToRefs } from 'pinia'
import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
import settings from '@/api/settings'
import BasicSettings from '@/views/preference/BasicSettings.vue'
@@ -8,6 +9,7 @@ import OpenAISettings from '@/views/preference/OpenAISettings.vue'
import NginxSettings from '@/views/preference/NginxSettings.vue'
import type { Settings } from '@/views/preference/typedef'
import LogrotateSettings from '@/views/preference/LogrotateSettings.vue'
+import { useSettingsStore } from '@/pinia'
const data = ref({
server: {
@@ -23,6 +25,7 @@ const data = ref({
node_secret: '',
cert_renewal_interval: 7,
recursive_nameservers: [],
+ name: '',
},
nginx: {
access_log_path: '',
@@ -49,12 +52,14 @@ settings.get().then(r => {
data.value = r
})
+const { server_name } = storeToRefs(useSettingsStore())
const errors = ref({}) as Ref>>
async function save() {
// fix type
data.value.server.http_challenge_port = data.value.server.http_challenge_port.toString()
settings.save(data.value).then(r => {
+ server_name.value = r?.server?.name ?? ''
data.value = r
message.success($gettext('Save successfully'))
errors.value = {}
diff --git a/app/src/views/preference/typedef.ts b/app/src/views/preference/typedef.ts
index ad8ffb43..4544fc8f 100644
--- a/app/src/views/preference/typedef.ts
+++ b/app/src/views/preference/typedef.ts
@@ -12,6 +12,7 @@ export interface Settings {
ca_dir: string
cert_renewal_interval: number
recursive_nameservers: string[]
+ name: string
}
nginx: {
access_log_path: string
diff --git a/settings/server.go b/settings/server.go
index 5c827f33..313f9810 100644
--- a/settings/server.go
+++ b/settings/server.go
@@ -20,7 +20,8 @@ type Server struct {
GithubProxy string `json:"github_proxy" binding:"omitempty,url"`
CertRenewalInterval int `json:"cert_renewal_interval" binding:"min=7,max=21"`
RecursiveNameservers []string `json:"recursive_nameservers" binding:"omitempty,dive,hostname_port"`
- SkipInstallation bool `json:"skip_installation"`
+ SkipInstallation bool `json:"skip_installation" protected:"true"`
+ Name string `json:"name" binding:"omitempty,alpha_num_dash_dot"`
}
func (s *Server) GetCADir() string {
diff --git a/settings/settings.go b/settings/settings.go
index 0ae436a5..7222d218 100644
--- a/settings/settings.go
+++ b/settings/settings.go
@@ -6,7 +6,8 @@ import (
"gopkg.in/ini.v1"
"log"
"os"
- "strings"
+ "reflect"
+ "strings"
"time"
)
@@ -69,19 +70,7 @@ func MapTo() {
}
}
-func mapTo(section string, v interface{}) {
- err := Conf.Section(section).MapTo(v)
- if err != nil {
- log.Fatalf("Cfg.MapTo %s err: %v", section, err)
- }
-}
-func reflectFrom(section string, v interface{}) {
- err := Conf.Section(section).ReflectFrom(v)
- if err != nil {
- log.Fatalf("Cfg.ReflectFrom %s err: %v", section, err)
- }
-}
func Save() (err error) {
for k, v := range sections {
@@ -95,6 +84,33 @@ func Save() (err error) {
return
}
+func ProtectedFill(targetSettings interface{}, newSettings interface{}) {
+ s := reflect.TypeOf(targetSettings).Elem()
+ vt := reflect.ValueOf(targetSettings).Elem()
+ vn := reflect.ValueOf(newSettings).Elem()
+
+ // copy the values from new to target settings if it is not protected
+ for i := 0; i < s.NumField(); i++ {
+ if s.Field(i).Tag.Get("protected") != "true" {
+ vt.Field(i).Set(vn.Field(i))
+ }
+ }
+}
+
+func mapTo(section string, v interface{}) {
+ err := Conf.Section(section).MapTo(v)
+ if err != nil {
+ log.Fatalf("Cfg.MapTo %s err: %v", section, err)
+ }
+}
+
+func reflectFrom(section string, v interface{}) {
+ err := Conf.Section(section).ReflectFrom(v)
+ if err != nil {
+ log.Fatalf("Cfg.ReflectFrom %s err: %v", section, err)
+ }
+}
+
func parseEnv(ptr interface{}, prefix string) {
err := env.ParseWithOptions(ptr, env.Options{
Prefix: EnvPrefix + prefix,
@@ -105,3 +121,5 @@ func parseEnv(ptr interface{}, prefix string) {
log.Fatalf("settings.parseEnv: %v\n", err)
}
}
+
+
diff --git a/settings/settings_test.go b/settings/settings_test.go
index 93f815f1..5af8bcde 100644
--- a/settings/settings_test.go
+++ b/settings/settings_test.go
@@ -26,6 +26,7 @@ func TestSetup(t *testing.T) {
_ = os.Setenv("NGINX_UI_SERVER_CERT_RENEWAL_INTERVAL", "14")
_ = os.Setenv("NGINX_UI_SERVER_RECURSIVE_NAMESERVERS", "8.8.8.8")
_ = os.Setenv("NGINX_UI_SERVER_SKIP_INSTALLATION", "true")
+ _ = os.Setenv("NGINX_UI_SERVER_NAME", "test")
_ = os.Setenv("NGINX_UI_NGINX_ACCESS_LOG_PATH", "/tmp/nginx/access.log")
_ = os.Setenv("NGINX_UI_NGINX_ERROR_LOG_PATH", "/tmp/nginx/error.log")
@@ -70,6 +71,7 @@ func TestSetup(t *testing.T) {
assert.Equal(t, 14, ServerSettings.CertRenewalInterval)
assert.Equal(t, []string{"8.8.8.8"}, ServerSettings.RecursiveNameservers)
assert.Equal(t, true, ServerSettings.SkipInstallation)
+ assert.Equal(t, "test", ServerSettings.Name)
assert.Equal(t, "/tmp/nginx/access.log", NginxSettings.AccessLogPath)
assert.Equal(t, "/tmp/nginx/error.log", NginxSettings.ErrorLogPath)