Ver Fonte

feat: logrotate cron task for docker users #255

Jacky há 1 ano atrás
pai
commit
0fa98703cd

+ 15 - 6
api/system/settings.go

@@ -2,6 +2,7 @@ package system
 
 import (
 	"github.com/0xJacky/Nginx-UI/api"
+	"github.com/0xJacky/Nginx-UI/internal/cron"
 	"github.com/0xJacky/Nginx-UI/settings"
 	"github.com/gin-gonic/gin"
 	"net/http"
@@ -10,26 +11,34 @@ import (
 
 func GetSettings(c *gin.Context) {
 	c.JSON(http.StatusOK, gin.H{
-		"server": settings.ServerSettings,
-		"nginx":  settings.NginxSettings,
-		"openai": settings.OpenAISettings,
+		"server":    settings.ServerSettings,
+		"nginx":     settings.NginxSettings,
+		"openai":    settings.OpenAISettings,
+		"logrotate": settings.LogrotateSettings,
 	})
 }
 
 func SaveSettings(c *gin.Context) {
 	var json struct {
-		Server settings.Server `json:"server"`
-		Nginx  settings.Nginx  `json:"nginx"`
-		Openai settings.OpenAI `json:"openai"`
+		Server    settings.Server    `json:"server"`
+		Nginx     settings.Nginx     `json:"nginx"`
+		Openai    settings.OpenAI    `json:"openai"`
+		Logrotate settings.Logrotate `json:"logrotate"`
 	}
 
 	if !api.BindAndValid(c, &json) {
 		return
 	}
 
+	if settings.LogrotateSettings.Enabled != json.Logrotate.Enabled ||
+		settings.LogrotateSettings.Interval != json.Logrotate.Interval {
+		go cron.RestartLogrotate()
+	}
+
 	fillSettings(&settings.ServerSettings, &json.Server)
 	fillSettings(&settings.NginxSettings, &json.Nginx)
 	fillSettings(&settings.OpenAISettings, &json.Openai)
+	fillSettings(&settings.LogrotateSettings, &json.Logrotate)
 
 	settings.ReflectFrom()
 

+ 44 - 11
app/src/language/en/app.po

@@ -155,7 +155,7 @@ msgstr "Base information"
 
 #: src/views/config/ConfigEdit.vue:117
 #: src/views/domain/components/RightSettings.vue:76
-#: src/views/preference/Preference.vue:96
+#: src/views/preference/Preference.vue:95
 #: src/views/stream/components/RightSettings.vue:76
 #, fuzzy
 msgid "Basic"
@@ -255,6 +255,11 @@ msgstr ""
 msgid "Cleared successfully"
 msgstr "Disabled successfully"
 
+#: src/views/preference/LogrotateSettings.vue:27
+#, fuzzy
+msgid "Command"
+msgstr "Comments"
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:107
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:88
@@ -503,7 +508,7 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Do you want to remove this upstream?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/certificate/WildcardCertificate.vue:72
+#: src/views/certificate/WildcardCertificate.vue:100
 msgid "Domain"
 msgstr ""
 
@@ -618,6 +623,7 @@ msgstr "Enable TLS"
 #: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/RightSettings.vue:78
 #: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:32
+#: src/views/preference/LogrotateSettings.vue:24
 #: src/views/stream/components/RightSettings.vue:78
 #: src/views/stream/StreamEdit.vue:170 src/views/stream/StreamList.vue:32
 msgid "Enabled"
@@ -838,12 +844,16 @@ msgstr "Enabled successfully"
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Intermediate Certification Authorities: %{issuer}"
 
+#: src/views/preference/LogrotateSettings.vue:30
+msgid "Interval"
+msgstr ""
+
 #: src/views/certificate/Certificate.vue:137
 #, fuzzy
 msgid "Issue wildcard certificate"
 msgstr "Certificate is valid"
 
-#: src/views/certificate/WildcardCertificate.vue:61
+#: src/views/certificate/WildcardCertificate.vue:89
 #, fuzzy
 msgid "Issue Wildcard Certificate"
 msgstr "Certificate Status"
@@ -857,6 +867,7 @@ msgstr "Enabled successfully"
 msgid "Jwt Secret"
 msgstr ""
 
+#: src/views/certificate/WildcardCertificate.vue:107
 #: src/views/domain/cert/components/AutoCertStepOne.vue:108
 msgid "Key Type"
 msgstr ""
@@ -924,6 +935,20 @@ msgstr "Login successful"
 msgid "Logout successful"
 msgstr "Logout successful"
 
+#: src/views/preference/Preference.vue:113
+msgid "Logrotate"
+msgstr ""
+
+#: src/views/preference/LogrotateSettings.vue:17
+msgid ""
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
+msgstr ""
+
 #: src/views/domain/cert/components/AutoCertStepOne.vue:87
 #, fuzzy
 msgid ""
@@ -963,6 +988,10 @@ msgstr "Memory"
 msgid "Memory and Storage"
 msgstr "Memory and Storage"
 
+#: src/views/preference/LogrotateSettings.vue:34
+msgid "Minutes"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
@@ -1019,13 +1048,13 @@ msgstr "Network Total Send"
 msgid "New version released"
 msgstr ""
 
-#: src/views/certificate/WildcardCertificate.vue:87
+#: src/views/certificate/WildcardCertificate.vue:127
 #: src/views/domain/cert/components/ObtainCert.vue:204
 #: src/views/domain/DomainAdd.vue:145
 msgid "Next"
 msgstr "Next"
 
-#: src/views/preference/Preference.vue:102
+#: src/views/preference/Preference.vue:101
 msgid "Nginx"
 msgstr ""
 
@@ -1148,7 +1177,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:108
+#: src/views/preference/Preference.vue:107
 msgid "OpenAI"
 msgstr ""
 
@@ -1242,7 +1271,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:210 src/views/preference/Preference.vue:91
+#: src/routes/index.ts:210 src/views/preference/Preference.vue:90
 msgid "Preference"
 msgstr ""
 
@@ -1334,7 +1363,7 @@ msgid "Renew Certificate Success"
 msgstr "Certificate is valid"
 
 #: src/views/certificate/RenewCert.vue:25
-#: src/views/certificate/WildcardCertificate.vue:50
+#: src/views/certificate/WildcardCertificate.vue:51
 #, fuzzy
 msgid "Renew successfully"
 msgstr "Enabled successfully"
@@ -1368,7 +1397,7 @@ msgstr ""
 #: src/views/certificate/CertificateEditor.vue:245
 #: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:121
-#: src/views/preference/Preference.vue:119 src/views/stream/StreamEdit.vue:253
+#: src/views/preference/Preference.vue:124 src/views/stream/StreamEdit.vue:253
 msgid "Save"
 msgstr "Save"
 
@@ -1383,7 +1412,7 @@ msgstr "Save error %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/views/certificate/CertificateEditor.vue:48
-#: src/views/preference/Preference.vue:61
+#: src/views/preference/Preference.vue:60
 #, fuzzy
 msgid "Save successfully"
 msgstr "Saved successfully"
@@ -1416,7 +1445,7 @@ msgstr "Send"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:84
-#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:65
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:64
 #: src/views/stream/StreamList.vue:116 src/views/stream/StreamList.vue:84
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
@@ -1617,6 +1646,10 @@ msgstr ""
 msgid "This field should not be empty"
 msgstr ""
 
+#: src/views/preference/LogrotateSettings.vue:16
+msgid "Tips"
+msgstr ""
+
 #: src/views/notification/Notification.vue:21
 msgid "Title"
 msgstr ""

+ 44 - 11
app/src/language/es/app.po

@@ -152,7 +152,7 @@ msgstr "Información general"
 
 #: src/views/config/ConfigEdit.vue:117
 #: src/views/domain/components/RightSettings.vue:76
-#: src/views/preference/Preference.vue:96
+#: src/views/preference/Preference.vue:95
 #: src/views/stream/components/RightSettings.vue:76
 msgid "Basic"
 msgstr "Básico"
@@ -246,6 +246,11 @@ msgstr "Borrar"
 msgid "Cleared successfully"
 msgstr "Limpiado exitoso"
 
+#: src/views/preference/LogrotateSettings.vue:27
+#, fuzzy
+msgid "Command"
+msgstr "Comentarios"
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:107
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:88
@@ -480,7 +485,7 @@ msgstr "¿Quieres eliminar este servidor?"
 msgid "Do you want to remove this upstream?"
 msgstr "¿Quieres eliminar esta transmisión?"
 
-#: src/views/certificate/WildcardCertificate.vue:72
+#: src/views/certificate/WildcardCertificate.vue:100
 msgid "Domain"
 msgstr "Dominio"
 
@@ -590,6 +595,7 @@ msgstr "Habilitar TLS"
 #: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/RightSettings.vue:78
 #: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:32
+#: src/views/preference/LogrotateSettings.vue:24
 #: src/views/stream/components/RightSettings.vue:78
 #: src/views/stream/StreamEdit.vue:170 src/views/stream/StreamList.vue:32
 msgid "Enabled"
@@ -802,11 +808,15 @@ msgstr "Instalación exitosa"
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Autoridades de certificación intermedias: %{issuer}"
 
+#: src/views/preference/LogrotateSettings.vue:30
+msgid "Interval"
+msgstr ""
+
 #: src/views/certificate/Certificate.vue:137
 msgid "Issue wildcard certificate"
 msgstr "Obtener certificado comodín"
 
-#: src/views/certificate/WildcardCertificate.vue:61
+#: src/views/certificate/WildcardCertificate.vue:89
 msgid "Issue Wildcard Certificate"
 msgstr "Obtener certificado Comodín"
 
@@ -818,6 +828,7 @@ msgstr "Certificado emitido con éxito"
 msgid "Jwt Secret"
 msgstr "Secreto Jwt"
 
+#: src/views/certificate/WildcardCertificate.vue:107
 #: src/views/domain/cert/components/AutoCertStepOne.vue:108
 #, fuzzy
 msgid "Key Type"
@@ -881,6 +892,20 @@ msgstr "Acceso exitoso"
 msgid "Logout successful"
 msgstr "Cierre de sesión exitoso"
 
+#: src/views/preference/Preference.vue:113
+msgid "Logrotate"
+msgstr ""
+
+#: src/views/preference/LogrotateSettings.vue:17
+msgid ""
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
+msgstr ""
+
 #: src/views/domain/cert/components/AutoCertStepOne.vue:87
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
@@ -917,6 +942,10 @@ msgstr "Memoria"
 msgid "Memory and Storage"
 msgstr "Memoria y almacenamiento"
 
+#: src/views/preference/LogrotateSettings.vue:34
+msgid "Minutes"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
@@ -970,13 +999,13 @@ msgstr "Total enviado por la red"
 msgid "New version released"
 msgstr "Se liberó una nueva versión"
 
-#: src/views/certificate/WildcardCertificate.vue:87
+#: src/views/certificate/WildcardCertificate.vue:127
 #: src/views/domain/cert/components/ObtainCert.vue:204
 #: src/views/domain/DomainAdd.vue:145
 msgid "Next"
 msgstr "Siguiente"
 
-#: src/views/preference/Preference.vue:102
+#: src/views/preference/Preference.vue:101
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1093,7 +1122,7 @@ msgstr "Una vez que se complete la verificación, los registros se eliminarán."
 msgid "Online"
 msgstr "En línea"
 
-#: src/views/preference/Preference.vue:108
+#: src/views/preference/Preference.vue:107
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1195,7 +1224,7 @@ msgstr "¡Seleccione al menos un nodo!"
 msgid "Pre-release"
 msgstr "Prelanzamiento"
 
-#: src/routes/index.ts:210 src/views/preference/Preference.vue:91
+#: src/routes/index.ts:210 src/views/preference/Preference.vue:90
 msgid "Preference"
 msgstr "Configuración"
 
@@ -1280,7 +1309,7 @@ msgid "Renew Certificate Success"
 msgstr "Renovado de Certificado exitoso"
 
 #: src/views/certificate/RenewCert.vue:25
-#: src/views/certificate/WildcardCertificate.vue:50
+#: src/views/certificate/WildcardCertificate.vue:51
 msgid "Renew successfully"
 msgstr "Renovado con éxito"
 
@@ -1312,7 +1341,7 @@ msgstr "Corriendo"
 #: src/views/certificate/CertificateEditor.vue:245
 #: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:121
-#: src/views/preference/Preference.vue:119 src/views/stream/StreamEdit.vue:253
+#: src/views/preference/Preference.vue:124 src/views/stream/StreamEdit.vue:253
 msgid "Save"
 msgstr "Guardar"
 
@@ -1327,7 +1356,7 @@ msgstr "Error al guardar %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/views/certificate/CertificateEditor.vue:48
-#: src/views/preference/Preference.vue:61
+#: src/views/preference/Preference.vue:60
 msgid "Save successfully"
 msgstr "Guardado con éxito"
 
@@ -1358,7 +1387,7 @@ msgstr "Enviado"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:84
-#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:65
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:64
 #: src/views/stream/StreamList.vue:116 src/views/stream/StreamList.vue:84
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
@@ -1548,6 +1577,10 @@ msgstr "Este campo es obligatorio"
 msgid "This field should not be empty"
 msgstr "Este campo no debe estar vacío"
 
+#: src/views/preference/LogrotateSettings.vue:16
+msgid "Tips"
+msgstr ""
+
 #: src/views/notification/Notification.vue:21
 msgid "Title"
 msgstr "Título"

+ 44 - 11
app/src/language/fr_FR/app.po

@@ -155,7 +155,7 @@ msgstr "Information générale"
 
 #: src/views/config/ConfigEdit.vue:117
 #: src/views/domain/components/RightSettings.vue:76
-#: src/views/preference/Preference.vue:96
+#: src/views/preference/Preference.vue:95
 #: src/views/stream/components/RightSettings.vue:76
 msgid "Basic"
 msgstr "Basique"
@@ -253,6 +253,11 @@ msgstr "Effacer"
 msgid "Cleared successfully"
 msgstr "Désactivé avec succès"
 
+#: src/views/preference/LogrotateSettings.vue:27
+#, fuzzy
+msgid "Command"
+msgstr "Commentaires"
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:107
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:88
@@ -497,7 +502,7 @@ msgstr "Voulez-vous supprimer ce serveur ?"
 msgid "Do you want to remove this upstream?"
 msgstr "Voulez-vous supprimer ce serveur ?"
 
-#: src/views/certificate/WildcardCertificate.vue:72
+#: src/views/certificate/WildcardCertificate.vue:100
 msgid "Domain"
 msgstr ""
 
@@ -615,6 +620,7 @@ msgstr "Activer TLS"
 #: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/RightSettings.vue:78
 #: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:32
+#: src/views/preference/LogrotateSettings.vue:24
 #: src/views/stream/components/RightSettings.vue:78
 #: src/views/stream/StreamEdit.vue:170 src/views/stream/StreamList.vue:32
 msgid "Enabled"
@@ -836,12 +842,16 @@ msgstr "Installé avec succès"
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Autorités de certification intermédiaires : %{issuer}"
 
+#: src/views/preference/LogrotateSettings.vue:30
+msgid "Interval"
+msgstr ""
+
 #: src/views/certificate/Certificate.vue:137
 #, fuzzy
 msgid "Issue wildcard certificate"
 msgstr "Obtenir un certificat"
 
-#: src/views/certificate/WildcardCertificate.vue:61
+#: src/views/certificate/WildcardCertificate.vue:89
 #, fuzzy
 msgid "Issue Wildcard Certificate"
 msgstr "État du certificat"
@@ -854,6 +864,7 @@ msgstr "Certificat délivré avec succès"
 msgid "Jwt Secret"
 msgstr "Secret Jwt"
 
+#: src/views/certificate/WildcardCertificate.vue:107
 #: src/views/domain/cert/components/AutoCertStepOne.vue:108
 #, fuzzy
 msgid "Key Type"
@@ -924,6 +935,20 @@ msgstr "Connexion réussie"
 msgid "Logout successful"
 msgstr "Déconnexion réussie"
 
+#: src/views/preference/Preference.vue:113
+msgid "Logrotate"
+msgstr ""
+
+#: src/views/preference/LogrotateSettings.vue:17
+msgid ""
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
+msgstr ""
+
 #: src/views/domain/cert/components/AutoCertStepOne.vue:87
 #, fuzzy
 msgid ""
@@ -963,6 +988,10 @@ msgstr "Mémoire"
 msgid "Memory and Storage"
 msgstr "Mémoire et stockage"
 
+#: src/views/preference/LogrotateSettings.vue:34
+msgid "Minutes"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
@@ -1017,13 +1046,13 @@ msgstr "Envoi total réseau"
 msgid "New version released"
 msgstr "Nouvelle version publiée"
 
-#: src/views/certificate/WildcardCertificate.vue:87
+#: src/views/certificate/WildcardCertificate.vue:127
 #: src/views/domain/cert/components/ObtainCert.vue:204
 #: src/views/domain/DomainAdd.vue:145
 msgid "Next"
 msgstr "Suivant"
 
-#: src/views/preference/Preference.vue:102
+#: src/views/preference/Preference.vue:101
 #, fuzzy
 msgid "Nginx"
 msgstr "Journal Nginx"
@@ -1144,7 +1173,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:108
+#: src/views/preference/Preference.vue:107
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1244,7 +1273,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:210 src/views/preference/Preference.vue:91
+#: src/routes/index.ts:210 src/views/preference/Preference.vue:90
 msgid "Preference"
 msgstr "Préférence"
 
@@ -1337,7 +1366,7 @@ msgid "Renew Certificate Success"
 msgstr "Changer de certificat"
 
 #: src/views/certificate/RenewCert.vue:25
-#: src/views/certificate/WildcardCertificate.vue:50
+#: src/views/certificate/WildcardCertificate.vue:51
 #, fuzzy
 msgid "Renew successfully"
 msgstr "Activé avec succès"
@@ -1370,7 +1399,7 @@ msgstr "En cours d'éxécution"
 #: src/views/certificate/CertificateEditor.vue:245
 #: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:121
-#: src/views/preference/Preference.vue:119 src/views/stream/StreamEdit.vue:253
+#: src/views/preference/Preference.vue:124 src/views/stream/StreamEdit.vue:253
 msgid "Save"
 msgstr "Enregistrer"
 
@@ -1385,7 +1414,7 @@ msgstr "Enregistrer l'erreur %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/views/certificate/CertificateEditor.vue:48
-#: src/views/preference/Preference.vue:61
+#: src/views/preference/Preference.vue:60
 msgid "Save successfully"
 msgstr "Sauvegarde réussie"
 
@@ -1416,7 +1445,7 @@ msgstr "Envoyer"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:84
-#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:65
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:64
 #: src/views/stream/StreamList.vue:116 src/views/stream/StreamList.vue:84
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
@@ -1620,6 +1649,10 @@ msgstr ""
 msgid "This field should not be empty"
 msgstr ""
 
+#: src/views/preference/LogrotateSettings.vue:16
+msgid "Tips"
+msgstr ""
+
 #: src/views/notification/Notification.vue:21
 msgid "Title"
 msgstr ""

+ 37 - 11
app/src/language/messages.pot

@@ -149,7 +149,7 @@ msgstr ""
 
 #: src/views/config/ConfigEdit.vue:117
 #: src/views/domain/components/RightSettings.vue:76
-#: src/views/preference/Preference.vue:96
+#: src/views/preference/Preference.vue:95
 #: src/views/stream/components/RightSettings.vue:76
 msgid "Basic"
 msgstr ""
@@ -245,6 +245,10 @@ msgstr ""
 msgid "Cleared successfully"
 msgstr ""
 
+#: src/views/preference/LogrotateSettings.vue:27
+msgid "Command"
+msgstr ""
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:107
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:88
@@ -484,7 +488,7 @@ msgstr ""
 msgid "Do you want to remove this upstream?"
 msgstr ""
 
-#: src/views/certificate/WildcardCertificate.vue:72
+#: src/views/certificate/WildcardCertificate.vue:100
 msgid "Domain"
 msgstr ""
 
@@ -595,6 +599,7 @@ msgstr ""
 #: src/views/domain/components/RightSettings.vue:78
 #: src/views/domain/DomainEdit.vue:179
 #: src/views/domain/DomainList.vue:32
+#: src/views/preference/LogrotateSettings.vue:24
 #: src/views/stream/components/RightSettings.vue:78
 #: src/views/stream/StreamEdit.vue:170
 #: src/views/stream/StreamList.vue:32
@@ -814,11 +819,15 @@ msgstr ""
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr ""
 
+#: src/views/preference/LogrotateSettings.vue:30
+msgid "Interval"
+msgstr ""
+
 #: src/views/certificate/Certificate.vue:137
 msgid "Issue wildcard certificate"
 msgstr ""
 
-#: src/views/certificate/WildcardCertificate.vue:61
+#: src/views/certificate/WildcardCertificate.vue:89
 msgid "Issue Wildcard Certificate"
 msgstr ""
 
@@ -830,6 +839,7 @@ msgstr ""
 msgid "Jwt Secret"
 msgstr ""
 
+#: src/views/certificate/WildcardCertificate.vue:107
 #: src/views/domain/cert/components/AutoCertStepOne.vue:108
 msgid "Key Type"
 msgstr ""
@@ -894,6 +904,14 @@ msgstr ""
 msgid "Logout successful"
 msgstr ""
 
+#: src/views/preference/Preference.vue:113
+msgid "Logrotate"
+msgstr ""
+
+#: src/views/preference/LogrotateSettings.vue:17
+msgid "Logrotate, by default, is enabled in most mainstream Linux distributions for users who install Nginx UI on the host machine, so you don't need to modify the parameters on this page. For users who install Nginx UI using Docker containers, you can manually enable this option. The crontab task scheduler of Nginx UI will execute the logrotate command at the interval you set in minutes."
+msgstr ""
+
 #: src/views/domain/cert/components/AutoCertStepOne.vue:87
 msgid "Make sure you have configured a reverse proxy for .well-known directory to HTTPChallengePort before obtaining the certificate."
 msgstr ""
@@ -929,6 +947,10 @@ msgstr ""
 msgid "Memory and Storage"
 msgstr ""
 
+#: src/views/preference/LogrotateSettings.vue:34
+msgid "Minutes"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
@@ -985,13 +1007,13 @@ msgstr ""
 msgid "New version released"
 msgstr ""
 
-#: src/views/certificate/WildcardCertificate.vue:87
+#: src/views/certificate/WildcardCertificate.vue:127
 #: src/views/domain/cert/components/ObtainCert.vue:204
 #: src/views/domain/DomainAdd.vue:145
 msgid "Next"
 msgstr ""
 
-#: src/views/preference/Preference.vue:102
+#: src/views/preference/Preference.vue:101
 msgid "Nginx"
 msgstr ""
 
@@ -1112,7 +1134,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:108
+#: src/views/preference/Preference.vue:107
 msgid "OpenAI"
 msgstr ""
 
@@ -1203,7 +1225,7 @@ msgid "Pre-release"
 msgstr ""
 
 #: src/routes/index.ts:210
-#: src/views/preference/Preference.vue:91
+#: src/views/preference/Preference.vue:90
 msgid "Preference"
 msgstr ""
 
@@ -1288,7 +1310,7 @@ msgid "Renew Certificate Success"
 msgstr ""
 
 #: src/views/certificate/RenewCert.vue:25
-#: src/views/certificate/WildcardCertificate.vue:50
+#: src/views/certificate/WildcardCertificate.vue:51
 msgid "Renew successfully"
 msgstr ""
 
@@ -1321,7 +1343,7 @@ msgstr ""
 #: src/views/config/ConfigEdit.vue:98
 #: src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:121
-#: src/views/preference/Preference.vue:119
+#: src/views/preference/Preference.vue:124
 #: src/views/stream/StreamEdit.vue:253
 msgid "Save"
 msgstr ""
@@ -1338,7 +1360,7 @@ msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/views/certificate/CertificateEditor.vue:48
-#: src/views/preference/Preference.vue:61
+#: src/views/preference/Preference.vue:60
 msgid "Save successfully"
 msgstr ""
 
@@ -1372,7 +1394,7 @@ msgstr ""
 #: src/views/config/ConfigEdit.vue:42
 #: src/views/domain/DomainList.vue:84
 #: src/views/other/Install.vue:72
-#: src/views/preference/Preference.vue:65
+#: src/views/preference/Preference.vue:64
 #: src/views/stream/StreamList.vue:116
 #: src/views/stream/StreamList.vue:84
 #: src/views/system/Upgrade.vue:45
@@ -1557,6 +1579,10 @@ msgstr ""
 msgid "This field should not be empty"
 msgstr ""
 
+#: src/views/preference/LogrotateSettings.vue:16
+msgid "Tips"
+msgstr ""
+
 #: src/views/notification/Notification.vue:21
 msgid "Title"
 msgstr ""

+ 46 - 13
app/src/language/ru_RU/app.po

@@ -155,7 +155,7 @@ msgstr "Основная информация"
 
 #: src/views/config/ConfigEdit.vue:117
 #: src/views/domain/components/RightSettings.vue:76
-#: src/views/preference/Preference.vue:96
+#: src/views/preference/Preference.vue:95
 #: src/views/stream/components/RightSettings.vue:76
 #, fuzzy
 msgid "Basic"
@@ -255,6 +255,11 @@ msgstr "Очистить"
 msgid "Cleared successfully"
 msgstr "Отключено успешно"
 
+#: src/views/preference/LogrotateSettings.vue:27
+#, fuzzy
+msgid "Command"
+msgstr "Комментарии"
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:107
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:88
@@ -503,7 +508,7 @@ msgstr "Вы хотите удалить этот сервер?"
 msgid "Do you want to remove this upstream?"
 msgstr "Вы хотите удалить этот сервер?"
 
-#: src/views/certificate/WildcardCertificate.vue:72
+#: src/views/certificate/WildcardCertificate.vue:100
 msgid "Domain"
 msgstr ""
 
@@ -620,6 +625,7 @@ msgstr "Включить TLS"
 #: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/RightSettings.vue:78
 #: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:32
+#: src/views/preference/LogrotateSettings.vue:24
 #: src/views/stream/components/RightSettings.vue:78
 #: src/views/stream/StreamEdit.vue:170 src/views/stream/StreamList.vue:32
 msgid "Enabled"
@@ -841,12 +847,16 @@ msgstr "Установленно"
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Промежуточные центры сертификации: %{issuer}"
 
+#: src/views/preference/LogrotateSettings.vue:30
+msgid "Interval"
+msgstr ""
+
 #: src/views/certificate/Certificate.vue:137
 #, fuzzy
 msgid "Issue wildcard certificate"
 msgstr "Получить сертификат"
 
-#: src/views/certificate/WildcardCertificate.vue:61
+#: src/views/certificate/WildcardCertificate.vue:89
 #, fuzzy
 msgid "Issue Wildcard Certificate"
 msgstr "Статус сертификата"
@@ -860,6 +870,7 @@ msgstr "Сертификат успешно выдан"
 msgid "Jwt Secret"
 msgstr ""
 
+#: src/views/certificate/WildcardCertificate.vue:107
 #: src/views/domain/cert/components/AutoCertStepOne.vue:108
 #, fuzzy
 msgid "Key Type"
@@ -928,6 +939,20 @@ msgstr "Авторизация успешна"
 msgid "Logout successful"
 msgstr "Выход выполнен успешно"
 
+#: src/views/preference/Preference.vue:113
+msgid "Logrotate"
+msgstr ""
+
+#: src/views/preference/LogrotateSettings.vue:17
+msgid ""
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
+msgstr ""
+
 #: src/views/domain/cert/components/AutoCertStepOne.vue:87
 #, fuzzy
 msgid ""
@@ -967,6 +992,10 @@ msgstr "Память"
 msgid "Memory and Storage"
 msgstr "Память и хранилище"
 
+#: src/views/preference/LogrotateSettings.vue:34
+msgid "Minutes"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
@@ -1023,13 +1052,13 @@ msgstr "Всего отправлено"
 msgid "New version released"
 msgstr "Вышла новая версия"
 
-#: src/views/certificate/WildcardCertificate.vue:87
+#: src/views/certificate/WildcardCertificate.vue:127
 #: src/views/domain/cert/components/ObtainCert.vue:204
 #: src/views/domain/DomainAdd.vue:145
 msgid "Next"
 msgstr "Дальше"
 
-#: src/views/preference/Preference.vue:102
+#: src/views/preference/Preference.vue:101
 #, fuzzy
 msgid "Nginx"
 msgstr "Журнал"
@@ -1153,7 +1182,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:108
+#: src/views/preference/Preference.vue:107
 msgid "OpenAI"
 msgstr ""
 
@@ -1249,7 +1278,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:210 src/views/preference/Preference.vue:91
+#: src/routes/index.ts:210 src/views/preference/Preference.vue:90
 msgid "Preference"
 msgstr "Настройки"
 
@@ -1341,7 +1370,7 @@ msgid "Renew Certificate Success"
 msgstr "Сертификат действителен"
 
 #: src/views/certificate/RenewCert.vue:25
-#: src/views/certificate/WildcardCertificate.vue:50
+#: src/views/certificate/WildcardCertificate.vue:51
 #, fuzzy
 msgid "Renew successfully"
 msgstr "Активировано успешно"
@@ -1375,7 +1404,7 @@ msgstr "Выполняется"
 #: src/views/certificate/CertificateEditor.vue:245
 #: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:121
-#: src/views/preference/Preference.vue:119 src/views/stream/StreamEdit.vue:253
+#: src/views/preference/Preference.vue:124 src/views/stream/StreamEdit.vue:253
 msgid "Save"
 msgstr "Сохранить"
 
@@ -1390,7 +1419,7 @@ msgstr "Ошибка сохранения %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/views/certificate/CertificateEditor.vue:48
-#: src/views/preference/Preference.vue:61
+#: src/views/preference/Preference.vue:60
 #, fuzzy
 msgid "Save successfully"
 msgstr "Успешно сохранено"
@@ -1423,7 +1452,7 @@ msgstr "Отправлено"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:84
-#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:65
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:64
 #: src/views/stream/StreamList.vue:116 src/views/stream/StreamList.vue:84
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
@@ -1625,6 +1654,10 @@ msgstr ""
 msgid "This field should not be empty"
 msgstr "Это поле обязательно к заполнению"
 
+#: src/views/preference/LogrotateSettings.vue:16
+msgid "Tips"
+msgstr ""
+
 #: src/views/notification/Notification.vue:21
 msgid "Title"
 msgstr "Заголовок"
@@ -1723,8 +1756,8 @@ msgid ""
 "We will add one or more TXT records to the DNS records of your domain for "
 "ownership verification."
 msgstr ""
-"Мы добавим одну или несколько записей TXT в DNS записи  вашего домена для"
-"подтверждение права собственности"
+"Мы добавим одну или несколько записей TXT в DNS записи  вашего домена "
+"дляподтверждение права собственности"
 
 #: src/views/domain/cert/components/ObtainCert.vue:135
 msgid ""

+ 44 - 11
app/src/language/vi_VN/app.po

@@ -155,7 +155,7 @@ msgstr "Thông tin"
 
 #: src/views/config/ConfigEdit.vue:117
 #: src/views/domain/components/RightSettings.vue:76
-#: src/views/preference/Preference.vue:96
+#: src/views/preference/Preference.vue:95
 #: src/views/stream/components/RightSettings.vue:76
 #, fuzzy
 msgid "Basic"
@@ -255,6 +255,11 @@ msgstr "Xoá"
 msgid "Cleared successfully"
 msgstr "Đã xóa thành công"
 
+#: src/views/preference/LogrotateSettings.vue:27
+#, fuzzy
+msgid "Command"
+msgstr "Bình luận"
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:107
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:88
@@ -504,7 +509,7 @@ msgstr "Bạn muốn xóa máy chủ này ?"
 msgid "Do you want to remove this upstream?"
 msgstr "Bạn muốn xóa máy chủ này ?"
 
-#: src/views/certificate/WildcardCertificate.vue:72
+#: src/views/certificate/WildcardCertificate.vue:100
 msgid "Domain"
 msgstr ""
 
@@ -621,6 +626,7 @@ msgstr "Bật TLS"
 #: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/RightSettings.vue:78
 #: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:32
+#: src/views/preference/LogrotateSettings.vue:24
 #: src/views/stream/components/RightSettings.vue:78
 #: src/views/stream/StreamEdit.vue:170 src/views/stream/StreamList.vue:32
 msgid "Enabled"
@@ -843,12 +849,16 @@ msgstr "Cài đặt thành công"
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Cơ quan cấp chứng chỉ: %{issuer}"
 
+#: src/views/preference/LogrotateSettings.vue:30
+msgid "Interval"
+msgstr ""
+
 #: src/views/certificate/Certificate.vue:137
 #, fuzzy
 msgid "Issue wildcard certificate"
 msgstr "Gia hạn SSL"
 
-#: src/views/certificate/WildcardCertificate.vue:61
+#: src/views/certificate/WildcardCertificate.vue:89
 #, fuzzy
 msgid "Issue Wildcard Certificate"
 msgstr "Thêm chứng chỉ SSL"
@@ -862,6 +872,7 @@ msgstr "Cấp chứng chỉ thành công"
 msgid "Jwt Secret"
 msgstr ""
 
+#: src/views/certificate/WildcardCertificate.vue:107
 #: src/views/domain/cert/components/AutoCertStepOne.vue:108
 #, fuzzy
 msgid "Key Type"
@@ -930,6 +941,20 @@ msgstr "Đăng nhập thành công"
 msgid "Logout successful"
 msgstr "Đã đăng xuất"
 
+#: src/views/preference/Preference.vue:113
+msgid "Logrotate"
+msgstr ""
+
+#: src/views/preference/LogrotateSettings.vue:17
+msgid ""
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
+msgstr ""
+
 #: src/views/domain/cert/components/AutoCertStepOne.vue:87
 #, fuzzy
 msgid ""
@@ -968,6 +993,10 @@ msgstr "Memory"
 msgid "Memory and Storage"
 msgstr "Memory và Storage"
 
+#: src/views/preference/LogrotateSettings.vue:34
+msgid "Minutes"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
@@ -1024,13 +1053,13 @@ msgstr "Tổng lưu lượng mạng đã gửi"
 msgid "New version released"
 msgstr "Đã có phiên bản mới"
 
-#: src/views/certificate/WildcardCertificate.vue:87
+#: src/views/certificate/WildcardCertificate.vue:127
 #: src/views/domain/cert/components/ObtainCert.vue:204
 #: src/views/domain/DomainAdd.vue:145
 msgid "Next"
 msgstr "Tiếp theo"
 
-#: src/views/preference/Preference.vue:102
+#: src/views/preference/Preference.vue:101
 msgid "Nginx"
 msgstr ""
 
@@ -1153,7 +1182,7 @@ msgstr "Sau khi quá trình xác minh hoàn tất, bản ghi sẽ bị xóa."
 msgid "Online"
 msgstr "Trực tuyến"
 
-#: src/views/preference/Preference.vue:108
+#: src/views/preference/Preference.vue:107
 msgid "OpenAI"
 msgstr ""
 
@@ -1251,7 +1280,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:210 src/views/preference/Preference.vue:91
+#: src/routes/index.ts:210 src/views/preference/Preference.vue:90
 msgid "Preference"
 msgstr "Cài đặt"
 
@@ -1343,7 +1372,7 @@ msgid "Renew Certificate Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 #: src/views/certificate/RenewCert.vue:25
-#: src/views/certificate/WildcardCertificate.vue:50
+#: src/views/certificate/WildcardCertificate.vue:51
 #, fuzzy
 msgid "Renew successfully"
 msgstr "Gia hạn chứng chỉ SSL"
@@ -1377,7 +1406,7 @@ msgstr "Running"
 #: src/views/certificate/CertificateEditor.vue:245
 #: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:121
-#: src/views/preference/Preference.vue:119 src/views/stream/StreamEdit.vue:253
+#: src/views/preference/Preference.vue:124 src/views/stream/StreamEdit.vue:253
 msgid "Save"
 msgstr "Lưu"
 
@@ -1392,7 +1421,7 @@ msgstr "Đã xảy ra lỗi khi lưu %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/views/certificate/CertificateEditor.vue:48
-#: src/views/preference/Preference.vue:61
+#: src/views/preference/Preference.vue:60
 #, fuzzy
 msgid "Save successfully"
 msgstr "Lưu thành công"
@@ -1425,7 +1454,7 @@ msgstr "Gửi"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:84
-#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:65
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:64
 #: src/views/stream/StreamList.vue:116 src/views/stream/StreamList.vue:84
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
@@ -1619,6 +1648,10 @@ msgstr ""
 msgid "This field should not be empty"
 msgstr "Trường này không được để trống"
 
+#: src/views/preference/LogrotateSettings.vue:16
+msgid "Tips"
+msgstr ""
+
 #: src/views/notification/Notification.vue:21
 msgid "Title"
 msgstr "Tiêu đề"

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


+ 47 - 11
app/src/language/zh_CN/app.po

@@ -151,7 +151,7 @@ msgstr "基本信息"
 
 #: src/views/config/ConfigEdit.vue:117
 #: src/views/domain/components/RightSettings.vue:76
-#: src/views/preference/Preference.vue:96
+#: src/views/preference/Preference.vue:95
 #: src/views/stream/components/RightSettings.vue:76
 msgid "Basic"
 msgstr "基本"
@@ -245,6 +245,10 @@ msgstr "清空"
 msgid "Cleared successfully"
 msgstr "清除成功"
 
+#: src/views/preference/LogrotateSettings.vue:27
+msgid "Command"
+msgstr "命令"
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:107
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:88
@@ -478,7 +482,7 @@ msgstr "你想删除这个服务器吗?"
 msgid "Do you want to remove this upstream?"
 msgstr "你想删除这个 Upstream 吗?"
 
-#: src/views/certificate/WildcardCertificate.vue:72
+#: src/views/certificate/WildcardCertificate.vue:100
 msgid "Domain"
 msgstr "域名"
 
@@ -586,6 +590,7 @@ msgstr "启用 TLS"
 #: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/RightSettings.vue:78
 #: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:32
+#: src/views/preference/LogrotateSettings.vue:24
 #: src/views/stream/components/RightSettings.vue:78
 #: src/views/stream/StreamEdit.vue:170 src/views/stream/StreamList.vue:32
 msgid "Enabled"
@@ -796,11 +801,15 @@ msgstr "安装成功"
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "中级证书颁发机构: %{issuer}"
 
+#: src/views/preference/LogrotateSettings.vue:30
+msgid "Interval"
+msgstr "间隔"
+
 #: src/views/certificate/Certificate.vue:137
 msgid "Issue wildcard certificate"
 msgstr "签发通配符证书"
 
-#: src/views/certificate/WildcardCertificate.vue:61
+#: src/views/certificate/WildcardCertificate.vue:89
 msgid "Issue Wildcard Certificate"
 msgstr "颁发通配符证书"
 
@@ -812,6 +821,7 @@ msgstr "证书申请成功"
 msgid "Jwt Secret"
 msgstr "Jwt 密钥"
 
+#: src/views/certificate/WildcardCertificate.vue:107
 #: src/views/domain/cert/components/AutoCertStepOne.vue:108
 msgid "Key Type"
 msgstr "密钥类型"
@@ -874,6 +884,24 @@ msgstr "登录成功"
 msgid "Logout successful"
 msgstr "登出成功"
 
+#: src/views/preference/Preference.vue:113
+msgid "Logrotate"
+msgstr "Logrotate"
+
+#: src/views/preference/LogrotateSettings.vue:17
+msgid ""
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
+msgstr ""
+"对于在宿主机上安装 Nginx UI 的用户,大多数主流 Linux 发行版都默认启用 "
+"logrotate 定时任务,因此您无需修改本页面的参数。对于使用 Docker 容器安装 "
+"Nginx 用户界面的用户,您可以手动启用该选项。Nginx UI 的定时任务任务调度器将按"
+"照您设置的时间间隔(以分钟为单位)执行 logrotate 命令。"
+
 #: src/views/domain/cert/components/AutoCertStepOne.vue:87
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
@@ -910,6 +938,10 @@ msgstr "内存"
 msgid "Memory and Storage"
 msgstr "内存与存储"
 
+#: src/views/preference/LogrotateSettings.vue:34
+msgid "Minutes"
+msgstr "分钟"
+
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
@@ -963,13 +995,13 @@ msgstr "上传流量"
 msgid "New version released"
 msgstr "新版本发布"
 
-#: src/views/certificate/WildcardCertificate.vue:87
+#: src/views/certificate/WildcardCertificate.vue:127
 #: src/views/domain/cert/components/ObtainCert.vue:204
 #: src/views/domain/DomainAdd.vue:145
 msgid "Next"
 msgstr "下一步"
 
-#: src/views/preference/Preference.vue:102
+#: src/views/preference/Preference.vue:101
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1086,7 +1118,7 @@ msgstr "一旦验证完成,这些记录将被删除。"
 msgid "Online"
 msgstr "在线"
 
-#: src/views/preference/Preference.vue:108
+#: src/views/preference/Preference.vue:107
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1181,7 +1213,7 @@ msgstr "请至少选择一个节点!"
 msgid "Pre-release"
 msgstr "预发布"
 
-#: src/routes/index.ts:210 src/views/preference/Preference.vue:91
+#: src/routes/index.ts:210 src/views/preference/Preference.vue:90
 msgid "Preference"
 msgstr "偏好设置"
 
@@ -1266,7 +1298,7 @@ msgid "Renew Certificate Success"
 msgstr "证书续期成功"
 
 #: src/views/certificate/RenewCert.vue:25
-#: src/views/certificate/WildcardCertificate.vue:50
+#: src/views/certificate/WildcardCertificate.vue:51
 msgid "Renew successfully"
 msgstr "更新成功"
 
@@ -1298,7 +1330,7 @@ msgstr "运行中"
 #: src/views/certificate/CertificateEditor.vue:245
 #: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:121
-#: src/views/preference/Preference.vue:119 src/views/stream/StreamEdit.vue:253
+#: src/views/preference/Preference.vue:124 src/views/stream/StreamEdit.vue:253
 msgid "Save"
 msgstr "保存"
 
@@ -1313,7 +1345,7 @@ msgstr "保存错误 %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/views/certificate/CertificateEditor.vue:48
-#: src/views/preference/Preference.vue:61
+#: src/views/preference/Preference.vue:60
 msgid "Save successfully"
 msgstr "保存成功"
 
@@ -1344,7 +1376,7 @@ msgstr "上传"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:84
-#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:65
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:64
 #: src/views/stream/StreamList.vue:116 src/views/stream/StreamList.vue:84
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
@@ -1530,6 +1562,10 @@ msgstr "此字段必填"
 msgid "This field should not be empty"
 msgstr "该字段不能为空"
 
+#: src/views/preference/LogrotateSettings.vue:16
+msgid "Tips"
+msgstr "提示"
+
 #: src/views/notification/Notification.vue:21
 msgid "Title"
 msgstr "标题"

+ 44 - 11
app/src/language/zh_TW/app.po

@@ -155,7 +155,7 @@ msgstr "基本資訊"
 
 #: src/views/config/ConfigEdit.vue:117
 #: src/views/domain/components/RightSettings.vue:76
-#: src/views/preference/Preference.vue:96
+#: src/views/preference/Preference.vue:95
 #: src/views/stream/components/RightSettings.vue:76
 msgid "Basic"
 msgstr "基本"
@@ -252,6 +252,11 @@ msgstr "清除"
 msgid "Cleared successfully"
 msgstr "成功停用"
 
+#: src/views/preference/LogrotateSettings.vue:27
+#, fuzzy
+msgid "Command"
+msgstr "備註"
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:107
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:88
@@ -492,7 +497,7 @@ msgstr "您要移除此伺服器嗎?"
 msgid "Do you want to remove this upstream?"
 msgstr "您要移除此伺服器嗎?"
 
-#: src/views/certificate/WildcardCertificate.vue:72
+#: src/views/certificate/WildcardCertificate.vue:100
 msgid "Domain"
 msgstr "網域"
 
@@ -602,6 +607,7 @@ msgstr "啟用 TLS"
 #: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/RightSettings.vue:78
 #: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:32
+#: src/views/preference/LogrotateSettings.vue:24
 #: src/views/stream/components/RightSettings.vue:78
 #: src/views/stream/StreamEdit.vue:170 src/views/stream/StreamList.vue:32
 msgid "Enabled"
@@ -819,12 +825,16 @@ msgstr "安裝成功"
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "中級憑證頒發機構: %{issuer}"
 
+#: src/views/preference/LogrotateSettings.vue:30
+msgid "Interval"
+msgstr ""
+
 #: src/views/certificate/Certificate.vue:137
 #, fuzzy
 msgid "Issue wildcard certificate"
 msgstr "取得憑證"
 
-#: src/views/certificate/WildcardCertificate.vue:61
+#: src/views/certificate/WildcardCertificate.vue:89
 #, fuzzy
 msgid "Issue Wildcard Certificate"
 msgstr "憑證狀態"
@@ -837,6 +847,7 @@ msgstr "成功頒發憑證"
 msgid "Jwt Secret"
 msgstr "Jwt Secret"
 
+#: src/views/certificate/WildcardCertificate.vue:107
 #: src/views/domain/cert/components/AutoCertStepOne.vue:108
 #, fuzzy
 msgid "Key Type"
@@ -904,6 +915,20 @@ msgstr "登入成功"
 msgid "Logout successful"
 msgstr "登出成功"
 
+#: src/views/preference/Preference.vue:113
+msgid "Logrotate"
+msgstr ""
+
+#: src/views/preference/LogrotateSettings.vue:17
+msgid ""
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
+msgstr ""
+
 #: src/views/domain/cert/components/AutoCertStepOne.vue:87
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
@@ -941,6 +966,10 @@ msgstr "記憶體"
 msgid "Memory and Storage"
 msgstr "記憶體與儲存"
 
+#: src/views/preference/LogrotateSettings.vue:34
+msgid "Minutes"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
@@ -995,13 +1024,13 @@ msgstr "上傳流量"
 msgid "New version released"
 msgstr "新版本發布"
 
-#: src/views/certificate/WildcardCertificate.vue:87
+#: src/views/certificate/WildcardCertificate.vue:127
 #: src/views/domain/cert/components/ObtainCert.vue:204
 #: src/views/domain/DomainAdd.vue:145
 msgid "Next"
 msgstr "下一步"
 
-#: src/views/preference/Preference.vue:102
+#: src/views/preference/Preference.vue:101
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -1120,7 +1149,7 @@ msgstr ""
 msgid "Online"
 msgstr "線上"
 
-#: src/views/preference/Preference.vue:108
+#: src/views/preference/Preference.vue:107
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -1216,7 +1245,7 @@ msgstr "請至少選擇一個節點!"
 msgid "Pre-release"
 msgstr "預先發布"
 
-#: src/routes/index.ts:210 src/views/preference/Preference.vue:91
+#: src/routes/index.ts:210 src/views/preference/Preference.vue:90
 msgid "Preference"
 msgstr "偏好設定"
 
@@ -1306,7 +1335,7 @@ msgid "Renew Certificate Success"
 msgstr "更換憑證"
 
 #: src/views/certificate/RenewCert.vue:25
-#: src/views/certificate/WildcardCertificate.vue:50
+#: src/views/certificate/WildcardCertificate.vue:51
 #, fuzzy
 msgid "Renew successfully"
 msgstr "啟用成功"
@@ -1339,7 +1368,7 @@ msgstr "執行中"
 #: src/views/certificate/CertificateEditor.vue:245
 #: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:121
-#: src/views/preference/Preference.vue:119 src/views/stream/StreamEdit.vue:253
+#: src/views/preference/Preference.vue:124 src/views/stream/StreamEdit.vue:253
 msgid "Save"
 msgstr "儲存"
 
@@ -1354,7 +1383,7 @@ msgstr "儲存錯誤 %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/views/certificate/CertificateEditor.vue:48
-#: src/views/preference/Preference.vue:61
+#: src/views/preference/Preference.vue:60
 msgid "Save successfully"
 msgstr "儲存成功"
 
@@ -1385,7 +1414,7 @@ msgstr "傳送"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:84
-#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:65
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:64
 #: src/views/stream/StreamList.vue:116 src/views/stream/StreamList.vue:84
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
@@ -1583,6 +1612,10 @@ msgstr ""
 msgid "This field should not be empty"
 msgstr "此欄位不應為空"
 
+#: src/views/preference/LogrotateSettings.vue:16
+msgid "Tips"
+msgstr ""
+
 #: src/views/notification/Notification.vue:21
 msgid "Title"
 msgstr ""

+ 41 - 0
app/src/views/preference/LogrotateSettings.vue

@@ -0,0 +1,41 @@
+<script setup lang="ts">
+import { useGettext } from 'vue3-gettext'
+import { inject } from 'vue'
+import type { Settings } from '@/views/preference/typedef'
+
+const { $gettext } = useGettext()
+
+const data: Settings = inject('data')!
+</script>
+
+<template>
+  <AForm layout="vertical">
+    <AAlert
+      class="mb-4"
+      :message="$gettext('Tips')"
+      :description="$gettext('Logrotate, by default, is enabled in most mainstream '
+        + 'Linux distributions for users who install Nginx UI on the host machine, '
+        + 'so you don\'t need to modify the parameters on this page. '
+        + 'For users who install Nginx UI using Docker containers, you can manually enable this option. '
+        + 'The crontab task scheduler of Nginx UI will execute the logrotate command at the interval you set in minutes.')"
+      type="info"
+    />
+    <AFormItem :label="$gettext('Enabled')">
+      <ASwitch v-model:checked="data.logrotate.enabled" />
+    </AFormItem>
+    <AFormItem :label="$gettext('Command')">
+      {{ data.logrotate.cmd }}
+    </AFormItem>
+    <AFormItem :label="$gettext('Interval')">
+      <AInputNumber
+        v-model:value="data.logrotate.interval"
+        :min="1"
+        :addon-after="$gettext('Minutes')"
+      />
+    </AFormItem>
+  </AForm>
+</template>
+
+<style lang="less" scoped>
+
+</style>

+ 11 - 6
app/src/views/preference/Preference.vue

@@ -8,6 +8,7 @@ import BasicSettings from '@/views/preference/BasicSettings.vue'
 import OpenAISettings from '@/views/preference/OpenAISettings.vue'
 import NginxSettings from '@/views/preference/NginxSettings.vue'
 import type { Settings } from '@/views/preference/typedef'
+import LogrotateSettings from '@/views/preference/LogrotateSettings.vue'
 
 const { $gettext } = useGettext()
 
@@ -38,12 +39,10 @@ const data = ref<Settings>({
     proxy: '',
     token: '',
   },
-  git: {
-    url: '',
-    auth_method: '',
-    username: '',
-    password: '',
-    private_key_file_path: '',
+  logrotate: {
+    enabled: false,
+    cmd: '',
+    interval: 1440,
   },
 })
 
@@ -109,6 +108,12 @@ onMounted(() => {
         >
           <OpenAISettings />
         </ATabPane>
+        <ATabPane
+          key="logrotate"
+          :tab="$gettext('Logrotate')"
+        >
+          <LogrotateSettings />
+        </ATabPane>
       </ATabs>
     </div>
     <FooterToolBar>

+ 4 - 6
app/src/views/preference/typedef.ts

@@ -25,11 +25,9 @@ export interface Settings {
     proxy: string
     token: string
   }
-  git: {
-    url: string
-    auth_method: string
-    username: string
-    password: string
-    private_key_file_path: string
+  logrotate: {
+    enabled: boolean
+    cmd: string
+    interval: number
   }
 }

+ 2 - 1
docs/.vitepress/config/en.ts

@@ -37,7 +37,8 @@ export const enConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
             {text: 'Server', link: '/guide/config-server'},
             {text: 'Nginx', link: '/guide/config-nginx'},
             {text: 'Open AI', link: '/guide/config-openai'},
-            {text: 'Casdoor', link: '/guide/config-casdoor'}
+            {text: 'Casdoor', link: '/guide/config-casdoor'},
+            {text: 'Logrotate', link: '/guide/config-logrotate'}
           ]
         },
         {

+ 2 - 1
docs/.vitepress/config/zh_CN.ts

@@ -42,7 +42,8 @@ export const zhCNConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
             {text: '服务端', link: '/zh_CN/guide/config-server'},
             {text: 'Nginx', link: '/zh_CN/guide/config-nginx'},
             {text: 'Open AI', link: '/zh_CN/guide/config-openai'},
-            {text: 'Casdoor', link: '/zh_CN/guide/config-casdoor'}
+            {text: 'Casdoor', link: '/zh_CN/guide/config-casdoor'},
+            {text: 'Logrotate', link: '/zh_CN/guide/config-logrotate'}
           ]
         },
         {

+ 2 - 1
docs/.vitepress/config/zh_TW.ts

@@ -41,7 +41,8 @@ export const zhTWConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
             {text: '服務端', link: '/zh_TW/guide/config-server'},
             {text: 'Nginx', link: '/zh_TW/guide/config-nginx'},
             {text: 'Open AI', link: '/zh_TW/guide/config-openai'},
-            {text: 'Casdoor', link: '/zh_TW/guide/config-casdoor'}
+            {text: 'Casdoor', link: '/zh_TW/guide/config-casdoor'},
+            {text: 'Logrotate', link: '/zh_CN/guide/config-logrotate'}
           ]
         },
         {

+ 31 - 0
docs/guide/config-logrotate.md

@@ -0,0 +1,31 @@
+# Logrotate
+
+In this section, we will introduce configuration options in Nginx UI about logrotate.
+
+**logrotate** is designed to ease administration of systems that generate large numbers of log files.
+It allows automatic rotation, compression, removal, and mailing of log files.
+Each log file may be handled daily, weekly, monthly, or when it grows too large.
+
+By default, logrotate is enabled in most mainstream Linux distributions for users who install Nginx UI on the host machine,
+so you don't need to modify anything.
+
+For users who install Nginx UI using Docker containers, you can manually enable this option.
+The crontab task scheduler of Nginx UI will execute the logrotate command at the interval you set in minutes.
+
+## Enabled
+- Type: `bool`
+- Default: `false`
+
+This option is used to enable logrotate crontab task in Nginx UI.
+
+## CMD
+- Type: `string`
+- Default: `logrotate /etc/logrotate.d/nginx`
+
+This option is used to set the logrotate command in Nginx UI.
+
+## Interval
+- Type: `int`
+- Default: `1440`
+
+This option is used to set the interval in minutes of logrotate crontab task in Nginx UI.

+ 0 - 2
docs/guide/config-nginx.md

@@ -63,8 +63,6 @@ In Nginx UI v2, we parse the output of the `nginx -V` command to get the default
 If you need to set a different path, you can use this option.
 :::
 
-
-
 ## Service Monitoring and Control
 
 In this section, we will introduce configuration options in Nginx UI for monitoring and controlling Nginx services.

+ 30 - 0
docs/zh_CN/guide/config-logrotate.md

@@ -0,0 +1,30 @@
+# Logrotate
+
+在这个部分,我们将介绍 Nginx UI 中关于 logrotate 的配置选项。
+
+**logrotate** 旨在简化生成大量日志文件的系统的管理。
+它可以按天、周、月或者文件大小来轮转日志文件,还可以压缩、删除旧的日志文件,以及发送日志文件到指定的邮箱。
+
+默认情况下,对于在主机上安装 Nginx UI 的用户,大多数主流的 Linux 发行版都已集成 logrotate,
+所以你不需要修改任何东西。
+
+对于使用 Docker 容器安装 Nginx UI 的用户,你可以手动启用这个选项。
+Nginx UI 的 crontab 任务调度器将会按照你设定的分钟间隔执行 logrotate 命令。
+
+## Enabled
+- 类型:`bool`
+- 默认值:`false`
+
+这个选项用于在 Nginx UI 中启用 logrotate crontab 任务。
+
+## CMD
+- 类型:`string`
+- 默认值:`logrotate /etc/logrotate.d/nginx`
+
+这个选项用于在 Nginx UI 中设置 logrotate 命令。
+
+## Interval
+- 类型:`int`
+- 默认值:`1440`
+
+这个选项用于在 Nginx UI 中设置 logrotate crontab 任务的分钟间隔。

+ 29 - 0
docs/zh_TW/guide/config-logrotate.md

@@ -0,0 +1,29 @@
+# Logrotate
+
+在這個部分,我們將介紹 Nginx UI 中關於 logrotate 的配置選項。
+
+**logrotate** 旨在簡化生成大量日誌文件的系統的管理。
+它可以按天、周、月或者文件大小來輪轉日誌文件,還可以壓縮、刪除舊的日誌文件,以及發送日誌文件到指定的郵箱。
+默認情況下,對於在主機上安裝 Nginx UI 的用戶,大多數主流的 Linux 發行版都已集成 logrotate,
+所以你不需要修改任何東西。
+
+對於使用 Docker 容器安裝 Nginx UI 的用戶,你可以手動啟用這個選項。
+Nginx UI 的 crontab 任務調度器將會按照你設定的分鐘間隔執行 logrotate 命令。
+
+## Enabled
+- 類型:`bool`
+- 默認值:`false`
+
+這個選項用於在 Nginx UI 中啟用 logrotate crontab 任務。
+
+## CMD
+- 類型:`string`
+- 默認值:`logrotate /etc/logrotate.d/nginx`
+
+這個選項用於在 Nginx UI 中設置 logrotate 命令。
+
+## Interval
+- 類型:`int`
+- 默認值:`1440`
+
+這個選項用於在 Nginx UI 中設置 logrotate crontab 任務的分鐘間隔。

+ 52 - 0
internal/cron/cron.go

@@ -0,0 +1,52 @@
+package cron
+
+import (
+	"github.com/0xJacky/Nginx-UI/internal/cert"
+	"github.com/0xJacky/Nginx-UI/internal/logger"
+	"github.com/0xJacky/Nginx-UI/internal/logrotate"
+	"github.com/0xJacky/Nginx-UI/settings"
+	"github.com/go-co-op/gocron"
+	"time"
+)
+
+var s *gocron.Scheduler
+
+func init() {
+	s = gocron.NewScheduler(time.UTC)
+}
+
+var logrotateJob *gocron.Job
+
+func InitCronJobs() {
+	job, err := s.Every(30).Minute().SingletonMode().Do(cert.AutoObtain)
+
+	if err != nil {
+		logger.Fatalf("AutoCert Job: %v, Err: %v\n", job, err)
+	}
+
+	startLogrotate()
+
+	s.StartAsync()
+}
+
+func RestartLogrotate() {
+	logger.Debug("Restart Logrotate")
+	if logrotateJob != nil {
+		s.RemoveByReference(logrotateJob)
+	}
+
+	startLogrotate()
+}
+
+func startLogrotate() {
+	if !settings.LogrotateSettings.Enabled {
+		return
+	}
+	var err error
+
+	logrotateJob, err = s.Every(settings.LogrotateSettings.Interval).Minute().SingletonMode().Do(logrotate.Exec)
+
+	if err != nil {
+		logger.Fatalf("LogRotate Job: %v, Err: %v\n", logrotateJob, err)
+	}
+}

+ 22 - 0
internal/cron/cron_test.go

@@ -0,0 +1,22 @@
+package cron
+
+import (
+	"github.com/0xJacky/Nginx-UI/internal/kernal"
+	"github.com/0xJacky/Nginx-UI/settings"
+	"testing"
+	"time"
+)
+
+func TestRestartLogrotate(t *testing.T) {
+	settings.Init("../../app.ini")
+
+	kernal.InitDatabase()
+
+	InitCronJobs()
+
+	time.Sleep(5 * time.Second)
+
+	RestartLogrotate()
+
+	time.Sleep(2 * time.Second)
+}

+ 9 - 2
internal/kernal/boot.go

@@ -4,6 +4,7 @@ import (
 	"github.com/0xJacky/Nginx-UI/internal/analytic"
 	"github.com/0xJacky/Nginx-UI/internal/cert"
 	"github.com/0xJacky/Nginx-UI/internal/logger"
+	"github.com/0xJacky/Nginx-UI/internal/logrotate"
 	"github.com/0xJacky/Nginx-UI/internal/validation"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/query"
@@ -40,7 +41,7 @@ func Boot() {
 
 func InitAfterDatabase() {
 	syncs := []func(){
-		InitAutoObtainCert,
+		InitCronJobs,
 		analytic.RetrieveNodesStatus,
 	}
 
@@ -86,7 +87,7 @@ func InitJsExtensionType() {
 	_ = mime.AddExtensionType(".js", "text/javascript; charset=utf-8")
 }
 
-func InitAutoObtainCert() {
+func InitCronJobs() {
 	s := gocron.NewScheduler(time.UTC)
 	job, err := s.Every(30).Minute().SingletonMode().Do(cert.AutoObtain)
 
@@ -94,5 +95,11 @@ func InitAutoObtainCert() {
 		logger.Fatalf("AutoCert Job: %v, Err: %v\n", job, err)
 	}
 
+	job, err = s.Every(settings.LogrotateSettings.Interval).Minute().SingletonMode().Do(logrotate.Exec)
+
+	if err != nil {
+		logger.Fatalf("LogRotate Job: %v, Err: %v\n", job, err)
+	}
+
 	s.StartAsync()
 }

+ 45 - 0
internal/logrotate/logrotate.go

@@ -0,0 +1,45 @@
+package logrotate
+
+import (
+	"github.com/0xJacky/Nginx-UI/internal/logger"
+	"github.com/0xJacky/Nginx-UI/settings"
+	"os/exec"
+	"strings"
+)
+
+func Exec() {
+	if !settings.LogrotateSettings.Enabled {
+		return
+	}
+
+	logger.Info("logrotate start")
+	defer logger.Info("logrotate end")
+	cmd := strings.Split(settings.LogrotateSettings.CMD, " ")
+
+	if len(cmd) == 0 {
+		return
+	}
+
+	var (
+		name string
+		args = make([]string, 0)
+	)
+
+	if len(cmd) > 0 {
+		name = cmd[0]
+	}
+
+	if len(cmd) > 1 {
+		args = cmd[1:]
+	}
+
+	out, err := exec.Command(name, args...).CombinedOutput()
+	if err != nil {
+		logger.Error(err, string(out))
+		return
+	}
+
+	if len(out) > 0 {
+		logger.Debug(string(out))
+	}
+}

+ 13 - 0
settings/logrotate.go

@@ -0,0 +1,13 @@
+package settings
+
+type Logrotate struct {
+	Enabled  bool   `json:"enabled"`
+	CMD      string `json:"cmd" protect:"true"`
+	Interval int    `json:"interval"`
+}
+
+var LogrotateSettings = Logrotate{
+	Enabled:  false,
+	CMD:      "logrotate /etc/logrotate.d/nginx",
+	Interval: 1440, // 24 hours
+}

+ 5 - 4
settings/settings.go

@@ -18,10 +18,11 @@ var (
 var ConfPath string
 
 var sections = map[string]interface{}{
-	"server":  &ServerSettings,
-	"nginx":   &NginxSettings,
-	"openai":  &OpenAISettings,
-	"casdoor": &CasdoorSettings,
+	"server":    &ServerSettings,
+	"nginx":     &NginxSettings,
+	"openai":    &OpenAISettings,
+	"casdoor":   &CasdoorSettings,
+	"logrotate": &LogrotateSettings,
 }
 
 func init() {