1
0
Эх сурвалжийг харах

Merge pull request #1008 from 0xJacky/dev

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

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

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 178 - 175
app/src/language/es/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 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.
 // This file is auto-generated. DO NOT EDIT MANUALLY.
 
 
 export const msg = [
 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.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('Nginx error log path exists'),
   $gettext('Check if the 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('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('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 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 configuration entry file exists'),
   $gettext('Check if the nginx access log path 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] 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] 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'),
 ]
 ]

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 195 - 175
app/src/language/ja_JP/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 196 - 169
app/src/language/ko_KR/app.po


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

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

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 180 - 175
app/src/language/pt_PT/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 172 - 175
app/src/language/ru_RU/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 174 - 186
app/src/language/tr_TR/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 172 - 187
app/src/language/uk_UA/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 175 - 185
app/src/language/vi_VN/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 236 - 170
app/src/language/zh_CN/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 240 - 174
app/src/language/zh_TW/app.po


+ 64 - 12
cmd/lego_config/main.go

@@ -3,6 +3,7 @@ package main
 
 
 import (
 import (
 	"archive/zip"
 	"archive/zip"
+	"encoding/json"
 	"fmt"
 	"fmt"
 	"io"
 	"io"
 	"net/http"
 	"net/http"
@@ -17,9 +18,14 @@ import (
 	"github.com/uozi-tech/cosy/logger"
 	"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 (
 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() {
 func main() {
@@ -32,13 +38,21 @@ func main() {
 	}
 	}
 	basePath := filepath.Join(filepath.Dir(file), "../../")
 	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 {
 	if err != nil {
 		logger.Errorf("Error downloading and extracting: %v\n", err)
 		logger.Errorf("Error downloading and extracting: %v\n", err)
 		os.Exit(1)
 		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)
 		logger.Errorf("Error copying TOML files: %v\n", err)
 		os.Exit(1)
 		os.Exit(1)
 	}
 	}
@@ -46,11 +60,48 @@ func main() {
 	logger.Info("Successfully updated provider config")
 	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
 	// 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 {
 	if err != nil {
 		return "", err
 		return "", err
 	}
 	}
@@ -61,7 +112,7 @@ func downloadAndExtract() (string, error) {
 	}
 	}
 
 
 	// Create the file
 	// Create the file
-	out, err := os.CreateTemp("", "lego-master.zip")
+	out, err := os.CreateTemp("", "lego-"+tag+".zip")
 	if err != nil {
 	if err != nil {
 		return "", err
 		return "", err
 	}
 	}
@@ -76,7 +127,7 @@ func downloadAndExtract() (string, error) {
 	return out.Name(), nil
 	return out.Name(), nil
 }
 }
 
 
-func copyTomlFiles(zipFile, basePath string) error {
+func copyTomlFiles(zipFile, basePath, tag string) error {
 	// Open the zip file
 	// Open the zip file
 	logger.Info("Extracting files...")
 	logger.Info("Extracting files...")
 	zipReader, err := zip.OpenReader(zipFile)
 	zipReader, err := zip.OpenReader(zipFile)
@@ -86,9 +137,10 @@ func copyTomlFiles(zipFile, basePath string) error {
 	defer zipReader.Close()
 	defer zipReader.Close()
 
 
 	// Extract files
 	// Extract files
+	tag = strings.TrimPrefix(tag, "v")
 	zfs := zipfs.New(&zipReader.Reader)
 	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
 			return nil
 		}
 		}
 		if !strings.HasSuffix(info.Name(), ".toml") {
 		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` |
 | `-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/`                               |
 | `-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
 ```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`,
 一键安装脚本默认设置的监听端口为 `9000`,HTTP Challenge 端口默认为 `9180`。如果有端口冲突,请手动修改 `/usr/local/etc/nginx-ui/app.ini`,
@@ -65,12 +55,12 @@ install.sh remove [OPTIONS]
 
 
 ```shell [移除]
 ```shell [移除]
 # 删除 Nginx UI,但不包括配置和数据库文件
 # 删除 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 [清除]
 ```shell [清除]
 # 删除所有 Nginx UI 文件,包括配置和数据库文件
 # 删除所有 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
 ```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/gorilla/websocket v1.5.3
 	github.com/jpillora/overseer v1.1.6
 	github.com/jpillora/overseer v1.1.6
 	github.com/lib/pq v1.10.9
 	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/minio/selfupdate v0.6.0
 	github.com/nikoksr/notify v1.3.0
 	github.com/nikoksr/notify v1.3.0
 	github.com/nxadm/tail v1.4.11
 	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 v1.21.1
 	github.com/uozi-tech/cosy-driver-sqlite v0.2.1
 	github.com/uozi-tech/cosy-driver-sqlite v0.2.1
 	github.com/urfave/cli/v3 v3.3.2
 	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
 	gopkg.in/ini.v1 v1.67.0
 	gorm.io/driver/sqlite v1.5.7
 	gorm.io/driver/sqlite v1.5.7
 	gorm.io/gen v0.3.27
 	gorm.io/gen v0.3.27
@@ -180,7 +180,7 @@ require (
 	github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect
 	github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect
 	github.com/labbsr0x/goh v1.0.1 // indirect
 	github.com/labbsr0x/goh v1.0.1 // indirect
 	github.com/leodido/go-urn v1.4.0 // 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-cli v0.7.0 // indirect
 	github.com/liquidweb/liquidweb-go v1.6.4 // indirect
 	github.com/liquidweb/liquidweb-go v1.6.4 // indirect
 	github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // 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/go-digest v1.0.0 // indirect
 	github.com/opencontainers/image-spec v1.1.1 // indirect
 	github.com/opencontainers/image-spec v1.1.1 // indirect
 	github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // 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/ovh/go-ovh v1.7.0 // indirect
 	github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
 	github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
 	github.com/pelletier/go-toml/v2 v2.2.4 // 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/uozi-tech/cosy-driver-postgres v0.2.1 // indirect
 	github.com/vinyldns/go-vinyldns v0.9.16 // indirect
 	github.com/vinyldns/go-vinyldns v0.9.16 // indirect
 	github.com/volcengine/volc-sdk-golang v1.0.206 // 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/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/yandex-cloud/go-sdk v0.3.0 // indirect
 	github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
 	github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // 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/multierr v1.11.0 // indirect
 	go.uber.org/ratelimit v0.3.1 // indirect
 	go.uber.org/ratelimit v0.3.1 // indirect
 	go.uber.org/zap v1.27.0 // 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/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/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/grpc v1.72.0 // indirect
 	google.golang.org/protobuf v1.36.6 // indirect
 	google.golang.org/protobuf v1.36.6 // indirect
 	gopkg.in/inf.v0 v0.9.1 // 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.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.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.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.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.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
 cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
 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.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.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
 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 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.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/cespare/xxhash/v2 v2.1.2/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.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 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
 github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
 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/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/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=
 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/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 h1:MNd3qwvQzbXB5mCpvdCqlUIu1RPA9oC+50LyB9kK+GQ=
 github.com/linode/linodego v1.49.0/go.mod h1:B+HAM3//4w1wOS0BwdaQBKwBxlfe6kYJ7bSC6jJ/xtc=
 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.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/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=
 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/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 h1:UUpcMT3L5hIhuDy7aifj4Bphw4Pfx1Rf8mzMXDe8RQw=
 github.com/mark3labs/mcp-go v0.25.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
 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.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.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 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/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 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.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 h1:V14nF7FwDjQrZt9g7jzcvAAQ3HN6DNShRFRMC3jLoPw=
 github.com/ovh/go-ovh v1.7.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c=
 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=
 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/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 h1:31rOP5Tz40AOc8h6Ws4ryzqAniUBffgRhy9uMG/EFvs=
 github.com/vultr/govultr/v3 v3.19.1/go.mod h1:q34Wd76upKmf+vxFMgaNMH3A8BbsPBmSYZUGC8oZa5w=
 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 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 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=
 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/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 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.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 h1:1lRrzBbcTpX4ZFXJnJZyCkNKWDvtiFC4USrbuNQUEQQ=
 github.com/yandex-cloud/go-sdk v0.3.0/go.mod h1:dx7ojE5bXWhvsWWJ8kvgvb35X5bbNS3RNgBSgaTW9jA=
 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=
 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=
 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 h1:foMtLTdyOmIniqWCHjY6+JxuC54XP1fDwx4N0ASyW+U=
 golang.org/x/arch v0.16.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE=
 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-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-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 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.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 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
 golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
 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-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-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
 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.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-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-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/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.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 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
 golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
 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-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-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/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.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 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
 golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 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-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-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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.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 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
 golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 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-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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 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.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
 golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
 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.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.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.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
 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.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-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-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/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.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
 golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
 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.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-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-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/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.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms=
 google.golang.org/api v0.231.0 h1:LbUD5FUl0C4qwia2bjXhCMH65yz1MLPzA/0OYEsYY7Q=
 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.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.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.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.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-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 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-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 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-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 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-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.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 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
 # Service Path
 ServicePath="/etc/systemd/system/nginx-ui.service"
 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
 # Latest release version
 RELEASE_LATEST=''
 RELEASE_LATEST=''
@@ -167,13 +174,14 @@ identify_the_operating_system_and_architecture() {
         # Do not combine this judgment condition with the following judgment condition.
         # 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.
         ## 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
         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
         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
         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
         fi
         if [[ "$(type -P apt)" ]]; then
         if [[ "$(type -P apt)" ]]; then
             PACKAGE_MANAGEMENT_INSTALL='apt -y --no-install-recommends install'
             PACKAGE_MANAGEMENT_INSTALL='apt -y --no-install-recommends install'
@@ -190,6 +198,12 @@ identify_the_operating_system_and_architecture() {
         elif [[ "$(type -P pacman)" ]]; then
         elif [[ "$(type -P pacman)" ]]; then
             PACKAGE_MANAGEMENT_INSTALL='pacman -Syu --noconfirm'
             PACKAGE_MANAGEMENT_INSTALL='pacman -Syu --noconfirm'
             PACKAGE_MANAGEMENT_REMOVE='pacman -Rsn'
             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
         else
             echo -e "${FontRed}error: This script does not support the package manager in this operating system.${FontSuffix}"
             echo -e "${FontRed}error: This script does not support the package manager in this operating system.${FontSuffix}"
             exit 1
             exit 1
@@ -262,25 +276,25 @@ install_bin() {
 }
 }
 
 
 install_service() {
 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'
     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"
     chmod 644 "$ServicePath"
     echo "info: Systemd service files have been installed successfully!"
     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."
     echo -e "${FontGreen}note: The following are the actual parameters for the nginx-ui service startup."
@@ -290,6 +304,51 @@ EOF
     SYSTEMD='1'
     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() {
 install_config() {
     mkdir -p "$DataPath"
     mkdir -p "$DataPath"
     if [[ ! -f "$DataPath/app.ini" ]]; then
     if [[ ! -f "$DataPath/app.ini" ]]; then
@@ -317,7 +376,7 @@ EOF
 }
 }
 
 
 start_nginx_ui() {
 start_nginx_ui() {
-    if [[ -f "$ServicePath" ]]; then
+    if [[ "$SERVICE_TYPE" == "systemd" ]]; then
         systemctl start nginx-ui
         systemctl start nginx-ui
         sleep 1s
         sleep 1s
         if systemctl -q is-active nginx-ui; then
         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}"
             echo -e "${FontRed}error: Failed to start the Nginx UI service.${FontSuffix}"
             exit 1
             exit 1
         fi
         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
     fi
 }
 }
 
 
 stop_nginx_ui() {
 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
     fi
     echo "info: Nginx UI service Stopped."
     echo "info: Nginx UI service Stopped."
 }
 }
 
 
 remove_nginx_ui() {
 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
     if [[ -n "$(pidof nginx-ui)" ]]; then
       stop_nginx_ui
       stop_nginx_ui
     fi
     fi
@@ -364,6 +455,66 @@ remove_nginx_ui() {
       fi
       fi
       exit 0
       exit 0
     fi
     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
   else
     echo 'error: Nginx UI is not installed.'
     echo 'error: Nginx UI is not installed.'
     exit 1
     exit 1
@@ -421,18 +572,34 @@ main() {
     fi
     fi
 
 
     # Determine if nginx-ui is running
     # 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
         if [[ -n "$(pidof nginx-ui)" ]]; then
             stop_nginx_ui
             stop_nginx_ui
             NGINX_UI_RUNNING='1'
             NGINX_UI_RUNNING='1'
         fi
         fi
     fi
     fi
+
     install_bin
     install_bin
     echo 'installed: /usr/local/bin/nginx-ui'
     echo 'installed: /usr/local/bin/nginx-ui'
 
 
     install_service
     install_service
-    if [[ "$SYSTEMD" -eq '1' ]]; then
+    if [[ "$SERVICE_TYPE" == "systemd" && "$SYSTEMD" -eq '1' ]]; then
         echo "installed: ${ServicePath}"
         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
     fi
 
 
     "rm" -r "$TMP_DIRECTORY"
     "rm" -r "$TMP_DIRECTORY"
@@ -444,14 +611,35 @@ main() {
     if [[ "$NGINX_UI_RUNNING" -eq '1' ]]; then
     if [[ "$NGINX_UI_RUNNING" -eq '1' ]]; then
         start_nginx_ui
         start_nginx_ui
     else
     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
     fi
     fi
 }
 }

+ 4 - 2
internal/self_check/tasks.go

@@ -118,8 +118,10 @@ func init() {
 	if helper.InNginxUIOfficialDocker() {
 	if helper.InNginxUIOfficialDocker() {
 		selfCheckTasks = append(selfCheckTasks, &Task{
 		selfCheckTasks = append(selfCheckTasks, &Task{
 			Name:        translation.C("Docker socket exists"),
 			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 "github.com/0xJacky/Nginx-UI/.github"
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"github.com/0xJacky/Nginx-UI/internal/version"
 	"github.com/0xJacky/Nginx-UI/internal/version"
-	"github.com/0xJacky/Nginx-UI/settings"
 	"github.com/minio/selfupdate"
 	"github.com/minio/selfupdate"
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
 	"github.com/uozi-tech/cosy/logger"
 	"github.com/uozi-tech/cosy/logger"
@@ -154,8 +153,7 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
 		return
 		return
 	}
 	}
 
 
-	githubProxy := settings.HTTPSettings.GithubProxy
-	if githubProxy != "" && u.Channel != string(version.ReleaseTypeDev) {
+	if u.Channel != string(version.ReleaseTypeDev) {
 		digest.BrowserDownloadUrl = version.GetUrl(digest.BrowserDownloadUrl)
 		digest.BrowserDownloadUrl = version.GetUrl(digest.BrowserDownloadUrl)
 	}
 	}
 
 
@@ -169,7 +167,7 @@ func (u *Upgrader) DownloadLatestRelease(progressChan chan float64) (tarName str
 
 
 	dir := filepath.Dir(u.ExPath)
 	dir := filepath.Dir(u.ExPath)
 
 
-	if githubProxy != "" && u.Channel != string(version.ReleaseTypeDev) {
+	if u.Channel != string(version.ReleaseTypeDev) {
 		downloadUrl = version.GetUrl(downloadUrl)
 		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


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно