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
+6 -6
View File
@@ -93,11 +93,11 @@ class GitHubSource:
remaining = exc.headers.get("X-RateLimit-Remaining")
if exc.code == 403 and remaining == "0":
raise SourceError(
f"GitHub devolvio HTTP 403 para {url}. "
"Define GITHUB_TOKEN para ampliar el limite de la API."
f"GitHub returned HTTP 403 for {url}. "
"Set GITHUB_TOKEN to raise the API rate limit."
) from exc
if exc.code not in {429, 500, 502, 503, 504}:
raise SourceError(f"GitHub devolvio HTTP {exc.code} para {url}.") from exc
raise SourceError(f"GitHub returned HTTP {exc.code} para {url}.") from exc
except (urllib.error.URLError, TimeoutError) as exc:
last_error = exc
if attempt < 2:
@@ -142,7 +142,7 @@ class GitHubSource:
def proxmenux_app_metadata(self) -> dict[str, dict[str, Any]]:
payload = self.get_json(PROXMENUX_HELPERS_URL)
if not isinstance(payload, list):
raise SourceError("El catalogo de aplicaciones de ProxMenux no es una lista")
raise SourceError("The ProxMenux application catalogue is not a list")
result: dict[str, dict[str, Any]] = {}
for item in payload:
if not isinstance(item, dict) or not item.get("slug"):
@@ -160,7 +160,7 @@ class GitHubSource:
revision = str(commit["sha"])
tree = self.get_json(f"/repos/{CASAOS_REPOSITORY}/git/trees/{revision}?recursive=1")
if tree.get("truncated"):
raise SourceError("GitHub devolvio truncado el arbol del catalogo CasaOS")
raise SourceError("GitHub returned a truncated tree for the CasaOS catalogue")
paths = sorted(
str(item["path"])
for item in tree.get("tree", [])
@@ -168,7 +168,7 @@ class GitHubSource:
and re.fullmatch(r"Apps/[^/]+/docker-compose\.yml", str(item.get("path", "")))
)
if not paths:
raise SourceError("No se encontraron Compose en el catalogo CasaOS")
raise SourceError("No Compose files were found in the CasaOS catalogue")
return {
"repository": CASAOS_REPOSITORY_URL,
"revision": revision,