Pre-release 1.2.7: OCI fixes, 12 new catalog applications and docs updates

Last changes before version 1.2.7.

OCI manager Apps
- Multi-container applications start while one of their containers is
  being backed up: the start hook waits until vzdump releases it and does
  not start it twice. The DHCP client of a dependency no longer keeps the
  lock of the hook, so later starts do not hang, and the watchdog waits
  while a dependency is locked. Installing or updating ProxMenux replaces
  the published copies of the hook already in place.
- Images built from scratch with a numeric user, such as ddns-updater,
  install: the container is created from a copy of the image that adds
  the /etc/passwd and /etc/group Proxmox VE needs, and the application
  runs with the user the image declares. The downloaded image stays
  unchanged. An image with a named user and no user database stops
  before anything is created, with a message that says why.

Catalog
- Twelve new applications: MDBListarr, CrossWatch, Free Games Claimer
  Remaster, Cloudreve, Poznote and AceStream HTTP Proxy, suggested in
  discussion #440, and the Dockur images of Chrony, Dnsmasq, Tor,
  Stunnel, strfry and Statping. The catalog lists 347 applications.
- Their prompts, labels and notes are translated into the seven
  languages of the menus.

Documentation
- OCI manager: architecture, lifecycle and stacks pages revised, with
  larger diagrams and new screenshots.
- Contributors: the page now thanks those developing, reviewing,
  translating and testing ProxMenux today and those who helped in its
  first steps, with new avatars.

Tests for the stack start hook, the watchdog, the user database check
of OCI images and the Tor installation summary.
This commit is contained in:
MacRimi
2026-10-25 13:17:54 +01:00
parent 2f48689087
commit fc41b04e87
103 changed files with 12799 additions and 603 deletions
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Dépôt de l’image",
"converter": "Convertisseur",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "Une mise à jour transactionnelle",
"title": "Comment se déroule une mise à jour et que se passe-t-il en cas d'échec",
"blocks": [
{
"p": "La mise à jour est transactionnelle : la nouvelle image est d'abord préparée et vérifiée ; une sauvegarde est ensuite créée et le système de fichiers de l'application est remplacé. La nouvelle version est validée uniquement après un contrôle de fonctionnement réussi. Si un échec survient après une modification du conteneur, une restauration de la sauvegarde précédente est tentée et son résultat est vérifié."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "Utilisateur",
"registry": "Registre OCI",
"update": "Mettre à jour l'instance",
"resolve": "Résoudre la balise",
"verify": "Vérifier l’archive et effectuer les contrôles préalables",
"backup": "Arrêter et sauvegarder le CT",
"import": "Importer le nouveau rootfs",
"reapply": "Appliquer à nouveau le contrat",
"healthy": "sain",
"failure": "défaillance",
"commit": "Contrat publié avec le nouveau digest",
"restored": "instance précédente restaurée"
"registry": "Registre d'images OCI",
"update": "Mettre à jour l'application",
"resolve": "Identifier la nouvelle version",
"image": "Télécharger la nouvelle image",
"verify": "Vérifier l'image et les prérequis",
"backup": "Arrêter le conteneur et le sauvegarder",
"import": "Installer le nouveau système de fichiers",
"reapply": "Réappliquer la configuration enregistrée",
"start": "Démarrer et vérifier l'application",
"checked": "Résultat du contrôle de fonctionnement",
"healthy": "L'application fonctionne",
"failure": "La mise à jour échoue",
"commit": "Enregistrer la nouvelle version et configuration",
"updated": "Mise à jour terminée",
"rollback": "Restaurer et vérifier la sauvegarde précédente",
"recovered": "Restauration vérifiée",
"restored": "Version précédente restaurée",
"restoreFailed": "Restauration non vérifiée",
"manual": "Restauration en attente : examiner l'erreur"
}
}
},
{
"p": "Si la préparation ou les contrôles préalables échouent, la mise à jour s'arrête avant l'arrêt du conteneur. La restauration du conteneur ne rétablit pas les fichiers des répertoires partagés de l'hôte à une version antérieure."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Boîte de dialogue qui énumère les conteneurs restaurés et propose de les récupérer",
"caption": "La récupération offerte lors de l'ouverture de la gestion des applications OCI installées."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "Un conteneur qui revient",
"body": "Un conteneur restauré sur lui-même à partir d'une ancienne sauvegarde, retourné à un instantané ou retourné d'un autre noeud porte le contrat de l'état dans lequel il est. Lorsqu'il est sélectionné pour une opération et que son contrat diffère de celui de cet hôte, l'opération ne démarre pas et le conteneur est offert pour récupération."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Résultat de la récupération avec le réseau privé, l’ordre de démarrage et les conteneurs enregistrés",
"caption": "Résultat d'une reprise, étape par étape."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Préparer chaque image",
"stop": "Stop, membre principal d'abord",