"testHelp":"A short test takes about 2 minutes. The extended test runs in the background and can take several hours on large disks. The result will show up in the History tab when it finishes.",
"testWait":"Please wait until the test finishes. Buttons will unlock automatically.",
"noProgress":"This disk's firmware does not report progress. The test is running in the background.",
"lastTest":"Last test",
"nvmeMetrics":"NVMe health metrics",
"sasMetrics":"SAS/SCSI health metrics",
"id":"ID",
"attribute":"Attribute",
"value":"Value",
"worst":"Worst",
"status":"Status",
"viewFullReport":"View full SMART report",
"loadingReport":"Loading report...",
"reportLoadFailed":"Failed to load report data.",
"statusValues":{
"passed":"Passed",
"failed":"Failed",
"running":"Running",
"aborted":"Aborted",
"unknown":"Unknown"
}
},
"historyTab":{
"loading":"Loading test history...",
"empty":"No test history",
"emptyHint":"Run a SMART test to start building history for this disk.",
"title":"Test history",
"latest":"latest",
"today":"Today",
"yesterday":"Yesterday",
"daysAgo":"{count} days ago",
"downloadJson":"Download JSON",
"delete":"Delete",
"confirmDelete":"Delete this test record?",
"note":"Test results are stored locally and used to generate detailed SMART reports."
},
"smartReport":{
"title":"SMART Health Report",
"printPdf":"Print / Save as PDF",
"printHintMac":"Use Cmd+P to save as PDF",
"printHintCtrl":"Use Ctrl+P to save as PDF",
"subtitle":"ProxMenux Monitor - Disk Health Analysis",
"htmlLang":"en",
"date":"Date",
"device":"Device",
"executiveSummary":"Executive Summary",
"smartStatus":"SMART Status",
"healthAssessment":"Disk Health Assessment",
"passedUpper":"PASSED",
"testAgeWarning":"This report is based on a SMART test performed {days} days ago ({date}). Disk health may have changed since then. We recommend running a new SMART test for up-to-date results.",
"healthyAssessment":"This disk is operating within normal parameters. All SMART attributes are within acceptable thresholds. The disk has been powered on for approximately {uptime} and is currently operating at {temperature}. {sectors}",
"failedAssessment":"This disk has reported a SMART health failure. Immediate action is required. Back up all critical data and plan for disk replacement.",
"noBadSectors":"No bad sectors have been detected.",
"healthyMeaning":"In simple terms: This disk is working properly. You can continue using it normally. We recommend running periodic SMART tests (monthly) to catch any issues early.",
"criticalMeaning":"In simple terms: This disk has problems that could cause data loss. Back up your important files immediately and consider replacing the disk soon.",
"warningMeaning":"In simple terms: The disk is working but shows some signs of wear. It is not critical yet, but monitor it closely and keep your backups up to date.",
"moreIssues":"...and {count} more issues (see details below)",
"dismissed":"Dismissed",
"occurrences":"Occurrences",
"errorSignature":"Error Signature",
"rawMessage":"Raw Message",
"firstSeen":"First Seen",
"lastSeen":"Last Seen",
"observationsIntro":"The following events have been detected and logged for this disk. These observations may indicate potential issues that require attention.",
"temperatureHistory":"Temperature history",
"temperatureSamples":"{count} samples",
"temperatureBands":"Bands: amber = warn (>= {warn}°C), red = critical (>= {hot}°C). Sampled every 60s.",
"criticalWarning":"Active alert flags from the NVMe controller. Any non-zero value requires immediate investigation.",
"nvmeTemperature":"Composite temperature reported by the controller. Sustained high temperatures cause thermal throttling and reduce NAND lifespan.",
"temperatureSensor1":"Primary temperature sensor, usually the NAND flash. Most representative of flash health.",
"temperatureSensor2":"Secondary sensor, often the controller die. Typically runs hotter than Sensor 1.",
"temperatureSensor3":"Tertiary sensor, if present. Location varies by manufacturer.",
"availableSpare":"Percentage of spare NAND blocks remaining for bad-block replacement. An alert triggers below the threshold.",
"availableSpareThreshold":"Manufacturer-set minimum for Available Spare. Below this, the drive flags a critical warning.",
"percentageUsed":"Drive estimate of endurance consumed based on actual versus rated write cycles. 100% means the rated TBW was reached; the drive may keep working beyond this.",
"mediaErrors":"Unrecoverable read/write errors on NAND flash. Any non-zero value indicates permanent cell damage. Growing count means replace soon.",
"mediaIntegrityErrors":"Unrecoverable errors detected by the controller. Non-zero means data corruption risk.",
"unsafeShutdowns":"Power losses without proper flush or shutdown. Very high counts risk metadata corruption and firmware issues.",
"nvmePowerCycles":"Total on/off cycles. Frequent cycling increases connector and capacitor wear.",
"nvmePowerOnHours":"Total cumulative hours the drive has been powered on since manufacture.",
"dataUnitsRead":"Total data read in 512 KB units. Multiply by 512,000 for bytes. Useful for calculating daily read workload.",
"dataUnitsWritten":"Total data written in 512 KB units. Compare with TBW rating to estimate remaining endurance.",
"hostReadCommands":"Total read commands issued by the host. A high ratio versus write commands indicates a read-heavy workload.",
"hostWriteCommands":"Total write commands issued by the host. Includes filesystem metadata writes.",
"controllerBusyTime":"Total minutes the controller spent processing I/O commands. High values indicate sustained heavy workload.",
"errorLogEntries":"Number of entries in the error information log. Often includes benign self-test artifacts; cross-check with Media Errors.",
"warningTempTime":"Total minutes spent above the warning temperature threshold. Causes performance throttling. Zero is ideal.",
"criticalTempTime":"Total minutes spent above the critical temperature threshold. The drive may shut down to prevent damage. Should always be zero.",
"warningCompositeTemperatureTime":"Total minutes the composite temperature exceeded the warning threshold.",
"criticalCompositeTemperatureTime":"Total minutes the composite temperature exceeded the critical threshold. Must be zero.",
"thermalManagementT1TransCount":"Number of times the drive entered light thermal throttling (T1). Indicates cooling issues.",
"thermalManagementT2TransCount":"Number of times the drive entered heavy thermal throttling (T2). Significant performance impact.",
"thermalManagementT2TotalTime":"Total seconds spent in heavy thermal throttling. Severe performance degradation.",
"rawReadErrorRate":"Hardware read errors detected. High raw values on Seagate/Samsung drives are normal because their proprietary formula makes VALUE more important than raw.",
"writeErrorRate":"Errors encountered during write operations. A growing count may indicate head or media issues.",
"multiZoneErrorRate":"Errors when writing to multi-zone regions. Manufacturer-specific; a rising trend is concerning.",
"softReadErrorRate":"Read errors corrected by firmware without data loss. High values may indicate degrading media.",
"readErrorRetryRate":"Number of read retries needed. Occasional retries are normal; persistent growth indicates wear.",
"reportedUncorrect":"Errors that ECC could not correct. Any non-zero value means data was lost or unreadable.",
"reportedUncorrectableErrors":"Errors that ECC could not correct. Non-zero means data loss risk.",
"reallocatedSectorCount":"Bad sectors replaced by spare sectors from the reserve pool. A growing count means drive degradation.",
"retiredBlockCount":"NAND blocks retired due to wear or failure (SSD). Similar to Reallocated Sector Count for HDDs.",
"reallocatedEventCount":"Number of remap operations performed. Each event means a bad sector was replaced.",
"currentPendingSector":"Unstable sectors waiting to be remapped on next write. They may resolve or become permanently reallocated.",
"pendingSectors":"Sectors waiting to be remapped. They may resolve or become reallocated.",
"offlineUncorrectable":"Sectors that failed during offline scan and could not be corrected. Indicates possible data loss.",
"offlineUncorrectableSectorCount":"Uncorrectable sectors found during background scan. Data on these sectors is lost.",
"sataTemperature":"Current drive temperature. Sustained high temperatures accelerate wear and reduce lifespan.",
"temperatureCelsius":"Current drive temperature in Celsius. HDDs should usually stay below 45°C; SSDs below 60°C.",
"airflowTemperatureCel":"Temperature measured by the airflow sensor. Usually slightly lower than the main temperature sensor.",
"temperatureCase":"Temperature of the drive casing. Useful for monitoring enclosure ventilation.",
"temperatureInternal":"Internal temperature sensor. May read higher than case temperature.",
"sataPowerOnHours":"Total cumulative hours the drive has been powered on. Used to estimate age and plan replacements.",
"powerOnHoursAndMsec":"Total powered-on time with millisecond precision.",
"powerCycleCount":"Total number of complete power on/off cycles. Frequent cycling stresses electronics.",
"powerOffRetractCount":"Times the heads were retracted due to power loss (HDD). High values indicate unstable power supply.",
"unexpectedPowerLossCt":"Unexpected power losses (SSD). Can cause metadata corruption if write cache was active.",
"unsafeShutdownCount":"Power losses without proper shutdown (SSD). High values risk firmware corruption.",
"startStopCount":"Spindle motor start/stop cycles (HDD). Each cycle causes mechanical wear.",
"spinUpTime":"Time for platters to reach full operating speed (HDD). Increasing values may indicate motor bearing wear.",
"spinRetryCount":"Failed attempts to spin up the motor (HDD). Non-zero usually indicates power supply or motor issues.",
"calibrationRetryCount":"Number of head calibration retries (HDD). Non-zero may indicate mechanical issues.",
"seekErrorRate":"Errors during head positioning (HDD). High raw values on Seagate are often normal due to a proprietary formula.",
"unknownAttribute":"Vendor-specific attribute not defined in the SMART standard. Check manufacturer documentation.",
"freeFallSensor":"Free-fall events detected (laptop HDD). The heads are parked to prevent damage during drops.",
"grownDefectList":"Sectors remapped due to defects found during operation. Equivalent to Reallocated Sectors on SATA. A growing count means drive degradation.",
"readErrorsCorrected":"Read errors corrected by ECC. Normal for enterprise drives under heavy workload; only uncorrected errors are critical.",
"readEccFast":"Errors corrected by fast on-the-fly ECC during read operations. Normal in SAS drives.",
"readEccDelayed":"Errors requiring delayed or offline ECC correction during reads. Non-zero is acceptable but should not grow rapidly.",
"readUncorrectedErrors":"Read errors that ECC could not correct. Non-zero means data was lost or unreadable. Critical metric.",
"readDataProcessed":"Total data read by the drive. Useful for calculating daily workload.",
"writeErrorsCorrected":"Write errors corrected by ECC. Normal for enterprise drives.",
"writeUncorrectedErrors":"Write errors that ECC could not correct. Non-zero means potential data loss. Critical.",
"writeDataProcessed":"Total data written to the drive. Useful for workload analysis.",
"verifyErrorsCorrected":"Verification errors corrected during background verify operations.",
"verifyUncorrectedErrors":"Verify errors that could not be corrected. Non-zero indicates media degradation.",
"nonMediumErrors":"Controller or bus errors not related to the media itself. High count may indicate backplane or cable issues.",
"sasTemperature":"Current drive temperature. Enterprise SAS drives tolerate up to 55-60°C under sustained load.",
"sasPowerOnHours":"Total hours the drive has been powered on. Enterprise drives are rated for 24/7 operation.",
"startStopCycles":"Motor start/stop cycles. Enterprise SAS drives are rated for 50,000+ cycles.",
"loadUnloadCycles":"Head load/unload cycles. Enterprise drives are rated for 600,000+ cycles.",
"backgroundScanStatus":"Status of the SCSI background media scan. Runs continuously to detect surface defects."
},
"recommendations":{
"healthyTitle":"Disk is Healthy",
"healthyText":"All SMART attributes are within normal ranges. Continue regular monitoring.",
"criticalTitle":"Critical: Disk Health Issue Detected",
"criticalText":"SMART has reported a health issue. Back up all data immediately and plan for disk replacement.",
"unsafeText":"Frequent power losses increase the risk of firmware corruption. Ensure stable power or use a UPS.",
"seagateTitle":"Seagate Raw_Read_Error_Rate - Normal Behavior",
"seagateText":"Seagate drives report very large raw values for attribute #1. This is expected; only the normalized value matters and it should remain at 100.",
"smrText":"SMR disks write random data more slowly and may stall under a heavy mixed workload. They suit backups and archives, but are not recommended as primary Proxmox storage or ZFS vdevs."
}
},
"ataErrors":{
"idnf":"Sector address not found - possible bad sector or cable issue",
"unc":"Uncorrectable read error - bad sector",
"abrt":"Command aborted by drive",
"amnf":"Address mark not found - surface damage",
"tk0nf":"Track 0 not found - drive hardware failure",
"bbk":"Bad block detected",
"icrc":"Interface CRC error - cable or connector issue",
"mc":"Media changed",
"mcr":"Media change requested",
"wp":"Write protected"
},
"scheduleTab":{
"loading":"Loading schedules...",
"automaticTests":"Automatic SMART tests",
"toggleHelp":"Enable or disable all scheduled tests",
"enabled":"Enabled",
"disabled":"Disabled",
"configured":"Configured schedules",
"disks":"Disks",
"allDisks":"all disks",
"keepResults":"Keep {count} results",
"empty":"No scheduled tests configured",
"emptyHint":"Create a schedule to run SMART tests automatically.",
"edit":"Edit schedule",
"new":"New schedule",
"testType":"Test type",
"frequency":"Frequency",
"daily":"Daily",
"weekly":"Weekly",
"monthly":"Monthly",
"dailyAt":"Daily at {time}",
"weeklyAt":"{day} at {time}",
"monthlyAt":"Day {day} of month at {time}",
"dayOfWeek":"Day of week",
"dayOfMonth":"Day of month",
"timeHour":"Time (hour)",
"retention":"Keep results",
"lastN":"Last {count}",
"keepAll":"Keep all",
"saving":"Saving...",
"save":"Save schedule",
"cancel":"Cancel",
"add":"Add schedule",
"note":"Scheduled tests run automatically via cron. Results are saved to the SMART history.",
"days":{
"sunday":"Sunday",
"monday":"Monday",
"tuesday":"Tuesday",
"wednesday":"Wednesday",
"thursday":"Thursday",
"friday":"Friday",
"saturday":"Saturday"
}
}
},
"details":{
"temperature":{
"title":"CPU Temperature",
"diskTitle":"Temperature",
"current":"Current",
"min":"Min",
"avg":"Avg",
"max":"Max",
"seriesName":"Temperature",
"noData":"No temperature data available for this period",
"collectionHint":"Data is collected every 60 seconds",
"openHistory":"Open temperature history",
"collectingSamples":"Collecting samples — chart populates after ~2 minutes",
"sampleInterval":"Samples are collected every 60 seconds",
"timeframes":{
"hour":"1 Hour",
"day":"24 Hours",
"week":"7 Days",
"month":"30 Days"
},
"status":{
"hot":"Hot",
"warm":"Warm",
"normal":"Normal"
}
},
"processes":{
"topByCpu":"Top processes by CPU",
"topByMemory":"Top processes by Memory",
"cpuDescription":"Current CPU usage per process, as a fraction of the host's total CPU - same scale as the CPU Usage card above. Refreshes every 3 s while open.",
"memoryDescription":"Current resident memory per process. Refreshes every 3 s while open.",
"filterPlaceholder":"Filter by command line, user or PID...",
"pid":"PID",
"user":"User",
"command":"Command",
"cpuPercent":"CPU %",
"memory":"Memory",
"memPercent":"Mem %",
"noMatches":"No processes match the filter",
"captured":"Captured {time}",
"matchCount":"{count} match of {total} processes",
"matchesCount":"{count} matches of {total} processes",
"topCount":"Top {shown} of {total} processes",
"loadFailed":"Failed to fetch processes",
"lifetimeAverageTitle":"Average CPU% across this process's lifetime - useful for finding long-running idle baselines",
"averageShort":"avg"
},
"processInfo":{
"titleFallback":"Process",
"descriptionLive":"Live snapshot from /proc/{pid}. Auto-refreshes every {seconds} s while open.",
"descriptionExited":"Last snapshot from /proc/{pid} before the process finished.",
"finishedTitle":"This process has finished",
"finishedDescription":"It was likely a short-lived helper, script, pct exec, or one-shot command that completed while the modal was open. The data below is the last snapshot captured before it exited — not a stale or broken read.",
"loading":"Loading…",
"fetchFailed":"Failed to fetch process",
"captured":"Captured",
"lastSeen":"Last seen",
"sections":{
"overview":"Overview",
"resources":"Resources",
"command":"Command",
"lifetime":"Lifetime"
},
"labels":{
"state":"State",
"parent":"Parent",
"threads":"Threads",
"openFds":"Open FDs",
"user":"User",
"group":"Group",
"cpu":"CPU",
"memory":"Memory",
"residentRss":"Resident (RSS)",
"virtualSize":"Virtual size",
"swap":"Swap",
"ioRead":"I/O read",
"ioWrite":"I/O write",
"name":"Name",
"commandLine":"Command line",
"executable":"Executable",
"workingDir":"Working dir",
"started":"Started",
"runningFor":"Running for"
},
"states":{
"running":"Running",
"sleeping":"Sleeping",
"diskWait":"Disk wait",
"zombie":"Zombie",
"stopped":"Stopped",
"tracingStop":"Tracing stop",
"dead":"Dead",
"idle":"Idle",
"exited":"Exited"
}
}
},
"vmLxc":{
"loadingTitle":"Loading VMs and LXCs...",
"loadingDescription":"Fetching VM and LXC container status",
"disabledTitle":"Firewall is not enabled for this {type}",
"disabledHint":"Enable it in the Proxmox UI under {type} -> Firewall -> Options and add at least one rule with log: info or higher so packets start being recorded. New entries will appear here automatically on the next refresh.",
"readFailed":"Failed to read firewall log",
"empty":"No firewall events recorded yet.",
"emptyHint":"Rules with log: info or higher will populate this view as packets arrive."
"releaseDelayLabel":"Wait after a new app release",
"releaseDelayNone":"No waiting period",
"releaseDelayDays":"Wait {days} day(s)",
"releaseDelayHelp":"Applies only to selected apps with version tracking. Their pending releases must be this old; apps without version tracking still run their updater on every scheduled occurrence.",
"helperCommandEditHint":"If you edit this launcher, it will be saved as a custom command.",
"customOnlineDescription":"Or use an online script provided by the developer:",
"customOnlineExampleNote":"Replace the example URL with the official script URL for your application.",
"customExamplesHeading":"Examples to adapt:",
"updaterChoiceHint":"Choose and save an update method.",
"updaterMethodLabel":"Update method",
"helperMethod":"Helper-Scripts",
"customMethod":"Custom command",
"helperMethodHelp":"About Helper-Scripts",
"customMethodHelp":"About custom commands",
"helperDetectedChoice":"Helper-Scripts updater detected for this application.",
"helperUnavailableChoice":"The selected Helper-Scripts updater is no longer available.",
"disableUpdater":"Disable",
"disableUpdaterConfirm":"Disable the update method for {name}? Saved plans and schedules will keep their selections, but this application will not run until a method is configured again.",
"noUpdaterSelected":"You have not selected an update method.",
"helperMethodDescription":"ProxMenux runs the detected updater inside this LXC and displays its log and result. The updater is maintained by Proxmox VE Helper-Scripts.",
"customMethodDescription":"You can use the application's own updater, a package manager or a new binary. The command runs inside this LXC with administrator privileges.",
"updaterInstructions":"Review the updater's instructions.",
"helperDocumentation":"Update documentation",
"helperSource":"Application script",
"customMethodExample":"Adapt the names, paths and service to your application. Only the command you save will run.",
"helperCommandLabel":"Command inside the LXC",
"helperCommandFallback":"If wget is unavailable, ProxMenux uses curl -fsSL to download the same script.",
"customScriptTitle":"Update script",
"customScriptDescription":"Run an existing application update script inside the LXC.",
"customPackageTitle":"Debian/Ubuntu package",
"customPackageDescription":"Replace my-package with the package you want to update.",
"customBinaryTitle":"Binary",
"customBinaryDescription":"First download and verify the official binary for the correct version and architecture at /tmp/my-app.new. This example keeps a backup of the previous binary and restarts its service.",
"ociImmutableBody":"OS packages are baked in at image build time and cannot be updated in place. Apply updates manually or reinstall with a newer image.",
"hideNoticeButton":"Hide this notice for this app",
"otherPackagePending":"+{count} other package pending in the container",
"otherPackagesPending":"+{count} other packages pending in the container",
"noManagedUpdateInfo":"No update information yet — check from Security → Secure Gateway.",
"ociTitle":"OCI image container",
"ociBody":"This container was created from an OCI (Docker) image. Update management for OCI containers is coming with the upcoming OCI install feature — updates will rebuild the container from a newer image tag rather than patching packages inside.",
"dockerEngineUpdateHelp":"Updates only the installed Docker packages and required dependencies. It does not upgrade other OS packages or recreate containers.",
"updateDockerEngineOnly":"Update Docker Engine",
"adguardWebUpdateOnly":"This AdGuard Home installation is updated from its own web interface.",
"systemctlHint":"systemctl show <service> -p ExecStart",
"whichHint":"which <app>",
"apkInfoHint":"\" : \"apk info | grep",
"grafanaNote":". Grafana needs",
"hiddenDetectionsHelpSingular":"You have {count} hidden detection. Restore one to bring it back, or register a custom app manually.",
"hiddenDetectionsHelpPlural":"You have {count} hidden detections. Restore one to bring it back, or register a custom app manually.",
"registerCustom":"Register a custom app",
"noAppsTitle":"No applications registered",
"noAppsBody":"Register each application running in this container. Get clickable web links, and — optionally — upstream version tracking + notifications for new releases.",
"dockerDetectedWithWorkloads":"Docker detected with {count} containerised application(s)",
"dockerWorkloadsHeading":"Running inside Docker",
"runsInsideDocker":"Updated with its Docker image",
"upstreamDelegatedTitle":"Available version comes from its Docker image",
"upstreamDelegatedHelp":"This application runs in a container, so the available version is whatever its image resolves — no separate upstream check, and one update reported once. Update it from its image in the Updates tab.",
"confirmHide":"Hide the \"{name}\" detection permanently on this container?\n\nTo bring it back later, click \"Register a different app\" — the hidden list appears there with a Restore option.",
"dockerPublishedServicesTitle":"Docker services with published ports",
"dockerPublishedServicesHelp":"Choose only ports that provide a web interface. ProxMenux does not register these containers as independent LXC applications.",
"dockerPublishedAdd":"Add link",
"dockerPublishedPort":"container port {containerPort} → {hostPort} on the LXC",
"noWebPorts":"No web ports listening. Use Add port if you still want to create a link manually.",
"trackUpstream":"Track upstream version (optional)",
"trackOff":"Off — link only",
"trackOn":"On · {method}",
"trackHelp":"Optional. When enabled, ProxMenux checks the installed version and compares it with the latest upstream release.",
"commandSafetyHelp":"Runs argv-style inside the CT as root — never through a shell. You are responsible for what the command does. Use installed_regex below to extract the version from the output.",
"manualVersionHelp":"Type the version you have installed. If an upstream source is set below, ProxMenux still checks for updates. After upgrading the app, return here and update this value.",
"upstreamHelp":"How ProxMenux finds the latest version to compare against your installed one.",
"githubRepoHelp":"Public GitHub repository where releases or tags are published.",
"httpJsonHelp":"Public JSON endpoint that returns a version somewhere in the payload.",
"jsonPathHelp":"Dotted path with optional [N] array indices.",
"restoreButton":"Restore",
"registerButton":"Register",
"removeButton":"Remove",
"checkButton":"Check",
"editFieldsButton":"Edit fields",
"alsoDetectedContainer":"Also detected on this container",
"notifyUpstreamHelp":"Sends `app_update_available` to the channels enabled in Settings → Notifications. Turn off if this app can't be updated on your box.",
"excludeFromBadgeLabel":"Exclude from the LXC updates counter",
"excludeFromBadgeHelp":"Don't count this app in the aggregate updates badge on the LXC list card. Useful when you're pinned to a specific version on purpose (tracker requirement, compatibility freeze). Doesn't affect the App tab's own state or the outbound notification."
"description":"Configure how long dismissed alerts stay hidden for each category. Changes apply to existing and future dismissed alerts.",
"category":"Category",
"suppressionDuration":"Suppression Duration",
"hours":"Hours",
"permanentNotice":"Alerts for {category} will stay hidden permanently after dismissal.",
"temperatureSafetyNotice":"Critical CPU temperature alerts still appear to protect the hardware.",
"longSuppressionNotice":"Long suppression period. Dismissed alerts in this category will stay hidden for a long time.",
"footerNote":"These settings apply when you dismiss a warning from the Health Monitor. Critical CPU temperature alerts always appear to protect your hardware.",
"activeSuppressions":"Active Suppressions",
"activeSuppressionsDescription":"Alerts you have hidden from the Health Monitor. Permanent dismisses can only be reverted here. Editing requires the Health Monitor",
"noActiveSuppressions":"No active suppressions. Dismissed alerts from the Health Monitor will appear here.",
"permanent":"Permanent",
"daysRemaining":"{count}d remaining",
"hoursRemaining":"{count}h remaining",
"reEnableDisabledTitle":"Enable Health Monitor Edit mode to re-enable",
"reEnableQueuedTitle":"Cancel re-enable; it will not be applied on Save",
"reEnableTitle":"Queue this alert for re-enable on Save",
"description":"Exclude remote storages (PBS, NFS, CIFS, etc.) from health monitoring and notifications. Use this for storages that are intentionally offline or have limited API access.",
"emptyTitle":"No remote storages detected",
"emptyDescription":"PBS, NFS, CIFS, and other remote storages will appear here when configured",
"storage":"Storage",
"offline":"Offline or unavailable",
"namespaceRestricted":"Reachable; datastore size hidden by ACL",
"healthHelp":"When OFF, this storage will not trigger warnings or critical alerts in the Health Monitor.",
"alertsHelp":"When OFF, no notifications will be sent for this storage."
},
"networkInterfaces":{
"title":"Network Interface Exclusions",
"description":"Exclude network interfaces (bridges, bonds, physical NICs) from health monitoring and notifications. Use this for interfaces that are intentionally disabled or unused.",
"emptyTitle":"No network interfaces detected",
"interface":"Interface",
"down":"DOWN",
"excluded":"Excluded",
"noIp":"No IP",
"healthHelp":"When OFF, this interface will not trigger warnings or critical alerts in the Health Monitor.",
"alertsHelp":"When OFF, no notifications will be sent for this interface."
},
"snippets":{
"title":"Snippets storage",
"description":"Where ProxMenux installs hookscripts, for example the GPU passthrough guard for VMs/LXCs. Pick a shared storage in cluster setups so VMs and LXCs migrate cleanly between nodes;",
"localNote":"is node-specific and breaks migration.",
"placeholder":"Pick a storage...",
"footer":"Existing VMs/LXCs already configured with the previous storage keep working. Only new GPU passthrough operations, or running \"sync hookscripts\" on the host, will use the new selection."
},
"lxcUpdateDetection":{
"title":"LXC Update Detection",
"descriptionStart":"Periodically check running Debian/Ubuntu/Alpine LXC containers for pending package updates",
"descriptionEnd":" and surface them on the dashboard. The corresponding notification toggle in Notifications -> Services appears only while detection is enabled.",
"enableLabel":"Enable LXC update detection",
"loadFailed":"Could not load the LXC update detection setting.",
"saveFailed":"Could not save the LXC update detection setting.",
"purgedMessage":"{count} LXC entries removed from the registry. Re-enabling detection will repopulate them on the next scan cycle."
"tokenHelp":"The token is stored encrypted. ProxMenux uses it only for read-only GitHub API requests and never displays it again. A fine-grained token with read-only access to public repositories and no account permissions is enough.",
"enhancedMessagesDescription":"Use AI to generate contextual notification messages",
"provider":"Provider",
"customBaseUrl":"Custom base URL",
"customBaseUrlPlaceholder":"Leave empty for OpenAI or enter a custom endpoint",
"customBaseUrlHint":"For OpenAI-compatible APIs such as BytePlus, LocalAI, LM Studio or vLLM.",
"apiKey":"API key",
"model":"Model",
"promptMode":"Prompt mode",
"defaultPrompt":"Default prompt",
"customPrompt":"Custom prompt",
"language":"Language",
"selectLanguage":"Select language",
"detailLevel":"Detail level per channel",
"suggestions":"AI suggestions",
"suggestionsDescription":"Allow AI to add brief troubleshooting tips based on log context",
"customPromptPlaceholder":"Enter your custom instructions for the AI…",
"testing":"Testing…",
"testConnection":"Test connection",
"ollamaUrl":"Ollama URL",
"getKey":"Get key",
"loadModelsPlaceholder":"Click Load to fetch models",
"selectModel":"Select model",
"noModelsLoaded":"No models loaded — click Load",
"noModelSelected":"Select a model first. Click Load to fetch the available models.",
"load":"Load",
"modelsAvailable":"{count} models available",
"detailHint":"AI translates and formats notifications in your selected language. Each channel can use a different level of detail.",
"beta":"BETA",
"export":"Export",
"import":"Import",
"communityPrompts":"Community prompts",
"customPromptHint":"Define your own rules and format. You control the detail and style of all notifications. Export the prompt to share it, or import one from the community.",
"local":"Local",
"detailLevels":{
"brief":"Brief",
"standard":"Standard",
"detailed":"Detailed"
},
"providersInfo":"AI provider information",
"loadModelsHint":"Click Load to fetch the available models from this provider.",
"openAiCompatible":"OpenAI-compatible APIs",
"openAiCompatibleDescription":"Set a custom base URL to use an OpenAI-compatible API. Supported services include:",
"anyOpenAiService":"Any service using the OpenAI format",
"providers":{
"groq":"Very fast, with a generous free tier. A good place to start.",
"openai":"Industry standard, accurate and widely used.",
"anthropic":"Excellent for writing and translation; fast and economical.",
"gemini":"A free tier is available, with a good quality-to-price ratio.",
"ollama":"Uses models on your Ollama server. Fully local, private and free to run.",
"openrouter":"Access to more than 100 models through one API key."
"description":"Create your own AI prompt for ProxMenux Monitor notifications",
"whatTitle":"What is a custom prompt?",
"whatDescription":"The prompt defines how AI formats your notifications. A custom prompt lets you control the style, level of detail and format of every message.",
"requirements":"Important requirements",
"formatIntro":"Your prompt must use this output format:",
"formatTitleThen":"followed by the title, then",
"formatBodyThen":"followed by the message",
"plainText":"Use plain text only, without Markdown, so the result works in every channel.",
"rawData":"The prompt receives raw Proxmox event data as input.",
"language":"Define the output language in the prompt. The Language selector only applies to the default mode.",
"gettingStarted":"Getting started",
"gettingStartedDescription":"An example prompt is ready to help you start. You can adjust it, export it to share with others, or import a prompt from the community.",
"emptyDescription":"Run ProxMenux to configure system optimizations",
"installedTools":"Installed Tools",
"activeCount":"{count} active",
"viewUpdates":"View available updates",
"updateCount":"{count} updates",
"updateOneTitle":"Update: {name}",
"updateManyTitle":"Update {count} optimizations",
"updateOneDescription":"Re-running {functionName} from the {source} flow.",
"updateManyDescription":"Re-running {count} post-install functions in sequence.",
"legacySourceTitle":"Legacy optimization - click to view source",
"sourceTitle":"Click to view source code",
"legacy":"legacy",
"updateToolTitle":"Update {name} to v{version}",
"availableUpdates":"Available updates",
"availableUpdatesDescription":"{count} optimizations can be updated to a newer version.",
"selectedCount":"{selected} of {total} selected",
"updateSelected":"Update selected"
},
"healthThresholds":{
"title":"Health Monitor Thresholds",
"description":"Health Monitor and notifications react when these limits are crossed. Drag the amber handle for the warning level and the red handle for the critical level. Values different from the recommendation appear in blue; hover a handle to see the recommendation, or use Reset to restore it.",
"loadFailed":"Failed to load thresholds.",
"invalidValue":"Invalid value for {key}: must be a number",
"resetFailed":"Reset failed",
"networkErrorWhileResetting":"Network error while resetting",
"resetSectionConfirm":"Reset all \"{section}\" thresholds to recommended values?",
"resetAllConfirm":"Reset ALL thresholds to recommended values? This affects every section.",
"resetAllTitle":"Reset every threshold to its recommended value",
"resetSectionTitle":"Reset this section to recommended",
"recommended":"Recommended",
"warning":"Warning",
"critical":"Critical",
"ok":"OK",
"warn":"WARN",
"crit":"CRIT",
"ram":"RAM",
"swapCriticalOnly":"Swap (critical only)",
"sections":{
"cpu":{
"title":"CPU usage"
},
"memory":{
"title":"Memory & Swap"
},
"cpu_temperature":{
"title":"CPU temperature"
},
"disk_temperature":{
"title":"Disk temperature",
"description":"Per-class thresholds. Same units (°C), different defaults because each class tolerates a different range."
},
"host_storage":{
"title":"Disk space - host",
"description":"Applies to / and every mountpoint under /var/lib/vz, /mnt/* etc."
},
"lxc_rootfs":{
"title":"Disk space - LXC rootfs",
"description":"Per-container root disk, evaluated against the rootfs size from PVE."
},
"lxc_mount":{
"title":"LXC mount points",
"description":"Capacity of mountpoints inside running CTs (mp0, mp1, NFS, bind mounts). Excludes the rootfs; that is covered above."
},
"pve_storage":{
"title":"PVE storage capacity",
"description":"Block-style PVE storages: LVM, LVM-thin, ZFS-pool, RBD/Ceph, PBS. Filesystem-style storage is already covered by host disk thresholds."
},
"zfs_pool":{
"title":"ZFS pool capacity",
"description":"ZFS pools at host level, independent of PVE registration, so rpool and dedicated backup pools are also monitored."
"swapPressureHint":"Marks a critical event only when BOTH conditions hold at the same time — swap file usage above the first threshold AND available RAM below the second. Alerting on swap alone is noisy on Proxmox hosts where Linux swaps out inactive pages while RAM is still plentifully available.",
"swapHighLabel":"Swap file usage",
"availableMinLabel":"Minimum available RAM"
},
"navOrder":{
"title":"Navigation order",
"description":"Personalize the order of the top-level tabs. Grouped tabs (Node, Admin) move as a single unit; their internal items keep their default order.",
"reset":"Restore default",
"hint":"Drag to reorder · On touch, long-press first",
"readOnlyHint":"Reads metrics and status. Recommended for dashboards and integrations.",
"fullAdmin":"Full admin",
"fullAdminHint":"Full control, like your own session.",
"fullAdminWarning":"A full-admin token can do everything you can: power off or reboot the host, run updates and open a terminal. Share it only with fully trusted integrations."
"scanDescription":"Open your authenticator app and scan this code.",
"qrCodeAlt":"2FA QR code",
"manualKey":"Manual key",
"copyKey":"Copy key",
"verifyTitle":"Verify code",
"verifyDescription":"Enter the current 6-digit code from your app.",
"verifying":"Verifying...",
"verifyAndEnable":"Verify and enable",
"enabledTitle":"2FA is enabled.",
"enabledDescription":"Save the backup codes before you close this window.",
"saveCodesTitle":"Save your backup codes",
"saveCodesDescription":"Each code can be used once if you lose access to your authenticator app.",
"backupCodes":"Backup codes",
"copyAll":"Copy all",
"finish":"Finish"
},
"secureGateway":{
"title":"Secure Gateway",
"learnMore":"Learn more",
"noNetworkDetected":"No network detected",
"noNetworksDetected":"No networks were detected.",
"recommended":"Recommended",
"retry":"Retry",
"errors":{
"loadWizardFailed":"Failed to load Secure Gateway setup",
"updateFailed":"Failed to update Secure Gateway",
"networkUpdateFailed":"Network error while updating Secure Gateway",
"fieldRequired":"{field} is required.",
"deploymentFailed":"Deployment failed",
"ociRequiresPve":"Secure Gateway uses standard LXC and should work on this Proxmox host. If this keeps happening, check the backend logs.",
"authKeyRequired":"Enter a Tailscale auth key.",
"updateAuthKeyFailed":"Failed to update auth key",
"couldNotLoadSetupData":"Could not load setup data."
},
"messages":{
"updateApplied":"Update was applied.",
"preparingDeployment":"Preparing deployment...",
"creatingLxc":"Creating LXC container...",
"gatewayDeployed":"Secure Gateway deployed."
},
"logs":{
"empty":"No logs available.",
"failed":"Failed to load logs.",
"title":"Secure Gateway logs",
"description":"Recent service output from the gateway container."
},
"values":{
"never":"never",
"yesterdayAt":"yesterday at {time}",
"yes":"Yes",
"no":"No"
},
"wizard":{
"introTitle":"Secure remote access with Tailscale",
"introDescription":"Deploy a small LXC gateway so your devices can reach ProxMenux, Proxmox and selected local networks through your Tailscale tailnet.",
"whatYouGet":"What you get",
"benefitMonitorAnywhere":"Open the Monitor from anywhere on your tailnet.",
"benefitProxmoxUi":"Reach the Proxmox web UI without exposing port 8006.",
"benefitVmLxc":"Access selected VM and LXC networks when needed.",
"benefitEncryption":"Traffic stays encrypted through Tailscale.",
"benefitNoPorts":"No public port forwarding required.",
"tailscaleAccountBefore":"You need a Tailscale account and a pre-auth key from",
"reviewDeploy":"Review and deploy",
"reviewDescription":"Check the final settings before the LXC gateway is created.",
"storageLocation":"Storage location",
"storageDescription":"Choose where to store the gateway container.",
"gbAvailable":"{amount} GB available",
"configurationSummary":"Configuration summary",
"hostname":"Hostname",
"storage":"Storage",
"accessMode":"Access mode",
"accessModes":{
"hostOnly":"Proxmox only",
"proxmoxNetwork":"Full local network",
"customNetworks":"Custom networks"
},
"hostAccess":"Host access",
"networks":"Networks",
"exitNode":"Exit node",
"acceptRoutes":"Accept routes",
"important":"Important",
"approvalRequired":"After deployment, approve the advertised subnet routes in Tailscale Admin.",
"exitNodeApprovalRequired":"Exit Node mode also needs approval there.",
"showAfterDeploy":"We will show the exact approval steps after deployment.",
"setupTitle":"Secure Gateway setup"
},
"steps":{
"intro":{
"title":"Secure remote access",
"description":"Set up secure VPN access to your Proxmox server"
},
"auth":{
"title":"Tailscale authentication",
"description":"Connect the gateway to your Tailscale account"
},
"access":{
"title":"Access scope",
"description":"Choose what should be reachable through this gateway"
},
"options":{
"title":"Advanced options",
"description":"Additional routing settings"
},
"deploy":{
"title":"Deploy gateway",
"description":"Review and deploy"
}
},
"status":{
"connected":"Connected",
"stopped":"Stopped",
"error":"Error"
},
"installed":{
"description":"Secure Gateway is deployed and managed by the Monitor.",
"heroDescription":"A web dashboard and management layer for Proxmox VE — health monitoring, notifications, terminal, optimization tracker and more, packaged as a single AppImage.",
"project":{
"title":"Project",
"description":"Repository, documentation and community channels."
},
"support":{
"title":"Support & License",
"description":"ProxMenux is free and open source under the GPL-3.0 license. If it is useful to you, a one-off contribution helps keep it that way."
},
"license":{
"label":"GPL-3.0 license",
"description":"Free software — see the LICENSE file for the full text."
"appDetection":"Smarter app detection in the App tab: Docker is correctly promoted as the parent workload during cold start (Portainer/SearXNG no longer briefly show up as native apps), unregistered suggestions live in the startup cache, and 'Find applications' runs a fresh catalog-backed scan on demand.",
"dockerUpdates":"The Updates tab now covers Docker end-to-end: Docker Engine and per-image update tracking follow the same 24-hour rolling cycle as OS packages, with a 'Check now' action for on-demand digest comparison — no more waiting for the daily collector.",
"appCatalog":"New application detection catalog with over 380 tracked workloads, generated live from community-scripts across seven detector methods (file, binary, dpkg, apk, Python, Docker exec, Docker label). Primary and fallback detectors cover both new and historical LXC layouts.",
"pushover":"Pushover joins Telegram, Gotify, Discord, Email and Apprise as a native notification channel — user/API key, device and sound selectors, priority 0 for regular messages, optional priority 1 for CRITICAL events. Suggested by @benginx (#308).",
"appsDashboard":"New top-level Apps dashboard — a single launcher for every Web Link across the node. LXC-registered apps and user-defined Custom Web Links share the same grid with category badges, search, and one-click deep-links back to the guest modal.",
"lxcAppsUpdates":"App tab inside every LXC modal registers installed apps, captures weblinks and tracks upstream versions. Reworked Updates tab applies OS packages and app updates from a single button; Docker Engine and per-image tracking follow the same 24-hour cycle, with a 'Check now' action on demand.",
"multilingual":"The Monitor now speaks 8 languages: English, Spanish, German, French, Italian, Portuguese, Swedish and Slovak. Huge thanks to @vaso73 for building the i18n scaffolding that made this possible.",
"nvidiaMultiGpu":"NVIDIA driver lifecycle moves to per-BDF ownership so a multi-GPU host can pass one card to a VM and keep the other operational on the host or in LXCs, plus a kernel + branch + GPU-aware version picker (#298).",
"aiCustomEndpoint":"AI Assistant custom OpenAI endpoint — LiteLLM, LM Studio, LocalAI, vLLM, OmniRoute and any self-hosted proxy on private IPs, loopback or Docker networks are recognised when loading the model catalogue. The dropdown surfaces the server's error (or the underlying network reason) directly under the Load button (#325, reported by @jorgeffonte).",
"secureGatewayArch":"Secure Gateway wizard — the Alpine template download, local template selection and pct create all match the host's real architecture, so x86_64 hosts receive amd64 containers and arm64 hosts receive arm64 containers (#324, reported by @N0X4DD0).",
"atomicNotifications":"Notification events reserve their deduplication fingerprint atomically before AI processing and channel delivery, so concurrent collectors, completion callbacks or parallel Monitor processes cannot send the same event twice. The reservation is released when no channel succeeds, preserving retries.",
"borgSshPort":"Borg remote target — the Add Borg destination dialog and the shell TUI accept a custom SSH port. BORG_RSH, the auto key install flow and the capacity probe all honour it. Fully backwards compatible with existing entries created without an explicit port (suggested by @songochain in discussion #236).",
"githubToken":"Settings → GitHub API accepts an optional personal access token for release and tag checks when the anonymous quota is exhausted. The token is encrypted at rest and never returned to the browser; the rate-limit error is translated in every Monitor language (suggested by @SystemIdleProcess in discussion #306).",
"replicationContext":"Native Proxmox replication failure notifications resolve the replication job ID, affected VM/LXC ID and guest name; the exact error block from Proxmox is preserved as the reason, and each replication job deduplicates independently (reported by Ale R.).",
"auditAssessment":"Audit & Report — a new page that documents and assesses the node. The Assessment runs a catalogue of checks across security, backups, capacity, storage, network, hardware, guests and system, classifying each finding as critical, warning, observation or conformant and stating what it read rather than judging it.",
"changeJournal":"Change journal — a Changes view that lists exactly what ProxMenux modified on this host: every configuration file, package and service it touched, with the prior state of each, deduplicated to a current-state view that shows the host as it stands now rather than a log of every run.",
"auditReports":"Reports — a full audit plus focused Security review, Backup assurance and Capacity & wear reports, each opening on its own posture header, and a printable Inventory; all export to PDF. A security assessment asks before running Lynis so a run stays fast.",
"auditPolicyBaseline":"Policy and baseline — declare what the host is expected to be (backup requirements, firewall, root SSH login) so findings grade against it, mark a run as the reference, and see what changed since, with new, resolved and accepted findings kept apart.",
"groupedAppUpdates":"Grouped application update notifications — one complete message per scan instead of one per application, grouped by LXC with the installed and available versions.",
"adminTokenScope":"Administrative scope — opening a Monitor terminal and disabling authentication now require a full-admin token, so a read-only API token issued to a monitoring integration stays read-only (reported by @f3rs3n)."
"inactiveDescription":"This interface is currently down. Network traffic statistics are not available.",
"bondConfiguration":"Bond Configuration",
"bridgeConfiguration":"Bridge Configuration"
},
"flow":{
"title":"Network Flow"
},
"chart":{
"invalidDataFormat":"Invalid data format received from server",
"loadError":"Error loading metrics"
},
"latency":{
"status":{
"excellent":"Excellent",
"good":"Good",
"fair":"Fair",
"poor":"Poor"
},
"timeframes":{
"hour":"1 Hour",
"sixHours":"6 Hours",
"day":"24 Hours",
"threeDays":"3 Days",
"week":"7 Days"
},
"targets":{
"gateway":"Gateway (Router)",
"gatewayShort":"Gateway",
"cloudflare":"Cloudflare (1.1.1.1)",
"cloudflareShort":"Cloudflare",
"google":"Google DNS (8.8.8.8)",
"googleShort":"Google DNS"
},
"actions":{
"stop":"Stop",
"testAgain":"Test Again",
"report":"Report"
},
"testingProgress":"Testing... {percent}%",
"secondsRemaining":"{seconds}s remaining",
"samplesCollected":"{count} samples collected",
"packetLossValue":"{value}% packet loss",
"collectingData":"Collecting data...",
"noRealtimeData":"No data yet. Click “Test Again” to start.",
"noDataForPeriod":"No latency data available for this period",
"collectionInterval":"Data is collected every 60 seconds",
"realTimeMode":"Real-time mode",
"realTimeModeDescription":"Tests run for 2 minutes with readings every 5 seconds. Run the test again afterward to add more samples. All data is included in the report.",
"reinstallViaPostInstall":"Reinstall via ProxMenux post-install: {label}",
"noUpdatesAvailable":"No updates available",
"none":"none",
"running":"running",
"stopped":"stopped",
"unused":"unused",
"unbound":"unbound",
"driversReady":"Drivers ready",
"driversNotInstalled":"Drivers not installed",
"programmed":"Programmed (runtime loaded)",
"unprogrammed":"Unprogrammed (runtime not loaded)",
"notInstalled":"not installed",
"detecting":"Detecting...",
"solidStateDevice":"Solid State Device",
"notSpecified":"Not specified"
},
"time":{
"yesterdayAt":"yesterday {time}"
},
"recommendations":{
"intel":"To get extended GPU monitoring information, please install the intel-gpu-tools or igt-gpu-tools package.",
"nvidia":"For NVIDIA GPUs, real-time monitoring requires the proprietary drivers (nvidia-driver package). Install them only if your GPU is used directly by the host.",
"amd":"To get extended GPU monitoring information for AMD GPUs, please install amdgpu_top. You can download it from: https://github.com/Umio-Yasuno/amdgpu_top",
"generic":"To get extended GPU monitoring information, please install the appropriate GPU monitoring tools for your hardware."
},
"deviceTypes":{
"graphics":"Graphics",
"graphicsCard":"Graphics Card",
"usb":"USB",
"usbController":"USB Controller",
"audio":"Audio",
"audioController":"Audio Controller",
"network":"Network",
"networkController":"Network Controller",
"ethernet":"Ethernet",
"wireless":"Wi-Fi",
"wirelessController":"Wireless Controller",
"wifi":"Wi-Fi",
"storage":"Storage",
"storageController":"Storage Controller",
"hid":"HID",
"vendorSpecific":"Vendor Specific",
"communications":"Communications",
"integrated":"Integrated",
"discrete":"Discrete"
},
"gpu":{
"monitoringTitle":"GPU Real-Time Monitoring",
"sriovVirtualFunction":"SR-IOV Virtual Function",
"sriovVirtualFunctionDescription":"This device is a Virtual Function spawned by a Physical Function. Per-VF telemetry (temperature, utilization, memory) is not exposed by the kernel — open the parent PF to see aggregate GPU metrics.",
"virtualFunctionDetail":"Virtual Function Detail",
"noActiveProcesses":"No active processes using the GPU",
"virtualFunctions":"Virtual Functions",
"switchModeVmTitle":"GPU in Switch Mode VM",
"switchModeVmDescription":"This GPU is assigned to a virtual machine via VFIO passthrough. Real-time monitoring is not available from the host because the GPU is controlled by the VM.",
"extendedMonitoringUnavailable":"Extended Monitoring Not Available"
"recoveryPassphraseRequired":"Recovery passphrase is required.",
"repoNameAndSnapshotRequired":"Repository name and snapshot are required.",
"runFailed":"Run failed: {error}",
"snapshotInfoMissing":"Snapshot information is missing.",
"toggleFailed":"Could not change job state: {error}"
},
"extraPaths":{
"absolutePathHintAfter":"— the path must exist on this host exactly as typed.",
"absolutePathHintBefore":"Use the full absolute path.",
"absolutePathHintMiddle":"is not the same as",
"descriptionAfter":"(manual or scheduled, default or custom profile) on top of the default profile list. Useful for app data, custom config folders, and similar paths. ({count} configured)",
"descriptionBefore":"Paths added here are included in",
"empty":"No custom paths yet — backups use the default profile only.",
"encryptedCopyAvailable":"Encrypted key recovery copy is available in PBS.",
"keyfileMissingTitle":"PBS keyfile is missing",
"recoverArrow":"Recover →"
},
"restore":{
"ackAfter":"the VMs, LXCs and components listed above. This is irreversible.",
"ackBefore":"I understand that Complete restore will",
"afterRebootHint":"After the reboot, this Backups tab will show live post-restore progress with estimated time, per-component status, log tail and rollback delta. If Telegram/Discord/ntfy notifications are configured, you'll also receive the \"Host restore finished\" event.",
"blockedPathsHint":"Kernel/boot-tied paths are grayed out and cannot be selected — target runs a newer kernel.",
"chooseModeTitle":"Restore — choose mode",
"complete":"Complete",
"completeDescription":"Restore everything from the backup.",
"completeDescriptionAfter":"in the shell TUI menu. The terminal that opens next will still ask you to confirm safe-only vs safe+reboot vs all-at-once before touching the host.",
"completeDescriptionBefore":"Replays everything in the backup. Equivalent to picking",
"completeTitle":"Complete restore",
"crossKernelDescription":"Both Complete and Custom restore automatically skip kernel/boot-tied paths to avoid a kernel panic on next boot. Everything else (VMs, LXCs, network, components, custom paths) restores normally.",
"customByPathsDescription":"Pick exactly which paths to restore. Lists what's actually in this backup (default profile + your custom paths).",
"customByPathsTitle":"Custom restore by paths",
"customPickDescriptionAfter":"env var — same downstream code as the TUI. Reboot-required paths (kernel, modules, fstab, …) will be detected by the bash flow and you can schedule them for next boot from there.",
"customPickDescriptionBefore":"Pick the paths to restore. Your selection feeds",
"customPickDescriptionMiddle":"via the",
"destructiveTitle":"Complete restore will REMOVE the following (created after the backup)",
"noPathsMatch":"No paths match the filter.",
"noRestorablePaths":"This backup carries no restorable paths — only Complete restore is meaningful here.",
"olderThanTargetKernel":"is older than target kernel",
"operatorConfigDescription":"The following operator-authored settings will be merged into the target automatically, without touching kernel-tied defaults. Runs on both Complete and Custom restore.",
"operatorConfigTitle":"Operator config re-applied via kernel-agnostic merge",
"pathsInBackup":"({count} paths in backup)",
"pathsSelected":"{count} paths selected",
"pathsSkipped":"Paths that will be skipped ({count})",
"permanentlyDelete":"permanently delete",
"pickPathError":"Pick at least one path to continue.",
"skippedPathTitle":"Skipped: kernel-tied path, target runs a newer kernel",
"terminalTitle":"Restore terminal",
"tickAckToEnable":"Tick the acknowledgement above to enable."
},
"retention":{
"daily":"Daily",
"hourly":"Hourly",
"keepDaily":"Keep daily",
"keepHourly":"Keep hourly",
"keepLast":"Keep last",
"keepMonthly":"Keep monthly",
"keepWeekly":"Keep weekly",
"keepYearly":"Keep yearly",
"last":"Last",
"monthly":"Monthly",
"none":"None",
"noneAccumulate":"No retention limits — backups accumulate until manually removed.",
"title":"Retention",
"weekly":"Weekly",
"yearly":"Yearly",
"zeroDisables":"0 disables this limit."
},
"rollback":{
"components":"Components:",
"configsIncluded":"Configurations included in backup",
"lxcConfigs":"LXC configs:",
"noDifferences":"No host-state differences detected — the backup state matches the current host (or the backup didn't include /etc/pve).",
"pveOnlyHint":"Only the /etc/pve config is restored — disk images stay where they live.",
"vmConfigs":"VM configs:"
},
"schedule":{
"advancedHelpAfter":"for exact systemd syntax.",
"advancedHelpBefore":"Use",
"advancedHelpMiddle":"and",
"advancedOption":"Advanced",
"borgTimerOnly":"Borg jobs are scheduled by Monitor timers.",
"dailyOption":"Daily",
"everyDayAt":"Every day at {time}",
"everyDayAtMidnight":"Every day at midnight",
"everyHourAtMinute":"Every hour at minute {minute}",
"everyHourAtMinuteZero":"Every hour",
"everyMinute":"Every minute",
"everyMondayAtMidnight":"Every Monday at midnight",
"firstDayMonthly":"First day of every month",
"hourlyHelpAfter":"runs once per hour.",
"hourlyHelpBefore":"At minute",
"hourlyHelpMiddle":"the timer",
"hourlyOption":"Hourly",
"howToSchedule":"How should it run?",
"janFirst":"January 1 every year",
"modeHelp":"Choose a simple schedule or enter a systemd OnCalendar expression.",
"monthlyOption":"Monthly",
"monthlySkipHelp":"If a month has fewer days, systemd skips that run.",
"pickAtLeastOneDay":"Pick at least one day.",
"pickFrequency":"Pick frequency",
"preview":"Preview",
"rawOnCalendar":"{value} (systemd OnCalendar)",
"title":"Schedule",
"weekdaysAt":"{days} at {time}",
"weeklyOption":"Weekly"
},
"status":{
"attached":"attached",
"disabled":"disabled",
"legacy":"legacy",
"manual":"manual",
"manualOneShot":"manual / one-shot",
"ok":"ok",
"running":"running",
"scheduled":"scheduled"
},
"taskStates":{
"completed":"completed",
"failed":"failed",
"packing":"packing",
"queued":"queued",
"restoring":"restoring",
"running":"running"
},
"usb":{
"description":"Mount USB drives so they can be picked as a local or Borg target. Drives that already had a filesystem can be remounted as-is; raw drives (no partition table) can be wiped and formatted to",
"drivesDetected":"{count} drives detected",
"empty":"No USB drives detected. Plug one in and refresh — Monitor scans for them automatically every 30s.",
"formatAndUse":"Format and use",
"formatDescription":"This will wipe the selected disk and create a single ext4 partition.",
"formatDrive":"Format drive",
"formatDriveQuestion":"Wipe and format this disk?",
"formatTitle":"Wipe + format this disk as ext4",
"formatWarning":"Everything on the disk will be destroyed. This cannot be undone.",
"mountAndUse":"Mount and use",
"mounted":"Mounted",
"noneDetected":"No USB drives detected.",
"repartitionHint":"The disk will be re-partitioned (GPT + single ext4 partition) and mounted automatically.",
"scanning":"Scanning USB drives...",
"stateEmpty":"no filesystem",
"stateMounted":"mounted",
"stateUnmounted":"not mounted",
"typeDeviceExactly":"Type the device path EXACTLY to confirm:",
"typeDeviceToConfirm":"Type the device path to confirm",
"unformatted":"Unformatted",
"unmountConfirm":"Unmount {path}? Any backup job pointing at this path will fail until you remount it.",
"unmounted":"Unmounted",
"uuidTitle":"uuid: {uuid}",
"wipeAndFormat":"Wipe and format"
},
"validation":{
"invalidLabel":"Invalid label."
},
"weekdays":{
"friday":"Friday",
"monday":"Monday",
"saturday":"Saturday",
"short":{
"fri":"Fri",
"mon":"Mon",
"sat":"Sat",
"sun":"Sun",
"thu":"Thu",
"tue":"Tue",
"wed":"Wed"
},
"sunday":"Sunday",
"thursday":"Thursday",
"tuesday":"Tuesday",
"wednesday":"Wednesday"
}
},
"healthStatus":{
"title":"System health status",
"description":"Detailed checks of all system components",
"importedForcedHelp":"The new hostid was written to the pool label — the next boot should import cleanly.",
"skippedPartial":"Skipped (some disks missing)",
"skippedPartialHelp":"Some vdev disks were not found under /dev/disk/by-id. The pool was not imported to avoid a degraded auto-import. Fix the disks or import it manually with zpool import.",
"skippedMissing":"Skipped (no disks present)",
"skippedMissingHelp":"None of this pool’s disks are on this host. Move the disks here or import the pool from another host.",
"importFailed":"Import failed",
"importFailedHelp":"ZFS rejected the import even with -f. Check zpool import and the log below.",
"logPath":"Log: {path}"
},
"history":{
"title":"Past restores",
"description":"Restore runs archived after boot. The latest 20 are kept.",
"empty":"No past restores recorded."
},
"badges":{
"bootWarnings":"Boot warnings: {count}",
"zfsPools":"ZFS pools: {count}",
"needAttention":"needs attention: {count}"
},
"actions":{
"details":"Details",
"history":"History",
"dismiss":"Dismiss"
},
"summary":{
"guests":"Guests",
"bindMountStubs":"Bind-mount stubs",
"staleNodesCleaned":"Stale nodes cleaned",
"components":"Components"
}
},
"terminal":{
"connected":"Connected",
"disconnected":"Disconnected",
"terminalCount":"{count} / 4 terminals",
"stackedLayout":"Stacked view (rows)",
"gridLayout":"2×2 grid view",
"new":"New",
"search":"Search",
"clear":"Clear",
"searchCommands":"Search commands",
"onlineSource":"Online — using the cheat.sh API",
"offlineSource":"Offline — using local commands",
"searchDescription":"Search for Linux and Proxmox commands",
"rationale":"Enabled backup jobs on this node, the guests each one selects, and guest data excluded from them. Configured coverage does not prove that a usable backup exists. Whether an unselected guest was meant to be protected comes from the declared policy.",
"noJobs":"No backup job is defined on this node for the {total} guests it holds",
"covered":"Every one of the {total} guests is selected by an enabled backup job",
"uncovered":"{count} of {total} guests are not selected by any enabled backup job",
"excludedData":"{count} disk or mount point exclusion(s) need review",
"uncoveredExpected":"{required} guests declared as requiring a backup are not selected by any enabled job",
"evaluationFailed":"The check could not be evaluated"
}
},
"last_backup_age":{
"title":"Age of stored backups",
"rationale":"Age: time elapsed since the latest stored backup. Limit used: the reference age against which that backup is compared.",
"summary":{
"recent":"All {total} guest/destination checks meet the stated age policy",
"stale":"{count} of {total} guests have no backup from the last 30 days",
"noBackups":"No stored backup matches a guest on this node",
"attention":"{count} of {total} guest/destination checks need review",
"evaluationFailed":"The check could not be evaluated"
}
},
"retention_defined":{
"title":"Backup retention",
"rationale":"Retention as Proxmox resolves it: the job's setting, then the storage's, then the node default. Retention applied by a backup server is not readable from this node.",
"summary":{
"allDefined":"All {total} jobs resolve a retention setting",
"missing":"{count} of {total} enabled job(s) declare no retention",
"notDeclared":"{count} of {total} jobs keep every copy: no retention is declared for them",
"onServer":"{count} of {total} jobs write to a backup server, which prunes them under its own jobs",
"evaluationFailed":"The check could not be evaluated"
}
},
"verification_state":{
"title":"Backup verification",
"rationale":"The verification result Proxmox Backup Server records for each guest's newest copy, and whether an earlier copy of the same guest verified. Verification reads a stored copy back; it is not a restore.",
"summary":{
"allVerified":"The newest copy of all {total} guests has been verified intact",
"failed":"{failed} newest copies failed verification, of {total} examined",
"notVerified":"{pending} of {total} newest copies have not been verified",
"evaluationFailed":"The verification state could not be read"
}
},
"job_results":{
"title":"Backup run results",
"rationale":"How each guest's most recent recorded run ended, from the node's task log. Only the latest run is graded. The log is retained for a limited period.",
"summary":{
"allSucceeded":"All {total} recorded backup runs ended without error",
"someFailed":"{count} of {total} recorded backup runs ended with an error",
"evaluationFailed":"The task log could not be read",
"recovered":"{count} of {total} guests failed an earlier run and succeeded since"
}
},
"host_recovery":{
"title":"Host recovery",
"rationale":"Host backups as ProxMenux records them: each job it ran, when, whether it succeeded, the destination it wrote to and whether that copy is still there. A job writing to a backup server names no local path. Encryption keys are reported by count and recorded escrow mode only.",
"summary":{
"noHostBackup":"No host configuration backup is stored and no timer produces one",
"protected":"The node's own configuration is stored in {total} archive(s), within the age limit in use",
"attention":"{count} finding(s) across {total} host configuration record(s)",
"scheduledOnly":"Host configuration backups are scheduled through {count} timer(s); no archive is stored locally"
"rationale":"The `/var/run/reboot-required` marker and the packages listed in `/var/run/reboot-required.pkgs`. Its absence does not prove that nothing needs restarting.",
"rationale":"References to `enterprise.proxmox.com` in `/etc/apt/sources.list` and `sources.list.d`, against the status returned by `pvesubscription get`.",
"unsubscribed":"The enterprise repository is enabled without an active subscription",
"evaluationFailed":"The check could not be evaluated"
}
},
"memory_overcommit":{
"title":"Memory allocation",
"rationale":"The `memory` ceiling of every guest configuration against MemTotal, with running guests counted separately. Containers consume up to that limit; virtual machines without ballooning reserve it.",
"summary":{
"withinRatio":"Guests are allocated {percent}% of host memory",
"aboveRatio":"Guests are allocated {percent}% of host memory",
"evaluationFailed":"The check could not be evaluated"
}
},
"time_synchronisation":{
"title":"Time synchronisation",
"rationale":"NTP and NTPSynchronized as `timedatectl` reports them. Cluster membership, certificate validation and log ordering depend on agreeing clocks. Another mechanism may be disciplining the clock.",
"summary":{
"synchronised":"The clock is synchronised with a time source",
"disabled":"Time synchronisation is disabled",
"notSynchronised":"Time synchronisation is enabled but the clock is not synchronised",
"evaluationFailed":"The check could not be evaluated"
}
},
"kernel_current":{
"title":"Running kernel",
"rationale":"The running kernel against the one the host would start next, as `proxmox-boot-tool` reports it. A newer kernel merely installed may be held deliberately; the two differing after a restart is a boot that did not take.",
"summary":{
"current":"The running kernel {version} is the one the host would start next",
"newerAvailable":"The host runs {running} while {newest} is installed",
"newerSelected":"The host runs {running} and would start {selected} at the next restart",
"wouldDowngrade":"The host runs {running} but would start the older {selected} at the next restart",
"bootTargetUnknown":"The host runs {version}; the kernel selected for the next boot could not be read",
"evaluationFailed":"The check could not be evaluated"
}
},
"security_updates":{
"title":"Security updates",
"rationale":"Pending packages whose origin is a security repository, from a simulated `apt-get upgrade`. The count reflects what apt reports, not the severity of what each package fixes.",
"summary":{
"none":"No package updates are pending",
"noSecurity":"{total} update(s) pending, none from a security repository",
"pending":"{count} of {total} pending update(s) come from a security repository",
"evaluationFailed":"The check could not be evaluated"
}
},
"journal_size":{
"title":"Journal size",
"rationale":"The journal on disk against the cap that applies to it: SystemMaxUse where it is set, and otherwise journald's default of a tenth of the filesystem it lives on.",
"summary":{
"bounded":"The journal holds {size}, within its effective cap",
"large":"The journal holds {size} on disk",
"nearCap":"The journal holds {size} and is at {percent}% of its effective cap",
"capUnknown":"The journal holds {size}; its effective cap could not be determined",
"evaluationFailed":"The check could not be evaluated"
}
},
"swap_configured":{
"title":"Swap",
"rationale":"Active swap areas from `swapon` and their total against host memory. No ratio to memory is required by anything; memory pressure is measured elsewhere.",
"summary":{
"active":"{size} of swap is active",
"none":"No swap area is active",
"evaluationFailed":"The check could not be evaluated"
}
},
"filesystem_capacity":{
"title":"Host filesystem capacity",
"rationale":"Space and inodes on the filesystems the host itself needs: the root filesystem, /var, /var/log and the local storage path. A filesystem with free space and no inodes left fails the same way as a full one.",
"summary":{
"withinLimits":"The {total} host filesystems are within their review thresholds",
"pressure":"{count} readings are at or above their review threshold",
"evaluationFailed":"Filesystem usage could not be read"
}
},
"update_chain":{
"title":"APT package index age",
"rationale":"When APT last placed a package index on this host. A repository that answers \"not modified\" leaves its index untouched. Repository reachability is not tested.",
"summary":{
"current":"Package indexes were refreshed {days} day(s) ago",
"stale":"Package indexes were last refreshed {days} day(s) ago",
"indexAgeUnknown":"The age of the package indexes could not be determined"
}
},
"notification_delivery":{
"title":"Latest notification outcome",
"rationale":"Enabled channels and their latest retained delivery result. No history means delivery is unverified; an earlier failure followed by a success is not a current failure. No test notification is sent.",
"summary":{
"delivering":"The latest recorded delivery succeeded for all {total} enabled channels",
"failing":"{count} of {total} enabled channels have a configuration problem or a failed latest delivery",
"noChannels":"No notification channel is enabled",
"evaluationFailed":"The delivery history could not be read"
}
},
"cluster_quorum":{
"title":"Cluster quorum",
"rationale":"Quorum as the cluster reports it, the configured nodes against those currently seen, and the number of corosync links declared. Links are read from the configuration, not probed.",
"summary":{
"standalone":"This node is not a member of a cluster",
"quorate":"The cluster is quorate with {total} configured node(s) over {links} corosync link(s)",
"attention":"{count} finding(s) across {total} configured node(s)",
"evaluationFailed":"Cluster status could not be read"
}
},
"boot_loader":{
"title":"Boot loader",
"rationale":"The EFI system partitions proxmox-boot-tool reports and the kernels each one carries. No partition is mounted and no boot is attempted.",
"summary":{
"synchronised":"The {total} boot partitions carry the same kernels",
"attention":"{count} of {total} boot partitions need review",
"evaluationFailed":"The check could not be evaluated"
}
},
"failed_units":{
"title":"Essential services and failed units",
"rationale":"Units systemd has given up on after exhausting its restarts, and the services Proxmox needs to answer at all, read by name because an inactive service is not always a failed one. What each unit does is not interpreted here.",
"summary":{
"allRunning":"The {total} essential services are active and no unit has failed",
"attention":"{count} finding(s) among the units",
"evaluationFailed":"The check could not be evaluated"
}
},
"ha_state":{
"title":"High availability",
"rationale":"The HA master, each node's resource manager and the state of every managed service, from `ha-manager status`. Quorum is reported by the cluster check. No service is started, stopped or migrated.",
"summary":{
"managed":"The {total} managed services are in a settled state across {nodes} node(s)",
"attention":"{count} finding(s) across {total} managed service(s)",
"evaluationFailed":"The check could not be evaluated"
"rationale":"The `unprivileged` setting of each container configuration. Its absence means the container shares the host user namespace, which some workloads require.",
"missingAgent":"{count} of {total} virtual machines do not declare the guest agent",
"evaluationFailed":"The check could not be evaluated"
}
},
"autostart":{
"title":"Automatic start",
"rationale":"The `onboot` setting of each guest, excluding templates and guests managed by HA. Whether a guest is expected to come back by itself comes from the declared policy.",
"summary":{
"allAutostart":"All {total} guests start with the host",
"notAutostart":"{count} of {total} guests do not start with the host",
"evaluationFailed":"The check could not be evaluated"
}
},
"stuck_snapshots":{
"title":"Snapshot state",
"rationale":"Snapshot state, age and active tasks. A recent or undated operation is not treated as interrupted.",
"summary":{
"noSnapshots":"No guest holds snapshots",
"allComplete":"The {total} snapshot(s) are complete",
"stuck":"{count} of {total} snapshot(s) were left mid-operation",
"evaluationFailed":"The check could not be evaluated"
}
},
"cpu_host_type":{
"title":"Virtual CPU model",
"rationale":"The `cpu` value of each virtual machine. `host` exposes the physical processor's feature set, which constrains the nodes the guest can migrate to. Incompatibility with a particular destination is not read here.",
"summary":{
"none":"None of the {total} virtual machines is pinned to the host processor",
"pinned":"{count} of {total} virtual machines are pinned to the host processor",
"evaluationFailed":"The check could not be evaluated"
}
},
"replication_state":{
"title":"Replication",
"rationale":"Replication jobs from the API: failure count, last error, last synchronisation and the calendar each job declares. Paused jobs are reported as such.",
"summary":{
"healthy":"The {total} replication job(s) report no error",
"failing":"{count} of {total} replication job(s) report an error",
"statusUnavailable":"Replication jobs are defined but their status could not be read",
"evaluationFailed":"The check could not be evaluated"
"rationale":"The `enable` option in the datacenter firewall and in the node's own, and how many rules are written. Proxmox applies the node's rules only while the datacenter switch is on. These options do not say what any rule filters.",
"nodeOff":"The firewall is enabled at datacenter level but not on this node",
"evaluationFailed":"The check could not be evaluated"
}
},
"lynis_warnings":{
"title":"Lynis warnings",
"rationale":"Warnings from the last Lynis audit, each with its test identifier, and how old that audit is. An audit is run only where Lynis is installed and no complete report exists. Suggestions are not included.",
"summary":{
"none":"The last Lynis audit recorded no warnings",
"found":"The last Lynis audit recorded {count} warning(s)",
"incomplete":"The Lynis report is incomplete",
"evaluationFailed":"The check could not be evaluated",
"noneStale":"The last Lynis audit recorded no warnings, and its report is {days} day(s) old",
"foundStale":"The last Lynis audit recorded {count} warning(s), and its report is {days} day(s) old"
}
},
"certificate_expiry":{
"title":"Certificate validity",
"rationale":"The expiry date of the certificate pveproxy serves from /etc/pve/local. A custom certificate takes precedence over the one Proxmox generates.",
"summary":{
"valid":"The certificate is valid for {days} more day(s)",
"expiring":"The certificate expires in {days} day(s)",
"evaluationFailed":"The check could not be evaluated"
}
},
"ssh_root_login":{
"title":"SSH root access",
"rationale":"PermitRootLogin in the effective `sshd -T` configuration, with the authentication methods it combines with. Proxmox ships `yes`, which accepts a password.",
"summary":{
"password":"Root may sign in over SSH with a password",
"keyOnly":"Root may sign in over SSH with a key only",
"denied":"Root may not sign in over SSH",
"evaluationFailed":"The check could not be evaluated"
"rationale":"Guest volumes on local storage against the references in current, pending and snapshot configurations. Backups, ISOs and templates are outside the comparison. An unreferenced volume is a candidate for review.",
"found":"{count} volume(s) have no reference in the inspected configurations",
"evaluationFailed":"The check could not be evaluated"
}
},
"zfs_arc_max":{
"title":"ZFS ARC limit",
"rationale":"Effective c_min, c_max and ARC size, the loaded module parameter and the persistent settings in /etc/modprobe.d. A configured value of zero selects the module default; the ARC is a ceiling, and the memory under it is reclaimable.",
"summary":{
"bounded":"The ARC limit is {percent}% of host memory, and the memory under it is reclaimable",
"high":"The ARC may use {percent}% of host memory",
"unset":"The ARC has no explicit limit set",
"conflicting":"{count} ARC settings do not agree with each other",
"pending":"A persistent ARC setting differs from the value the running module carries",
"evaluationFailed":"The check could not be evaluated"
}
},
"zfs_scrub_age":{
"title":"ZFS scrub",
"rationale":"The last completed scrub recorded by `zpool status` for each pool. A resilver is not a scrub. A pool created recently has not had time for one.",
"summary":{
"recent":"The {total} pool(s) were scrubbed within the last 35 days",
"overdue":"{count} of {total} pool(s) have not been scrubbed in 35 days",
"neverScrubbed":"{count} pool(s) record no scrub",
"evaluationFailed":"The check could not be evaluated"
}
},
"thin_pool_overprovisioning":{
"title":"Thin pool allocation",
"rationale":"Virtual capacity handed out by each LVM thin pool against the pool's own size, and how much of the pool its volumes have actually written, data and metadata separately.",
"summary":{
"withinRatio":"The {total} thin pools are below the applied review thresholds",
"aboveRatio":"{count} of {total} thin pools hand out more capacity than they hold",
"pressure":"{pressure} of {total} thin pools are close to filling their data or metadata",
"evaluationFailed":"The check could not be evaluated"
}
},
"connected_storage":{
"title":"Connected storage",
"rationale":"Availability as PVE reports it, known capacity and current dependencies of every storage enabled on this node. Remote internals are not probed and write access is not tested. Capacity is reported where PVE knows it and left blank where it does not.",
"summary":{
"available":"PVE reports all {total} storage(s) available; remote internals and write access were not tested",
"attention":"{count} of {total} storage(s) need review",
"evaluationFailed":"The check could not be evaluated"
}
},
"pool_integrity":{
"title":"Pool integrity and redundancy",
"rationale":"The state of each ZFS pool and the read, write and checksum counters of its devices. Counters are cumulative since the last `zpool clear`.",
"summary":{
"healthy":"All {total} pools are online with no device errors recorded",
"degraded":"{count} findings across {total} pools",
"evaluationFailed":"Pool state could not be read"
}
},
"ceph_health":{
"title":"Ceph health",
"rationale":"Ceph's own health status and the checks it named. Its tests are not reimplemented and no pool, placement group or OSD is queried separately.",
"summary":{
"healthy":"Ceph reports HEALTH_OK",
"degraded":"Ceph reports {state}, with {count} named check(s)",
"evaluationFailed":"The check could not be evaluated"
}
},
"array_integrity":{
"title":"Software RAID and multipath",
"rationale":"mdadm arrays and multipath maps, read from /proc/mdstat and, where the tool is installed, `multipath -ll`. ZFS pools are reported by their own check.",
"summary":{
"intact":"The {total} arrays and maps hold their redundancy",
"degraded":"{count} of {total} arrays or maps are short of it",
"evaluationFailed":"The check could not be evaluated"
}
}
},
"hardware":{
"disk_service_life":{
"title":"Disk service life",
"rationale":"Powered-on hours and remaining wear from the Monitor's SMART readings, with the date of each reading. Age is planning information; media errors and device warnings are reported by the health monitor.",
"summary":{
"withinLife":"The {total} disk readings are within the five-year planning threshold",
"pastLife":"{count} of {total} disk readings are past five years of service",
"noReadings":"No disk reported usable SMART counters ({skipped} without readings)",
"evaluationFailed":"The check could not be evaluated"
}
},
"disk_errors":{
"title":"Disk errors",
"rationale":"Errors detected on the disks and recorded by the health monitor.",
"summary":{
"recorded":"{count} of {total} disks with a record have events noted",
"noEvents":"No disk event left to grade: none recorded, or every one dismissed"
}
}
},
"network":{
"bond_members":{
"title":"Bond members",
"rationale":"The MII status of each bond member from /proc/net/bonding, and how many links remain. In active-backup a standby member reports as up and carries no traffic.",
"summary":{
"allUp":"All members of the {total} bond(s) are up",
"membersDown":"{count} bond member(s) are not up",
"evaluationFailed":"The check could not be evaluated"
}
},
"bridge_without_ports":{
"title":"Bridge ports",
"rationale":"The port configuration of each bridge. A bridge without a physical port carries an internal or routed network.",
"summary":{
"allConnected":"The {total} bridge(s) carry a port",
"isolated":"{count} of {total} bridge(s) carry no port",
"evaluationFailed":"The check could not be evaluated"
"noBackupDetail":"No enabled backup job selects this guest.",
"applications":"Applications",
"versionUnknown":"version not detected",
"passthroughTitle":"PCI passthrough",
"iommuGroup":"IOMMU group {group}",
"sharedGroup":"{count} more device(s) in the same group",
"proxmenux":"ProxMenux optimizations",
"latency":"Network latency",
"subscriptionStatus":{
"notfound":"No subscription found",
"active":"Active",
"invalid":"Invalid",
"expired":"Expired",
"suspended":"Suspended",
"new":"Pending activation",
"unknown":"Unknown"
}
},
"profile":{
"label":"Report",
"full":"Full audit",
"inventory":"Inventory",
"security":"Security review",
"backup":"Backup assurance",
"capacity":"Capacity and wear",
"diagnostic":"Quick diagnosis"
},
"document":{
"action":"Generate report",
"title":"Audit Report",
"subtitle":"Structure, configuration and assessment of {node}",
"generated":"Generated",
"assessed":"Assessed",
"runId":"Assessment reference",
"print":"Print or save as PDF",
"summaryByArea":"Summary by area",
"area":"Area",
"inventoryAnnex":"Inventory annex",
"scopeTitle":"Scope of this report",
"scopeBody":"This report describes the Proxmox VE node named above, as observed from the node itself at the time stated. It does not cover the interior of the guests beyond what they declare, network equipment outside the host, physical infrastructure, or any dependency not visible from this node. Findings marked as not determined were not measured and are not evidence of absence.",
"building":"Composing the report…",
"node":"Node",
"profile":"Profile",
"unknownNode":"unidentified node",
"executiveSummary":"Assessment summary",
"assessment":"Assessment",
"verdictHeading":"Result of this run",
"verdict":{
"critical":"ATTENTION",
"warning":"REVIEW",
"conformant":"IN ORDER"
},
"verdictText":{
"critical":"{fail} checks report a failed condition and {warn} report a condition to review, out of {total} evaluated.",
"warning":"No check reports a failed condition. {warn} of {total} report a condition to review.",
"conformant":"The {total} checks in this profile complete without a failed or reviewable condition.",
"none":"This profile runs no checks. The document describes the node without assessing it."
},
"runAt":"Run on {date}",
"chartNote":"Checks by area and result.",
"nodeIdentity":"Node identity",
"system":"System",
"cluster":"Cluster",
"standaloneNote":"This node is not part of a cluster: it holds its own configuration and its guests do not migrate to another node.",
"clusterDiagramNote":"Configured nodes and the corosync links that join them.",
"thisNode":"this node",
"unreachable":"not seen",
"member":"member",
"corosyncLinks":"links",
"quorum":"Quorum",
"quorate":"with quorum",
"inquorate":"without quorum",
"votes":"Votes",
"nodeName":"Node",
"architecture":"System architecture",
"architectureNote":"How the node is assembled: processor and memory on the board, and what hangs off each controller.",
"systemIdentity":"System identity",
"board":"Board",
"processor":"Processor",
"topology":"Sockets × cores / threads",
"memory":"Memory",
"cores":"cores",
"threads":"threads",
"memoryModules":"Memory modules",
"slot":"Slot",
"slotsUsed":"slots used",
"slotsFilled":"{used} of {total} slots populated",
"emptySlot":"empty",
"formFactor":"Format",
"speed":"Speed",
"manufacturer":"Manufacturer",
"product":"Model",
"serial":"Serial",
"controllers":"Controllers",
"class":"Class",
"device":"Device",
"iommuGroups":"IOMMU groups",
"iommuGroup":"IOMMU group",
"field":"Field",
"value":"Value",
"size":"Size",
"type":"Type",
"storageDevices":"Storage devices",
"disks":"Disks",
"model":"Model",
"bus":"Bus",
"serviceLife":"Service life",
"healthy":"healthy",
"years":"{years} years",
"events":"Events",
"observations":"Observations",
"observationsNote":"Recorded events. SMART reports the present state; this log reports what happened, including events the disk recovered from.",
"noObservations":"No events recorded",
"noObservationsNote":"No disk has recorded an error since the Monitor began observing them.",
"event":"Event",
"severity":"Severity",
"occurrences":"Occurrences",
"firstSeen":"First seen",
"lastSeen":"Last seen",
"detail":"Detail",
"network":"Network",
"adapters":"Adapters",
"bond":"Bond",
"bridge":"Bridge",
"bridges":"Bridges",
"physicalAdapters":"Physical adapters",
"interface":"Interface",
"driver":"Driver",
"state":"State",
"networkDiagramNote":"Path from the wire to each guest: physical adapter, bond where one groups them, bridge and attached guests.",
"storageAndProtection":"Storage and protection",
"storage":"Storage",
"content":"Content",
"shared":"Shared",
"location":"Location",
"backupDestination":"Backup destination",
"unprotected":"unprotected",
"storageDiagramNote":"Where guest disks live and which destination backs them up.",
"unprotectedGuests":"{count} guests with no backup job",
"allProtected":"Every guest is covered by a backup job",
"allProtectedNote":"Coverage says a job selects the guest; the backup results are assessed separately.",
"vmid":"VMID",
"name":"Name",
"kind":"Kind",
"backup":"Backup",
"none":"none",
"managedSoftware":"Software managed by ProxMenux",
"version":"Version",
"source":"Source",
"current":"up to date",
"updateAvailable":"update to {version}",
"findings":"Findings in detail",
"incomplete":"partial",
"scope":"Scope of this report",
"scopeText":"This document reports the {profile} profile on the node named in the header, at the moment of the run.",
"scopeLocal":"It covers this node only. Guests on other nodes and their configuration are outside it.",
"scopeReadOnly":"Every check reads configuration and state that already exists; none modifies the host.",
"scopeMoment":"It describes the state at the time of the run, not a period of time.",
"notRead":"Sources that could not be read:",
"uplink":"Uplink",
"conformance":"{pass} of {total} conformant",
"latency":"Network latency",
"latencyNote":"Latency measured over the reported window, one line per target.",
"milliseconds":"ms",
"hours":"h",
"minimum":"Minimum",
"average":"Average",
"maximum":"Maximum",
"packetLoss":"Packet loss",
"samples":"Samples",
"target":{
"label":"Target",
"gateway":"Gateway",
"cloudflare":"Cloudflare (1.1.1.1)",
"google":"Google (8.8.8.8)"
},
"actionShort":"Report",
"policyDeclared":"It was judged against a declared policy: {guests} guests, {storages} storages and {thresholds} thresholds stated.",
"policyNone":"No policy was declared, so an absence this report could not interpret is stated as an observation and never as a warning.",
"diagnosticTitle":"Quick diagnosis",
"diagnosticSubtitle":"Critical results and warnings on {node}",
"diagnosticActing":"{count} critical result(s) and warning(s).",
"diagnosticClear":"No critical result and no warning. Observations and conformant results are in the full audit.",
"diagnosticUnread":"Readings that could not be taken",
"diagnosticMoreRows":"{count} further row(s), in the full audit.",
"intro":"An assessment sees what this host does, not what it is for. What is declared here is what turns an observation into a warning, or takes it out of the count. Nothing is required: with no declaration the report describes rather than judges.",
"loading":"Reading the declaration…",
"failed":"The declaration could not be read",
"saved":"Saved",
"declaredCount":"{count} declarations",
"guestsNote":"Required reports what is missing as a warning; unspecified reports it as an observation; not required leaves it out of the count.",
"storagesNote":"An unreachable storage is critical where it is declared essential or serves a running guest, a warning where its role is not declared, and an observation where it is declared optional.",
"thresholds":"Thresholds",
"thresholdsNote":"Empty means the shipped value, shown as the placeholder.",
"notApplicableScope":"Nothing in the inspected scope this check applies to.",
"lynis":{
"title":"Run Lynis",
"bodyNotRun":"Lynis is installed but has not been run yet. Running it now completes the security review, but the process can take a few minutes.",
"bodyStale":"The Lynis report is {days} days old. You can run it now to refresh the data (it takes a little longer) or continue with the existing report.",