Browse Source

Merge pull request #1008 from 0xJacky/dev

feat: add support for init.d and OpenRC service management
Jacky 3 days ago
parent
commit
61d9bb49e7

+ 80 - 77
app/src/language/ar/app.po

@@ -13,90 +13,90 @@ msgstr ""
 "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
 "X-Generator: Weblate 5.6.2\n"
 
-#: src/language/generate.ts:23
+#: src/language/generate.ts:34
 msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
 msgstr ""
 "[Nginx UI] مستخدم ACME: %{name}، البريد الإلكتروني: %{email}، دليل CA: "
 "%{caDir}"
 
-#: src/language/generate.ts:12
+#: src/language/generate.ts:18
 msgid "[Nginx UI] Backing up current certificate for later revocation"
 msgstr "[Nginx UI] يتم إنشاء نسخة احتياطية من الشهادة الحالية لإلغائها لاحقًا"
 
-#: src/language/generate.ts:41
+#: src/language/generate.ts:37
 msgid "[Nginx UI] Certificate renewed successfully"
 msgstr "[Nginx UI] تم تجديد الشهادة بنجاح"
 
-#: src/language/generate.ts:31
+#: src/language/generate.ts:42
 msgid "[Nginx UI] Certificate successfully revoked"
 msgstr "[Nginx UI] تم إلغاء الشهادة بنجاح"
 
-#: src/language/generate.ts:25
+#: src/language/generate.ts:29
 msgid ""
 "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
 msgstr "[Nginx UI] تم استخدام الشهادة للخادم، إعادة تحميل شهادة TLS للخادم"
 
-#: src/language/generate.ts:49
+#: src/language/generate.ts:28
 msgid "[Nginx UI] Creating client facilitates communication with the CA server"
 msgstr "[Nginx UI] إنشاء عميل لتسهيل الاتصال مع خادم CA"
 
-#: src/language/generate.ts:24
+#: src/language/generate.ts:6
 msgid "[Nginx UI] Environment variables cleaned"
 msgstr "[Nginx UI] تم تنظيف متغيرات البيئة"
 
-#: src/language/generate.ts:51
+#: src/language/generate.ts:12
 msgid "[Nginx UI] Finished"
 msgstr "[Nginx UI] تم الانتهاء"
 
-#: src/language/generate.ts:37
+#: src/language/generate.ts:47
 msgid "[Nginx UI] Issued certificate successfully"
 msgstr "[Nginx UI] تم إصدار الشهادة بنجاح"
 
-#: src/language/generate.ts:46
+#: src/language/generate.ts:49
 msgid "[Nginx UI] Obtaining certificate"
 msgstr "[Nginx UI] الحصول على الشهادة"
 
-#: src/language/generate.ts:42
+#: src/language/generate.ts:10
 msgid "[Nginx UI] Preparing for certificate revocation"
 msgstr "[Nginx UI] التحضير لإلغاء الشهادة"
 
-#: src/language/generate.ts:48
+#: src/language/generate.ts:33
 msgid "[Nginx UI] Preparing lego configurations"
 msgstr "[Nginx UI] إعداد تكوينات ليغو"
 
-#: src/language/generate.ts:8
+#: src/language/generate.ts:19
 msgid "[Nginx UI] Reloading nginx"
 msgstr "[Nginx UI] إعادة تحميل nginx"
 
-#: src/language/generate.ts:4
+#: src/language/generate.ts:41
 msgid "[Nginx UI] Revocation completed"
 msgstr "[Nginx UI] اكتمال الإلغاء"
 
-#: src/language/generate.ts:5
+#: src/language/generate.ts:31
 msgid "[Nginx UI] Revoking certificate"
 msgstr "[Nginx UI] إلغاء الشهادة"
 
-#: src/language/generate.ts:9
+#: src/language/generate.ts:36
 msgid "[Nginx UI] Revoking old certificate"
 msgstr "[Nginx UI] إبطال الشهادة القديمة"
 
-#: src/language/generate.ts:40
+#: src/language/generate.ts:39
 msgid "[Nginx UI] Setting DNS01 challenge provider"
 msgstr "[Nginx UI] تعيين موفر تحدي DNS01"
 
-#: src/language/generate.ts:50
+#: src/language/generate.ts:35
 msgid "[Nginx UI] Setting environment variables"
 msgstr "[Nginx UI] تعيين متغيرات البيئة"
 
-#: src/language/generate.ts:18
+#: src/language/generate.ts:17
 msgid "[Nginx UI] Setting HTTP01 challenge provider"
 msgstr "[Nginx UI] تعيين موفر تحدي HTTP01"
 
-#: src/language/generate.ts:30
+#: src/language/generate.ts:7
 msgid "[Nginx UI] Writing certificate private key to disk"
 msgstr "[Nginx UI] كتابة مفتاح الشهادة الخاص إلى القرص"
 
-#: src/language/generate.ts:10
+#: src/language/generate.ts:40
 msgid "[Nginx UI] Writing certificate to disk"
 msgstr "[Nginx UI] كتابة الشهادة على القرص"
 
@@ -607,7 +607,7 @@ msgstr "انتهت صلاحية الشهادة"
 msgid "Certificate Expiring Soon"
 msgstr "شهادة على وشك الانتهاء"
 
-#: src/language/generate.ts:38
+#: src/language/generate.ts:32
 msgid "Certificate not found: %{error}"
 msgstr "الشهادة غير موجودة: %{error}"
 
@@ -632,7 +632,7 @@ msgstr "الفاصل الزمني لتجديد الشهادة"
 msgid "Certificate renewed successfully"
 msgstr "تم تجديد الشهادة بنجاح"
 
-#: src/language/generate.ts:39
+#: src/language/generate.ts:11
 msgid "Certificate revoked successfully"
 msgstr "تم إلغاء الشهادة بنجاح"
 
@@ -698,6 +698,16 @@ msgstr "تحقق"
 msgid "Check again"
 msgstr "تحقق مرة أخرى"
 
+#: src/language/generate.ts:27
+msgid ""
+"Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
+"Docker Image, please make sure the docker socket is mounted like this: `-v /"
+"var/run/docker.sock:/var/run/docker.sock`."
+msgstr ""
+"تحقق مما إذا كان /var/run/docker.sock موجودًا. إذا كنت تستخدم صورة Docker "
+"الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس Docker مثبت بهذه الطريقة: `-v /"
+"var/run/docker.sock:/var/run/docker.sock`."
+
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:14
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
@@ -706,43 +716,39 @@ msgstr ""
 "تحقق مما إذا كان HTTPS مفعلاً. استخدام HTTP خارج localhost غير آمن ويمنع "
 "استخدام ميزات Passkeys والحافظة"
 
-#: src/language/generate.ts:28
-msgid "Check if the docker socket exists."
-msgstr "تحقق مما إذا كان مقبس Docker موجودًا."
-
-#: src/language/generate.ts:44
+#: src/language/generate.ts:25
 msgid "Check if the nginx access log path exists"
 msgstr "تحقق مما إذا كان مسار سجل الوصول لـ nginx موجودًا"
 
-#: src/language/generate.ts:35
+#: src/language/generate.ts:30
 msgid "Check if the nginx configuration directory exists"
 msgstr "تحقق مما إذا كان دليل تكوين nginx موجودًا"
 
-#: src/language/generate.ts:43
+#: src/language/generate.ts:24
 msgid "Check if the nginx configuration entry file exists"
 msgstr "تحقق مما إذا كان ملف إدخال تكوين nginx موجودًا"
 
-#: src/language/generate.ts:20
+#: src/language/generate.ts:9
 msgid "Check if the nginx error log path exists"
 msgstr "التحقق مما إذا كان مسار سجل أخطاء nginx موجودًا"
 
-#: src/language/generate.ts:7
+#: src/language/generate.ts:22
 msgid "Check if the nginx PID path exists"
 msgstr "تحقق مما إذا كان مسار معرف عملية Nginx موجودًا"
 
-#: src/language/generate.ts:34
+#: src/language/generate.ts:13
 msgid "Check if the nginx.conf includes the conf.d directory"
 msgstr "تحقق مما إذا كان ملف nginx.conf يتضمن دليل conf.d"
 
-#: src/language/generate.ts:33
+#: src/language/generate.ts:43
 msgid "Check if the nginx.conf includes the sites-enabled directory"
 msgstr "تحقق مما إذا كان ملف nginx.conf يتضمن دليل sites-enabled"
 
-#: src/language/generate.ts:47
+#: src/language/generate.ts:44
 msgid "Check if the nginx.conf includes the streams-enabled directory"
 msgstr "تحقق مما إذا كان ملف nginx.conf يتضمن دليل streams-enabled"
 
-#: src/language/generate.ts:13
+#: src/language/generate.ts:23
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory"
@@ -750,7 +756,7 @@ msgstr ""
 "تحقق مما إذا كانت الدلائل sites-available و sites-enabled موجودة ضمن دليل "
 "تكوين nginx"
 
-#: src/language/generate.ts:32
+#: src/language/generate.ts:38
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory"
@@ -1050,10 +1056,6 @@ msgstr "قم بتخصيص اسم العقدة المحلية ليتم عرضها
 msgid "Dashboard"
 msgstr "لوحة المعلومات"
 
-#: src/views/install/components/InstallForm.vue:109
-msgid "Database (Optional, default: database)"
-msgstr "قاعدة البيانات (اختياري، الافتراضي: قاعدة البيانات)"
-
 #: src/views/preference/tabs/CertSettings.vue:32
 msgid "Days"
 msgstr "أيام"
@@ -1328,7 +1330,7 @@ msgstr "هل تريد إزالة هذا المصدر؟"
 msgid "Docker client not initialized"
 msgstr "عميل Docker غير مهيأ"
 
-#: src/language/generate.ts:17
+#: src/language/generate.ts:26
 msgid "Docker socket exists"
 msgstr "مقبس Docker موجود"
 
@@ -1409,7 +1411,7 @@ msgstr "تعديل البث"
 msgid "Email"
 msgstr "بريد إلكتروني"
 
-#: src/views/install/components/InstallForm.vue:78
+#: src/views/install/components/InstallForm.vue:75
 msgid "Email (*)"
 msgstr "البريد الإلكتروني (*)"
 
@@ -1729,7 +1731,7 @@ msgstr "فشل فك تشفير دليل Nginx UI: {0}"
 msgid "Failed to delete certificate"
 msgstr "فشل في حذف الشهادة"
 
-#: src/language/generate.ts:22
+#: src/language/generate.ts:15
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "فشل حذف الشهادة من قاعدة البيانات: %{error}"
 
@@ -1873,7 +1875,7 @@ msgstr "فشل استعادة ملفات واجهة NGINX: {0}"
 msgid "Failed to revoke certificate"
 msgstr "فشل إبطال الشهادة"
 
-#: src/language/generate.ts:45
+#: src/language/generate.ts:48
 msgid "Failed to revoke certificate: %{error}"
 msgstr "فشل إلغاء الشهادة: %{error}"
 
@@ -2137,13 +2139,13 @@ msgid "Insecure Skip Verify"
 msgstr "تخطي التحقق غير الآمن"
 
 #: src/routes/modules/auth.ts:8
-#: src/views/install/components/InstallForm.vue:124
+#: src/views/install/components/InstallForm.vue:110
 #: src/views/install/components/InstallHeader.vue:9
 #: src/views/system/Upgrade.vue:150
 msgid "Install"
 msgstr "تثبيت"
 
-#: src/views/install/components/InstallForm.vue:60
+#: src/views/install/components/InstallForm.vue:57
 msgid "Install successfully"
 msgstr "تم التثبيت بنجاح"
 
@@ -2381,7 +2383,7 @@ msgstr "أماكن"
 msgid "Log"
 msgstr "سجل"
 
-#: src/language/generate.ts:29
+#: src/language/generate.ts:16
 msgid ""
 "Log file %{log_path} is not a regular file. If you are using nginx-ui in "
 "docker container, please refer to https://nginxui.com/zh_CN/guide/config-"
@@ -2673,7 +2675,7 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "مسار سجل الوصول لـ Nginx"
 
-#: src/language/generate.ts:27
+#: src/language/generate.ts:14
 msgid "Nginx access log path exists"
 msgstr "مسار سجل الوصول إلى Nginx موجود"
 
@@ -2701,11 +2703,11 @@ msgstr "تكوين Nginx لا يتضمن stream-enabled"
 msgid "Nginx config directory is not set"
 msgstr "لم يتم تعيين دليل تكوين Nginx"
 
-#: src/language/generate.ts:16
+#: src/language/generate.ts:46
 msgid "Nginx configuration directory exists"
 msgstr "دليل تكوين Nginx موجود"
 
-#: src/language/generate.ts:36
+#: src/language/generate.ts:21
 msgid "Nginx configuration entry file exists"
 msgstr "ملف إدخال تكوين Nginx موجود"
 
@@ -2743,7 +2745,7 @@ msgstr "معدل استخدام وحدة المعالجة المركزية لـ
 msgid "Nginx Error Log Path"
 msgstr "مسار سجل أخطاء Nginx"
 
-#: src/language/generate.ts:19
+#: src/language/generate.ts:8
 msgid "Nginx error log path exists"
 msgstr "مسار سجل أخطاء Nginx موجود"
 
@@ -2780,7 +2782,7 @@ msgstr "استخدام ذاكرة Nginx"
 msgid "Nginx PID Path"
 msgstr "مسار PID لـ Nginx"
 
-#: src/language/generate.ts:26
+#: src/language/generate.ts:5
 msgid "Nginx PID path exists"
 msgstr "مسار معرف عملية Nginx موجود"
 
@@ -2840,15 +2842,15 @@ msgid ""
 "few seconds."
 msgstr "تمت استعادة تكوين Nginx UI وسيتم إعادة التشغيل تلقائيًا خلال بضع ثوانٍ."
 
-#: src/language/generate.ts:15
+#: src/language/generate.ts:45
 msgid "Nginx.conf includes conf.d directory"
 msgstr "يتضمن Nginx.conf دليل conf.d"
 
-#: src/language/generate.ts:6
+#: src/language/generate.ts:51
 msgid "Nginx.conf includes sites-enabled directory"
 msgstr "يتضمن Nginx.conf دليل sites-enabled"
 
-#: src/language/generate.ts:11
+#: src/language/generate.ts:4
 msgid "Nginx.conf includes streams-enabled directory"
 msgstr "يتضمن Nginx.conf دليل streams-enabled"
 
@@ -3131,7 +3133,7 @@ msgstr ""
 msgid "Password"
 msgstr "كلمة المرور"
 
-#: src/views/install/components/InstallForm.vue:98
+#: src/views/install/components/InstallForm.vue:95
 msgid "Password (*)"
 msgstr "كلمة المرور (*)"
 
@@ -3139,7 +3141,7 @@ msgstr "كلمة المرور (*)"
 msgid "Password incorrect"
 msgstr "كلمة المرور غير صحيحة"
 
-#: src/views/install/components/InstallForm.vue:42
+#: src/views/install/components/InstallForm.vue:45
 msgid "Password length cannot exceed 20 characters"
 msgstr "يجب ألا يتجاوز طول كلمة المرور 20 حرفًا"
 
@@ -3264,15 +3266,15 @@ msgid ""
 "configuration."
 msgstr "يرجى إدخال الاسم، سيتم استخدامه كاسم الملف للتكوين الجديد."
 
-#: src/views/install/components/InstallForm.vue:26
+#: src/views/install/components/InstallForm.vue:25
 msgid "Please input your E-mail!"
 msgstr "يرجى إدخال بريدك الإلكتروني!"
 
-#: src/views/install/components/InstallForm.vue:38 src/views/other/Login.vue:47
+#: src/views/install/components/InstallForm.vue:41 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "يرجى إدخال كلمة المرور الخاصة بك!"
 
-#: src/views/install/components/InstallForm.vue:32 src/views/other/Login.vue:41
+#: src/views/install/components/InstallForm.vue:31 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "يرجى إدخال اسم المستخدم الخاص بك!"
 
@@ -3977,7 +3979,7 @@ msgstr "سجلات الموقع"
 msgid "Site not found"
 msgstr "الموقع غير موجود"
 
-#: src/language/generate.ts:21
+#: src/language/generate.ts:20
 msgid "Sites directory exists"
 msgstr "دليل المواقع موجود"
 
@@ -4090,7 +4092,7 @@ msgstr "تم تمكين البث"
 msgid "Stream not found"
 msgstr "البث غير موجود"
 
-#: src/language/generate.ts:14
+#: src/language/generate.ts:50
 msgid "Streams directory exists"
 msgstr "دليل Streams موجود"
 
@@ -4254,10 +4256,6 @@ msgstr ""
 "سيتم فحص شهادة النطاق لمدة 30 دقيقة، وسيتم تجديدها إذا مر أكثر من أسبوع أو "
 "الفترة التي حددتها في الإعدادات منذ إصدارها الأخير."
 
-#: src/views/install/components/InstallForm.vue:48
-msgid "The filename cannot contain the following characters: %{c}"
-msgstr "لا يمكن أن يحتوي اسم الملف على الأحرف التالية: %{c}"
-
 #: src/views/preference/tabs/NodeSettings.vue:37
 msgid ""
 "The ICP Number should only contain letters, unicode, numbers, hyphens, "
@@ -4673,10 +4671,15 @@ msgstr "المستخدم لم يتم تفعيل OTP كعامل ثنائي"
 msgid "Username"
 msgstr "اسم المستخدم"
 
-#: src/views/install/components/InstallForm.vue:88
+#: src/views/install/components/InstallForm.vue:85
 msgid "Username (*)"
 msgstr "اسم المستخدم (*)"
 
+#: src/views/install/components/InstallForm.vue:35
+#, fuzzy
+msgid "Username length cannot exceed 255 characters"
+msgstr "يجب ألا يتجاوز طول كلمة المرور 20 حرفًا"
+
 #: src/components/CertInfo/CertInfo.vue:24
 #: src/views/certificate/ACMEUser.vue:124
 #: src/views/certificate/CertificateList/certColumns.tsx:78
@@ -4903,6 +4906,15 @@ msgstr "رموزك القديمة لن تعمل بعد الآن."
 msgid "Your passkeys"
 msgstr "مفاتيح المرور الخاصة بك"
 
+#~ msgid "Check if the docker socket exists."
+#~ msgstr "تحقق مما إذا كان مقبس Docker موجودًا."
+
+#~ msgid "Database (Optional, default: database)"
+#~ msgstr "قاعدة البيانات (اختياري، الافتراضي: قاعدة البيانات)"
+
+#~ msgid "The filename cannot contain the following characters: %{c}"
+#~ msgstr "لا يمكن أن يحتوي اسم الملف على الأحرف التالية: %{c}"
+
 #~ msgid "Unknown issue"
 #~ msgstr "مشكلة غير معروفة"
 
@@ -4917,15 +4929,6 @@ msgstr "مفاتيح المرور الخاصة بك"
 #~ msgid "Automatically indexed from site and stream configurations."
 #~ msgstr "\"تمت الفهرسة تلقائيًا من تكوينات الموقع والدفق.\""
 
-#~ msgid ""
-#~ "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
-#~ "Docker Image, please make sure the docker socket is mounted like this: `-"
-#~ "v /var/run/docker.sock:/var/run/docker.sock`."
-#~ msgstr ""
-#~ "تحقق مما إذا كان /var/run/docker.sock موجودًا. إذا كنت تستخدم صورة Docker "
-#~ "الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس Docker مثبت بهذه الطريقة: `-"
-#~ "v /var/run/docker.sock:/var/run/docker.sock`."
-
 #, fuzzy
 #~ msgid "Nginx Conf Include Conf.d"
 #~ msgstr "أمر إعادة تشغيل Nginx"

File diff suppressed because it is too large
+ 181 - 175
app/src/language/de_DE/app.po


+ 67 - 68
app/src/language/en/app.po

@@ -1,85 +1,85 @@
-#: src/language/generate.ts:23
+#: src/language/generate.ts:34
 msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
 msgstr ""
 
-#: src/language/generate.ts:12
+#: src/language/generate.ts:18
 msgid "[Nginx UI] Backing up current certificate for later revocation"
 msgstr ""
 
-#: src/language/generate.ts:41
+#: src/language/generate.ts:37
 msgid "[Nginx UI] Certificate renewed successfully"
 msgstr ""
 
-#: src/language/generate.ts:31
+#: src/language/generate.ts:42
 msgid "[Nginx UI] Certificate successfully revoked"
 msgstr ""
 
-#: src/language/generate.ts:25
+#: src/language/generate.ts:29
 msgid ""
 "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
 msgstr ""
 
-#: src/language/generate.ts:49
+#: src/language/generate.ts:28
 msgid "[Nginx UI] Creating client facilitates communication with the CA server"
 msgstr ""
 
-#: src/language/generate.ts:24
+#: src/language/generate.ts:6
 msgid "[Nginx UI] Environment variables cleaned"
 msgstr ""
 
-#: src/language/generate.ts:51
+#: src/language/generate.ts:12
 msgid "[Nginx UI] Finished"
 msgstr ""
 
-#: src/language/generate.ts:37
+#: src/language/generate.ts:47
 msgid "[Nginx UI] Issued certificate successfully"
 msgstr ""
 
-#: src/language/generate.ts:46
+#: src/language/generate.ts:49
 msgid "[Nginx UI] Obtaining certificate"
 msgstr ""
 
-#: src/language/generate.ts:42
+#: src/language/generate.ts:10
 msgid "[Nginx UI] Preparing for certificate revocation"
 msgstr ""
 
-#: src/language/generate.ts:48
+#: src/language/generate.ts:33
 msgid "[Nginx UI] Preparing lego configurations"
 msgstr ""
 
-#: src/language/generate.ts:8
+#: src/language/generate.ts:19
 msgid "[Nginx UI] Reloading nginx"
 msgstr ""
 
-#: src/language/generate.ts:4
+#: src/language/generate.ts:41
 msgid "[Nginx UI] Revocation completed"
 msgstr ""
 
-#: src/language/generate.ts:5
+#: src/language/generate.ts:31
 msgid "[Nginx UI] Revoking certificate"
 msgstr ""
 
-#: src/language/generate.ts:9
+#: src/language/generate.ts:36
 msgid "[Nginx UI] Revoking old certificate"
 msgstr ""
 
-#: src/language/generate.ts:40
+#: src/language/generate.ts:39
 msgid "[Nginx UI] Setting DNS01 challenge provider"
 msgstr ""
 
-#: src/language/generate.ts:50
+#: src/language/generate.ts:35
 msgid "[Nginx UI] Setting environment variables"
 msgstr ""
 
-#: src/language/generate.ts:18
+#: src/language/generate.ts:17
 msgid "[Nginx UI] Setting HTTP01 challenge provider"
 msgstr ""
 
-#: src/language/generate.ts:30
+#: src/language/generate.ts:7
 msgid "[Nginx UI] Writing certificate private key to disk"
 msgstr ""
 
-#: src/language/generate.ts:10
+#: src/language/generate.ts:40
 msgid "[Nginx UI] Writing certificate to disk"
 msgstr ""
 
@@ -587,7 +587,7 @@ msgstr ""
 msgid "Certificate Expiring Soon"
 msgstr ""
 
-#: src/language/generate.ts:38
+#: src/language/generate.ts:32
 msgid "Certificate not found: %{error}"
 msgstr ""
 
@@ -612,7 +612,7 @@ msgstr ""
 msgid "Certificate renewed successfully"
 msgstr ""
 
-#: src/language/generate.ts:39
+#: src/language/generate.ts:11
 msgid "Certificate revoked successfully"
 msgstr ""
 
@@ -670,55 +670,58 @@ msgstr ""
 msgid "Check again"
 msgstr ""
 
+#: src/language/generate.ts:27
+msgid ""
+"Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
+"Docker Image, please make sure the docker socket is mounted like this: `-v /"
+"var/run/docker.sock:/var/run/docker.sock`."
+msgstr ""
+
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:14
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features"
 msgstr ""
 
-#: src/language/generate.ts:28
-msgid "Check if the docker socket exists."
-msgstr ""
-
-#: src/language/generate.ts:44
+#: src/language/generate.ts:25
 msgid "Check if the nginx access log path exists"
 msgstr ""
 
-#: src/language/generate.ts:35
+#: src/language/generate.ts:30
 msgid "Check if the nginx configuration directory exists"
 msgstr ""
 
-#: src/language/generate.ts:43
+#: src/language/generate.ts:24
 msgid "Check if the nginx configuration entry file exists"
 msgstr ""
 
-#: src/language/generate.ts:20
+#: src/language/generate.ts:9
 msgid "Check if the nginx error log path exists"
 msgstr ""
 
-#: src/language/generate.ts:7
+#: src/language/generate.ts:22
 msgid "Check if the nginx PID path exists"
 msgstr ""
 
-#: src/language/generate.ts:34
+#: src/language/generate.ts:13
 msgid "Check if the nginx.conf includes the conf.d directory"
 msgstr ""
 
-#: src/language/generate.ts:33
+#: src/language/generate.ts:43
 msgid "Check if the nginx.conf includes the sites-enabled directory"
 msgstr ""
 
-#: src/language/generate.ts:47
+#: src/language/generate.ts:44
 msgid "Check if the nginx.conf includes the streams-enabled directory"
 msgstr ""
 
-#: src/language/generate.ts:13
+#: src/language/generate.ts:23
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory"
 msgstr ""
 
-#: src/language/generate.ts:32
+#: src/language/generate.ts:38
 msgid ""
 "Check if the streams-available and streams-enabled directories are under the "
 "nginx configuration directory"
@@ -1014,10 +1017,6 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:109
-msgid "Database (Optional, default: database)"
-msgstr ""
-
 #: src/views/preference/tabs/CertSettings.vue:32
 msgid "Days"
 msgstr ""
@@ -1292,7 +1291,7 @@ msgstr ""
 msgid "Docker client not initialized"
 msgstr ""
 
-#: src/language/generate.ts:17
+#: src/language/generate.ts:26
 msgid "Docker socket exists"
 msgstr ""
 
@@ -1372,7 +1371,7 @@ msgstr ""
 msgid "Email"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:78
+#: src/views/install/components/InstallForm.vue:75
 msgid "Email (*)"
 msgstr ""
 
@@ -1692,7 +1691,7 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgstr ""
 
-#: src/language/generate.ts:22
+#: src/language/generate.ts:15
 msgid "Failed to delete certificate from database: %{error}"
 msgstr ""
 
@@ -1836,7 +1835,7 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr ""
 
-#: src/language/generate.ts:45
+#: src/language/generate.ts:48
 msgid "Failed to revoke certificate: %{error}"
 msgstr ""
 
@@ -2094,13 +2093,13 @@ msgid "Insecure Skip Verify"
 msgstr ""
 
 #: src/routes/modules/auth.ts:8
-#: src/views/install/components/InstallForm.vue:124
+#: src/views/install/components/InstallForm.vue:110
 #: src/views/install/components/InstallHeader.vue:9
 #: src/views/system/Upgrade.vue:150
 msgid "Install"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:60
+#: src/views/install/components/InstallForm.vue:57
 msgid "Install successfully"
 msgstr ""
 
@@ -2334,7 +2333,7 @@ msgstr ""
 msgid "Log"
 msgstr ""
 
-#: src/language/generate.ts:29
+#: src/language/generate.ts:16
 msgid ""
 "Log file %{log_path} is not a regular file. If you are using nginx-ui in "
 "docker container, please refer to https://nginxui.com/zh_CN/guide/config-"
@@ -2615,7 +2614,7 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/language/generate.ts:27
+#: src/language/generate.ts:14
 msgid "Nginx access log path exists"
 msgstr ""
 
@@ -2643,11 +2642,11 @@ msgstr ""
 msgid "Nginx config directory is not set"
 msgstr ""
 
-#: src/language/generate.ts:16
+#: src/language/generate.ts:46
 msgid "Nginx configuration directory exists"
 msgstr ""
 
-#: src/language/generate.ts:36
+#: src/language/generate.ts:21
 msgid "Nginx configuration entry file exists"
 msgstr ""
 
@@ -2685,7 +2684,7 @@ msgstr ""
 msgid "Nginx Error Log Path"
 msgstr ""
 
-#: src/language/generate.ts:19
+#: src/language/generate.ts:8
 msgid "Nginx error log path exists"
 msgstr ""
 
@@ -2722,7 +2721,7 @@ msgstr ""
 msgid "Nginx PID Path"
 msgstr ""
 
-#: src/language/generate.ts:26
+#: src/language/generate.ts:5
 msgid "Nginx PID path exists"
 msgstr ""
 
@@ -2782,15 +2781,15 @@ msgid ""
 "few seconds."
 msgstr ""
 
-#: src/language/generate.ts:15
+#: src/language/generate.ts:45
 msgid "Nginx.conf includes conf.d directory"
 msgstr ""
 
-#: src/language/generate.ts:6
+#: src/language/generate.ts:51
 msgid "Nginx.conf includes sites-enabled directory"
 msgstr ""
 
-#: src/language/generate.ts:11
+#: src/language/generate.ts:4
 msgid "Nginx.conf includes streams-enabled directory"
 msgstr ""
 
@@ -3064,7 +3063,7 @@ msgstr ""
 msgid "Password"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:98
+#: src/views/install/components/InstallForm.vue:95
 msgid "Password (*)"
 msgstr ""
 
@@ -3072,7 +3071,7 @@ msgstr ""
 msgid "Password incorrect"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:42
+#: src/views/install/components/InstallForm.vue:45
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -3192,15 +3191,15 @@ msgid ""
 "configuration."
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:26
+#: src/views/install/components/InstallForm.vue:25
 msgid "Please input your E-mail!"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:38 src/views/other/Login.vue:47
+#: src/views/install/components/InstallForm.vue:41 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:32 src/views/other/Login.vue:41
+#: src/views/install/components/InstallForm.vue:31 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr ""
 
@@ -3893,7 +3892,7 @@ msgstr ""
 msgid "Site not found"
 msgstr ""
 
-#: src/language/generate.ts:21
+#: src/language/generate.ts:20
 msgid "Sites directory exists"
 msgstr ""
 
@@ -4006,7 +4005,7 @@ msgstr ""
 msgid "Stream not found"
 msgstr ""
 
-#: src/language/generate.ts:14
+#: src/language/generate.ts:50
 msgid "Streams directory exists"
 msgstr ""
 
@@ -4165,10 +4164,6 @@ msgid ""
 "since it was last issued."
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:48
-msgid "The filename cannot contain the following characters: %{c}"
-msgstr ""
-
 #: src/views/preference/tabs/NodeSettings.vue:37
 msgid ""
 "The ICP Number should only contain letters, unicode, numbers, hyphens, "
@@ -4542,10 +4537,14 @@ msgstr ""
 msgid "Username"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:88
+#: src/views/install/components/InstallForm.vue:85
 msgid "Username (*)"
 msgstr ""
 
+#: src/views/install/components/InstallForm.vue:35
+msgid "Username length cannot exceed 255 characters"
+msgstr ""
+
 #: src/components/CertInfo/CertInfo.vue:24
 #: src/views/certificate/ACMEUser.vue:124
 #: src/views/certificate/CertificateList/certColumns.tsx:78

File diff suppressed because it is too large
+ 178 - 175
app/src/language/es/app.po


File diff suppressed because it is too large
+ 172 - 171
app/src/language/fr_FR/app.po


+ 38 - 38
app/src/language/generate.ts

@@ -1,52 +1,52 @@
 // This file is auto-generated. DO NOT EDIT MANUALLY.
 
 export const msg = [
-  $gettext('[Nginx UI] Revocation completed'),
-  $gettext('[Nginx UI] Revoking certificate'),
-  $gettext('Nginx.conf includes sites-enabled directory'),
-  $gettext('Check if the nginx PID path exists'),
-  $gettext('[Nginx UI] Reloading nginx'),
-  $gettext('[Nginx UI] Revoking old certificate'),
-  $gettext('[Nginx UI] Writing certificate to disk'),
   $gettext('Nginx.conf includes streams-enabled directory'),
-  $gettext('[Nginx UI] Backing up current certificate for later revocation'),
-  $gettext('Check if the sites-available and sites-enabled directories are under the nginx configuration directory'),
-  $gettext('Streams directory exists'),
-  $gettext('Nginx.conf includes conf.d directory'),
-  $gettext('Nginx configuration directory exists'),
-  $gettext('Docker socket exists'),
-  $gettext('[Nginx UI] Setting HTTP01 challenge provider'),
+  $gettext('Nginx PID path exists'),
+  $gettext('[Nginx UI] Environment variables cleaned'),
+  $gettext('[Nginx UI] Writing certificate private key to disk'),
   $gettext('Nginx error log path exists'),
   $gettext('Check if the nginx error log path exists'),
-  $gettext('Sites directory exists'),
-  $gettext('Failed to delete certificate from database: %{error}'),
-  $gettext('[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}'),
-  $gettext('[Nginx UI] Environment variables cleaned'),
-  $gettext('[Nginx UI] Certificate was used for server, reloading server TLS certificate'),
-  $gettext('Nginx PID path exists'),
+  $gettext('[Nginx UI] Preparing for certificate revocation'),
+  $gettext('Certificate revoked successfully'),
+  $gettext('[Nginx UI] Finished'),
+  $gettext('Check if the nginx.conf includes the conf.d directory'),
   $gettext('Nginx access log path exists'),
-  $gettext('Check if the docker socket exists.'),
+  $gettext('Failed to delete certificate from database: %{error}'),
   $gettext('Log file %{log_path} is not a regular file. If you are using nginx-ui in docker container, please refer to https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information.'),
-  $gettext('[Nginx UI] Writing certificate private key to disk'),
-  $gettext('[Nginx UI] Certificate successfully revoked'),
-  $gettext('Check if the streams-available and streams-enabled directories are under the nginx configuration directory'),
-  $gettext('Check if the nginx.conf includes the sites-enabled directory'),
-  $gettext('Check if the nginx.conf includes the conf.d directory'),
-  $gettext('Check if the nginx configuration directory exists'),
+  $gettext('[Nginx UI] Setting HTTP01 challenge provider'),
+  $gettext('[Nginx UI] Backing up current certificate for later revocation'),
+  $gettext('[Nginx UI] Reloading nginx'),
+  $gettext('Sites directory exists'),
   $gettext('Nginx configuration entry file exists'),
-  $gettext('[Nginx UI] Issued certificate successfully'),
-  $gettext('Certificate not found: %{error}'),
-  $gettext('Certificate revoked successfully'),
-  $gettext('[Nginx UI] Setting DNS01 challenge provider'),
-  $gettext('[Nginx UI] Certificate renewed successfully'),
-  $gettext('[Nginx UI] Preparing for certificate revocation'),
+  $gettext('Check if the nginx PID path exists'),
+  $gettext('Check if the sites-available and sites-enabled directories are under the nginx configuration directory'),
   $gettext('Check if the nginx configuration entry file exists'),
   $gettext('Check if the nginx access log path exists'),
-  $gettext('Failed to revoke certificate: %{error}'),
-  $gettext('[Nginx UI] Obtaining certificate'),
-  $gettext('Check if the nginx.conf includes the streams-enabled directory'),
-  $gettext('[Nginx UI] Preparing lego configurations'),
+  $gettext('Docker socket exists'),
+  $gettext('Check if /var/run/docker.sock exists. If you are using Nginx UI Official Docker Image, please make sure the docker socket is mounted like this: `-v /var/run/docker.sock:/var/run/docker.sock`.'),
   $gettext('[Nginx UI] Creating client facilitates communication with the CA server'),
+  $gettext('[Nginx UI] Certificate was used for server, reloading server TLS certificate'),
+  $gettext('Check if the nginx configuration directory exists'),
+  $gettext('[Nginx UI] Revoking certificate'),
+  $gettext('Certificate not found: %{error}'),
+  $gettext('[Nginx UI] Preparing lego configurations'),
+  $gettext('[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}'),
   $gettext('[Nginx UI] Setting environment variables'),
-  $gettext('[Nginx UI] Finished'),
+  $gettext('[Nginx UI] Revoking old certificate'),
+  $gettext('[Nginx UI] Certificate renewed successfully'),
+  $gettext('Check if the streams-available and streams-enabled directories are under the nginx configuration directory'),
+  $gettext('[Nginx UI] Setting DNS01 challenge provider'),
+  $gettext('[Nginx UI] Writing certificate to disk'),
+  $gettext('[Nginx UI] Revocation completed'),
+  $gettext('[Nginx UI] Certificate successfully revoked'),
+  $gettext('Check if the nginx.conf includes the sites-enabled directory'),
+  $gettext('Check if the nginx.conf includes the streams-enabled directory'),
+  $gettext('Nginx.conf includes conf.d directory'),
+  $gettext('Nginx configuration directory exists'),
+  $gettext('[Nginx UI] Issued certificate successfully'),
+  $gettext('Failed to revoke certificate: %{error}'),
+  $gettext('[Nginx UI] Obtaining certificate'),
+  $gettext('Streams directory exists'),
+  $gettext('Nginx.conf includes sites-enabled directory'),
 ]

File diff suppressed because it is too large
+ 195 - 175
app/src/language/ja_JP/app.po


File diff suppressed because it is too large
+ 196 - 169
app/src/language/ko_KR/app.po


+ 64 - 68
app/src/language/messages.pot

@@ -2,87 +2,87 @@ msgid ""
 msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 
-#: src/language/generate.ts:23
+#: src/language/generate.ts:34
 msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
 msgstr ""
 
-#: src/language/generate.ts:12
+#: src/language/generate.ts:18
 msgid "[Nginx UI] Backing up current certificate for later revocation"
 msgstr ""
 
-#: src/language/generate.ts:41
+#: src/language/generate.ts:37
 msgid "[Nginx UI] Certificate renewed successfully"
 msgstr ""
 
-#: src/language/generate.ts:31
+#: src/language/generate.ts:42
 msgid "[Nginx UI] Certificate successfully revoked"
 msgstr ""
 
-#: src/language/generate.ts:25
+#: src/language/generate.ts:29
 msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
 msgstr ""
 
-#: src/language/generate.ts:49
+#: src/language/generate.ts:28
 msgid "[Nginx UI] Creating client facilitates communication with the CA server"
 msgstr ""
 
-#: src/language/generate.ts:24
+#: src/language/generate.ts:6
 msgid "[Nginx UI] Environment variables cleaned"
 msgstr ""
 
-#: src/language/generate.ts:51
+#: src/language/generate.ts:12
 msgid "[Nginx UI] Finished"
 msgstr ""
 
-#: src/language/generate.ts:37
+#: src/language/generate.ts:47
 msgid "[Nginx UI] Issued certificate successfully"
 msgstr ""
 
-#: src/language/generate.ts:46
+#: src/language/generate.ts:49
 msgid "[Nginx UI] Obtaining certificate"
 msgstr ""
 
-#: src/language/generate.ts:42
+#: src/language/generate.ts:10
 msgid "[Nginx UI] Preparing for certificate revocation"
 msgstr ""
 
-#: src/language/generate.ts:48
+#: src/language/generate.ts:33
 msgid "[Nginx UI] Preparing lego configurations"
 msgstr ""
 
-#: src/language/generate.ts:8
+#: src/language/generate.ts:19
 msgid "[Nginx UI] Reloading nginx"
 msgstr ""
 
-#: src/language/generate.ts:4
+#: src/language/generate.ts:41
 msgid "[Nginx UI] Revocation completed"
 msgstr ""
 
-#: src/language/generate.ts:5
+#: src/language/generate.ts:31
 msgid "[Nginx UI] Revoking certificate"
 msgstr ""
 
-#: src/language/generate.ts:9
+#: src/language/generate.ts:36
 msgid "[Nginx UI] Revoking old certificate"
 msgstr ""
 
-#: src/language/generate.ts:40
+#: src/language/generate.ts:39
 msgid "[Nginx UI] Setting DNS01 challenge provider"
 msgstr ""
 
-#: src/language/generate.ts:50
+#: src/language/generate.ts:35
 msgid "[Nginx UI] Setting environment variables"
 msgstr ""
 
-#: src/language/generate.ts:18
+#: src/language/generate.ts:17
 msgid "[Nginx UI] Setting HTTP01 challenge provider"
 msgstr ""
 
-#: src/language/generate.ts:30
+#: src/language/generate.ts:7
 msgid "[Nginx UI] Writing certificate private key to disk"
 msgstr ""
 
-#: src/language/generate.ts:10
+#: src/language/generate.ts:40
 msgid "[Nginx UI] Writing certificate to disk"
 msgstr ""
 
@@ -594,7 +594,7 @@ msgstr ""
 msgid "Certificate Expiring Soon"
 msgstr ""
 
-#: src/language/generate.ts:38
+#: src/language/generate.ts:32
 msgid "Certificate not found: %{error}"
 msgstr ""
 
@@ -619,7 +619,7 @@ msgstr ""
 msgid "Certificate renewed successfully"
 msgstr ""
 
-#: src/language/generate.ts:39
+#: src/language/generate.ts:11
 msgid "Certificate revoked successfully"
 msgstr ""
 
@@ -677,51 +677,51 @@ msgstr ""
 msgid "Check again"
 msgstr ""
 
-#: src/components/SelfCheck/tasks/frontend/https-check.ts:14
-msgid "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and prevents using Passkeys and clipboard features"
+#: src/language/generate.ts:27
+msgid "Check if /var/run/docker.sock exists. If you are using Nginx UI Official Docker Image, please make sure the docker socket is mounted like this: `-v /var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 
-#: src/language/generate.ts:28
-msgid "Check if the docker socket exists."
+#: src/components/SelfCheck/tasks/frontend/https-check.ts:14
+msgid "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and prevents using Passkeys and clipboard features"
 msgstr ""
 
-#: src/language/generate.ts:44
+#: src/language/generate.ts:25
 msgid "Check if the nginx access log path exists"
 msgstr ""
 
-#: src/language/generate.ts:35
+#: src/language/generate.ts:30
 msgid "Check if the nginx configuration directory exists"
 msgstr ""
 
-#: src/language/generate.ts:43
+#: src/language/generate.ts:24
 msgid "Check if the nginx configuration entry file exists"
 msgstr ""
 
-#: src/language/generate.ts:20
+#: src/language/generate.ts:9
 msgid "Check if the nginx error log path exists"
 msgstr ""
 
-#: src/language/generate.ts:7
+#: src/language/generate.ts:22
 msgid "Check if the nginx PID path exists"
 msgstr ""
 
-#: src/language/generate.ts:34
+#: src/language/generate.ts:13
 msgid "Check if the nginx.conf includes the conf.d directory"
 msgstr ""
 
-#: src/language/generate.ts:33
+#: src/language/generate.ts:43
 msgid "Check if the nginx.conf includes the sites-enabled directory"
 msgstr ""
 
-#: src/language/generate.ts:47
+#: src/language/generate.ts:44
 msgid "Check if the nginx.conf includes the streams-enabled directory"
 msgstr ""
 
-#: src/language/generate.ts:13
+#: src/language/generate.ts:23
 msgid "Check if the sites-available and sites-enabled directories are under the nginx configuration directory"
 msgstr ""
 
-#: src/language/generate.ts:32
+#: src/language/generate.ts:38
 msgid "Check if the streams-available and streams-enabled directories are under the nginx configuration directory"
 msgstr ""
 
@@ -1014,10 +1014,6 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:109
-msgid "Database (Optional, default: database)"
-msgstr ""
-
 #: src/views/preference/tabs/CertSettings.vue:32
 msgid "Days"
 msgstr ""
@@ -1298,7 +1294,7 @@ msgstr ""
 msgid "Docker client not initialized"
 msgstr ""
 
-#: src/language/generate.ts:17
+#: src/language/generate.ts:26
 msgid "Docker socket exists"
 msgstr ""
 
@@ -1377,7 +1373,7 @@ msgstr ""
 msgid "Email"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:78
+#: src/views/install/components/InstallForm.vue:75
 msgid "Email (*)"
 msgstr ""
 
@@ -1701,7 +1697,7 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgstr ""
 
-#: src/language/generate.ts:22
+#: src/language/generate.ts:15
 msgid "Failed to delete certificate from database: %{error}"
 msgstr ""
 
@@ -1845,7 +1841,7 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr ""
 
-#: src/language/generate.ts:45
+#: src/language/generate.ts:48
 msgid "Failed to revoke certificate: %{error}"
 msgstr ""
 
@@ -2095,13 +2091,13 @@ msgid "Insecure Skip Verify"
 msgstr ""
 
 #: src/routes/modules/auth.ts:8
-#: src/views/install/components/InstallForm.vue:124
+#: src/views/install/components/InstallForm.vue:110
 #: src/views/install/components/InstallHeader.vue:9
 #: src/views/system/Upgrade.vue:150
 msgid "Install"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:60
+#: src/views/install/components/InstallForm.vue:57
 msgid "Install successfully"
 msgstr ""
 
@@ -2331,7 +2327,7 @@ msgstr ""
 msgid "Log"
 msgstr ""
 
-#: src/language/generate.ts:29
+#: src/language/generate.ts:16
 msgid "Log file %{log_path} is not a regular file. If you are using nginx-ui in docker container, please refer to https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information."
 msgstr ""
 
@@ -2612,7 +2608,7 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/language/generate.ts:27
+#: src/language/generate.ts:14
 msgid "Nginx access log path exists"
 msgstr ""
 
@@ -2640,11 +2636,11 @@ msgstr ""
 msgid "Nginx config directory is not set"
 msgstr ""
 
-#: src/language/generate.ts:16
+#: src/language/generate.ts:46
 msgid "Nginx configuration directory exists"
 msgstr ""
 
-#: src/language/generate.ts:36
+#: src/language/generate.ts:21
 msgid "Nginx configuration entry file exists"
 msgstr ""
 
@@ -2682,7 +2678,7 @@ msgstr ""
 msgid "Nginx Error Log Path"
 msgstr ""
 
-#: src/language/generate.ts:19
+#: src/language/generate.ts:8
 msgid "Nginx error log path exists"
 msgstr ""
 
@@ -2720,7 +2716,7 @@ msgstr ""
 msgid "Nginx PID Path"
 msgstr ""
 
-#: src/language/generate.ts:26
+#: src/language/generate.ts:5
 msgid "Nginx PID path exists"
 msgstr ""
 
@@ -2780,15 +2776,15 @@ msgstr ""
 msgid "Nginx UI configuration has been restored and will restart automatically in a few seconds."
 msgstr ""
 
-#: src/language/generate.ts:15
+#: src/language/generate.ts:45
 msgid "Nginx.conf includes conf.d directory"
 msgstr ""
 
-#: src/language/generate.ts:6
+#: src/language/generate.ts:51
 msgid "Nginx.conf includes sites-enabled directory"
 msgstr ""
 
-#: src/language/generate.ts:11
+#: src/language/generate.ts:4
 msgid "Nginx.conf includes streams-enabled directory"
 msgstr ""
 
@@ -3057,7 +3053,7 @@ msgstr ""
 msgid "Password"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:98
+#: src/views/install/components/InstallForm.vue:95
 msgid "Password (*)"
 msgstr ""
 
@@ -3065,7 +3061,7 @@ msgstr ""
 msgid "Password incorrect"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:42
+#: src/views/install/components/InstallForm.vue:45
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -3172,16 +3168,16 @@ msgstr ""
 msgid "Please input name, this will be used as the filename of the new configuration."
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:26
+#: src/views/install/components/InstallForm.vue:25
 msgid "Please input your E-mail!"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:38
+#: src/views/install/components/InstallForm.vue:41
 #: src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:32
+#: src/views/install/components/InstallForm.vue:31
 #: src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr ""
@@ -3867,7 +3863,7 @@ msgstr ""
 msgid "Site not found"
 msgstr ""
 
-#: src/language/generate.ts:21
+#: src/language/generate.ts:20
 msgid "Sites directory exists"
 msgstr ""
 
@@ -3982,7 +3978,7 @@ msgstr ""
 msgid "Stream not found"
 msgstr ""
 
-#: src/language/generate.ts:14
+#: src/language/generate.ts:50
 msgid "Streams directory exists"
 msgstr ""
 
@@ -4140,10 +4136,6 @@ msgstr ""
 msgid "The certificate for the domain will be checked 30 minutes, and will be renewed if it has been more than 1 week or the period you set in settings since it was last issued."
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:48
-msgid "The filename cannot contain the following characters: %{c}"
-msgstr ""
-
 #: src/views/preference/tabs/NodeSettings.vue:37
 msgid "The ICP Number should only contain letters, unicode, numbers, hyphens, dashes, colons, and dots."
 msgstr ""
@@ -4475,10 +4467,14 @@ msgstr ""
 msgid "Username"
 msgstr ""
 
-#: src/views/install/components/InstallForm.vue:88
+#: src/views/install/components/InstallForm.vue:85
 msgid "Username (*)"
 msgstr ""
 
+#: src/views/install/components/InstallForm.vue:35
+msgid "Username length cannot exceed 255 characters"
+msgstr ""
+
 #: src/components/CertInfo/CertInfo.vue:24
 #: src/views/certificate/ACMEUser.vue:124
 #: src/views/certificate/CertificateList/certColumns.tsx:78

File diff suppressed because it is too large
+ 180 - 175
app/src/language/pt_PT/app.po


File diff suppressed because it is too large
+ 172 - 175
app/src/language/ru_RU/app.po


File diff suppressed because it is too large
+ 174 - 186
app/src/language/tr_TR/app.po


File diff suppressed because it is too large
+ 172 - 187
app/src/language/uk_UA/app.po


File diff suppressed because it is too large
+ 175 - 185
app/src/language/vi_VN/app.po


File diff suppressed because it is too large
+ 236 - 170
app/src/language/zh_CN/app.po


File diff suppressed because it is too large
+ 240 - 174
app/src/language/zh_TW/app.po


+ 64 - 12
cmd/lego_config/main.go

@@ -3,6 +3,7 @@ package main
 
 import (
 	"archive/zip"
+	"encoding/json"
 	"fmt"
 	"io"
 	"net/http"
@@ -17,9 +18,14 @@ import (
 	"github.com/uozi-tech/cosy/logger"
 )
 
+// GitHubRelease represents the structure of GitHub's release API response
+type GitHubRelease struct {
+	TagName string `json:"tag_name"`
+}
+
 const (
-	repoURL   = "https://github.com/go-acme/lego/archive/refs/heads/master.zip"
-	configDir = "internal/cert/config"
+	githubAPIURL = "https://api.github.com/repos/go-acme/lego/releases/latest"
+	configDir    = "internal/cert/config"
 )
 
 func main() {
@@ -32,13 +38,21 @@ func main() {
 	}
 	basePath := filepath.Join(filepath.Dir(file), "../../")
 
-	zipFile, err := downloadAndExtract()
+	// Get the latest release tag
+	tag, err := getLatestReleaseTag()
+	if err != nil {
+		logger.Errorf("Error getting latest release tag: %v\n", err)
+		os.Exit(1)
+	}
+	logger.Infof("Latest release tag: %s", tag)
+
+	zipFile, err := downloadAndExtract(tag)
 	if err != nil {
 		logger.Errorf("Error downloading and extracting: %v\n", err)
 		os.Exit(1)
 	}
 
-	if err := copyTomlFiles(zipFile, basePath); err != nil {
+	if err := copyTomlFiles(zipFile, basePath, tag); err != nil {
 		logger.Errorf("Error copying TOML files: %v\n", err)
 		os.Exit(1)
 	}
@@ -46,11 +60,48 @@ func main() {
 	logger.Info("Successfully updated provider config")
 }
 
-// downloadAndExtract downloads the lego repository and extracts it
-func downloadAndExtract() (string, error) {
+// getLatestReleaseTag fetches the latest release tag from GitHub API
+func getLatestReleaseTag() (string, error) {
+	logger.Info("Fetching latest release tag...")
+
+	req, err := http.NewRequest("GET", githubAPIURL, nil)
+	if err != nil {
+		return "", err
+	}
+
+	// Add User-Agent header to avoid GitHub API limitations
+	req.Header.Set("User-Agent", "NGINX-UI-LegoConfigure")
+
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		return "", err
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode != http.StatusOK {
+		return "", fmt.Errorf("bad status from GitHub API: %s", resp.Status)
+	}
+
+	var release GitHubRelease
+	if err := json.NewDecoder(resp.Body).Decode(&release); err != nil {
+		return "", err
+	}
+
+	if release.TagName == "" {
+		return "", fmt.Errorf("no tag name found in the latest release")
+	}
+
+	return release.TagName, nil
+}
+
+// downloadAndExtract downloads the lego repository for a specific tag and extracts it
+func downloadAndExtract(tag string) (string, error) {
+	downloadURL := fmt.Sprintf("https://github.com/go-acme/lego/archive/refs/tags/%s.zip", tag)
+
 	// Download the file
-	logger.Info("Downloading lego repository...")
-	resp, err := http.Get(repoURL)
+	logger.Infof("Downloading lego repository for tag %s...", tag)
+	resp, err := http.Get(downloadURL)
 	if err != nil {
 		return "", err
 	}
@@ -61,7 +112,7 @@ func downloadAndExtract() (string, error) {
 	}
 
 	// Create the file
-	out, err := os.CreateTemp("", "lego-master.zip")
+	out, err := os.CreateTemp("", "lego-"+tag+".zip")
 	if err != nil {
 		return "", err
 	}
@@ -76,7 +127,7 @@ func downloadAndExtract() (string, error) {
 	return out.Name(), nil
 }
 
-func copyTomlFiles(zipFile, basePath string) error {
+func copyTomlFiles(zipFile, basePath, tag string) error {
 	// Open the zip file
 	logger.Info("Extracting files...")
 	zipReader, err := zip.OpenReader(zipFile)
@@ -86,9 +137,10 @@ func copyTomlFiles(zipFile, basePath string) error {
 	defer zipReader.Close()
 
 	// Extract files
+	tag = strings.TrimPrefix(tag, "v")
 	zfs := zipfs.New(&zipReader.Reader)
-	afero.Walk(zfs, "./lego-master/providers", func(path string, info os.FileInfo, err error) error {
-		if info.IsDir() {
+	afero.Walk(zfs, "./lego-"+tag+"/providers", func(path string, info os.FileInfo, err error) error {
+		if info == nil || info.IsDir() {
 			return nil
 		}
 		if !strings.HasSuffix(info.Name(), ".toml") {

+ 4 - 14
docs/zh_CN/guide/install-script-linux.md

@@ -22,20 +22,10 @@ install.sh install [OPTIONS]
 | `-p, --proxy <url>`   | 通过代理服务器下载 (`string`)<br/>例如:`-p http://127.0.0.1:8118` 或 `-p socks5://127.0.0.1:1080` |
 | `-r, --reverse-proxy` | 通过反向代理服务器下载 (`string`)<br/>例如:`-r https://cloud.nginxui.com/`                               |
 
-### 使用反向代理加速
-
-如果您在中国大陆,可能会遇到 GitHub 的网络问题。您可以通过以下命令设置代理服务器下载 Nginx UI,以加快下载速度。
-
-```bash
-export GH_PROXY=https://ghfast.top/
-```
-
-当以上地址不可用时,请检视 [GitHub Proxy](https://ghproxy.link/) 获得最新地址,或根据实际情况选择其他代理。
-
 ### 快速使用
 
 ```shell
-bash -c "$(curl -L ${GH_PROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ install
+bash -c "$(curl -L https://cloud.nginxui.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ install -r https://cloud.nginxui.com/
 ```
 
 一键安装脚本默认设置的监听端口为 `9000`,HTTP Challenge 端口默认为 `9180`。如果有端口冲突,请手动修改 `/usr/local/etc/nginx-ui/app.ini`,
@@ -65,12 +55,12 @@ install.sh remove [OPTIONS]
 
 ```shell [移除]
 # 删除 Nginx UI,但不包括配置和数据库文件
-bash -c "$(curl -L ${GH_PROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove
+bash -c "$(curl -L https://cloud.nginxui.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove
 ```
 
 ```shell [清除]
 # 删除所有 Nginx UI 文件,包括配置和数据库文件
-bash -c "$(curl -L ${GH_PROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove --purge
+bash -c "$(curl -L https://cloud.nginxui.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ remove --purge
 ```
 
 :::
@@ -90,7 +80,7 @@ install.sh help
 ### 快速使用
 
 ```shell
-bash -c "$(curl -L -s ${GH_PROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ help
+bash -c "$(curl -L -s https://cloud.nginxui.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ help
 ```
 
 ## 控制服务

+ 17 - 17
go.mod

@@ -28,7 +28,7 @@ require (
 	github.com/gorilla/websocket v1.5.3
 	github.com/jpillora/overseer v1.1.6
 	github.com/lib/pq v1.10.9
-	github.com/mark3labs/mcp-go v0.25.0
+	github.com/mark3labs/mcp-go v0.26.0
 	github.com/minio/selfupdate v0.6.0
 	github.com/nikoksr/notify v1.3.0
 	github.com/nxadm/tail v1.4.11
@@ -45,8 +45,8 @@ require (
 	github.com/uozi-tech/cosy v1.21.1
 	github.com/uozi-tech/cosy-driver-sqlite v0.2.1
 	github.com/urfave/cli/v3 v3.3.2
-	golang.org/x/crypto v0.37.0
-	golang.org/x/net v0.39.0
+	golang.org/x/crypto v0.38.0
+	golang.org/x/net v0.40.0
 	gopkg.in/ini.v1 v1.67.0
 	gorm.io/driver/sqlite v1.5.7
 	gorm.io/gen v0.3.27
@@ -180,7 +180,7 @@ require (
 	github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect
 	github.com/labbsr0x/goh v1.0.1 // indirect
 	github.com/leodido/go-urn v1.4.0 // indirect
-	github.com/linode/linodego v1.49.0 // indirect
+	github.com/linode/linodego v1.50.0 // indirect
 	github.com/liquidweb/liquidweb-cli v0.7.0 // indirect
 	github.com/liquidweb/liquidweb-go v1.6.4 // indirect
 	github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect
@@ -213,7 +213,7 @@ require (
 	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/opencontainers/image-spec v1.1.1 // indirect
 	github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
-	github.com/oracle/oci-go-sdk/v65 v65.89.3 // indirect
+	github.com/oracle/oci-go-sdk/v65 v65.90.0 // indirect
 	github.com/ovh/go-ovh v1.7.0 // indirect
 	github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
 	github.com/pelletier/go-toml/v2 v2.2.4 // indirect
@@ -260,9 +260,9 @@ require (
 	github.com/uozi-tech/cosy-driver-postgres v0.2.1 // indirect
 	github.com/vinyldns/go-vinyldns v0.9.16 // indirect
 	github.com/volcengine/volc-sdk-golang v1.0.206 // indirect
-	github.com/vultr/govultr/v3 v3.19.1 // indirect
+	github.com/vultr/govultr/v3 v3.20.0 // indirect
 	github.com/x448/float16 v0.8.4 // indirect
-	github.com/yandex-cloud/go-genproto v0.1.0 // indirect
+	github.com/yandex-cloud/go-genproto v0.2.0 // indirect
 	github.com/yandex-cloud/go-sdk v0.3.0 // indirect
 	github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
@@ -278,18 +278,18 @@ require (
 	go.uber.org/multierr v1.11.0 // indirect
 	go.uber.org/ratelimit v0.3.1 // indirect
 	go.uber.org/zap v1.27.0 // indirect
-	golang.org/x/arch v0.16.0 // indirect
+	golang.org/x/arch v0.17.0 // indirect
 	golang.org/x/mod v0.24.0 // indirect
-	golang.org/x/oauth2 v0.29.0 // indirect
-	golang.org/x/sync v0.13.0 // indirect
-	golang.org/x/sys v0.32.0 // indirect
-	golang.org/x/text v0.24.0 // indirect
+	golang.org/x/oauth2 v0.30.0 // indirect
+	golang.org/x/sync v0.14.0 // indirect
+	golang.org/x/sys v0.33.0 // indirect
+	golang.org/x/text v0.25.0 // indirect
 	golang.org/x/time v0.11.0 // indirect
-	golang.org/x/tools v0.32.0 // indirect
-	google.golang.org/api v0.231.0 // indirect
-	google.golang.org/genproto v0.0.0-20250428153025-10db94c68c34 // indirect
-	google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 // indirect
+	golang.org/x/tools v0.33.0 // indirect
+	google.golang.org/api v0.232.0 // indirect
+	google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 // indirect
 	google.golang.org/grpc v1.72.0 // indirect
 	google.golang.org/protobuf v1.36.6 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect

+ 38 - 0
go.sum

@@ -178,6 +178,7 @@ cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvj
 cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=
 cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs=
 cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
+cloud.google.com/go/compute v1.37.0 h1:XxtZlXYkZXub3LNaLu90TTemcFqIU1yZ4E4q9VlR39A=
 cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
 cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
 cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
@@ -792,6 +793,7 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
+github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -1315,6 +1317,7 @@ github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFr
 github.com/jarcoal/httpmock v1.0.8/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
 github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
 github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
+github.com/jarcoal/httpmock v1.4.0 h1:BvhqnH0JAYbNudL2GMJKgOHe2CtKlzJ/5rWKyp+hc2k=
 github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
 github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
 github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
@@ -1406,6 +1409,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
 github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/linode/linodego v1.49.0 h1:MNd3qwvQzbXB5mCpvdCqlUIu1RPA9oC+50LyB9kK+GQ=
 github.com/linode/linodego v1.49.0/go.mod h1:B+HAM3//4w1wOS0BwdaQBKwBxlfe6kYJ7bSC6jJ/xtc=
+github.com/linode/linodego v1.50.0 h1:5y79VvvQnWb5JyPIjTwyUrU3ArHcs7XZQFdkPS/lNpw=
+github.com/linode/linodego v1.50.0/go.mod h1:9S+REoPCtUNWCm63D1vjjxIJZfwEL2t2kTDnwt620FM=
 github.com/liquidweb/go-lwApi v0.0.0-20190605172801-52a4864d2738/go.mod h1:0sYF9rMXb0vlG+4SzdiGMXHheCZxjguMq+Zb4S2BfBs=
 github.com/liquidweb/go-lwApi v0.0.5/go.mod h1:0sYF9rMXb0vlG+4SzdiGMXHheCZxjguMq+Zb4S2BfBs=
 github.com/liquidweb/liquidweb-cli v0.6.9/go.mod h1:cE1uvQ+x24NGUL75D0QagOFCG8Wdvmwu8aL9TLmA/eQ=
@@ -1423,6 +1428,8 @@ github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPK
 github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
 github.com/mark3labs/mcp-go v0.25.0 h1:UUpcMT3L5hIhuDy7aifj4Bphw4Pfx1Rf8mzMXDe8RQw=
 github.com/mark3labs/mcp-go v0.25.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
+github.com/mark3labs/mcp-go v0.26.0 h1:xz/Kv1cHLYovF8txv6btBM39/88q3YOjnxqhi51jB0w=
+github.com/mark3labs/mcp-go v0.26.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -1585,6 +1592,8 @@ github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mo
 github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE=
 github.com/oracle/oci-go-sdk/v65 v65.89.3 h1:KSUykb5Ou54jF4SeJNjBwcDg+umbAwcvT+xhrvNDog0=
 github.com/oracle/oci-go-sdk/v65 v65.89.3/go.mod h1:u6XRPsw9tPziBh76K7GrrRXPa8P8W3BQeqJ6ZZt9VLA=
+github.com/oracle/oci-go-sdk/v65 v65.90.0 h1:XGoPkq0oThnIzmreyWOG3PkP3r1I1JrEWxOlGocJXt0=
+github.com/oracle/oci-go-sdk/v65 v65.90.0/go.mod h1:u6XRPsw9tPziBh76K7GrrRXPa8P8W3BQeqJ6ZZt9VLA=
 github.com/ovh/go-ovh v1.7.0 h1:V14nF7FwDjQrZt9g7jzcvAAQ3HN6DNShRFRMC3jLoPw=
 github.com/ovh/go-ovh v1.7.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
@@ -1849,6 +1858,8 @@ github.com/volcengine/volc-sdk-golang v1.0.206 h1:7NG8FCpvu9wbx+Z4I/p3tcTS2zdBqT
 github.com/volcengine/volc-sdk-golang v1.0.206/go.mod h1:stZX+EPgv1vF4nZwOlEe8iGcriUPRBKX8zA19gXycOQ=
 github.com/vultr/govultr/v3 v3.19.1 h1:31rOP5Tz40AOc8h6Ws4ryzqAniUBffgRhy9uMG/EFvs=
 github.com/vultr/govultr/v3 v3.19.1/go.mod h1:q34Wd76upKmf+vxFMgaNMH3A8BbsPBmSYZUGC8oZa5w=
+github.com/vultr/govultr/v3 v3.20.0 h1:O+Om6gXpN6ehwAIIKq5DyGuekpyHaoRlwrxTb44bDzA=
+github.com/vultr/govultr/v3 v3.20.0/go.mod h1:q34Wd76upKmf+vxFMgaNMH3A8BbsPBmSYZUGC8oZa5w=
 github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
@@ -1862,6 +1873,8 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/yandex-cloud/go-genproto v0.1.0 h1:X/z0b1BdkZxJnJFh1enoGxuKENFaeGQJ2gjIZtGSajU=
 github.com/yandex-cloud/go-genproto v0.1.0/go.mod h1:0LDD/IZLIUIV4iPH+YcF+jysO3jkSvADFGm4dCAuwQo=
+github.com/yandex-cloud/go-genproto v0.2.0 h1:r/K224sA9c2KYZVWk2Tdcq7qPl9E0npIM3hNfmi9qg0=
+github.com/yandex-cloud/go-genproto v0.2.0/go.mod h1:0LDD/IZLIUIV4iPH+YcF+jysO3jkSvADFGm4dCAuwQo=
 github.com/yandex-cloud/go-sdk v0.3.0 h1:1lRrzBbcTpX4ZFXJnJZyCkNKWDvtiFC4USrbuNQUEQQ=
 github.com/yandex-cloud/go-sdk v0.3.0/go.mod h1:dx7ojE5bXWhvsWWJ8kvgvb35X5bbNS3RNgBSgaTW9jA=
 github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
@@ -1959,6 +1972,8 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
 go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
 golang.org/x/arch v0.16.0 h1:foMtLTdyOmIniqWCHjY6+JxuC54XP1fDwx4N0ASyW+U=
 golang.org/x/arch v0.16.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE=
+golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU=
+golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -1998,6 +2013,8 @@ golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZP
 golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
 golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
 golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -2138,6 +2155,8 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
 golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
 golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -2169,6 +2188,8 @@ golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw
 golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
 golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
 golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -2187,6 +2208,8 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
 golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
+golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -2311,6 +2334,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
 golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -2329,6 +2354,7 @@ golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
 golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
 golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
 golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -2350,6 +2376,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
 golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -2436,6 +2464,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
 golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
 golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
+golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
+golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
 golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -2514,6 +2544,8 @@ google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45
 google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms=
 google.golang.org/api v0.231.0 h1:LbUD5FUl0C4qwia2bjXhCMH65yz1MLPzA/0OYEsYY7Q=
 google.golang.org/api v0.231.0/go.mod h1:H52180fPI/QQlUc0F4xWfGZILdv09GCWKt2bcsn164A=
+google.golang.org/api v0.232.0 h1:qGnmaIMf7KcuwHOlF3mERVzChloDYwRfOJOrHt8YC3I=
+google.golang.org/api v0.232.0/go.mod h1:p9QCfBWZk1IJETUdbTKloR5ToFdKbYh2fkjsUL6vNoY=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -2656,10 +2688,16 @@ google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOl
 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
 google.golang.org/genproto v0.0.0-20250428153025-10db94c68c34 h1:oklGWmm0ZiCw4efmdYZo5MF9t6nRvGzM5+0klSjOmGM=
 google.golang.org/genproto v0.0.0-20250428153025-10db94c68c34/go.mod h1:hiH/EqX5GBdTyIpkqMqDGUHDiBniln8b4FCw+NzPxQY=
+google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78=
+google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk=
 google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 h1:0PeQib/pH3nB/5pEmFeVQJotzGohV0dq4Vcp09H5yhE=
 google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34/go.mod h1:0awUlEkap+Pb1UMeJwJQQAdJQrt3moU7J2moTy69irI=
+google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0=
+google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 h1:h6p3mQqrmT1XkHVTfzLdNz1u7IhINeZkz67/xTbOuWs=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=

+ 226 - 38
install.sh

@@ -6,6 +6,13 @@ DataPath=${DATA_PATH:-/usr/local/etc/nginx-ui}
 
 # Service Path
 ServicePath="/etc/systemd/system/nginx-ui.service"
+# Init.d Path
+InitPath="/etc/init.d/nginx-ui"
+# OpenRC Path
+OpenRCPath="/etc/init.d/nginx-ui"
+
+# Service Type (systemd, openrc, initd)
+SERVICE_TYPE=''
 
 # Latest release version
 RELEASE_LATEST=''
@@ -167,13 +174,14 @@ identify_the_operating_system_and_architecture() {
         # Do not combine this judgment condition with the following judgment condition.
         ## Be aware of Linux distribution like Gentoo, which kernel supports switch between Systemd and OpenRC.
         if [[ -f /.dockerenv ]] || grep -q 'docker\|lxc' /proc/1/cgroup && [[ "$(type -P systemctl)" ]]; then
-            true
+            SERVICE_TYPE='systemd'
         elif [[ -d /run/systemd/system ]] || grep -q systemd <(ls -l /sbin/init); then
-            true
+            SERVICE_TYPE='systemd'
+        elif [[ "$(type -P rc-update)" ]]; then
+            SERVICE_TYPE='openrc'
         else
-            echo -e "${FontRed}error: Only Linux distributions using systemd are supported by this script."
-            echo -e "${FontRed}error: Please download the pre-built binary from the release page or build it manually.${FontSuffix}"
-            exit 1
+            SERVICE_TYPE='initd'
+            echo -e "${FontYellow}warning: No systemd or OpenRC detected, falling back to init.d.${FontSuffix}"
         fi
         if [[ "$(type -P apt)" ]]; then
             PACKAGE_MANAGEMENT_INSTALL='apt -y --no-install-recommends install'
@@ -190,6 +198,12 @@ identify_the_operating_system_and_architecture() {
         elif [[ "$(type -P pacman)" ]]; then
             PACKAGE_MANAGEMENT_INSTALL='pacman -Syu --noconfirm'
             PACKAGE_MANAGEMENT_REMOVE='pacman -Rsn'
+        elif [[ "$(type -P opkg)" ]]; then
+            PACKAGE_MANAGEMENT_INSTALL='opkg install'
+            PACKAGE_MANAGEMENT_REMOVE='opkg remove'
+        elif [[ "$(type -P apk)" ]]; then
+            PACKAGE_MANAGEMENT_INSTALL='apk add --no-cache'
+            PACKAGE_MANAGEMENT_REMOVE='apk del'
         else
             echo -e "${FontRed}error: This script does not support the package manager in this operating system.${FontSuffix}"
             exit 1
@@ -262,25 +276,25 @@ install_bin() {
 }
 
 install_service() {
+    if [[ "$SERVICE_TYPE" == "systemd" ]]; then
+        install_systemd_service
+    elif [[ "$SERVICE_TYPE" == "openrc" ]]; then
+        install_openrc_service
+    else
+        install_initd_service
+    fi
+}
+
+install_systemd_service() {
     mkdir -p '/etc/systemd/system/nginx-ui.service.d'
-cat > "$ServicePath" << EOF
-[Unit]
-Description=Yet another WebUI for Nginx
-Documentation=https://github.com/0xJacky/nginx-ui
-After=network.target
-
-[Service]
-Type=simple
-ExecStart=/usr/local/bin/nginx-ui -config /usr/local/etc/nginx-ui/app.ini
-RuntimeDirectory=nginx-ui
-WorkingDirectory=/var/run/nginx-ui
-Restart=on-failure
-TimeoutStopSec=5
-KillMode=mixed
-
-[Install]
-WantedBy=multi-user.target
-EOF
+    local service_download_link="${RPROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/resources/services/nginx-ui.service"
+
+    echo "Downloading Nginx UI service file: $service_download_link"
+    if ! curl -x "${PROXY}" -R -H 'Cache-Control: no-cache' -L -o "$ServicePath" "$service_download_link"; then
+        echo -e "${FontRed}error: Download service file failed! Please check your network or try again.${FontSuffix}"
+        return 1
+    fi
+
     chmod 644 "$ServicePath"
     echo "info: Systemd service files have been installed successfully!"
     echo -e "${FontGreen}note: The following are the actual parameters for the nginx-ui service startup."
@@ -290,6 +304,51 @@ EOF
     SYSTEMD='1'
 }
 
+install_openrc_service() {
+    local openrc_download_link="${RPROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/resources/services/nginx-ui.rc"
+
+    echo "Downloading Nginx UI OpenRC file: $openrc_download_link"
+    if ! curl -x "${PROXY}" -R -H 'Cache-Control: no-cache' -L -o "$OpenRCPath" "$openrc_download_link"; then
+        echo -e "${FontRed}error: Download OpenRC file failed! Please check your network or try again.${FontSuffix}"
+        return 1
+    fi
+
+    chmod 755 "$OpenRCPath"
+    echo "info: OpenRC service file has been installed successfully!"
+    echo -e "${FontGreen}note: The OpenRC service is installed to '$OpenRCPath'.${FontSuffix}"
+    cat_file_with_name "$OpenRCPath"
+
+    # Add to default runlevel
+    rc-update add nginx-ui default
+
+    OPENRC='1'
+}
+
+install_initd_service() {
+    # Download init.d script
+    local initd_download_link="${RPROXY}https://raw.githubusercontent.com/0xJacky/nginx-ui/main/resources/services/nginx-ui.init"
+
+    echo "Downloading Nginx UI init.d file: $initd_download_link"
+    if ! curl -x "${PROXY}" -R -H 'Cache-Control: no-cache' -L -o "$InitPath" "$initd_download_link"; then
+        echo -e "${FontRed}error: Download init.d file failed! Please check your network or try again.${FontSuffix}"
+        exit 1
+    fi
+
+    chmod 755 "$InitPath"
+    echo "info: Init.d service file has been installed successfully!"
+    echo -e "${FontGreen}note: The init.d service is installed to '$InitPath'.${FontSuffix}"
+    cat_file_with_name "$InitPath"
+
+    # Add service to startup based on distro
+    if [ -x /sbin/chkconfig ]; then
+        /sbin/chkconfig --add nginx-ui
+    elif [ -x /usr/sbin/update-rc.d ]; then
+        /usr/sbin/update-rc.d nginx-ui defaults
+    fi
+
+    INITD='1'
+}
+
 install_config() {
     mkdir -p "$DataPath"
     if [[ ! -f "$DataPath/app.ini" ]]; then
@@ -317,7 +376,7 @@ EOF
 }
 
 start_nginx_ui() {
-    if [[ -f "$ServicePath" ]]; then
+    if [[ "$SERVICE_TYPE" == "systemd" ]]; then
         systemctl start nginx-ui
         sleep 1s
         if systemctl -q is-active nginx-ui; then
@@ -326,19 +385,51 @@ start_nginx_ui() {
             echo -e "${FontRed}error: Failed to start the Nginx UI service.${FontSuffix}"
             exit 1
         fi
+    elif [[ "$SERVICE_TYPE" == "openrc" ]]; then
+        rc-service nginx-ui start
+        sleep 1s
+        if rc-service nginx-ui status | grep -q "started"; then
+            echo 'info: Start the Nginx UI service.'
+        else
+            echo -e "${FontRed}error: Failed to start the Nginx UI service.${FontSuffix}"
+            exit 1
+        fi
+    else
+        # init.d
+        $InitPath start
+        sleep 1s
+        if $InitPath status >/dev/null 2>&1; then
+            echo 'info: Start the Nginx UI service.'
+        else
+            echo -e "${FontRed}error: Failed to start the Nginx UI service.${FontSuffix}"
+            exit 1
+        fi
     fi
 }
 
 stop_nginx_ui() {
-    if ! systemctl stop nginx-ui; then
-        echo -e "${FontRed}error: Failed to stop the Nginx UI service.${FontSuffix}"
-        exit 1
+    if [[ "$SERVICE_TYPE" == "systemd" ]]; then
+        if ! systemctl stop nginx-ui; then
+            echo -e "${FontRed}error: Failed to stop the Nginx UI service.${FontSuffix}"
+            exit 1
+        fi
+    elif [[ "$SERVICE_TYPE" == "openrc" ]]; then
+        if ! rc-service nginx-ui stop; then
+            echo -e "${FontRed}error: Failed to stop the Nginx UI service.${FontSuffix}"
+            exit 1
+        fi
+    else
+        # init.d
+        if ! $InitPath stop; then
+            echo -e "${FontRed}error: Failed to stop the Nginx UI service.${FontSuffix}"
+            exit 1
+        fi
     fi
     echo "info: Nginx UI service Stopped."
 }
 
 remove_nginx_ui() {
-  if systemctl list-unit-files | grep -qw 'nginx-ui'; then
+  if [[ "$SERVICE_TYPE" == "systemd" && $(systemctl list-unit-files | grep -qw 'nginx-ui') ]]; then
     if [[ -n "$(pidof nginx-ui)" ]]; then
       stop_nginx_ui
     fi
@@ -364,6 +455,66 @@ remove_nginx_ui() {
       fi
       exit 0
     fi
+  elif [[ "$SERVICE_TYPE" == "openrc" && -f "$OpenRCPath" ]]; then
+    if rc-service nginx-ui status | grep -q "started"; then
+      stop_nginx_ui
+    fi
+    local delete_files=('/usr/local/bin/nginx-ui' "$OpenRCPath")
+    if [[ "$PURGE" -eq '1' ]]; then
+        [[ -d "$DataPath" ]] && delete_files+=("$DataPath")
+    fi
+
+    # Remove from runlevels
+    rc-update del nginx-ui default
+
+    if ! ("rm" -r "${delete_files[@]}"); then
+      echo -e "${FontRed}error: Failed to remove Nginx UI.${FontSuffix}"
+      exit 1
+    else
+      for i in "${!delete_files[@]}"
+      do
+        echo "removed: ${delete_files[$i]}"
+      done
+      echo "You may need to execute a command to remove dependent software: $PACKAGE_MANAGEMENT_REMOVE curl"
+      echo 'info: Nginx UI has been removed.'
+      if [[ "$PURGE" -eq '0' ]]; then
+        echo 'info: If necessary, manually delete the configuration and log files.'
+        echo "info: e.g., $DataPath ..."
+      fi
+      exit 0
+    fi
+  elif [[ "$SERVICE_TYPE" == "initd" && -f "$InitPath" ]]; then
+    if [[ -n "$(pidof nginx-ui)" ]]; then
+      stop_nginx_ui
+    fi
+    local delete_files=('/usr/local/bin/nginx-ui' "$InitPath")
+    if [[ "$PURGE" -eq '1' ]]; then
+        [[ -d "$DataPath" ]] && delete_files+=("$DataPath")
+    fi
+
+    # Remove from startup based on distro
+    if [ -x /sbin/chkconfig ]; then
+        /sbin/chkconfig --del nginx-ui
+    elif [ -x /usr/sbin/update-rc.d ]; then
+        /usr/sbin/update-rc.d -f nginx-ui remove
+    fi
+
+    if ! ("rm" -r "${delete_files[@]}"); then
+      echo -e "${FontRed}error: Failed to remove Nginx UI.${FontSuffix}"
+      exit 1
+    else
+      for i in "${!delete_files[@]}"
+      do
+        echo "removed: ${delete_files[$i]}"
+      done
+      echo "You may need to execute a command to remove dependent software: $PACKAGE_MANAGEMENT_REMOVE curl"
+      echo 'info: Nginx UI has been removed.'
+      if [[ "$PURGE" -eq '0' ]]; then
+        echo 'info: If necessary, manually delete the configuration and log files.'
+        echo "info: e.g., $DataPath ..."
+      fi
+      exit 0
+    fi
   else
     echo 'error: Nginx UI is not installed.'
     exit 1
@@ -421,18 +572,34 @@ main() {
     fi
 
     # Determine if nginx-ui is running
-    if systemctl list-unit-files | grep -qw 'nginx-ui'; then
+    NGINX_UI_RUNNING='0'
+    if [[ "$SERVICE_TYPE" == "systemd" && $(systemctl list-unit-files | grep -qw 'nginx-ui') ]]; then
+        if [[ -n "$(pidof nginx-ui)" ]]; then
+            stop_nginx_ui
+            NGINX_UI_RUNNING='1'
+        fi
+    elif [[ "$SERVICE_TYPE" == "openrc" && -f "$OpenRCPath" ]]; then
+        if rc-service nginx-ui status | grep -q "started"; then
+            stop_nginx_ui
+            NGINX_UI_RUNNING='1'
+        fi
+    elif [[ "$SERVICE_TYPE" == "initd" && -f "$InitPath" ]]; then
         if [[ -n "$(pidof nginx-ui)" ]]; then
             stop_nginx_ui
             NGINX_UI_RUNNING='1'
         fi
     fi
+
     install_bin
     echo 'installed: /usr/local/bin/nginx-ui'
 
     install_service
-    if [[ "$SYSTEMD" -eq '1' ]]; then
+    if [[ "$SERVICE_TYPE" == "systemd" && "$SYSTEMD" -eq '1' ]]; then
         echo "installed: ${ServicePath}"
+    elif [[ "$SERVICE_TYPE" == "openrc" && "$OPENRC" -eq '1' ]]; then
+        echo "installed: ${OpenRCPath}"
+    elif [[ "$SERVICE_TYPE" == "initd" && "$INITD" -eq '1' ]]; then
+        echo "installed: ${InitPath}"
     fi
 
     "rm" -r "$TMP_DIRECTORY"
@@ -444,14 +611,35 @@ main() {
     if [[ "$NGINX_UI_RUNNING" -eq '1' ]]; then
         start_nginx_ui
     else
-        systemctl start nginx-ui
-        systemctl enable nginx-ui
-        sleep 1s
-
-        if systemctl -q is-active nginx-ui; then
-            echo "info: Start and enable the Nginx UI service."
-        else
-            echo -e "${FontYellow}warning: Failed to enable and start the Nginx UI service.${FontSuffix}"
+        if [[ "$SERVICE_TYPE" == "systemd" ]]; then
+            systemctl start nginx-ui
+            systemctl enable nginx-ui
+            sleep 1s
+
+            if systemctl -q is-active nginx-ui; then
+                echo "info: Start and enable the Nginx UI service."
+            else
+                echo -e "${FontYellow}warning: Failed to enable and start the Nginx UI service.${FontSuffix}"
+            fi
+        elif [[ "$SERVICE_TYPE" == "openrc" ]]; then
+            rc-service nginx-ui start
+            rc-update add nginx-ui default
+            sleep 1s
+
+            if rc-service nginx-ui status | grep -q "started"; then
+                echo "info: Started and added the Nginx UI service to default runlevel."
+            else
+                echo -e "${FontYellow}warning: Failed to start the Nginx UI service.${FontSuffix}"
+            fi
+        elif [[ "$SERVICE_TYPE" == "initd" ]]; then
+            $InitPath start
+            sleep 1s
+
+            if $InitPath status >/dev/null 2>&1; then
+                echo "info: Started the Nginx UI service."
+            else
+                echo -e "${FontYellow}warning: Failed to start the Nginx UI service.${FontSuffix}"
+            fi
         fi
     fi
 }

+ 4 - 2
internal/self_check/tasks.go

@@ -118,8 +118,10 @@ func init() {
 	if helper.InNginxUIOfficialDocker() {
 		selfCheckTasks = append(selfCheckTasks, &Task{
 			Name:        translation.C("Docker socket exists"),
-			Description: translation.C("Check if the docker socket exists."),
-			CheckFunc:   CheckDockerSocket,
+			Description: translation.C("Check if /var/run/docker.sock exists. If you are using Nginx UI Official " +
+				"Docker Image, please make sure the docker socket is mounted like this: `-" +
+				"v /var/run/docker.sock:/var/run/docker.sock`."),
+			CheckFunc: CheckDockerSocket,
 		})
 	}
 }

+ 2 - 4
internal/upgrader/upgrade.go

@@ -17,7 +17,6 @@ import (
 	_github "github.com/0xJacky/Nginx-UI/.github"
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"github.com/0xJacky/Nginx-UI/internal/version"
-	"github.com/0xJacky/Nginx-UI/settings"
 	"github.com/minio/selfupdate"
 	"github.com/pkg/errors"
 	"github.com/uozi-tech/cosy/logger"
@@ -154,8 +153,7 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
 		return
 	}
 
-	githubProxy := settings.HTTPSettings.GithubProxy
-	if githubProxy != "" && u.Channel != string(version.ReleaseTypeDev) {
+	if u.Channel != string(version.ReleaseTypeDev) {
 		digest.BrowserDownloadUrl = version.GetUrl(digest.BrowserDownloadUrl)
 	}
 
@@ -169,7 +167,7 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
 
 	dir := filepath.Dir(u.ExPath)
 
-	if githubProxy != "" && u.Channel != string(version.ReleaseTypeDev) {
+	if u.Channel != string(version.ReleaseTypeDev) {
 		downloadUrl = version.GetUrl(downloadUrl)
 	}
 

+ 67 - 0
resources/services/nginx-ui.init

@@ -0,0 +1,67 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides:          nginx-ui
+# Required-Start:    $network $remote_fs $local_fs
+# Required-Stop:     $network $remote_fs $local_fs
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Start or stop the Nginx UI
+### END INIT INFO
+
+NAME="nginx-ui"
+DAEMON="/usr/local/bin/$NAME"
+PIDFILE="/var/run/$NAME.pid"
+CONFIG="/usr/local/etc/nginx-ui/app.ini"
+
+[ -x "$DAEMON" ] || exit 0
+
+start() {
+    echo "Starting $NAME..."
+    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec $DAEMON -- $CONFIG
+    echo "$NAME started"
+}
+
+stop() {
+    echo "Stopping $NAME..."
+    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
+    rm -f $PIDFILE
+    echo "$NAME stopped"
+}
+
+status() {
+    if [ -f $PIDFILE ]; then
+        PID=$(cat $PIDFILE)
+        if kill -0 $PID > /dev/null 2>&1; then
+            echo "$NAME is running (PID: $PID)"
+            exit 0
+        else
+            echo "$NAME is not running (stale PID file)"
+            exit 1
+        fi
+    else
+        echo "$NAME is not running"
+        exit 3
+    fi
+}
+
+case "$1" in
+    start)
+        start
+        ;;
+    stop)
+        stop
+        ;;
+    restart)
+        stop
+        start
+        ;;
+    status)
+        status
+        ;;
+    *)
+        echo "Usage: $0 {start|stop|restart|status}"
+        exit 1
+        ;;
+esac
+
+exit 0

+ 39 - 0
resources/services/nginx-ui.rc

@@ -0,0 +1,39 @@
+#!/sbin/openrc-run
+
+name="nginx-ui"
+description="Nginx UI - Yet another WebUI for Nginx"
+supervisor=supervise-daemon
+command="/usr/local/bin/nginx-ui"
+command_args="-config /usr/local/etc/nginx-ui/app.ini"
+pidfile="/run/${RC_SVCNAME}.pid"
+command_user="root:root"
+
+extra_commands="status"
+
+depend() {
+    need net
+    after logger firewall
+    use dns
+    after nginx
+}
+
+start_pre() {
+    checkpath --directory --owner $command_user --mode 0755 /run
+    checkpath --directory --owner $command_user --mode 0755 /usr/local/etc/nginx-ui
+}
+
+status() {
+    if [ -f "${pidfile}" ]; then
+        PID=$(cat "${pidfile}")
+        if kill -0 $PID >/dev/null 2>&1; then
+            einfo "${name} is running (PID: $PID)"
+            return 0
+        else
+            ewarn "${name} is not running (stale PID file)"
+            return 1
+        fi
+    else
+        einfo "${name} is not running"
+        return 3
+    fi
+}

+ 0 - 0
nginx-ui.service → resources/services/nginx-ui.service


Some files were not shown because too many files changed in this diff