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": "Sistema operativo + applicazione",
"lastRun": "Ultima esecuzione: {date}",
"runSuccess": "✓ successo",
"runPartial": "completato parzialmente",
"runFailed": "✗ fallito",
"runDeferred": "rinviato per sicurezza",
"runSkipped": "nulla in sospeso",
"releaseDelaySummary": "attesa di {days} giorno/i",
"releaseDelayLabel": "Attendi dopo una nuova versione dellapp",
"releaseDelayNone": "Nessun periodo di attesa",
"releaseDelayDays": "Attendi {days} giorno/i",
"releaseDelayHelp": "Si applica solo alle app selezionate con monitoraggio della versione. Le versioni in sospeso devono avere questa età; le app senza monitoraggio eseguono laggiornamento a ogni pianificazione.",
"notScheduled": "Non programmato",
"frequency": "Frequenza",
"cronExpression": "Espressione cron",
@@ -1172,6 +1180,11 @@
"targetOptionOs": "Solo pacchetti del sistema operativo",
"targetOptionApp": "Solo applicazione",
"targetOptionBoth": "Sistema operativo + applicazione",
"dockerComposeTarget": "Docker Compose · {project}",
"dockerContainerTarget": "Container Docker · {container}",
"dockerEngineTarget": "Motore Docker",
"noTargets": "Nessun obiettivo selezionato",
"selectAtLeastOne": "Seleziona almeno un obiettivo di aggiornamento.",
"deleteButton": "Elimina pianificazione",
"deleteConfirm": "Rimuovere gli aggiornamenti pianificati per questo contenitore? Le impostazioni predefinite di applicazione (backup + riavvio) vengono mantenute."
},
@@ -1217,7 +1230,7 @@
"osPlusApp": "Sistema operativo + {appName} aggiornamenti",
"osPlusApps": "Aggiornamenti del sistema operativo e delle app",
"noUpdateMethodTitle": "Nessun metodo di aggiornamento disponibile",
"noUpdateMethodBody": "Nessun metodo di aggiornamento disponibile. Aggiorna dall'app stessa o imposta un comando personalizzato nella scheda App.",
"noUpdateMethodBody": "Non è stato identificato alcun metodo di aggiornamento per questa applicazione. Aggiungi un comando di aggiornamento personalizzato.",
"ociImmutableTitle": "Contenitore di immagini OCI",
"ociImmutableBody": "I pacchetti del sistema operativo vengono integrati in fase di creazione dell'immagine e non possono essere aggiornati sul posto. Applica gli aggiornamenti manualmente o reinstallali con un'immagine più recente.",
"hideNoticeButton": "Nascondi questo avviso per questa app",
@@ -1230,6 +1243,7 @@
"applicationDefaultName": "Applicazione",
"installedLabel": "installato",
"upToDateAtLabel": "Aggiornato a",
"versionLabel": "versione {version}",
"versionTrackingPending": "Monitoraggio versioni in attesa: il prossimo controllo pianificato mostrerà la versione installata e quella disponibile.",
"customCommandTitle": "Comando di aggiornamento personalizzato",
"customCommandBody": "Esegui un comando shell definito dall'utente per aggiornare questa app all'interno del contenitore.",
@@ -1238,6 +1252,7 @@
"hideNoticeAction": "Nascondi questo avviso per {appName}",
"detectedByPrefix": "Rilevato da",
"editApp": "Modificare",
"configureUpdater": "Configura",
"alsoDetectedTitle": "Rilevato anche in questo contenitore:",
"detectedInline": "· rilevato da {method}",
"customCommandLabel": "Comando di aggiornamento personalizzato",
@@ -1245,9 +1260,9 @@
"removeButton": "Rimuovere",
"cancelButton": "Cancellare",
"saveButton": "Salva",
"editCommandButton": "Modifica comando",
"wireUpCommandButton": "Aggiungi comando di aggiornamento personalizzato",
"versionTrackingPendingShort": "Monitoraggio della versione in sospeso.",
"versionTrackingNotConfigured": "Il monitoraggio della versione non è configurato.",
"managedByOsPackages": "Questa applicazione viene aggiornata tramite lazione dei pacchetti del sistema operativo.",
"noMethodBody": "Nessun metodo di aggiornamento disponibile. Aggiorna dall'app stessa o collega un comando personalizzato che ProxMenux eseguirà all'interno del contenitore.",
"noMethodHideBody": "Per questa app non è registrato alcun metodo di aggiornamento. Impostane uno dalla scheda App o ignora questo avviso.",
"hideForApp": "Nascondi avviso per {appName}",
@@ -1266,15 +1281,59 @@
"noManagedUpdateInfo": "Nessuna informazione di aggiornamento ancora: controlla da Sicurezza → Secure Gateway.",
"ociTitle": "Contenitore di immagini OCI",
"ociBody": "Questo contenitore è stato creato da un'immagine OCI (Docker). La gestione degli aggiornamenti per i contenitori OCI arriverà con la prossima funzionalità di installazione OCI: gli aggiornamenti ricostruiranno il contenitore da un tag immagine più recente anziché applicare patch ai pacchetti all'interno.",
"helperNotUpdateable": "Il registro degli script della community contrassegna questa app come non aggiornabile.",
"helperDetectedTitle": "Rilevato un aggiornamento degli script helper",
"helperDetectedBody": "L'applicazione manuale è più sicura.",
"dockerImagesTitle": "Immagini Docker",
"dockerAppTitle": "Docker",
"dockerImagesSubheading": "Immagini",
"dockerImagesReadOnly": "I tag vengono confrontati tramite digest del registro. I servizi Compose possono scaricare limmagine ed essere ricreati dal progetto dichiarato.",
"dockerEngineManagedByOs": "Docker Engine {version} è gestito dai pacchetti e viene aggiornato dallazione dei pacchetti del sistema operativo qui sopra.",
"dockerEngineSubheading": "Motore",
"dockerEngineDetected": "Docker Engine {version} rilevato",
"dockerEngineUpdateHelp": "Aggiorna solo i pacchetti Docker installati e le dipendenze necessarie. Non aggiorna altri pacchetti del sistema operativo né ricrea i container.",
"updateDockerEngineOnly": "Aggiorna Docker Engine",
"adguardWebUpdateOnly": "Questa installazione di AdGuard Home si aggiorna dalla propria interfaccia web.",
"openAdguard": "Apri AdGuard Home",
"updateDockerImage": "Aggiorna immagine",
"recreateStandaloneContainer": "Aggiorna {container}",
"standaloneRecreatePending": "I container indipendenti richiedono una ricreazione protetta: {names}",
"noDockerImages": "Docker è installato, ma non sono state trovate immagini con tag.",
"dockerInventoryStarting": "In attesa che Docker completi lavvio…",
"dockerInventoryUnavailable": "Non è stato possibile leggere linventario Docker. Controlla di nuovo quando Docker è disponibile.",
"usedByContainers": "Usata da: {names}",
"imageUpdateAvailable": "Nuova immagine disponibile",
"imageUpToDate": "Aggiornata",
"imageInstalledTag": "tag installato",
"imageDigestUnknown": "Digest non disponibile",
"dockerPendingSummary": "Rilevati {count} aggiornamenti di immagini Docker. Usa il relativo flusso Docker o Compose.",
"postApplyChecking": "Verifica del risultato dell'aggiornamento…",
"postApplyAllOk": "pacchetto/i {count} applicato correttamente: nulla in sospeso.",
"postApplyNothingPending": "nulla in sospeso: tutto è aggiornato.",
"postApplyPartial": "{pending} pacchetto/i ancora in sospeso dopo l'esecuzione.",
"postApplyPartialSubline": "{applied} applicato.Alcuni aggiornamenti non sono stati completati: esamina l'output del terminale sopra."
},
"bulkUpdate": {
"title": "Aggiornamento in blocco",
"description": "Configura una sola azione per aggiornare il sistema operativo e i metodi selezionati in questo container.",
"loading": "Caricamento configurazione…",
"notConfigured": "Non configurato.",
"configure": "Configura",
"edit": "Modifica",
"apply": "Applica aggiornamenti",
"osTarget": "Sistema operativo",
"osRequired": "Obbligatorio per un aggiornamento in blocco.",
"includesDependencies": "Include anche le dipendenze dichiarate: {names}",
"noMethod": "Non è disponibile alcun metodo di aggiornamento eseguibile.",
"staleTarget": "Questa selezione non è più disponibile. Rimuovila prima di salvare.",
"dockerInventoryPending": "In attesa dellinventario delle immagini Docker…",
"missingDockerTarget": "Immagine Docker non disponibile",
"selectAtLeastOne": "Seleziona almeno una destinazione di aggiornamento oltre al sistema operativo.",
"cancel": "Annulla",
"save": "Salva",
"delete": "Rimuovi configurazione",
"deleteConfirm": "Rimuovere questa configurazione di aggiornamento in blocco?",
"saveFailed": "Impossibile salvare la configurazione di aggiornamento in blocco.",
"deleteFailed": "Impossibile rimuovere la configurazione di aggiornamento in blocco.",
"planFailed": "Impossibile preparare laggiornamento in blocco. Controlla i metodi non disponibili."
},
"appEditor": {
"closePanel": "Chiudi pannello",
"cancelButton": "Cancellare",
@@ -1284,6 +1343,17 @@
"hiddenBadge": "Attualmente nascosto: riapparirà nell'elenco di rilevamento",
"registerDifferent": "Registra un'altra app",
"detectedInContainer": "Rilevato su questo contenitore",
"versionDetected": "Versione {version} rilevata in questo container",
"legacyDetectorUsed": "Rilevata con un fallback di compatibilità legacy",
"dockerImagesTitle": "Aggiornamenti immagini Docker",
"dockerImagesHelp": "Controlla ogni immagine locale separatamente dal motore Docker confrontando i digest immutabili del registro.",
"refreshDockerImages": "Controlla ora",
"noDockerImages": "Nessuna immagine Docker con tag trovata",
"usedByContainers": "Usata da: {names}",
"imageUpdateAvailable": "Nuova immagine disponibile",
"imageUpToDate": "Aggiornata",
"imageDigestUnknown": "Digest non disponibile",
"dockerReadOnlyNote": "Controllo in sola lettura: nessuna immagine viene scaricata e nessun container viene riavviato.",
"installedManaged": "Installato e gestito da ProxMenux",
"nameLabel": "Nome",
"installedViaLabel": "Installato tramite",
@@ -1340,6 +1410,17 @@
"jsonPathPlaceholder": "ad esempio, data.version o releases[0].tag_name",
"dockerImageLabel": "Immagine dell'hub Docker",
"dockerImagePlaceholder": "ad esempio, linuxserver/plex o nginx",
"dockerVersionedTagsHelp": "Usa questa opzione solo per tag con versione. Per latest, stable o lts usa gli aggiornamenti immagini Docker basati sul digest.",
"dockerPresetSemver": "Solo SemVer",
"dockerPresetSemverSuffix": "SemVer + suffisso",
"dockerTagFilterHelp": "Filtra i tag reali prima che ProxMenux scelga la versione più alta.",
"dockerTagPreviewLabel": "Anteprima tag reali",
"dockerTagPreviewCount": "{matched} corrispondenze su {scanned}",
"dockerTagPreviewLoading": "Controllo di Docker Hub…",
"dockerTagPreviewFailed": "Impossibile mostrare i tag di Docker Hub",
"dockerTagPreviewEmpty": "Nessun tag reale corrisponde a questo filtro.",
"dockerMovingTag": "tag mobile",
"dockerMovingTagHelp": "I tag mobili non contengono una versione. Tracciali tramite digest negli aggiornamenti immagini Docker.",
"tagRegexLabel": "Tag regex (con gruppo di acquisizione)",
"tagRegexPlaceholder": "ad esempio, v?(\\d+\\.\\d+\\.\\d+)",
"tagRegexBare": "v?(\\d+\\.\\d+\\.\\d+)",
@@ -1372,7 +1453,14 @@
"registerCustom": "Registra un'app personalizzata",
"noAppsTitle": "Nessuna domanda registrata",
"noAppsBody": "Registra le applicazioni in esecuzione nel contenitore per ottenere collegamenti web e, facoltativamente, il monitoraggio delle versioni disponibili con notifiche delle nuove release.",
"registerApplication": "Registra l'applicazione",
"registerApplication": "Registra applicazione",
"searchApplications": "Cerca applicazioni",
"searchingApplications": "Ricerca applicazioni…",
"noApplicationsDetected": "Nessuna applicazione rilevata.",
"noNewApplicationsDetected": "Nessuna nuova applicazione rilevata.",
"oneNewApplicationDetected": "Rilevata una nuova applicazione.",
"newApplicationsDetected": "Rilevate {count} nuove applicazioni.",
"detectionFailed": "Rilevamento delle applicazioni non riuscito",
"hiddenSuffix": "{count} nascosto",
"confirmHide": "Nascondere permanentemente il rilevamento \"{name}\" su questo contenitore?\n\nPer ripristinarlo in un secondo momento, fai clic su \"Registra un'altra app\": l'elenco nascosto viene visualizzato lì con un'opzione di ripristino.",
"saveFailed": "Salvataggio non riuscito",
@@ -1383,6 +1471,13 @@
"binaryArgsHintGrafana": "Grafana ha bisogno",
"loadFailed": "Impossibile caricare la configurazione dell'app",
"checkFailed": "Controllo fallito",
"testDetectorButton": "Prova rilevatore",
"testingDetectorButton": "Prova del rilevatore…",
"detectorTestTitle": "Risultato della prova del rilevatore",
"detectorTestNotSaved": "Solo bozza · non salvata",
"detectorTestNoVersion": "Nessuna versione rilevata",
"detectorTestNoUpstream": "Nessuna fonte upstream configurata",
"detectorTestFailed": "Prova del rilevatore non riuscita",
"deleteFailed": "Eliminazione non riuscita",
"dismissFailed": "Impossibile ignorare il rilevamento",
"restoreFailed": "Impossibile ripristinare il rilevamento",
@@ -1399,6 +1494,10 @@
"webLinks": "Collegamenti Web",
"addPort": "Aggiungi porto",
"detectedPorts": "Porte rilevate nel contenitore: fai clic per aggiungere:",
"dockerPublishedServicesTitle": "Servizi Docker con porte pubblicate",
"dockerPublishedServicesHelp": "Seleziona solo le porte che forniscono uninterfaccia web. ProxMenux non registra questi container come applicazioni LXC indipendenti.",
"dockerPublishedAdd": "Aggiungi link",
"dockerPublishedPort": "porta {containerPort} del container → {hostPort} nellLXC",
"noWebPorts": "Nessuna porta web in ascolto. Utilizza Aggiungi porta se desideri comunque creare un collegamento manualmente.",
"trackUpstream": "Monitora la versione disponibile (facoltativo)",
"trackOff": "Disattivato: solo collegamento",
@@ -1416,7 +1515,7 @@
"checkButton": "Controllo",
"editFieldsButton": "Modifica campi",
"alsoDetectedContainer": "Rilevato anche su questo contenitore",
"addAnotherApplication": "Aggiungi un'altra applicazione",
"addAnotherApplication": "Registra un'altra applicazione",
"doneButton": "Fatto",
"editButton": "Modificare",
"upstreamErrorTimeout": "timeout della rete durante il contatto a monte",