From d64ee851df2f583e0ec2993028c3d1a4e3cb756e Mon Sep 17 00:00:00 2001 From: enwikuna <166232905+enwikuna@users.noreply.github.com> Date: Thu, 30 Oct 2025 16:18:21 +0100 Subject: [PATCH 1/8] Add MaintenanceTemplate field to Nginx settings --- settings/nginx.go | 1 + 1 file changed, 1 insertion(+) diff --git a/settings/nginx.go b/settings/nginx.go index 3636141be..c9e39e603 100644 --- a/settings/nginx.go +++ b/settings/nginx.go @@ -13,6 +13,7 @@ type Nginx struct { RestartCmd string `json:"restart_cmd" protected:"true"` StubStatusPort uint `json:"stub_status_port" binding:"omitempty,min=1,max=65535"` ContainerName string `json:"container_name" protected:"true"` + MaintenanceTemplate string `json:"maintenance_template"` } var NginxSettings = &Nginx{} From 46b1fc6ae0bcd214829c62151f59fae494a8921e Mon Sep 17 00:00:00 2001 From: enwikuna <166232905+enwikuna@users.noreply.github.com> Date: Thu, 30 Oct 2025 16:21:45 +0100 Subject: [PATCH 2/8] Add optional maintenance_template to NginxSettings --- app/src/api/settings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/api/settings.ts b/app/src/api/settings.ts index 20fe3686a..d7b45fe13 100644 --- a/app/src/api/settings.ts +++ b/app/src/api/settings.ts @@ -68,6 +68,7 @@ export interface NginxSettings { restart_cmd: string stub_status_port: number container_name: string + maintenance_template?: string } export interface NginxLogSettings { From 8a9a226557f52f24e99d51d1c286f0ee3e08fb97 Mon Sep 17 00:00:00 2001 From: enwikuna <166232905+enwikuna@users.noreply.github.com> Date: Thu, 30 Oct 2025 16:28:07 +0100 Subject: [PATCH 3/8] Implement custom maintenance template handling Add support for custom maintenance HTML template. --- api/pages/maintenance.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/api/pages/maintenance.go b/api/pages/maintenance.go index 0e97bcdeb..43e1df054 100644 --- a/api/pages/maintenance.go +++ b/api/pages/maintenance.go @@ -4,6 +4,7 @@ import ( "embed" "html/template" "net/http" + "os" "strings" "github.com/0xJacky/Nginx-UI/settings" @@ -53,7 +54,15 @@ func MaintenancePage(c *gin.Context) { return } - // Parse template + // Try custom mounted HTML first (NGINX_UI_NGINX_MAINTENANCE_TEMPLATE) + if custom := strings.TrimSpace(settings.NginxSettings.MaintenanceTemplate); custom != "" { + if b, err := os.ReadFile(custom); err == nil { + c.Data(http.StatusServiceUnavailable, "text/html; charset=utf-8", b) + return + } + } + + // Fallback: embedded template tmpl, err := template.ParseFS(tmplFS, "maintenance.tmpl") if err != nil { c.String(http.StatusInternalServerError, "503 Service Unavailable") From 4f15a2be3c7a38dc0480511a13bed3d7997051d4 Mon Sep 17 00:00:00 2001 From: enwikuna <166232905+enwikuna@users.noreply.github.com> Date: Thu, 30 Oct 2025 16:32:41 +0100 Subject: [PATCH 4/8] Add maintenance template path input to Nginx settings --- app/src/views/preference/tabs/NginxSettings.vue | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/views/preference/tabs/NginxSettings.vue b/app/src/views/preference/tabs/NginxSettings.vue index ef186860e..5d93451bd 100644 --- a/app/src/views/preference/tabs/NginxSettings.vue +++ b/app/src/views/preference/tabs/NginxSettings.vue @@ -10,6 +10,16 @@ const { data } = storeToRefs(systemSettingsStore) + + + {{ data.nginx.access_log_path }} From 322b94f8c1c847c7eca912ef4c8dd7fed950cde7 Mon Sep 17 00:00:00 2001 From: enwikuna <166232905+enwikuna@users.noreply.github.com> Date: Thu, 30 Oct 2025 16:46:48 +0100 Subject: [PATCH 5/8] Update maintenance template input in NginxSettings --- app/src/views/preference/tabs/NginxSettings.vue | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/views/preference/tabs/NginxSettings.vue b/app/src/views/preference/tabs/NginxSettings.vue index 5d93451bd..96c708bbc 100644 --- a/app/src/views/preference/tabs/NginxSettings.vue +++ b/app/src/views/preference/tabs/NginxSettings.vue @@ -10,15 +10,13 @@ const { data } = storeToRefs(systemSettingsStore) - + + :placeholder="$gettext('enwikuna-maintenance.html')" /> + + {{$gettext('Mounted directory')}}: /etc/nginx/maintenance + {{ data.nginx.access_log_path }} From 38d9a8e4c730aef654ba660e81b0d4ee129970a9 Mon Sep 17 00:00:00 2001 From: enwikuna <166232905+enwikuna@users.noreply.github.com> Date: Thu, 30 Oct 2025 16:55:19 +0100 Subject: [PATCH 6/8] Refactor maintenance template file handling --- api/pages/maintenance.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/api/pages/maintenance.go b/api/pages/maintenance.go index 43e1df054..45d458956 100644 --- a/api/pages/maintenance.go +++ b/api/pages/maintenance.go @@ -14,6 +14,8 @@ import ( //go:embed *.tmpl var tmplFS embed.FS +const maintenanceMountDir = "/etc/nginx/maintenance" + // MaintenancePageData maintenance page data structure type MaintenancePageData struct { Title string `json:"title"` @@ -55,8 +57,11 @@ func MaintenancePage(c *gin.Context) { } // Try custom mounted HTML first (NGINX_UI_NGINX_MAINTENANCE_TEMPLATE) - if custom := strings.TrimSpace(settings.NginxSettings.MaintenanceTemplate); custom != "" { - if b, err := os.ReadFile(custom); err == nil { + if name := strings.TrimSpace(settings.NginxSettings.MaintenanceTemplate); name != "" { + name = filepath.Base(name) + full := filepath.Join(maintenanceMountDir, name) + + if b, err := os.ReadFile(full); err == nil && len(b) > 0 { c.Data(http.StatusServiceUnavailable, "text/html; charset=utf-8", b) return } From 0b4659f3f2b21539afc2ee086ac4b2cb0bc3548e Mon Sep 17 00:00:00 2001 From: enwikuna <166232905+enwikuna@users.noreply.github.com> Date: Thu, 30 Oct 2025 17:50:26 +0100 Subject: [PATCH 7/8] Add filepath import to maintenance.go --- api/pages/maintenance.go | 1 + 1 file changed, 1 insertion(+) diff --git a/api/pages/maintenance.go b/api/pages/maintenance.go index 45d458956..ea7f56357 100644 --- a/api/pages/maintenance.go +++ b/api/pages/maintenance.go @@ -5,6 +5,7 @@ import ( "html/template" "net/http" "os" + "path/filepath" "strings" "github.com/0xJacky/Nginx-UI/settings" From 098c21971c703297f45b74f3259f4bb25cd01e5d Mon Sep 17 00:00:00 2001 From: enwikuna <166232905+enwikuna@users.noreply.github.com> Date: Thu, 30 Oct 2025 17:56:48 +0100 Subject: [PATCH 8/8] Update placeholder for maintenance template input --- app/src/views/preference/tabs/NginxSettings.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/views/preference/tabs/NginxSettings.vue b/app/src/views/preference/tabs/NginxSettings.vue index 96c708bbc..1cb522c2a 100644 --- a/app/src/views/preference/tabs/NginxSettings.vue +++ b/app/src/views/preference/tabs/NginxSettings.vue @@ -13,7 +13,7 @@ const { data } = storeToRefs(systemSettingsStore) + :placeholder="$gettext('maintenance.html')" /> {{$gettext('Mounted directory')}}: /etc/nginx/maintenance