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("self_check", SelfCheck)
 	r.POST("self_check/:name/fix", SelfCheckFix)
+	r.GET("self_check/websocket", CheckWebSocket)
 }
 
 func InitWebSocketRouter(r *gin.RouterGroup) {

+ 23 - 0
api/system/self_check.go

@@ -1,6 +1,8 @@
 package system
 
 import (
+	"github.com/gorilla/websocket"
+	"github.com/uozi-tech/cosy/logger"
 	"net/http"
 
 	"github.com/0xJacky/Nginx-UI/internal/self_check"
@@ -16,3 +18,24 @@ func SelfCheckFix(c *gin.Context) {
 	result := self_check.AttemptFix(c.Param("name"))
 	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",
     "less": "^4.2.1",
     "postcss": "^8.5.1",
-    "tailwindcss": "^3.4.17",
     "typescript": "5.7.3",
     "unplugin-auto-import": "^19.0.0",
     "unplugin-vue-components": "^28.0.0",

+ 0 - 226
app/pnpm-lock.yaml

@@ -180,9 +180,6 @@ importers:
       postcss:
         specifier: ^8.5.1
         version: 8.5.1
-      tailwindcss:
-        specifier: ^3.4.17
-        version: 3.4.17
       typescript:
         specifier: 5.7.3
         version: 5.7.3
@@ -210,10 +207,6 @@ packages:
   '@0xjacky/vue-github-button@3.1.1':
     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':
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
@@ -1892,9 +1885,6 @@ packages:
     peerDependencies:
       vue: '>=3.2.0'
 
-  any-promise@1.3.0:
-    resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
-
   anymatch@3.1.3:
     resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
     engines: {node: '>= 8'}
@@ -1906,9 +1896,6 @@ packages:
     resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
     engines: {node: '>=14'}
 
-  arg@5.0.2:
-    resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
-
   argparse@2.0.1:
     resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
 
@@ -2051,10 +2038,6 @@ packages:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     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:
     resolution: {integrity: sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==}
 
@@ -2123,10 +2106,6 @@ packages:
     resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==}
     engines: {node: '>=4.0.0'}
 
-  commander@4.1.1:
-    resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
-    engines: {node: '>= 6'}
-
   commander@7.2.0:
     resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
     engines: {node: '>= 10'}
@@ -2296,15 +2275,9 @@ packages:
   devlop@1.1.0:
     resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
 
-  didyoumean@1.2.2:
-    resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
-
   diff3@0.0.3:
     resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==}
 
-  dlv@1.1.3:
-    resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
-
   doctrine@3.0.0:
     resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
     engines: {node: '>=6.0.0'}
@@ -2654,10 +2627,6 @@ packages:
   fast-deep-equal@3.1.3:
     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:
     resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
     engines: {node: '>=8.6.0'}
@@ -3094,10 +3063,6 @@ packages:
   jackspeak@3.4.3:
     resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
 
-  jiti@1.21.6:
-    resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
-    hasBin: true
-
   jiti@2.4.1:
     resolution: {integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==}
     hasBin: true
@@ -3177,10 +3142,6 @@ packages:
     resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
     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:
     resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
 
@@ -3480,9 +3441,6 @@ packages:
   muggle-string@0.4.1:
     resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
 
-  mz@2.7.0:
-    resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
-
   nanoid@3.3.8:
     resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -3539,14 +3497,6 @@ packages:
     engines: {node: ^14.16.0 || >=16.10.0}
     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:
     resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
     engines: {node: '>= 0.4'}
@@ -3700,10 +3650,6 @@ packages:
     resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
     engines: {node: '>=12'}
 
-  pify@2.3.0:
-    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
-    engines: {node: '>=0.10.0'}
-
   pify@4.0.1:
     resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
     engines: {node: '>=6'}
@@ -3728,10 +3674,6 @@ packages:
       typescript:
         optional: true
 
-  pirates@4.0.6:
-    resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
-    engines: {node: '>= 6'}
-
   pkg-types@1.2.1:
     resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
 
@@ -3752,36 +3694,6 @@ packages:
     resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
     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:
     resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
     engines: {node: '>=4'}
@@ -3816,9 +3728,6 @@ packages:
   rc9@2.1.2:
     resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
 
-  read-cache@1.0.0:
-    resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
-
   read-pkg-up@7.0.1:
     resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
     engines: {node: '>=8'}
@@ -4110,11 +4019,6 @@ packages:
   stylis@4.3.4:
     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:
     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
     engines: {node: '>=8'}
@@ -4139,11 +4043,6 @@ packages:
     resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
     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:
     resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
     engines: {node: '>=6'}
@@ -4152,13 +4051,6 @@ packages:
     resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
     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:
     resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
     engines: {node: '>=12.22'}
@@ -4191,9 +4083,6 @@ packages:
     peerDependencies:
       typescript: '>=4.8.4'
 
-  ts-interface-checker@0.1.13:
-    resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
-
   tslib@2.8.1:
     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 
@@ -4601,8 +4490,6 @@ snapshots:
     dependencies:
       github-buttons: 2.29.1
 
-  '@alloc/quick-lru@5.2.0': {}
-
   '@ampproject/remapping@2.3.0':
     dependencies:
       '@jridgewell/gen-mapping': 0.3.8
@@ -6474,8 +6361,6 @@ snapshots:
       vue-types: 3.0.2(vue@3.5.13(typescript@5.7.3))
       warning: 4.0.3
 
-  any-promise@1.3.0: {}
-
   anymatch@3.1.3:
     dependencies:
       normalize-path: 3.0.0
@@ -6492,8 +6377,6 @@ snapshots:
 
   are-docs-informative@0.0.2: {}
 
-  arg@5.0.2: {}
-
   argparse@2.0.1: {}
 
   array-back@3.1.0: {}
@@ -6667,8 +6550,6 @@ snapshots:
 
   callsites@3.1.0: {}
 
-  camelcase-css@2.0.1: {}
-
   caniuse-lite@1.0.30001688: {}
 
   ccount@2.0.1: {}
@@ -6758,8 +6639,6 @@ snapshots:
       lodash.camelcase: 4.3.0
       typical: 4.0.0
 
-  commander@4.1.1: {}
-
   commander@7.2.0: {}
 
   comment-parser@1.4.1: {}
@@ -6908,12 +6787,8 @@ snapshots:
     dependencies:
       dequal: 2.0.3
 
-  didyoumean@1.2.2: {}
-
   diff3@0.0.3: {}
 
-  dlv@1.1.3: {}
-
   doctrine@3.0.0:
     dependencies:
       esutils: 2.0.3
@@ -7473,14 +7348,6 @@ snapshots:
 
   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:
     dependencies:
       '@nodelib/fs.stat': 2.0.5
@@ -7924,8 +7791,6 @@ snapshots:
     optionalDependencies:
       '@pkgjs/parseargs': 0.11.0
 
-  jiti@1.21.6: {}
-
   jiti@2.4.1: {}
 
   js-tokens@4.0.0: {}
@@ -7997,8 +7862,6 @@ snapshots:
       prelude-ls: 1.2.1
       type-check: 0.4.0
 
-  lilconfig@3.1.3: {}
-
   lines-and-columns@1.2.4: {}
 
   load-tsconfig@0.2.5: {}
@@ -8440,12 +8303,6 @@ snapshots:
 
   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: {}
 
   nanopop@2.4.2: {}
@@ -8496,10 +8353,6 @@ snapshots:
       pkg-types: 1.3.0
       ufo: 1.5.4
 
-  object-assign@4.1.1: {}
-
-  object-hash@3.0.0: {}
-
   object-inspect@1.13.3: {}
 
   object-keys@1.1.1: {}
@@ -8640,8 +8493,6 @@ snapshots:
 
   picomatch@4.0.2: {}
 
-  pify@2.3.0: {}
-
   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):
@@ -8667,8 +8518,6 @@ snapshots:
     transitivePeerDependencies:
       - '@vue/composition-api'
 
-  pirates@4.0.6: {}
-
   pkg-types@1.2.1:
     dependencies:
       confbox: 0.1.8
@@ -8689,30 +8538,6 @@ snapshots:
 
   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:
     dependencies:
       cssesc: 3.0.0
@@ -8747,10 +8572,6 @@ snapshots:
       defu: 6.1.4
       destr: 2.0.3
 
-  read-cache@1.0.0:
-    dependencies:
-      pify: 2.3.0
-
   read-pkg-up@7.0.1:
     dependencies:
       find-up: 4.1.0
@@ -9096,16 +8917,6 @@ snapshots:
 
   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:
     dependencies:
       has-flag: 4.0.0
@@ -9133,33 +8944,6 @@ snapshots:
       '@pkgr/core': 0.1.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: {}
 
   tar@6.2.1:
@@ -9171,14 +8955,6 @@ snapshots:
       mkdirp: 1.0.4
       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: {}
 
   tinyexec@0.3.1: {}
@@ -9204,8 +8980,6 @@ snapshots:
     dependencies:
       typescript: 5.7.3
 
-  ts-interface-checker@0.1.13: {}
-
   tslib@2.8.1: {}
 
   tsx@4.19.2:

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

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

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

@@ -199,7 +199,7 @@ msgstr "اطلب المساعدة من ChatGPT"
 msgid "Assistant"
 msgstr "المساعد"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "محاولات"
@@ -1846,7 +1846,7 @@ msgstr "يقرأ"
 msgid "Receive"
 msgstr "يستقبل"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2139,7 +2139,7 @@ msgstr "تم نسخ السر"
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2155,7 +2155,7 @@ msgstr "إرسال"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2285,6 +2285,14 @@ msgstr "مجلد"
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -209,7 +209,7 @@ msgstr ""
 msgid "Assistant"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgstr ""
 
@@ -1910,7 +1910,7 @@ msgstr "Reads"
 msgid "Receive"
 msgstr "Receive"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2229,7 +2229,7 @@ msgstr ""
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2245,7 +2245,7 @@ msgstr "Send"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2380,6 +2380,14 @@ msgstr "Directive"
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -204,7 +204,7 @@ msgstr "Preguntar por ayuda a ChatGPT"
 msgid "Assistant"
 msgstr "Asistente"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "Intentos"
@@ -1878,7 +1878,7 @@ msgstr "Lecturas"
 msgid "Receive"
 msgstr "Recibido"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2187,7 +2187,7 @@ msgstr "El secreto ha sido copiado"
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2203,7 +2203,7 @@ msgstr "Enviado"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2333,6 +2333,14 @@ msgstr "Directorio"
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -212,7 +212,7 @@ msgstr "Modèle ChatGPT"
 msgid "Assistant"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgstr ""
 
@@ -1924,7 +1924,7 @@ msgstr "Lectures"
 msgid "Receive"
 msgstr "Recevoir"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2244,7 +2244,7 @@ msgstr ""
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2260,7 +2260,7 @@ msgstr "Envoyer"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2394,6 +2394,14 @@ msgstr "Directive"
 msgid "Success"
 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:241
 #, fuzzy

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

@@ -201,7 +201,7 @@ msgstr "ChatGPT에게 도움 요청"
 msgid "Assistant"
 msgstr "조수"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "시도 횟수"
@@ -1888,7 +1888,7 @@ msgstr "읽기"
 msgid "Receive"
 msgstr "수신"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2211,7 +2211,7 @@ msgstr ""
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2227,7 +2227,7 @@ msgstr "보내기"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2361,6 +2361,14 @@ msgstr "디렉토리"
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -190,7 +190,7 @@ msgstr ""
 msgid "Assistant"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgstr ""
 
@@ -1790,7 +1790,7 @@ msgstr ""
 msgid "Receive"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2078,7 +2078,7 @@ msgid "Selector"
 msgstr ""
 
 #: src/routes/index.ts:283
-#: src/views/system/SelfCheck/SelfCheck.vue:37
+#: src/views/system/SelfCheck/SelfCheck.vue:42
 msgid "Self Check"
 msgstr ""
 
@@ -2094,7 +2094,7 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/Rename.vue:45
 #: src/views/config/ConfigEditor.vue:111
@@ -2226,6 +2226,10 @@ msgstr ""
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -203,7 +203,7 @@ msgstr "Обратитесь за помощью к ChatGPT"
 msgid "Assistant"
 msgstr "Ассистент"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "Попытки"
@@ -1873,7 +1873,7 @@ msgstr "Чтение"
 msgid "Receive"
 msgstr "Принято"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2181,7 +2181,7 @@ msgstr ""
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2197,7 +2197,7 @@ msgstr "Отправлено"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2327,6 +2327,14 @@ msgstr "Каталог"
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -199,7 +199,7 @@ msgstr "ChatGPT'den Yardım İsteyin"
 msgid "Assistant"
 msgstr "Asistan"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "Girişimler"
@@ -1968,7 +1968,7 @@ msgstr "Okumalar"
 msgid "Receive"
 msgstr "Teslim almak"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2326,7 +2326,7 @@ msgstr "Sır kopyalandı"
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2343,7 +2343,7 @@ msgstr "Gönder"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2496,6 +2496,14 @@ msgstr "Dizin"
 msgid "Success"
 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:241
 #, fuzzy

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

@@ -210,7 +210,7 @@ msgstr "Hỏi ChatGPT"
 msgid "Assistant"
 msgstr "Trợ lý"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgstr ""
 
@@ -1928,7 +1928,7 @@ msgstr "Đọc"
 msgid "Receive"
 msgstr "Nhận"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2251,7 +2251,7 @@ msgstr ""
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2267,7 +2267,7 @@ msgstr "Gửi"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2398,6 +2398,14 @@ msgstr "Thư mục"
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -196,7 +196,7 @@ msgstr "与ChatGPT聊天"
 msgid "Assistant"
 msgstr "助手"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 msgid "Attempt to fix"
 msgstr "尝试修复"
 
@@ -1808,7 +1808,7 @@ msgstr "读"
 msgid "Receive"
 msgstr "下载"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr "重新检查"
 
@@ -2098,7 +2098,7 @@ msgstr "密钥已复制"
 msgid "Selector"
 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"
 msgstr "自我检查"
 
@@ -2114,7 +2114,7 @@ msgstr "上传"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2240,6 +2240,16 @@ msgstr "Streams 目录"
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -204,7 +204,7 @@ msgstr "向 ChatGPT 尋求幫助"
 msgid "Assistant"
 msgstr "助理"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:50
+#: src/views/system/SelfCheck/SelfCheck.vue:54
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "嘗試次數"
@@ -1841,7 +1841,7 @@ msgstr "讀取"
 msgid "Receive"
 msgstr "接收"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:47
 msgid "Recheck"
 msgstr ""
 
@@ -2144,7 +2144,7 @@ msgstr ""
 msgid "Selector"
 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"
 msgstr ""
 
@@ -2160,7 +2160,7 @@ msgstr "傳送"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:53
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:70
 #: 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/ConfigEditor.vue:111
 #: src/views/environment/BatchUpgrader.vue:59
@@ -2288,6 +2288,14 @@ msgstr "目錄"
 msgid "Success"
 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:241
 msgid "Swap"

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

@@ -7,6 +7,7 @@ import tasks from './tasks'
 const data = ref<Report[]>()
 
 const loading = ref(false)
+const supportWebsocket = ref(false)
 
 function check() {
   loading.value = true
@@ -15,6 +16,10 @@ function check() {
   }).finally(() => {
     loading.value = false
   })
+  const ws = selfCheck.websocket()
+  ws.onopen = () => {
+    supportWebsocket.value = true
+  }
 }
 
 onMounted(() => {
@@ -42,30 +47,47 @@ function fix(taskName: string) {
         {{ $gettext('Recheck') }}
       </AButton>
     </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>
-          <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>
   </ACard>
 </template>