overhaul app tracking and update orchestration

- Generate and ship a verified 389-app tracking catalog with 23 runtime overrides, fallback detectors, ports, logos, and Docker Hub tag previews.
- Support modern Proxmox VE Helper-Scripts markers, historical installations, and official or manual app deployments.
- Rework the LXC App and Updates tabs with cached suggestions, explicit discovery, version tracking, web links, custom updaters, and complete i18n.
- Add independent OS, app, Docker Engine, Docker image, bulk, and scheduled update targets.
- Add digest-based Docker inventory, Compose dependency grouping, safe standalone-container recreation with rollback, and package-scoped Docker Engine updates.
- Refresh per-LXC caches after lifecycle and update tasks, then emit idempotent notifications based on the verified final state.
- Harden Coral USB recovery by removing orphaned gasket DKMS registrations and validating that dpkg is healthy before reporting success.
This commit is contained in:
MacRimi
2026-08-23 12:43:03 +02:00
parent 7244201810
commit 0251f77331
27 changed files with 11631 additions and 893 deletions
+107 -8
View File
@@ -1163,7 +1163,15 @@
"targetBoth": "Betriebssystem + Anwendung",
"lastRun": "Letzte Ausführung: {date}",
"runSuccess": "✓ Erfolg",
"runPartial": "teilweise abgeschlossen",
"runFailed": "✗ fehlgeschlagen",
"runDeferred": "zur Sicherheit zurückgestellt",
"runSkipped": "nichts ausstehend",
"releaseDelaySummary": "{days} Tag(e) Freigabesperre",
"releaseDelayLabel": "Nach neuer App-Version warten",
"releaseDelayNone": "Keine Wartezeit",
"releaseDelayDays": "{days} Tag(e) warten",
"releaseDelayHelp": "Gilt nur für ausgewählte Apps mit Versionsüberwachung. Deren ausstehende Versionen müssen dieses Alter erreicht haben; Apps ohne Versionsüberwachung führen ihren Updater bei jedem Zeitplan aus.",
"notScheduled": "Nicht geplant",
"frequency": "Frequenz",
"cronExpression": "Cron-Ausdruck",
@@ -1172,6 +1180,11 @@
"targetOptionOs": "Nur Betriebssystempakete",
"targetOptionApp": "Nur Bewerbung",
"targetOptionBoth": "Betriebssystem + Anwendung",
"dockerComposeTarget": "Docker Compose · {project}",
"dockerContainerTarget": "Docker-Container · {container}",
"dockerEngineTarget": "Docker Engine",
"noTargets": "Keine Ziele ausgewählt",
"selectAtLeastOne": "Wählen Sie mindestens ein Aktualisierungsziel aus.",
"deleteButton": "Zeitplan löschen",
"deleteConfirm": "Geplante Updates für diesen Container entfernen? Die Standardeinstellungen (Sicherung + Neustart) werden beibehalten."
},
@@ -1217,7 +1230,7 @@
"osPlusApp": "Betriebssystem + {appName}-Updates",
"osPlusApps": "Betriebssystem- und Apps-Updates",
"noUpdateMethodTitle": "Keine Aktualisierungsmethode verfügbar",
"noUpdateMethodBody": "Keine Aktualisierungsmethode verfügbar. Aktualisieren Sie über die App selbst oder legen Sie einen benutzerdefinierten Befehl auf der Registerkarte „App“ fest.",
"noUpdateMethodBody": "Für diese Anwendung wurde keine Aktualisierungsmethode erkannt. Fügen Sie einen benutzerdefinierten Aktualisierungsbefehl hinzu.",
"ociImmutableTitle": "OCI-Image-Container",
"ociImmutableBody": "Betriebssystempakete werden zum Zeitpunkt der Image-Erstellung integriert und können nicht direkt aktualisiert werden. Wenden Sie Updates manuell an oder installieren Sie sie mit einem neueren Image neu.",
"hideNoticeButton": "Diesen Hinweis für diese App ausblenden",
@@ -1230,6 +1243,7 @@
"applicationDefaultName": "Anwendung",
"installedLabel": "installiert",
"upToDateAtLabel": "Aktuell unter",
"versionLabel": "Version {version}",
"versionTrackingPending": "Versionsverfolgung ausstehend bei der nächsten geplanten Prüfung werden die installierte und die verfügbare Version angezeigt.",
"customCommandTitle": "Benutzerdefinierter Update-Befehl",
"customCommandBody": "Führen Sie einen benutzerdefinierten Shell-Befehl aus, um diese App im Container zu aktualisieren.",
@@ -1238,6 +1252,7 @@
"hideNoticeAction": "Diesen Hinweis für {appName} ausblenden",
"detectedByPrefix": "Erkannt von",
"editApp": "Bearbeiten",
"configureUpdater": "Konfigurieren",
"alsoDetectedTitle": "Außerdem in diesem Container entdeckt:",
"detectedInline": "· erkannt von {method}",
"customCommandLabel": "Benutzerdefinierter Update-Befehl",
@@ -1245,9 +1260,9 @@
"removeButton": "Entfernen",
"cancelButton": "Stornieren",
"saveButton": "Speichern",
"editCommandButton": "Befehl bearbeiten",
"wireUpCommandButton": "Fügen Sie einen benutzerdefinierten Aktualisierungsbefehl hinzu",
"versionTrackingPendingShort": "Versionsverfolgung steht aus.",
"versionTrackingNotConfigured": "Die Versionsüberwachung ist nicht konfiguriert.",
"managedByOsPackages": "Diese Anwendung wird über die Aktion für Betriebssystempakete aktualisiert.",
"noMethodBody": "Keine Aktualisierungsmethode verfügbar. Aktualisieren Sie über die App selbst oder verknüpfen Sie einen benutzerdefinierten Befehl, den ProxMenux im Container ausführt.",
"noMethodHideBody": "Für diese App ist keine Update-Methode registriert. Legen Sie eine auf der Registerkarte „App“ fest oder schließen Sie diesen Hinweis.",
"hideForApp": "Hinweis für {appName} ausblenden",
@@ -1266,15 +1281,59 @@
"noManagedUpdateInfo": "Noch keine Update-Informationen prüfen Sie unter Sicherheit → Secure Gateway.",
"ociTitle": "OCI-Image-Container",
"ociBody": "Dieser Container wurde aus einem OCI-Image (Docker) erstellt. Die Updateverwaltung für OCI-Container wird mit der kommenden OCI-Installationsfunktion geliefert Updates erstellen den Container anhand eines neueren Image-Tags neu, anstatt Pakete darin zu patchen.",
"helperNotUpdateable": "Die Community-Scripts-Registrierung markiert diese App als nicht aktualisierbar.",
"helperDetectedTitle": "Es wurde ein Hilfsskript-Updater erkannt",
"helperDetectedBody": "Die manuelle Anwendung ist am sichersten.",
"dockerImagesTitle": "Docker-Images",
"dockerAppTitle": "Docker",
"dockerImagesSubheading": "Images",
"dockerImagesReadOnly": "Image-Tags werden anhand des Registry-Digests verglichen. Compose-Dienste können aus ihrem deklarierten Projekt geladen und neu erstellt werden.",
"dockerEngineManagedByOs": "Docker Engine {version} wird über Pakete verwaltet und durch die obige Betriebssystem-Paketaktion aktualisiert.",
"dockerEngineSubheading": "Engine",
"dockerEngineDetected": "Docker Engine {version} erkannt",
"dockerEngineUpdateHelp": "Aktualisiert nur die installierten Docker-Pakete und erforderlichen Abhängigkeiten. Andere Betriebssystempakete und Container bleiben unverändert.",
"updateDockerEngineOnly": "Docker Engine aktualisieren",
"adguardWebUpdateOnly": "Diese AdGuard-Home-Installation wird über die eigene Weboberfläche aktualisiert.",
"openAdguard": "AdGuard Home öffnen",
"updateDockerImage": "Image aktualisieren",
"recreateStandaloneContainer": "{container} aktualisieren",
"standaloneRecreatePending": "Eigenständige Container benötigen eine geschützte Neuerstellung: {names}",
"noDockerImages": "Docker ist installiert, aber es wurden keine getaggten Images gefunden.",
"dockerInventoryStarting": "Warten, bis Docker vollständig gestartet ist…",
"dockerInventoryUnavailable": "Das Docker-Inventar konnte nicht gelesen werden. Prüfen Sie es erneut, sobald Docker verfügbar ist.",
"usedByContainers": "Verwendet von: {names}",
"imageUpdateAvailable": "Neues Image verfügbar",
"imageUpToDate": "Aktuell",
"imageInstalledTag": "installierter Tag",
"imageDigestUnknown": "Digest nicht verfügbar",
"dockerPendingSummary": "{count} Docker-Image-Update(s) erkannt. Aktualisiere sie mit dem zugehörigen Docker- oder Compose-Workflow.",
"postApplyChecking": "Aktualisierungsergebnis wird überprüft…",
"postApplyAllOk": "{count} Paket(e) erfolgreich angewendet nichts ausstehend.",
"postApplyNothingPending": "Nichts ausstehend alles ist auf dem neuesten Stand.",
"postApplyPartial": "{pending} Paket(e) stehen nach der Ausführung noch aus.",
"postApplyPartialSubline": "{applied} angewendet.Einige Aktualisierungen wurden nicht abgeschlossen sehen Sie sich die Terminalausgabe oben an."
},
"bulkUpdate": {
"title": "Sammelaktualisierung",
"description": "Konfiguriert eine Aktion für das Betriebssystem und die ausgewählten Aktualisierungsmethoden dieses Containers.",
"loading": "Konfiguration wird geladen…",
"notConfigured": "Nicht konfiguriert.",
"configure": "Konfigurieren",
"edit": "Bearbeiten",
"apply": "Aktualisierungen anwenden",
"osTarget": "Betriebssystem",
"osRequired": "Für eine Sammelaktualisierung erforderlich.",
"includesDependencies": "Enthält auch deklarierte Abhängigkeiten: {names}",
"noMethod": "Keine ausführbare Aktualisierungsmethode verfügbar.",
"staleTarget": "Diese Auswahl ist nicht mehr verfügbar. Entfernen Sie sie vor dem Speichern.",
"dockerInventoryPending": "Warten auf das Docker-Image-Inventar…",
"missingDockerTarget": "Docker-Image nicht verfügbar",
"selectAtLeastOne": "Wählen Sie zusätzlich zum Betriebssystem mindestens ein Aktualisierungsziel.",
"cancel": "Abbrechen",
"save": "Speichern",
"delete": "Konfiguration entfernen",
"deleteConfirm": "Diese Sammelaktualisierungskonfiguration entfernen?",
"saveFailed": "Die Sammelaktualisierungskonfiguration konnte nicht gespeichert werden.",
"deleteFailed": "Die Sammelaktualisierungskonfiguration konnte nicht entfernt werden.",
"planFailed": "Die Sammelaktualisierung konnte nicht vorbereitet werden. Prüfen Sie die nicht verfügbaren Methoden."
},
"appEditor": {
"closePanel": "Panel schließen",
"cancelButton": "Stornieren",
@@ -1284,6 +1343,17 @@
"hiddenBadge": "Derzeit ausgeblendet wird wieder in der Erkennungsliste angezeigt",
"registerDifferent": "Registrieren Sie eine andere App",
"detectedInContainer": "Auf diesem Container erkannt",
"versionDetected": "Version {version} in diesem Container erkannt",
"legacyDetectorUsed": "Mit einem alten Kompatibilitäts-Fallback erkannt",
"dockerImagesTitle": "Docker-Image-Updates",
"dockerImagesHelp": "Prüft jedes lokale Image getrennt von der Docker-Engine anhand unveränderlicher Registry-Digests.",
"refreshDockerImages": "Jetzt prüfen",
"noDockerImages": "Keine getaggten Docker-Images gefunden",
"usedByContainers": "Verwendet von: {names}",
"imageUpdateAvailable": "Neues Image verfügbar",
"imageUpToDate": "Aktuell",
"imageDigestUnknown": "Digest nicht verfügbar",
"dockerReadOnlyNote": "Nur-Lese-Prüfung: Es wird kein Image geladen und kein Container neu gestartet.",
"installedManaged": "Installiert und verwaltet von ProxMenux",
"nameLabel": "Name",
"installedViaLabel": "Installiert über",
@@ -1340,6 +1410,17 @@
"jsonPathPlaceholder": "z. B. data.version oder releases[0].tag_name",
"dockerImageLabel": "Docker Hub-Bild",
"dockerImagePlaceholder": "z. B. linuxserver/plex oder nginx",
"dockerVersionedTagsHelp": "Nur für versionierte Tags. Für latest, stable oder lts die Docker-Image-Updates mit Digest-Vergleich verwenden.",
"dockerPresetSemver": "Nur SemVer",
"dockerPresetSemverSuffix": "SemVer + Suffix",
"dockerTagFilterHelp": "Filtert echte Tags, bevor ProxMenux die höchste Version auswählt.",
"dockerTagPreviewLabel": "Live-Tag-Vorschau",
"dockerTagPreviewCount": "{matched} von {scanned} passend",
"dockerTagPreviewLoading": "Docker Hub wird geprüft…",
"dockerTagPreviewFailed": "Docker-Hub-Tags konnten nicht angezeigt werden",
"dockerTagPreviewEmpty": "Keine echten Tags entsprechen diesem Filter.",
"dockerMovingTag": "beweglicher Tag",
"dockerMovingTagHelp": "Bewegliche Tags enthalten keine Version. Stattdessen über den Digest bei Docker-Image-Updates verfolgen.",
"tagRegexLabel": "Tag-Regex (mit Capture-Gruppe)",
"tagRegexPlaceholder": "z.B. v?(\\d+\\.\\d+\\.\\d+)",
"tagRegexBare": "v?(\\d+\\.\\d+\\.\\d+)",
@@ -1372,7 +1453,14 @@
"registerCustom": "Registrieren Sie eine benutzerdefinierte App",
"noAppsTitle": "Keine Bewerbungen registriert",
"noAppsBody": "Registrieren Sie die Anwendungen in diesem Container, um Weblinks und optional die Verfolgung verfügbarer Versionen mit Benachrichtigungen zu neuen Releases zu erhalten.",
"registerApplication": "Bewerbung registrieren",
"registerApplication": "Anwendung registrieren",
"searchApplications": "Apps suchen",
"searchingApplications": "Apps werden gesucht…",
"noApplicationsDetected": "Keine Apps erkannt.",
"noNewApplicationsDetected": "Keine neuen Apps erkannt.",
"oneNewApplicationDetected": "Eine neue App wurde erkannt.",
"newApplicationsDetected": "{count} neue Apps wurden erkannt.",
"detectionFailed": "App-Suche fehlgeschlagen",
"hiddenSuffix": "{count} ausgeblendet",
"confirmHide": "Die Erkennung „{name}“ dauerhaft in diesem Container ausblenden?\n\nUm es später wiederherzustellen, klicken Sie auf „Andere App registrieren“ die ausgeblendete Liste wird dort mit einer Wiederherstellungsoption angezeigt.",
"saveFailed": "Speichern fehlgeschlagen",
@@ -1383,6 +1471,13 @@
"binaryArgsHintGrafana": "Grafana braucht",
"loadFailed": "Die App-Konfiguration konnte nicht geladen werden",
"checkFailed": "Prüfung fehlgeschlagen",
"testDetectorButton": "Detektor testen",
"testingDetectorButton": "Detektor wird getestet…",
"detectorTestTitle": "Ergebnis des Detektortests",
"detectorTestNotSaved": "Nur Entwurf · nicht gespeichert",
"detectorTestNoVersion": "Keine Version erkannt",
"detectorTestNoUpstream": "Keine Upstream-Quelle konfiguriert",
"detectorTestFailed": "Detektortest fehlgeschlagen",
"deleteFailed": "Das Löschen ist fehlgeschlagen",
"dismissFailed": "Die Erkennung konnte nicht verworfen werden",
"restoreFailed": "Die Erkennung konnte nicht wiederhergestellt werden",
@@ -1399,6 +1494,10 @@
"webLinks": "Weblinks",
"addPort": "Port hinzufügen",
"detectedPorts": "Im Container erkannte Ports klicken Sie zum Hinzufügen:",
"dockerPublishedServicesTitle": "Docker-Dienste mit veröffentlichten Ports",
"dockerPublishedServicesHelp": "Wählen Sie nur Ports aus, die eine Weboberfläche bereitstellen. ProxMenux registriert diese Container nicht als eigenständige LXC-Anwendungen.",
"dockerPublishedAdd": "Link hinzufügen",
"dockerPublishedPort": "Container-Port {containerPort} → {hostPort} im LXC",
"noWebPorts": "Keine Web-Ports lauschen. Verwenden Sie Port hinzufügen, wenn Sie dennoch manuell einen Link erstellen möchten.",
"trackUpstream": "Verfügbare Version verfolgen (optional)",
"trackOff": "Aus nur Link",
@@ -1416,7 +1515,7 @@
"checkButton": "Überprüfen",
"editFieldsButton": "Felder bearbeiten",
"alsoDetectedContainer": "Auch auf diesem Container erkannt",
"addAnotherApplication": "Fügen Sie eine weitere Anwendung hinzu",
"addAnotherApplication": "Weitere Anwendung registrieren",
"doneButton": "Erledigt",
"editButton": "Bearbeiten",
"upstreamErrorTimeout": "Netzwerk-Timeout beim Kontaktieren des Upstreams",