浏览代码

refactor: reorganize self-check tasks and improve task management

- Moved self-check tasks into a structured task manager for better organization.
- Added frontend and backend task definitions with improved error handling.
- Updated SelfCheck.vue to utilize the new task manager for running checks and fixing tasks.
- Introduced HTTPS check task to ensure secure connections and warn about HTTP usage outside localhost.
- Enhanced WebSocket task to verify connection status with improved error reporting.
Jacky 1 月之前
父节点
当前提交
83c9af8cad

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

@@ -218,7 +218,7 @@ msgstr "اطلب المساعدة من ChatGPT"
 msgid "Assistant"
 msgstr "المساعد"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "محاولات"
@@ -463,21 +463,27 @@ msgstr "قناة"
 msgid "Check again"
 msgstr "تحقق مرة أخرى"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1524,6 +1530,10 @@ msgstr "منفذ تحدي HTTP"
 msgid "HTTP01"
 msgstr "HTTP01"
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr ""
@@ -1955,11 +1965,11 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "مسار سجل الوصول لـ Nginx"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2455,7 +2465,7 @@ msgstr "يقرأ"
 msgid "Receive"
 msgstr "يستقبل"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2822,7 +2832,7 @@ msgstr "رمز 2FA أو الاسترداد غير صالح"
 msgid "Selector"
 msgstr "المحدد"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -2921,7 +2931,7 @@ msgstr "سجلات الموقع"
 msgid "Site not found"
 msgstr "لم يتم العثور على الملف"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "مجلد"
@@ -3034,7 +3044,7 @@ msgstr "معطل"
 msgid "Stream not found"
 msgstr "لم يتم العثور على الملف"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "مجلد"
@@ -3053,7 +3063,7 @@ msgstr "مجلد"
 msgid "Success"
 msgstr "نجاح"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3441,6 +3451,10 @@ msgstr "يتطلب المصادقة الثنائية"
 msgid "Type"
 msgstr "نوع"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 msgid "Update successfully"
 msgstr "تم التحديث بنجاح"

+ 26 - 12
app/src/language/de_DE/app.po

@@ -232,7 +232,7 @@ msgstr "Frage ChatGPT um Hilfe"
 msgid "Assistant"
 msgstr "Assistent"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "Versuche"
@@ -480,21 +480,27 @@ msgstr "Kanal"
 msgid "Check again"
 msgstr "Erneut prüfen"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1574,6 +1580,10 @@ msgstr ""
 msgid "HTTP01"
 msgstr ""
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr "ICP-Nummer"
@@ -2032,11 +2042,11 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr "Nginx Zugriffslog-Pfad"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2555,7 +2565,7 @@ msgstr "Aufrufe"
 msgid "Receive"
 msgstr "Empfangen"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2948,7 +2958,7 @@ msgstr "Ungültiger 2FA- oder Wiederherstellungscode"
 msgid "Selector"
 msgstr "Auswähler"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -3048,7 +3058,7 @@ msgstr "Liste der Seiten"
 msgid "Site not found"
 msgstr "File Not Found"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "Anweisung"
@@ -3165,7 +3175,7 @@ msgstr "Deaktiviert"
 msgid "Stream not found"
 msgstr "File Not Found"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "Anweisung"
@@ -3182,7 +3192,7 @@ msgstr ""
 msgid "Success"
 msgstr "Erfolg"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3579,6 +3589,10 @@ msgstr "Zwei-Faktor-Authentifizierung erforderlich"
 msgid "Type"
 msgstr "Typ"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 #, fuzzy
 msgid "Update successfully"

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

@@ -230,7 +230,7 @@ msgstr ""
 msgid "Assistant"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 msgid "Attempt to fix"
 msgstr ""
 
@@ -474,21 +474,27 @@ msgstr ""
 msgid "Check again"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1562,6 +1568,10 @@ msgstr ""
 msgid "HTTP01"
 msgstr ""
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr ""
@@ -2011,11 +2021,11 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2512,7 +2522,7 @@ msgstr "Reads"
 msgid "Receive"
 msgstr "Receive"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2905,7 +2915,7 @@ msgstr "Invalid E-mail!"
 msgid "Selector"
 msgstr "Directive"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -3003,7 +3013,7 @@ msgstr "Sites List"
 msgid "Site not found"
 msgstr "File Not Found"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "Directive"
@@ -3122,7 +3132,7 @@ msgstr "Disabled"
 msgid "Stream not found"
 msgstr "File Not Found"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "Directive"
@@ -3141,7 +3151,7 @@ msgstr "Directive"
 msgid "Success"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3514,6 +3524,10 @@ msgstr ""
 msgid "Type"
 msgstr ""
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 #, fuzzy
 msgid "Update successfully"

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

@@ -223,7 +223,7 @@ msgstr "Preguntar por ayuda a ChatGPT"
 msgid "Assistant"
 msgstr "Asistente"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "Intentos"
@@ -462,21 +462,27 @@ msgstr "Canal"
 msgid "Check again"
 msgstr "Intentar nuevamente"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1525,6 +1531,10 @@ msgstr "Puerto de desafío HTTP"
 msgid "HTTP01"
 msgstr "HTTP01"
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr ""
@@ -1958,11 +1968,11 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Ruta de registro de acceso de Nginx"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2476,7 +2486,7 @@ msgstr "Lecturas"
 msgid "Receive"
 msgstr "Recibido"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2854,7 +2864,7 @@ msgstr "Código 2FA o de recuperación inválido"
 msgid "Selector"
 msgstr "Seleccionador"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -2953,7 +2963,7 @@ msgstr "Registros del sitio"
 msgid "Site not found"
 msgstr "Archivo no Encontrado"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "Directorio"
@@ -3064,7 +3074,7 @@ msgstr "Certificado automático"
 msgid "Stream not found"
 msgstr "Archivo no Encontrado"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "Directorio"
@@ -3082,7 +3092,7 @@ msgstr "Directorio"
 msgid "Success"
 msgstr "Éxito"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3482,6 +3492,10 @@ msgstr "Se requiere autenticación de dos factores"
 msgid "Type"
 msgstr "Tipo"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 #, fuzzy
 msgid "Update successfully"

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

@@ -236,7 +236,7 @@ msgstr "Modèle ChatGPT"
 msgid "Assistant"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 msgid "Attempt to fix"
 msgstr "Tenter de corriger"
 
@@ -482,15 +482,21 @@ msgstr "Canal"
 msgid "Check again"
 msgstr "Revérifier"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr "Vérifie si le nginx.conf inclus le répertoire sites-enabled."
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr "Vérifie si le nginx.conf inclus le répertoire streams-enabled."
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
@@ -498,7 +504,7 @@ msgstr ""
 "Vérifie si les répertoires sites-available et sites-enabled sont dans le "
 "répertoire de configuration nginx."
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1586,6 +1592,10 @@ msgstr "Port de challenge HTTP"
 msgid "HTTP01"
 msgstr "HTTP01"
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr ""
@@ -2041,11 +2051,11 @@ msgstr "Journal Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Chemin du journal d'accès Nginx"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2550,7 +2560,7 @@ msgstr "Lectures"
 msgid "Receive"
 msgstr "Recevoir"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2940,7 +2950,7 @@ msgstr "Format de la requête invalide"
 msgid "Selector"
 msgstr "Sélecteur"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -3039,7 +3049,7 @@ msgstr "Journaux du site"
 msgid "Site not found"
 msgstr "Fichier introuvable"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "Directive"
@@ -3156,7 +3166,7 @@ msgstr "Auto Cert"
 msgid "Stream not found"
 msgstr "Fichier introuvable"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "Directive"
@@ -3175,7 +3185,7 @@ msgstr "Directive"
 msgid "Success"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3558,6 +3568,10 @@ msgstr ""
 msgid "Type"
 msgstr "Type"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 #, fuzzy
 msgid "Update successfully"

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

@@ -220,7 +220,7 @@ msgstr "ChatGPT에게 도움 요청"
 msgid "Assistant"
 msgstr "조수"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "시도 횟수"
@@ -459,21 +459,27 @@ msgstr "채널"
 msgid "Check again"
 msgstr "다시 확인"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1525,6 +1531,10 @@ msgstr "HTTP 검증 포트"
 msgid "HTTP01"
 msgstr "HTTP01"
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr ""
@@ -1972,11 +1982,11 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx 접근 로그 경로"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2478,7 +2488,7 @@ msgstr "읽기"
 msgid "Receive"
 msgstr "수신"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2870,7 +2880,7 @@ msgstr ""
 msgid "Selector"
 msgstr "선택"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -2968,7 +2978,7 @@ msgstr "사이트 로그"
 msgid "Site not found"
 msgstr "파일을 찾을 수 없음"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "디렉토리"
@@ -3084,7 +3094,7 @@ msgstr "비활성화됨"
 msgid "Stream not found"
 msgstr "파일을 찾을 수 없음"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "디렉토리"
@@ -3102,7 +3112,7 @@ msgstr "디렉토리"
 msgid "Success"
 msgstr "성공"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3479,6 +3489,10 @@ msgstr ""
 msgid "Type"
 msgstr "유형"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 #, fuzzy
 msgid "Update successfully"

+ 24 - 12
app/src/language/messages.pot

@@ -207,7 +207,7 @@ msgstr ""
 msgid "Assistant"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 msgid "Attempt to fix"
 msgstr ""
 
@@ -437,19 +437,23 @@ msgstr ""
 msgid "Check again"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid "Check if the sites-available and sites-enabled directories are under the nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid "Check if the streams-available and streams-enabled directories are under the nginx configuration directory."
 msgstr ""
 
@@ -1433,6 +1437,10 @@ msgstr ""
 msgid "HTTP01"
 msgstr ""
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr ""
@@ -1838,11 +1846,11 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2301,7 +2309,7 @@ msgstr ""
 msgid "Receive"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2652,7 +2660,7 @@ msgid "Selector"
 msgstr ""
 
 #: src/routes/modules/system.ts:19
-#: src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -2738,7 +2746,7 @@ msgstr ""
 msgid "Site not found"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 msgid "Sites Directory"
 msgstr ""
 
@@ -2844,7 +2852,7 @@ msgstr ""
 msgid "Stream not found"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 msgid "Streams Directory"
 msgstr ""
 
@@ -2861,7 +2869,7 @@ msgstr ""
 msgid "Success"
 msgstr ""
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 ""
 
@@ -3168,6 +3176,10 @@ msgstr ""
 msgid "Type"
 msgstr ""
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 msgid "Update successfully"
 msgstr ""

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

@@ -218,7 +218,7 @@ msgstr "Обратитесь за помощью к ChatGPT"
 msgid "Assistant"
 msgstr "Ассистент"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 msgid "Attempt to fix"
 msgstr "Попытка исправить"
 
@@ -450,21 +450,27 @@ msgstr "Канал"
 msgid "Check again"
 msgstr "Проверить повторно"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1508,6 +1514,10 @@ msgstr "Порт HTTP Challenge"
 msgid "HTTP01"
 msgstr "HTTP01"
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr "ICP номер"
@@ -1938,11 +1948,11 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Путь для Nginx Access Log"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2445,7 +2455,7 @@ msgstr "Чтение"
 msgid "Receive"
 msgstr "Принято"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2819,7 +2829,7 @@ msgstr "Неверный код восстановления"
 msgid "Selector"
 msgstr "Выбор"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -2917,7 +2927,7 @@ msgstr "Журналы сайта"
 msgid "Site not found"
 msgstr "Файл не найден"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "Каталог"
@@ -3028,7 +3038,7 @@ msgstr "Авто Сертификат"
 msgid "Stream not found"
 msgstr "Файл не найден"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "Каталог"
@@ -3046,7 +3056,7 @@ msgstr "Каталог"
 msgid "Success"
 msgstr "Успех"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3438,6 +3448,10 @@ msgstr "Требуется двухфакторная аутентификаци
 msgid "Type"
 msgstr "Тип"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 #, fuzzy
 msgid "Update successfully"

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

@@ -218,7 +218,7 @@ msgstr "ChatGPT'den Yardım İsteyin"
 msgid "Assistant"
 msgstr "Asistan"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 #, fuzzy
 msgid "Attempt to fix"
 msgstr "Girişimler"
@@ -455,21 +455,27 @@ msgstr "Kanal"
 msgid "Check again"
 msgstr "Tekrar kontrol et"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1537,6 +1543,10 @@ msgstr "HTTP Doğrulama Bağlantı Noktası"
 msgid "HTTP01"
 msgstr "HTTP01"
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr ""
@@ -1996,11 +2006,11 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx Erişim Günlüğü Yolu"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2569,7 +2579,7 @@ msgstr "Okumalar"
 msgid "Receive"
 msgstr "Teslim almak"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2996,7 +3006,7 @@ msgstr "Geçersiz 2FA veya kurtarma kodu"
 msgid "Selector"
 msgstr "Selektör"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -3106,7 +3116,7 @@ msgstr "Site Günlükleri"
 msgid "Site not found"
 msgstr "Dosya bulunamadı"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "Dizin"
@@ -3227,7 +3237,7 @@ msgstr "Devre dışı"
 msgid "Stream not found"
 msgstr "Dosya bulunamadı"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "Dizin"
@@ -3246,7 +3256,7 @@ msgstr "Dizin"
 msgid "Success"
 msgstr "Başarılı"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3683,6 +3693,10 @@ msgstr "İki faktörlü kimlik doğrulama gerekiyor"
 msgid "Type"
 msgstr "Tip"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 #, fuzzy
 msgid "Update successfully"

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

@@ -229,7 +229,7 @@ msgstr "Hỏi ChatGPT"
 msgid "Assistant"
 msgstr "Trợ lý"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 msgid "Attempt to fix"
 msgstr ""
 
@@ -477,21 +477,27 @@ msgstr "Kênh"
 msgid "Check again"
 msgstr "Kiểm tra lại"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1561,6 +1567,10 @@ msgstr ""
 msgid "HTTP01"
 msgstr ""
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr ""
@@ -2004,11 +2014,11 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr "Vị trí lưu log truy cập (Access log) của Nginx"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr ""
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr ""
 
@@ -2508,7 +2518,7 @@ msgstr "Đọc"
 msgid "Receive"
 msgstr "Nhận"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr ""
 
@@ -2900,7 +2910,7 @@ msgstr ""
 msgid "Selector"
 msgstr "Bộ chọn"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr ""
 
@@ -2999,7 +3009,7 @@ msgstr "Logs"
 msgid "Site not found"
 msgstr "Không tìm thấy tệp tin"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 #, fuzzy
 msgid "Sites Directory"
 msgstr "Thư mục"
@@ -3111,7 +3121,7 @@ msgstr "Đã tắt"
 msgid "Stream not found"
 msgstr "Không tìm thấy tệp tin"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 #, fuzzy
 msgid "Streams Directory"
 msgstr "Thư mục"
@@ -3129,7 +3139,7 @@ msgstr "Thư mục"
 msgid "Success"
 msgstr "Thành công"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3502,6 +3512,10 @@ msgstr ""
 msgid "Type"
 msgstr "Loại"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 #, fuzzy
 msgid "Update successfully"

+ 40 - 24
app/src/language/zh_CN/app.po

@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: 2025-03-31 10:36+0800\n"
+"PO-Revision-Date: 2025-04-02 11:07+0800\n"
 "Last-Translator: 0xJacky <me@jackyu.cn>\n"
 "Language-Team: Chinese (Simplified Han script) <https://weblate.nginxui.com/"
 "projects/nginx-ui/frontend/zh_Hans/>\n"
@@ -12,7 +12,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 3.5\n"
+"X-Generator: Poedit 3.6\n"
 "Generated-By: easygettext\n"
 
 #: src/views/user/userColumns.tsx:32
@@ -215,7 +215,7 @@ msgstr "与ChatGPT聊天"
 msgid "Assistant"
 msgstr "助手"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 msgid "Attempt to fix"
 msgstr "尝试修复"
 
@@ -440,21 +440,29 @@ msgstr "通道"
 msgid "Check again"
 msgstr "重新检查"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+"检查是否启用了 HTTPS。在本地主机之外使用 HTTP 是不安全的,这也会导致无法使用 "
+"Passkey 和剪贴板功能。"
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr "检查 nginx.conf 是否包含 sites-enabled 的目录。"
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr "检查 nginx.conf 是否包含 streams-enabled 的目录。"
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr "检查 sites-available 和 sites-enabled 目录是否位于 nginx 配置目录下。"
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1431,6 +1439,10 @@ msgstr "HTTP Challenge 监听端口"
 msgid "HTTP01"
 msgstr "HTTP01"
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr "HTTPS 协议"
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr "ICP备案号"
@@ -1850,11 +1862,11 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx 访问日志路径"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr "Nginx Conf 中引用启用站点目录"
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr "Nginx Conf 中引用启用 Streams 目录"
 
@@ -2330,7 +2342,7 @@ msgstr "读"
 msgid "Receive"
 msgstr "下载"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr "重新检查"
 
@@ -2680,7 +2692,7 @@ msgstr "安全令牌信息"
 msgid "Selector"
 msgstr "选择器"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr "自我检查"
 
@@ -2729,19 +2741,19 @@ msgstr "使用 HTTP01 challenge provider"
 
 #: src/constants/errors/nginx_log.ts:8
 msgid ""
-"Settings.NginxLogSettings.AccessLogPath is empty, refer to https://nginxui."
-"com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.AccessLogPath is empty, refer to https://"
+"nginxui.com/guide/config-nginx.html for more information"
 msgstr ""
-"Settings.NginxLogSettings.AccessLogPath 为空,更多信息请参阅 https://nginxui."
-"com/guide/config-nginx.html"
+"Settings.NginxLogSettings.AccessLogPath 为空,更多信息请参阅 https://"
+"nginxui.com/guide/config-nginx.html"
 
 #: src/constants/errors/nginx_log.ts:7
 msgid ""
-"Settings.NginxLogSettings.ErrorLogPath is empty, refer to https://nginxui."
-"com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.ErrorLogPath is empty, refer to https://"
+"nginxui.com/guide/config-nginx.html for more information"
 msgstr ""
-"Settings.NginxLogSettings.ErrorLogPath为空,更多信息请参阅 https://nginxui."
-"com/guide/config-nginx.html"
+"Settings.NginxLogSettings.ErrorLogPath为空,更多信息请参阅 https://"
+"nginxui.com/guide/config-nginx.html"
 
 #: src/components/SensitiveString/SensitiveString.vue:40
 msgid "Show"
@@ -2776,7 +2788,7 @@ msgstr "站点列表"
 msgid "Site not found"
 msgstr "网站未找到"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 msgid "Sites Directory"
 msgstr "网站目录"
 
@@ -2880,7 +2892,7 @@ msgstr "Stream 已启用"
 msgid "Stream not found"
 msgstr "Stream 未找到"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 msgid "Streams Directory"
 msgstr "Streams 目录"
 
@@ -2896,7 +2908,7 @@ msgstr "Streams-enabled 目录不存在"
 msgid "Success"
 msgstr "成功"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3257,6 +3269,10 @@ msgstr "需要两步验证"
 msgid "Type"
 msgstr "类型"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr "未知问题"
+
 #: src/views/preference/components/Passkey.vue:39
 msgid "Update successfully"
 msgstr "更新成功"
@@ -3540,8 +3556,8 @@ msgstr "你的 Passkeys"
 #~ msgstr "从 %{node} 中删除站点 %{site} 错误,响应:%{resp}"
 
 #~ msgid ""
-#~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
-#~ "%{resp}"
+#~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: %"
+#~ "{resp}"
 #~ msgstr ""
 #~ "将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path} 失败,响应:%{resp}"
 

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

@@ -220,7 +220,7 @@ msgstr "向 ChatGPT 尋求幫助"
 msgid "Assistant"
 msgstr "助理"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:54
+#: src/views/system/SelfCheck/SelfCheck.vue:50
 msgid "Attempt to fix"
 msgstr "嘗試修復"
 
@@ -448,22 +448,28 @@ msgstr "通道"
 msgid "Check again"
 msgstr "再次檢查"
 
-#: src/views/system/SelfCheck/tasks.ts:12
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:11
+msgid ""
+"Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
+"prevents using Passkeys and clipboard features."
+msgstr ""
+
+#: src/views/system/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr "請確認 nginx.conf 是否有包含 sites-enabled 資料夾。"
 
-#: src/views/system/SelfCheck/tasks.ts:16
+#: src/views/system/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr "請確認 nginx.conf 是否有包含 streams-enabled 資料夾。"
 
-#: src/views/system/SelfCheck/tasks.ts:4
+#: src/views/system/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
 "請確認 sites-available 和 sites-enabled 資料夾是否位於 Nginx 設定資料夾內。"
 
-#: src/views/system/SelfCheck/tasks.ts:8
+#: src/views/system/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory."
@@ -1491,6 +1497,10 @@ msgstr "HTTP 挑戰埠"
 msgid "HTTP01"
 msgstr "HTTP01"
 
+#: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10
+msgid "HTTPS Protocol"
+msgstr ""
+
 #: src/views/preference/NodeSettings.vue:34
 msgid "ICP Number"
 msgstr "ICP 編號"
@@ -1915,11 +1925,11 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx 存取日誌路徑"
 
-#: src/views/system/SelfCheck/tasks.ts:11
+#: src/views/system/SelfCheck/tasks/backend/index.ts:15
 msgid "Nginx Conf Include Sites Enabled"
 msgstr "Nginx 配置檔包含 sites-enabled"
 
-#: src/views/system/SelfCheck/tasks.ts:15
+#: src/views/system/SelfCheck/tasks/backend/index.ts:20
 msgid "Nginx Conf Include Streams Enabled"
 msgstr "Nginx 配置檔包含 streams-enabled"
 
@@ -2407,7 +2417,7 @@ msgstr "讀取"
 msgid "Receive"
 msgstr "接收"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:47
+#: src/views/system/SelfCheck/SelfCheck.vue:43
 msgid "Recheck"
 msgstr "重新檢查"
 
@@ -2774,7 +2784,7 @@ msgstr "無效的請求格式"
 msgid "Selector"
 msgstr "選擇器"
 
-#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:42
+#: src/routes/modules/system.ts:19 src/views/system/SelfCheck/SelfCheck.vue:38
 msgid "Self Check"
 msgstr "自我檢測"
 
@@ -2872,7 +2882,7 @@ msgstr "網站日誌"
 msgid "Site not found"
 msgstr "站點未找到"
 
-#: src/views/system/SelfCheck/tasks.ts:3
+#: src/views/system/SelfCheck/tasks/backend/index.ts:5
 msgid "Sites Directory"
 msgstr "Sites 資料夾"
 
@@ -2982,7 +2992,7 @@ msgstr "站點已啓用"
 msgid "Stream not found"
 msgstr "站點未找到"
 
-#: src/views/system/SelfCheck/tasks.ts:7
+#: src/views/system/SelfCheck/tasks/backend/index.ts:10
 msgid "Streams Directory"
 msgstr "Streams 資料夾"
 
@@ -2998,7 +3008,7 @@ msgstr "streams-enabled 資料夾不存在"
 msgid "Success"
 msgstr "成功"
 
-#: src/views/system/SelfCheck/SelfCheck.vue:78
+#: src/views/system/SelfCheck/tasks/frontend/websocket.ts:6
 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 "
@@ -3367,6 +3377,10 @@ msgstr "需要多重因素驗證"
 msgid "Type"
 msgstr "類型"
 
+#: src/views/system/SelfCheck/SelfCheck.vue:63
+msgid "Unknown issue"
+msgstr ""
+
 #: src/views/preference/components/Passkey.vue:39
 msgid "Update successfully"
 msgstr "更新成功"

+ 31 - 42
app/src/views/system/SelfCheck/SelfCheck.vue

@@ -1,24 +1,18 @@
 <script setup lang="ts">
-import type { Report } from '@/api/self_check'
-import selfCheck from '@/api/self_check'
-import { CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons-vue'
-import tasks from './tasks'
-
-const data = ref<Report[]>()
+import type { TaskReport } from './tasks'
+import { CheckCircleOutlined, CloseCircleOutlined, WarningOutlined } from '@ant-design/icons-vue'
+import { taskManager } from './tasks'
 
+const data = ref<TaskReport[]>()
 const loading = ref(false)
-const supportWebsocket = ref(false)
 
-function check() {
+async function check() {
   loading.value = true
-  selfCheck.run().then(r => {
-    data.value = r
-  }).finally(() => {
+  try {
+    data.value = await taskManager.runAllChecks()
+  }
+  finally {
     loading.value = false
-  })
-  const ws = selfCheck.websocket()
-  ws.onopen = () => {
-    supportWebsocket.value = true
   }
 }
 
@@ -28,13 +22,15 @@ onMounted(() => {
 
 const fixing = reactive({})
 
-function fix(taskName: string) {
+async function fix(taskName: string) {
   fixing[taskName] = true
-  selfCheck.fix(taskName).then(() => {
+  try {
+    await taskManager.fixTask(taskName)
     check()
-  }).finally(() => {
+  }
+  finally {
     fixing[taskName] = false
-  })
+  }
 }
 </script>
 
@@ -42,47 +38,36 @@ function fix(taskName: string) {
   <ACard :title="$gettext('Self Check')">
     <template #extra>
       <AButton
-        type="link" size="small" :loading @click="check"
+        type="link" size="small" :loading="loading" @click="check"
       >
         {{ $gettext('Recheck') }}
       </AButton>
     </template>
     <AList>
       <AListItem v-for="(item, index) in data" :key="index">
-        <template v-if="item.err" #actions>
+        <template v-if="item.status === 'error'" #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?.() }}
+            {{ taskManager.getTask(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>
+              {{ taskManager.getTask(item.name)?.description?.() }}
+            </div>
+            <div v-if="item.status !== 'success'" class="mt-1">
+              <ATag :color="item.status === 'warning' ? 'warning' : 'error'">
+                {{ item.message || item.err?.message || $gettext('Unknown issue') }}
+              </ATag>
             </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" />
+              <CheckCircleOutlined v-if="item.status === 'success'" class="text-green" />
+              <WarningOutlined v-else-if="item.status === 'warning'" class="text-yellow" />
               <CloseCircleOutlined v-else class="text-red" />
             </div>
           </template>
@@ -96,4 +81,8 @@ function fix(taskName: string) {
 :deep(.ant-list-item-meta) {
   align-items: center !important;
 }
+
+.text-yellow {
+  color: #faad14;
+}
 </style>

+ 8 - 2
app/src/views/system/SelfCheck/tasks.ts → app/src/views/system/SelfCheck/tasks/backend/index.ts

@@ -1,20 +1,26 @@
-const tasks = {
+import type { BackendTask } from '../types'
+
+const backendTasks: Record<string, BackendTask> = {
   'Directory-Sites': {
     name: () => $gettext('Sites Directory'),
     description: () => $gettext('Check if the sites-available and sites-enabled directories are under the nginx configuration directory.'),
+    type: 'backend',
   },
   'Directory-Streams': {
     name: () => $gettext('Streams Directory'),
     description: () => $gettext('Check if the streams-available and streams-enabled directories are under the nginx configuration directory.'),
+    type: 'backend',
   },
   'NginxConf-Sites-Enabled': {
     name: () => $gettext('Nginx Conf Include Sites Enabled'),
     description: () => $gettext('Check if the nginx.conf includes the sites-enabled directory.'),
+    type: 'backend',
   },
   'NginxConf-Streams-Enabled': {
     name: () => $gettext('Nginx Conf Include Streams Enabled'),
     description: () => $gettext('Check if the nginx.conf includes the streams-enabled directory.'),
+    type: 'backend',
   },
 }
 
-export default tasks
+export default backendTasks

+ 51 - 0
app/src/views/system/SelfCheck/tasks/frontend/https-check.ts

@@ -0,0 +1,51 @@
+import type { FrontendTask, TaskReport } from '../types'
+
+/**
+ * HTTPS Check Task
+ *
+ * Checks if the application is accessed via HTTPS protocol
+ * Warns (not errors) when HTTP is used outside of localhost/127.0.0.1
+ */
+const HttpsCheckTask: FrontendTask = {
+  name: () => $gettext('HTTPS Protocol'),
+  description: () => $gettext('Check if HTTPS is enabled. Using HTTP outside localhost is insecure and prevents using Passkeys and clipboard features.'),
+  type: 'frontend',
+  check: async (): Promise<TaskReport> => {
+    // Get current protocol and hostname
+    const isSecure = window.location.protocol === 'https:'
+    const isLocalhost = ['localhost', '127.0.0.1'].includes(window.location.hostname)
+
+    // Task name for the report
+    const name = 'Frontend-HttpsCheck'
+
+    // Check result
+    if (isSecure) {
+      return {
+        name,
+        status: 'success',
+        type: 'frontend',
+        message: 'HTTPS protocol is enabled.',
+      }
+    }
+
+    if (isLocalhost) {
+      return {
+        name,
+        status: 'success',
+        type: 'frontend',
+        message: 'HTTP is acceptable for localhost.',
+      }
+    }
+
+    // Return warning for non-localhost HTTP
+    return {
+      name,
+      status: 'warning',
+      type: 'frontend',
+      message: 'HTTP protocol detected. Consider enabling HTTPS for security features.',
+      err: new Error('HTTP protocol detected. Consider enabling HTTPS for security features.'),
+    }
+  },
+}
+
+export default HttpsCheckTask

+ 12 - 0
app/src/views/system/SelfCheck/tasks/frontend/index.ts

@@ -0,0 +1,12 @@
+import type { FrontendTask } from '../types'
+import HttpsCheckTask from './https-check'
+import WebsocketTask from './websocket'
+
+// Collection of all frontend tasks
+const frontendTasks: Record<string, FrontendTask> = {
+  'Frontend-Websocket': WebsocketTask,
+  'Frontend-HttpsCheck': HttpsCheckTask,
+  // Add more frontend tasks here
+}
+
+export default frontendTasks

+ 60 - 0
app/src/views/system/SelfCheck/tasks/frontend/websocket.ts

@@ -0,0 +1,60 @@
+import type { FrontendTask, TaskReport } from '../types'
+import selfCheck from '@/api/self_check'
+
+const WebsocketTask: FrontendTask = {
+  name: () => 'WebSocket',
+  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'),
+  type: 'frontend',
+  check: async (): Promise<TaskReport> => {
+    // Task name for the report
+    const name = 'Frontend-Websocket'
+
+    try {
+      const connected = await new Promise<boolean>(resolve => {
+        const ws = selfCheck.websocket()
+        ws.onopen = () => {
+          resolve(true)
+        }
+        ws.onerror = () => {
+          resolve(false)
+        }
+        // Set a timeout for the connection attempt
+        setTimeout(() => {
+          resolve(false)
+        }, 5000)
+      })
+
+      if (connected) {
+        return {
+          name,
+          status: 'success',
+          type: 'frontend',
+          message: 'WebSocket connection successful.',
+        }
+      }
+      else {
+        return {
+          name,
+          status: 'error',
+          type: 'frontend',
+          message: 'WebSocket connection failed.',
+          err: new Error('WebSocket connection failed.'),
+        }
+      }
+    }
+    catch (error) {
+      return {
+        name,
+        status: 'error',
+        type: 'frontend',
+        message: 'WebSocket connection error.',
+        err: error instanceof Error ? error : new Error(String(error)),
+      }
+    }
+  },
+}
+
+export default WebsocketTask

+ 88 - 0
app/src/views/system/SelfCheck/tasks/index.ts

@@ -0,0 +1,88 @@
+import type { TaskDefinition, TaskReport, TaskStatus } from './types'
+import selfCheck from '@/api/self_check'
+import backendTasks from './backend'
+import frontendTasks from './frontend'
+
+// Combine all tasks
+const allTasks: Record<string, TaskDefinition> = {
+  ...backendTasks,
+  ...frontendTasks,
+}
+
+// Task manager
+export const taskManager = {
+  // Get all task definitions
+  getAllTasks() {
+    return allTasks
+  },
+
+  // Execute all self-checks
+  async runAllChecks(): Promise<TaskReport[]> {
+    // Execute backend checks
+    const backendReports = await selfCheck.run()
+
+    // Convert backend reports to include status field
+    const convertedBackendReports = backendReports.map(report => {
+      const status: TaskStatus = report.err ? 'error' : 'success'
+      return {
+        ...report,
+        type: 'backend' as const,
+        status,
+      }
+    })
+
+    // Execute frontend checks - they now directly return TaskReport objects
+    const frontendReports = await Promise.all(
+      Object.entries(frontendTasks).map(async ([key, task]) => {
+        try {
+          return await task.check()
+        }
+        catch (err) {
+          // Fallback error handling in case a task throws instead of returning a report
+          return {
+            name: key,
+            type: 'frontend' as const,
+            status: 'error' as const,
+            message: 'Task execution failed',
+            err: err instanceof Error ? err : new Error(String(err)),
+          }
+        }
+      }),
+    )
+
+    // Merge results
+    return [
+      ...convertedBackendReports,
+      ...frontendReports,
+    ]
+  },
+
+  // Fix task
+  async fixTask(taskName: string): Promise<boolean> {
+    // Backend task
+    if (taskName in backendTasks) {
+      await selfCheck.fix(taskName)
+      return true
+    }
+
+    // Frontend task
+    if (taskName in frontendTasks) {
+      const task = frontendTasks[taskName]
+      if (task.fix) {
+        return await task.fix()
+      }
+      return false
+    }
+
+    return false
+  },
+
+  // Get task definition
+  getTask(taskName: string) {
+    return allTasks[taskName]
+  },
+}
+
+export default allTasks
+
+export * from './types'

+ 27 - 0
app/src/views/system/SelfCheck/tasks/types.ts

@@ -0,0 +1,27 @@
+import type { CosyError } from '@/lib/http'
+
+export type TaskStatus = 'success' | 'warning' | 'error'
+
+export interface TaskDefinition {
+  name: () => string
+  description: () => string
+  type: 'backend' | 'frontend'
+}
+
+export interface BackendTask extends TaskDefinition {
+  type: 'backend'
+}
+
+export interface FrontendTask extends TaskDefinition {
+  type: 'frontend'
+  check: () => Promise<TaskReport>
+  fix?: () => Promise<boolean>
+}
+
+export interface TaskReport {
+  name: string
+  status: TaskStatus
+  message?: string
+  err?: CosyError | Error
+  type: 'backend' | 'frontend'
+}