ProxMenux 1.2.6.2-beta: OCI containers in the Monitor, docs and fixes

OCI manager Apps
- App tab: containers installed from an OCI image are identified from their
  installation record; the application and image versions are shown and an
  update is detected by image digest; repository link; Refresh data.
- Updates tab for OCI containers: Update and Recreate run the same flow as the
  OCI menu in the Monitor terminal; the pre-update backup can be kept in a
  backup storage; scheduled image updates with an optional minimum age.
- Logs tab: console output of the application, kept on the host
  (lxc.console.logfile + logrotate) and followed live.
- The Proxmox console opens a shell (cmode: shell) when the image has one.
- A damaged image download is fetched again before failing.
- Multi-container applications open at their LAN address; volume mount
  points on block storage report their usage.

Monitor
- Proxmox notifications are delivered to a loopback-only HTTP listener when
  HTTPS is enabled, so they no longer fail certificate verification.
- Log persistence counts recurring patterns only; an ended burst is not
  reported as persistent and its warning clears on its own (#386).
- Proxmox notification config backups are deduplicated and capped at three.
- The update icon on the Apps page opens the container on its Updates tab.
- Version 1.2.6.2-beta and its release notes in every Monitor language.

Docs
- OCI manager Apps and Audit & Report rebuilt as per-page message files,
  with a new page for OCI containers in the Monitor.
- Seven pages fixed where rich-text tags were missing from t.rich.

Translations
- Spanish fixes across the OCI engine, the Monitor and the TUI menus.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
MacRimi
2026-09-25 21:51:12 +02:00
co-authored by Claude Opus 5.5
parent 386d33df6e
commit 4437a671d2
524 changed files with 14459 additions and 3841 deletions
@@ -288,7 +288,7 @@ export default async function GpuVmPassthroughPage({
<p className="mb-3 text-gray-800">{t("walkthrough.switchMode.intro")}</p>
<ul className="list-disc pl-6 space-y-1 text-gray-800 mb-3">
{switchModeItems.map((_, idx) => (
<li key={idx}>{t.rich(`walkthrough.switchMode.items.${idx}`, { strong, code })}</li>
<li key={idx}>{t.rich(`walkthrough.switchMode.items.${idx}`, { strong, code, em })}</li>
))}
</ul>
<Image
@@ -333,7 +333,7 @@ export default async function GpuVmPassthroughPage({
<p className="mb-3 text-gray-800">{t("walkthrough.hostApply.intro")}</p>
<ul className="list-disc pl-6 space-y-1 text-gray-800 mb-3">
{hostApplyItems.map((_, idx) => (
<li key={idx}>{t.rich(`walkthrough.hostApply.items.${idx}`, { strong, code })}</li>
<li key={idx}>{t.rich(`walkthrough.hostApply.items.${idx}`, { strong, code, em })}</li>
))}
</ul>
</Steps.Step>
@@ -249,7 +249,7 @@ export default async function NvidiaHostPage({
</Steps.Step>
<Steps.Step title={t("walkthrough.version.title")}>
<p className="mb-3 text-gray-800">{t.rich("walkthrough.version.body1", { strong, em })}</p>
<p className="mb-3 text-gray-800">{t.rich("walkthrough.version.body1", { strong, em, code })}</p>
<p className="mb-3 text-gray-800">{t("walkthrough.version.body2")}</p>
<Callout variant="tip" title={t("walkthrough.version.whyTitle")}>
@@ -312,7 +312,7 @@ sh NVIDIA-Linux-x86_64-<version>.run \\
<Steps.Step title={t("walkthrough.propagate.title")}>
<p className="mb-3 text-gray-800">{t.rich("walkthrough.propagate.body1", { code, strong })}</p>
<p className="mb-3 text-gray-800">{t.rich("walkthrough.propagate.body2", { code })}</p>
<p className="mb-3 text-gray-800">{t.rich("walkthrough.propagate.body2", { code, strong })}</p>
<Image
src="/gpu-tpu/nvidia-host-05-lxc-update.png"
alt={t("walkthrough.propagate.imageAlt")}
@@ -353,7 +353,7 @@ sh NVIDIA-Linux-x86_64-<version>.run \\
<p className="mb-4 text-gray-800 leading-relaxed">{t("reinstallUninstall.uninstallIntro")}</p>
<ul className="list-disc pl-6 mb-4 text-gray-800 leading-relaxed space-y-1">
{uninstallItems.map((_, idx) => (
<li key={idx}>{t.rich(`reinstallUninstall.uninstallItems.${idx}`, { code })}</li>
<li key={idx}>{t.rich(`reinstallUninstall.uninstallItems.${idx}`, { code, em })}</li>
))}
</ul>
@@ -119,7 +119,7 @@ export default async function SwitchGpuModePage({
items={[
{ label: <>{t.rich("prereqs.assigned", { strong })}</> },
{
label: <>{t.rich("prereqs.iommu", { strong, em })}</>,
label: <>{t.rich("prereqs.iommu", { strong, em, code })}</>,
check: t("prereqs.iommuCheck"),
},
{ label: <>{t.rich("prereqs.reboot", { strong })}</> },