diff --git a/core/app/api/v2/setting.go b/core/app/api/v2/setting.go index fd8a61025cb7..22b5901b0ea3 100644 --- a/core/app/api/v2/setting.go +++ b/core/app/api/v2/setting.go @@ -6,7 +6,9 @@ import ( "net/http" "os" "path" + "path/filepath" "regexp" + "strconv" "strings" "github.com/1Panel-dev/1Panel/core/app/api/v2/helper" @@ -102,6 +104,50 @@ func (b *BaseApi) UpdateSetting(c *gin.Context) { } req.Value = value } + if req.Key == "OpsReportExportFormat" { + if !global.CONF.Base.IsEnterprise { + helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrNotSupportType", errors.New(req.Key)) + return + } + if _, ok := constant.OpsReportExportFormats[req.Value]; !ok { + helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrNotSupportType", errors.New(req.Value)) + return + } + } + if req.Key == "OpsReportSchedule" { + if !global.CONF.Base.IsEnterprise { + helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrNotSupportType", errors.New(req.Key)) + return + } + if _, ok := constant.OpsReportSchedules[req.Value]; !ok { + helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrNotSupportType", errors.New(req.Value)) + return + } + } + if req.Key == "OpsReportSavePath" { + if !global.CONF.Base.IsEnterprise { + helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrNotSupportType", errors.New(req.Key)) + return + } + value := strings.TrimSpace(req.Value) + if value == "" || !filepath.IsAbs(value) { + helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrInvalidParams", errors.New(req.Value)) + return + } + req.Value = filepath.Clean(value) + } + if req.Key == "OpsReportThreshold" { + if !global.CONF.Base.IsEnterprise { + helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrNotSupportType", errors.New(req.Key)) + return + } + threshold, err := strconv.Atoi(strings.TrimSpace(req.Value)) + if err != nil || threshold < 1 || threshold > 100 { + helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrInvalidParams", errors.New(req.Value)) + return + } + req.Value = strconv.Itoa(threshold) + } if err := settingService.Update(c, req.Key, req.Value); err != nil { helper.InternalServer(c, err) diff --git a/core/app/dto/setting.go b/core/app/dto/setting.go index f3b54a0c7cc7..39dfd431b5b8 100644 --- a/core/app/dto/setting.go +++ b/core/app/dto/setting.go @@ -46,6 +46,11 @@ type SettingInfo struct { ProxyUser string `json:"proxyUser"` ProxyPasswd string `json:"proxyPasswd"` ProxyPasswdKeep string `json:"proxyPasswdKeep"` + + OpsReportExportFormat string `json:"opsReportExportFormat"` + OpsReportSchedule string `json:"opsReportSchedule"` + OpsReportSavePath string `json:"opsReportSavePath"` + OpsReportThreshold string `json:"opsReportThreshold"` } type SettingBaseInfo struct { diff --git a/core/app/service/setting.go b/core/app/service/setting.go index 040f52459d49..e6afc3034af5 100644 --- a/core/app/service/setting.go +++ b/core/app/service/setting.go @@ -108,11 +108,41 @@ func (u *SettingService) GetSettingInfo() (*dto.SettingInfo, error) { } if !global.CONF.Base.IsEnterprise { info.IsOffline = constant.StatusDisable + } else { + u.ensureOpsReportSettingDefaults(&info) } return &info, err } +func (u *SettingService) ensureOpsReportSettingDefaults(info *dto.SettingInfo) { + if _, ok := constant.OpsReportExportFormats[info.OpsReportExportFormat]; !ok { + info.OpsReportExportFormat = constant.OpsReportExportFormatPDF + _ = settingRepo.UpdateOrCreate("OpsReportExportFormat", info.OpsReportExportFormat) + } + if _, ok := constant.OpsReportSchedules[info.OpsReportSchedule]; !ok { + info.OpsReportSchedule = constant.OpsReportScheduleWeekly + _ = settingRepo.UpdateOrCreate("OpsReportSchedule", info.OpsReportSchedule) + } + if strings.TrimSpace(info.OpsReportSavePath) == "" { + info.OpsReportSavePath = defaultOpsReportSavePath() + _ = settingRepo.UpdateOrCreate("OpsReportSavePath", info.OpsReportSavePath) + } + if !isValidOpsReportThreshold(info.OpsReportThreshold) { + info.OpsReportThreshold = constant.OpsReportDefaultThreshold + _ = settingRepo.UpdateOrCreate("OpsReportThreshold", info.OpsReportThreshold) + } +} + +func defaultOpsReportSavePath() string { + return path.Join(global.CONF.Base.InstallDir, constant.OpsReportDefaultSaveSubDir) +} + +func isValidOpsReportThreshold(value string) bool { + threshold, err := strconv.Atoi(strings.TrimSpace(value)) + return err == nil && threshold >= 1 && threshold <= 100 +} + func (u *SettingService) GetSettingBaseInfo() (*dto.SettingBaseInfo, error) { setting, err := settingRepo.List() if err != nil { diff --git a/core/constant/common.go b/core/constant/common.go index ab23170a5a89..056778622096 100644 --- a/core/constant/common.go +++ b/core/constant/common.go @@ -14,6 +14,15 @@ const ( DateTimeLayout = "2006-01-02 15:04:05" // or use time.DateTime while go version >= 1.20 DateTimeSlimLayout = "20060102150405" + OpsReportExportFormatPDF = "PDF" + OpsReportExportFormatHTML = "HTML" + OpsReportExportFormatMarkdown = "Markdown" + OpsReportScheduleDaily = "daily" + OpsReportScheduleWeekly = "weekly" + OpsReportScheduleMonthly = "monthly" + OpsReportDefaultThreshold = "80" + OpsReportDefaultSaveSubDir = "1panel/data/ops-report" + OrderDesc = "descending" OrderAsc = "ascending" @@ -183,10 +192,31 @@ var WebUrlMap = map[string]struct{}{ "/xpack/cluster/postgres": {}, "/xpack/cluster/redis": {}, - "/enterprise/users/list": {}, - "/enterprise/users/roles": {}, - "/enterprise/license": {}, - "/enterprise/license-required": {}, + "/enterprise/users/list": {}, + "/enterprise/users/roles": {}, + "/enterprise/license": {}, + "/enterprise/license-required": {}, + "/enterprise/ops-report": {}, + "/enterprise/ops-report/overview": {}, + "/enterprise/ops-report/system": {}, + "/enterprise/ops-report/login": {}, + "/enterprise/ops-report/website": {}, + "/enterprise/ops-report/resource": {}, + "/enterprise/ops-report/cronjob": {}, + "/enterprise/ops-report/history": {}, + "/enterprise/ops-report/settings": {}, +} + +var OpsReportExportFormats = map[string]struct{}{ + OpsReportExportFormatPDF: {}, + OpsReportExportFormatHTML: {}, + OpsReportExportFormatMarkdown: {}, +} + +var OpsReportSchedules = map[string]struct{}{ + OpsReportScheduleDaily: {}, + OpsReportScheduleWeekly: {}, + OpsReportScheduleMonthly: {}, } var DynamicRoutes = []string{ diff --git a/core/init/migration/helper/menu.go b/core/init/migration/helper/menu.go index 50f7027a8c33..9037afd9ef82 100644 --- a/core/init/migration/helper/menu.go +++ b/core/init/migration/helper/menu.go @@ -119,6 +119,15 @@ func LoadMenus() string { Path: "/enterprise/users", Sort: 350, }, "NodeDashboard") + item[i].Children = UpsertMenuByLabel(item[i].Children, dto.ShowMenu{ + ID: "122", + Disabled: false, + Title: "xpack.opsReport.name", + IsShow: true, + Label: "OpsReport", + Path: "/enterprise/ops-report", + Sort: 360, + }, "UserManagement") break } } @@ -159,6 +168,7 @@ func MenuSort() []dto.MenuLabelSort { {Label: "Node", Sort: 300}, {Label: "NodeDashboard", Sort: 300}, {Label: "UserManagement", Sort: 350}, + {Label: "OpsReport", Sort: 360}, {Label: "Upage", Sort: 400}, {Label: "MonitorDashboard", Sort: 500}, {Label: "Tamper", Sort: 600}, diff --git a/core/init/migration/migrate.go b/core/init/migration/migrate.go index b089186238b7..eb5e253ad0cb 100644 --- a/core/init/migration/migrate.go +++ b/core/init/migration/migrate.go @@ -39,6 +39,10 @@ func Init() { migrations.AddDocSourceSetting, migrations.AddAppStoreInstallAllowPortSetting, migrations.AddUserManagementMenu, + migrations.AddOpsReportMenu, + migrations.AddOpsReportSetting, + migrations.AddOpsReportScheduleSetting, + migrations.AddOpsReportThresholdSetting, migrations.AddAIBenchmarkMenu, migrations.AddAIProxyMenu, migrations.AddOperationLogUser, diff --git a/core/init/migration/migrations/init.go b/core/init/migration/migrations/init.go index c762477ed95c..4fff7861bd44 100644 --- a/core/init/migration/migrations/init.go +++ b/core/init/migration/migrations/init.go @@ -1155,6 +1155,115 @@ var AddUserManagementMenu = &gormigrate.Migration{ }, } +var AddOpsReportMenu = &gormigrate.Migration{ + ID: "20260512-add-ops-report-menu", + Migrate: func(tx *gorm.DB) error { + if !global.CONF.Base.IsEnterprise { + return nil + } + var menuJSON string + if err := tx.Model(&model.Setting{}).Where("key = ?", "HideMenu").Pluck("value", &menuJSON).Error; err != nil { + return err + } + if menuJSON == "" { + menuJSON = helper.LoadMenus() + } + + var menus []dto.ShowMenu + if err := json.Unmarshal([]byte(menuJSON), &menus); err != nil { + return tx.Model(&model.Setting{}). + Where("key = ?", "HideMenu"). + Update("value", helper.LoadMenus()).Error + } + + newItem := dto.ShowMenu{ + ID: "122", + Disabled: false, + Title: "xpack.opsReport.name", + IsShow: true, + Label: "OpsReport", + Path: "/enterprise/ops-report", + Sort: 360, + } + + for i := range menus { + if menus[i].Label != "Xpack-Menu" { + continue + } + menus[i].Children = helper.UpsertMenuByLabel(menus[i].Children, newItem, "UserManagement") + break + } + + updatedJSON, err := json.Marshal(menus) + if err != nil { + return tx.Model(&model.Setting{}). + Where("key = ?", "HideMenu"). + Update("value", helper.LoadMenus()).Error + } + return tx.Model(&model.Setting{}).Where("key = ?", "HideMenu").Update("value", string(updatedJSON)).Error + }, +} + +var AddOpsReportSetting = &gormigrate.Migration{ + ID: "20260512-add-ops-report-setting", + Migrate: func(tx *gorm.DB) error { + if !global.CONF.Base.IsEnterprise { + return nil + } + var count int64 + if err := tx.Model(&model.Setting{}).Where("key = ?", "OpsReportExportFormat").Count(&count).Error; err != nil { + return err + } + if count > 0 { + return nil + } + return tx.Create(&model.Setting{Key: "OpsReportExportFormat", Value: constant.OpsReportExportFormatPDF}).Error + }, +} + +var AddOpsReportScheduleSetting = &gormigrate.Migration{ + ID: "20260513-add-ops-report-schedule-setting", + Migrate: func(tx *gorm.DB) error { + if !global.CONF.Base.IsEnterprise { + return nil + } + settings := []model.Setting{ + {Key: "OpsReportSchedule", Value: constant.OpsReportScheduleWeekly}, + {Key: "OpsReportSavePath", Value: path.Join(global.CONF.Base.InstallDir, constant.OpsReportDefaultSaveSubDir)}, + } + for _, item := range settings { + var count int64 + if err := tx.Model(&model.Setting{}).Where("key = ?", item.Key).Count(&count).Error; err != nil { + return err + } + if count > 0 { + continue + } + if err := tx.Create(&item).Error; err != nil { + return err + } + } + return nil + }, +} + +var AddOpsReportThresholdSetting = &gormigrate.Migration{ + ID: "20260513-add-ops-report-threshold-setting", + Migrate: func(tx *gorm.DB) error { + if !global.CONF.Base.IsEnterprise { + return nil + } + var count int64 + if err := tx.Model(&model.Setting{}).Where("key = ?", "OpsReportThreshold").Count(&count).Error; err != nil { + return err + } + if count > 0 { + return nil + } + return tx.Create(&model.Setting{Key: "OpsReportThreshold", Value: constant.OpsReportDefaultThreshold}).Error + }, +} + var AddOperationLogUser = &gormigrate.Migration{ ID: "20260424-add-operation-log-user", Migrate: func(tx *gorm.DB) error { diff --git a/core/init/validator/validator.go b/core/init/validator/validator.go index b0f426fc5320..1caa584a7541 100644 --- a/core/init/validator/validator.go +++ b/core/init/validator/validator.go @@ -47,6 +47,10 @@ var baseSettingKeys = map[string]struct{}{ "AppStoreLastModified": {}, "ScriptSync": {}, "HideMenu": {}, + "OpsReportExportFormat": {}, + "OpsReportSchedule": {}, + "OpsReportSavePath": {}, + "OpsReportThreshold": {}, } func checkNamePattern(fl validator.FieldLevel) bool { diff --git a/frontend/src/api/interface/log.ts b/frontend/src/api/interface/log.ts index a39114ddcff3..ee907ab087c6 100644 --- a/frontend/src/api/interface/log.ts +++ b/frontend/src/api/interface/log.ts @@ -6,19 +6,16 @@ export namespace Log { id: number; source: string; user: string; - action: string; + node: string; ip: string; path: string; method: string; userAgent: string; - body: string; - resp: string; - - status: number; + status: string; latency: number; - errorMessage: string; - - detail: string; + message: string; + detailZH: string; + detailEN: string; createdAt: DateTimeFormats; } export interface SearchOpLog extends ReqPage { diff --git a/frontend/src/api/interface/setting.ts b/frontend/src/api/interface/setting.ts index c3734f9d4e55..7c8f8252fbef 100644 --- a/frontend/src/api/interface/setting.ts +++ b/frontend/src/api/interface/setting.ts @@ -69,6 +69,11 @@ export namespace Setting { proxyUser: string; proxyPasswd: string; proxyPasswdKeep: string; + + opsReportExportFormat: string; + opsReportSchedule: string; + opsReportSavePath: string; + opsReportThreshold: string; } export interface SettingBaseInfo { systemVersion: string; diff --git a/frontend/src/api/modules/log.ts b/frontend/src/api/modules/log.ts index 354ff68af567..2d0e10fdaf0b 100644 --- a/frontend/src/api/modules/log.ts +++ b/frontend/src/api/modules/log.ts @@ -8,7 +8,7 @@ export const getOperationLogs = (info: Log.SearchOpLog) => { }; export const getLoginLogs = (info: Log.SearchLgLog) => { - return http.post>(`/core/logs/login`, info); + return http.post>(`/core/logs/login`, info); }; export const getSystemFiles = (node?: string) => { diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 1c5a3c63bee1..c84bb0240489 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1858,6 +1858,7 @@ const message = { licenses: 'License', nodes: 'Node', commands: 'Quick Commands', + opsReport: 'Ops Report', }, websiteLog: 'Website logs', runLog: 'Run logs', @@ -3808,6 +3809,314 @@ const message = { menu: 'Pro', upage: 'AI Website Builder', proAlert: 'Upgrade to Pro to use this feature', + opsReport: { + name: 'Ops Report', + overview: 'Overview', + system: 'Host Runtime', + login: 'Login & Security', + website: 'Website Protection', + resource: 'Runtime Resources', + cronjob: 'Cron Jobs', + history: 'Export History', + setting: 'Settings', + page: { + enterprise: 'Enterprise', + scoreMeta: '{0} points deducted · {1} risks', + hostAddress: 'Host Address', + panelVersion: '1Panel Version', + cpuCores: 'Physical Cores', + coreUnit: '{0} cores', + memoryTotal: 'Memory Total', + reportDate: 'Report Date', + serverSecurityOverview: 'Server Security Operations Overview', + securityScore: 'Security Score', + overviewSummary: + 'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.', + riskDistribution: 'Risk Distribution', + totalDeducted: 'Total deducted', + noRiskDeducted: 'No deductions', + scoreTrend: 'Score Trend', + scoreLevelSafe: 'Safe', + scoreLevelAttention: 'Needs Attention', + scoreLevelMediumRisk: 'Medium Risk', + scoreLevelHighRisk: 'High Risk', + scoreCategoryHost: 'Host Resources', + scoreCategoryLogin: 'Login Security', + scoreCategoryWebsite: 'Websites & Certificates', + scoreCategoryCronjob: 'Cron Jobs', + scoreCategoryResource: 'Runtime Resources', + scoreDiskHigh: 'Disk {0} usage is {1}%', + scoreDiskMedium: 'Disk {0} usage is {1}%', + scoreResourceHigh: '{0} current usage is {1}%', + scoreResourceMedium: '{0} current usage is {1}%', + scoreLoadMedium: 'Current load is {0}', + scoreMonitorDisabled: 'Host monitoring is disabled', + scorePanelLoginFailedHigh: '1Panel login failed {0} times', + scorePanelLoginFailedMedium: '1Panel login failed {0} times', + scoreSSHLoginFailedHigh: 'SSH login failed {0} times', + scoreSSHLoginFailedMedium: 'SSH login failed {0} times', + scoreMFADisabled: 'MFA is disabled', + scoreAllowIPsOpen: 'Allowed IPs are not configured or too broad', + scorePasswordExpired: 'Panel password has expired', + scorePasswordExpiring: 'Panel password expires in {0} days', + scorePanelHTTPSDisabled: 'Panel HTTPS is disabled', + scoreSSHRootLogin: 'SSH root login is allowed', + scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth', + scoreSSLHigh: '{0} certificate expires in {1} days', + scoreSSLMedium: '{0} certificate expires in {1} days', + scoreWebsiteExpire: '{0} website expires in {1} days', + scoreWebsiteHTTP: '{0} does not use HTTPS', + scoreWebsiteStopped: '{0} status is abnormal', + scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site', + scoreWebsiteMonitorAvailability: 'Website monitoring availability {0}% is below the threshold', + scoreWafDisabled: 'WAF is disabled and websites are not protected', + scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period', + scoreCronjobFailed: '{0} cron job failure records in the last 7 days', + scoreAppFailed: '{0} app is abnormal', + scoreAppStopped: '{0} app has stopped', + scoreContainerHigh: '{0} container status is abnormal', + scoreContainerExited: '{0} container has stopped', + scoreContainerResource: '{0} container resource usage is high', + attentionItems: 'Attention Items', + attentionAssets: 'Attention Assets', + riskItems: 'Risk Items', + object: 'Object', + description: 'Description', + itemUnit: 'items', + recordUnit: 'records', + certUnit: 'certs', + containerUnit: 'containers', + loginFailed: 'Failed Logins', + sslExpire: 'Certificate Expiry', + abnormalContainer: 'Abnormal Containers', + statAttentionDesc: '{0} points deducted', + statLoginDesc: 'Panel {0} · SSH {1}', + statSslDesc: '{0} certificates checked', + statContainerDesc: '{0} containers checked', + assetHostDesc: 'Max disk usage {0}%', + assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites', + assetResourceDesc: '{0} abnormal apps, {1} stopped apps, {2} abnormal containers', + assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs', + app: 'Apps', + website: 'Websites', + websiteSsl: 'Websites / Certificates', + cronjob: 'Cron Jobs', + container: 'Containers', + sslCertificate: 'SSL Certificates', + loginSecurity: 'Login Security', + panelLogin: '1Panel Login', + sshLogin: 'SSH Login', + failedRecord: 'Failed Records', + expiredDays: 'Expired {0} days ago', + remainingDays: '{0} · {1} days left', + enabled: 'Enabled', + disabled: 'Disabled', + exportRecordFailed: 'Failed to save export record', + hostInfo: 'Host Info', + hostname: 'Hostname', + osVersion: 'OS Version', + kernelVersion: 'Kernel Version', + arch: 'Architecture', + uptime: 'Uptime', + diskUsage: 'Disk Usage', + mountPoint: 'Mount Point', + device: 'Device', + capacity: 'Capacity', + used: 'Used', + usageRate: 'Usage', + memory: 'Memory', + load: 'Load', + maxDiskUsage: 'Max Disk Usage', + panelLoginSecurity: '1Panel Login Security', + sshSecurity: 'Linux Server SSH Security', + panelFailedRecords: '1Panel Failed Login Records', + sshFailedRecords: 'SSH Failed Login Records', + location: 'Location', + configItem: 'Config Item', + currentValue: 'Current Value', + securityEntrance: 'Security Entrance', + configured: 'Configured', + notConfigured: 'Not Configured', + normal: 'Normal', + needAttention: 'Needs Attention', + allowIPs: 'Allowed IPs', + restricted: 'Restricted', + unrestricted: 'Unrestricted', + bindDomain: 'Bound Domain', + panelHTTPS: 'Panel HTTPS', + passwordComplexity: 'Password Complexity', + sshService: 'SSH Service', + running: 'Running', + notRunning: 'Not Running', + listenPort: 'Listen Port', + read: 'Read', + rootLogin: 'Root Login', + passwordAuth: 'Password Auth', + keyAuth: 'Key Auth', + panelLoginFailed: '1Panel Failed Logins', + sshLoginFailed: 'SSH Failed Logins', + panelSecurityItems: 'Panel Security Items', + sshSecurityItems: 'SSH Security Items', + websiteOverview: 'Website Overview', + primaryDomain: 'Primary Domain', + expireTime: 'Expiry Time', + domain: 'Domain', + issuer: 'Issuer', + autoRenew: 'Auto Renew', + websiteCount: 'Websites', + httpsWebsite: 'HTTPS Websites', + certCount: 'Certificates', + websiteExpire: 'Website Expiry', + database: 'Databases', + remoteDatabase: 'Remote Databases', + address: 'Address', + containerResourceUsage: 'Container Resource Usage', + spaceUsage: 'Space Usage', + reclaimable: 'Reclaimable', + containerReclaimable: 'Container Reclaimable', + image: 'Images', + volume: 'Volumes', + buildCache: 'Build Cache', + alert: 'Alert', + alertConfigured: 'Alerts Configured', + failedExecutionRecords: 'Failed Execution Records', + taskID: 'Task ID', + executeTime: 'Execution Time', + backupTasks: 'Backup Tasks', + systemMetrics: 'Runtime Metrics', + cpu: 'CPU', + thresholdPercent: 'Threshold {0}%', + loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}', + sourceMount: 'Mount point {0}', + storageUsage: 'Storage Usage', + localDisk: 'Local Disk', + highUsagePeriods: 'High Usage Periods', + timeRange: 'Time Range', + threshold: 'Threshold', + duration: 'Duration', + peak: 'Peak', + scoring: 'Scoring', + counted: 'Counted', + notCounted: 'Not Counted', + dataSource: 'Data Source', + noHighUsagePeriod: 'No high usage periods', + monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available', + to: 'to', + hoursShort: '{0} h', + minutesShort: '{0} min', + websiteStatus: 'Website Status', + sslRisk: 'Certificate Risks', + sslExpiring: 'Expiring Certificates', + includedInReport: 'Included in report', + needRenewal: 'Renewal recommended', + fromExpireInfo: 'From expiry information', + runningWebsite: 'Running Websites', + fromWebsiteStatus: 'From website list status', + stoppedWebsite: 'Stopped Websites', + confirmStoppedWebsite: 'Confirm whether this is expected', + expiringWebsite: 'Expiring Websites', + expiringSoon: 'Expiring Soon', + none: 'None', + noSslRisk: 'No certificates need handling', + websiteProtection: 'WAF and Website Monitoring', + websiteMonitor: 'Website Monitoring', + waf: 'WAF', + siteAvailability: 'Site Availability', + monitoredSites: 'Monitored Sites', + requestCount: 'Requests', + abnormalSites: 'Abnormal Sites', + count5xxSource: 'Counted by 5xx requests', + wafIntercept: 'WAF Blocks', + highRiskHit: 'High-risk Hits', + websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available', + wafDisabledOrNoData: 'WAF is disabled or no block data is available', + noWafData: 'No WAF block data', + sourceIP: 'Source IP', + hitCount: 'Hits', + level: 'Level', + attackType: 'Attack Type', + requestRatio: 'Request Ratio', + installed: 'Installed', + normalRunning: 'Running Normally', + failedStart: 'Startup Failed', + manualStopped: 'Manually Stopped', + failed: 'Failed', + success: 'Success', + canUpdate: 'Upgradable', + listSeparator: ', ', + containerCount: 'Containers', + stopped: 'Stopped', + abnormal: 'Abnormal', + abnormalContainers: 'Abnormal Containers', + resourceUsage: 'Resource Usage', + exposedContainerPorts: 'Exposed Ports', + portMapping: 'Port Mapping', + risk: 'Risk', + noAbnormalContainer: 'No abnormal containers', + noExposedContainer: 'No exposed ports detected', + publicExpose: 'Public Exposure', + privateExpose: 'Private Mapping', + executionRecords: 'Execution Records', + successRate: 'Success Rate', + failedJobs: 'Failed Jobs', + recentRecoveryPoint: 'Latest Recovery Point', + remoteCoverage: 'Remote Coverage', + recent7Days: 'Last 7 days', + taskTypeStats: 'Task Type Statistics', + total: 'Total', + taskTypeDesc: '{0} enabled, {1} disabled', + failedOrAttentionTasks: 'Failed or Attention Tasks', + execution: 'Execution', + latestExecution: 'Latest Execution', + remoteBackup: 'Remote Backup', + localOnly: 'Local Only', + covered: 'Covered', + noAttentionCronjob: 'No failed or attention cron jobs', + generationRule: 'Generation Rules', + scheduleDaily: 'Daily', + scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day', + scheduleWeekly: 'Weekly', + scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday', + scheduleMonthly: 'Monthly', + scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st', + scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}', + scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}', + scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}', + notificationMethod: 'Notification Methods', + channel: 'Channel', + receiver: 'Receiver', + systemThreshold: 'System Threshold', + metric: 'Metric', + currentRule: 'Current Rule', + hostMonitor: 'Host Monitor', + monitorInterval: 'Monitor Interval', + exportSettings: 'Export Settings', + defaultFormat: 'Default Format', + savePath: 'Save Directory', + savePathRequired: 'Set the report save directory', + generateNow: 'Generate Now', + generateSuccess: 'Report file generated: {0}', + generateFailed: 'Failed to generate report', + enabledStatus: 'Enabled', + disabledStatus: 'Disabled', + thresholdRule: 'Threshold {0}, trigger after {1} consecutive times', + hours: '{0} hours', + minutes: '{0} minutes', + seconds: '{0} seconds', + totalExports: 'Total Exports', + successExports: 'Successful Exports', + failedExports: 'Failed Exports', + reportName: 'Report Name', + exportFormat: 'Export Format', + operator: 'Operator', + triggerType: 'Trigger', + filePath: 'File Path', + manualExport: 'Manual', + scheduledExport: 'Scheduled', + exportResult: 'Export Result', + exportDetail: 'Export Detail', + }, + }, user: { user: 'User', userInfo: 'User Info', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index 328e81b9bdab..0a5f2e8b8699 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -1906,6 +1906,7 @@ const message = { licenses: 'Licencia', nodes: 'Nodo', commands: 'Comandos rápidos', + opsReport: 'Informe de operaciones', }, websiteLog: 'Logs de sitio web', runLog: 'Logs de ejecución', @@ -3861,6 +3862,314 @@ const message = { menu: 'Pro', upage: 'Constructor Web con IA', proAlert: 'Actualiza a Pro para usar esta función', + opsReport: { + name: 'Informe de operaciones', + overview: 'Resumen', + system: 'Ejecución del host', + login: 'Inicio de sesión y seguridad', + website: 'Protección de sitios web', + resource: 'Recursos de ejecución', + cronjob: 'Tareas programadas', + history: 'Historial de exportación', + setting: 'Configuración', + page: { + enterprise: 'Enterprise', + scoreMeta: '{0} points deducted · {1} risks', + hostAddress: 'Host Address', + panelVersion: '1Panel Version', + cpuCores: 'Physical Cores', + coreUnit: '{0} cores', + memoryTotal: 'Memory Total', + reportDate: 'Report Date', + serverSecurityOverview: 'Server Security Operations Overview', + securityScore: 'Security Score', + overviewSummary: + 'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.', + riskDistribution: 'Risk Distribution', + totalDeducted: 'Total deducted', + noRiskDeducted: 'No deductions', + scoreTrend: 'Score Trend', + scoreLevelSafe: 'Safe', + scoreLevelAttention: 'Needs Attention', + scoreLevelMediumRisk: 'Medium Risk', + scoreLevelHighRisk: 'High Risk', + scoreCategoryHost: 'Host Resources', + scoreCategoryLogin: 'Login Security', + scoreCategoryWebsite: 'Websites & Certificates', + scoreCategoryCronjob: 'Cron Jobs', + scoreCategoryResource: 'Runtime Resources', + scoreDiskHigh: 'Disk {0} usage is {1}%', + scoreDiskMedium: 'Disk {0} usage is {1}%', + scoreResourceHigh: '{0} current usage is {1}%', + scoreResourceMedium: '{0} current usage is {1}%', + scoreLoadMedium: 'Current load is {0}', + scoreMonitorDisabled: 'Host monitoring is disabled', + scorePanelLoginFailedHigh: '1Panel login failed {0} times', + scorePanelLoginFailedMedium: '1Panel login failed {0} times', + scoreSSHLoginFailedHigh: 'SSH login failed {0} times', + scoreSSHLoginFailedMedium: 'SSH login failed {0} times', + scoreMFADisabled: 'MFA is disabled', + scoreAllowIPsOpen: 'Allowed IPs are not configured or too broad', + scorePasswordExpired: 'Panel password has expired', + scorePasswordExpiring: 'Panel password expires in {0} days', + scorePanelHTTPSDisabled: 'Panel HTTPS is disabled', + scoreSSHRootLogin: 'SSH root login is allowed', + scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth', + scoreSSLHigh: '{0} certificate expires in {1} days', + scoreSSLMedium: '{0} certificate expires in {1} days', + scoreWebsiteExpire: '{0} website expires in {1} days', + scoreWebsiteHTTP: '{0} does not use HTTPS', + scoreWebsiteStopped: '{0} status is abnormal', + scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site', + scoreWebsiteMonitorAvailability: 'Website monitoring availability {0}% is below the threshold', + scoreWafDisabled: 'WAF is disabled and websites are not protected', + scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period', + scoreCronjobFailed: '{0} cron job failure records in the last 7 days', + scoreAppFailed: '{0} app is abnormal', + scoreAppStopped: '{0} app has stopped', + scoreContainerHigh: '{0} container status is abnormal', + scoreContainerExited: '{0} container has stopped', + scoreContainerResource: '{0} container resource usage is high', + attentionItems: 'Attention Items', + attentionAssets: 'Attention Assets', + riskItems: 'Risk Items', + object: 'Object', + description: 'Description', + itemUnit: 'items', + recordUnit: 'records', + certUnit: 'certs', + containerUnit: 'containers', + loginFailed: 'Failed Logins', + sslExpire: 'Certificate Expiry', + abnormalContainer: 'Abnormal Containers', + statAttentionDesc: '{0} points deducted', + statLoginDesc: 'Panel {0} · SSH {1}', + statSslDesc: '{0} certificates checked', + statContainerDesc: '{0} containers checked', + assetHostDesc: 'Max disk usage {0}%', + assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites', + assetResourceDesc: '{0} abnormal apps, {1} stopped apps, {2} abnormal containers', + assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs', + app: 'Apps', + website: 'Websites', + websiteSsl: 'Websites / Certificates', + cronjob: 'Cron Jobs', + container: 'Containers', + sslCertificate: 'SSL Certificates', + loginSecurity: 'Login Security', + panelLogin: '1Panel Login', + sshLogin: 'SSH Login', + failedRecord: 'Failed Records', + expiredDays: 'Expired {0} days ago', + remainingDays: '{0} · {1} days left', + enabled: 'Enabled', + disabled: 'Disabled', + exportRecordFailed: 'Failed to save export record', + hostInfo: 'Host Info', + hostname: 'Hostname', + osVersion: 'OS Version', + kernelVersion: 'Kernel Version', + arch: 'Architecture', + uptime: 'Uptime', + diskUsage: 'Disk Usage', + mountPoint: 'Mount Point', + device: 'Device', + capacity: 'Capacity', + used: 'Used', + usageRate: 'Usage', + memory: 'Memory', + load: 'Load', + maxDiskUsage: 'Max Disk Usage', + panelLoginSecurity: '1Panel Login Security', + sshSecurity: 'Linux Server SSH Security', + panelFailedRecords: '1Panel Failed Login Records', + sshFailedRecords: 'SSH Failed Login Records', + location: 'Location', + configItem: 'Config Item', + currentValue: 'Current Value', + securityEntrance: 'Security Entrance', + configured: 'Configured', + notConfigured: 'Not Configured', + normal: 'Normal', + needAttention: 'Needs Attention', + allowIPs: 'Allowed IPs', + restricted: 'Restricted', + unrestricted: 'Unrestricted', + bindDomain: 'Bound Domain', + panelHTTPS: 'Panel HTTPS', + passwordComplexity: 'Password Complexity', + sshService: 'SSH Service', + running: 'Running', + notRunning: 'Not Running', + listenPort: 'Listen Port', + read: 'Read', + rootLogin: 'Root Login', + passwordAuth: 'Password Auth', + keyAuth: 'Key Auth', + panelLoginFailed: '1Panel Failed Logins', + sshLoginFailed: 'SSH Failed Logins', + panelSecurityItems: 'Panel Security Items', + sshSecurityItems: 'SSH Security Items', + websiteOverview: 'Website Overview', + primaryDomain: 'Primary Domain', + expireTime: 'Expiry Time', + domain: 'Domain', + issuer: 'Issuer', + autoRenew: 'Auto Renew', + websiteCount: 'Websites', + httpsWebsite: 'HTTPS Websites', + certCount: 'Certificates', + websiteExpire: 'Website Expiry', + database: 'Databases', + remoteDatabase: 'Remote Databases', + address: 'Address', + containerResourceUsage: 'Container Resource Usage', + spaceUsage: 'Space Usage', + reclaimable: 'Reclaimable', + containerReclaimable: 'Container Reclaimable', + image: 'Images', + volume: 'Volumes', + buildCache: 'Build Cache', + alert: 'Alert', + alertConfigured: 'Alerts Configured', + failedExecutionRecords: 'Failed Execution Records', + taskID: 'Task ID', + executeTime: 'Execution Time', + backupTasks: 'Backup Tasks', + systemMetrics: 'Runtime Metrics', + cpu: 'CPU', + thresholdPercent: 'Umbral {0}%', + loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}', + sourceMount: 'Mount point {0}', + storageUsage: 'Storage Usage', + localDisk: 'Local Disk', + highUsagePeriods: 'High Usage Periods', + timeRange: 'Time Range', + threshold: 'Umbral', + duration: 'Duration', + peak: 'Peak', + scoring: 'Scoring', + counted: 'Counted', + notCounted: 'Not Counted', + dataSource: 'Data Source', + noHighUsagePeriod: 'No high usage periods', + monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available', + to: 'to', + hoursShort: '{0} h', + minutesShort: '{0} min', + websiteStatus: 'Website Status', + sslRisk: 'Certificate Risks', + sslExpiring: 'Expiring Certificates', + includedInReport: 'Included in report', + needRenewal: 'Renewal recommended', + fromExpireInfo: 'From expiry information', + runningWebsite: 'Running Websites', + fromWebsiteStatus: 'From website list status', + stoppedWebsite: 'Stopped Websites', + confirmStoppedWebsite: 'Confirm whether this is expected', + expiringWebsite: 'Expiring Websites', + expiringSoon: 'Expiring Soon', + none: 'None', + noSslRisk: 'No certificates need handling', + websiteProtection: 'WAF and Website Monitoring', + websiteMonitor: 'Website Monitoring', + waf: 'WAF', + siteAvailability: 'Site Availability', + monitoredSites: 'Monitored Sites', + requestCount: 'Requests', + abnormalSites: 'Abnormal Sites', + count5xxSource: 'Counted by 5xx requests', + wafIntercept: 'WAF Blocks', + highRiskHit: 'High-risk Hits', + websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available', + wafDisabledOrNoData: 'WAF is disabled or no block data is available', + noWafData: 'No WAF block data', + sourceIP: 'Source IP', + hitCount: 'Hits', + level: 'Level', + attackType: 'Attack Type', + requestRatio: 'Request Ratio', + installed: 'Installed', + normalRunning: 'Running Normally', + failedStart: 'Startup Failed', + manualStopped: 'Manually Stopped', + failed: 'Failed', + success: 'Success', + canUpdate: 'Upgradable', + listSeparator: ', ', + containerCount: 'Containers', + stopped: 'Stopped', + abnormal: 'Abnormal', + abnormalContainers: 'Abnormal Containers', + resourceUsage: 'Resource Usage', + exposedContainerPorts: 'Exposed Ports', + portMapping: 'Port Mapping', + risk: 'Risk', + noAbnormalContainer: 'No abnormal containers', + noExposedContainer: 'No exposed ports detected', + publicExpose: 'Public Exposure', + privateExpose: 'Private Mapping', + executionRecords: 'Execution Records', + successRate: 'Success Rate', + failedJobs: 'Failed Jobs', + recentRecoveryPoint: 'Latest Recovery Point', + remoteCoverage: 'Remote Coverage', + recent7Days: 'Last 7 days', + taskTypeStats: 'Task Type Statistics', + total: 'Total', + taskTypeDesc: '{0} enabled, {1} disabled', + failedOrAttentionTasks: 'Failed or Attention Tasks', + execution: 'Execution', + latestExecution: 'Latest Execution', + remoteBackup: 'Remote Backup', + localOnly: 'Local Only', + covered: 'Covered', + noAttentionCronjob: 'No failed or attention cron jobs', + generationRule: 'Generation Rules', + scheduleDaily: 'Daily', + scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day', + scheduleWeekly: 'Weekly', + scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday', + scheduleMonthly: 'Monthly', + scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st', + scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}', + scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}', + scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}', + notificationMethod: 'Notification Methods', + channel: 'Channel', + receiver: 'Receiver', + systemThreshold: 'Umbral del sistema', + metric: 'Metric', + currentRule: 'Current Rule', + hostMonitor: 'Host Monitor', + monitorInterval: 'Monitor Interval', + exportSettings: 'Export Settings', + defaultFormat: 'Default Format', + savePath: 'Save Directory', + savePathRequired: 'Set the report save directory', + generateNow: 'Generate Now', + generateSuccess: 'Report file generated: {0}', + generateFailed: 'Failed to generate report', + enabledStatus: 'Enabled', + disabledStatus: 'Disabled', + thresholdRule: 'Threshold {0}, trigger after {1} consecutive times', + hours: '{0} hours', + minutes: '{0} minutes', + seconds: '{0} seconds', + totalExports: 'Total Exports', + successExports: 'Successful Exports', + failedExports: 'Failed Exports', + reportName: 'Report Name', + exportFormat: 'Export Format', + operator: 'Operator', + triggerType: 'Trigger', + filePath: 'File Path', + manualExport: 'Manual', + scheduledExport: 'Scheduled', + exportResult: 'Export Result', + exportDetail: 'Export Detail', + }, + }, user: { user: 'Usuario', userInfo: 'Información de usuario', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index dce99bbd6d36..cf38d9313d4a 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1877,6 +1877,7 @@ const message = { licenses: 'ライセンス', nodes: 'ノード', commands: 'クイックコマンド', + opsReport: '運用レポート', }, websiteLog: 'ウェブサイトログ', runLog: 'ログを実行します', @@ -3845,6 +3846,314 @@ const message = { menu: 'Рro', upage: 'AIウェブサイトビルダー', proAlert: 'この機能を使用するにはProにアップグレードしてください', + opsReport: { + name: '運用レポート', + overview: '概要', + system: 'ホスト稼働', + login: 'ログインとセキュリティ', + website: 'Web サイト保護', + resource: '実行リソース', + cronjob: 'スケジュールタスク', + history: 'エクスポート履歴', + setting: '設定', + page: { + enterprise: 'Enterprise', + scoreMeta: '{0} points deducted · {1} risks', + hostAddress: 'Host Address', + panelVersion: '1Panel Version', + cpuCores: 'Physical Cores', + coreUnit: '{0} cores', + memoryTotal: 'Memory Total', + reportDate: 'Report Date', + serverSecurityOverview: 'Server Security Operations Overview', + securityScore: 'Security Score', + overviewSummary: + 'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.', + riskDistribution: 'Risk Distribution', + totalDeducted: 'Total deducted', + noRiskDeducted: 'No deductions', + scoreTrend: 'Score Trend', + scoreLevelSafe: 'Safe', + scoreLevelAttention: 'Needs Attention', + scoreLevelMediumRisk: 'Medium Risk', + scoreLevelHighRisk: 'High Risk', + scoreCategoryHost: 'Host Resources', + scoreCategoryLogin: 'Login Security', + scoreCategoryWebsite: 'Websites & Certificates', + scoreCategoryCronjob: 'Cron Jobs', + scoreCategoryResource: 'Runtime Resources', + scoreDiskHigh: 'Disk {0} usage is {1}%', + scoreDiskMedium: 'Disk {0} usage is {1}%', + scoreResourceHigh: '{0} current usage is {1}%', + scoreResourceMedium: '{0} current usage is {1}%', + scoreLoadMedium: 'Current load is {0}', + scoreMonitorDisabled: 'Host monitoring is disabled', + scorePanelLoginFailedHigh: '1Panel login failed {0} times', + scorePanelLoginFailedMedium: '1Panel login failed {0} times', + scoreSSHLoginFailedHigh: 'SSH login failed {0} times', + scoreSSHLoginFailedMedium: 'SSH login failed {0} times', + scoreMFADisabled: 'MFA is disabled', + scoreAllowIPsOpen: 'Allowed IPs are not configured or too broad', + scorePasswordExpired: 'Panel password has expired', + scorePasswordExpiring: 'Panel password expires in {0} days', + scorePanelHTTPSDisabled: 'Panel HTTPS is disabled', + scoreSSHRootLogin: 'SSH root login is allowed', + scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth', + scoreSSLHigh: '{0} certificate expires in {1} days', + scoreSSLMedium: '{0} certificate expires in {1} days', + scoreWebsiteExpire: '{0} website expires in {1} days', + scoreWebsiteHTTP: '{0} does not use HTTPS', + scoreWebsiteStopped: '{0} status is abnormal', + scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site', + scoreWebsiteMonitorAvailability: 'Website monitoring availability {0}% is below the threshold', + scoreWafDisabled: 'WAF is disabled and websites are not protected', + scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period', + scoreCronjobFailed: '{0} cron job failure records in the last 7 days', + scoreAppFailed: '{0} app is abnormal', + scoreAppStopped: '{0} app has stopped', + scoreContainerHigh: '{0} container status is abnormal', + scoreContainerExited: '{0} container has stopped', + scoreContainerResource: '{0} container resource usage is high', + attentionItems: 'Attention Items', + attentionAssets: 'Attention Assets', + riskItems: 'Risk Items', + object: 'Object', + description: 'Description', + itemUnit: 'items', + recordUnit: 'records', + certUnit: 'certs', + containerUnit: 'containers', + loginFailed: 'Failed Logins', + sslExpire: 'Certificate Expiry', + abnormalContainer: 'Abnormal Containers', + statAttentionDesc: '{0} points deducted', + statLoginDesc: 'Panel {0} · SSH {1}', + statSslDesc: '{0} certificates checked', + statContainerDesc: '{0} containers checked', + assetHostDesc: 'Max disk usage {0}%', + assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites', + assetResourceDesc: '{0} abnormal apps, {1} stopped apps, {2} abnormal containers', + assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs', + app: 'Apps', + website: 'Websites', + websiteSsl: 'Websites / Certificates', + cronjob: 'Cron Jobs', + container: 'Containers', + sslCertificate: 'SSL Certificates', + loginSecurity: 'Login Security', + panelLogin: '1Panel Login', + sshLogin: 'SSH Login', + failedRecord: 'Failed Records', + expiredDays: 'Expired {0} days ago', + remainingDays: '{0} · {1} days left', + enabled: 'Enabled', + disabled: 'Disabled', + exportRecordFailed: 'Failed to save export record', + hostInfo: 'Host Info', + hostname: 'Hostname', + osVersion: 'OS Version', + kernelVersion: 'Kernel Version', + arch: 'Architecture', + uptime: 'Uptime', + diskUsage: 'Disk Usage', + mountPoint: 'Mount Point', + device: 'Device', + capacity: 'Capacity', + used: 'Used', + usageRate: 'Usage', + memory: 'Memory', + load: 'Load', + maxDiskUsage: 'Max Disk Usage', + panelLoginSecurity: '1Panel Login Security', + sshSecurity: 'Linux Server SSH Security', + panelFailedRecords: '1Panel Failed Login Records', + sshFailedRecords: 'SSH Failed Login Records', + location: 'Location', + configItem: 'Config Item', + currentValue: 'Current Value', + securityEntrance: 'Security Entrance', + configured: 'Configured', + notConfigured: 'Not Configured', + normal: 'Normal', + needAttention: 'Needs Attention', + allowIPs: 'Allowed IPs', + restricted: 'Restricted', + unrestricted: 'Unrestricted', + bindDomain: 'Bound Domain', + panelHTTPS: 'Panel HTTPS', + passwordComplexity: 'Password Complexity', + sshService: 'SSH Service', + running: 'Running', + notRunning: 'Not Running', + listenPort: 'Listen Port', + read: 'Read', + rootLogin: 'Root Login', + passwordAuth: 'Password Auth', + keyAuth: 'Key Auth', + panelLoginFailed: '1Panel Failed Logins', + sshLoginFailed: 'SSH Failed Logins', + panelSecurityItems: 'Panel Security Items', + sshSecurityItems: 'SSH Security Items', + websiteOverview: 'Website Overview', + primaryDomain: 'Primary Domain', + expireTime: 'Expiry Time', + domain: 'Domain', + issuer: 'Issuer', + autoRenew: 'Auto Renew', + websiteCount: 'Websites', + httpsWebsite: 'HTTPS Websites', + certCount: 'Certificates', + websiteExpire: 'Website Expiry', + database: 'Databases', + remoteDatabase: 'Remote Databases', + address: 'Address', + containerResourceUsage: 'Container Resource Usage', + spaceUsage: 'Space Usage', + reclaimable: 'Reclaimable', + containerReclaimable: 'Container Reclaimable', + image: 'Images', + volume: 'Volumes', + buildCache: 'Build Cache', + alert: 'Alert', + alertConfigured: 'Alerts Configured', + failedExecutionRecords: 'Failed Execution Records', + taskID: 'Task ID', + executeTime: 'Execution Time', + backupTasks: 'Backup Tasks', + systemMetrics: 'Runtime Metrics', + cpu: 'CPU', + thresholdPercent: 'しきい値 {0}%', + loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}', + sourceMount: 'Mount point {0}', + storageUsage: 'Storage Usage', + localDisk: 'Local Disk', + highUsagePeriods: 'High Usage Periods', + timeRange: 'Time Range', + threshold: 'しきい値', + duration: 'Duration', + peak: 'Peak', + scoring: 'Scoring', + counted: 'Counted', + notCounted: 'Not Counted', + dataSource: 'Data Source', + noHighUsagePeriod: 'No high usage periods', + monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available', + to: 'to', + hoursShort: '{0} h', + minutesShort: '{0} min', + websiteStatus: 'Website Status', + sslRisk: 'Certificate Risks', + sslExpiring: 'Expiring Certificates', + includedInReport: 'Included in report', + needRenewal: 'Renewal recommended', + fromExpireInfo: 'From expiry information', + runningWebsite: 'Running Websites', + fromWebsiteStatus: 'From website list status', + stoppedWebsite: 'Stopped Websites', + confirmStoppedWebsite: 'Confirm whether this is expected', + expiringWebsite: 'Expiring Websites', + expiringSoon: 'Expiring Soon', + none: 'None', + noSslRisk: 'No certificates need handling', + websiteProtection: 'WAF and Website Monitoring', + websiteMonitor: 'Website Monitoring', + waf: 'WAF', + siteAvailability: 'Site Availability', + monitoredSites: 'Monitored Sites', + requestCount: 'Requests', + abnormalSites: 'Abnormal Sites', + count5xxSource: 'Counted by 5xx requests', + wafIntercept: 'WAF Blocks', + highRiskHit: 'High-risk Hits', + websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available', + wafDisabledOrNoData: 'WAF is disabled or no block data is available', + noWafData: 'No WAF block data', + sourceIP: 'Source IP', + hitCount: 'Hits', + level: 'Level', + attackType: 'Attack Type', + requestRatio: 'Request Ratio', + installed: 'Installed', + normalRunning: 'Running Normally', + failedStart: 'Startup Failed', + manualStopped: 'Manually Stopped', + failed: 'Failed', + success: 'Success', + canUpdate: 'Upgradable', + listSeparator: ', ', + containerCount: 'Containers', + stopped: 'Stopped', + abnormal: 'Abnormal', + abnormalContainers: 'Abnormal Containers', + resourceUsage: 'Resource Usage', + exposedContainerPorts: 'Exposed Ports', + portMapping: 'Port Mapping', + risk: 'Risk', + noAbnormalContainer: 'No abnormal containers', + noExposedContainer: 'No exposed ports detected', + publicExpose: 'Public Exposure', + privateExpose: 'Private Mapping', + executionRecords: 'Execution Records', + successRate: 'Success Rate', + failedJobs: 'Failed Jobs', + recentRecoveryPoint: 'Latest Recovery Point', + remoteCoverage: 'Remote Coverage', + recent7Days: 'Last 7 days', + taskTypeStats: 'Task Type Statistics', + total: 'Total', + taskTypeDesc: '{0} enabled, {1} disabled', + failedOrAttentionTasks: 'Failed or Attention Tasks', + execution: 'Execution', + latestExecution: 'Latest Execution', + remoteBackup: 'Remote Backup', + localOnly: 'Local Only', + covered: 'Covered', + noAttentionCronjob: 'No failed or attention cron jobs', + generationRule: 'Generation Rules', + scheduleDaily: 'Daily', + scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day', + scheduleWeekly: 'Weekly', + scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday', + scheduleMonthly: 'Monthly', + scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st', + scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}', + scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}', + scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}', + notificationMethod: 'Notification Methods', + channel: 'Channel', + receiver: 'Receiver', + systemThreshold: 'システムしきい値', + metric: 'Metric', + currentRule: 'Current Rule', + hostMonitor: 'Host Monitor', + monitorInterval: 'Monitor Interval', + exportSettings: 'Export Settings', + defaultFormat: 'Default Format', + savePath: 'Save Directory', + savePathRequired: 'Set the report save directory', + generateNow: 'Generate Now', + generateSuccess: 'Report file generated: {0}', + generateFailed: 'Failed to generate report', + enabledStatus: 'Enabled', + disabledStatus: 'Disabled', + thresholdRule: 'Threshold {0}, trigger after {1} consecutive times', + hours: '{0} hours', + minutes: '{0} minutes', + seconds: '{0} seconds', + totalExports: 'Total Exports', + successExports: 'Successful Exports', + failedExports: 'Failed Exports', + reportName: 'Report Name', + exportFormat: 'Export Format', + operator: 'Operator', + triggerType: 'Trigger', + filePath: 'File Path', + manualExport: 'Manual', + scheduledExport: 'Scheduled', + exportResult: 'Export Result', + exportDetail: 'Export Detail', + }, + }, user: { user: 'ユーザー', userInfo: 'ユーザー情報', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 345c9499d152..656d138b3d89 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -1837,6 +1837,7 @@ const message = { licenses: '라이선스', nodes: '노드', commands: '빠른 명령', + opsReport: '운영 보고서', }, websiteLog: '웹사이트 로그', runLog: '실행 로그', @@ -3761,6 +3762,314 @@ const message = { menu: 'Pro', upage: 'AI 웹사이트 빌더', proAlert: '이 기능을 사용하려면 Pro로 업그레이드하세요', + opsReport: { + name: '운영 보고서', + overview: '개요', + system: '호스트 실행', + login: '로그인 및 보안', + website: '웹사이트 보호', + resource: '실행 리소스', + cronjob: '예약 작업', + history: '내보내기 기록', + setting: '설정', + page: { + enterprise: 'Enterprise', + scoreMeta: '{0} points deducted · {1} risks', + hostAddress: 'Host Address', + panelVersion: '1Panel Version', + cpuCores: 'Physical Cores', + coreUnit: '{0} cores', + memoryTotal: 'Memory Total', + reportDate: 'Report Date', + serverSecurityOverview: 'Server Security Operations Overview', + securityScore: 'Security Score', + overviewSummary: + 'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.', + riskDistribution: 'Risk Distribution', + totalDeducted: 'Total deducted', + noRiskDeducted: 'No deductions', + scoreTrend: 'Score Trend', + scoreLevelSafe: 'Safe', + scoreLevelAttention: 'Needs Attention', + scoreLevelMediumRisk: 'Medium Risk', + scoreLevelHighRisk: 'High Risk', + scoreCategoryHost: 'Host Resources', + scoreCategoryLogin: 'Login Security', + scoreCategoryWebsite: 'Websites & Certificates', + scoreCategoryCronjob: 'Cron Jobs', + scoreCategoryResource: 'Runtime Resources', + scoreDiskHigh: 'Disk {0} usage is {1}%', + scoreDiskMedium: 'Disk {0} usage is {1}%', + scoreResourceHigh: '{0} current usage is {1}%', + scoreResourceMedium: '{0} current usage is {1}%', + scoreLoadMedium: 'Current load is {0}', + scoreMonitorDisabled: 'Host monitoring is disabled', + scorePanelLoginFailedHigh: '1Panel login failed {0} times', + scorePanelLoginFailedMedium: '1Panel login failed {0} times', + scoreSSHLoginFailedHigh: 'SSH login failed {0} times', + scoreSSHLoginFailedMedium: 'SSH login failed {0} times', + scoreMFADisabled: 'MFA is disabled', + scoreAllowIPsOpen: 'Allowed IPs are not configured or too broad', + scorePasswordExpired: 'Panel password has expired', + scorePasswordExpiring: 'Panel password expires in {0} days', + scorePanelHTTPSDisabled: 'Panel HTTPS is disabled', + scoreSSHRootLogin: 'SSH root login is allowed', + scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth', + scoreSSLHigh: '{0} certificate expires in {1} days', + scoreSSLMedium: '{0} certificate expires in {1} days', + scoreWebsiteExpire: '{0} website expires in {1} days', + scoreWebsiteHTTP: '{0} does not use HTTPS', + scoreWebsiteStopped: '{0} status is abnormal', + scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site', + scoreWebsiteMonitorAvailability: 'Website monitoring availability {0}% is below the threshold', + scoreWafDisabled: 'WAF is disabled and websites are not protected', + scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period', + scoreCronjobFailed: '{0} cron job failure records in the last 7 days', + scoreAppFailed: '{0} app is abnormal', + scoreAppStopped: '{0} app has stopped', + scoreContainerHigh: '{0} container status is abnormal', + scoreContainerExited: '{0} container has stopped', + scoreContainerResource: '{0} container resource usage is high', + attentionItems: 'Attention Items', + attentionAssets: 'Attention Assets', + riskItems: 'Risk Items', + object: 'Object', + description: 'Description', + itemUnit: 'items', + recordUnit: 'records', + certUnit: 'certs', + containerUnit: 'containers', + loginFailed: 'Failed Logins', + sslExpire: 'Certificate Expiry', + abnormalContainer: 'Abnormal Containers', + statAttentionDesc: '{0} points deducted', + statLoginDesc: 'Panel {0} · SSH {1}', + statSslDesc: '{0} certificates checked', + statContainerDesc: '{0} containers checked', + assetHostDesc: 'Max disk usage {0}%', + assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites', + assetResourceDesc: '{0} abnormal apps, {1} stopped apps, {2} abnormal containers', + assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs', + app: 'Apps', + website: 'Websites', + websiteSsl: 'Websites / Certificates', + cronjob: 'Cron Jobs', + container: 'Containers', + sslCertificate: 'SSL Certificates', + loginSecurity: 'Login Security', + panelLogin: '1Panel Login', + sshLogin: 'SSH Login', + failedRecord: 'Failed Records', + expiredDays: 'Expired {0} days ago', + remainingDays: '{0} · {1} days left', + enabled: 'Enabled', + disabled: 'Disabled', + exportRecordFailed: 'Failed to save export record', + hostInfo: 'Host Info', + hostname: 'Hostname', + osVersion: 'OS Version', + kernelVersion: 'Kernel Version', + arch: 'Architecture', + uptime: 'Uptime', + diskUsage: 'Disk Usage', + mountPoint: 'Mount Point', + device: 'Device', + capacity: 'Capacity', + used: 'Used', + usageRate: 'Usage', + memory: 'Memory', + load: 'Load', + maxDiskUsage: 'Max Disk Usage', + panelLoginSecurity: '1Panel Login Security', + sshSecurity: 'Linux Server SSH Security', + panelFailedRecords: '1Panel Failed Login Records', + sshFailedRecords: 'SSH Failed Login Records', + location: 'Location', + configItem: 'Config Item', + currentValue: 'Current Value', + securityEntrance: 'Security Entrance', + configured: 'Configured', + notConfigured: 'Not Configured', + normal: 'Normal', + needAttention: 'Needs Attention', + allowIPs: 'Allowed IPs', + restricted: 'Restricted', + unrestricted: 'Unrestricted', + bindDomain: 'Bound Domain', + panelHTTPS: 'Panel HTTPS', + passwordComplexity: 'Password Complexity', + sshService: 'SSH Service', + running: 'Running', + notRunning: 'Not Running', + listenPort: 'Listen Port', + read: 'Read', + rootLogin: 'Root Login', + passwordAuth: 'Password Auth', + keyAuth: 'Key Auth', + panelLoginFailed: '1Panel Failed Logins', + sshLoginFailed: 'SSH Failed Logins', + panelSecurityItems: 'Panel Security Items', + sshSecurityItems: 'SSH Security Items', + websiteOverview: 'Website Overview', + primaryDomain: 'Primary Domain', + expireTime: 'Expiry Time', + domain: 'Domain', + issuer: 'Issuer', + autoRenew: 'Auto Renew', + websiteCount: 'Websites', + httpsWebsite: 'HTTPS Websites', + certCount: 'Certificates', + websiteExpire: 'Website Expiry', + database: 'Databases', + remoteDatabase: 'Remote Databases', + address: 'Address', + containerResourceUsage: 'Container Resource Usage', + spaceUsage: 'Space Usage', + reclaimable: 'Reclaimable', + containerReclaimable: 'Container Reclaimable', + image: 'Images', + volume: 'Volumes', + buildCache: 'Build Cache', + alert: 'Alert', + alertConfigured: 'Alerts Configured', + failedExecutionRecords: 'Failed Execution Records', + taskID: 'Task ID', + executeTime: 'Execution Time', + backupTasks: 'Backup Tasks', + systemMetrics: 'Runtime Metrics', + cpu: 'CPU', + thresholdPercent: '임계값 {0}%', + loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}', + sourceMount: 'Mount point {0}', + storageUsage: 'Storage Usage', + localDisk: 'Local Disk', + highUsagePeriods: 'High Usage Periods', + timeRange: 'Time Range', + threshold: '임계값', + duration: 'Duration', + peak: 'Peak', + scoring: 'Scoring', + counted: 'Counted', + notCounted: 'Not Counted', + dataSource: 'Data Source', + noHighUsagePeriod: 'No high usage periods', + monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available', + to: 'to', + hoursShort: '{0} h', + minutesShort: '{0} min', + websiteStatus: 'Website Status', + sslRisk: 'Certificate Risks', + sslExpiring: 'Expiring Certificates', + includedInReport: 'Included in report', + needRenewal: 'Renewal recommended', + fromExpireInfo: 'From expiry information', + runningWebsite: 'Running Websites', + fromWebsiteStatus: 'From website list status', + stoppedWebsite: 'Stopped Websites', + confirmStoppedWebsite: 'Confirm whether this is expected', + expiringWebsite: 'Expiring Websites', + expiringSoon: 'Expiring Soon', + none: 'None', + noSslRisk: 'No certificates need handling', + websiteProtection: 'WAF and Website Monitoring', + websiteMonitor: 'Website Monitoring', + waf: 'WAF', + siteAvailability: 'Site Availability', + monitoredSites: 'Monitored Sites', + requestCount: 'Requests', + abnormalSites: 'Abnormal Sites', + count5xxSource: 'Counted by 5xx requests', + wafIntercept: 'WAF Blocks', + highRiskHit: 'High-risk Hits', + websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available', + wafDisabledOrNoData: 'WAF is disabled or no block data is available', + noWafData: 'No WAF block data', + sourceIP: 'Source IP', + hitCount: 'Hits', + level: 'Level', + attackType: 'Attack Type', + requestRatio: 'Request Ratio', + installed: 'Installed', + normalRunning: 'Running Normally', + failedStart: 'Startup Failed', + manualStopped: 'Manually Stopped', + failed: 'Failed', + success: 'Success', + canUpdate: 'Upgradable', + listSeparator: ', ', + containerCount: 'Containers', + stopped: 'Stopped', + abnormal: 'Abnormal', + abnormalContainers: 'Abnormal Containers', + resourceUsage: 'Resource Usage', + exposedContainerPorts: 'Exposed Ports', + portMapping: 'Port Mapping', + risk: 'Risk', + noAbnormalContainer: 'No abnormal containers', + noExposedContainer: 'No exposed ports detected', + publicExpose: 'Public Exposure', + privateExpose: 'Private Mapping', + executionRecords: 'Execution Records', + successRate: 'Success Rate', + failedJobs: 'Failed Jobs', + recentRecoveryPoint: 'Latest Recovery Point', + remoteCoverage: 'Remote Coverage', + recent7Days: 'Last 7 days', + taskTypeStats: 'Task Type Statistics', + total: 'Total', + taskTypeDesc: '{0} enabled, {1} disabled', + failedOrAttentionTasks: 'Failed or Attention Tasks', + execution: 'Execution', + latestExecution: 'Latest Execution', + remoteBackup: 'Remote Backup', + localOnly: 'Local Only', + covered: 'Covered', + noAttentionCronjob: 'No failed or attention cron jobs', + generationRule: 'Generation Rules', + scheduleDaily: 'Daily', + scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day', + scheduleWeekly: 'Weekly', + scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday', + scheduleMonthly: 'Monthly', + scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st', + scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}', + scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}', + scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}', + notificationMethod: 'Notification Methods', + channel: 'Channel', + receiver: 'Receiver', + systemThreshold: '시스템 임계값', + metric: 'Metric', + currentRule: 'Current Rule', + hostMonitor: 'Host Monitor', + monitorInterval: 'Monitor Interval', + exportSettings: 'Export Settings', + defaultFormat: 'Default Format', + savePath: 'Save Directory', + savePathRequired: 'Set the report save directory', + generateNow: 'Generate Now', + generateSuccess: 'Report file generated: {0}', + generateFailed: 'Failed to generate report', + enabledStatus: 'Enabled', + disabledStatus: 'Disabled', + thresholdRule: 'Threshold {0}, trigger after {1} consecutive times', + hours: '{0} hours', + minutes: '{0} minutes', + seconds: '{0} seconds', + totalExports: 'Total Exports', + successExports: 'Successful Exports', + failedExports: 'Failed Exports', + reportName: 'Report Name', + exportFormat: 'Export Format', + operator: 'Operator', + triggerType: 'Trigger', + filePath: 'File Path', + manualExport: 'Manual', + scheduledExport: 'Scheduled', + exportResult: 'Export Result', + exportDetail: 'Export Detail', + }, + }, user: { user: '사용자', userInfo: '사용자 정보', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 467e5d5932ab..de343eef2407 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -1904,6 +1904,7 @@ const message = { licenses: 'lesen', nodes: 'nod', commands: 'Perintah Pantas', + opsReport: 'Laporan Operasi', }, websiteLog: 'Log Laman Web', runLog: 'Log Jalankan', @@ -3900,6 +3901,314 @@ const message = { menu: 'Pro', upage: 'Pembina Laman Web AI', proAlert: 'Tingkatkan ke Pro untuk menggunakan ciri ini', + opsReport: { + name: 'Laporan Operasi', + overview: 'Gambaran Keseluruhan', + system: 'Operasi Hos', + login: 'Log Masuk & Keselamatan', + website: 'Perlindungan Laman Web', + resource: 'Sumber Operasi', + cronjob: 'Tugas Berjadual', + history: 'Sejarah Eksport', + setting: 'Tetapan', + page: { + enterprise: 'Enterprise', + scoreMeta: '{0} points deducted · {1} risks', + hostAddress: 'Host Address', + panelVersion: '1Panel Version', + cpuCores: 'Physical Cores', + coreUnit: '{0} cores', + memoryTotal: 'Memory Total', + reportDate: 'Report Date', + serverSecurityOverview: 'Server Security Operations Overview', + securityScore: 'Security Score', + overviewSummary: + 'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.', + riskDistribution: 'Risk Distribution', + totalDeducted: 'Total deducted', + noRiskDeducted: 'No deductions', + scoreTrend: 'Score Trend', + scoreLevelSafe: 'Safe', + scoreLevelAttention: 'Needs Attention', + scoreLevelMediumRisk: 'Medium Risk', + scoreLevelHighRisk: 'High Risk', + scoreCategoryHost: 'Host Resources', + scoreCategoryLogin: 'Login Security', + scoreCategoryWebsite: 'Websites & Certificates', + scoreCategoryCronjob: 'Cron Jobs', + scoreCategoryResource: 'Runtime Resources', + scoreDiskHigh: 'Disk {0} usage is {1}%', + scoreDiskMedium: 'Disk {0} usage is {1}%', + scoreResourceHigh: '{0} current usage is {1}%', + scoreResourceMedium: '{0} current usage is {1}%', + scoreLoadMedium: 'Current load is {0}', + scoreMonitorDisabled: 'Host monitoring is disabled', + scorePanelLoginFailedHigh: '1Panel login failed {0} times', + scorePanelLoginFailedMedium: '1Panel login failed {0} times', + scoreSSHLoginFailedHigh: 'SSH login failed {0} times', + scoreSSHLoginFailedMedium: 'SSH login failed {0} times', + scoreMFADisabled: 'MFA is disabled', + scoreAllowIPsOpen: 'Allowed IPs are not configured or too broad', + scorePasswordExpired: 'Panel password has expired', + scorePasswordExpiring: 'Panel password expires in {0} days', + scorePanelHTTPSDisabled: 'Panel HTTPS is disabled', + scoreSSHRootLogin: 'SSH root login is allowed', + scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth', + scoreSSLHigh: '{0} certificate expires in {1} days', + scoreSSLMedium: '{0} certificate expires in {1} days', + scoreWebsiteExpire: '{0} website expires in {1} days', + scoreWebsiteHTTP: '{0} does not use HTTPS', + scoreWebsiteStopped: '{0} status is abnormal', + scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site', + scoreWebsiteMonitorAvailability: 'Website monitoring availability {0}% is below the threshold', + scoreWafDisabled: 'WAF is disabled and websites are not protected', + scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period', + scoreCronjobFailed: '{0} cron job failure records in the last 7 days', + scoreAppFailed: '{0} app is abnormal', + scoreAppStopped: '{0} app has stopped', + scoreContainerHigh: '{0} container status is abnormal', + scoreContainerExited: '{0} container has stopped', + scoreContainerResource: '{0} container resource usage is high', + attentionItems: 'Attention Items', + attentionAssets: 'Attention Assets', + riskItems: 'Risk Items', + object: 'Object', + description: 'Description', + itemUnit: 'items', + recordUnit: 'records', + certUnit: 'certs', + containerUnit: 'containers', + loginFailed: 'Failed Logins', + sslExpire: 'Certificate Expiry', + abnormalContainer: 'Abnormal Containers', + statAttentionDesc: '{0} points deducted', + statLoginDesc: 'Panel {0} · SSH {1}', + statSslDesc: '{0} certificates checked', + statContainerDesc: '{0} containers checked', + assetHostDesc: 'Max disk usage {0}%', + assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites', + assetResourceDesc: '{0} abnormal apps, {1} stopped apps, {2} abnormal containers', + assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs', + app: 'Apps', + website: 'Websites', + websiteSsl: 'Websites / Certificates', + cronjob: 'Cron Jobs', + container: 'Containers', + sslCertificate: 'SSL Certificates', + loginSecurity: 'Login Security', + panelLogin: '1Panel Login', + sshLogin: 'SSH Login', + failedRecord: 'Failed Records', + expiredDays: 'Expired {0} days ago', + remainingDays: '{0} · {1} days left', + enabled: 'Enabled', + disabled: 'Disabled', + exportRecordFailed: 'Failed to save export record', + hostInfo: 'Host Info', + hostname: 'Hostname', + osVersion: 'OS Version', + kernelVersion: 'Kernel Version', + arch: 'Architecture', + uptime: 'Uptime', + diskUsage: 'Disk Usage', + mountPoint: 'Mount Point', + device: 'Device', + capacity: 'Capacity', + used: 'Used', + usageRate: 'Usage', + memory: 'Memory', + load: 'Load', + maxDiskUsage: 'Max Disk Usage', + panelLoginSecurity: '1Panel Login Security', + sshSecurity: 'Linux Server SSH Security', + panelFailedRecords: '1Panel Failed Login Records', + sshFailedRecords: 'SSH Failed Login Records', + location: 'Location', + configItem: 'Config Item', + currentValue: 'Current Value', + securityEntrance: 'Security Entrance', + configured: 'Configured', + notConfigured: 'Not Configured', + normal: 'Normal', + needAttention: 'Needs Attention', + allowIPs: 'Allowed IPs', + restricted: 'Restricted', + unrestricted: 'Unrestricted', + bindDomain: 'Bound Domain', + panelHTTPS: 'Panel HTTPS', + passwordComplexity: 'Password Complexity', + sshService: 'SSH Service', + running: 'Running', + notRunning: 'Not Running', + listenPort: 'Listen Port', + read: 'Read', + rootLogin: 'Root Login', + passwordAuth: 'Password Auth', + keyAuth: 'Key Auth', + panelLoginFailed: '1Panel Failed Logins', + sshLoginFailed: 'SSH Failed Logins', + panelSecurityItems: 'Panel Security Items', + sshSecurityItems: 'SSH Security Items', + websiteOverview: 'Website Overview', + primaryDomain: 'Primary Domain', + expireTime: 'Expiry Time', + domain: 'Domain', + issuer: 'Issuer', + autoRenew: 'Auto Renew', + websiteCount: 'Websites', + httpsWebsite: 'HTTPS Websites', + certCount: 'Certificates', + websiteExpire: 'Website Expiry', + database: 'Databases', + remoteDatabase: 'Remote Databases', + address: 'Address', + containerResourceUsage: 'Container Resource Usage', + spaceUsage: 'Space Usage', + reclaimable: 'Reclaimable', + containerReclaimable: 'Container Reclaimable', + image: 'Images', + volume: 'Volumes', + buildCache: 'Build Cache', + alert: 'Alert', + alertConfigured: 'Alerts Configured', + failedExecutionRecords: 'Failed Execution Records', + taskID: 'Task ID', + executeTime: 'Execution Time', + backupTasks: 'Backup Tasks', + systemMetrics: 'Runtime Metrics', + cpu: 'CPU', + thresholdPercent: 'Ambang {0}%', + loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}', + sourceMount: 'Mount point {0}', + storageUsage: 'Storage Usage', + localDisk: 'Local Disk', + highUsagePeriods: 'High Usage Periods', + timeRange: 'Time Range', + threshold: 'Ambang', + duration: 'Duration', + peak: 'Peak', + scoring: 'Scoring', + counted: 'Counted', + notCounted: 'Not Counted', + dataSource: 'Data Source', + noHighUsagePeriod: 'No high usage periods', + monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available', + to: 'to', + hoursShort: '{0} h', + minutesShort: '{0} min', + websiteStatus: 'Website Status', + sslRisk: 'Certificate Risks', + sslExpiring: 'Expiring Certificates', + includedInReport: 'Included in report', + needRenewal: 'Renewal recommended', + fromExpireInfo: 'From expiry information', + runningWebsite: 'Running Websites', + fromWebsiteStatus: 'From website list status', + stoppedWebsite: 'Stopped Websites', + confirmStoppedWebsite: 'Confirm whether this is expected', + expiringWebsite: 'Expiring Websites', + expiringSoon: 'Expiring Soon', + none: 'None', + noSslRisk: 'No certificates need handling', + websiteProtection: 'WAF and Website Monitoring', + websiteMonitor: 'Website Monitoring', + waf: 'WAF', + siteAvailability: 'Site Availability', + monitoredSites: 'Monitored Sites', + requestCount: 'Requests', + abnormalSites: 'Abnormal Sites', + count5xxSource: 'Counted by 5xx requests', + wafIntercept: 'WAF Blocks', + highRiskHit: 'High-risk Hits', + websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available', + wafDisabledOrNoData: 'WAF is disabled or no block data is available', + noWafData: 'No WAF block data', + sourceIP: 'Source IP', + hitCount: 'Hits', + level: 'Level', + attackType: 'Attack Type', + requestRatio: 'Request Ratio', + installed: 'Installed', + normalRunning: 'Running Normally', + failedStart: 'Startup Failed', + manualStopped: 'Manually Stopped', + failed: 'Failed', + success: 'Success', + canUpdate: 'Upgradable', + listSeparator: ', ', + containerCount: 'Containers', + stopped: 'Stopped', + abnormal: 'Abnormal', + abnormalContainers: 'Abnormal Containers', + resourceUsage: 'Resource Usage', + exposedContainerPorts: 'Exposed Ports', + portMapping: 'Port Mapping', + risk: 'Risk', + noAbnormalContainer: 'No abnormal containers', + noExposedContainer: 'No exposed ports detected', + publicExpose: 'Public Exposure', + privateExpose: 'Private Mapping', + executionRecords: 'Execution Records', + successRate: 'Success Rate', + failedJobs: 'Failed Jobs', + recentRecoveryPoint: 'Latest Recovery Point', + remoteCoverage: 'Remote Coverage', + recent7Days: 'Last 7 days', + taskTypeStats: 'Task Type Statistics', + total: 'Total', + taskTypeDesc: '{0} enabled, {1} disabled', + failedOrAttentionTasks: 'Failed or Attention Tasks', + execution: 'Execution', + latestExecution: 'Latest Execution', + remoteBackup: 'Remote Backup', + localOnly: 'Local Only', + covered: 'Covered', + noAttentionCronjob: 'No failed or attention cron jobs', + generationRule: 'Generation Rules', + scheduleDaily: 'Daily', + scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day', + scheduleWeekly: 'Weekly', + scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday', + scheduleMonthly: 'Monthly', + scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st', + scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}', + scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}', + scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}', + notificationMethod: 'Notification Methods', + channel: 'Channel', + receiver: 'Receiver', + systemThreshold: 'Ambang Sistem', + metric: 'Metric', + currentRule: 'Current Rule', + hostMonitor: 'Host Monitor', + monitorInterval: 'Monitor Interval', + exportSettings: 'Export Settings', + defaultFormat: 'Default Format', + savePath: 'Save Directory', + savePathRequired: 'Set the report save directory', + generateNow: 'Generate Now', + generateSuccess: 'Report file generated: {0}', + generateFailed: 'Failed to generate report', + enabledStatus: 'Enabled', + disabledStatus: 'Disabled', + thresholdRule: 'Threshold {0}, trigger after {1} consecutive times', + hours: '{0} hours', + minutes: '{0} minutes', + seconds: '{0} seconds', + totalExports: 'Total Exports', + successExports: 'Successful Exports', + failedExports: 'Failed Exports', + reportName: 'Report Name', + exportFormat: 'Export Format', + operator: 'Operator', + triggerType: 'Trigger', + filePath: 'File Path', + manualExport: 'Manual', + scheduledExport: 'Scheduled', + exportResult: 'Export Result', + exportDetail: 'Export Detail', + }, + }, user: { user: 'Pengguna', userInfo: 'Maklumat Pengguna', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 4cce6262bcef..d54664588d4f 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -2018,6 +2018,7 @@ const message = { licenses: 'licenças', nodes: 'nós', commands: 'Comandos Rápidos', + opsReport: 'Relatório de Operações', }, websiteLog: 'Logs do website', runLog: 'Logs de execução', @@ -4039,6 +4040,314 @@ const message = { menu: 'Pro', upage: 'Construtor de Sites com IA', proAlert: 'Atualize para Pro para usar este recurso', + opsReport: { + name: 'Relatório de Operações', + overview: 'Visão geral', + system: 'Execução do host', + login: 'Login e segurança', + website: 'Proteção de sites', + resource: 'Recursos de execução', + cronjob: 'Tarefas agendadas', + history: 'Histórico de exportação', + setting: 'Configurações', + page: { + enterprise: 'Enterprise', + scoreMeta: '{0} points deducted · {1} risks', + hostAddress: 'Host Address', + panelVersion: '1Panel Version', + cpuCores: 'Physical Cores', + coreUnit: '{0} cores', + memoryTotal: 'Memory Total', + reportDate: 'Report Date', + serverSecurityOverview: 'Server Security Operations Overview', + securityScore: 'Security Score', + overviewSummary: + 'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.', + riskDistribution: 'Risk Distribution', + totalDeducted: 'Total deducted', + noRiskDeducted: 'No deductions', + scoreTrend: 'Score Trend', + scoreLevelSafe: 'Safe', + scoreLevelAttention: 'Needs Attention', + scoreLevelMediumRisk: 'Medium Risk', + scoreLevelHighRisk: 'High Risk', + scoreCategoryHost: 'Host Resources', + scoreCategoryLogin: 'Login Security', + scoreCategoryWebsite: 'Websites & Certificates', + scoreCategoryCronjob: 'Cron Jobs', + scoreCategoryResource: 'Runtime Resources', + scoreDiskHigh: 'Disk {0} usage is {1}%', + scoreDiskMedium: 'Disk {0} usage is {1}%', + scoreResourceHigh: '{0} current usage is {1}%', + scoreResourceMedium: '{0} current usage is {1}%', + scoreLoadMedium: 'Current load is {0}', + scoreMonitorDisabled: 'Host monitoring is disabled', + scorePanelLoginFailedHigh: '1Panel login failed {0} times', + scorePanelLoginFailedMedium: '1Panel login failed {0} times', + scoreSSHLoginFailedHigh: 'SSH login failed {0} times', + scoreSSHLoginFailedMedium: 'SSH login failed {0} times', + scoreMFADisabled: 'MFA is disabled', + scoreAllowIPsOpen: 'Allowed IPs are not configured or too broad', + scorePasswordExpired: 'Panel password has expired', + scorePasswordExpiring: 'Panel password expires in {0} days', + scorePanelHTTPSDisabled: 'Panel HTTPS is disabled', + scoreSSHRootLogin: 'SSH root login is allowed', + scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth', + scoreSSLHigh: '{0} certificate expires in {1} days', + scoreSSLMedium: '{0} certificate expires in {1} days', + scoreWebsiteExpire: '{0} website expires in {1} days', + scoreWebsiteHTTP: '{0} does not use HTTPS', + scoreWebsiteStopped: '{0} status is abnormal', + scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site', + scoreWebsiteMonitorAvailability: 'Website monitoring availability {0}% is below the threshold', + scoreWafDisabled: 'WAF is disabled and websites are not protected', + scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period', + scoreCronjobFailed: '{0} cron job failure records in the last 7 days', + scoreAppFailed: '{0} app is abnormal', + scoreAppStopped: '{0} app has stopped', + scoreContainerHigh: '{0} container status is abnormal', + scoreContainerExited: '{0} container has stopped', + scoreContainerResource: '{0} container resource usage is high', + attentionItems: 'Attention Items', + attentionAssets: 'Attention Assets', + riskItems: 'Risk Items', + object: 'Object', + description: 'Description', + itemUnit: 'items', + recordUnit: 'records', + certUnit: 'certs', + containerUnit: 'containers', + loginFailed: 'Failed Logins', + sslExpire: 'Certificate Expiry', + abnormalContainer: 'Abnormal Containers', + statAttentionDesc: '{0} points deducted', + statLoginDesc: 'Panel {0} · SSH {1}', + statSslDesc: '{0} certificates checked', + statContainerDesc: '{0} containers checked', + assetHostDesc: 'Max disk usage {0}%', + assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites', + assetResourceDesc: '{0} abnormal apps, {1} stopped apps, {2} abnormal containers', + assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs', + app: 'Apps', + website: 'Websites', + websiteSsl: 'Websites / Certificates', + cronjob: 'Cron Jobs', + container: 'Containers', + sslCertificate: 'SSL Certificates', + loginSecurity: 'Login Security', + panelLogin: '1Panel Login', + sshLogin: 'SSH Login', + failedRecord: 'Failed Records', + expiredDays: 'Expired {0} days ago', + remainingDays: '{0} · {1} days left', + enabled: 'Enabled', + disabled: 'Disabled', + exportRecordFailed: 'Failed to save export record', + hostInfo: 'Host Info', + hostname: 'Hostname', + osVersion: 'OS Version', + kernelVersion: 'Kernel Version', + arch: 'Architecture', + uptime: 'Uptime', + diskUsage: 'Disk Usage', + mountPoint: 'Mount Point', + device: 'Device', + capacity: 'Capacity', + used: 'Used', + usageRate: 'Usage', + memory: 'Memory', + load: 'Load', + maxDiskUsage: 'Max Disk Usage', + panelLoginSecurity: '1Panel Login Security', + sshSecurity: 'Linux Server SSH Security', + panelFailedRecords: '1Panel Failed Login Records', + sshFailedRecords: 'SSH Failed Login Records', + location: 'Location', + configItem: 'Config Item', + currentValue: 'Current Value', + securityEntrance: 'Security Entrance', + configured: 'Configured', + notConfigured: 'Not Configured', + normal: 'Normal', + needAttention: 'Needs Attention', + allowIPs: 'Allowed IPs', + restricted: 'Restricted', + unrestricted: 'Unrestricted', + bindDomain: 'Bound Domain', + panelHTTPS: 'Panel HTTPS', + passwordComplexity: 'Password Complexity', + sshService: 'SSH Service', + running: 'Running', + notRunning: 'Not Running', + listenPort: 'Listen Port', + read: 'Read', + rootLogin: 'Root Login', + passwordAuth: 'Password Auth', + keyAuth: 'Key Auth', + panelLoginFailed: '1Panel Failed Logins', + sshLoginFailed: 'SSH Failed Logins', + panelSecurityItems: 'Panel Security Items', + sshSecurityItems: 'SSH Security Items', + websiteOverview: 'Website Overview', + primaryDomain: 'Primary Domain', + expireTime: 'Expiry Time', + domain: 'Domain', + issuer: 'Issuer', + autoRenew: 'Auto Renew', + websiteCount: 'Websites', + httpsWebsite: 'HTTPS Websites', + certCount: 'Certificates', + websiteExpire: 'Website Expiry', + database: 'Databases', + remoteDatabase: 'Remote Databases', + address: 'Address', + containerResourceUsage: 'Container Resource Usage', + spaceUsage: 'Space Usage', + reclaimable: 'Reclaimable', + containerReclaimable: 'Container Reclaimable', + image: 'Images', + volume: 'Volumes', + buildCache: 'Build Cache', + alert: 'Alert', + alertConfigured: 'Alerts Configured', + failedExecutionRecords: 'Failed Execution Records', + taskID: 'Task ID', + executeTime: 'Execution Time', + backupTasks: 'Backup Tasks', + systemMetrics: 'Runtime Metrics', + cpu: 'CPU', + thresholdPercent: 'Limite {0}%', + loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}', + sourceMount: 'Mount point {0}', + storageUsage: 'Storage Usage', + localDisk: 'Local Disk', + highUsagePeriods: 'High Usage Periods', + timeRange: 'Time Range', + threshold: 'Limite', + duration: 'Duration', + peak: 'Peak', + scoring: 'Scoring', + counted: 'Counted', + notCounted: 'Not Counted', + dataSource: 'Data Source', + noHighUsagePeriod: 'No high usage periods', + monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available', + to: 'to', + hoursShort: '{0} h', + minutesShort: '{0} min', + websiteStatus: 'Website Status', + sslRisk: 'Certificate Risks', + sslExpiring: 'Expiring Certificates', + includedInReport: 'Included in report', + needRenewal: 'Renewal recommended', + fromExpireInfo: 'From expiry information', + runningWebsite: 'Running Websites', + fromWebsiteStatus: 'From website list status', + stoppedWebsite: 'Stopped Websites', + confirmStoppedWebsite: 'Confirm whether this is expected', + expiringWebsite: 'Expiring Websites', + expiringSoon: 'Expiring Soon', + none: 'None', + noSslRisk: 'No certificates need handling', + websiteProtection: 'WAF and Website Monitoring', + websiteMonitor: 'Website Monitoring', + waf: 'WAF', + siteAvailability: 'Site Availability', + monitoredSites: 'Monitored Sites', + requestCount: 'Requests', + abnormalSites: 'Abnormal Sites', + count5xxSource: 'Counted by 5xx requests', + wafIntercept: 'WAF Blocks', + highRiskHit: 'High-risk Hits', + websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available', + wafDisabledOrNoData: 'WAF is disabled or no block data is available', + noWafData: 'No WAF block data', + sourceIP: 'Source IP', + hitCount: 'Hits', + level: 'Level', + attackType: 'Attack Type', + requestRatio: 'Request Ratio', + installed: 'Installed', + normalRunning: 'Running Normally', + failedStart: 'Startup Failed', + manualStopped: 'Manually Stopped', + failed: 'Failed', + success: 'Success', + canUpdate: 'Upgradable', + listSeparator: ', ', + containerCount: 'Containers', + stopped: 'Stopped', + abnormal: 'Abnormal', + abnormalContainers: 'Abnormal Containers', + resourceUsage: 'Resource Usage', + exposedContainerPorts: 'Exposed Ports', + portMapping: 'Port Mapping', + risk: 'Risk', + noAbnormalContainer: 'No abnormal containers', + noExposedContainer: 'No exposed ports detected', + publicExpose: 'Public Exposure', + privateExpose: 'Private Mapping', + executionRecords: 'Execution Records', + successRate: 'Success Rate', + failedJobs: 'Failed Jobs', + recentRecoveryPoint: 'Latest Recovery Point', + remoteCoverage: 'Remote Coverage', + recent7Days: 'Last 7 days', + taskTypeStats: 'Task Type Statistics', + total: 'Total', + taskTypeDesc: '{0} enabled, {1} disabled', + failedOrAttentionTasks: 'Failed or Attention Tasks', + execution: 'Execution', + latestExecution: 'Latest Execution', + remoteBackup: 'Remote Backup', + localOnly: 'Local Only', + covered: 'Covered', + noAttentionCronjob: 'No failed or attention cron jobs', + generationRule: 'Generation Rules', + scheduleDaily: 'Daily', + scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day', + scheduleWeekly: 'Weekly', + scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday', + scheduleMonthly: 'Monthly', + scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st', + scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}', + scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}', + scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}', + notificationMethod: 'Notification Methods', + channel: 'Channel', + receiver: 'Receiver', + systemThreshold: 'Limite do sistema', + metric: 'Metric', + currentRule: 'Current Rule', + hostMonitor: 'Host Monitor', + monitorInterval: 'Monitor Interval', + exportSettings: 'Export Settings', + defaultFormat: 'Default Format', + savePath: 'Save Directory', + savePathRequired: 'Set the report save directory', + generateNow: 'Generate Now', + generateSuccess: 'Report file generated: {0}', + generateFailed: 'Failed to generate report', + enabledStatus: 'Enabled', + disabledStatus: 'Disabled', + thresholdRule: 'Threshold {0}, trigger after {1} consecutive times', + hours: '{0} hours', + minutes: '{0} minutes', + seconds: '{0} seconds', + totalExports: 'Total Exports', + successExports: 'Successful Exports', + failedExports: 'Failed Exports', + reportName: 'Report Name', + exportFormat: 'Export Format', + operator: 'Operator', + triggerType: 'Trigger', + filePath: 'File Path', + manualExport: 'Manual', + scheduledExport: 'Scheduled', + exportResult: 'Export Result', + exportDetail: 'Export Detail', + }, + }, user: { user: 'Usuário', userInfo: 'Informações do Usuário', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index d834003fd7bb..d07b894ec670 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1891,6 +1891,7 @@ const message = { licenses: 'лицензии', nodes: 'ноды', commands: 'Быстрые команды', + opsReport: 'Операционный отчет', }, websiteLog: 'Логи веб-сайта', runLog: 'Логи выполнения', @@ -3894,6 +3895,314 @@ const message = { menu: 'Рro', upage: 'AI Конструктор сайтов', proAlert: 'Обновитесь до Pro, чтобы использовать эту функцию', + opsReport: { + name: 'Операционный отчет', + overview: 'Обзор', + system: 'Работа хоста', + login: 'Вход и безопасность', + website: 'Защита сайтов', + resource: 'Ресурсы выполнения', + cronjob: 'Плановые задачи', + history: 'История экспорта', + setting: 'Настройки', + page: { + enterprise: 'Enterprise', + scoreMeta: '{0} points deducted · {1} risks', + hostAddress: 'Host Address', + panelVersion: '1Panel Version', + cpuCores: 'Physical Cores', + coreUnit: '{0} cores', + memoryTotal: 'Memory Total', + reportDate: 'Report Date', + serverSecurityOverview: 'Server Security Operations Overview', + securityScore: 'Security Score', + overviewSummary: + 'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.', + riskDistribution: 'Risk Distribution', + totalDeducted: 'Total deducted', + noRiskDeducted: 'No deductions', + scoreTrend: 'Score Trend', + scoreLevelSafe: 'Safe', + scoreLevelAttention: 'Needs Attention', + scoreLevelMediumRisk: 'Medium Risk', + scoreLevelHighRisk: 'High Risk', + scoreCategoryHost: 'Host Resources', + scoreCategoryLogin: 'Login Security', + scoreCategoryWebsite: 'Websites & Certificates', + scoreCategoryCronjob: 'Cron Jobs', + scoreCategoryResource: 'Runtime Resources', + scoreDiskHigh: 'Disk {0} usage is {1}%', + scoreDiskMedium: 'Disk {0} usage is {1}%', + scoreResourceHigh: '{0} current usage is {1}%', + scoreResourceMedium: '{0} current usage is {1}%', + scoreLoadMedium: 'Current load is {0}', + scoreMonitorDisabled: 'Host monitoring is disabled', + scorePanelLoginFailedHigh: '1Panel login failed {0} times', + scorePanelLoginFailedMedium: '1Panel login failed {0} times', + scoreSSHLoginFailedHigh: 'SSH login failed {0} times', + scoreSSHLoginFailedMedium: 'SSH login failed {0} times', + scoreMFADisabled: 'MFA is disabled', + scoreAllowIPsOpen: 'Allowed IPs are not configured or too broad', + scorePasswordExpired: 'Panel password has expired', + scorePasswordExpiring: 'Panel password expires in {0} days', + scorePanelHTTPSDisabled: 'Panel HTTPS is disabled', + scoreSSHRootLogin: 'SSH root login is allowed', + scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth', + scoreSSLHigh: '{0} certificate expires in {1} days', + scoreSSLMedium: '{0} certificate expires in {1} days', + scoreWebsiteExpire: '{0} website expires in {1} days', + scoreWebsiteHTTP: '{0} does not use HTTPS', + scoreWebsiteStopped: '{0} status is abnormal', + scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site', + scoreWebsiteMonitorAvailability: 'Website monitoring availability {0}% is below the threshold', + scoreWafDisabled: 'WAF is disabled and websites are not protected', + scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period', + scoreCronjobFailed: '{0} cron job failure records in the last 7 days', + scoreAppFailed: '{0} app is abnormal', + scoreAppStopped: '{0} app has stopped', + scoreContainerHigh: '{0} container status is abnormal', + scoreContainerExited: '{0} container has stopped', + scoreContainerResource: '{0} container resource usage is high', + attentionItems: 'Attention Items', + attentionAssets: 'Attention Assets', + riskItems: 'Risk Items', + object: 'Object', + description: 'Description', + itemUnit: 'items', + recordUnit: 'records', + certUnit: 'certs', + containerUnit: 'containers', + loginFailed: 'Failed Logins', + sslExpire: 'Certificate Expiry', + abnormalContainer: 'Abnormal Containers', + statAttentionDesc: '{0} points deducted', + statLoginDesc: 'Panel {0} · SSH {1}', + statSslDesc: '{0} certificates checked', + statContainerDesc: '{0} containers checked', + assetHostDesc: 'Max disk usage {0}%', + assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites', + assetResourceDesc: '{0} abnormal apps, {1} stopped apps, {2} abnormal containers', + assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs', + app: 'Apps', + website: 'Websites', + websiteSsl: 'Websites / Certificates', + cronjob: 'Cron Jobs', + container: 'Containers', + sslCertificate: 'SSL Certificates', + loginSecurity: 'Login Security', + panelLogin: '1Panel Login', + sshLogin: 'SSH Login', + failedRecord: 'Failed Records', + expiredDays: 'Expired {0} days ago', + remainingDays: '{0} · {1} days left', + enabled: 'Enabled', + disabled: 'Disabled', + exportRecordFailed: 'Failed to save export record', + hostInfo: 'Host Info', + hostname: 'Hostname', + osVersion: 'OS Version', + kernelVersion: 'Kernel Version', + arch: 'Architecture', + uptime: 'Uptime', + diskUsage: 'Disk Usage', + mountPoint: 'Mount Point', + device: 'Device', + capacity: 'Capacity', + used: 'Used', + usageRate: 'Usage', + memory: 'Memory', + load: 'Load', + maxDiskUsage: 'Max Disk Usage', + panelLoginSecurity: '1Panel Login Security', + sshSecurity: 'Linux Server SSH Security', + panelFailedRecords: '1Panel Failed Login Records', + sshFailedRecords: 'SSH Failed Login Records', + location: 'Location', + configItem: 'Config Item', + currentValue: 'Current Value', + securityEntrance: 'Security Entrance', + configured: 'Configured', + notConfigured: 'Not Configured', + normal: 'Normal', + needAttention: 'Needs Attention', + allowIPs: 'Allowed IPs', + restricted: 'Restricted', + unrestricted: 'Unrestricted', + bindDomain: 'Bound Domain', + panelHTTPS: 'Panel HTTPS', + passwordComplexity: 'Password Complexity', + sshService: 'SSH Service', + running: 'Running', + notRunning: 'Not Running', + listenPort: 'Listen Port', + read: 'Read', + rootLogin: 'Root Login', + passwordAuth: 'Password Auth', + keyAuth: 'Key Auth', + panelLoginFailed: '1Panel Failed Logins', + sshLoginFailed: 'SSH Failed Logins', + panelSecurityItems: 'Panel Security Items', + sshSecurityItems: 'SSH Security Items', + websiteOverview: 'Website Overview', + primaryDomain: 'Primary Domain', + expireTime: 'Expiry Time', + domain: 'Domain', + issuer: 'Issuer', + autoRenew: 'Auto Renew', + websiteCount: 'Websites', + httpsWebsite: 'HTTPS Websites', + certCount: 'Certificates', + websiteExpire: 'Website Expiry', + database: 'Databases', + remoteDatabase: 'Remote Databases', + address: 'Address', + containerResourceUsage: 'Container Resource Usage', + spaceUsage: 'Space Usage', + reclaimable: 'Reclaimable', + containerReclaimable: 'Container Reclaimable', + image: 'Images', + volume: 'Volumes', + buildCache: 'Build Cache', + alert: 'Alert', + alertConfigured: 'Alerts Configured', + failedExecutionRecords: 'Failed Execution Records', + taskID: 'Task ID', + executeTime: 'Execution Time', + backupTasks: 'Backup Tasks', + systemMetrics: 'Runtime Metrics', + cpu: 'CPU', + thresholdPercent: 'Порог {0}%', + loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}', + sourceMount: 'Mount point {0}', + storageUsage: 'Storage Usage', + localDisk: 'Local Disk', + highUsagePeriods: 'High Usage Periods', + timeRange: 'Time Range', + threshold: 'Порог', + duration: 'Duration', + peak: 'Peak', + scoring: 'Scoring', + counted: 'Counted', + notCounted: 'Not Counted', + dataSource: 'Data Source', + noHighUsagePeriod: 'No high usage periods', + monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available', + to: 'to', + hoursShort: '{0} h', + minutesShort: '{0} min', + websiteStatus: 'Website Status', + sslRisk: 'Certificate Risks', + sslExpiring: 'Expiring Certificates', + includedInReport: 'Included in report', + needRenewal: 'Renewal recommended', + fromExpireInfo: 'From expiry information', + runningWebsite: 'Running Websites', + fromWebsiteStatus: 'From website list status', + stoppedWebsite: 'Stopped Websites', + confirmStoppedWebsite: 'Confirm whether this is expected', + expiringWebsite: 'Expiring Websites', + expiringSoon: 'Expiring Soon', + none: 'None', + noSslRisk: 'No certificates need handling', + websiteProtection: 'WAF and Website Monitoring', + websiteMonitor: 'Website Monitoring', + waf: 'WAF', + siteAvailability: 'Site Availability', + monitoredSites: 'Monitored Sites', + requestCount: 'Requests', + abnormalSites: 'Abnormal Sites', + count5xxSource: 'Counted by 5xx requests', + wafIntercept: 'WAF Blocks', + highRiskHit: 'High-risk Hits', + websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available', + wafDisabledOrNoData: 'WAF is disabled or no block data is available', + noWafData: 'No WAF block data', + sourceIP: 'Source IP', + hitCount: 'Hits', + level: 'Level', + attackType: 'Attack Type', + requestRatio: 'Request Ratio', + installed: 'Installed', + normalRunning: 'Running Normally', + failedStart: 'Startup Failed', + manualStopped: 'Manually Stopped', + failed: 'Failed', + success: 'Success', + canUpdate: 'Upgradable', + listSeparator: ', ', + containerCount: 'Containers', + stopped: 'Stopped', + abnormal: 'Abnormal', + abnormalContainers: 'Abnormal Containers', + resourceUsage: 'Resource Usage', + exposedContainerPorts: 'Exposed Ports', + portMapping: 'Port Mapping', + risk: 'Risk', + noAbnormalContainer: 'No abnormal containers', + noExposedContainer: 'No exposed ports detected', + publicExpose: 'Public Exposure', + privateExpose: 'Private Mapping', + executionRecords: 'Execution Records', + successRate: 'Success Rate', + failedJobs: 'Failed Jobs', + recentRecoveryPoint: 'Latest Recovery Point', + remoteCoverage: 'Remote Coverage', + recent7Days: 'Last 7 days', + taskTypeStats: 'Task Type Statistics', + total: 'Total', + taskTypeDesc: '{0} enabled, {1} disabled', + failedOrAttentionTasks: 'Failed or Attention Tasks', + execution: 'Execution', + latestExecution: 'Latest Execution', + remoteBackup: 'Remote Backup', + localOnly: 'Local Only', + covered: 'Covered', + noAttentionCronjob: 'No failed or attention cron jobs', + generationRule: 'Generation Rules', + scheduleDaily: 'Daily', + scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day', + scheduleWeekly: 'Weekly', + scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday', + scheduleMonthly: 'Monthly', + scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st', + scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}', + scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}', + scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}', + notificationMethod: 'Notification Methods', + channel: 'Channel', + receiver: 'Receiver', + systemThreshold: 'Системный порог', + metric: 'Metric', + currentRule: 'Current Rule', + hostMonitor: 'Host Monitor', + monitorInterval: 'Monitor Interval', + exportSettings: 'Export Settings', + defaultFormat: 'Default Format', + savePath: 'Save Directory', + savePathRequired: 'Set the report save directory', + generateNow: 'Generate Now', + generateSuccess: 'Report file generated: {0}', + generateFailed: 'Failed to generate report', + enabledStatus: 'Enabled', + disabledStatus: 'Disabled', + thresholdRule: 'Threshold {0}, trigger after {1} consecutive times', + hours: '{0} hours', + minutes: '{0} minutes', + seconds: '{0} seconds', + totalExports: 'Total Exports', + successExports: 'Successful Exports', + failedExports: 'Failed Exports', + reportName: 'Report Name', + exportFormat: 'Export Format', + operator: 'Operator', + triggerType: 'Trigger', + filePath: 'File Path', + manualExport: 'Manual', + scheduledExport: 'Scheduled', + exportResult: 'Export Result', + exportDetail: 'Export Detail', + }, + }, user: { user: 'Пользователь', userInfo: 'Информация о пользователе', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 202f6e556d80..faea34e6702c 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -1902,6 +1902,7 @@ const message = { licenses: 'Lisans', nodes: 'Düğüm', commands: 'Hızlı Komutlar', + opsReport: 'Operasyon Raporu', }, websiteLog: 'Website logları', runLog: 'Çalıştırma logları', @@ -3894,6 +3895,314 @@ const message = { menu: 'Pro', upage: 'AI Web Sitesi Oluşturucu', proAlert: 'Bu özelliği kullanmak için Proya yükseltin', + opsReport: { + name: 'Operasyon Raporu', + overview: 'Genel Bakış', + system: 'Ana Makine Çalışması', + login: 'Giriş ve Güvenlik', + website: 'Web Sitesi Koruması', + resource: 'Çalışma Kaynakları', + cronjob: 'Zamanlanmış Görevler', + history: 'Dışa Aktarma Geçmişi', + setting: 'Ayarlar', + page: { + enterprise: 'Enterprise', + scoreMeta: '{0} points deducted · {1} risks', + hostAddress: 'Host Address', + panelVersion: '1Panel Version', + cpuCores: 'Physical Cores', + coreUnit: '{0} cores', + memoryTotal: 'Memory Total', + reportDate: 'Report Date', + serverSecurityOverview: 'Server Security Operations Overview', + securityScore: 'Security Score', + overviewSummary: + 'Current security level: {0}. {1} points deducted, {2} risk items found, {3} objects checked.', + riskDistribution: 'Risk Distribution', + totalDeducted: 'Total deducted', + noRiskDeducted: 'No deductions', + scoreTrend: 'Score Trend', + scoreLevelSafe: 'Safe', + scoreLevelAttention: 'Needs Attention', + scoreLevelMediumRisk: 'Medium Risk', + scoreLevelHighRisk: 'High Risk', + scoreCategoryHost: 'Host Resources', + scoreCategoryLogin: 'Login Security', + scoreCategoryWebsite: 'Websites & Certificates', + scoreCategoryCronjob: 'Cron Jobs', + scoreCategoryResource: 'Runtime Resources', + scoreDiskHigh: 'Disk {0} usage is {1}%', + scoreDiskMedium: 'Disk {0} usage is {1}%', + scoreResourceHigh: '{0} current usage is {1}%', + scoreResourceMedium: '{0} current usage is {1}%', + scoreLoadMedium: 'Current load is {0}', + scoreMonitorDisabled: 'Host monitoring is disabled', + scorePanelLoginFailedHigh: '1Panel login failed {0} times', + scorePanelLoginFailedMedium: '1Panel login failed {0} times', + scoreSSHLoginFailedHigh: 'SSH login failed {0} times', + scoreSSHLoginFailedMedium: 'SSH login failed {0} times', + scoreMFADisabled: 'MFA is disabled', + scoreAllowIPsOpen: 'Allowed IPs are not configured or too broad', + scorePasswordExpired: 'Panel password has expired', + scorePasswordExpiring: 'Panel password expires in {0} days', + scorePanelHTTPSDisabled: 'Panel HTTPS is disabled', + scoreSSHRootLogin: 'SSH root login is allowed', + scoreSSHPasswordAuth: 'SSH password auth is enabled without key auth', + scoreSSLHigh: '{0} certificate expires in {1} days', + scoreSSLMedium: '{0} certificate expires in {1} days', + scoreWebsiteExpire: '{0} website expires in {1} days', + scoreWebsiteHTTP: '{0} does not use HTTPS', + scoreWebsiteStopped: '{0} status is abnormal', + scoreWebsiteMonitorUnavailable: 'Website monitoring detected an unavailable site', + scoreWebsiteMonitorAvailability: 'Website monitoring availability {0}% is below the threshold', + scoreWafDisabled: 'WAF is disabled and websites are not protected', + scoreWafHighRiskHit: 'WAF matched {0} risk rules in the reporting period', + scoreCronjobFailed: '{0} cron job failure records in the last 7 days', + scoreAppFailed: '{0} app is abnormal', + scoreAppStopped: '{0} app has stopped', + scoreContainerHigh: '{0} container status is abnormal', + scoreContainerExited: '{0} container has stopped', + scoreContainerResource: '{0} container resource usage is high', + attentionItems: 'Attention Items', + attentionAssets: 'Attention Assets', + riskItems: 'Risk Items', + object: 'Object', + description: 'Description', + itemUnit: 'items', + recordUnit: 'records', + certUnit: 'certs', + containerUnit: 'containers', + loginFailed: 'Failed Logins', + sslExpire: 'Certificate Expiry', + abnormalContainer: 'Abnormal Containers', + statAttentionDesc: '{0} points deducted', + statLoginDesc: 'Panel {0} · SSH {1}', + statSslDesc: '{0} certificates checked', + statContainerDesc: '{0} containers checked', + assetHostDesc: 'Max disk usage {0}%', + assetWebsiteDesc: '{0} certificates expiring soon, {1} abnormal websites', + assetResourceDesc: '{0} abnormal apps, {1} stopped apps, {2} abnormal containers', + assetCronjobDesc: '{0} failure records in the last 7 days, {1} disabled jobs', + app: 'Apps', + website: 'Websites', + websiteSsl: 'Websites / Certificates', + cronjob: 'Cron Jobs', + container: 'Containers', + sslCertificate: 'SSL Certificates', + loginSecurity: 'Login Security', + panelLogin: '1Panel Login', + sshLogin: 'SSH Login', + failedRecord: 'Failed Records', + expiredDays: 'Expired {0} days ago', + remainingDays: '{0} · {1} days left', + enabled: 'Enabled', + disabled: 'Disabled', + exportRecordFailed: 'Failed to save export record', + hostInfo: 'Host Info', + hostname: 'Hostname', + osVersion: 'OS Version', + kernelVersion: 'Kernel Version', + arch: 'Architecture', + uptime: 'Uptime', + diskUsage: 'Disk Usage', + mountPoint: 'Mount Point', + device: 'Device', + capacity: 'Capacity', + used: 'Used', + usageRate: 'Usage', + memory: 'Memory', + load: 'Load', + maxDiskUsage: 'Max Disk Usage', + panelLoginSecurity: '1Panel Login Security', + sshSecurity: 'Linux Server SSH Security', + panelFailedRecords: '1Panel Failed Login Records', + sshFailedRecords: 'SSH Failed Login Records', + location: 'Location', + configItem: 'Config Item', + currentValue: 'Current Value', + securityEntrance: 'Security Entrance', + configured: 'Configured', + notConfigured: 'Not Configured', + normal: 'Normal', + needAttention: 'Needs Attention', + allowIPs: 'Allowed IPs', + restricted: 'Restricted', + unrestricted: 'Unrestricted', + bindDomain: 'Bound Domain', + panelHTTPS: 'Panel HTTPS', + passwordComplexity: 'Password Complexity', + sshService: 'SSH Service', + running: 'Running', + notRunning: 'Not Running', + listenPort: 'Listen Port', + read: 'Read', + rootLogin: 'Root Login', + passwordAuth: 'Password Auth', + keyAuth: 'Key Auth', + panelLoginFailed: '1Panel Failed Logins', + sshLoginFailed: 'SSH Failed Logins', + panelSecurityItems: 'Panel Security Items', + sshSecurityItems: 'SSH Security Items', + websiteOverview: 'Website Overview', + primaryDomain: 'Primary Domain', + expireTime: 'Expiry Time', + domain: 'Domain', + issuer: 'Issuer', + autoRenew: 'Auto Renew', + websiteCount: 'Websites', + httpsWebsite: 'HTTPS Websites', + certCount: 'Certificates', + websiteExpire: 'Website Expiry', + database: 'Databases', + remoteDatabase: 'Remote Databases', + address: 'Address', + containerResourceUsage: 'Container Resource Usage', + spaceUsage: 'Space Usage', + reclaimable: 'Reclaimable', + containerReclaimable: 'Container Reclaimable', + image: 'Images', + volume: 'Volumes', + buildCache: 'Build Cache', + alert: 'Alert', + alertConfigured: 'Alerts Configured', + failedExecutionRecords: 'Failed Execution Records', + taskID: 'Task ID', + executeTime: 'Execution Time', + backupTasks: 'Backup Tasks', + systemMetrics: 'Runtime Metrics', + cpu: 'CPU', + thresholdPercent: 'Eşik {0}%', + loadAverage: '1 / 5 / 15 minute load: {0} / {1} / {2}', + sourceMount: 'Mount point {0}', + storageUsage: 'Storage Usage', + localDisk: 'Local Disk', + highUsagePeriods: 'High Usage Periods', + timeRange: 'Time Range', + threshold: 'Eşik', + duration: 'Duration', + peak: 'Peak', + scoring: 'Scoring', + counted: 'Counted', + notCounted: 'Not Counted', + dataSource: 'Data Source', + noHighUsagePeriod: 'No high usage periods', + monitorDisabledOrNoData: 'Host monitoring is disabled or no monitor data is available', + to: 'to', + hoursShort: '{0} h', + minutesShort: '{0} min', + websiteStatus: 'Website Status', + sslRisk: 'Certificate Risks', + sslExpiring: 'Expiring Certificates', + includedInReport: 'Included in report', + needRenewal: 'Renewal recommended', + fromExpireInfo: 'From expiry information', + runningWebsite: 'Running Websites', + fromWebsiteStatus: 'From website list status', + stoppedWebsite: 'Stopped Websites', + confirmStoppedWebsite: 'Confirm whether this is expected', + expiringWebsite: 'Expiring Websites', + expiringSoon: 'Expiring Soon', + none: 'None', + noSslRisk: 'No certificates need handling', + websiteProtection: 'WAF and Website Monitoring', + websiteMonitor: 'Website Monitoring', + waf: 'WAF', + siteAvailability: 'Site Availability', + monitoredSites: 'Monitored Sites', + requestCount: 'Requests', + abnormalSites: 'Abnormal Sites', + count5xxSource: 'Counted by 5xx requests', + wafIntercept: 'WAF Blocks', + highRiskHit: 'High-risk Hits', + websiteMonitorDisabledOrNoData: 'Website monitoring is disabled or no monitor data is available', + wafDisabledOrNoData: 'WAF is disabled or no block data is available', + noWafData: 'No WAF block data', + sourceIP: 'Source IP', + hitCount: 'Hits', + level: 'Level', + attackType: 'Attack Type', + requestRatio: 'Request Ratio', + installed: 'Installed', + normalRunning: 'Running Normally', + failedStart: 'Startup Failed', + manualStopped: 'Manually Stopped', + failed: 'Failed', + success: 'Success', + canUpdate: 'Upgradable', + listSeparator: ', ', + containerCount: 'Containers', + stopped: 'Stopped', + abnormal: 'Abnormal', + abnormalContainers: 'Abnormal Containers', + resourceUsage: 'Resource Usage', + exposedContainerPorts: 'Exposed Ports', + portMapping: 'Port Mapping', + risk: 'Risk', + noAbnormalContainer: 'No abnormal containers', + noExposedContainer: 'No exposed ports detected', + publicExpose: 'Public Exposure', + privateExpose: 'Private Mapping', + executionRecords: 'Execution Records', + successRate: 'Success Rate', + failedJobs: 'Failed Jobs', + recentRecoveryPoint: 'Latest Recovery Point', + remoteCoverage: 'Remote Coverage', + recent7Days: 'Last 7 days', + taskTypeStats: 'Task Type Statistics', + total: 'Total', + taskTypeDesc: '{0} enabled, {1} disabled', + failedOrAttentionTasks: 'Failed or Attention Tasks', + execution: 'Execution', + latestExecution: 'Latest Execution', + remoteBackup: 'Remote Backup', + localOnly: 'Local Only', + covered: 'Covered', + noAttentionCronjob: 'No failed or attention cron jobs', + generationRule: 'Generation Rules', + scheduleDaily: 'Daily', + scheduleDailyDesc: 'Generate a report for the last 24 hours at 09:00 every day', + scheduleWeekly: 'Weekly', + scheduleWeeklyDesc: 'Generate a report for the last 7 days at 09:00 every Monday', + scheduleMonthly: 'Monthly', + scheduleMonthlyDesc: 'Generate a report for the previous month at 09:00 on the 1st', + scheduleCurrentDaily: 'Every day at 09:00, generate the last 24 hours report · Next {0}', + scheduleCurrentWeekly: 'Every Monday at 09:00, generate the last 7 days report · Next {0}', + scheduleCurrentMonthly: 'On the 1st at 09:00, generate the previous month report · Next {0}', + notificationMethod: 'Notification Methods', + channel: 'Channel', + receiver: 'Receiver', + systemThreshold: 'Sistem eşiği', + metric: 'Metric', + currentRule: 'Current Rule', + hostMonitor: 'Host Monitor', + monitorInterval: 'Monitor Interval', + exportSettings: 'Export Settings', + defaultFormat: 'Default Format', + savePath: 'Save Directory', + savePathRequired: 'Set the report save directory', + generateNow: 'Generate Now', + generateSuccess: 'Report file generated: {0}', + generateFailed: 'Failed to generate report', + enabledStatus: 'Enabled', + disabledStatus: 'Disabled', + thresholdRule: 'Threshold {0}, trigger after {1} consecutive times', + hours: '{0} hours', + minutes: '{0} minutes', + seconds: '{0} seconds', + totalExports: 'Total Exports', + successExports: 'Successful Exports', + failedExports: 'Failed Exports', + reportName: 'Report Name', + exportFormat: 'Export Format', + operator: 'Operator', + triggerType: 'Trigger', + filePath: 'File Path', + manualExport: 'Manual', + scheduledExport: 'Scheduled', + exportResult: 'Export Result', + exportDetail: 'Export Detail', + }, + }, user: { user: 'Kullanıcı', userInfo: 'Kullanıcı Bilgileri', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 7c5d84268cd8..eb9ccc078e10 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -1752,6 +1752,7 @@ const message = { licenses: '許可證', nodes: '節點', commands: '快速指令', + opsReport: '運維報表', }, websiteLog: '網站日誌', runLog: '執行日誌', @@ -3541,6 +3542,313 @@ const message = { menu: '進階功能', upage: 'AI 建站', proAlert: '升級專業版以使用此功能', + opsReport: { + name: '運維報表', + overview: '概覽', + system: '主機運行', + login: '登入與安全配置', + website: '網站防護', + resource: '運行資源', + cronjob: '計劃任務', + history: '匯出歷史', + setting: '設置', + page: { + enterprise: '企業版', + scoreMeta: '扣分 {0} 分 · 風險 {1} 項', + hostAddress: '主機地址', + panelVersion: '1Panel 版本', + cpuCores: '實體核心', + coreUnit: '{0} 核', + memoryTotal: '記憶體總量', + reportDate: '報表日期', + serverSecurityOverview: '伺服器安全運營概覽', + securityScore: '安全評分', + overviewSummary: '當前安全等級為 {0},合計扣分 {1} 分,識別到 {2} 個風險項,覆蓋 {3} 個檢查對象。', + riskDistribution: '風險分佈', + totalDeducted: '合計扣分', + noRiskDeducted: '未觸發扣分', + scoreTrend: '評分趨勢', + scoreLevelSafe: '安全', + scoreLevelAttention: '需關注', + scoreLevelMediumRisk: '中風險', + scoreLevelHighRisk: '高風險', + scoreCategoryHost: '主機資源', + scoreCategoryLogin: '登入安全', + scoreCategoryWebsite: '網站與憑證', + scoreCategoryCronjob: '計劃任務', + scoreCategoryResource: '執行資源', + scoreDiskHigh: '磁碟 {0} 使用率 {1}%', + scoreDiskMedium: '磁碟 {0} 使用率 {1}%', + scoreResourceHigh: '{0} 當前使用率 {1}%', + scoreResourceMedium: '{0} 當前使用率 {1}%', + scoreLoadMedium: '負載當前值 {0}', + scoreMonitorDisabled: '主機監控未開啟', + scorePanelLoginFailedHigh: '1Panel 登入失敗 {0} 次', + scorePanelLoginFailedMedium: '1Panel 登入失敗 {0} 次', + scoreSSHLoginFailedHigh: 'SSH 登入失敗 {0} 次', + scoreSSHLoginFailedMedium: 'SSH 登入失敗 {0} 次', + scoreMFADisabled: 'MFA 未開啟', + scoreAllowIPsOpen: '授權 IP 未配置或範圍過大', + scorePasswordExpired: '面板密碼已過期', + scorePasswordExpiring: '面板密碼剩餘 {0} 天到期', + scorePanelHTTPSDisabled: '面板 HTTPS 未啟用', + scoreSSHRootLogin: 'SSH 允許 Root 登入', + scoreSSHPasswordAuth: 'SSH 開啟密碼認證且未啟用金鑰認證', + scoreSSLHigh: '{0} 憑證剩餘 {1} 天', + scoreSSLMedium: '{0} 憑證剩餘 {1} 天', + scoreWebsiteExpire: '{0} 網站剩餘 {1} 天到期', + scoreWebsiteHTTP: '{0} 未啟用 HTTPS', + scoreWebsiteStopped: '{0} 狀態異常', + scoreWebsiteMonitorUnavailable: '網站監控偵測到不可用站點', + scoreWebsiteMonitorAvailability: '網站監控可用率 {0}% 低於閾值', + scoreWafDisabled: 'WAF 未開啟,網站未納入防護', + scoreWafHighRiskHit: 'WAF 統計週期內命中 {0} 條風險規則', + scoreCronjobFailed: '近 7 天存在 {0} 條計劃任務失敗記錄', + scoreAppFailed: '{0} 應用執行異常', + scoreAppStopped: '{0} 應用已停止', + scoreContainerHigh: '{0} 容器狀態異常', + scoreContainerExited: '{0} 容器已停止', + scoreContainerResource: '{0} 容器資源使用率過高', + attentionItems: '待關注項', + attentionAssets: '待關注資產', + riskItems: '風險項', + object: '對象', + description: '說明', + itemUnit: '項', + recordUnit: '條', + certUnit: '張', + containerUnit: '個', + loginFailed: '登入失敗', + sslExpire: '憑證到期', + abnormalContainer: '異常容器', + statAttentionDesc: '當前合計扣分 {0} 分', + statLoginDesc: '面板 {0} 條 · SSH {1} 條', + statSslDesc: '共檢查 {0} 張憑證', + statContainerDesc: '共檢查 {0} 個容器', + assetHostDesc: '磁碟最高使用率 {0}%', + assetWebsiteDesc: '{0} 張憑證即將到期,{1} 個網站狀態異常', + assetResourceDesc: '{0} 個應用異常,{1} 個應用已停止,{2} 個容器異常', + assetCronjobDesc: '近 7 天 {0} 條失敗記錄,{1} 個任務未啟用', + app: '應用', + website: '網站', + websiteSsl: '網站 / 憑證', + cronjob: '計劃任務', + container: '容器', + sslCertificate: 'SSL 憑證', + loginSecurity: '登入安全', + panelLogin: '1Panel 登入', + sshLogin: 'SSH 登入', + failedRecord: '失敗記錄', + expiredDays: '已過期 {0} 天', + remainingDays: '{0} · 剩餘 {1} 天', + enabled: '已開啟', + disabled: '未開啟', + exportRecordFailed: '儲存匯出記錄失敗', + hostInfo: '主機資訊', + hostname: '主機名', + osVersion: '系統版本', + kernelVersion: '核心版本', + arch: '架構', + uptime: '執行時間', + diskUsage: '磁碟使用', + mountPoint: '掛載點', + device: '裝置', + capacity: '容量', + used: '已用', + usageRate: '使用率', + memory: '記憶體', + load: '負載', + maxDiskUsage: '磁碟最高使用率', + panelLoginSecurity: '1Panel 登入安全配置', + sshSecurity: 'Linux 伺服器 SSH 安全配置', + panelFailedRecords: '1Panel 登入失敗記錄', + sshFailedRecords: 'SSH 登入失敗記錄', + location: '歸屬地', + configItem: '配置項', + currentValue: '當前值', + securityEntrance: '安全入口', + configured: '已配置', + notConfigured: '未配置', + normal: '正常', + needAttention: '需關注', + allowIPs: '授權 IP', + restricted: '已限制', + unrestricted: '未限制', + bindDomain: '綁定網域', + panelHTTPS: '面板 HTTPS', + passwordComplexity: '密碼複雜度', + sshService: 'SSH 服務', + running: '執行中', + notRunning: '未執行', + listenPort: '監聽埠', + read: '已讀取', + rootLogin: 'Root 登入', + passwordAuth: '密碼認證', + keyAuth: '金鑰認證', + panelLoginFailed: '1Panel 登入失敗', + sshLoginFailed: 'SSH 登入失敗', + panelSecurityItems: '面板安全項', + sshSecurityItems: 'SSH 安全項', + websiteOverview: '網站概覽', + primaryDomain: '主網域', + expireTime: '到期時間', + domain: '網域', + issuer: '頒發機構', + autoRenew: '自動續簽', + websiteCount: '網站數量', + httpsWebsite: 'HTTPS 網站', + certCount: '憑證數量', + websiteExpire: '網站到期', + database: '資料庫', + remoteDatabase: '遠端資料庫', + address: '地址', + containerResourceUsage: '容器資源佔用', + spaceUsage: '佔用空間', + reclaimable: '可回收空間', + containerReclaimable: '容器可回收', + image: '映像', + volume: '資料卷', + buildCache: '建構快取', + alert: '告警', + alertConfigured: '已配置告警', + failedExecutionRecords: '失敗執行記錄', + taskID: '任務 ID', + executeTime: '執行時間', + backupTasks: '備份類任務', + systemMetrics: '執行指標', + cpu: 'CPU', + thresholdPercent: '閾值 {0}%', + loadAverage: '1 / 5 / 15 分鐘負載:{0} / {1} / {2}', + sourceMount: '掛載點 {0}', + storageUsage: '空間佔用', + localDisk: '本機磁碟', + highUsagePeriods: '高負載時段', + timeRange: '時間範圍', + threshold: '閾值', + duration: '持續時間', + peak: '峰值', + scoring: '計分', + counted: '計入', + notCounted: '未計入', + dataSource: '資料來源', + noHighUsagePeriod: '暫無高負載時段', + monitorDisabledOrNoData: '主機監控未啟用或暫無監控資料', + to: '至', + hoursShort: '{0} 小時', + minutesShort: '{0} 分鐘', + websiteStatus: '網站狀態', + sslRisk: '憑證風險', + sslExpiring: '憑證臨期', + includedInReport: '已納入報表', + needRenewal: '建議續簽', + fromExpireInfo: '來自到期資訊', + runningWebsite: '執行中網站', + fromWebsiteStatus: '來自網站列表狀態', + stoppedWebsite: '已停止網站', + confirmStoppedWebsite: '確認是否符合預期', + expiringWebsite: '快要過期網站', + expiringSoon: '即將到期', + none: '暫無', + noSslRisk: '暫無需處理憑證', + websiteProtection: 'WAF 與網站監控', + websiteMonitor: '網站監控', + waf: 'WAF', + siteAvailability: '站點可用率', + monitoredSites: '監控站點', + requestCount: '請求數', + abnormalSites: '異常站點', + count5xxSource: '按 5xx 請求統計', + wafIntercept: 'WAF 攔截', + highRiskHit: '高危命中', + websiteMonitorDisabledOrNoData: '網站監控未啟用或暫無監控資料', + wafDisabledOrNoData: 'WAF 未啟用或暫無攔截資料', + noWafData: '暫無 WAF 攔截資料', + sourceIP: '來源 IP', + hitCount: '命中次數', + level: '等級', + attackType: '攻擊類型', + requestRatio: '請求佔比', + installed: '已安裝', + normalRunning: '正常執行', + failedStart: '啟動失敗', + manualStopped: '手動停止', + failed: '失敗', + success: '成功', + canUpdate: '可升級', + listSeparator: '、', + containerCount: '容器數量', + stopped: '停止', + abnormal: '異常', + abnormalContainers: '異常容器', + resourceUsage: '資源使用', + exposedContainerPorts: '暴露埠', + portMapping: '埠映射', + risk: '風險', + noAbnormalContainer: '暫無異常容器', + noExposedContainer: '未檢測到暴露埠', + publicExpose: '公網暴露', + privateExpose: '內網映射', + executionRecords: '執行記錄', + successRate: '成功率', + failedJobs: '失敗任務', + recentRecoveryPoint: '最近恢復點', + remoteCoverage: '遠端覆蓋', + recent7Days: '近 7 天', + taskTypeStats: '任務類型統計', + total: '總計', + taskTypeDesc: '已啟用 {0} 個,未啟用 {1} 個', + failedOrAttentionTasks: '失敗或需關注任務', + execution: '執行情況', + latestExecution: '最近執行', + remoteBackup: '遠端備份', + localOnly: '僅本機', + covered: '已覆蓋', + noAttentionCronjob: '暫無失敗或需關注的計劃任務', + generationRule: '生成規則', + scheduleDaily: '每天', + scheduleDailyDesc: '每天 09:00 生成近 24 小時報表', + scheduleWeekly: '每週', + scheduleWeeklyDesc: '每週一 09:00 生成近 7 天報表', + scheduleMonthly: '每月', + scheduleMonthlyDesc: '每月 1 日 09:00 生成上月報表', + scheduleCurrentDaily: '每天 09:00 生成近 24 小時報表 · 下次 {0}', + scheduleCurrentWeekly: '每週一 09:00 生成近 7 天報表 · 下次 {0}', + scheduleCurrentMonthly: '每月 1 日 09:00 生成上月報表 · 下次 {0}', + notificationMethod: '通知方式', + channel: '通道', + receiver: '接收對象', + systemThreshold: '系統閾值', + metric: '指標', + currentRule: '當前規則', + hostMonitor: '主機監控', + monitorInterval: '監控間隔', + exportSettings: '匯出設定', + defaultFormat: '預設格式', + savePath: '儲存目錄', + savePathRequired: '請設定報表儲存目錄', + generateNow: '立即生成', + generateSuccess: '已生成報表檔案:{0}', + generateFailed: '生成報表失敗', + enabledStatus: '已啟用', + disabledStatus: '已停用', + thresholdRule: '閾值 {0},連續 {1} 次觸發', + hours: '{0} 小時', + minutes: '{0} 分鐘', + seconds: '{0} 秒', + totalExports: '匯出總數', + successExports: '成功匯出', + failedExports: '失敗匯出', + reportName: '報表名稱', + exportFormat: '匯出格式', + operator: '操作人', + triggerType: '觸發方式', + filePath: '檔案路徑', + manualExport: '手動', + scheduledExport: '定時', + exportResult: '匯出結果', + exportDetail: '匯出說明', + }, + }, user: { user: '使用者', userInfo: '使用者資訊', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 11879a0d80e8..b6f9b47b9f8c 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1743,6 +1743,7 @@ const message = { licenses: '许可证', nodes: '节点', commands: '快速命令', + opsReport: '运维报表', }, websiteLog: '网站日志', runLog: '运行日志', @@ -4121,6 +4122,313 @@ const message = { appUpgrade: '应用升级', appUpgradeHelper: '有 {0} 个应用需要升级', }, + opsReport: { + name: '运维报表', + overview: '概览', + system: '主机运行', + login: '登录与安全配置', + website: '网站防护', + resource: '运行资源', + cronjob: '计划任务', + history: '导出历史', + setting: '设置', + page: { + enterprise: '企业版', + scoreMeta: '扣分 {0} 分 · 风险 {1} 项', + hostAddress: '主机地址', + panelVersion: '1Panel 版本', + cpuCores: '物理核心', + coreUnit: '{0} 核', + memoryTotal: '内存总量', + reportDate: '报表日期', + serverSecurityOverview: '服务器安全运营概览', + securityScore: '安全评分', + overviewSummary: '当前安全等级为 {0},合计扣分 {1} 分,识别到 {2} 个风险项,覆盖 {3} 个检查对象。', + riskDistribution: '风险分布', + totalDeducted: '合计扣分', + noRiskDeducted: '未触发扣分', + scoreTrend: '评分趋势', + scoreLevelSafe: '安全', + scoreLevelAttention: '需关注', + scoreLevelMediumRisk: '中风险', + scoreLevelHighRisk: '高风险', + scoreCategoryHost: '主机资源', + scoreCategoryLogin: '登录安全', + scoreCategoryWebsite: '网站与证书', + scoreCategoryCronjob: '计划任务', + scoreCategoryResource: '运行资源', + scoreDiskHigh: '磁盘 {0} 使用率 {1}%', + scoreDiskMedium: '磁盘 {0} 使用率 {1}%', + scoreResourceHigh: '{0} 当前使用率 {1}%', + scoreResourceMedium: '{0} 当前使用率 {1}%', + scoreLoadMedium: '负载当前值 {0}', + scoreMonitorDisabled: '主机监控未开启', + scorePanelLoginFailedHigh: '1Panel 登录失败 {0} 次', + scorePanelLoginFailedMedium: '1Panel 登录失败 {0} 次', + scoreSSHLoginFailedHigh: 'SSH 登录失败 {0} 次', + scoreSSHLoginFailedMedium: 'SSH 登录失败 {0} 次', + scoreMFADisabled: 'MFA 未开启', + scoreAllowIPsOpen: '授权 IP 未配置或范围过大', + scorePasswordExpired: '面板密码已过期', + scorePasswordExpiring: '面板密码剩余 {0} 天到期', + scorePanelHTTPSDisabled: '面板 HTTPS 未启用', + scoreSSHRootLogin: 'SSH 允许 Root 登录', + scoreSSHPasswordAuth: 'SSH 开启密码认证且未启用密钥认证', + scoreSSLHigh: '{0} 证书剩余 {1} 天', + scoreSSLMedium: '{0} 证书剩余 {1} 天', + scoreWebsiteExpire: '{0} 网站剩余 {1} 天到期', + scoreWebsiteHTTP: '{0} 未启用 HTTPS', + scoreWebsiteStopped: '{0} 状态异常', + scoreWebsiteMonitorUnavailable: '网站监控检测到不可用站点', + scoreWebsiteMonitorAvailability: '网站监控可用率 {0}% 低于阈值', + scoreWafDisabled: 'WAF 未开启,网站未纳入防护', + scoreWafHighRiskHit: 'WAF 统计周期内命中 {0} 条风险规则', + scoreCronjobFailed: '近 7 天存在 {0} 条计划任务失败记录', + scoreAppFailed: '{0} 应用运行异常', + scoreAppStopped: '{0} 应用已停止', + scoreContainerHigh: '{0} 容器状态异常', + scoreContainerExited: '{0} 容器已停止', + scoreContainerResource: '{0} 容器资源使用率过高', + attentionItems: '待关注项', + attentionAssets: '待关注资产', + riskItems: '风险项', + object: '对象', + description: '说明', + itemUnit: '项', + recordUnit: '条', + certUnit: '张', + containerUnit: '个', + loginFailed: '登录失败', + sslExpire: '证书到期', + abnormalContainer: '异常容器', + statAttentionDesc: '当前合计扣分 {0} 分', + statLoginDesc: '面板 {0} 条 · SSH {1} 条', + statSslDesc: '共检查 {0} 张证书', + statContainerDesc: '共检查 {0} 个容器', + assetHostDesc: '磁盘最高使用率 {0}%', + assetWebsiteDesc: '{0} 张证书即将到期,{1} 个网站状态异常', + assetResourceDesc: '{0} 个应用异常,{1} 个应用已停止,{2} 个容器异常', + assetCronjobDesc: '近 7 天 {0} 条失败记录,{1} 个任务未启用', + app: '应用', + website: '网站', + websiteSsl: '网站 / 证书', + cronjob: '计划任务', + container: '容器', + sslCertificate: 'SSL 证书', + loginSecurity: '登录安全', + panelLogin: '1Panel 登录', + sshLogin: 'SSH 登录', + failedRecord: '失败记录', + expiredDays: '已过期 {0} 天', + remainingDays: '{0} · 剩余 {1} 天', + enabled: '已开启', + disabled: '未开启', + exportRecordFailed: '保存导出记录失败', + hostInfo: '主机信息', + hostname: '主机名', + osVersion: '系统版本', + kernelVersion: '内核版本', + arch: '架构', + uptime: '运行时间', + diskUsage: '磁盘使用', + mountPoint: '挂载点', + device: '设备', + capacity: '容量', + used: '已用', + usageRate: '使用率', + memory: '内存', + load: '负载', + maxDiskUsage: '磁盘最高使用率', + panelLoginSecurity: '1Panel 登录安全配置', + sshSecurity: 'Linux 服务器 SSH 安全配置', + panelFailedRecords: '1Panel 登录失败记录', + sshFailedRecords: 'SSH 登录失败记录', + location: '归属地', + configItem: '配置项', + currentValue: '当前值', + securityEntrance: '安全入口', + configured: '已配置', + notConfigured: '未配置', + normal: '正常', + needAttention: '需关注', + allowIPs: '授权 IP', + restricted: '已限制', + unrestricted: '未限制', + bindDomain: '绑定域名', + panelHTTPS: '面板 HTTPS', + passwordComplexity: '密码复杂度', + sshService: 'SSH 服务', + running: '运行中', + notRunning: '未运行', + listenPort: '监听端口', + read: '已读取', + rootLogin: 'Root 登录', + passwordAuth: '密码认证', + keyAuth: '密钥认证', + panelLoginFailed: '1Panel 登录失败', + sshLoginFailed: 'SSH 登录失败', + panelSecurityItems: '面板安全项', + sshSecurityItems: 'SSH 安全项', + websiteOverview: '网站概览', + primaryDomain: '主域名', + expireTime: '到期时间', + domain: '域名', + issuer: '颁发机构', + autoRenew: '自动续签', + websiteCount: '网站数量', + httpsWebsite: 'HTTPS 网站', + certCount: '证书数量', + websiteExpire: '网站到期', + database: '数据库', + remoteDatabase: '远程数据库', + address: '地址', + containerResourceUsage: '容器资源占用', + spaceUsage: '占用空间', + reclaimable: '可回收空间', + containerReclaimable: '容器可回收', + image: '镜像', + volume: '数据卷', + buildCache: '构建缓存', + alert: '告警', + alertConfigured: '已配置告警', + failedExecutionRecords: '失败执行记录', + taskID: '任务 ID', + executeTime: '执行时间', + backupTasks: '备份类任务', + systemMetrics: '运行指标', + cpu: 'CPU', + thresholdPercent: '阈值 {0}%', + loadAverage: '1 / 5 / 15 分钟负载:{0} / {1} / {2}', + sourceMount: '挂载点 {0}', + storageUsage: '空间占用', + localDisk: '本地磁盘', + highUsagePeriods: '高负载时段', + timeRange: '时间范围', + threshold: '阈值', + duration: '持续时间', + peak: '峰值', + scoring: '计分', + counted: '计入', + notCounted: '未计入', + dataSource: '数据来源', + noHighUsagePeriod: '暂无高负载时段', + monitorDisabledOrNoData: '主机监控未启用或暂无监控数据', + to: '至', + hoursShort: '{0} 小时', + minutesShort: '{0} 分钟', + websiteStatus: '网站状态', + sslRisk: '证书风险', + sslExpiring: '证书临期', + includedInReport: '已纳入报表', + needRenewal: '建议续签', + fromExpireInfo: '来自到期信息', + runningWebsite: '运行中网站', + fromWebsiteStatus: '来自网站列表状态', + stoppedWebsite: '已停止网站', + confirmStoppedWebsite: '确认是否符合预期', + expiringWebsite: '快要过期网站', + expiringSoon: '即将到期', + none: '暂无', + noSslRisk: '暂无需处理证书', + websiteProtection: 'WAF 与网站监控', + websiteMonitor: '网站监控', + waf: 'WAF', + siteAvailability: '站点可用率', + monitoredSites: '监控站点', + requestCount: '请求数', + abnormalSites: '异常站点', + count5xxSource: '按 5xx 请求统计', + wafIntercept: 'WAF 拦截', + highRiskHit: '高危命中', + websiteMonitorDisabledOrNoData: '网站监控未启用或暂无监控数据', + wafDisabledOrNoData: 'WAF 未启用或暂无拦截数据', + noWafData: '暂无 WAF 拦截数据', + sourceIP: '来源 IP', + hitCount: '命中次数', + level: '等级', + attackType: '攻击类型', + requestRatio: '请求占比', + installed: '已安装', + normalRunning: '正常运行', + failedStart: '启动失败', + manualStopped: '手动停止', + failed: '失败', + success: '成功', + canUpdate: '可升级', + listSeparator: '、', + containerCount: '容器数量', + stopped: '停止', + abnormal: '异常', + abnormalContainers: '异常容器', + resourceUsage: '资源使用', + exposedContainerPorts: '暴露端口', + portMapping: '端口映射', + risk: '风险', + noAbnormalContainer: '暂无异常容器', + noExposedContainer: '未检测到暴露端口', + publicExpose: '公网暴露', + privateExpose: '内网映射', + executionRecords: '执行记录', + successRate: '成功率', + failedJobs: '失败任务', + recentRecoveryPoint: '最近恢复点', + remoteCoverage: '远程覆盖', + recent7Days: '近 7 天', + taskTypeStats: '任务类型统计', + total: '总计', + taskTypeDesc: '已启用 {0} 个,未启用 {1} 个', + failedOrAttentionTasks: '失败或需关注任务', + execution: '执行情况', + latestExecution: '最近执行', + remoteBackup: '远程备份', + localOnly: '仅本地', + covered: '已覆盖', + noAttentionCronjob: '暂无失败或需关注的计划任务', + generationRule: '生成规则', + scheduleDaily: '每天', + scheduleDailyDesc: '每天 09:00 生成近 24 小时报表', + scheduleWeekly: '每周', + scheduleWeeklyDesc: '每周一 09:00 生成近 7 天报表', + scheduleMonthly: '每月', + scheduleMonthlyDesc: '每月 1 日 09:00 生成上月报表', + scheduleCurrentDaily: '每天 09:00 生成近 24 小时报表 · 下次 {0}', + scheduleCurrentWeekly: '每周一 09:00 生成近 7 天报表 · 下次 {0}', + scheduleCurrentMonthly: '每月 1 日 09:00 生成上月报表 · 下次 {0}', + notificationMethod: '通知方式', + channel: '通道', + receiver: '接收对象', + systemThreshold: '系统阈值', + metric: '指标', + currentRule: '当前规则', + hostMonitor: '主机监控', + monitorInterval: '监控间隔', + exportSettings: '导出设置', + defaultFormat: '默认格式', + savePath: '保存目录', + savePathRequired: '请设置报表保存目录', + generateNow: '立即生成', + generateSuccess: '已生成报表文件:{0}', + generateFailed: '生成报表失败', + enabledStatus: '已启用', + disabledStatus: '已停用', + thresholdRule: '阈值 {0},连续 {1} 次触发', + hours: '{0} 小时', + minutes: '{0} 分钟', + seconds: '{0} 秒', + totalExports: '导出总数', + successExports: '成功导出', + failedExports: '失败导出', + reportName: '报表名称', + exportFormat: '导出格式', + operator: '操作人', + triggerType: '触发方式', + filePath: '文件路径', + manualExport: '手动', + scheduledExport: '定时', + exportResult: '导出结果', + exportDetail: '导出说明', + }, + }, user: { user: '用户', userInfo: '用户信息',