Bläddra i källkod

enhance: core upgrader

0xJacky 2 år sedan
förälder
incheckning
9ac5708eca

+ 1 - 1
frontend/package.json

@@ -1,7 +1,7 @@
 {
     "name": "nginx-ui-frontend-next",
     "private": true,
-    "version": "1.8.4",
+    "version": "1.9.9",
     "type": "commonjs",
     "scripts": {
         "dev": "vite",

+ 6 - 2
frontend/src/api/upgrade.ts

@@ -1,8 +1,12 @@
 import http from '@/lib/http'
 
 const upgrade = {
-    get_latest_release() {
-        return http.get('/upgrade/release')
+    get_latest_release(channel: string) {
+        return http.get('/upgrade/release', {
+            params: {
+                channel
+            }
+        })
     },
     current_version() {
         return http.get('/upgrade/current')

+ 95 - 69
frontend/src/language/en/app.po

@@ -17,7 +17,7 @@ msgstr "About"
 msgid "Access Logs"
 msgstr ""
 
-#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:32
+#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
 #: src/views/user/User.vue:43
 msgid "Action"
@@ -114,7 +114,7 @@ msgstr ""
 msgid "Auto"
 msgstr ""
 
-#: src/views/cert/Cert.vue:37 src/views/domain/cert/ChangeCert.vue:35
+#: src/views/cert/Cert.vue:37 src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr ""
 
@@ -130,18 +130,18 @@ msgstr ""
 msgid "Auto-Cert Log"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:56
+#: src/views/domain/cert/components/ObtainCert.vue:59
 msgid "Auto-renewal disabled for %{name}"
 msgstr "Auto-renewal disabled for %{name}"
 
-#: src/views/domain/cert/components/ObtainCert.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:53
 msgid "Auto-renewal enabled for %{name}"
 msgstr "Auto-renewal enabled for %{name}"
 
 #: src/views/config/Config.vue:17 src/views/config/Config.vue:18
 #: src/views/config/Config.vue:28 src/views/config/Config.vue:6
-#: src/views/config/ConfigEdit.vue:83 src/views/domain/DomainEdit.vue:257
-#: src/views/nginx_log/NginxLog.vue:172
+#: src/views/config/ConfigEdit.vue:83 src/views/domain/DomainEdit.vue:263
+#: src/views/nginx_log/NginxLog.vue:161
 msgid "Back"
 msgstr "Back"
 
@@ -172,15 +172,23 @@ msgstr "Basic Mode"
 msgid "Batch Modify"
 msgstr "Modify Config"
 
-#: src/views/system/About.vue:21
+#: src/views/system/About.vue:28
 msgid "Build with"
 msgstr "Build with"
 
+#: src/views/preference/BasicSettings.vue:35
+msgid "CADir"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:17 src/components/ChatGPT/ChatGPT.vue:18
 #: src/components/ChatGPT/ChatGPT.vue:22 src/components/ChatGPT/ChatGPT.vue:24
 #: src/components/StdDataDisplay/StdBatchEdit.vue:7
 #: src/components/StdDataDisplay/StdCurd.vue:27
 #: src/components/StdDataEntry/components/StdSelector.vue:11
+#: src/views/domain/cert/components/ObtainCert.vue:188
+#: src/views/domain/DomainEdit.vue:176
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:208
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:37
 msgid "Cancel"
 msgstr "Cancel"
 
@@ -217,6 +225,10 @@ msgstr ""
 msgid "Change Certificate"
 msgstr "Certificate is valid"
 
+#: src/views/system/Upgrade.vue:35
+msgid "Channel"
+msgstr ""
+
 #: src/views/preference/OpenAISettings.vue:3
 msgid "ChatGPT Model"
 msgstr ""
@@ -243,7 +255,7 @@ msgstr ""
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:33
 #: src/views/domain/ngx_conf/LocationEditor.vue:35
 #: src/views/domain/ngx_conf/LocationEditor.vue:52
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:250
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:260
 msgid "Comments"
 msgstr "Comments"
 
@@ -291,7 +303,7 @@ msgstr "CPU Status"
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/views/domain/DomainAdd.vue:148
+#: src/views/domain/DomainAdd.vue:154
 msgid "Create Another"
 msgstr "Create Another"
 
@@ -389,11 +401,11 @@ msgstr "Directive"
 msgid "Directives"
 msgstr "Directives"
 
-#: src/views/domain/cert/components/ObtainCert.vue:58
+#: src/views/domain/cert/components/ObtainCert.vue:61
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Disable auto-renewal failed for %{name}"
 
-#: src/views/cert/Cert.vue:47 src/views/domain/cert/ChangeCert.vue:45
+#: src/views/cert/Cert.vue:47 src/views/domain/cert/ChangeCert.vue:47
 #: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainEdit.vue:11
 #: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:34
 #: src/views/domain/DomainList.vue:7 src/views/domain/DomainList.vue:8
@@ -401,7 +413,7 @@ msgstr "Disable auto-renewal failed for %{name}"
 msgid "Disabled"
 msgstr "Disabled"
 
-#: src/views/domain/DomainEdit.vue:159 src/views/domain/DomainList.vue:69
+#: src/views/domain/DomainEdit.vue:163 src/views/domain/DomainList.vue:69
 msgid "Disabled successfully"
 msgstr "Disabled successfully"
 
@@ -424,16 +436,16 @@ msgstr ""
 msgid "DNS01"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:178
+#: src/views/domain/cert/components/ObtainCert.vue:184
 msgid "Do you want to disable auto-cert renewal?"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:168
+#: src/views/domain/DomainEdit.vue:172
 #, fuzzy
 msgid "Do you want to disable this site?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/domain/DomainEdit.vue:168
+#: src/views/domain/DomainEdit.vue:172
 #, fuzzy
 msgid "Do you want to enable this site?"
 msgstr "Are you sure you want to remove this directive?"
@@ -443,7 +455,7 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Do you want to enable TLS?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:196
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:204
 #, fuzzy
 msgid "Do you want to remove this server?"
 msgstr "Are you sure you want to remove this directive?"
@@ -464,6 +476,10 @@ msgstr ""
 msgid "Downloading latest release"
 msgstr ""
 
+#: src/views/system/Upgrade.vue:53
+msgid "Dry run mode enabled"
+msgstr ""
+
 #: src/views/domain/DomainList.vue:14 src/views/domain/DomainList.vue:15
 #: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:23
 #: src/views/domain/SiteDuplicate.vue:2
@@ -491,11 +507,11 @@ msgstr "Edit Site"
 msgid "Email (*)"
 msgstr "Email (*)"
 
-#: src/views/domain/cert/components/ObtainCert.vue:52
+#: src/views/domain/cert/components/ObtainCert.vue:55
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "Enable auto-renewal failed for %{name}"
 
-#: src/views/domain/DomainAdd.vue:50
+#: src/views/domain/DomainAdd.vue:49
 msgid "Enable failed"
 msgstr "Enable failed"
 
@@ -503,7 +519,7 @@ msgstr "Enable failed"
 msgid "Enable TLS"
 msgstr "Enable TLS"
 
-#: src/views/cert/Cert.vue:44 src/views/domain/cert/ChangeCert.vue:42
+#: src/views/cert/Cert.vue:44 src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/DomainEdit.vue:29 src/views/domain/DomainEdit.vue:7
 #: src/views/domain/DomainEdit.vue:8 src/views/domain/DomainList.vue:10
 #: src/views/domain/DomainList.vue:11 src/views/domain/DomainList.vue:12
@@ -511,7 +527,7 @@ msgstr "Enable TLS"
 msgid "Enabled"
 msgstr "Enabled"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:150
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:154
 #: src/views/domain/DomainList.vue:59
 msgid "Enabled successfully"
 msgstr "Enabled successfully"
@@ -545,11 +561,11 @@ msgstr "Expiration Date: %{date}"
 msgid "Export"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:162 src/views/domain/DomainList.vue:73
+#: src/views/domain/DomainEdit.vue:166 src/views/domain/DomainList.vue:73
 msgid "Failed to disable %{msg}"
 msgstr "Failed to disable %{msg}"
 
-#: src/views/domain/DomainEdit.vue:153 src/views/domain/DomainList.vue:63
+#: src/views/domain/DomainEdit.vue:157 src/views/domain/DomainList.vue:63
 msgid "Failed to enable %{msg}"
 msgstr "Failed to enable %{msg}"
 
@@ -557,7 +573,7 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to get certificate information"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:128
+#: src/views/domain/DomainEdit.vue:132
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 
@@ -608,14 +624,10 @@ msgstr ""
 msgid "Get release information error"
 msgstr "Base information"
 
-#: src/views/domain/cert/components/ObtainCert.vue:134
+#: src/views/domain/cert/components/ObtainCert.vue:140
 msgid "Getting the certificate, please wait..."
 msgstr "Getting the certificate, please wait..."
 
-#: src/views/preference/Preference.vue:14
-msgid "Git"
-msgstr ""
-
 #: src/views/preference/BasicSettings.vue:31
 msgid "Github Proxy"
 msgstr ""
@@ -769,7 +781,7 @@ msgstr "Memory and Storage"
 msgid "Modify"
 msgstr "Modify Config"
 
-#: src/views/domain/DomainAdd.vue:145
+#: src/views/domain/DomainAdd.vue:151
 msgid "Modify Config"
 msgstr "Modify Config"
 
@@ -779,8 +791,8 @@ msgstr "Modify Config"
 msgid "Multi-line Directive"
 msgstr "Single Directive"
 
-#: src/views/cert/Cert.vue:16 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:8 src/views/domain/cert/ChangeCert.vue:19
+#: src/views/cert/Cert.vue:16 src/views/cert/DNSCredential.vue:12
+#: src/views/config/config.ts:8 src/views/domain/cert/ChangeCert.vue:21
 #: src/views/domain/DomainEdit.vue:32 src/views/domain/DomainList.vue:15
 #: src/views/domain/SiteDuplicate.vue:5
 msgid "Name"
@@ -802,14 +814,14 @@ msgstr "Network Total Receive"
 msgid "Network Total Send"
 msgstr "Network Total Send"
 
-#: src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:47
 msgid "New version released"
 msgstr ""
 
 #: src/views/domain/cert/components/ObtainCert.vue:12
 #: src/views/domain/cert/components/ObtainCert.vue:13
 #: src/views/domain/cert/components/ObtainCert.vue:21
-#: src/views/domain/DomainAdd.vue:135
+#: src/views/domain/DomainAdd.vue:141
 msgid "Next"
 msgstr "Next"
 
@@ -882,7 +894,10 @@ msgstr ""
 #: src/components/StdDataDisplay/StdCurd.vue:28
 #: src/components/StdDataDisplay/StdTable.vue:54
 #: src/components/StdDataEntry/components/StdSelector.vue:12
-#: src/views/domain/DomainList.vue:28
+#: src/views/domain/cert/components/ObtainCert.vue:187
+#: src/views/domain/DomainEdit.vue:175 src/views/domain/DomainList.vue:28
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:207
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:36
 msgid "OK"
 msgstr ""
 
@@ -926,7 +941,7 @@ msgstr ""
 msgid "Performing core upgrade"
 msgstr ""
 
-#: src/views/cert/DNSCredential.vue:44
+#: src/views/cert/DNSCredential.vue:43
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
 "provider. We will add one or more TXT records to the DNS records of your "
@@ -959,6 +974,14 @@ msgstr "Please input your password!"
 msgid "Please input your username!"
 msgstr "Please input your username!"
 
+#: src/views/system/Upgrade.vue:25 src/views/system/Upgrade.vue:26
+#: src/views/system/Upgrade.vue:30 src/views/system/Upgrade.vue:34
+#: src/views/system/Upgrade.vue:38 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:49 src/views/system/Upgrade.vue:53
+#: src/views/system/Upgrade.vue:57 src/views/system/Upgrade.vue:72
+msgid "Pre-release"
+msgstr ""
+
 #: src/routes/index.ts:140 src/views/preference/Preference.vue:2
 msgid "Preference"
 msgstr ""
@@ -976,15 +999,15 @@ msgstr ""
 msgid "Prohibit deleting the default user"
 msgstr ""
 
-#: src/views/system/About.vue:19
+#: src/views/system/About.vue:26
 msgid "Project Team"
 msgstr "Project Team"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/cert/DNSCredential.vue:20
 msgid "Provider"
 msgstr ""
 
-#: src/views/dashboard/DashBoard.vue:109
+#: src/views/dashboard/DashBoard.vue:109 src/views/dashboard/DashBoard.vue:23
 msgid "Reads"
 msgstr "Reads"
 
@@ -1001,17 +1024,17 @@ msgstr ""
 msgid "Registering user"
 msgstr ""
 
-#: src/views/system/Upgrade.vue:26 src/views/system/Upgrade.vue:27
-#: src/views/system/Upgrade.vue:31 src/views/system/Upgrade.vue:35
-#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:42
-#: src/views/system/Upgrade.vue:45
+#: src/views/system/Upgrade.vue:37 src/views/system/Upgrade.vue:38
+#: src/views/system/Upgrade.vue:42 src/views/system/Upgrade.vue:46
+#: src/views/system/Upgrade.vue:50 src/views/system/Upgrade.vue:53
+#: src/views/system/Upgrade.vue:59
 #, fuzzy
 msgid "Reinstall"
 msgstr "Install"
 
-#: src/views/system/Upgrade.vue:34 src/views/system/Upgrade.vue:35
-#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:43
-#: src/views/system/Upgrade.vue:55
+#: src/views/system/Upgrade.vue:51 src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:56 src/views/system/Upgrade.vue:60
+#: src/views/system/Upgrade.vue:75
 msgid "Release Note"
 msgstr ""
 
@@ -1031,10 +1054,6 @@ msgstr ""
 msgid "Reloading nginx"
 msgstr ""
 
-#: src/views/preference/GitSettings.vue:3
-msgid "Repo url"
-msgstr ""
-
 #: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
 #: src/components/StdDataDisplay/StdTable.vue:9
@@ -1062,13 +1081,13 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatGPT.vue:16 src/components/ChatGPT/ChatGPT.vue:17
 #: src/components/ChatGPT/ChatGPT.vue:21 src/components/ChatGPT/ChatGPT.vue:23
-#: src/views/config/ConfigEdit.vue:89 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:89 src/views/domain/DomainEdit.vue:266
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:32
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:33
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:40
-#: src/views/preference/Preference.vue:20
-#: src/views/preference/Preference.vue:21
+#: src/views/preference/Preference.vue:17
+#: src/views/preference/Preference.vue:18
 msgid "Save"
 msgstr "Save"
 
@@ -1078,7 +1097,7 @@ msgstr "Save"
 msgid "Save Directive"
 msgstr "Save Directive"
 
-#: src/views/config/ConfigEdit.vue:53 src/views/domain/DomainAdd.vue:54
+#: src/views/config/ConfigEdit.vue:53 src/views/domain/DomainAdd.vue:53
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:36
 msgid "Save error %{msg}"
 msgstr "Save error %{msg}"
@@ -1095,7 +1114,7 @@ msgid "Save Successfully"
 msgstr "Saved successfully"
 
 #: src/views/config/ConfigEdit.vue:51 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:142
+#: src/views/domain/DomainEdit.vue:146
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:34
 msgid "Saved successfully"
 msgstr "Saved successfully"
@@ -1116,7 +1135,7 @@ msgstr "Send"
 #: src/components/StdDataDisplay/StdTable.vue:463
 #: src/views/config/ConfigEdit.vue:37 src/views/domain/DomainList.vue:83
 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
-#: src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:54
 msgid "Server error"
 msgstr "Server error"
 
@@ -1124,14 +1143,14 @@ msgstr "Server error"
 msgid "Server Info"
 msgstr "Server Info"
 
-#: src/views/domain/cert/components/ObtainCert.vue:91
+#: src/views/domain/cert/components/ObtainCert.vue:97
 msgid "server_name not found in directives"
 msgstr "server_name not found in directives"
 
 #: src/views/domain/cert/components/AutoCertStepOne.vue:10
 #: src/views/domain/cert/components/AutoCertStepOne.vue:5
 #: src/views/domain/cert/components/AutoCertStepOne.vue:6
-#: src/views/domain/DomainAdd.vue:110
+#: src/views/domain/DomainAdd.vue:116
 msgid "server_name parameter is required"
 msgstr "server_name parameter is required"
 
@@ -1173,6 +1192,15 @@ msgstr "Certificate Status"
 msgid "SSL Certification Key Content"
 msgstr "Certificate Status"
 
+#: src/views/system/Upgrade.vue:24 src/views/system/Upgrade.vue:25
+#: src/views/system/Upgrade.vue:29 src/views/system/Upgrade.vue:33
+#: src/views/system/Upgrade.vue:37 src/views/system/Upgrade.vue:47
+#: src/views/system/Upgrade.vue:48 src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:56 src/views/system/Upgrade.vue:71
+#, fuzzy
+msgid "Stable"
+msgstr "Enabled"
+
 #: src/views/domain/DomainList.vue:24
 msgid "Status"
 msgstr "Status"
@@ -1256,7 +1284,7 @@ msgstr ""
 msgid "Type"
 msgstr ""
 
-#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:26
+#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
 #: src/views/config/config.ts:28 src/views/domain/DomainList.vue:41
 #: src/views/user/User.vue:37
 msgid "Updated at"
@@ -1268,10 +1296,10 @@ msgid "Updated successfully"
 msgstr "Saved successfully"
 
 #: src/routes/index.ts:159 src/views/system/Upgrade.vue:2
-#: src/views/system/Upgrade.vue:28 src/views/system/Upgrade.vue:29
-#: src/views/system/Upgrade.vue:33 src/views/system/Upgrade.vue:37
-#: src/views/system/Upgrade.vue:41 src/views/system/Upgrade.vue:44
-#: src/views/system/Upgrade.vue:47 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:44 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:52 src/views/system/Upgrade.vue:55
+#: src/views/system/Upgrade.vue:61 src/views/system/Upgrade.vue:62
 msgid "Upgrade"
 msgstr ""
 
@@ -1280,7 +1308,7 @@ msgstr ""
 msgid "Upgraded successfully"
 msgstr "Saved successfully"
 
-#: src/views/system/Upgrade.vue:72
+#: src/views/system/Upgrade.vue:90
 msgid "Upgrading Nginx UI, please wait..."
 msgstr ""
 
@@ -1288,8 +1316,7 @@ msgstr ""
 msgid "Uptime:"
 msgstr "Uptime:"
 
-#: src/views/other/Login.vue:11 src/views/preference/GitSettings.vue:6
-#: src/views/user/User.vue:11
+#: src/views/other/Login.vue:11 src/views/user/User.vue:11
 msgid "Username"
 msgstr "Username"
 
@@ -1317,14 +1344,13 @@ msgstr ""
 msgid "Warning"
 msgstr "Warning"
 
-#: src/views/domain/cert/components/ObtainCert.vue:179
+#: src/views/domain/cert/components/ObtainCert.vue:185
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
 msgstr ""
 
 #: src/views/dashboard/DashBoard.vue:102 src/views/dashboard/DashBoard.vue:22
-#: src/views/dashboard/DashBoard.vue:23
 msgid "Writes"
 msgstr "Writes"
 
@@ -1341,7 +1367,7 @@ msgstr ""
 msgid "Yes"
 msgstr "Yes"
 
-#: src/views/system/Upgrade.vue:36
+#: src/views/system/Upgrade.vue:43
 msgid "You are using the latest version"
 msgstr ""
 
@@ -1350,7 +1376,7 @@ msgstr ""
 msgid "You can check Nginx UI upgrade at this page."
 msgstr ""
 
-#: src/views/system/About.vue:27
+#: src/views/system/About.vue:34
 msgctxt "Project"
 msgid "License"
 msgstr "License"

+ 109 - 72
frontend/src/language/messages.pot

@@ -12,7 +12,7 @@ msgid "Access Logs"
 msgstr ""
 
 #: src/views/cert/Cert.vue:74
-#: src/views/cert/DNSCredential.vue:32
+#: src/views/cert/DNSCredential.vue:31
 #: src/views/config/config.ts:35
 #: src/views/domain/DomainList.vue:47
 #: src/views/user/User.vue:43
@@ -112,7 +112,7 @@ msgid "Auto"
 msgstr ""
 
 #: src/views/cert/Cert.vue:37
-#: src/views/domain/cert/ChangeCert.vue:35
+#: src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr ""
 
@@ -128,11 +128,11 @@ msgstr ""
 msgid "Auto-Cert Log"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:56
+#: src/views/domain/cert/components/ObtainCert.vue:59
 msgid "Auto-renewal disabled for %{name}"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:53
 msgid "Auto-renewal enabled for %{name}"
 msgstr ""
 
@@ -141,8 +141,8 @@ msgstr ""
 #: src/views/config/Config.vue:28
 #: src/views/config/Config.vue:6
 #: src/views/config/ConfigEdit.vue:83
-#: src/views/domain/DomainEdit.vue:257
-#: src/views/nginx_log/NginxLog.vue:172
+#: src/views/domain/DomainEdit.vue:263
+#: src/views/nginx_log/NginxLog.vue:161
 msgid "Back"
 msgstr ""
 
@@ -171,10 +171,14 @@ msgstr ""
 msgid "Batch Modify"
 msgstr ""
 
-#: src/views/system/About.vue:21
+#: src/views/system/About.vue:28
 msgid "Build with"
 msgstr ""
 
+#: src/views/preference/BasicSettings.vue:35
+msgid "CADir"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:17
 #: src/components/ChatGPT/ChatGPT.vue:18
 #: src/components/ChatGPT/ChatGPT.vue:22
@@ -182,6 +186,10 @@ msgstr ""
 #: src/components/StdDataDisplay/StdBatchEdit.vue:7
 #: src/components/StdDataDisplay/StdCurd.vue:27
 #: src/components/StdDataEntry/components/StdSelector.vue:11
+#: src/views/domain/cert/components/ObtainCert.vue:188
+#: src/views/domain/DomainEdit.vue:176
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:208
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:37
 msgid "Cancel"
 msgstr ""
 
@@ -217,6 +225,10 @@ msgstr ""
 msgid "Change Certificate"
 msgstr ""
 
+#: src/views/system/Upgrade.vue:35
+msgid "Channel"
+msgstr ""
+
 #: src/views/preference/OpenAISettings.vue:3
 msgid "ChatGPT Model"
 msgstr ""
@@ -247,7 +259,7 @@ msgstr ""
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:33
 #: src/views/domain/ngx_conf/LocationEditor.vue:35
 #: src/views/domain/ngx_conf/LocationEditor.vue:52
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:250
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:260
 msgid "Comments"
 msgstr ""
 
@@ -294,7 +306,7 @@ msgstr ""
 msgid "CPU:"
 msgstr ""
 
-#: src/views/domain/DomainAdd.vue:148
+#: src/views/domain/DomainAdd.vue:154
 msgid "Create Another"
 msgstr ""
 
@@ -398,12 +410,12 @@ msgstr ""
 msgid "Directives"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:58
+#: src/views/domain/cert/components/ObtainCert.vue:61
 msgid "Disable auto-renewal failed for %{name}"
 msgstr ""
 
 #: src/views/cert/Cert.vue:47
-#: src/views/domain/cert/ChangeCert.vue:45
+#: src/views/domain/cert/ChangeCert.vue:47
 #: src/views/domain/DomainEdit.vue:10
 #: src/views/domain/DomainEdit.vue:11
 #: src/views/domain/DomainList.vue:16
@@ -414,7 +426,7 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:159
+#: src/views/domain/DomainEdit.vue:163
 #: src/views/domain/DomainList.vue:69
 msgid "Disabled successfully"
 msgstr ""
@@ -439,15 +451,15 @@ msgstr ""
 msgid "DNS01"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:178
+#: src/views/domain/cert/components/ObtainCert.vue:184
 msgid "Do you want to disable auto-cert renewal?"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:168
+#: src/views/domain/DomainEdit.vue:172
 msgid "Do you want to disable this site?"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:168
+#: src/views/domain/DomainEdit.vue:172
 msgid "Do you want to enable this site?"
 msgstr ""
 
@@ -455,7 +467,7 @@ msgstr ""
 msgid "Do you want to enable TLS?"
 msgstr ""
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:196
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:204
 msgid "Do you want to remove this server?"
 msgstr ""
 
@@ -475,6 +487,10 @@ msgstr ""
 msgid "Downloading latest release"
 msgstr ""
 
+#: src/views/system/Upgrade.vue:53
+msgid "Dry run mode enabled"
+msgstr ""
+
 #: src/views/domain/DomainList.vue:14
 #: src/views/domain/DomainList.vue:15
 #: src/views/domain/DomainList.vue:16
@@ -505,11 +521,11 @@ msgstr ""
 msgid "Email (*)"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:52
+#: src/views/domain/cert/components/ObtainCert.vue:55
 msgid "Enable auto-renewal failed for %{name}"
 msgstr ""
 
-#: src/views/domain/DomainAdd.vue:50
+#: src/views/domain/DomainAdd.vue:49
 msgid "Enable failed"
 msgstr ""
 
@@ -518,7 +534,7 @@ msgid "Enable TLS"
 msgstr ""
 
 #: src/views/cert/Cert.vue:44
-#: src/views/domain/cert/ChangeCert.vue:42
+#: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/DomainEdit.vue:29
 #: src/views/domain/DomainEdit.vue:7
 #: src/views/domain/DomainEdit.vue:8
@@ -531,7 +547,7 @@ msgid "Enabled"
 msgstr ""
 
 #: src/views/domain/DomainAdd.vue:46
-#: src/views/domain/DomainEdit.vue:150
+#: src/views/domain/DomainEdit.vue:154
 #: src/views/domain/DomainList.vue:59
 msgid "Enabled successfully"
 msgstr ""
@@ -568,12 +584,12 @@ msgstr ""
 msgid "Export"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:162
+#: src/views/domain/DomainEdit.vue:166
 #: src/views/domain/DomainList.vue:73
 msgid "Failed to disable %{msg}"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:153
+#: src/views/domain/DomainEdit.vue:157
 #: src/views/domain/DomainList.vue:63
 msgid "Failed to enable %{msg}"
 msgstr ""
@@ -582,7 +598,7 @@ msgstr ""
 msgid "Failed to get certificate information"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:128
+#: src/views/domain/DomainEdit.vue:132
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 
@@ -632,14 +648,10 @@ msgstr ""
 msgid "Get release information error"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:134
+#: src/views/domain/cert/components/ObtainCert.vue:140
 msgid "Getting the certificate, please wait..."
 msgstr ""
 
-#: src/views/preference/Preference.vue:14
-msgid "Git"
-msgstr ""
-
 #: src/views/preference/BasicSettings.vue:31
 msgid "Github Proxy"
 msgstr ""
@@ -793,7 +805,7 @@ msgstr ""
 msgid "Modify"
 msgstr ""
 
-#: src/views/domain/DomainAdd.vue:145
+#: src/views/domain/DomainAdd.vue:151
 msgid "Modify Config"
 msgstr ""
 
@@ -803,9 +815,9 @@ msgid "Multi-line Directive"
 msgstr ""
 
 #: src/views/cert/Cert.vue:16
-#: src/views/cert/DNSCredential.vue:13
+#: src/views/cert/DNSCredential.vue:12
 #: src/views/config/config.ts:8
-#: src/views/domain/cert/ChangeCert.vue:19
+#: src/views/domain/cert/ChangeCert.vue:21
 #: src/views/domain/DomainEdit.vue:32
 #: src/views/domain/DomainList.vue:15
 #: src/views/domain/SiteDuplicate.vue:5
@@ -828,14 +840,14 @@ msgstr ""
 msgid "Network Total Send"
 msgstr ""
 
-#: src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:47
 msgid "New version released"
 msgstr ""
 
 #: src/views/domain/cert/components/ObtainCert.vue:12
 #: src/views/domain/cert/components/ObtainCert.vue:13
 #: src/views/domain/cert/components/ObtainCert.vue:21
-#: src/views/domain/DomainAdd.vue:135
+#: src/views/domain/DomainAdd.vue:141
 msgid "Next"
 msgstr ""
 
@@ -906,7 +918,11 @@ msgstr ""
 #: src/components/StdDataDisplay/StdCurd.vue:28
 #: src/components/StdDataDisplay/StdTable.vue:54
 #: src/components/StdDataEntry/components/StdSelector.vue:12
+#: src/views/domain/cert/components/ObtainCert.vue:187
+#: src/views/domain/DomainEdit.vue:175
 #: src/views/domain/DomainList.vue:28
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:207
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:36
 msgid "OK"
 msgstr ""
 
@@ -952,7 +968,7 @@ msgstr ""
 msgid "Performing core upgrade"
 msgstr ""
 
-#: src/views/cert/DNSCredential.vue:44
+#: src/views/cert/DNSCredential.vue:43
 msgid "Please fill in the API authentication credentials provided by your DNS provider. We will add one or more TXT records to the DNS records of your domain for ownership verification. Once the verification is complete, the records will be removed. Please note that the time configurations below are all in seconds."
 msgstr ""
 
@@ -978,6 +994,19 @@ msgstr ""
 msgid "Please input your username!"
 msgstr ""
 
+#: src/views/system/Upgrade.vue:25
+#: src/views/system/Upgrade.vue:26
+#: src/views/system/Upgrade.vue:30
+#: src/views/system/Upgrade.vue:34
+#: src/views/system/Upgrade.vue:38
+#: src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:49
+#: src/views/system/Upgrade.vue:53
+#: src/views/system/Upgrade.vue:57
+#: src/views/system/Upgrade.vue:72
+msgid "Pre-release"
+msgstr ""
+
 #: src/routes/index.ts:140
 #: src/views/preference/Preference.vue:2
 msgid "Preference"
@@ -995,15 +1024,16 @@ msgstr ""
 msgid "Prohibit deleting the default user"
 msgstr ""
 
-#: src/views/system/About.vue:19
+#: src/views/system/About.vue:26
 msgid "Project Team"
 msgstr ""
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/cert/DNSCredential.vue:20
 msgid "Provider"
 msgstr ""
 
 #: src/views/dashboard/DashBoard.vue:109
+#: src/views/dashboard/DashBoard.vue:23
 msgid "Reads"
 msgstr ""
 
@@ -1023,21 +1053,21 @@ msgstr ""
 msgid "Registering user"
 msgstr ""
 
-#: src/views/system/Upgrade.vue:26
-#: src/views/system/Upgrade.vue:27
-#: src/views/system/Upgrade.vue:31
-#: src/views/system/Upgrade.vue:35
-#: src/views/system/Upgrade.vue:39
+#: src/views/system/Upgrade.vue:37
+#: src/views/system/Upgrade.vue:38
 #: src/views/system/Upgrade.vue:42
-#: src/views/system/Upgrade.vue:45
+#: src/views/system/Upgrade.vue:46
+#: src/views/system/Upgrade.vue:50
+#: src/views/system/Upgrade.vue:53
+#: src/views/system/Upgrade.vue:59
 msgid "Reinstall"
 msgstr ""
 
-#: src/views/system/Upgrade.vue:34
-#: src/views/system/Upgrade.vue:35
-#: src/views/system/Upgrade.vue:39
-#: src/views/system/Upgrade.vue:43
-#: src/views/system/Upgrade.vue:55
+#: src/views/system/Upgrade.vue:51
+#: src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:56
+#: src/views/system/Upgrade.vue:60
+#: src/views/system/Upgrade.vue:75
 msgid "Release Note"
 msgstr ""
 
@@ -1059,10 +1089,6 @@ msgstr ""
 msgid "Reloading nginx"
 msgstr ""
 
-#: src/views/preference/GitSettings.vue:3
-msgid "Repo url"
-msgstr ""
-
 #: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
 #: src/components/StdDataDisplay/StdTable.vue:9
@@ -1092,13 +1118,13 @@ msgstr ""
 #: src/components/ChatGPT/ChatGPT.vue:21
 #: src/components/ChatGPT/ChatGPT.vue:23
 #: src/views/config/ConfigEdit.vue:89
-#: src/views/domain/DomainEdit.vue:260
+#: src/views/domain/DomainEdit.vue:266
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:32
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:33
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:40
-#: src/views/preference/Preference.vue:20
-#: src/views/preference/Preference.vue:21
+#: src/views/preference/Preference.vue:17
+#: src/views/preference/Preference.vue:18
 msgid "Save"
 msgstr ""
 
@@ -1109,7 +1135,7 @@ msgid "Save Directive"
 msgstr ""
 
 #: src/views/config/ConfigEdit.vue:53
-#: src/views/domain/DomainAdd.vue:54
+#: src/views/domain/DomainAdd.vue:53
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:36
 msgid "Save error %{msg}"
 msgstr ""
@@ -1125,7 +1151,7 @@ msgstr ""
 
 #: src/views/config/ConfigEdit.vue:51
 #: src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:142
+#: src/views/domain/DomainEdit.vue:146
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:34
 msgid "Saved successfully"
 msgstr ""
@@ -1149,7 +1175,7 @@ msgstr ""
 #: src/views/domain/DomainList.vue:83
 #: src/views/other/Install.vue:71
 #: src/views/preference/Preference.vue:62
-#: src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:54
 msgid "Server error"
 msgstr ""
 
@@ -1157,14 +1183,14 @@ msgstr ""
 msgid "Server Info"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:91
+#: src/views/domain/cert/components/ObtainCert.vue:97
 msgid "server_name not found in directives"
 msgstr ""
 
 #: src/views/domain/cert/components/AutoCertStepOne.vue:10
 #: src/views/domain/cert/components/AutoCertStepOne.vue:5
 #: src/views/domain/cert/components/AutoCertStepOne.vue:6
-#: src/views/domain/DomainAdd.vue:110
+#: src/views/domain/DomainAdd.vue:116
 msgid "server_name parameter is required"
 msgstr ""
 
@@ -1201,6 +1227,19 @@ msgstr ""
 msgid "SSL Certification Key Content"
 msgstr ""
 
+#: src/views/system/Upgrade.vue:24
+#: src/views/system/Upgrade.vue:25
+#: src/views/system/Upgrade.vue:29
+#: src/views/system/Upgrade.vue:33
+#: src/views/system/Upgrade.vue:37
+#: src/views/system/Upgrade.vue:47
+#: src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:56
+#: src/views/system/Upgrade.vue:71
+msgid "Stable"
+msgstr ""
+
 #: src/views/domain/DomainList.vue:24
 msgid "Status"
 msgstr ""
@@ -1271,7 +1310,7 @@ msgid "Type"
 msgstr ""
 
 #: src/views/cert/Cert.vue:68
-#: src/views/cert/DNSCredential.vue:26
+#: src/views/cert/DNSCredential.vue:25
 #: src/views/config/config.ts:28
 #: src/views/domain/DomainList.vue:41
 #: src/views/user/User.vue:37
@@ -1284,14 +1323,14 @@ msgstr ""
 
 #: src/routes/index.ts:159
 #: src/views/system/Upgrade.vue:2
-#: src/views/system/Upgrade.vue:28
-#: src/views/system/Upgrade.vue:29
-#: src/views/system/Upgrade.vue:33
-#: src/views/system/Upgrade.vue:37
-#: src/views/system/Upgrade.vue:41
+#: src/views/system/Upgrade.vue:39
+#: src/views/system/Upgrade.vue:40
 #: src/views/system/Upgrade.vue:44
-#: src/views/system/Upgrade.vue:47
 #: src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:55
+#: src/views/system/Upgrade.vue:61
+#: src/views/system/Upgrade.vue:62
 msgid "Upgrade"
 msgstr ""
 
@@ -1299,7 +1338,7 @@ msgstr ""
 msgid "Upgraded successfully"
 msgstr ""
 
-#: src/views/system/Upgrade.vue:72
+#: src/views/system/Upgrade.vue:90
 msgid "Upgrading Nginx UI, please wait..."
 msgstr ""
 
@@ -1308,7 +1347,6 @@ msgid "Uptime:"
 msgstr ""
 
 #: src/views/other/Login.vue:11
-#: src/views/preference/GitSettings.vue:6
 #: src/views/user/User.vue:11
 msgid "Username"
 msgstr ""
@@ -1337,13 +1375,12 @@ msgstr ""
 msgid "Warning"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:179
+#: src/views/domain/cert/components/ObtainCert.vue:185
 msgid "We will remove the HTTPChallenge configuration from this file and reload the Nginx. Are you sure you want to continue?"
 msgstr ""
 
 #: src/views/dashboard/DashBoard.vue:102
 #: src/views/dashboard/DashBoard.vue:22
-#: src/views/dashboard/DashBoard.vue:23
 msgid "Writes"
 msgstr ""
 
@@ -1360,7 +1397,7 @@ msgstr ""
 msgid "Yes"
 msgstr ""
 
-#: src/views/system/Upgrade.vue:36
+#: src/views/system/Upgrade.vue:43
 msgid "You are using the latest version"
 msgstr ""
 
@@ -1371,7 +1408,7 @@ msgstr ""
 msgid "You can check Nginx UI upgrade at this page."
 msgstr ""
 
-#: src/views/system/About.vue:27
+#: src/views/system/About.vue:34
 msgctxt "Project"
 msgid "License"
 msgstr ""

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
frontend/src/language/translations.json


BIN
frontend/src/language/zh_CN/app.mo


+ 97 - 69
frontend/src/language/zh_CN/app.po

@@ -20,7 +20,7 @@ msgstr "关于"
 msgid "Access Logs"
 msgstr "访问日志"
 
-#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:32
+#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
 #: src/views/user/User.vue:43
 msgid "Action"
@@ -113,7 +113,7 @@ msgstr "作者"
 msgid "Auto"
 msgstr "自动"
 
-#: src/views/cert/Cert.vue:37 src/views/domain/cert/ChangeCert.vue:35
+#: src/views/cert/Cert.vue:37 src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr "自动更新"
 
@@ -129,18 +129,18 @@ msgstr "自动刷新"
 msgid "Auto-Cert Log"
 msgstr "证书自动续期日志"
 
-#: src/views/domain/cert/components/ObtainCert.vue:56
+#: src/views/domain/cert/components/ObtainCert.vue:59
 msgid "Auto-renewal disabled for %{name}"
 msgstr "成功关闭 %{name} 自动续签"
 
-#: src/views/domain/cert/components/ObtainCert.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:53
 msgid "Auto-renewal enabled for %{name}"
 msgstr "成功启用 %{name} 自动续签"
 
 #: src/views/config/Config.vue:17 src/views/config/Config.vue:18
 #: src/views/config/Config.vue:28 src/views/config/Config.vue:6
-#: src/views/config/ConfigEdit.vue:83 src/views/domain/DomainEdit.vue:257
-#: src/views/nginx_log/NginxLog.vue:172
+#: src/views/config/ConfigEdit.vue:83 src/views/domain/DomainEdit.vue:263
+#: src/views/nginx_log/NginxLog.vue:161
 msgid "Back"
 msgstr "返回"
 
@@ -168,15 +168,23 @@ msgstr "基本模式"
 msgid "Batch Modify"
 msgstr "批量修改"
 
-#: src/views/system/About.vue:21
+#: src/views/system/About.vue:28
 msgid "Build with"
 msgstr "构建基于"
 
+#: src/views/preference/BasicSettings.vue:35
+msgid "CADir"
+msgstr "CADir"
+
 #: src/components/ChatGPT/ChatGPT.vue:17 src/components/ChatGPT/ChatGPT.vue:18
 #: src/components/ChatGPT/ChatGPT.vue:22 src/components/ChatGPT/ChatGPT.vue:24
 #: src/components/StdDataDisplay/StdBatchEdit.vue:7
 #: src/components/StdDataDisplay/StdCurd.vue:27
 #: src/components/StdDataEntry/components/StdSelector.vue:11
+#: src/views/domain/cert/components/ObtainCert.vue:188
+#: src/views/domain/DomainEdit.vue:176
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:208
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:37
 msgid "Cancel"
 msgstr "取消"
 
@@ -210,6 +218,10 @@ msgstr "挑战方法"
 msgid "Change Certificate"
 msgstr "更改证书"
 
+#: src/views/system/Upgrade.vue:35
+msgid "Channel"
+msgstr "通道"
+
 #: src/views/preference/OpenAISettings.vue:3
 msgid "ChatGPT Model"
 msgstr "ChatGPT 模型"
@@ -236,7 +248,7 @@ msgstr "清空"
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:33
 #: src/views/domain/ngx_conf/LocationEditor.vue:35
 #: src/views/domain/ngx_conf/LocationEditor.vue:52
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:250
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:260
 msgid "Comments"
 msgstr "注释"
 
@@ -282,7 +294,7 @@ msgstr "CPU 状态"
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/views/domain/DomainAdd.vue:148
+#: src/views/domain/DomainAdd.vue:154
 msgid "Create Another"
 msgstr "再创建一个"
 
@@ -380,11 +392,11 @@ msgstr "指令"
 msgid "Directives"
 msgstr "指令"
 
-#: src/views/domain/cert/components/ObtainCert.vue:58
+#: src/views/domain/cert/components/ObtainCert.vue:61
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "关闭 %{name} 自动续签失败"
 
-#: src/views/cert/Cert.vue:47 src/views/domain/cert/ChangeCert.vue:45
+#: src/views/cert/Cert.vue:47 src/views/domain/cert/ChangeCert.vue:47
 #: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainEdit.vue:11
 #: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:34
 #: src/views/domain/DomainList.vue:7 src/views/domain/DomainList.vue:8
@@ -392,7 +404,7 @@ msgstr "关闭 %{name} 自动续签失败"
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/domain/DomainEdit.vue:159 src/views/domain/DomainList.vue:69
+#: src/views/domain/DomainEdit.vue:163 src/views/domain/DomainList.vue:69
 msgid "Disabled successfully"
 msgstr "禁用成功"
 
@@ -415,15 +427,15 @@ msgstr "DNS供应商"
 msgid "DNS01"
 msgstr "DNS01"
 
-#: src/views/domain/cert/components/ObtainCert.vue:178
+#: src/views/domain/cert/components/ObtainCert.vue:184
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "你想禁用自动更新证书吗?"
 
-#: src/views/domain/DomainEdit.vue:168
+#: src/views/domain/DomainEdit.vue:172
 msgid "Do you want to disable this site?"
 msgstr "你想停用这个网站吗?"
 
-#: src/views/domain/DomainEdit.vue:168
+#: src/views/domain/DomainEdit.vue:172
 msgid "Do you want to enable this site?"
 msgstr "你想启用这个网站吗?"
 
@@ -431,7 +443,7 @@ msgstr "你想启用这个网站吗?"
 msgid "Do you want to enable TLS?"
 msgstr "你想启用TLS吗?"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:196
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:204
 msgid "Do you want to remove this server?"
 msgstr "你想删除这个服务器吗?"
 
@@ -451,6 +463,10 @@ msgstr "下载最新版本错误"
 msgid "Downloading latest release"
 msgstr "下载最新版本"
 
+#: src/views/system/Upgrade.vue:53
+msgid "Dry run mode enabled"
+msgstr "试运行模式已启动"
+
 #: src/views/domain/DomainList.vue:14 src/views/domain/DomainList.vue:15
 #: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:23
 #: src/views/domain/SiteDuplicate.vue:2
@@ -477,11 +493,11 @@ msgstr "编辑站点"
 msgid "Email (*)"
 msgstr "邮箱 (*)"
 
-#: src/views/domain/cert/components/ObtainCert.vue:52
+#: src/views/domain/cert/components/ObtainCert.vue:55
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "启用 %{name} 自动续签失败"
 
-#: src/views/domain/DomainAdd.vue:50
+#: src/views/domain/DomainAdd.vue:49
 msgid "Enable failed"
 msgstr "启用失败"
 
@@ -489,7 +505,7 @@ msgstr "启用失败"
 msgid "Enable TLS"
 msgstr "启用 TLS"
 
-#: src/views/cert/Cert.vue:44 src/views/domain/cert/ChangeCert.vue:42
+#: src/views/cert/Cert.vue:44 src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/DomainEdit.vue:29 src/views/domain/DomainEdit.vue:7
 #: src/views/domain/DomainEdit.vue:8 src/views/domain/DomainList.vue:10
 #: src/views/domain/DomainList.vue:11 src/views/domain/DomainList.vue:12
@@ -497,7 +513,7 @@ msgstr "启用 TLS"
 msgid "Enabled"
 msgstr "启用"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:150
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:154
 #: src/views/domain/DomainList.vue:59
 msgid "Enabled successfully"
 msgstr "启用成功"
@@ -531,11 +547,11 @@ msgstr "过期时间: %{date}"
 msgid "Export"
 msgstr "导出"
 
-#: src/views/domain/DomainEdit.vue:162 src/views/domain/DomainList.vue:73
+#: src/views/domain/DomainEdit.vue:166 src/views/domain/DomainList.vue:73
 msgid "Failed to disable %{msg}"
 msgstr "禁用失败 %{msg}"
 
-#: src/views/domain/DomainEdit.vue:153 src/views/domain/DomainList.vue:63
+#: src/views/domain/DomainEdit.vue:157 src/views/domain/DomainList.vue:63
 msgid "Failed to enable %{msg}"
 msgstr "启用失败 %{msg}"
 
@@ -543,7 +559,7 @@ msgstr "启用失败 %{msg}"
 msgid "Failed to get certificate information"
 msgstr "获取证书信息失败"
 
-#: src/views/domain/DomainEdit.vue:128
+#: src/views/domain/DomainEdit.vue:132
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "保存失败,在配置中检测到语法错误。"
 
@@ -591,14 +607,10 @@ msgstr "正在生成私钥用于注册账户"
 msgid "Get release information error"
 msgstr "获取发布信息错误"
 
-#: src/views/domain/cert/components/ObtainCert.vue:134
+#: src/views/domain/cert/components/ObtainCert.vue:140
 msgid "Getting the certificate, please wait..."
 msgstr "正在获取证书,请稍等..."
 
-#: src/views/preference/Preference.vue:14
-msgid "Git"
-msgstr "Git"
-
 #: src/views/preference/BasicSettings.vue:31
 msgid "Github Proxy"
 msgstr "Github代理"
@@ -748,7 +760,7 @@ msgstr "内存与存储"
 msgid "Modify"
 msgstr "修改"
 
-#: src/views/domain/DomainAdd.vue:145
+#: src/views/domain/DomainAdd.vue:151
 msgid "Modify Config"
 msgstr "修改配置文件"
 
@@ -757,8 +769,8 @@ msgstr "修改配置文件"
 msgid "Multi-line Directive"
 msgstr "单行指令"
 
-#: src/views/cert/Cert.vue:16 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:8 src/views/domain/cert/ChangeCert.vue:19
+#: src/views/cert/Cert.vue:16 src/views/cert/DNSCredential.vue:12
+#: src/views/config/config.ts:8 src/views/domain/cert/ChangeCert.vue:21
 #: src/views/domain/DomainEdit.vue:32 src/views/domain/DomainList.vue:15
 #: src/views/domain/SiteDuplicate.vue:5
 msgid "Name"
@@ -780,14 +792,14 @@ msgstr "下载流量"
 msgid "Network Total Send"
 msgstr "上传流量"
 
-#: src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:47
 msgid "New version released"
 msgstr "新版本发布"
 
 #: src/views/domain/cert/components/ObtainCert.vue:12
 #: src/views/domain/cert/components/ObtainCert.vue:13
 #: src/views/domain/cert/components/ObtainCert.vue:21
-#: src/views/domain/DomainAdd.vue:135
+#: src/views/domain/DomainAdd.vue:141
 msgid "Next"
 msgstr "下一步"
 
@@ -856,7 +868,10 @@ msgstr "正在获取证书"
 #: src/components/StdDataDisplay/StdCurd.vue:28
 #: src/components/StdDataDisplay/StdTable.vue:54
 #: src/components/StdDataEntry/components/StdSelector.vue:12
-#: src/views/domain/DomainList.vue:28
+#: src/views/domain/cert/components/ObtainCert.vue:187
+#: src/views/domain/DomainEdit.vue:175 src/views/domain/DomainList.vue:28
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:207
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:36
 msgid "OK"
 msgstr "确定"
 
@@ -899,7 +914,7 @@ msgstr "执行核心升级错误"
 msgid "Performing core upgrade"
 msgstr "正在进行核心升级"
 
-#: src/views/cert/DNSCredential.vue:44
+#: src/views/cert/DNSCredential.vue:43
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
 "provider. We will add one or more TXT records to the DNS records of your "
@@ -937,6 +952,14 @@ msgstr "请输入您的密码!"
 msgid "Please input your username!"
 msgstr "请输入您的用户名!"
 
+#: src/views/system/Upgrade.vue:25 src/views/system/Upgrade.vue:26
+#: src/views/system/Upgrade.vue:30 src/views/system/Upgrade.vue:34
+#: src/views/system/Upgrade.vue:38 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:49 src/views/system/Upgrade.vue:53
+#: src/views/system/Upgrade.vue:57 src/views/system/Upgrade.vue:72
+msgid "Pre-release"
+msgstr "预发布"
+
 #: src/routes/index.ts:140 src/views/preference/Preference.vue:2
 msgid "Preference"
 msgstr "偏好设置"
@@ -953,15 +976,15 @@ msgstr "禁止在演示模式下修改 root 账户的密码"
 msgid "Prohibit deleting the default user"
 msgstr "禁止删除默认用户"
 
-#: src/views/system/About.vue:19
+#: src/views/system/About.vue:26
 msgid "Project Team"
 msgstr "项目团队"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/cert/DNSCredential.vue:20
 msgid "Provider"
 msgstr "提供商"
 
-#: src/views/dashboard/DashBoard.vue:109
+#: src/views/dashboard/DashBoard.vue:109 src/views/dashboard/DashBoard.vue:23
 msgid "Reads"
 msgstr "读"
 
@@ -978,16 +1001,16 @@ msgstr "重新生成响应"
 msgid "Registering user"
 msgstr "正在注册用户"
 
-#: src/views/system/Upgrade.vue:26 src/views/system/Upgrade.vue:27
-#: src/views/system/Upgrade.vue:31 src/views/system/Upgrade.vue:35
-#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:42
-#: src/views/system/Upgrade.vue:45
+#: src/views/system/Upgrade.vue:37 src/views/system/Upgrade.vue:38
+#: src/views/system/Upgrade.vue:42 src/views/system/Upgrade.vue:46
+#: src/views/system/Upgrade.vue:50 src/views/system/Upgrade.vue:53
+#: src/views/system/Upgrade.vue:59
 msgid "Reinstall"
 msgstr "重新安装"
 
-#: src/views/system/Upgrade.vue:34 src/views/system/Upgrade.vue:35
-#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:43
-#: src/views/system/Upgrade.vue:55
+#: src/views/system/Upgrade.vue:51 src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:56 src/views/system/Upgrade.vue:60
+#: src/views/system/Upgrade.vue:75
 msgid "Release Note"
 msgstr "发行日志"
 
@@ -1007,10 +1030,6 @@ msgstr "重载中"
 msgid "Reloading nginx"
 msgstr "正在重载 Nginx"
 
-#: src/views/preference/GitSettings.vue:3
-msgid "Repo url"
-msgstr ""
-
 #: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
 #: src/components/StdDataDisplay/StdTable.vue:9
@@ -1037,13 +1056,13 @@ msgstr "运行中"
 
 #: src/components/ChatGPT/ChatGPT.vue:16 src/components/ChatGPT/ChatGPT.vue:17
 #: src/components/ChatGPT/ChatGPT.vue:21 src/components/ChatGPT/ChatGPT.vue:23
-#: src/views/config/ConfigEdit.vue:89 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:89 src/views/domain/DomainEdit.vue:266
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:32
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:33
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:40
-#: src/views/preference/Preference.vue:20
-#: src/views/preference/Preference.vue:21
+#: src/views/preference/Preference.vue:17
+#: src/views/preference/Preference.vue:18
 msgid "Save"
 msgstr "保存"
 
@@ -1053,7 +1072,7 @@ msgstr "保存"
 msgid "Save Directive"
 msgstr "保存指令"
 
-#: src/views/config/ConfigEdit.vue:53 src/views/domain/DomainAdd.vue:54
+#: src/views/config/ConfigEdit.vue:53 src/views/domain/DomainAdd.vue:53
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:36
 msgid "Save error %{msg}"
 msgstr "保存错误 %{msg}"
@@ -1068,7 +1087,7 @@ msgid "Save Successfully"
 msgstr "保存成功"
 
 #: src/views/config/ConfigEdit.vue:51 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:142
+#: src/views/domain/DomainEdit.vue:146
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:34
 msgid "Saved successfully"
 msgstr "保存成功"
@@ -1089,7 +1108,7 @@ msgstr "上传"
 #: src/components/StdDataDisplay/StdTable.vue:463
 #: src/views/config/ConfigEdit.vue:37 src/views/domain/DomainList.vue:83
 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
-#: src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:54
 msgid "Server error"
 msgstr "服务器错误"
 
@@ -1097,14 +1116,14 @@ msgstr "服务器错误"
 msgid "Server Info"
 msgstr "服务器信息"
 
-#: src/views/domain/cert/components/ObtainCert.vue:91
+#: src/views/domain/cert/components/ObtainCert.vue:97
 msgid "server_name not found in directives"
 msgstr "未在指令集合中找到 server_name"
 
 #: src/views/domain/cert/components/AutoCertStepOne.vue:10
 #: src/views/domain/cert/components/AutoCertStepOne.vue:5
 #: src/views/domain/cert/components/AutoCertStepOne.vue:6
-#: src/views/domain/DomainAdd.vue:110
+#: src/views/domain/DomainAdd.vue:116
 msgid "server_name parameter is required"
 msgstr "必须为 server_name 指令指明参数"
 
@@ -1141,6 +1160,14 @@ msgstr "SSL证书内容"
 msgid "SSL Certification Key Content"
 msgstr "SSL证书密钥内容"
 
+#: src/views/system/Upgrade.vue:24 src/views/system/Upgrade.vue:25
+#: src/views/system/Upgrade.vue:29 src/views/system/Upgrade.vue:33
+#: src/views/system/Upgrade.vue:37 src/views/system/Upgrade.vue:47
+#: src/views/system/Upgrade.vue:48 src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:56 src/views/system/Upgrade.vue:71
+msgid "Stable"
+msgstr "稳定"
+
 #: src/views/domain/DomainList.vue:24
 msgid "Status"
 msgstr "状态"
@@ -1220,7 +1247,7 @@ msgstr ""
 msgid "Type"
 msgstr "类型"
 
-#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:26
+#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
 #: src/views/config/config.ts:28 src/views/domain/DomainList.vue:41
 #: src/views/user/User.vue:37
 msgid "Updated at"
@@ -1231,10 +1258,10 @@ msgid "Updated successfully"
 msgstr "更新成功"
 
 #: src/routes/index.ts:159 src/views/system/Upgrade.vue:2
-#: src/views/system/Upgrade.vue:28 src/views/system/Upgrade.vue:29
-#: src/views/system/Upgrade.vue:33 src/views/system/Upgrade.vue:37
-#: src/views/system/Upgrade.vue:41 src/views/system/Upgrade.vue:44
-#: src/views/system/Upgrade.vue:47 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:44 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:52 src/views/system/Upgrade.vue:55
+#: src/views/system/Upgrade.vue:61 src/views/system/Upgrade.vue:62
 msgid "Upgrade"
 msgstr "升级"
 
@@ -1242,7 +1269,7 @@ msgstr "升级"
 msgid "Upgraded successfully"
 msgstr "升级成功"
 
-#: src/views/system/Upgrade.vue:72
+#: src/views/system/Upgrade.vue:90
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "正在升级Nginx UI,请等待..."
 
@@ -1250,8 +1277,7 @@ msgstr "正在升级Nginx UI,请等待..."
 msgid "Uptime:"
 msgstr "运行时间:"
 
-#: src/views/other/Login.vue:11 src/views/preference/GitSettings.vue:6
-#: src/views/user/User.vue:11
+#: src/views/other/Login.vue:11 src/views/user/User.vue:11
 msgid "Username"
 msgstr "用户名"
 
@@ -1279,7 +1305,7 @@ msgstr "查看"
 msgid "Warning"
 msgstr "警告"
 
-#: src/views/domain/cert/components/ObtainCert.vue:179
+#: src/views/domain/cert/components/ObtainCert.vue:185
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
@@ -1287,7 +1313,6 @@ msgstr ""
 "我们将从这个文件中删除HTTPChallenge的配置,并重新加载Nginx。你确定要继续吗?"
 
 #: src/views/dashboard/DashBoard.vue:102 src/views/dashboard/DashBoard.vue:22
-#: src/views/dashboard/DashBoard.vue:23
 msgid "Writes"
 msgstr "写"
 
@@ -1304,7 +1329,7 @@ msgstr "正在将证书写入磁盘"
 msgid "Yes"
 msgstr "是的"
 
-#: src/views/system/Upgrade.vue:36
+#: src/views/system/Upgrade.vue:43
 msgid "You are using the latest version"
 msgstr "您使用的是最新版本"
 
@@ -1313,11 +1338,14 @@ msgstr "您使用的是最新版本"
 msgid "You can check Nginx UI upgrade at this page."
 msgstr "你可以在这个页面检查Nginx UI的升级。"
 
-#: src/views/system/About.vue:27
+#: src/views/system/About.vue:34
 msgctxt "Project"
 msgid "License"
 msgstr "开源许可"
 
+#~ msgid "Git"
+#~ msgstr "Git"
+
 #~ msgid "Do you want to enable auto-cert renewal?"
 #~ msgstr "你想启用自动更新证书吗?"
 

+ 98 - 69
frontend/src/language/zh_TW/app.po

@@ -21,7 +21,7 @@ msgstr "關於"
 msgid "Access Logs"
 msgstr "訪問日誌"
 
-#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:32
+#: src/views/cert/Cert.vue:74 src/views/cert/DNSCredential.vue:31
 #: src/views/config/config.ts:35 src/views/domain/DomainList.vue:47
 #: src/views/user/User.vue:43
 msgid "Action"
@@ -114,7 +114,7 @@ msgstr "作者"
 msgid "Auto"
 msgstr "自動"
 
-#: src/views/cert/Cert.vue:37 src/views/domain/cert/ChangeCert.vue:35
+#: src/views/cert/Cert.vue:37 src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr "自動更新"
 
@@ -130,18 +130,18 @@ msgstr "自動刷新"
 msgid "Auto-Cert Log"
 msgstr "自動證書日誌"
 
-#: src/views/domain/cert/components/ObtainCert.vue:56
+#: src/views/domain/cert/components/ObtainCert.vue:59
 msgid "Auto-renewal disabled for %{name}"
 msgstr "已關閉 %{name} 自動續簽"
 
-#: src/views/domain/cert/components/ObtainCert.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:53
 msgid "Auto-renewal enabled for %{name}"
 msgstr "已啟用 %{name} 自動續簽"
 
 #: src/views/config/Config.vue:17 src/views/config/Config.vue:18
 #: src/views/config/Config.vue:28 src/views/config/Config.vue:6
-#: src/views/config/ConfigEdit.vue:83 src/views/domain/DomainEdit.vue:257
-#: src/views/nginx_log/NginxLog.vue:172
+#: src/views/config/ConfigEdit.vue:83 src/views/domain/DomainEdit.vue:263
+#: src/views/nginx_log/NginxLog.vue:161
 msgid "Back"
 msgstr "返回"
 
@@ -169,15 +169,23 @@ msgstr "基本模式"
 msgid "Batch Modify"
 msgstr "批量修改"
 
-#: src/views/system/About.vue:21
+#: src/views/system/About.vue:28
 msgid "Build with"
 msgstr "構建基於"
 
+#: src/views/preference/BasicSettings.vue:35
+msgid "CADir"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:17 src/components/ChatGPT/ChatGPT.vue:18
 #: src/components/ChatGPT/ChatGPT.vue:22 src/components/ChatGPT/ChatGPT.vue:24
 #: src/components/StdDataDisplay/StdBatchEdit.vue:7
 #: src/components/StdDataDisplay/StdCurd.vue:27
 #: src/components/StdDataEntry/components/StdSelector.vue:11
+#: src/views/domain/cert/components/ObtainCert.vue:188
+#: src/views/domain/DomainEdit.vue:176
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:208
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:37
 msgid "Cancel"
 msgstr "取消"
 
@@ -211,6 +219,10 @@ msgstr "挑戰方式"
 msgid "Change Certificate"
 msgstr "更改證書"
 
+#: src/views/system/Upgrade.vue:35
+msgid "Channel"
+msgstr ""
+
 #: src/views/preference/OpenAISettings.vue:3
 msgid "ChatGPT Model"
 msgstr "ChatGPT模型"
@@ -237,7 +249,7 @@ msgstr "清除"
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:33
 #: src/views/domain/ngx_conf/LocationEditor.vue:35
 #: src/views/domain/ngx_conf/LocationEditor.vue:52
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:250
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:260
 msgid "Comments"
 msgstr "註釋"
 
@@ -283,7 +295,7 @@ msgstr "中央處理器狀態"
 msgid "CPU:"
 msgstr "中央處理器:"
 
-#: src/views/domain/DomainAdd.vue:148
+#: src/views/domain/DomainAdd.vue:154
 msgid "Create Another"
 msgstr "再創建一個"
 
@@ -381,11 +393,11 @@ msgstr "指令"
 msgid "Directives"
 msgstr "指令"
 
-#: src/views/domain/cert/components/ObtainCert.vue:58
+#: src/views/domain/cert/components/ObtainCert.vue:61
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "關閉 %{name} 自動續簽失敗"
 
-#: src/views/cert/Cert.vue:47 src/views/domain/cert/ChangeCert.vue:45
+#: src/views/cert/Cert.vue:47 src/views/domain/cert/ChangeCert.vue:47
 #: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainEdit.vue:11
 #: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:34
 #: src/views/domain/DomainList.vue:7 src/views/domain/DomainList.vue:8
@@ -393,7 +405,7 @@ msgstr "關閉 %{name} 自動續簽失敗"
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/domain/DomainEdit.vue:159 src/views/domain/DomainList.vue:69
+#: src/views/domain/DomainEdit.vue:163 src/views/domain/DomainList.vue:69
 msgid "Disabled successfully"
 msgstr "禁用成功"
 
@@ -416,15 +428,15 @@ msgstr "DNS 供應商"
 msgid "DNS01"
 msgstr "DNS01"
 
-#: src/views/domain/cert/components/ObtainCert.vue:178
+#: src/views/domain/cert/components/ObtainCert.vue:184
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "您要禁用自動證書續訂嗎?"
 
-#: src/views/domain/DomainEdit.vue:168
+#: src/views/domain/DomainEdit.vue:172
 msgid "Do you want to disable this site?"
 msgstr "你想禁用這個網站嗎?"
 
-#: src/views/domain/DomainEdit.vue:168
+#: src/views/domain/DomainEdit.vue:172
 msgid "Do you want to enable this site?"
 msgstr "您要啟用此站點嗎?"
 
@@ -432,7 +444,7 @@ msgstr "您要啟用此站點嗎?"
 msgid "Do you want to enable TLS?"
 msgstr "您想啟用 TLS 嗎?"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:196
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:204
 msgid "Do you want to remove this server?"
 msgstr "您要刪除此服務器嗎?"
 
@@ -452,6 +464,10 @@ msgstr "下載最新版本錯誤"
 msgid "Downloading latest release"
 msgstr "正在下載最新版本"
 
+#: src/views/system/Upgrade.vue:53
+msgid "Dry run mode enabled"
+msgstr ""
+
 #: src/views/domain/DomainList.vue:14 src/views/domain/DomainList.vue:15
 #: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:23
 #: src/views/domain/SiteDuplicate.vue:2
@@ -478,11 +494,11 @@ msgstr "編輯站點"
 msgid "Email (*)"
 msgstr "郵箱 (*)"
 
-#: src/views/domain/cert/components/ObtainCert.vue:52
+#: src/views/domain/cert/components/ObtainCert.vue:55
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "啟用 %{name} 自動續簽失敗"
 
-#: src/views/domain/DomainAdd.vue:50
+#: src/views/domain/DomainAdd.vue:49
 msgid "Enable failed"
 msgstr "啟用失敗"
 
@@ -490,7 +506,7 @@ msgstr "啟用失敗"
 msgid "Enable TLS"
 msgstr "啟用 TLS"
 
-#: src/views/cert/Cert.vue:44 src/views/domain/cert/ChangeCert.vue:42
+#: src/views/cert/Cert.vue:44 src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/DomainEdit.vue:29 src/views/domain/DomainEdit.vue:7
 #: src/views/domain/DomainEdit.vue:8 src/views/domain/DomainList.vue:10
 #: src/views/domain/DomainList.vue:11 src/views/domain/DomainList.vue:12
@@ -498,7 +514,7 @@ msgstr "啟用 TLS"
 msgid "Enabled"
 msgstr "啟用"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:150
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:154
 #: src/views/domain/DomainList.vue:59
 msgid "Enabled successfully"
 msgstr "啟用成功"
@@ -532,11 +548,11 @@ msgstr "過期時間: %{date}"
 msgid "Export"
 msgstr "導出"
 
-#: src/views/domain/DomainEdit.vue:162 src/views/domain/DomainList.vue:73
+#: src/views/domain/DomainEdit.vue:166 src/views/domain/DomainList.vue:73
 msgid "Failed to disable %{msg}"
 msgstr "禁用失敗 %{msg}"
 
-#: src/views/domain/DomainEdit.vue:153 src/views/domain/DomainList.vue:63
+#: src/views/domain/DomainEdit.vue:157 src/views/domain/DomainList.vue:63
 msgid "Failed to enable %{msg}"
 msgstr "啟用失敗 %{msg}"
 
@@ -544,7 +560,7 @@ msgstr "啟用失敗 %{msg}"
 msgid "Failed to get certificate information"
 msgstr "獲取證書信息失敗"
 
-#: src/views/domain/DomainEdit.vue:128
+#: src/views/domain/DomainEdit.vue:132
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "保存失敗,在配置中檢測到語法錯誤。"
 
@@ -592,14 +608,10 @@ msgstr "生成註冊賬號私鑰"
 msgid "Get release information error"
 msgstr "獲取發布信息錯誤"
 
-#: src/views/domain/cert/components/ObtainCert.vue:134
+#: src/views/domain/cert/components/ObtainCert.vue:140
 msgid "Getting the certificate, please wait..."
 msgstr "正在獲取憑證,請稍等..."
 
-#: src/views/preference/Preference.vue:14
-msgid "Git"
-msgstr "Git"
-
 #: src/views/preference/BasicSettings.vue:31
 msgid "Github Proxy"
 msgstr "Github 代理"
@@ -749,7 +761,7 @@ msgstr "記憶體和存儲"
 msgid "Modify"
 msgstr "修改"
 
-#: src/views/domain/DomainAdd.vue:145
+#: src/views/domain/DomainAdd.vue:151
 msgid "Modify Config"
 msgstr "修改配置"
 
@@ -758,8 +770,8 @@ msgstr "修改配置"
 msgid "Multi-line Directive"
 msgstr "多行指令"
 
-#: src/views/cert/Cert.vue:16 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:8 src/views/domain/cert/ChangeCert.vue:19
+#: src/views/cert/Cert.vue:16 src/views/cert/DNSCredential.vue:12
+#: src/views/config/config.ts:8 src/views/domain/cert/ChangeCert.vue:21
 #: src/views/domain/DomainEdit.vue:32 src/views/domain/DomainList.vue:15
 #: src/views/domain/SiteDuplicate.vue:5
 msgid "Name"
@@ -781,14 +793,14 @@ msgstr "下載流量"
 msgid "Network Total Send"
 msgstr "上傳流量"
 
-#: src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:47
 msgid "New version released"
 msgstr "新版本發布"
 
 #: src/views/domain/cert/components/ObtainCert.vue:12
 #: src/views/domain/cert/components/ObtainCert.vue:13
 #: src/views/domain/cert/components/ObtainCert.vue:21
-#: src/views/domain/DomainAdd.vue:135
+#: src/views/domain/DomainAdd.vue:141
 msgid "Next"
 msgstr "下一步"
 
@@ -857,7 +869,10 @@ msgstr "正在獲取證書"
 #: src/components/StdDataDisplay/StdCurd.vue:28
 #: src/components/StdDataDisplay/StdTable.vue:54
 #: src/components/StdDataEntry/components/StdSelector.vue:12
-#: src/views/domain/DomainList.vue:28
+#: src/views/domain/cert/components/ObtainCert.vue:187
+#: src/views/domain/DomainEdit.vue:175 src/views/domain/DomainList.vue:28
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:207
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:36
 msgid "OK"
 msgstr "確定"
 
@@ -900,7 +915,7 @@ msgstr "執行核心升級錯誤"
 msgid "Performing core upgrade"
 msgstr "正在執行核心升級"
 
-#: src/views/cert/DNSCredential.vue:44
+#: src/views/cert/DNSCredential.vue:43
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
 "provider. We will add one or more TXT records to the DNS records of your "
@@ -938,6 +953,14 @@ msgstr "請輸入您的密碼!"
 msgid "Please input your username!"
 msgstr "請輸入您的使用者名稱!"
 
+#: src/views/system/Upgrade.vue:25 src/views/system/Upgrade.vue:26
+#: src/views/system/Upgrade.vue:30 src/views/system/Upgrade.vue:34
+#: src/views/system/Upgrade.vue:38 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:49 src/views/system/Upgrade.vue:53
+#: src/views/system/Upgrade.vue:57 src/views/system/Upgrade.vue:72
+msgid "Pre-release"
+msgstr ""
+
 #: src/routes/index.ts:140 src/views/preference/Preference.vue:2
 msgid "Preference"
 msgstr "設定"
@@ -954,15 +977,15 @@ msgstr "禁止在demo中修改root密碼"
 msgid "Prohibit deleting the default user"
 msgstr "禁止刪除默認用戶"
 
-#: src/views/system/About.vue:19
+#: src/views/system/About.vue:26
 msgid "Project Team"
 msgstr "專案團隊"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/cert/DNSCredential.vue:20
 msgid "Provider"
 msgstr "供應者"
 
-#: src/views/dashboard/DashBoard.vue:109
+#: src/views/dashboard/DashBoard.vue:109 src/views/dashboard/DashBoard.vue:23
 msgid "Reads"
 msgstr "讀"
 
@@ -979,16 +1002,16 @@ msgstr "重新生成響應"
 msgid "Registering user"
 msgstr "註冊用戶"
 
-#: src/views/system/Upgrade.vue:26 src/views/system/Upgrade.vue:27
-#: src/views/system/Upgrade.vue:31 src/views/system/Upgrade.vue:35
-#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:42
-#: src/views/system/Upgrade.vue:45
+#: src/views/system/Upgrade.vue:37 src/views/system/Upgrade.vue:38
+#: src/views/system/Upgrade.vue:42 src/views/system/Upgrade.vue:46
+#: src/views/system/Upgrade.vue:50 src/views/system/Upgrade.vue:53
+#: src/views/system/Upgrade.vue:59
 msgid "Reinstall"
 msgstr "安裝"
 
-#: src/views/system/Upgrade.vue:34 src/views/system/Upgrade.vue:35
-#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:43
-#: src/views/system/Upgrade.vue:55
+#: src/views/system/Upgrade.vue:51 src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:56 src/views/system/Upgrade.vue:60
+#: src/views/system/Upgrade.vue:75
 msgid "Release Note"
 msgstr "發行公告"
 
@@ -1008,10 +1031,6 @@ msgstr "换弹中"
 msgid "Reloading nginx"
 msgstr "重载 Nginx"
 
-#: src/views/preference/GitSettings.vue:3
-msgid "Repo url"
-msgstr ""
-
 #: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
 #: src/components/StdDataDisplay/StdTable.vue:9
@@ -1038,13 +1057,13 @@ msgstr "運行中"
 
 #: src/components/ChatGPT/ChatGPT.vue:16 src/components/ChatGPT/ChatGPT.vue:17
 #: src/components/ChatGPT/ChatGPT.vue:21 src/components/ChatGPT/ChatGPT.vue:23
-#: src/views/config/ConfigEdit.vue:89 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:89 src/views/domain/DomainEdit.vue:266
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:32
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:33
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:40
-#: src/views/preference/Preference.vue:20
-#: src/views/preference/Preference.vue:21
+#: src/views/preference/Preference.vue:17
+#: src/views/preference/Preference.vue:18
 msgid "Save"
 msgstr "儲存"
 
@@ -1054,7 +1073,7 @@ msgstr "儲存"
 msgid "Save Directive"
 msgstr "儲存指令"
 
-#: src/views/config/ConfigEdit.vue:53 src/views/domain/DomainAdd.vue:54
+#: src/views/config/ConfigEdit.vue:53 src/views/domain/DomainAdd.vue:53
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:36
 msgid "Save error %{msg}"
 msgstr "儲存錯誤 %{msg}"
@@ -1069,7 +1088,7 @@ msgid "Save Successfully"
 msgstr "保存成功"
 
 #: src/views/config/ConfigEdit.vue:51 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:142
+#: src/views/domain/DomainEdit.vue:146
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:34
 msgid "Saved successfully"
 msgstr "儲存成功"
@@ -1090,7 +1109,7 @@ msgstr "上傳"
 #: src/components/StdDataDisplay/StdTable.vue:463
 #: src/views/config/ConfigEdit.vue:37 src/views/domain/DomainList.vue:83
 #: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
-#: src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:54
 msgid "Server error"
 msgstr "伺服器錯誤"
 
@@ -1098,14 +1117,14 @@ msgstr "伺服器錯誤"
 msgid "Server Info"
 msgstr "伺服器資訊"
 
-#: src/views/domain/cert/components/ObtainCert.vue:91
+#: src/views/domain/cert/components/ObtainCert.vue:97
 msgid "server_name not found in directives"
 msgstr "未在指令集合中找到 server_name"
 
 #: src/views/domain/cert/components/AutoCertStepOne.vue:10
 #: src/views/domain/cert/components/AutoCertStepOne.vue:5
 #: src/views/domain/cert/components/AutoCertStepOne.vue:6
-#: src/views/domain/DomainAdd.vue:110
+#: src/views/domain/DomainAdd.vue:116
 msgid "server_name parameter is required"
 msgstr "必須為 server_name 指令指明參數"
 
@@ -1142,6 +1161,15 @@ msgstr "SSL認證內容"
 msgid "SSL Certification Key Content"
 msgstr "SSL 證書密鑰內容"
 
+#: src/views/system/Upgrade.vue:24 src/views/system/Upgrade.vue:25
+#: src/views/system/Upgrade.vue:29 src/views/system/Upgrade.vue:33
+#: src/views/system/Upgrade.vue:37 src/views/system/Upgrade.vue:47
+#: src/views/system/Upgrade.vue:48 src/views/system/Upgrade.vue:52
+#: src/views/system/Upgrade.vue:56 src/views/system/Upgrade.vue:71
+#, fuzzy
+msgid "Stable"
+msgstr "表格"
+
 #: src/views/domain/DomainList.vue:24
 msgid "Status"
 msgstr "狀態"
@@ -1222,7 +1250,7 @@ msgstr ""
 msgid "Type"
 msgstr "類型"
 
-#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:26
+#: src/views/cert/Cert.vue:68 src/views/cert/DNSCredential.vue:25
 #: src/views/config/config.ts:28 src/views/domain/DomainList.vue:41
 #: src/views/user/User.vue:37
 msgid "Updated at"
@@ -1233,10 +1261,10 @@ msgid "Updated successfully"
 msgstr "已成功更新"
 
 #: src/routes/index.ts:159 src/views/system/Upgrade.vue:2
-#: src/views/system/Upgrade.vue:28 src/views/system/Upgrade.vue:29
-#: src/views/system/Upgrade.vue:33 src/views/system/Upgrade.vue:37
-#: src/views/system/Upgrade.vue:41 src/views/system/Upgrade.vue:44
-#: src/views/system/Upgrade.vue:47 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:39 src/views/system/Upgrade.vue:40
+#: src/views/system/Upgrade.vue:44 src/views/system/Upgrade.vue:48
+#: src/views/system/Upgrade.vue:52 src/views/system/Upgrade.vue:55
+#: src/views/system/Upgrade.vue:61 src/views/system/Upgrade.vue:62
 msgid "Upgrade"
 msgstr "升級"
 
@@ -1244,7 +1272,7 @@ msgstr "升級"
 msgid "Upgraded successfully"
 msgstr "升級成功"
 
-#: src/views/system/Upgrade.vue:72
+#: src/views/system/Upgrade.vue:90
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "正在升級 Nginx UI,請稍候..."
 
@@ -1252,8 +1280,7 @@ msgstr "正在升級 Nginx UI,請稍候..."
 msgid "Uptime:"
 msgstr "執行時間:"
 
-#: src/views/other/Login.vue:11 src/views/preference/GitSettings.vue:6
-#: src/views/user/User.vue:11
+#: src/views/other/Login.vue:11 src/views/user/User.vue:11
 msgid "Username"
 msgstr "使用者名稱"
 
@@ -1281,7 +1308,7 @@ msgstr "查看"
 msgid "Warning"
 msgstr "警告"
 
-#: src/views/domain/cert/components/ObtainCert.vue:179
+#: src/views/domain/cert/components/ObtainCert.vue:185
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
@@ -1290,7 +1317,6 @@ msgstr ""
 "繼續嗎?"
 
 #: src/views/dashboard/DashBoard.vue:102 src/views/dashboard/DashBoard.vue:22
-#: src/views/dashboard/DashBoard.vue:23
 msgid "Writes"
 msgstr "寫"
 
@@ -1307,7 +1333,7 @@ msgstr "將證書寫入磁盤"
 msgid "Yes"
 msgstr "是的"
 
-#: src/views/system/Upgrade.vue:36
+#: src/views/system/Upgrade.vue:43
 msgid "You are using the latest version"
 msgstr "您使用的是最新版本"
 
@@ -1316,11 +1342,14 @@ msgstr "您使用的是最新版本"
 msgid "You can check Nginx UI upgrade at this page."
 msgstr "您可以在此頁面查看 Nginx UI 升級。"
 
-#: src/views/system/About.vue:27
+#: src/views/system/About.vue:34
 msgctxt "Project"
 msgid "License"
 msgstr "開源軟體授權條款"
 
+#~ msgid "Git"
+#~ msgstr "Git"
+
 #~ msgid "Do you want to enable auto-cert renewal?"
 #~ msgstr "您要啟用自動證書更新嗎?"
 

+ 1 - 1
frontend/src/version.json

@@ -1 +1 @@
-{"version":"1.8.4","build_id":106,"total_build":176}
+{"version":"1.9.9","build_id":107,"total_build":177}

+ 2 - 2
frontend/src/views/preference/Preference.vue

@@ -9,7 +9,6 @@ import {message} from 'ant-design-vue'
 import BasicSettings from '@/views/preference/BasicSettings.vue'
 import OpenAISettings from '@/views/preference/OpenAISettings.vue'
 import NginxLogSettings from '@/views/preference/NginxLogSettings.vue'
-import GitSettings from '@/views/preference/GitSettings.vue'
 import {IData} from '@/views/preference/typedef'
 
 const {$gettext} = useGettext()
@@ -24,7 +23,8 @@ const data = ref<IData>({
         start_cmd: '',
         email: '',
         http_challenge_port: '9180',
-        github_proxy: ''
+        github_proxy: '',
+        ca_dir: ''
     },
     nginx_log: {
         access_log_path: '',

+ 86 - 26
frontend/src/views/system/Upgrade.vue

@@ -1,19 +1,32 @@
 <script setup lang="ts">
 import {useGettext} from 'vue3-gettext'
 import upgrade from '@/api/upgrade'
-import {computed, ref} from 'vue'
+import {computed, Ref, ref, watch} from 'vue'
 import version from '@/version.json'
 import dayjs from 'dayjs'
 import {marked} from 'marked'
 
 import websocket from '@/lib/websocket'
 import {message} from 'ant-design-vue'
+import {useRoute} from 'vue-router'
 
 const {$gettext} = useGettext()
 
-const data: any = ref({})
+const route = useRoute()
+
+interface APIData {
+    name: string
+    os: string,
+    arch: string,
+    ex_path: string,
+    body: string,
+    published_at: string
+}
+
+const data: Ref<APIData> = ref({})
 const last_check = ref('')
 const loading = ref(false)
+const channel = ref('stable')
 
 const progressStrokeColor = {
     from: '#108ee9',
@@ -32,21 +45,22 @@ const progressPercentComputed = computed(() => {
 
 function get_latest_release() {
     loading.value = true
-    upgrade.get_latest_release().then(r => {
+    data.value.body = ''
+    upgrade.get_latest_release(channel.value).then(r => {
         data.value = r
         last_check.value = dayjs().format('YYYY-MM-DD HH:mm:ss')
     }).catch(e => {
         get_release_error.value = e?.message
         message.error(e?.message ?? $gettext('Server error'))
     }).finally(() => {
-        setTimeout(() => {
-            loading.value = false
-        }, 2000)
+        loading.value = false
     })
 }
 
 get_latest_release()
 
+watch(channel, get_latest_release)
+
 const is_latest_ver = computed(() => {
     return data.value.name === `v${version.version}`
 })
@@ -62,6 +76,10 @@ function log(msg: string) {
     (logContainer.value as any as Element).scroll({top: 320, left: 0, behavior: 'smooth'})
 }
 
+const dry_run = computed(() => {
+    return !!route.query.dry_run
+})
+
 async function perform_upgrade() {
     progressStatus.value = 'active'
     modalClosable.value = false
@@ -75,6 +93,15 @@ async function perform_upgrade() {
 
     let last = 0
 
+    ws.onopen = () => {
+        ws.send(JSON.stringify({
+            dry_run: dry_run.value,
+            channel: channel.value
+        }))
+    }
+
+    let is_fail = false
+
     ws.onmessage = async m => {
         const r = JSON.parse(m.data)
         if (r.message) log(r.message)
@@ -90,6 +117,7 @@ async function perform_upgrade() {
             case 'error':
                 progressStatus.value = 'exception'
                 modalClosable.value = true
+                is_fail = true
                 break
             default:
                 modalClosable.value = true
@@ -97,7 +125,10 @@ async function perform_upgrade() {
         }
     }
 
-    ws.onclose = () => {
+    ws.onclose = async () => {
+        if (is_fail) {
+            return
+        }
         const t = setInterval(() => {
             upgrade.current_version().then(() => {
                 clearInterval(t)
@@ -149,27 +180,47 @@ async function perform_upgrade() {
                         {{ $gettext('Check again') }}
                     </a-button>
                 </p>
-                <a-alert type="success" v-if="is_latest_ver"
-                         :message="$gettext('You are using the latest version')"
-                         banner
-                />
-                <a-alert type="info" v-else
-                         :message="$gettext('New version released')"
-                         banner
-                />
-                <div class="control-btn">
-                    <a-space>
-                        <a-button type="primary" @click="perform_upgrade"
-                                  ghost v-if="is_latest_ver">{{ $gettext('Reinstall') }}
-                        </a-button>
-                        <a-button type="primary" @click="perform_upgrade"
-                                  ghost v-else>{{ $gettext('Upgrade') }}
-                        </a-button>
-                    </a-space>
-                </div>
+                <a-form-item :label="$gettext('Channel')">
+                    <a-select v-model:value="channel">
+                        <a-select-option key="stable">{{ $gettext('Stable') }}</a-select-option>
+                        <a-select-option key="prerelease">{{ $gettext('Pre-release') }}</a-select-option>
+                    </a-select>
+                </a-form-item>
+                <template v-if="!loading">
+                    <a-alert type="success" v-if="is_latest_ver"
+                             :message="$gettext('You are using the latest version')"
+                             banner
+                    />
+                    <a-alert type="info" v-else
+                             :message="$gettext('New version released')"
+                             banner
+                    />
+                    <template v-if="dry_run">
+                        <br/>
+                        <a-alert type="info"
+                                 :message="$gettext('Dry run mode enabled')"
+                                 banner
+                        />
+                    </template>
+                    <div class="control-btn">
+                        <a-space>
+                            <a-button type="primary" @click="perform_upgrade"
+                                      ghost v-if="is_latest_ver">{{ $gettext('Reinstall') }}
+                            </a-button>
+                            <a-button type="primary" @click="perform_upgrade"
+                                      ghost v-else>{{ $gettext('Upgrade') }}
+                            </a-button>
+                        </a-space>
+                    </div>
+                </template>
             </template>
             <template v-if="data.body">
-                <h2>{{ $gettext('Release Note') }}</h2>
+                <h2 class="latest-version">{{ data.name }}
+                    <a-tag color="green" v-if="channel==='stable'">{{ $gettext('Stable') }}</a-tag>
+                    <a-tag color="blue" v-if="channel==='prerelease'">{{ $gettext('Pre-release') }}</a-tag>
+                </h2>
+
+                <h3>{{ $gettext('Release Note') }}</h3>
                 <div v-html="marked.parse(data.body)"></div>
             </template>
         </div>
@@ -209,4 +260,13 @@ async function perform_upgrade() {
 .control-btn {
     margin: 15px 0;
 }
+
+.latest-version {
+    display: flex;
+    align-items: center;
+
+    span.ant-tag {
+        margin-left: 10px;
+    }
+}
 </style>

+ 1 - 1
frontend/version.json

@@ -1 +1 @@
-{"version":"1.8.4","build_id":106,"total_build":176}
+{"version":"1.9.9","build_id":107,"total_build":177}

+ 40 - 6
server/api/upgrade.go

@@ -10,13 +10,23 @@ import (
 )
 
 func GetRelease(c *gin.Context) {
-	data, err := service.GetRelease()
+	data, err := service.GetRelease(c.Query("channel"))
 	if err != nil {
 		ErrHandler(c, err)
 		return
 	}
-
-	c.JSON(http.StatusOK, data)
+	runtimeInfo, err := service.GetRuntimeInfo()
+	if err != nil {
+		ErrHandler(c, err)
+		return
+	}
+	type resp struct {
+		service.TRelease
+		service.RuntimeInfo
+	}
+	c.JSON(http.StatusOK, resp{
+		data, runtimeInfo,
+	})
 }
 
 func GetCurrentVersion(c *gin.Context) {
@@ -43,12 +53,24 @@ func PerformCoreUpgrade(c *gin.Context) {
 	}
 	defer ws.Close()
 
+	var control struct {
+		DryRun  bool   `json:"dry_run"`
+		Channel string `json:"channel"`
+	}
+
+	err = ws.ReadJSON(&control)
+
+	if err != nil {
+		log.Println("[Error] PerformCoreUpgrade ws.ReadJSON(&control)", err)
+		return
+	}
+
 	_ = ws.WriteJSON(gin.H{
 		"status":  "info",
 		"message": "Initialing core upgrader",
 	})
 
-	u, err := service.NewUpgrader()
+	u, err := service.NewUpgrader(control.Channel)
 
 	if err != nil {
 		_ = ws.WriteJSON(gin.H{
@@ -75,7 +97,9 @@ func PerformCoreUpgrade(c *gin.Context) {
 			})
 		}
 	}()
+
 	tarName, err := u.DownloadLatestRelease(progressChan)
+
 	if err != nil {
 		_ = ws.WriteJSON(gin.H{
 			"status":  "error",
@@ -88,13 +112,23 @@ func PerformCoreUpgrade(c *gin.Context) {
 		log.Println("[Error] PerformCoreUpgrade DownloadLatestRelease", err)
 		return
 	}
+
+	defer func() {
+		_ = os.Remove(tarName)
+		_ = os.Remove(tarName + ".digest")
+	}()
 	_ = ws.WriteJSON(gin.H{
 		"status":  "info",
 		"message": "Performing core upgrade",
 	})
-	_ = os.Remove(u.Release.ExPath)
+	// dry run
+	if control.DryRun {
+		return
+	}
+
+	_ = os.Remove(u.ExPath)
 	// bye, overseer will restart nginx-ui
-	err = u.PerformCoreUpgrade(u.Release.ExPath, tarName)
+	err = u.PerformCoreUpgrade(u.ExPath, tarName)
 	if err != nil {
 		_ = ws.WriteJSON(gin.H{
 			"status":  "error",

+ 32 - 0
server/internal/helper/hash.go

@@ -0,0 +1,32 @@
+package helper
+
+import (
+	"crypto/sha512"
+	"fmt"
+	"io"
+	"log"
+	"os"
+)
+
+func DigestSHA512(filepath string) (hashString string) {
+	file, err := os.Open(filepath)
+	if err != nil {
+		log.Println("DigestSHA512 open file error")
+		return
+	}
+	defer file.Close()
+
+	hash := sha512.New()
+
+	_, err = io.Copy(hash, file)
+	if err != nil {
+		log.Println("DigestSHA512 io.Copy error")
+		return
+	}
+
+	hashValue := hash.Sum(nil)
+
+	hashString = fmt.Sprintf("%x", hashValue)
+
+	return
+}

+ 125 - 21
server/service/upgrade.go

@@ -16,10 +16,14 @@ import (
 	"path/filepath"
 	"runtime"
 	"strconv"
+	"strings"
 	"time"
 )
 
-const GithubLatestReleaseAPI = "https://api.github.com/repos/0xJacky/nginx-ui/releases/latest"
+const (
+	GithubLatestReleaseAPI = "https://api.github.com/repos/0xJacky/nginx-ui/releases/latest"
+	GithubReleasesListAPI  = "https://api.github.com/repos/0xJacky/nginx-ui/releases"
+)
 
 type RuntimeInfo struct {
 	OS     string `json:"os"`
@@ -59,36 +63,90 @@ type TRelease struct {
 	Name        string          `json:"name"`
 	PublishedAt time.Time       `json:"published_at"`
 	Body        string          `json:"body"`
+	Prerelease  bool            `json:"prerelease"`
 	Assets      []TReleaseAsset `json:"assets"`
-	RuntimeInfo
 }
 
-func GetRelease() (data TRelease, err error) {
+func (t *TRelease) GetAssetsMap() (m map[string]TReleaseAsset) {
+	m = make(map[string]TReleaseAsset)
+	for _, v := range t.Assets {
+		m[v.Name] = v
+	}
+	return
+}
+
+func getLatestRelease() (data TRelease, err error) {
 	resp, err := http.Get(GithubLatestReleaseAPI)
 	if err != nil {
-		err = errors.Wrap(err, "service.GetReleaseList http.Get err")
+		err = errors.Wrap(err, "service.getLatestRelease http.Get err")
 		return
 	}
 	body, err := io.ReadAll(resp.Body)
 	if err != nil {
-		err = errors.Wrap(err, "service.GetReleaseList io.ReadAll err")
+		err = errors.Wrap(err, "service.getLatestRelease io.ReadAll err")
 		return
 	}
 	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		err = errors.New(string(body))
-		log.Println(string(body))
 		return
 	}
 	err = json.Unmarshal(body, &data)
 	if err != nil {
-		err = errors.Wrap(err, "service.GetReleaseList json.Unmarshal err")
+		err = errors.Wrap(err, "service.getLatestRelease json.Unmarshal err")
 		return
 	}
-	data.RuntimeInfo, err = GetRuntimeInfo()
 	return
 }
 
+func getLatestPrerelease() (data TRelease, err error) {
+	resp, err := http.Get(GithubReleasesListAPI)
+	if err != nil {
+		err = errors.Wrap(err, "service.getLatestPrerelease http.Get err")
+		return
+	}
+	body, err := io.ReadAll(resp.Body)
+	if err != nil {
+		err = errors.Wrap(err, "service.getLatestPrerelease io.ReadAll err")
+		return
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != 200 {
+		err = errors.New(string(body))
+		return
+	}
+
+	var releaseList []TRelease
+
+	err = json.Unmarshal(body, &releaseList)
+	if err != nil {
+		err = errors.Wrap(err, "service.getLatestPrerelease json.Unmarshal err")
+		return
+	}
+
+	latestDate := time.Time{}
+
+	for _, release := range releaseList {
+		if release.Prerelease && release.PublishedAt.After(latestDate) {
+			data = release
+			latestDate = release.PublishedAt
+		}
+	}
+
+	return
+}
+
+func GetRelease(channel string) (data TRelease, err error) {
+	switch channel {
+	default:
+		fallthrough
+	case "stable":
+		return getLatestRelease()
+	case "prerelease":
+		return getLatestPrerelease()
+	}
+}
+
 type CurVersion struct {
 	Version    string `json:"version"`
 	BuildID    int    `json:"build_id"`
@@ -113,15 +171,21 @@ func GetCurrentVersion() (c CurVersion, err error) {
 
 type Upgrader struct {
 	Release TRelease
+	RuntimeInfo
 }
 
-func NewUpgrader() (u *Upgrader, err error) {
-	data, err := GetRelease()
+func NewUpgrader(channel string) (u *Upgrader, err error) {
+	data, err := GetRelease(channel)
+	if err != nil {
+		return
+	}
+	runtimeInfo, err := GetRuntimeInfo()
 	if err != nil {
 		return
 	}
 	u = &Upgrader{
-		Release: data,
+		Release:     data,
+		RuntimeInfo: runtimeInfo,
 	}
 	return
 }
@@ -189,30 +253,51 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
 
 	_ = json.Unmarshal(bytes, &buildJson)
 
-	build, ok := buildJson[u.Release.OS]
+	build, ok := buildJson[u.OS]
 	if !ok {
 		err = errors.Wrap(err, "os not support upgrade")
 		return
 	}
-	arch, ok := build[u.Release.Arch]
+	arch, ok := build[u.Arch]
 	if !ok {
 		err = errors.Wrap(err, "arch not support upgrade")
 		return
 	}
-	var downloadUrl string
-	for _, v := range u.Release.Assets {
-		if fmt.Sprintf("nginx-ui-%s.tar.gz", arch.Name) == v.Name {
-			downloadUrl = v.BrowserDownloadUrl
-			break
-		}
+
+	assetsMap := u.Release.GetAssetsMap()
+
+	// asset
+	asset, ok := assetsMap[fmt.Sprintf("nginx-ui-%s.tar.gz", arch.Name)]
+
+	if !ok {
+		err = errors.Wrap(err, "upgrader core asset is empty")
+		return
 	}
 
+	downloadUrl := asset.BrowserDownloadUrl
 	if downloadUrl == "" {
-		err = errors.Wrap(err, "Nginx UI core downloadUrl is empty")
+		err = errors.New("upgrader core downloadUrl is empty")
+		return
+	}
+
+	// digest
+	digest, ok := assetsMap[fmt.Sprintf("nginx-ui-%s.tar.gz.digest", arch.Name)]
+
+	if !ok || digest.BrowserDownloadUrl == "" {
+		err = errors.New("upgrader core digest is empty")
 		return
 	}
 
-	dir := filepath.Dir(u.Release.ExPath)
+	resp, err := http.Get(digest.BrowserDownloadUrl)
+
+	if err != nil {
+		err = errors.Wrap(err, "upgrader core download digest fail")
+		return
+	}
+
+	defer resp.Body.Close()
+
+	dir := filepath.Dir(u.ExPath)
 
 	if settings.ServerSettings.GithubProxy != "" {
 		downloadUrl, err = url.JoinPath(settings.ServerSettings.GithubProxy, downloadUrl)
@@ -221,11 +306,30 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
 			return
 		}
 	}
+
 	tarName, err = downloadRelease(downloadUrl, dir, progressChan)
 	if err != nil {
 		err = errors.Wrap(err, "service.DownloadLatestRelease downloadFile error")
 		return
 	}
+
+	// check tar digest
+	digestFileBytes, err := io.ReadAll(resp.Body)
+	if err != nil {
+		err = errors.Wrap(err, "digestFileContent read error")
+		return
+	}
+
+	digestFileContent := strings.TrimSpace(string(digestFileBytes))
+
+	log.Println("DownloadLatestRelease tar digest", helper.DigestSHA512(tarName))
+	log.Println("DownloadLatestRelease digestFileContent", digestFileContent)
+
+	if digestFileContent != helper.DigestSHA512(tarName) {
+		err = errors.Wrap(err, "digest not equal")
+		return
+	}
+
 	return
 }
 

Vissa filer visades inte eftersom för många filer har ändrats