Browse Source

feat(self-check): check websocket

Jacky 5 months ago
parent
commit
132e05c35c

+ 1 - 0
api/system/router.go

@@ -15,6 +15,7 @@ func InitPrivateRouter(r *gin.RouterGroup) {
 	r.GET("upgrade/current", GetCurrentVersion)
 	r.GET("upgrade/current", GetCurrentVersion)
 	r.GET("self_check", SelfCheck)
 	r.GET("self_check", SelfCheck)
 	r.POST("self_check/:name/fix", SelfCheckFix)
 	r.POST("self_check/:name/fix", SelfCheckFix)
+	r.GET("self_check/websocket", CheckWebSocket)
 }
 }
 
 
 func InitWebSocketRouter(r *gin.RouterGroup) {
 func InitWebSocketRouter(r *gin.RouterGroup) {

+ 23 - 0
api/system/self_check.go

@@ -1,6 +1,8 @@
 package system
 package system
 
 
 import (
 import (
+	"github.com/gorilla/websocket"
+	"github.com/uozi-tech/cosy/logger"
 	"net/http"
 	"net/http"
 
 
 	"github.com/0xJacky/Nginx-UI/internal/self_check"
 	"github.com/0xJacky/Nginx-UI/internal/self_check"
@@ -16,3 +18,24 @@ func SelfCheckFix(c *gin.Context) {
 	result := self_check.AttemptFix(c.Param("name"))
 	result := self_check.AttemptFix(c.Param("name"))
 	c.JSON(http.StatusOK, result)
 	c.JSON(http.StatusOK, result)
 }
 }
+
+func CheckWebSocket(c *gin.Context) {
+	var upgrader = websocket.Upgrader{
+		CheckOrigin: func(r *http.Request) bool {
+			return true
+		},
+	}
+	ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
+	if err != nil {
+		logger.Error(err)
+		return
+	}
+	defer ws.Close()
+	err = ws.WriteJSON(gin.H{
+		"message": "ok",
+	})
+	if err != nil {
+		logger.Error(err)
+		return
+	}
+}

+ 0 - 1
app/package.json

@@ -72,7 +72,6 @@
     "eslint-plugin-sonarjs": "^3.0.1",
     "eslint-plugin-sonarjs": "^3.0.1",
     "less": "^4.2.1",
     "less": "^4.2.1",
     "postcss": "^8.5.1",
     "postcss": "^8.5.1",
-    "tailwindcss": "^3.4.17",
     "typescript": "5.7.3",
     "typescript": "5.7.3",
     "unplugin-auto-import": "^19.0.0",
     "unplugin-auto-import": "^19.0.0",
     "unplugin-vue-components": "^28.0.0",
     "unplugin-vue-components": "^28.0.0",

+ 0 - 226
app/pnpm-lock.yaml

@@ -180,9 +180,6 @@ importers:
       postcss:
       postcss:
         specifier: ^8.5.1
         specifier: ^8.5.1
         version: 8.5.1
         version: 8.5.1
-      tailwindcss:
-        specifier: ^3.4.17
-        version: 3.4.17
       typescript:
       typescript:
         specifier: 5.7.3
         specifier: 5.7.3
         version: 5.7.3
         version: 5.7.3
@@ -210,10 +207,6 @@ packages:
   '@0xjacky/vue-github-button@3.1.1':
   '@0xjacky/vue-github-button@3.1.1':
     resolution: {integrity: sha512-fD9IWHGe0V6+7SR/5rbL/mrq+B6u3tDktZrAFYfKNgS9JUM/OBQAvKG+i8e39iq5invDhzHyLHAkzff9rT0j5g==}
     resolution: {integrity: sha512-fD9IWHGe0V6+7SR/5rbL/mrq+B6u3tDktZrAFYfKNgS9JUM/OBQAvKG+i8e39iq5invDhzHyLHAkzff9rT0j5g==}
 
 
-  '@alloc/quick-lru@5.2.0':
-    resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
-    engines: {node: '>=10'}
-
   '@ampproject/remapping@2.3.0':
   '@ampproject/remapping@2.3.0':
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
     engines: {node: '>=6.0.0'}
@@ -1892,9 +1885,6 @@ packages:
     peerDependencies:
     peerDependencies:
       vue: '>=3.2.0'
       vue: '>=3.2.0'
 
 
-  any-promise@1.3.0:
-    resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
-
   anymatch@3.1.3:
   anymatch@3.1.3:
     resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
     resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
     engines: {node: '>= 8'}
     engines: {node: '>= 8'}
@@ -1906,9 +1896,6 @@ packages:
     resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
     resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
     engines: {node: '>=14'}
     engines: {node: '>=14'}
 
 
-  arg@5.0.2:
-    resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
-
   argparse@2.0.1:
   argparse@2.0.1:
     resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
     resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
 
 
@@ -2051,10 +2038,6 @@ packages:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
 
 
-  camelcase-css@2.0.1:
-    resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
-    engines: {node: '>= 6'}
-
   caniuse-lite@1.0.30001688:
   caniuse-lite@1.0.30001688:
     resolution: {integrity: sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==}
     resolution: {integrity: sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==}
 
 
@@ -2123,10 +2106,6 @@ packages:
     resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==}
     resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==}
     engines: {node: '>=4.0.0'}
     engines: {node: '>=4.0.0'}
 
 
-  commander@4.1.1:
-    resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
-    engines: {node: '>= 6'}
-
   commander@7.2.0:
   commander@7.2.0:
     resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
     resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
@@ -2296,15 +2275,9 @@ packages:
   devlop@1.1.0:
   devlop@1.1.0:
     resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
     resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
 
 
-  didyoumean@1.2.2:
-    resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
-
   diff3@0.0.3:
   diff3@0.0.3:
     resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==}
     resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==}
 
 
-  dlv@1.1.3:
-    resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
-
   doctrine@3.0.0:
   doctrine@3.0.0:
     resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
     resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
     engines: {node: '>=6.0.0'}
     engines: {node: '>=6.0.0'}
@@ -2654,10 +2627,6 @@ packages:
   fast-deep-equal@3.1.3:
   fast-deep-equal@3.1.3:
     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
 
 
-  fast-glob@3.3.2:
-    resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
-    engines: {node: '>=8.6.0'}
-
   fast-glob@3.3.3:
   fast-glob@3.3.3:
     resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
     resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
     engines: {node: '>=8.6.0'}
     engines: {node: '>=8.6.0'}
@@ -3094,10 +3063,6 @@ packages:
   jackspeak@3.4.3:
   jackspeak@3.4.3:
     resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
     resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
 
 
-  jiti@1.21.6:
-    resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
-    hasBin: true
-
   jiti@2.4.1:
   jiti@2.4.1:
     resolution: {integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==}
     resolution: {integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==}
     hasBin: true
     hasBin: true
@@ -3177,10 +3142,6 @@ packages:
     resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
     resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
     engines: {node: '>= 0.8.0'}
     engines: {node: '>= 0.8.0'}
 
 
-  lilconfig@3.1.3:
-    resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
-    engines: {node: '>=14'}
-
   lines-and-columns@1.2.4:
   lines-and-columns@1.2.4:
     resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
     resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
 
 
@@ -3480,9 +3441,6 @@ packages:
   muggle-string@0.4.1:
   muggle-string@0.4.1:
     resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
     resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
 
 
-  mz@2.7.0:
-    resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
-
   nanoid@3.3.8:
   nanoid@3.3.8:
     resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
     resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -3539,14 +3497,6 @@ packages:
     engines: {node: ^14.16.0 || >=16.10.0}
     engines: {node: ^14.16.0 || >=16.10.0}
     hasBin: true
     hasBin: true
 
 
-  object-assign@4.1.1:
-    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
-    engines: {node: '>=0.10.0'}
-
-  object-hash@3.0.0:
-    resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
-    engines: {node: '>= 6'}
-
   object-inspect@1.13.3:
   object-inspect@1.13.3:
     resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
     resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
     engines: {node: '>= 0.4'}
     engines: {node: '>= 0.4'}
@@ -3700,10 +3650,6 @@ packages:
     resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
     resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
     engines: {node: '>=12'}
     engines: {node: '>=12'}
 
 
-  pify@2.3.0:
-    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
-    engines: {node: '>=0.10.0'}
-
   pify@4.0.1:
   pify@4.0.1:
     resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
     resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
@@ -3728,10 +3674,6 @@ packages:
       typescript:
       typescript:
         optional: true
         optional: true
 
 
-  pirates@4.0.6:
-    resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
-    engines: {node: '>= 6'}
-
   pkg-types@1.2.1:
   pkg-types@1.2.1:
     resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
     resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
 
 
@@ -3752,36 +3694,6 @@ packages:
     resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
     resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
     engines: {node: '>= 0.4'}
     engines: {node: '>= 0.4'}
 
 
-  postcss-import@15.1.0:
-    resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      postcss: ^8.0.0
-
-  postcss-js@4.0.1:
-    resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
-    engines: {node: ^12 || ^14 || >= 16}
-    peerDependencies:
-      postcss: ^8.4.21
-
-  postcss-load-config@4.0.2:
-    resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
-    engines: {node: '>= 14'}
-    peerDependencies:
-      postcss: '>=8.0.9'
-      ts-node: '>=9.0.0'
-    peerDependenciesMeta:
-      postcss:
-        optional: true
-      ts-node:
-        optional: true
-
-  postcss-nested@6.2.0:
-    resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
-    engines: {node: '>=12.0'}
-    peerDependencies:
-      postcss: ^8.2.14
-
   postcss-selector-parser@6.1.2:
   postcss-selector-parser@6.1.2:
     resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
     resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
     engines: {node: '>=4'}
     engines: {node: '>=4'}
@@ -3816,9 +3728,6 @@ packages:
   rc9@2.1.2:
   rc9@2.1.2:
     resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
     resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
 
 
-  read-cache@1.0.0:
-    resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
-
   read-pkg-up@7.0.1:
   read-pkg-up@7.0.1:
     resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
     resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
     engines: {node: '>=8'}
     engines: {node: '>=8'}
@@ -4110,11 +4019,6 @@ packages:
   stylis@4.3.4:
   stylis@4.3.4:
     resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==}
     resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==}
 
 
-  sucrase@3.35.0:
-    resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
-    engines: {node: '>=16 || 14 >=14.17'}
-    hasBin: true
-
   supports-color@7.2.0:
   supports-color@7.2.0:
     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
     engines: {node: '>=8'}
     engines: {node: '>=8'}
@@ -4139,11 +4043,6 @@ packages:
     resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
     resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
     engines: {node: ^14.18.0 || >=16.0.0}
     engines: {node: ^14.18.0 || >=16.0.0}
 
 
-  tailwindcss@3.4.17:
-    resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
-    engines: {node: '>=14.0.0'}
-    hasBin: true
-
   tapable@2.2.1:
   tapable@2.2.1:
     resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
     resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
@@ -4152,13 +4051,6 @@ packages:
     resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
     resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
     engines: {node: '>=10'}
     engines: {node: '>=10'}
 
 
-  thenify-all@1.6.0:
-    resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
-    engines: {node: '>=0.8'}
-
-  thenify@3.3.1:
-    resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
-
   throttle-debounce@5.0.2:
   throttle-debounce@5.0.2:
     resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
     resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
     engines: {node: '>=12.22'}
     engines: {node: '>=12.22'}
@@ -4191,9 +4083,6 @@ packages:
     peerDependencies:
     peerDependencies:
       typescript: '>=4.8.4'
       typescript: '>=4.8.4'
 
 
-  ts-interface-checker@0.1.13:
-    resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
-
   tslib@2.8.1:
   tslib@2.8.1:
     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 
 
@@ -4601,8 +4490,6 @@ snapshots:
     dependencies:
     dependencies:
       github-buttons: 2.29.1
       github-buttons: 2.29.1
 
 
-  '@alloc/quick-lru@5.2.0': {}
-
   '@ampproject/remapping@2.3.0':
   '@ampproject/remapping@2.3.0':
     dependencies:
     dependencies:
       '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/gen-mapping': 0.3.8
@@ -6474,8 +6361,6 @@ snapshots:
       vue-types: 3.0.2(vue@3.5.13(typescript@5.7.3))
       vue-types: 3.0.2(vue@3.5.13(typescript@5.7.3))
       warning: 4.0.3
       warning: 4.0.3
 
 
-  any-promise@1.3.0: {}
-
   anymatch@3.1.3:
   anymatch@3.1.3:
     dependencies:
     dependencies:
       normalize-path: 3.0.0
       normalize-path: 3.0.0
@@ -6492,8 +6377,6 @@ snapshots:
 
 
   are-docs-informative@0.0.2: {}
   are-docs-informative@0.0.2: {}
 
 
-  arg@5.0.2: {}
-
   argparse@2.0.1: {}
   argparse@2.0.1: {}
 
 
   array-back@3.1.0: {}
   array-back@3.1.0: {}
@@ -6667,8 +6550,6 @@ snapshots:
 
 
   callsites@3.1.0: {}
   callsites@3.1.0: {}
 
 
-  camelcase-css@2.0.1: {}
-
   caniuse-lite@1.0.30001688: {}
   caniuse-lite@1.0.30001688: {}
 
 
   ccount@2.0.1: {}
   ccount@2.0.1: {}
@@ -6758,8 +6639,6 @@ snapshots:
       lodash.camelcase: 4.3.0
       lodash.camelcase: 4.3.0
       typical: 4.0.0
       typical: 4.0.0
 
 
-  commander@4.1.1: {}
-
   commander@7.2.0: {}
   commander@7.2.0: {}
 
 
   comment-parser@1.4.1: {}
   comment-parser@1.4.1: {}
@@ -6908,12 +6787,8 @@ snapshots:
     dependencies:
     dependencies:
       dequal: 2.0.3
       dequal: 2.0.3
 
 
-  didyoumean@1.2.2: {}
-
   diff3@0.0.3: {}
   diff3@0.0.3: {}
 
 
-  dlv@1.1.3: {}
-
   doctrine@3.0.0:
   doctrine@3.0.0:
     dependencies:
     dependencies:
       esutils: 2.0.3
       esutils: 2.0.3
@@ -7473,14 +7348,6 @@ snapshots:
 
 
   fast-deep-equal@3.1.3: {}
   fast-deep-equal@3.1.3: {}
 
 
-  fast-glob@3.3.2:
-    dependencies:
-      '@nodelib/fs.stat': 2.0.5
-      '@nodelib/fs.walk': 1.2.8
-      glob-parent: 5.1.2
-      merge2: 1.4.1
-      micromatch: 4.0.8
-
   fast-glob@3.3.3:
   fast-glob@3.3.3:
     dependencies:
     dependencies:
       '@nodelib/fs.stat': 2.0.5
       '@nodelib/fs.stat': 2.0.5
@@ -7924,8 +7791,6 @@ snapshots:
     optionalDependencies:
     optionalDependencies:
       '@pkgjs/parseargs': 0.11.0
       '@pkgjs/parseargs': 0.11.0
 
 
-  jiti@1.21.6: {}
-
   jiti@2.4.1: {}
   jiti@2.4.1: {}
 
 
   js-tokens@4.0.0: {}
   js-tokens@4.0.0: {}
@@ -7997,8 +7862,6 @@ snapshots:
       prelude-ls: 1.2.1
       prelude-ls: 1.2.1
       type-check: 0.4.0
       type-check: 0.4.0
 
 
-  lilconfig@3.1.3: {}
-
   lines-and-columns@1.2.4: {}
   lines-and-columns@1.2.4: {}
 
 
   load-tsconfig@0.2.5: {}
   load-tsconfig@0.2.5: {}
@@ -8440,12 +8303,6 @@ snapshots:
 
 
   muggle-string@0.4.1: {}
   muggle-string@0.4.1: {}
 
 
-  mz@2.7.0:
-    dependencies:
-      any-promise: 1.3.0
-      object-assign: 4.1.1
-      thenify-all: 1.6.0
-
   nanoid@3.3.8: {}
   nanoid@3.3.8: {}
 
 
   nanopop@2.4.2: {}
   nanopop@2.4.2: {}
@@ -8496,10 +8353,6 @@ snapshots:
       pkg-types: 1.3.0
       pkg-types: 1.3.0
       ufo: 1.5.4
       ufo: 1.5.4
 
 
-  object-assign@4.1.1: {}
-
-  object-hash@3.0.0: {}
-
   object-inspect@1.13.3: {}
   object-inspect@1.13.3: {}
 
 
   object-keys@1.1.1: {}
   object-keys@1.1.1: {}
@@ -8640,8 +8493,6 @@ snapshots:
 
 
   picomatch@4.0.2: {}
   picomatch@4.0.2: {}
 
 
-  pify@2.3.0: {}
-
   pify@4.0.1: {}
   pify@4.0.1: {}
 
 
   pinia-plugin-persistedstate@4.2.0(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(rollup@4.28.1):
   pinia-plugin-persistedstate@4.2.0(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(rollup@4.28.1):
@@ -8667,8 +8518,6 @@ snapshots:
     transitivePeerDependencies:
     transitivePeerDependencies:
       - '@vue/composition-api'
       - '@vue/composition-api'
 
 
-  pirates@4.0.6: {}
-
   pkg-types@1.2.1:
   pkg-types@1.2.1:
     dependencies:
     dependencies:
       confbox: 0.1.8
       confbox: 0.1.8
@@ -8689,30 +8538,6 @@ snapshots:
 
 
   possible-typed-array-names@1.0.0: {}
   possible-typed-array-names@1.0.0: {}
 
 
-  postcss-import@15.1.0(postcss@8.5.1):
-    dependencies:
-      postcss: 8.5.1
-      postcss-value-parser: 4.2.0
-      read-cache: 1.0.0
-      resolve: 1.22.9
-
-  postcss-js@4.0.1(postcss@8.5.1):
-    dependencies:
-      camelcase-css: 2.0.1
-      postcss: 8.5.1
-
-  postcss-load-config@4.0.2(postcss@8.5.1):
-    dependencies:
-      lilconfig: 3.1.3
-      yaml: 2.6.1
-    optionalDependencies:
-      postcss: 8.5.1
-
-  postcss-nested@6.2.0(postcss@8.5.1):
-    dependencies:
-      postcss: 8.5.1
-      postcss-selector-parser: 6.1.2
-
   postcss-selector-parser@6.1.2:
   postcss-selector-parser@6.1.2:
     dependencies:
     dependencies:
       cssesc: 3.0.0
       cssesc: 3.0.0
@@ -8747,10 +8572,6 @@ snapshots:
       defu: 6.1.4
       defu: 6.1.4
       destr: 2.0.3
       destr: 2.0.3
 
 
-  read-cache@1.0.0:
-    dependencies:
-      pify: 2.3.0
-
   read-pkg-up@7.0.1:
   read-pkg-up@7.0.1:
     dependencies:
     dependencies:
       find-up: 4.1.0
       find-up: 4.1.0
@@ -9096,16 +8917,6 @@ snapshots:
 
 
   stylis@4.3.4: {}
   stylis@4.3.4: {}
 
 
-  sucrase@3.35.0:
-    dependencies:
-      '@jridgewell/gen-mapping': 0.3.8
-      commander: 4.1.1
-      glob: 10.4.5
-      lines-and-columns: 1.2.4
-      mz: 2.7.0
-      pirates: 4.0.6
-      ts-interface-checker: 0.1.13
-
   supports-color@7.2.0:
   supports-color@7.2.0:
     dependencies:
     dependencies:
       has-flag: 4.0.0
       has-flag: 4.0.0
@@ -9133,33 +8944,6 @@ snapshots:
       '@pkgr/core': 0.1.1
       '@pkgr/core': 0.1.1
       tslib: 2.8.1
       tslib: 2.8.1
 
 
-  tailwindcss@3.4.17:
-    dependencies:
-      '@alloc/quick-lru': 5.2.0
-      arg: 5.0.2
-      chokidar: 3.6.0
-      didyoumean: 1.2.2
-      dlv: 1.1.3
-      fast-glob: 3.3.2
-      glob-parent: 6.0.2
-      is-glob: 4.0.3
-      jiti: 1.21.6
-      lilconfig: 3.1.3
-      micromatch: 4.0.8
-      normalize-path: 3.0.0
-      object-hash: 3.0.0
-      picocolors: 1.1.1
-      postcss: 8.5.1
-      postcss-import: 15.1.0(postcss@8.5.1)
-      postcss-js: 4.0.1(postcss@8.5.1)
-      postcss-load-config: 4.0.2(postcss@8.5.1)
-      postcss-nested: 6.2.0(postcss@8.5.1)
-      postcss-selector-parser: 6.1.2
-      resolve: 1.22.9
-      sucrase: 3.35.0
-    transitivePeerDependencies:
-      - ts-node
-
   tapable@2.2.1: {}
   tapable@2.2.1: {}
 
 
   tar@6.2.1:
   tar@6.2.1:
@@ -9171,14 +8955,6 @@ snapshots:
       mkdirp: 1.0.4
       mkdirp: 1.0.4
       yallist: 4.0.0
       yallist: 4.0.0
 
 
-  thenify-all@1.6.0:
-    dependencies:
-      thenify: 3.3.1
-
-  thenify@3.3.1:
-    dependencies:
-      any-promise: 1.3.0
-
   throttle-debounce@5.0.2: {}
   throttle-debounce@5.0.2: {}
 
 
   tinyexec@0.3.1: {}
   tinyexec@0.3.1: {}
@@ -9204,8 +8980,6 @@ snapshots:
     dependencies:
     dependencies:
       typescript: 5.7.3
       typescript: 5.7.3
 
 
-  ts-interface-checker@0.1.13: {}
-
   tslib@2.8.1: {}
   tslib@2.8.1: {}
 
 
   tsx@4.19.2:
   tsx@4.19.2:

+ 4 - 0
app/src/api/self_check.ts

@@ -1,5 +1,6 @@
 import type { CosyError } from '@/lib/http'
 import type { CosyError } from '@/lib/http'
 import http from '@/lib/http'
 import http from '@/lib/http'
+import ws from '@/lib/websocket'
 
 
 export interface Report {
 export interface Report {
   name: string
   name: string
@@ -13,6 +14,9 @@ const selfCheck = {
   fix(taskName: string) {
   fix(taskName: string) {
     return http.post(`/self_check/${taskName}/fix`)
     return http.post(`/self_check/${taskName}/fix`)
   },
   },
+  websocket() {
+    return ws('/api/self_check/websocket', false)
+  },
 }
 }
 
 
 export default selfCheck
 export default selfCheck

+ 12 - 4
app/src/language/ar/app.po

@@ -199,7 +199,7 @@ msgstr "اطلب المساعدة من ChatGPT"
 msgid "Assistant"
 msgid "Assistant"
 msgstr "المساعد"
 msgstr "المساعد"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 #, fuzzy
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr "محاولات"
 msgstr "محاولات"
@@ -1846,7 +1846,7 @@ msgstr "يقرأ"
 msgid "Receive"
 msgid "Receive"
 msgstr "يستقبل"
 msgstr "يستقبل"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2139,7 +2139,7 @@ msgstr "تم نسخ السر"
 msgid "Selector"
 msgid "Selector"
 msgstr "المحدد"
 msgstr "المحدد"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2155,7 +2155,7 @@ msgstr "إرسال"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2285,6 +2285,14 @@ msgstr "مجلد"
 msgid "Success"
 msgid "Success"
 msgstr "نجاح"
 msgstr "نجاح"
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 12 - 4
app/src/language/en/app.po

@@ -209,7 +209,7 @@ msgstr ""
 msgid "Assistant"
 msgid "Assistant"
 msgstr ""
 msgstr ""
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr ""
 msgstr ""
 
 
@@ -1910,7 +1910,7 @@ msgstr "Reads"
 msgid "Receive"
 msgid "Receive"
 msgstr "Receive"
 msgstr "Receive"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2229,7 +2229,7 @@ msgstr ""
 msgid "Selector"
 msgid "Selector"
 msgstr ""
 msgstr ""
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2245,7 +2245,7 @@ msgstr "Send"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2380,6 +2380,14 @@ msgstr "Directive"
 msgid "Success"
 msgid "Success"
 msgstr ""
 msgstr ""
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 12 - 4
app/src/language/es/app.po

@@ -204,7 +204,7 @@ msgstr "Preguntar por ayuda a ChatGPT"
 msgid "Assistant"
 msgid "Assistant"
 msgstr "Asistente"
 msgstr "Asistente"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 #, fuzzy
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr "Intentos"
 msgstr "Intentos"
@@ -1878,7 +1878,7 @@ msgstr "Lecturas"
 msgid "Receive"
 msgid "Receive"
 msgstr "Recibido"
 msgstr "Recibido"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2187,7 +2187,7 @@ msgstr "El secreto ha sido copiado"
 msgid "Selector"
 msgid "Selector"
 msgstr "Seleccionador"
 msgstr "Seleccionador"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2203,7 +2203,7 @@ msgstr "Enviado"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2333,6 +2333,14 @@ msgstr "Directorio"
 msgid "Success"
 msgid "Success"
 msgstr "Éxito"
 msgstr "Éxito"
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 12 - 4
app/src/language/fr_FR/app.po

@@ -212,7 +212,7 @@ msgstr "Modèle ChatGPT"
 msgid "Assistant"
 msgid "Assistant"
 msgstr ""
 msgstr ""
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr ""
 msgstr ""
 
 
@@ -1924,7 +1924,7 @@ msgstr "Lectures"
 msgid "Receive"
 msgid "Receive"
 msgstr "Recevoir"
 msgstr "Recevoir"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2244,7 +2244,7 @@ msgstr ""
 msgid "Selector"
 msgid "Selector"
 msgstr "Sélecteur"
 msgstr "Sélecteur"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2260,7 +2260,7 @@ msgstr "Envoyer"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2394,6 +2394,14 @@ msgstr "Directive"
 msgid "Success"
 msgid "Success"
 msgstr ""
 msgstr ""
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 #, fuzzy
 #, fuzzy

+ 12 - 4
app/src/language/ko_KR/app.po

@@ -201,7 +201,7 @@ msgstr "ChatGPT에게 도움 요청"
 msgid "Assistant"
 msgid "Assistant"
 msgstr "조수"
 msgstr "조수"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 #, fuzzy
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr "시도 횟수"
 msgstr "시도 횟수"
@@ -1888,7 +1888,7 @@ msgstr "읽기"
 msgid "Receive"
 msgid "Receive"
 msgstr "수신"
 msgstr "수신"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2211,7 +2211,7 @@ msgstr ""
 msgid "Selector"
 msgid "Selector"
 msgstr "선택"
 msgstr "선택"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2227,7 +2227,7 @@ msgstr "보내기"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2361,6 +2361,14 @@ msgstr "디렉토리"
 msgid "Success"
 msgid "Success"
 msgstr "성공"
 msgstr "성공"
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 8 - 4
app/src/language/messages.pot

@@ -190,7 +190,7 @@ msgstr ""
 msgid "Assistant"
 msgid "Assistant"
 msgstr ""
 msgstr ""
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr ""
 msgstr ""
 
 
@@ -1790,7 +1790,7 @@ msgstr ""
 msgid "Receive"
 msgid "Receive"
 msgstr ""
 msgstr ""
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2078,7 +2078,7 @@ msgid "Selector"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/index.ts:283
 #: src/routes/index.ts:283
-#: src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2094,7 +2094,7 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129
+#: src/lib/http/index.ts:128
 #: src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
@@ -2226,6 +2226,10 @@ msgstr ""
 msgid "Success"
 msgid "Success"
 msgstr ""
 msgstr ""
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid "Support communication with the backend through the WebSocket protocol. If your Nginx UI is being used via an Nginx reverse proxy, please refer to this link to write the corresponding configuration file: https://nginxui.com/guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 12 - 4
app/src/language/ru_RU/app.po

@@ -203,7 +203,7 @@ msgstr "Обратитесь за помощью к ChatGPT"
 msgid "Assistant"
 msgid "Assistant"
 msgstr "Ассистент"
 msgstr "Ассистент"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 #, fuzzy
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr "Попытки"
 msgstr "Попытки"
@@ -1873,7 +1873,7 @@ msgstr "Чтение"
 msgid "Receive"
 msgid "Receive"
 msgstr "Принято"
 msgstr "Принято"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2181,7 +2181,7 @@ msgstr ""
 msgid "Selector"
 msgid "Selector"
 msgstr "Выбор"
 msgstr "Выбор"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2197,7 +2197,7 @@ msgstr "Отправлено"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2327,6 +2327,14 @@ msgstr "Каталог"
 msgid "Success"
 msgid "Success"
 msgstr "Успех"
 msgstr "Успех"
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 12 - 4
app/src/language/tr_TR/app.po

@@ -199,7 +199,7 @@ msgstr "ChatGPT'den Yardım İsteyin"
 msgid "Assistant"
 msgid "Assistant"
 msgstr "Asistan"
 msgstr "Asistan"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 #, fuzzy
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr "Girişimler"
 msgstr "Girişimler"
@@ -1968,7 +1968,7 @@ msgstr "Okumalar"
 msgid "Receive"
 msgid "Receive"
 msgstr "Teslim almak"
 msgstr "Teslim almak"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2326,7 +2326,7 @@ msgstr "Sır kopyalandı"
 msgid "Selector"
 msgid "Selector"
 msgstr "Selektör"
 msgstr "Selektör"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2343,7 +2343,7 @@ msgstr "Gönder"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2496,6 +2496,14 @@ msgstr "Dizin"
 msgid "Success"
 msgid "Success"
 msgstr "Başarılı"
 msgstr "Başarılı"
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 #, fuzzy
 #, fuzzy

+ 12 - 4
app/src/language/vi_VN/app.po

@@ -210,7 +210,7 @@ msgstr "Hỏi ChatGPT"
 msgid "Assistant"
 msgid "Assistant"
 msgstr "Trợ lý"
 msgstr "Trợ lý"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr ""
 msgstr ""
 
 
@@ -1928,7 +1928,7 @@ msgstr "Đọc"
 msgid "Receive"
 msgid "Receive"
 msgstr "Nhận"
 msgstr "Nhận"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2251,7 +2251,7 @@ msgstr ""
 msgid "Selector"
 msgid "Selector"
 msgstr "Bộ chọn"
 msgstr "Bộ chọn"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2267,7 +2267,7 @@ msgstr "Gửi"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2398,6 +2398,14 @@ msgstr "Thư mục"
 msgid "Success"
 msgid "Success"
 msgstr "Thành công"
 msgstr "Thành công"
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 14 - 4
app/src/language/zh_CN/app.po

@@ -196,7 +196,7 @@ msgstr "与ChatGPT聊天"
 msgid "Assistant"
 msgid "Assistant"
 msgstr "助手"
 msgstr "助手"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr "尝试修复"
 msgstr "尝试修复"
 
 
@@ -1808,7 +1808,7 @@ msgstr "读"
 msgid "Receive"
 msgid "Receive"
 msgstr "下载"
 msgstr "下载"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr "重新检查"
 msgstr "重新检查"
 
 
@@ -2098,7 +2098,7 @@ msgstr "密钥已复制"
 msgid "Selector"
 msgid "Selector"
 msgstr "选择器"
 msgstr "选择器"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr "自我检查"
 msgstr "自我检查"
 
 
@@ -2114,7 +2114,7 @@ msgstr "上传"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2240,6 +2240,16 @@ msgstr "Streams 目录"
 msgid "Success"
 msgid "Success"
 msgstr "成功"
 msgstr "成功"
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+"支持通过 WebSocket 协议与后端通信,如果您正在使用 Nginx 反向代理了 Nginx UI "
+"请参考:https://nginxui.com/guide/nginx-proxy-example.html 编写配置文件"
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 12 - 4
app/src/language/zh_TW/app.po

@@ -204,7 +204,7 @@ msgstr "向 ChatGPT 尋求幫助"
 msgid "Assistant"
 msgid "Assistant"
 msgstr "助理"
 msgstr "助理"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 #, fuzzy
 msgid "Attempt to fix"
 msgid "Attempt to fix"
 msgstr "嘗試次數"
 msgstr "嘗試次數"
@@ -1841,7 +1841,7 @@ msgstr "讀取"
 msgid "Receive"
 msgid "Receive"
 msgstr "接收"
 msgstr "接收"
 
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgid "Recheck"
 msgstr ""
 msgstr ""
 
 
@@ -2144,7 +2144,7 @@ msgstr ""
 msgid "Selector"
 msgid "Selector"
 msgstr "選擇器"
 msgstr "選擇器"
 
 
-#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/routes/index.ts:283 src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgid "Self Check"
 msgstr ""
 msgstr ""
 
 
@@ -2160,7 +2160,7 @@ msgstr "傳送"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:194
-#: src/lib/http/index.ts:129 src/views/config/components/Mkdir.vue:38
+#: src/lib/http/index.ts:128 src/views/config/components/Mkdir.vue:38
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/components/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/config/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2288,6 +2288,14 @@ msgstr "目錄"
 msgid "Success"
 msgid "Success"
 msgstr "成功"
 msgstr "成功"
 
 
+#: src/views/system/SelfCheck/SelfCheck.vue:78
+msgid ""
+"Support communication with the backend through the WebSocket protocol. If "
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
+"link to write the corresponding configuration file: https://nginxui.com/"
+"guide/nginx-proxy-example.html"
+msgstr ""
+
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:240
 #: src/views/dashboard/ServerAnalytic.vue:241
 #: src/views/dashboard/ServerAnalytic.vue:241
 msgid "Swap"
 msgid "Swap"

+ 45 - 23
app/src/views/system/SelfCheck/SelfCheck.vue

@@ -7,6 +7,7 @@ import tasks from './tasks'
 const data = ref<Report[]>()
 const data = ref<Report[]>()
 
 
 const loading = ref(false)
 const loading = ref(false)
+const supportWebsocket = ref(false)
 
 
 function check() {
 function check() {
   loading.value = true
   loading.value = true
@@ -15,6 +16,10 @@ function check() {
   }).finally(() => {
   }).finally(() => {
     loading.value = false
     loading.value = false
   })
   })
+  const ws = selfCheck.websocket()
+  ws.onopen = () => {
+    supportWebsocket.value = true
+  }
 }
 }
 
 
 onMounted(() => {
 onMounted(() => {
@@ -42,30 +47,47 @@ function fix(taskName: string) {
         {{ $gettext('Recheck') }}
         {{ $gettext('Recheck') }}
       </AButton>
       </AButton>
     </template>
     </template>
-    <AList :data-source="data">
-      <template #renderItem="{ item }">
-        <AListItem>
-          <template v-if="item.err" #actions>
-            <AButton type="link" size="small" :loading="fixing[item.name]" @click="fix(item.name)">
-              {{ $gettext('Attempt to fix') }}
-            </AButton>
+    <AList>
+      <AListItem v-for="(item, index) in data" :key="index">
+        <template v-if="item.err" #actions>
+          <AButton type="link" size="small" :loading="fixing[item.name]" @click="fix(item.name)">
+            {{ $gettext('Attempt to fix') }}
+          </AButton>
+        </template>
+        <AListItemMeta>
+          <template #title>
+            {{ tasks?.[item.name]?.name?.() }}
           </template>
           </template>
-          <AListItemMeta>
-            <template #title>
-              {{ tasks?.[item.name]?.name?.() }}
-            </template>
-            <template #description>
-              {{ tasks?.[item.name]?.description?.() }}
-            </template>
-            <template #avatar>
-              <div class="text-23px">
-                <CheckCircleOutlined v-if="!item.err" class="text-green" />
-                <CloseCircleOutlined v-else class="text-red" />
-              </div>
-            </template>
-          </AListItemMeta>
-        </AListItem>
-      </template>
+          <template #description>
+            {{ tasks?.[item.name]?.description?.() }}
+          </template>
+          <template #avatar>
+            <div class="text-23px">
+              <CheckCircleOutlined v-if="!item.err" class="text-green" />
+              <CloseCircleOutlined v-else class="text-red" />
+            </div>
+          </template>
+        </AListItemMeta>
+      </AListItem>
+      <AListItem>
+        <AListItemMeta>
+          <template #title>
+            WebSocket
+          </template>
+          <template #description>
+            {{ $gettext('Support communication with the backend through the WebSocket protocol. '
+              + 'If your Nginx UI is being used via an Nginx reverse proxy, '
+              + 'please refer to this link to write the corresponding configuration file: '
+              + 'https://nginxui.com/guide/nginx-proxy-example.html') }}
+          </template>
+          <template #avatar>
+            <div class="text-23px">
+              <CheckCircleOutlined v-if="supportWebsocket" class="text-green" />
+              <CloseCircleOutlined v-else class="text-red" />
+            </div>
+          </template>
+        </AListItemMeta>
+      </AListItem>
     </AList>
     </AList>
   </ACard>
   </ACard>
 </template>
 </template>