mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 10:52:22 +00:00
Merge pull request #486 from jcastro/docs/review-oci-manager
docs: review OCI manager documentation in all seven translations
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comment une image OCI est adaptée | ProxMenux",
|
||||
"description": "Du dépôt de l’image et de son fichier Compose à un modèle vérifiable, un plan de déploiement et un LXC natif de Proxmox VE, sans Docker à l’intérieur."
|
||||
},
|
||||
"header": {
|
||||
"title": "Comment une image OCI est adaptée",
|
||||
"description": "Du dépôt de l’image et de son fichier Compose à un modèle vérifiable, un plan de déploiement et un LXC natif, sans installer Docker à l’intérieur.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "pipeline",
|
||||
"title": "Le processus d’adaptation",
|
||||
"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}}\"]",
|
||||
"labels": {
|
||||
"repo": "Dépôt de l’image",
|
||||
"converter": "Convertisseur",
|
||||
"template": "Modèle JSON",
|
||||
"blockers": "Aucun point bloquant ?",
|
||||
"no": "Non",
|
||||
"yes": "Oui",
|
||||
"review": "Révision / overlay",
|
||||
"plan": "Plan de déploiement",
|
||||
"lxc": "LXC natif"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Le convertisseur lit l’image et le fichier Compose publiés par le projet, puis produit un modèle JSON. Si des exigences n’ont pas pu être adaptées et bloquent l’installation, le modèle est révisé avant sa publication dans le catalogue. Un fichier d’ajustements vérifiés, appelé overlay, permet de résoudre ces points. Seuls les modèles sans point bloquant sont proposés à l’installation."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "template",
|
||||
"title": "Ce que conserve le modèle",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "archive",
|
||||
"title": "Identité de l’image",
|
||||
"body": "Dépôt, tag mis à jour en continu, architecture, digest résolu et révision de la source."
|
||||
},
|
||||
{
|
||||
"icon": "braces",
|
||||
"title": "Contrat du conteneur",
|
||||
"body": "Entrypoint, Cmd, environnement, utilisateur, répertoire de travail, signal d’arrêt, ports et volumes."
|
||||
},
|
||||
{
|
||||
"icon": "layers",
|
||||
"title": "Adaptation à Proxmox VE",
|
||||
"body": "Ressources, sécurité, points de montage, périphériques, sysctls, contrôles de bon fonctionnement et adaptations nécessaires pour chacun, avec leur justification."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Compatibilité",
|
||||
"body": "Clés prises en charge, exigences non adaptées qui bloquent l’installation et état de chaque validation."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "sources",
|
||||
"title": "OCI fournit le processus ; Compose fournit l’environnement",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Source",
|
||||
"Exemple",
|
||||
"Résultat natif"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Métadonnées OCI",
|
||||
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
|
||||
"Proxmox VE les importe à la création du CT"
|
||||
],
|
||||
[
|
||||
"Docker Compose",
|
||||
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
|
||||
"Entrées d’environnement LXC, <code>mpN</code> et <code>devN</code>"
|
||||
],
|
||||
[
|
||||
"Profil ProxMenux",
|
||||
"GPU, contrôle de bon fonctionnement, identifiants",
|
||||
"Questions et adaptations vérifiées"
|
||||
],
|
||||
[
|
||||
"Utilisateur",
|
||||
"VMID, stockage, réseau",
|
||||
"Le contrat de l’instance"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "install",
|
||||
"title": "Ce qui se passe pendant l’installation",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Résoudre la référence",
|
||||
"body": "Le registre est interrogé, l’architecture de l’hôte est sélectionnée et le digest exact désigné par le tag mis à jour en continu est fixé."
|
||||
},
|
||||
{
|
||||
"title": "Télécharger et vérifier",
|
||||
"body": "Skopeo télécharge l’image sous forme d’archive OCI. Avant toute création, chaque couche est vérifiée à l’aide de son digest, puis décompressée. Si le téléchargement est endommagé, il est tenté une seconde fois avant l’arrêt de l’installation."
|
||||
},
|
||||
{
|
||||
"title": "Créer le système de fichiers",
|
||||
"body": "<code>pct create</code> crée le rootfs à partir de l’archive et conserve les métadonnées officielles du processus de l’image."
|
||||
},
|
||||
{
|
||||
"title": "Raccorder les ressources",
|
||||
"body": "Les volumes, le réseau, l’environnement, les périphériques et les profils de sécurité déclarés sont appliqués."
|
||||
},
|
||||
{
|
||||
"title": "Console",
|
||||
"body": "La sortie console du conteneur est conservée sur l’hôte. La console de Proxmox VE ouvre un shell si l’image en contient un."
|
||||
},
|
||||
{
|
||||
"title": "Vérifier",
|
||||
"body": "Au premier démarrage, l’installation attend l’attribution d’une adresse et la réponse du service. En cas d’échec, elle n’est pas signalée comme réussie."
|
||||
},
|
||||
{
|
||||
"title": "Enregistrer la configuration",
|
||||
"body": "La configuration effective est enregistrée dans le contrat de l’instance utilisé lors des mises à jour et des recréations."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "example",
|
||||
"title": "Exemple : une image avec /config et /downloads",
|
||||
"intro": "Une définition Compose courante et la configuration Proxmox VE qui en résulte. Les chemins attendus par l’application ne changent pas.",
|
||||
"blocks": [
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Docker Compose",
|
||||
"code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080"
|
||||
},
|
||||
{
|
||||
"title": "/etc/pve/lxc/VMID.conf (extrait)",
|
||||
"code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "<code>mp0</code> est un second disque appartenant au conteneur, nommé <code>vm-VMID-disk-N</code> sur le stockage sélectionné. Il est monté dans <code>/config</code> et, avec <code>backup=1</code>, inclus dans la sauvegarde du conteneur. <code>mp1</code> ne crée aucun disque : il monte le répertoire de l’hôte <code>/srv/downloads</code> dans <code>/downloads</code> à l’intérieur du LXC. Le port 8080 n’est pas redirigé : le LXC possède sa propre adresse et le service y répond."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,278 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installer une image absente du catalogue | ProxMenux",
|
||||
"description": "Adaptez une image OCI à partir d’un fichier Compose, d’une URL, d’une commande docker run ou d’une référence d’image, puis vérifiez ce que ProxMenux peut reproduire avant l’installation."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installer une image absente du catalogue",
|
||||
"description": "Votre image est adaptée à partir de son fichier Compose, d’une commande docker run ou de sa seule référence. Le résultat est présenté pour vérification avant la création du moindre LXC.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Le même convertisseur et le même installateur",
|
||||
"body": "L’option <strong>Installer une image absente du catalogue</strong> utilise le même convertisseur et le même installateur que les modèles du catalogue. Le contrat est simplement généré à ce moment-là à partir de la définition fournie, puis validé avant toute création de LXC."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "sources",
|
||||
"title": "Comment décrire l’image",
|
||||
"intro": "Le premier écran demande comment l’image est décrite. Quatre possibilités fournissent une définition à adapter, une cinquième utilise uniquement le nom de l’image et trois autres lisent un oci-compose déjà rédigé.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Option",
|
||||
"Contenu lu"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Coller son fichier Compose dans le terminal",
|
||||
"Collez le contenu YAML dans le terminal et terminez avec Ctrl+D."
|
||||
],
|
||||
[
|
||||
"Lire son fichier Compose depuis cet hôte",
|
||||
"Un chemin sur le nœud, <code>/root/docker-compose.yml</code> par défaut. Le fichier doit exister et ne pas dépasser 256 KiB."
|
||||
],
|
||||
[
|
||||
"Télécharger son fichier Compose depuis une adresse",
|
||||
"Une adresse <code>http://</code> ou <code>https://</code> qui fournit le YAML brut. Le téléchargement est limité à 256 KiB."
|
||||
],
|
||||
[
|
||||
"Coller sa commande docker run dans le terminal",
|
||||
"La commande publiée par le projet. Les ports, l’environnement, les volumes, les périphériques, les capabilities, l’utilisateur, la mémoire partagée et les autres options prises en charge sont adaptés."
|
||||
],
|
||||
[
|
||||
"Uniquement la référence de l’image, sans fichier Compose",
|
||||
"Une référence comme <code>ghcr.io/user/application:latest</code>. Le registre est interrogé et les métadonnées OCI de l’image sont conservées."
|
||||
],
|
||||
[
|
||||
"Coller un oci-compose dans le terminal",
|
||||
"Collez le JSON dans le terminal et terminez avec Ctrl+D. Il n’est pas converti : il est vérifié puis installé tel qu’il est rédigé."
|
||||
],
|
||||
[
|
||||
"Lire un oci-compose depuis cet hôte",
|
||||
"Un fichier JSON sur le nœud, <code>/root/oci-compose.json</code> par défaut, de 2 MiB au maximum."
|
||||
],
|
||||
[
|
||||
"Télécharger un oci-compose depuis une adresse",
|
||||
"Une adresse <code>http://</code> ou <code>https://</code> qui fournit le fichier JSON. Le téléchargement est limité à 2 MiB."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/custom-source-menu.png",
|
||||
"alt": "Menu de choix de la description d’une image absente du catalogue",
|
||||
"caption": "Les façons de décrire une image absente du catalogue."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "reference-only",
|
||||
"title": "Ce que fournit la seule référence de l’image",
|
||||
"intro": "L’image contient les métadonnées de son processus, mais pas tout l’environnement habituellement ajouté par un fichier Compose.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Lu depuis l’image",
|
||||
"Absent de l’image",
|
||||
"Conséquence"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> et l’environnement intégré",
|
||||
"Variables présentes uniquement dans la documentation",
|
||||
"Ajoutées pendant l’installation ou avec Modifier"
|
||||
],
|
||||
[
|
||||
"Volumes déclarés par l’image",
|
||||
"Répertoires de l’hôte indiqués uniquement dans le fichier Compose",
|
||||
"Les chemins supplémentaires sont ajoutés avant l’installation"
|
||||
],
|
||||
[
|
||||
"Ports <code>EXPOSE</code>",
|
||||
"L’URL, le protocole ou le contrôle de bon fonctionnement",
|
||||
"Le port et la méthode de vérification du service sont confirmés"
|
||||
],
|
||||
[
|
||||
"Architectures et digest dans le registre",
|
||||
"Périphériques, privilèges ou dépendances externes",
|
||||
"Ils ne sont pas activés sans une définition qui les demande"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "review",
|
||||
"title": "Vérifier avant l’installation",
|
||||
"intro": "Après adaptation de la définition, ProxMenux présente ce qu’il en a compris avant de demander le VMID, les ressources ou le stockage.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Analyser",
|
||||
"body": "Les services, l’image, les ports, les chemins, l’environnement, les périphériques, la sécurité et le contrôle de bon fonctionnement sont lus."
|
||||
},
|
||||
{
|
||||
"title": "Interroger le registre",
|
||||
"body": "L’image doit exister dans le registre et les architectures publiées sont affichées. Un registre privé est consulté avec le compte enregistré pour celui-ci."
|
||||
},
|
||||
{
|
||||
"title": "Lister les options non appliquées",
|
||||
"body": "Les labels, réseaux Docker, paramètres Swarm et autres clés sans effet sur un LXC sont répertoriés."
|
||||
},
|
||||
{
|
||||
"title": "Bloquer les options sans équivalent sûr",
|
||||
"body": "Les clés sans équivalent sûr apparaissent sous <strong>Options sans équivalent</strong> et empêchent la poursuite de l’installation. Aucune n’est ignorée silencieusement."
|
||||
},
|
||||
{
|
||||
"title": "Demander les secrets",
|
||||
"body": "Les variables dont le nom évoque un mot de passe, un jeton ou une clé sont demandées comme données sensibles pendant l’installation."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/custom-review.png",
|
||||
"alt": "Récapitulatif de l’interprétation du fichier Compose par ProxMenux",
|
||||
"caption": "Récapitulatif affiché avant la demande du VMID et des ressources."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Après validation du récapitulatif, le parcours est celui du catalogue : nom, mode par défaut ou avancé, VMID, CPU, mémoire, réseau, démarrage avec le nœud, chemins persistants et supplémentaires, périphériques compatibles et récapitulatif final."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "examples",
|
||||
"title": "Exemples de saisie",
|
||||
"blocks": [
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Compose",
|
||||
"code": "services:\n app:\n image: ghcr.io/example/app:latest\n ports:\n - \"8080:8080\"\n volumes:\n - ./config:/config\n - /srv/media:/media\n environment:\n TZ: Europe/Madrid"
|
||||
},
|
||||
{
|
||||
"title": "docker run",
|
||||
"code": "docker run -d \\\n --name app \\\n -p 8080:8080 \\\n -e TZ=Europe/Madrid \\\n -v app-config:/config \\\n -v /srv/media:/media \\\n ghcr.io/example/app:latest"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "oci-compose",
|
||||
"title": "Un oci-compose rédigé à la main",
|
||||
"intro": "Un oci-compose est le fichier JSON à partir duquel une application est installée. Le catalogue en conserve un par application. Le même format peut être rédigé à la main et installé avec cette option.",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Dans un fichier rédigé à la main, l’auteur définit l’image, les ports, les variables, les volumes et les questions de l’installation. ProxMenux complète le reste à la lecture. Le format permet d’exprimer ce que Compose ne prévoit pas : texte d’une question, mot de passe généré à l’installation, profil GPU, propriétaire de chaque volume, contrôle du premier démarrage ou identifiants affichés à la fin."
|
||||
},
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Vérifier",
|
||||
"body": "Un fichier contenant des erreurs n’est pas installé. Chaque erreur indique le champ concerné ; un JSON invalide signale la ligne et la colonne."
|
||||
},
|
||||
{
|
||||
"title": "Examiner",
|
||||
"body": "Un fichier valide affiche ce qu’il installe : image, adresse web, ports, chemins persistants, variables demandées et fichiers écrits pendant l’installation."
|
||||
},
|
||||
{
|
||||
"title": "Installer",
|
||||
"body": "L’installation suit le même parcours que pour toute application du catalogue, avec les paramètres par défaut ou avancés."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Un fichier qui détermine les privilèges",
|
||||
"body": "Un oci-compose détermine ce qui est monté dans le conteneur et avec quels privilèges. La vérification le précise avant l’installation : n’installez que des fichiers de sources fiables."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Le <readmeLink>README du moteur OCI</readmeLink> décrit le format bloc par bloc avec deux exemples complets. Un enregistrement d’installation peut aussi être lu de cette façon : seul le modèle d’origine est utilisé, sans aucune des réponses de cette installation."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "private-registries",
|
||||
"title": "Images de registres privés",
|
||||
"intro": "Une image d’un registre privé, comme un paquet privé GitHub ou un dépôt privé Docker Hub, est lue avec un compte enregistré dans ProxMenux.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Le registre refuse l’accès à l’image",
|
||||
"body": "Si le registre indique que l’image nécessite un compte, la vérification propose de s’y connecter, puis lit à nouveau l’image."
|
||||
},
|
||||
{
|
||||
"title": "Se connecter",
|
||||
"body": "Un nom d’utilisateur et un mot de passe ou jeton autorisé à télécharger l’image. Le registre les vérifie ; ils ne sont enregistrés que s’il les accepte."
|
||||
},
|
||||
{
|
||||
"title": "Installer et maintenir à jour",
|
||||
"body": "Ce compte sert au téléchargement pendant l’installation, ainsi qu’aux mises à jour, à Modifier, à Recréer, au watchdog et à la recherche de mises à jour du Monitor, sur chaque nœud du cluster."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "<strong>Comptes de registres</strong>, dans le menu principal d’OCI manager Apps, affiche les comptes enregistrés par registre et utilisateur, jamais leurs secrets. Chaque compte permet de vérifier, télécharger ou installer une image, ainsi que de mettre à jour ou supprimer les identifiants."
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"GitHub (<code>ghcr.io</code>) : l’utilisateur est le compte GitHub et le mot de passe un jeton d’accès personnel avec l’autorisation <code>read:packages</code>.",
|
||||
"Docker Hub (<code>docker.io</code>) : l’utilisateur est le compte Docker Hub et le mot de passe un jeton d’accès avec autorisation de lecture.",
|
||||
"Autres registres, y compris avec un port propre comme <code>registry.example.com:5000</code> : l’utilisateur et le mot de passe ou jeton fournis par ce registre."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Où les comptes sont conservés",
|
||||
"body": "Dans <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, lisible uniquement par root, dans le même dossier que les mots de passe de stockage de Proxmox. <code>/etc/pve</code> est partagé entre tous les nœuds du cluster : un compte ajouté sur un nœud est donc utilisé partout. La sauvegarde de l’hôte inclut ce fichier et la désinstallation de ProxMenux le supprime de tous les nœuds."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "limits",
|
||||
"title": "Définitions qui ne sont pas installées",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Un Dockerfile sans image publiée : l’image doit d’abord être construite et publiée dans un registre OCI.",
|
||||
"Un fichier Compose à plusieurs services : cette option installe un seul service par conteneur, même si plusieurs services utilisent la même image.",
|
||||
"<code>configs</code>, secrets externes ou formats de périphériques impossibles à adapter sans ambiguïté.",
|
||||
"Substitutions shell comme <code>$(command)</code> : il faut saisir directement la valeur résultante.",
|
||||
"Options <code>docker run</code> non reconnues et <code>--env-file</code> : utilisez plutôt un fichier Compose aux valeurs explicites."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,392 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Dispositifs et accélération ProxMenux",
|
||||
"description": "Comment OCI manager Apps rend les GPU, NVIDIA, Coral, USB, FUSE et autres périphériques accessibles à un conteneur OCI sous forme de ressources natives Proxmox VE validées."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dispositifs et accélération",
|
||||
"description": "GPU, NVIDIA, Coral, USB, FUSE et les dispositifs de blocs deviennent des ressources natives validées Proxmox VE du conteneur.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "principle",
|
||||
"title": "L'appareil dont l'application a besoin, pas l'hôte entier",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Un appareil demandé par le fichier Compose ou par le profil d'application devient une entrée concrète <code>devN</code> ou un montage LXC. Demander un GPU, un périphérique USB ou un Coral ne rend pas le conteneur privilégié."
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Inventaire des hôtes",
|
||||
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux",
|
||||
"detail": "fournisseur et\npermissions vérifiées"
|
||||
},
|
||||
{
|
||||
"label": "LXC",
|
||||
"detail": "même périphérique\nGID effectif"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "origin",
|
||||
"title": "D'où vient la demande de l'appareil",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Source",
|
||||
"Ce qui est lu",
|
||||
"Ce que fait l'installateur"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Docker Compose",
|
||||
"Demandes <code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> et NVIDIA",
|
||||
"Chaque exigence devient une demande d'appareil présentée pour examen"
|
||||
],
|
||||
[
|
||||
"Profil du catalogue",
|
||||
"La prise en charge réelle des GPU, de Coral, d’OpenCL, d’USB ou de FUSE par l’application",
|
||||
"Seules les options validées pour cette image sont proposées"
|
||||
],
|
||||
[
|
||||
"métadonnées d'images et documentation",
|
||||
"VA-API, Selkies, LinuxServer mods ou le NVIDIA runtime",
|
||||
"Les variables documentées et la préparation sont ajoutées"
|
||||
],
|
||||
[
|
||||
"Sélection de l'utilisateur",
|
||||
"CPU uniquement, Intel/AMD, OpenCL, NVIDIA ou un appareil optionnel",
|
||||
"La sélection est stockée dans le contrat d'instance"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Les périphériques détectés ne sont pas ajoutés automatiquement",
|
||||
"body": "L'hôte est inventorié, mais seuls les appareils déclarés par le fichier Compose ou par un profil compatible sont proposés et attachés. Un GPU, un dongle USB ou un Coral présent sur l'hôte n'est pas exposé à tous les LXC."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "identify",
|
||||
"title": "Comment le périphérique hôte est identifié",
|
||||
"intro": "Avant que le LXC ne soit modifié, l'appareil est lu sur l'hôte et correspond au profil choisi.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Type",
|
||||
"Identité",
|
||||
"Validation"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Intel/AMD DRM",
|
||||
"<code>/dev/dri/renderD*</code> et <code>/sys/class/drm/NODE/device/vendor</code>",
|
||||
"Dispositif de caractères avec fournisseur <code>0x8086</code> (Intel) ou <code>0x1002</code> (AMD)"
|
||||
],
|
||||
[
|
||||
"AMD OpenCL",
|
||||
"Le nœud de rendu, plus <code>/dev/kfd</code> lorsque le profil en a besoin",
|
||||
"Existence, type, fournisseur, autorisations et compatibilité déclarée"
|
||||
],
|
||||
[
|
||||
"AMD ROCm",
|
||||
"Le nœud de rendu, <code>/dev/kfd</code> et la génération indiquée par le pilote de calcul dans <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>",
|
||||
"Une génération pour laquelle l’image ROCm de l’application contient des noyaux de calcul — les GPU RDNA2 cités et les plus récents — est proposée telle quelle. Les autres GPU de ces familles, comme les Radeon 680M et 780M, sont proposés à titre expérimental et jamais présélectionnés : ROCm ne les prend pas officiellement en charge, l’application les présente comme la génération de leur famille (<code>HSA_OVERRIDE_GFX_VERSION</code>) et l’installateur demande confirmation avant de télécharger l’image plus volumineuse. Une GPU plus ancienne, telle que la partie graphique intégrée d’un Ryzen 5000U, n’est pas proposée et Immich conserve la reconnaissance sur le CPU."
|
||||
],
|
||||
[
|
||||
"NVIDIA",
|
||||
"<code>nvidia-smi</code> et <code>nvidia-container-cli</code>",
|
||||
"GPU, UUID, PCI bus, version pilote, Toolkit, <code>/dev/nvidia*</code> nœuds, binaires et bibliothèques"
|
||||
],
|
||||
[
|
||||
"Coral PCIe/M.2",
|
||||
"<code>/dev/apex_N</code> et son lien dans <code>/sys/dev/char/MAJOR:MINOR</code>",
|
||||
"Nœud de caractère, majeur/mineur, propriétaire, GID et permissions"
|
||||
],
|
||||
[
|
||||
"USB et série",
|
||||
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> ou <code>/dev/bus/usb/BBB/DDD</code>",
|
||||
"Nœud de caractère; pour USB aussi fournisseur, produit et série lorsque sysfs les publie"
|
||||
],
|
||||
[
|
||||
"KVM, TUN, FUSE, vidéo et SCSI générique",
|
||||
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> ou <code>/dev/sgN</code>",
|
||||
"Chemin pris en charge, type de nœud et permissions effectives"
|
||||
],
|
||||
[
|
||||
"Lecteur optique",
|
||||
"<code>/dev/srN</code>",
|
||||
"Un périphérique bloc"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "install",
|
||||
"title": "Ce qui se passe pendant l'installation",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Le modèle offre ses profils",
|
||||
"body": "Par exemple CPU seulement, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL ou NVIDIA. Les options appartiennent à l'image, pas à un menu commun."
|
||||
},
|
||||
{
|
||||
"title": "Un profil est choisi",
|
||||
"body": "Il définit les nœuds de périphérique, l'environnement, les mods ou l'exécution dont l'application a besoin."
|
||||
},
|
||||
{
|
||||
"title": "Un chemin est proposé",
|
||||
"body": "Pour DRM, <code>/dev/dri/renderD128</code>, qui peut être modifié sur un hôte avec plusieurs nœuds de rendu. Pour USB ou série, le nœud précis est sélectionné."
|
||||
},
|
||||
{
|
||||
"title": "Validation",
|
||||
"body": "L'existence, le type, le fournisseur autorisé, les autorisations et le GID sont vérifiés. Une inadéquation arrête l'opération."
|
||||
},
|
||||
{
|
||||
"title": "Le contrat est écrit",
|
||||
"body": "Chemin, mode, GID, accès à l'écriture et profil sont enregistrés pour les mises à jour et les recréations de conteneurs."
|
||||
},
|
||||
{
|
||||
"title": "Ajout et vérification",
|
||||
"body": "<code>pct set</code> ajoute l'entrée <code>devN</code> et l'accès est ensuite vérifié à l'intérieur du LXC. Les images LinuxServer sont également vérifiées en tant qu'utilisateur <code>abc</code>."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "config",
|
||||
"title": "Comment il apparaît dans la configuration LXC",
|
||||
"intro": "Valeurs indicatives : <code>dev0</code> et <code>dev1</code> sont les emplacements libres attribués par Proxmox VE ; <code>renderD128</code>, <code>apex_0</code> et le GID dépendent du matériel du nœud.",
|
||||
"blocks": [
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Intel/AMD VA-API",
|
||||
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "Coral PCIe/M.2",
|
||||
"code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "Un périphérique USB spécifique",
|
||||
"code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "AMD OpenCL",
|
||||
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Le GID est lu avec <code>stat</code> sur l'hôte et écrit à l'entrée <code>devN</code>; les groupes <code>render</code> et <code>video</code> ne sont pas supposés avoir un nombre fixe. L'appareil conserve le même chemin <code>/dev</code> à l'intérieur du LXC, où les propres mécanismes de l'application le recherchent."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "profiles",
|
||||
"title": "Profils qu'une image peut offrir",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Profil",
|
||||
"Configuration résultante",
|
||||
"Proposé quand"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Intel/AMD VA-API",
|
||||
"Le noeud de rendu <code>/dev/dri</code>",
|
||||
"L'application prend en charge l'accélération vidéo"
|
||||
],
|
||||
[
|
||||
"OpenCL",
|
||||
"Noeud Render, <code>/dev/kfd</code> au besoin et le mod officiel",
|
||||
"L'image ou le profil le documente"
|
||||
],
|
||||
[
|
||||
"NVIDIA",
|
||||
"Dispositifs pilotes et bibliothèques de l'hôte",
|
||||
"L’hôte dispose d’un pilote fonctionnel et de NVIDIA Container Toolkit"
|
||||
],
|
||||
[
|
||||
"Coral",
|
||||
"<code>/dev/apex_0</code> ou le bus USB",
|
||||
"Le profil déclare la prise en charge de Coral (Frigate)"
|
||||
],
|
||||
[
|
||||
"USB, série, FUSE",
|
||||
"Un seul appareil, un arbre validé ou une fonction LXC",
|
||||
"Le contrat le demande"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "nvidia",
|
||||
"title": "NVIDIA",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Prérequis sur le nœud : NVIDIA Container Toolkit",
|
||||
"body": "Un pilote fonctionnel sur Proxmox VE ne suffit pas à donner une GPU NVIDIA à une image OCI. OCI Manager Apps utilise <code>nvidia-container-cli</code>, de NVIDIA Container Toolkit, pour identifier les appareils et obtenir les binaires et les bibliothèques qui correspondent au pilote chargé."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Le <nvidiaLink>installateur NVIDIA de ProxMenux</nvidiaLink> installe NVIDIA Container Toolkit du dépôt officiel NVIDIA avec le pilote. Il vérifie ses quatre paquets, valide <code>nvidia-container-cli</code> et enregistre le résultat dans le journal de changement de <auditLink>Audit & Report</auditLink>."
|
||||
},
|
||||
{
|
||||
"p": "Ces deux commandes sur l'hôte montrent si le pilote et le Toolkit sont disponibles :"
|
||||
},
|
||||
{
|
||||
"shell": {
|
||||
"code": "nvidia-smi -L\nnvidia-container-cli --version"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Sur un hôte où le pilote a été installé par d'autres moyens, le Toolkit est installé à partir du dépôt stable officiel:"
|
||||
},
|
||||
{
|
||||
"shell": {
|
||||
"code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "L’inventaire utilisé par OCI manager Apps provient de la sortie de :"
|
||||
},
|
||||
{
|
||||
"shell": {
|
||||
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "La configuration d'exécution Docker n'est pas impliquée",
|
||||
"body": "Les conteneurs sont des LXC natifs sans démon Docker : <code>nvidia-ctk runtime configure --runtime=docker</code> ne joue donc aucun rôle. ProxMenux interroge directement <code>nvidia-container-cli</code> et écrit les périphériques et montages LXC. Les commandes et plateformes prises en charge sont maintenues dans le <toolkitLink>guide d’installation de NVIDIA Container Toolkit</toolkitLink>."
|
||||
}
|
||||
},
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "cpu",
|
||||
"title": "Inventaire issu du pilote",
|
||||
"body": "<code>nvidia-container-cli</code> énumère les nœuds de périphérique, les binaires, les micrologiciels et les bibliothèques du pilote installé."
|
||||
},
|
||||
{
|
||||
"icon": "refresh",
|
||||
"title": "Pas de version fixe",
|
||||
"body": "Le modèle ne nomme pas les fichiers de bibliothèque. Le profil est généré à partir de l'hôte actuel."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Montages en lecture seule",
|
||||
"body": "Les bibliothèques hôtes sont montées en lecture seule au lieu d'être copiées dans le conteneur."
|
||||
},
|
||||
{
|
||||
"icon": "hardDrive",
|
||||
"title": "Changements de pilote",
|
||||
"body": "Après un changement de pilote, l'inventaire est généré à nouveau avant le démarrage des LXC touchés."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": {
|
||||
"title": "Résultat NVIDIA (simplifié)",
|
||||
"code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Passer uniquement <code>/dev/nvidia0</code> ne suffit pas. Les composants espace utilisateur du pilote chargé sont montés en lecture seule, et <code>nvidia-smi</code> fonctionne ensuite à l'intérieur du LXC pour comparer GPU, UUID, PCI bus et version avec l'inventaire hôte."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "usb",
|
||||
"title": "Coral USB, série et USB",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "La numérotation USB peut changer",
|
||||
"body": "Un chemin tel que <code>/dev/bus/usb/003/004</code> peut changer lorsque le périphérique est reconnecté ou que l'hôte redémarre. Le profil enregistre le fournisseur, le produit et la série lorsqu'ils sont disponibles, mais une nouvelle adresse de bus n'est pas automatiquement réaffectée."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Un périphérique est donné par son nœud concret : <code>/dev/ttyUSB0</code>, <code>/dev/ttyACM0</code>, <code>/dev/apex_0</code> ou <code>/dev/bus/usb/BBB/DDD</code>. Passer l'intégralité de <code>/dev</code> n'est pas accepté. Coral est proposé uniquement aux applications dont le profil le déclare."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "trees",
|
||||
"title": "Arbres de périphériques et fonctionnalités LXC",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Demande",
|
||||
"Configuration résultante",
|
||||
"Portée"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"<code>/dev/dvb</code>, <code>/dev/snd</code> ou <code>/dev/bus/usb</code>",
|
||||
"Chaque noeud de caractère de l'arbre obtient sa propre entrée <code>devN</code> avec le mode hôte et GID",
|
||||
"Seulement l'arbre demandé, pas le reste de <code>/dev</code>"
|
||||
],
|
||||
[
|
||||
"<code>/dev/fuse</code>",
|
||||
"Le nœud et, lorsque le profil en a besoin, la fonction <code>fuse=1</code>",
|
||||
"FUSE seul ne publie pas de montages sur d'autres LXC"
|
||||
],
|
||||
[
|
||||
"<code>/dev/net/tun</code>",
|
||||
"Une entrée <code>devN</code> sur le même chemin à l'intérieur du LXC",
|
||||
"La configuration VPN ou réseau reste dans l'application"
|
||||
],
|
||||
[
|
||||
"<code>/dev/kvm</code>",
|
||||
"Une entrée <code>devN</code> validée",
|
||||
"Offert seulement lorsque le contrat le demande"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "security",
|
||||
"title": "Confirmations par niveau de risque",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Les périphériques concrets, les privilèges facultatifs, les privilèges requis, la relaxation AppArmor ou seccomp et l'accès à l'espace de noms PID hôte sont traités comme des cas distincts, et non sous une seule étiquette privilégiée générique. Chaque option présentant un risque est expliquée et confirmée lors de l'installation."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "OCI manager Apps | ProxMenux",
|
||||
"description": "Exécutez des images OCI officielles dans des conteneurs LXC natifs de Proxmox VE, avec des données persistantes, l’accès aux périphériques, des applications à plusieurs conteneurs et des mises à jour transactionnelles."
|
||||
},
|
||||
"header": {
|
||||
"title": "OCI manager Apps",
|
||||
"description": "Les images OCI officielles s’exécutent dans des conteneurs LXC natifs de Proxmox VE. L’image reste celle publiée par son mainteneur ; ProxMenux reproduit l’environnement que Docker Compose aurait créé autour d’elle.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "model",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Une image OCI, un LXC natif",
|
||||
"body": "Aucun moteur Docker ne s’exécute dans les conteneurs. Proxmox VE importe le système de fichiers de l’image et ses métadonnées OCI. L’application devient le processus principal d’un LXC natif, administré avec les mêmes outils que les autres conteneurs du nœud."
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Source",
|
||||
"detail": "Image OCI\nCompose et documentation"
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux",
|
||||
"detail": "Contrat JSON\nvalidation et planification"
|
||||
},
|
||||
{
|
||||
"label": "Proxmox VE",
|
||||
"detail": "LXC natif\nvolumes et périphériques"
|
||||
}
|
||||
],
|
||||
"caption": "L’application d’origine est conservée : son environnement est décrit de façon déclarative, puis reproduit."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "where",
|
||||
"title": "Où le trouver",
|
||||
"intro": "Sur le nœud Proxmox, en tant que root, ouvrez <strong>OCI manager Apps (Technology Preview)</strong> dans le menu principal de ProxMenux. Le premier écran propose :",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"<strong>Rechercher des applications</strong> : rechercher par nom dans tout le catalogue.",
|
||||
"<strong>Toutes les applications</strong> : afficher le catalogue complet et le nombre d’applications.",
|
||||
"<strong>Gérer les applications OCI installées</strong> : mettre à jour, modifier, supprimer ou récupérer les applications déjà installées.",
|
||||
"<strong>Comptes de registres</strong> : gérer les comptes utilisés pour installer et mettre à jour des images provenant de registres privés.",
|
||||
"<strong>Installer une image absente du catalogue</strong> : adapter un fichier Compose, une commande <code>docker run</code> ou une référence d’image.",
|
||||
"Les catégories du catalogue, chacune avec son nombre d’applications."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/main-menu.png",
|
||||
"alt": "Écran principal d’OCI manager Apps avec recherche, catalogue complet, gestion des applications, images hors catalogue et catégories.",
|
||||
"caption": "Écran principal d’OCI manager Apps."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "La sélection d’une application affiche sa description, l’image utilisée et deux modes d’installation. <strong>Installer avec les paramètres par défaut</strong> ne application que les choix essentiels : stockage, emplacement des données, adresse et démarrage. <strong>Installer avec les paramètres avancés</strong> présente toutes les décisions dans l’ordre : VMID et ressources, stockage de chaque chemin, pont réseau et périphériques."
|
||||
},
|
||||
{
|
||||
"p": "Les applications effectivement testées affichent <strong>Vérifié</strong> dans cette vue et portent un ✓ dans les listes, que le test ait été effectué dans le laboratoire ProxMenux ou par la communauté."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "beta",
|
||||
"title": "Pourquoi le label Technology Preview est conservé",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "OCI manager Apps conserve le label <strong>Technology Preview</strong> que Proxmox VE attribue aux conteneurs d’applications créés à partir d’images OCI, dont la prise en charge a été introduite dans Proxmox VE 9.1. Ce label concerne la technologie sur laquelle repose OCI manager Apps, et non le moteur de ProxMenux : le comportement de ces conteneurs peut encore changer entre les versions de Proxmox VE. Le label restera en place jusqu’à ce que Proxmox VE considère cette prise en charge comme stable."
|
||||
},
|
||||
{
|
||||
"p": "Le moteur d’OCI manager Apps est testé dans le laboratoire ProxMenux : installation, mise à jour, modification, recréation, sauvegarde, restauration, migration et watchdog. Chaque application est vérifiée séparément. Celles qui ont été effectivement testées affichent <strong>Vérifié</strong> et portent un ✓ dans les listes."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "translation",
|
||||
"title": "Comment Docker décrit les besoins et comment OCI manager Apps les applique",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Besoin",
|
||||
"Expression dans Docker",
|
||||
"Mise en œuvre par OCI manager Apps"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Exécuter l’application",
|
||||
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
|
||||
"Le rootfs OCI et le processus principal du LXC"
|
||||
],
|
||||
[
|
||||
"Conserver la configuration",
|
||||
"<code>volumes: /config</code>",
|
||||
"Un volume persistant <code>mpN</code> inclus dans la sauvegarde, ou un répertoire de l’hôte."
|
||||
],
|
||||
[
|
||||
"Rendre le service accessible",
|
||||
"<code>ports</code>",
|
||||
"Une adresse propre au LXC et l’URL d’accès au service."
|
||||
],
|
||||
[
|
||||
"Utiliser du matériel",
|
||||
"<code>devices</code>, <code>group_add</code>",
|
||||
"Des entrées <code>devN</code> avec le GID effectif de l’hôte et un profil validé."
|
||||
],
|
||||
[
|
||||
"Relier les dépendances",
|
||||
"<code>networks</code>, <code>depends_on</code>",
|
||||
"Un pont réseau privé, des adresses fixes, un ordre de démarrage et des contrôles de bon fonctionnement."
|
||||
],
|
||||
[
|
||||
"Mettre à jour",
|
||||
"Télécharger avec <code>pull</code> et recréer",
|
||||
"Un nouveau rootfs avec le même contrat de persistance."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "kept",
|
||||
"title": "Ce qui est conservé et ce qui change",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "archive",
|
||||
"title": "Conservé",
|
||||
"body": "L’image officielle, ses chemins internes, son environnement, son processus de démarrage et sa documentation d’utilisation."
|
||||
},
|
||||
{
|
||||
"icon": "boxes",
|
||||
"title": "Adapté",
|
||||
"body": "L’environnement d’exécution : le réseau, la persistance, les périphériques, les permissions et les dépendances utilisent les mécanismes LXC natifs de Proxmox VE."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Sans équivalent",
|
||||
"body": "Une option Compose sans équivalent sûr est signalée comme un point bloquant. Les modèles comportant des points bloquants ne sont pas proposés à l’installation, et les options sensibles doivent être confirmées pendant l’assistant."
|
||||
},
|
||||
{
|
||||
"icon": "refresh",
|
||||
"title": "Enregistré",
|
||||
"body": "Le digest de l’image, les ressources, les chemins, le réseau, les périphériques et l’appartenance à une pile sont enregistrés dans le contrat de l’instance. Les mises à jour et les recréations reproduisent ce contrat."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "pages",
|
||||
"title": "Pages de cette section",
|
||||
"blocks": [
|
||||
{
|
||||
"next": {
|
||||
"items": [
|
||||
{
|
||||
"label": "Comment une image OCI est adaptée",
|
||||
"href": "/docs/oci-manager/architecture",
|
||||
"tail": "De l’image et de son fichier Compose à un LXC natif."
|
||||
},
|
||||
{
|
||||
"label": "Installer une image absente du catalogue",
|
||||
"href": "/docs/oci-manager/custom-image",
|
||||
"tail": "Un fichier Compose, une commande docker run ou une référence d’image."
|
||||
},
|
||||
{
|
||||
"label": "Données, chemins et réseau",
|
||||
"href": "/docs/oci-manager/storage-network",
|
||||
"tail": "Volumes du conteneur, répertoires de l’hôte, montages rclone et adresses."
|
||||
},
|
||||
{
|
||||
"label": "Périphériques et accélération",
|
||||
"href": "/docs/oci-manager/hardware",
|
||||
"tail": "GPU, NVIDIA, Coral, USB et autres périphériques."
|
||||
},
|
||||
{
|
||||
"label": "Applications à plusieurs conteneurs",
|
||||
"href": "/docs/oci-manager/stacks",
|
||||
"tail": "Application, base de données et cache dans des LXC coordonnés."
|
||||
},
|
||||
{
|
||||
"label": "Installer, mettre à jour et modifier",
|
||||
"href": "/docs/oci-manager/lifecycle",
|
||||
"tail": "Le contrat de l’instance et ses opérations."
|
||||
},
|
||||
{
|
||||
"label": "Dans ProxMenux Monitor",
|
||||
"href": "/docs/oci-manager/monitor",
|
||||
"tail": "Versions, mises à jour, sortie console et terminal."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,499 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Installer, mettre à jour et modifier | ProxMenux",
|
||||
"description": "Le contrat d'instance d'un conteneur OCI et les opérations qui s'appuient dessus : mise à jour, modification, suppression, reprise d'une opération interrompue et remise en service après une restauration sur cet hôte ou un autre."
|
||||
},
|
||||
"header": {
|
||||
"title": "Installer, mettre à jour et modifier",
|
||||
"description": "Chaque instance conserve un contrat reproductible, ce qui permet de remplacer son rootfs sans perdre sa configuration ni ses données persistantes.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "contract",
|
||||
"title": "Le contrat d'instance",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Après l'installation, la configuration effective est enregistrée dans <code>/usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json</code>. Il ne s'agit pas d'une copie du fichier Compose d'origine : c'est le contrat reproductible du LXC présent sur cet hôte."
|
||||
},
|
||||
{
|
||||
"code": {
|
||||
"code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Une copie du contrat est conservée dans le conteneur, dans <code>/.proxmenux/oci-record.json</code>, et seul l'utilisateur root du conteneur peut la lire. Une sauvegarde du conteneur emporte donc toujours le contrat en vigueur au moment de la sauvegarde. Une seconde copie est conservée dans <code>/etc/pve/priv/proxmenux/oci</code>, un emplacement partagé par tous les nœuds du cluster et lisible uniquement par root sur l'hôte. Les deux copies sont écrites après chaque installation, mise à jour et modification."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "manage",
|
||||
"title": "Gérer les applications OCI installées",
|
||||
"intro": "Cette option de l'écran principal liste les instances enregistrées avec leur application et image. Chacun d'eux est vérifié par rapport à son contrat avant toute action; un CT qui ne correspond plus à son enregistrement n'est ni modifié ni supprimé. La même mise à jour et le même éditeur sont proposés dans l'onglet Mises à jour de <monitorLink>ProxMenux Monitor</monitorLink>.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Option",
|
||||
"Ce qui change",
|
||||
"Ce qui est gardé"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Mettre à jour l'image avec la configuration enregistrée",
|
||||
"Le rootfs est remplacé par l'image actuellement publiée sur le canal enregistré",
|
||||
"Contrat, disques de conteneur, répertoires hôtes, réseau et appareils"
|
||||
],
|
||||
[
|
||||
"Modifier : éditer les ressources, le réseau, les chemins et le GPU",
|
||||
"L'éditeur s'ouvre avec le contrat actuel; le CT est reconstruit avec les modifications",
|
||||
"Les données des disques de conteneur et des répertoires hôtes"
|
||||
],
|
||||
[
|
||||
"Watchdog : redémarrer l'application lorsqu'elle plante",
|
||||
"Détermine si l'application est relancée lorsqu'elle s'arrête d'elle-même. Rien n'est reconstruit",
|
||||
"L'ensemble de l'installation ; seul le choix est sauvegardé dans le contrat"
|
||||
],
|
||||
[
|
||||
"Supprimer: supprimer l'application et ses conteneurs",
|
||||
"Le LXC, ou chaque membre d'une pile, et leurs contrats sont supprimés",
|
||||
"Répertoires hôtes, avec leur contenu"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Pour une application à plusieurs conteneurs, le menu propose <strong>Mettre à jour tous les conteneurs de l'application</strong>, <strong>Modifier les chemins et périphériques supplémentaires</strong>, <strong>Recréer tous les conteneurs avec leur configuration enregistrée</strong>, le watchdog et la suppression. Modifier ajoute ou supprime les chemins et périphériques supplémentaires du conteneur applicatif sans rien reconstruire et, pour Immich, change le composant qui exécute la reconnaissance. Recréer reconstruit chaque conteneur à partir de l'image utilisée lors de son installation, sans en chercher une plus récente."
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/manage-menu.png",
|
||||
"alt": "Liste des applications OCI installées, avec les options de mise à jour, de modification et de suppression",
|
||||
"caption": "Gérer les applications OCI installées."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "update",
|
||||
"title": "Une mise à jour transactionnelle",
|
||||
"blocks": [
|
||||
{
|
||||
"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",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Lorsque le registre sert encore le digest installé, rien n'est téléchargé et l'instance n'est pas touchée.",
|
||||
"La nouvelle image est vérifiée couche par couche avant l'arrêt du CT. Un téléchargement qui arrive endommagé est récupéré une deuxième fois ; une image déjà mise en cache qui échoue la vérification est à nouveau téléchargée.",
|
||||
"Les paramètres modifiés dans Proxmox VE après l'installation (mémoire, swap, cœurs, limite et priorité du CPU, démarrage avec le nœud) sont conservés et intégrés au nouveau contrat.",
|
||||
"L'interface LAN ajoutée par la suite Arr et les applications à plusieurs conteneurs (<code>net1</code>), ainsi que l'ordre de démarrage (<code>startup</code>), sont réappliqués tels quels au nouveau conteneur.",
|
||||
"Toute autre différence entre le CT et son contrat arrête la mise à jour avant que le CT ne soit arrêté."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Avant",
|
||||
"detail": "rootfs A\n/config mp0\n/media répertoire de l’hôte"
|
||||
},
|
||||
{
|
||||
"label": "Mise à jour",
|
||||
"detail": "remplace uniquement\nle rootfs"
|
||||
},
|
||||
{
|
||||
"label": "Après",
|
||||
"detail": "rootfs B\n/config mp0\n/media répertoire de l’hôte"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Avant tout arrêt, l'opération vérifie l'espace nécessaire à la sauvegarde : les données utilisées sur les volumes inclus, plus une marge. La sauvegarde est écrite à côté de l'enregistrement de l'application, sur le disque système de l'hôte. Si l'espace y est insuffisant, le menu demande un autre stockage de l'hôte acceptant les sauvegardes. La sauvegarde y est créée puis supprimée à la fin de l'opération. Ce choix est mémorisé pour l'application, y compris pour les mises à jour planifiées. Si aucun stockage n'a assez de place, l'opération est refusée et l'application reste inchangée. L'espace nécessaire à la nouvelle image est également vérifié avant son téléchargement."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "recovery",
|
||||
"title": "Récupération d'une opération interrompue",
|
||||
"intro": "Une mise à jour et un changement utilisent une transaction persistante. Si le processus, le terminal ou le nœud est interrompu après l'arrêt du CT, l'opération n'est pas prise comme terminée.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Marqueur en attente",
|
||||
"body": "À l'ouverture de Gérer les applications OCI installées, l'état enregistré indique que le remplacement n'a jamais été publié."
|
||||
},
|
||||
{
|
||||
"title": "Afficher l’état",
|
||||
"body": "Affiche la phase qui a été atteinte sans changer de conteneur ou de données."
|
||||
},
|
||||
{
|
||||
"title": "Récupérer l'installation précédente",
|
||||
"body": "Restaure la sauvegarde native vérifiée réalisée avant le remplacement, ainsi que le contrat précédent."
|
||||
},
|
||||
{
|
||||
"title": "Piles traitées comme une unité",
|
||||
"body": "Pour une application multi-conteneurs, chaque membre est récupéré du même point de transaction, pas seulement celui sélectionné."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Les répertoires de l’hôte sont exclus du retour arrière",
|
||||
"body": "La sauvegarde couvre le rootfs et les disques du conteneur qui y sont inclus. Un répertoire de l’hôte n’est pas rétabli à son état précédent, car d’autres LXC peuvent utiliser ses données."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "watchdog",
|
||||
"title": "Watchdog: redémarrer une application qui s'arrête",
|
||||
"intro": "Proxmox n'a pas de politique de redémarrage : quand le processus d'un conteneur applicatif se termine, le conteneur reste arrêté. Si le watchdog est activé, une application qui s'arrête d'elle-même est relancée. Il joue pour une application OCI le rôle de <code>restart: unless-stopped</code> dans un fichier Compose.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Ce qui se passe",
|
||||
"Avec le watchdog activé"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"L’application plante ou son processus se termine",
|
||||
"Le conteneur est relancé en quelques secondes"
|
||||
],
|
||||
[
|
||||
"Il est arrêté ou éteint depuis Proxmox, depuis le Monitor ou avec <code>pct</code>",
|
||||
"Il reste arrêté jusqu’à ce que quelqu’un le démarre"
|
||||
],
|
||||
[
|
||||
"Une sauvegarde, une migration ou une opération ProxMenux travaille dessus",
|
||||
"Rien n'est fait jusqu'à la fin"
|
||||
],
|
||||
[
|
||||
"Il était déjà arrêté au démarrage de l’hôte",
|
||||
"Il reste arrêté ; cela dépend de <strong>Démarrer avec Proxmox</strong>"
|
||||
],
|
||||
[
|
||||
"Il s’arrête systématiquement juste après son démarrage",
|
||||
"Pour une application qui s’arrête quelques secondes après son démarrage ou qui ne démarre pas, cinq tentatives sont effectuées, séparées par des délais de 30 secondes, 1, 2 et 5 minutes. Elle reste ensuite arrêtée et une notification est envoyée"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "L'installateur pose la question dans les deux modes d'installation et propose la valeur déclarée par la recette de l'application. Ce réglage peut ensuite être modifié dans <strong>Gérer les applications OCI installées</strong> ou avec le commutateur <strong>Watchdog</strong> du conteneur dans <monitorLink>ProxMenux Monitor</monitorLink>. Il s'applique à tous les conteneurs d'une application à plusieurs conteneurs. Un seul service de l'hôte, <code>proxmenux-oci-watchdog.service</code>, surveille les applications pour lesquelles il est activé ; son installation figure dans l'onglet Modifications d'Audit & Report."
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Ce que l'hôte ne peut pas dire",
|
||||
"body": "Le code de sortie de l'application ne parvient pas à l'hôte. Un arrêt normal et un plantage sont donc indiscernables et entraînent tous deux un redémarrage, comme avec <code>always</code> et <code>unless-stopped</code> dans Docker. Un arrêt demandé en dehors de Proxmox, avec <code>lxc-stop</code> ou <code>systemctl</code>, ne laisse aucune tâche d'arrêt et est interprété comme un arrêt spontané."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "restore",
|
||||
"title": "Sauvegarde, restauration et un autre hôte",
|
||||
"intro": "Une sauvegarde réalisée avec vzdump ou Proxmox Backup Server contient le conteneur, les disques du conteneur sélectionnés pour la sauvegarde et la copie de son contrat. Les éléments conservés par l'installation sur l'hôte n'en font pas partie. <strong>Gérer les applications OCI installées</strong> détecte les conteneurs restaurés sur un hôte dépourvu de leur contrat, après une nouvelle installation de Proxmox ou sur un autre hôte, et propose de les enregistrer à nouveau.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Restaurer les conteneurs dans Proxmox",
|
||||
"body": "Depuis le stockage de sauvegarde, avec l’ID d’origine ou tout autre ID libre. Une application à plusieurs conteneurs nécessite tous ses conteneurs."
|
||||
},
|
||||
{
|
||||
"title": "Ouvrir la gestion des applications OCI installées",
|
||||
"body": "Les conteneurs restaurés sont listés et la récupération est proposée. Le bouton <strong>Récupérer</strong> de l’onglet Mises à jour de <monitorLink>ProxMenux Monitor</monitorLink> ouvre la même récupération."
|
||||
},
|
||||
{
|
||||
"title": "Vérifier avant de changer",
|
||||
"body": "La récupération vérifie que l'hôte a tout ce dont chaque application a besoin. Une application qui ne peut pas être récupérée entière est laissée comme elle a été trouvée, avec la raison."
|
||||
},
|
||||
{
|
||||
"title": "Enregistrer et démarrer",
|
||||
"body": "Le contrat est enregistré sur cet hôte et les éléments que l'installation y conservait sont réécrits. Le démarrage des applications fait l'objet d'une question distincte, à laquelle il faut répondre Non si les conteneurs d'origine fonctionnent encore sur un autre hôte."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"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": [
|
||||
"Ce que l'hôte a gardé",
|
||||
"Après la récupération"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Contrat d’instance",
|
||||
"Enregistré à partir de la copie conservée dans le conteneur et vérifié par rapport à la configuration restaurée par Proxmox"
|
||||
],
|
||||
[
|
||||
"Réseau privé d'une application multiconteneurs",
|
||||
"Recréé avec le même pont et sous-réseau ; les adresses fixes des conteneurs ne changent pas"
|
||||
],
|
||||
[
|
||||
"Ordre de démarrage d'une application multi-conteneurs",
|
||||
"Le hookscript de dépendance et son contrat sont à nouveau installés ; les extraits sont activés sur le stockage <code>local</code> quand aucun stockage ne les accepte"
|
||||
],
|
||||
[
|
||||
"Sysctls réseau et fichier host-monitor",
|
||||
"Ecrit à nouveau en <code>/etc/pve/proxmenux</code>"
|
||||
],
|
||||
[
|
||||
"Environnement d’exécution NVIDIA",
|
||||
"Le hook d’un conteneur non privilégié est réinstallé. Un conteneur privilégié reçoit les fichiers de pilote de cet hôte à la place de ceux de son hôte d’origine"
|
||||
],
|
||||
[
|
||||
"Rclone montage",
|
||||
"Le hookscript et les programmes qui publient le montage sont à nouveau écrits, avec les mêmes vues sur l'hôte"
|
||||
],
|
||||
[
|
||||
"Règle du pare-feu d'un moniteur hôte",
|
||||
"Une nouvelle confirmation est demandée pour son port web et le sous-réseau du pont sur cet hôte"
|
||||
],
|
||||
[
|
||||
"<code>lost+found</code> de chaque disque restauré",
|
||||
"Supprimé s’il est vide ; une restauration le crée et certaines applications ne démarrent pas s’il figure dans leurs données"
|
||||
],
|
||||
[
|
||||
"Disques restaurés sur un autre stockage",
|
||||
"Le contrat est mis à jour pour refléter le stockage sur lequel ils se trouvent maintenant"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Un conteneur restauré avec un autre ID conserve son application. Le contrat, son journal de console, ses paramètres sysctl réseau, le hookscript d'un montage Rclone et l'ordre de démarrage d'une application à plusieurs conteneurs sont enregistrés avec les ID des conteneurs sur cet hôte."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Ce qui empêche une récupération",
|
||||
"Que faire"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Il manque un conteneur d'une application multiconteneurs",
|
||||
"Restaurer aussi; l'application est récupérée entière"
|
||||
],
|
||||
[
|
||||
"Le sous-réseau privé est déjà utilisé sur cet hôte",
|
||||
"La récupération est annulée et rien n’est modifié : les adresses des conteneurs sont fixes et ne sont pas déplacées vers un autre sous-réseau"
|
||||
],
|
||||
[
|
||||
"Un répertoire hôte n'existe pas",
|
||||
"Monter ou créer avec ses données; une sauvegarde du conteneur n'inclut pas les répertoires hôtes"
|
||||
],
|
||||
[
|
||||
"Un périphérique n'existe pas sur cet hôte",
|
||||
"Connectez-le ou retirez-le du conteneur dans Proxmox"
|
||||
],
|
||||
[
|
||||
"Une application avec NVIDIA sur un hôte sans pilote",
|
||||
"Installez le pilote NVIDIA et le Container Toolkit"
|
||||
],
|
||||
[
|
||||
"La sauvegarde a été effectuée avant l'existence de la copie du contrat",
|
||||
"Le conteneur reste en tant que LXC ordinaire et n'est pas offert à nouveau"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"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."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "remove",
|
||||
"title": "Supprimer une application OCI",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Avant la confirmation, un résumé est établi à partir de la configuration réelle : les conteneurs supprimés, les données supprimées avec eux, le réseau privé libéré et les répertoires de l’hôte conservés. La réponse par défaut est <strong>Non</strong>, car les données des disques supprimés ne pourront pas être récupérées ensuite."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Ressource",
|
||||
"À la suppression",
|
||||
"Motifs"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"rootfs et disques du conteneur",
|
||||
"Supprimés",
|
||||
"Ils appartiennent seulement au conteneur"
|
||||
],
|
||||
[
|
||||
"Répertoire de l'hôte",
|
||||
"Conservé, avec son contenu",
|
||||
"D'autres applications peuvent l'utiliser"
|
||||
],
|
||||
[
|
||||
"Fichiers hôtes du conteneur",
|
||||
"Supprimés",
|
||||
"Son journal de console, ses paramètres sysctl réseau, le hookscript du montage Rclone et son inscription dans l’onglet App de ProxMenux Monitor ne servent à aucun autre conteneur"
|
||||
],
|
||||
[
|
||||
"Fichiers partagés par plusieurs installations",
|
||||
"Supprimé avec la dernière installation qui les utilise",
|
||||
"Le fichier de surveillance de l’hôte et le hookscript des dépendances des applications à plusieurs conteneurs"
|
||||
],
|
||||
[
|
||||
"Contrat d’instance",
|
||||
"Supprimé après une suppression réussie",
|
||||
"Aucun CT ne lui est plus associé"
|
||||
],
|
||||
[
|
||||
"Pont privé d'une pile",
|
||||
"Relâché avec la pile",
|
||||
"Il n'y a plus de membres pour se connecter"
|
||||
],
|
||||
[
|
||||
"Réseau partagé par la suite Arr",
|
||||
"Libéré lors de la suppression de la dernière application de la suite",
|
||||
"Chaque application de la suite est indépendante et se supprime séparément"
|
||||
],
|
||||
[
|
||||
"Un seul membre d'une pile",
|
||||
"Non enlevé seul",
|
||||
"Toute l'application est retirée, donc aucune pile n'est laissée incomplète"
|
||||
],
|
||||
[
|
||||
"Un conteneur sur un autre noeud du cluster",
|
||||
"Non enlevé",
|
||||
"Son enregistrement et ses fichiers sur l’hôte se trouvent sur le nœud où il a été installé : il faut le supprimer là-bas, après l’y avoir remigré"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/remove-summary.png",
|
||||
"alt": "Résumé de suppression avec les conteneurs, les données et les répertoires hôtes touchés",
|
||||
"caption": "Le résumé de suppression, construit à partir de la configuration réelle."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "archives",
|
||||
"title": "Images téléchargées et espace hôte",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "L’archive OCI sert à construire le rootfs ; le CT en cours d’exécution ne la lit pas. Après une installation ou une mise à jour, les archives téléchargées pendant cette opération sont listées avec leur taille et leur suppression est proposée. Les supprimer libère de l’espace sans affecter le conteneur ni ses données."
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Les mises à jour ne nécessitent pas l'archive",
|
||||
"body": "Sans l'archive, une mise à jour résout le canal enregistré et télécharge le nouveau digest. Avec elle, une archive n'est réutilisée que lorsque sa référence et son intégrité correspondent à ce qui est demandé."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "registry",
|
||||
"title": "Registre et nettoyage",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "À l'ouverture de <strong>Gérer les applications OCI installées</strong>, les restes des conteneurs absents de tous les nœuds du cluster sont d'abord supprimés : l'enregistrement conservé comme historique après une suppression depuis l'interface Proxmox, et les fichiers de l'hôte laissés par une suppression. Un enregistrement lié à une opération interrompue est conservé, car sa sauvegarde peut encore être nécessaire. Les volumes et répertoires de l'hôte ne sont jamais supprimés par déduction."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cluster",
|
||||
"title": "Dans un cluster : migration et haute disponibilité",
|
||||
"intro": "Un conteneur OCI est un LXC Proxmox ordinaire : il peut être migré ou géré par HA comme les autres, avec les mêmes limites. Les éléments nécessaires à son démarrage sont conservés à un emplacement accessible à tous les nœuds du cluster.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Partie",
|
||||
"Sur un autre noeud du cluster"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Journal de console",
|
||||
"Le conteneur crée <code>/var/log/proxmenux/oci</code> avant de démarrer, quel que soit le nœud qui l’exécute. Chaque nœud conserve le journal des démarrages qu’il a effectués."
|
||||
],
|
||||
[
|
||||
"Paramètres sysctl réseau et surveillance de l’hôte",
|
||||
"Conservés dans <code>/etc/pve/proxmenux</code>, partagé par tous les nœuds du cluster, afin qu’un conteneur migré les retrouve."
|
||||
],
|
||||
[
|
||||
"Disques du conteneur",
|
||||
"Proxmox les déplace avec le conteneur. HA nécessite que leurs données soient disponibles sur le nœud cible, via un stockage partagé ou une configuration de réplication prise en charge."
|
||||
],
|
||||
[
|
||||
"Répertoires et périphériques de l'hôte",
|
||||
"Les mêmes règles que n'importe quel LXC : un répertoire hôte doit exister sur le nœud cible et être marqué comme partagé, et un GPU, Coral ou NPU doit y être présent."
|
||||
],
|
||||
[
|
||||
"Enregistrement ProxMenux",
|
||||
"Le contrat reste sur le nœud où l'application a été installée, et chaque nœud lit la copie conservée dans <code>/etc/pve/priv/proxmenux/oci</code>. Une application à un seul conteneur est enregistrée sur son nœud de destination après migration lors de l'ouverture de <strong>Gérer les applications OCI installées</strong> ou du lancement d'une opération la concernant. Une application à plusieurs conteneurs y est proposée à la récupération, car son réseau privé doit être créé sur ce nœud."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Pas pour une disponibilité élevée",
|
||||
"body": "Une application à plusieurs conteneurs relie ses membres par un pont privé du nœud sur lequel elle a été installée ; ses membres restent donc sur ce nœud. Un outil de surveillance de l’hôte, comme Glances en mode hôte ou Netdata, surveille le nœud qui l’exécute ; le déplacer reviendrait à surveiller un autre nœud."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Une sauvegarde restaurée à l'extérieur du cluster obtient les fichiers de <code>/etc/pve/proxmenux</code> que le conteneur utilise lorsque l'application est récupérée."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "channel",
|
||||
"title": "Une étiquette évolutive n’est pas une mise à jour sans surveillance",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Le catalogue installe l’étiquette évolutive publiée par son responsable, mais le digest effectif est résolu et enregistré, puis modifié uniquement lors d’une mise à jour explicite avec contrôles préalables et retour arrière. <monitorLink>ProxMenux Monitor</monitorLink> compare le digest installé à celui publié par le registre et affiche une indication et une notification lorsqu’une nouvelle image est disponible."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Conteneurs OCI dans ProxMenux Monitor | ProxMenux",
|
||||
"description": "Ce que ProxMenux Monitor montre pour un conteneur installé par OCI Manager Apps : versions d'applications et d'images, nouvelles images, sortie console et terminal Proxmox VE."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dans ProxMenux Monitor",
|
||||
"description": "Un conteneur installé par OCI Manager Apps apparaît dans VMs & LXCs comme n'importe quel autre LXC. Sa fenêtre modale lit l'enregistrement d'installation : versions d'application et d'image, nouvelles images, sortie console et terminal.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "L'enregistrement est la source",
|
||||
"body": "OCI manager Apps connaît l’application installée et sa provenance. Le Monitor lit cet enregistrement d’installation au lieu de rechercher l’application dans le conteneur. Ces informations restent donc disponibles que le conteneur fonctionne ou soit arrêté."
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"onglet",
|
||||
"Ce qui change pour un conteneur OCI"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"État",
|
||||
"Un commutateur <strong>Watchdog</strong> sous Démarrer au démarrage: l'application est redémarrée quand elle s'arrête seule"
|
||||
],
|
||||
[
|
||||
"Application",
|
||||
"L'application est identifiée à partir du dossier et les mises à jour sont suivies par l'image"
|
||||
],
|
||||
[
|
||||
"Mises à jour",
|
||||
"L'image est mise à jour ou l'application modifiée, avec le même flux que le menu OCI"
|
||||
],
|
||||
[
|
||||
"Montages",
|
||||
"Disques de conteneurs et répertoires hôtes, avec leur utilisation"
|
||||
],
|
||||
[
|
||||
"Journaux",
|
||||
"Uniquement pour les conteneurs OCI : la sortie console de l'application"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app",
|
||||
"title": "Application",
|
||||
"intro": "L'onglet <appLink>App</appLink> offre l'application installée comme détection, avec le nom, le logo, le port et le schéma de l'enregistrement. L'enregistrer ouvre l'éditeur avec la méthode <strong>OCI image (installée par ProxMenux)</strong>, qui ne nécessite aucune configuration.",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "boxes",
|
||||
"title": "Application",
|
||||
"body": "La version de l'application à l'intérieur de l'image, lue à partir de l'image elle-même : son environnement ou son étiquette <code>org.opencontainers.image.version</code>. Cette information est indicative."
|
||||
},
|
||||
{
|
||||
"icon": "archive",
|
||||
"title": "Image",
|
||||
"body": "La date de construction et le digest de l'image installée. La mise à jour est décidée ici: le digest installé est comparé à celui que le registre publie aujourd'hui pour le même tag."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Lorsque le registre publie un nouveau digest, la carte affiche <strong>Nouvelle image</strong> avec sa date et son digest, même si la version de l'application à l'intérieur n'a pas changé: une reconstruction sur une base mise à jour est une mise à jour.",
|
||||
"Lorsque les digests correspondent, la carte lit <strong>Version</strong>.",
|
||||
"La carte relie au dépôt de l'image : son projet GitHub, ou sa page Docker Hub pour une image officielle.",
|
||||
"Le lien d'accès utilise l'adresse LAN du conteneur, également pour le membre principal d'une application multi-conteneurs, qui a une deuxième adresse sur son réseau privé.",
|
||||
"Le bouton <strong>Actualiser les données</strong> relit l’enregistrement et le registre des images. Les options de recherche ou d’enregistrement d’une autre application ne sont pas proposées : le conteneur contient exactement l’application de son enregistrement."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/monitor-app-tab.png",
|
||||
"alt": "Onglet App d'un conteneur OCI avec la version de l'application, l'image et le lien du dépôt",
|
||||
"caption": "Onglet Application d’un conteneur installé par OCI manager Apps."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "La vérification s'effectue une fois par jour avec les vérifications de mise à jour du moniteur, et <strong>Actualiser les données</strong> l'exécute immédiatement. Une nouvelle image est envoyée sous forme de notification via les canaux configurés dans <notificationsLink>Notifications</notificationsLink>. La mise à jour est appliquée depuis l'onglet Mises à jour."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "updates",
|
||||
"title": "Mises à jour",
|
||||
"intro": "Pour un conteneur installé par OCI manager Apps, l’onglet Mises à jour présente l’application avec son image installée et, si le registre en publie une, la nouvelle image, au même format que les autres applications. Les outils de mise à jour des paquets et applications d’un LXC ordinaire ne sont pas proposés.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Bouton",
|
||||
"Ce qu'il ouvre"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Mise à jour",
|
||||
"La mise à jour de <lifecycleLink>Gérer les applications OCI installées</lifecycleLink> pour ce conteneur, dans le terminal de Monitor. Elle peut être lancée avec ou sans nouvelle image ; sans nouvelle image, rien ne change. Pour une application multiconteneur, elle met à jour tous les membres."
|
||||
],
|
||||
[
|
||||
"Modifier",
|
||||
"L'éditeur de l'application (ressources, réseau, chemins et GPU). Dans une application multi-conteneurs, il ajoute ou supprime les chemins et périphériques supplémentaires du conteneur d'application et, dans Immich, modifie ce qui exécute la reconnaissance."
|
||||
],
|
||||
[
|
||||
"Récupérer",
|
||||
"Remplace Mise à jour quand une opération sur le conteneur a été interrompue, et ouvre sa récupération."
|
||||
],
|
||||
[
|
||||
"Récupérer (conteneur restauré)",
|
||||
"Affiché pour un conteneur restauré depuis une sauvegarde sans contrat sur cet hôte, sous <strong>Application OCI restaurée</strong>. Ouvre la <lifecycleLink>récupération</lifecycleLink> dans le terminal de Monitor ; Mettre à jour et Modifier apparaissent après son enregistrement."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Les modifications externes, les répertoires hôtes et les applications multiconteneurs sont traités comme dans le menu OCI. Dans une application multi-conteneurs, les boutons et les options apparaissent uniquement sur le conteneur principal; les autres membres montrent leur image, une note qu'ils sont mis à jour à partir du conteneur principal et un bouton qui l'ouvre. Lorsque le terminal se ferme, l'image, l'enregistrement et les montages sont à nouveau lus."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Option",
|
||||
"Comportement"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Conserver la sauvegarde prise avant la mise à jour",
|
||||
"Chaque mise à jour sauvegarde le conteneur pour le restaurer si la mise à jour échoue. Avec cette option, la même sauvegarde est conservée dans le stockage choisi et apparaît parmi les sauvegardes du CT; sur Proxmox Backup Server une sauvegarde est écrite avant la mise à jour."
|
||||
],
|
||||
[
|
||||
"Mises à jour programmées",
|
||||
"L’image n’est mise à jour à l’heure choisie que si le registre en publie une nouvelle, avec la possibilité d’attendre qu’elle ait 1, 3, 7 ou 14 jours. Un conteneur modifié en dehors de ProxMenux est ignoré et signalé."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "logs",
|
||||
"title": "Journaux",
|
||||
"intro": "L'onglet Logs n'apparaît que pour les conteneurs installés par l'OCI Manager Apps, entre Montages et Sauvegardes. Il montre la sortie standard et l'erreur du processus principal de l'image, la même sortie <code>docker logs</code> affiche pour un conteneur Docker.",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"La sortie est conservée sur l'hôte dans <code>/var/log/proxmenux/oci/VMID.console.log</code> (mode 0600), dès le premier démarrage et sur les redémarrages, de sorte qu'il peut être lu avec le conteneur arrêté.",
|
||||
"Le fichier est tourné à 10 MB, en conservant trois copies compressées (<code>/etc/logrotate.d/proxmenux-oci</code>).",
|
||||
"Chaque démarrage du conteneur est marqué dans la sortie. L'onglet affiche la sortie depuis le dernier démarrage par défaut; <strong>L'historique complet</strong> montre également les précédents.",
|
||||
"Lorsque l'application est supprimée, sa sortie est supprimée avec elle.",
|
||||
"Les 100, 500 ou 1000 dernières lignes sont affichées. Quand le conteneur fonctionne, les nouvelles lignes sont suivies en direct ; faire défiler vers le haut met le suivi en pause et <strong>Suivre</strong> le reprend.",
|
||||
"Un filtre n'indique que les lignes qui contiennent un texte, et <strong>Télécharger</strong> enregistre les lignes chargées.",
|
||||
"Les codes de couleur sont supprimés et une ligne qu'une barre de progression redessine est affichée dans son état final.",
|
||||
"L’onglet relit le fichier à chaque ouverture, sans mise en cache."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Identifiants du premier démarrage",
|
||||
"body": "Les images qui impriment un mot de passe généré sur leur premier démarrage le laissent dans cette sortie, comme le fait <code>docker logs</code>. L'installateur le lit à partir de là pour le montrer dans son résumé."
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/monitor-logs-tab.png",
|
||||
"alt": "Onglet Logs avec la sortie console d'un conteneur OCI, le sélecteur de ligne, le filtre et le bouton suivant",
|
||||
"caption": "Sortie de console d'un conteneur OCI."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "terminal",
|
||||
"title": "Console Proxmox VE",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Une image OCI exécute son propre processus comme PID 1 et aucun service de connexion, de sorte que la console par défaut d'un LXC ouvrirait un terminal où rien ne répond. Les conteneurs installés par OCI Manager Apps sont créés avec <code>cmode: shell</code> : la console Proxmox VE ouvre un shell avec <code>lxc-attach</code>, l'équivalent de <code>docker exec</code>, avec l'application en cours d'exécution intacte."
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Le shell est celui attribué à root dans l’image par <code>/etc/passwd</code>. Si root n’a pas de shell ou si l’image n’en contient aucun, la console par défaut est conservée.",
|
||||
"Le shell s’exécute en tant que root dans le conteneur, sans mot de passe. Qui peut l'ouvrir est décidé par la permission <code>VM.Console</code> de Proxmox VE.",
|
||||
"Le terminal du moniteur entre dans le conteneur avec <code>pct enter</code>, qui fonctionne de la même manière."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mounts",
|
||||
"title": "Montages",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "L'onglet <mountsLink>Mounts</mountsLink> énumère les disques de conteneur et les répertoires hôtes du conteneur. L'utilisation d'un disque de conteneur sur le stockage de blocs comme LVM-thin est lue à partir du système de fichiers du disque, qui est monté uniquement à l'intérieur du conteneur."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,404 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Applications multiconteneurs ProxMenux",
|
||||
"description": "Comment OCI manager Apps transforme une application avec sa base de données et cache en LXC natifs coordonnés: plan, réseau privé, crochet de dépendance, validation et mises à jour transactionnelles."
|
||||
},
|
||||
"header": {
|
||||
"title": "Applications à plusieurs conteneurs",
|
||||
"description": "Une application avec sa base de données, cache et d'autres services devient plusieurs LXC natifs coordonnés, installés et mis à jour comme un seul.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Une application pour l'utilisateur, plusieurs LXC pour Proxmox VE",
|
||||
"body": "Une définition multi-conteneurs est une entrée du catalogue. L'installateur crée un LXC natif par service et garde leurs dépendances explicites. Immich, Nextcloud, Paperless-ngx et Tandoor sont installés de cette façon."
|
||||
}
|
||||
},
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}<br/>{{appNet}}\"]\n O --> D[\"{{db}}<br/>{{private}}\"]\n O --> R[\"{{cache}}<br/>{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A",
|
||||
"labels": {
|
||||
"plan": "Plan de la pile",
|
||||
"app": "Application LXC",
|
||||
"appNet": "LAN + privé",
|
||||
"db": "PostgreSQL LXC",
|
||||
"cache": "Valkey LXC",
|
||||
"private": "privé"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "plan",
|
||||
"title": "1. Le plan, avant l'existence d'un conteneur",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Aucun LXC n'est créé pendant que la définition Compose est interprétée. Un plan complet vient en premier, avec chaque membre, image, VMID, réseau, chemin, secret, ordre et bilan de santé. Si le plan n'est pas cohérent, l'installation ne démarre pas."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Élément du plan",
|
||||
"Contenu",
|
||||
"Vérification avant de créer quelque chose"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Membres",
|
||||
"Application principale, base de données, cache, apprentissage automatique et autres dépendances",
|
||||
"VMID uniques, rôles connus et exactement un membre principal"
|
||||
],
|
||||
[
|
||||
"Images",
|
||||
"Référence roulante, architecture et digest résolu de chaque service",
|
||||
"Toutes existent, prennent en charge l’architecture et réussissent la vérification d’intégrité OCI"
|
||||
],
|
||||
[
|
||||
"Réseau",
|
||||
"Pont privé, sous-net, une adresse fixe par service et accès au réseau local pour le membre principal",
|
||||
"Aucune collision avec des ponts ou sous-réseaux existants et aucune adresse répétée"
|
||||
],
|
||||
[
|
||||
"Persistance",
|
||||
"Disques de conteneur, répertoires hôtes, propriétaires et sauvegarde",
|
||||
"Aucun chemin de chevauchement, stockage disponible et autorisations déclarées"
|
||||
],
|
||||
[
|
||||
"Secrets",
|
||||
"Mot de passe de la base de données, clés d'application et identifiants initiaux",
|
||||
"Généré une fois et donné seulement aux membres qui les utilisent"
|
||||
],
|
||||
[
|
||||
"Cycle de vie",
|
||||
"Ordre de départ, ordre d'arrêt et bilan de santé par membre",
|
||||
"L'application principale démarre en dernier et s'arrête en premier"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "create",
|
||||
"title": "2. Création, membre par membre",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Réserve tous les VMID",
|
||||
"body": "L'inventaire Proxmox VE et le registre des instances sont vérifiés. Un CT existant n'est pas adopté et un contrat qui appartient encore à une autre instance n'est pas réutilisé."
|
||||
},
|
||||
{
|
||||
"title": "Préparer chaque image",
|
||||
"body": "Toutes les images sont résolues, téléchargées et vérifiées avant la création du premier conteneur."
|
||||
},
|
||||
{
|
||||
"title": "Créer chaque rootfs",
|
||||
"body": "Les métadonnées OCI officielles sont importées, puis l’identité de l’instance ProxMenux et le rôle du membre sont ajoutés."
|
||||
},
|
||||
{
|
||||
"title": "Réseau privé",
|
||||
"body": "Un bridge et un sous-net sont créés et chaque membre obtient son adresse fixe; seul le membre principal obtient également l'interface LAN."
|
||||
},
|
||||
{
|
||||
"title": "Persistance",
|
||||
"body": "Chaque base de données et configuration obtient son propre disque conteneur ; seules les données destinées à être partagées utilisent des répertoires hôtes."
|
||||
},
|
||||
{
|
||||
"title": "Environnement",
|
||||
"body": "Les points d’accès internes, les secrets partagés et les variables de service sont écrits. L’application accède à ses dépendances via leurs adresses privées réservées."
|
||||
},
|
||||
{
|
||||
"title": "Enregistrement",
|
||||
"body": "Chaque membre enregistre sa configuration native, les changements rootfs que les mises à jour doivent reproduire et sa relation avec la pile."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "checks",
|
||||
"title": "3. Démarrer et vérifier chaque conteneur",
|
||||
"intro": "Un LXC créé ne signifie pas un service prêt. Les dépendances commencent dans l'ordre et chacune passe un contrôle spécifique à son service.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Services",
|
||||
"Vérification",
|
||||
"Ce qu'il montre"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"PostgreSQL",
|
||||
"<code>pg_isready</code> dans le CT avec l'hôte, l'utilisateur et la base de données attendus",
|
||||
"Le serveur accepte les connexions pour la base de données configurée"
|
||||
],
|
||||
[
|
||||
"Redis / Valkey",
|
||||
"<code>redis-cli</code> ou <code>valkey-cli</code> <code>PING</code> contre son adresse privée",
|
||||
"Le broker écoute et répond"
|
||||
],
|
||||
[
|
||||
"Immich apprentissage automatique",
|
||||
"HTTP <code>GET /ping</code>, avec vérification de l’environnement d’exécution GPU sélectionné",
|
||||
"Le service répond et l’accélération demandée n’a pas basculé vers le CPU"
|
||||
],
|
||||
[
|
||||
"Nextcloud",
|
||||
"<code>GET /status.php</code> avec <code>installed=true</code>, <code>maintenance=false</code> et <code>needsDbUpgrade=false</code>",
|
||||
"Initialisation terminée sans aucune migration en attente"
|
||||
],
|
||||
[
|
||||
"Paperless-ngx / Tandoor",
|
||||
"HTTP sur l'adresse LAN et le port réel du service",
|
||||
"La façade et ses dépendances servent l’application"
|
||||
],
|
||||
[
|
||||
"Application principale",
|
||||
"L'extrémité de son modèle, par exemple <code>/api/server/ping</code> dans Immich",
|
||||
"La pile entière fonctionne à travers l'application qui utilise les dépendances"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "En cours d’exécution ne signifie pas opérationnel",
|
||||
"body": "L’état en cours d’exécution indique seulement que le processus LXC existe. Si le service propose une meilleure vérification, un contrôle exec ou HTTP avec délai maximal est utilisé. Si un membre s’arrête ou échoue à son contrôle, la pile n’est pas déclarée installée."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "hook",
|
||||
"title": "4. Le crochet de dépendance",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Le crochet est placé uniquement sur le conteneur principal d'une pile dépendante. Proxmox VE conserve le script comme un extrait et l'exécute comme le <code>hookscript</code> de ce CT. La recette de pile n'est pas écrite dans le script : elle vit dans un contrat privé séparé."
|
||||
},
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Configuration principale CT",
|
||||
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
|
||||
},
|
||||
{
|
||||
"title": "Contrat privé (exemple)",
|
||||
"code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"snippet": {
|
||||
"summary": "Source complète de proxmenux-stack-dependencies.sh",
|
||||
"pathCode": "local:snippets/proxmenux-stack-dependencies.sh",
|
||||
"snippetCode": "stackDependencyHook"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Le script est le même pour chaque pile. Les VMID, noms, types de vérifications et délais proviennent du contrat privé <code>/etc/pve/priv/proxmenux-stack-VMID.json</code> de chaque pile."
|
||||
},
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Proxmox VE appelle pre-start",
|
||||
"body": "Avant le démarrage du CT principal, le crochet fonctionne avec son VMID et la phase du cycle de vie."
|
||||
},
|
||||
{
|
||||
"title": "Un verrou par pile",
|
||||
"body": "<code>flock</code> sur <code>/run/lock/proxmenux-stack-VMID.lock</code> empêche deux séquences de démarrage en même temps."
|
||||
},
|
||||
{
|
||||
"title": "Le contrat est lu et validé",
|
||||
"body": "Un schéma connu, des dépendances numériques, des étiquettes, un contrôle exec, http ou running et un délai maximal positif sont requis."
|
||||
},
|
||||
{
|
||||
"title": "Dépendances dans l'ordre",
|
||||
"body": "Chaque CT doit exister ; un CT arrêté est démarré, tandis qu’un CT déjà actif n’est pas redémarré."
|
||||
},
|
||||
{
|
||||
"title": "Attendre que le service soit prêt",
|
||||
"body": "Le contrôle est effectué toutes les deux secondes, et le CT est également confirmé être toujours en cours d'exécution."
|
||||
},
|
||||
{
|
||||
"title": "Le principal CT démarre",
|
||||
"body": "Lorsque chaque dépendance est prête, prédémarrage se termine et Proxmox VE démarre l'application."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Le crochet n'arrête pas les dépendances",
|
||||
"body": "Les phases post-démarrage, pré-stop et post-stop ne font rien. L'arrêt du principal CT laisse tourner PostgreSQL, Redis, Valkey ou l'apprentissage automatique. Le crochet commande le démarrage; il ne transforme pas plusieurs LXC en un seul processus."
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Type",
|
||||
"Exemple",
|
||||
"Démarrages suivants"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Pile dépendante",
|
||||
"Immich, Nextcloud, application avec PostgreSQL",
|
||||
"Le crochet du CT principal commence les dépendances et les attend"
|
||||
],
|
||||
[
|
||||
"Suite d'application",
|
||||
"Suite Arr",
|
||||
"Aucun membre principal: chaque LXC suit son propre <code>onboot</code>"
|
||||
],
|
||||
[
|
||||
"Application unique",
|
||||
"Jellyfin",
|
||||
"Proxmox VE commence directement ce LXC"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "stack-checks",
|
||||
"title": "5. Contrôle de la pile dans son ensemble",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Chaque VMID existe, est unique et conserve l'identité d'instance attendue.",
|
||||
"Chaque contrat appartient à la même pile, conserve son rôle et sa configuration native enregistrée.",
|
||||
"Le membre principal est le dernier en <code>start_order</code> et le premier en <code>stop_order</code>.",
|
||||
"Aucun membre, volume ou ajustement du rootfs ne manque.",
|
||||
"Le crochet pointe vers l'extrait officiel, son contenu est inchangé et son contrat correspond à la recette de la pile.",
|
||||
"Les images et les digests observés correspondent aux archives OCI préparées.",
|
||||
"Les appareils, les profils GPU, les montages, les secrets et les paramètres correspondent encore aux contrats.",
|
||||
"Une fois toutes les dépendances validées, le point d’accès de l’application principale vérifie l’intégration entre les membres."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "manage",
|
||||
"title": "Gestion d'une pile installée",
|
||||
"intro": "Dans <strong>Gérer les applications OCI installées</strong>, chaque membre mène à toute la pile. Le menu propose <strong>Mettre à jour tous les conteneurs de l’application</strong>, <strong>Modifier les chemins et périphériques supplémentaires</strong>, <strong>Recréer tous les conteneurs avec leur configuration enregistrée</strong> et <strong>Retirer : supprimer l’application et ses conteneurs</strong>. La recréation reconstruit chaque conteneur depuis son image d’origine, identifiée par le digest enregistré, sans chercher d’image plus récente. Elle suit les mêmes étapes qu’une mise à jour et est proposée pour les piles pouvant être mises à jour.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Tout membre",
|
||||
"body": "Le contrat du membre nomme le VMID principal et la liste complète des membres."
|
||||
},
|
||||
{
|
||||
"title": "La pile est reproductible",
|
||||
"body": "Les identités, les contrats, le crochet, les adaptations et un replay coordonné pour cette recette sont validés."
|
||||
},
|
||||
{
|
||||
"title": "Images d'abord",
|
||||
"body": "L'application n'est pas arrêtée avant que chaque digest ait été résolu, téléchargé et vérifié."
|
||||
},
|
||||
{
|
||||
"title": "Arrêter les membres et sauvegarder l’ensemble",
|
||||
"body": "Les sauvegardes natives vérifiées sont prises avec la pile arrêtée, de sorte que l'application et les bases de données appartiennent au même moment."
|
||||
},
|
||||
{
|
||||
"title": "Mettre à jour et vérifier chaque membre",
|
||||
"body": "Adaptation, réseau, montages, secrets et dispositifs sont appliqués à nouveau avant le contrôle de santé de chaque membre."
|
||||
},
|
||||
{
|
||||
"title": "Publier ou récupérer tout",
|
||||
"body": "Les nouveaux contrats ne sont publiés que lorsque chaque membre passe. Si on échoue, chaque membre est rétabli."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Modifier",
|
||||
"Ce qui change",
|
||||
"Ce qui est gardé"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Chemins et périphériques supplémentaires",
|
||||
"Ils sont ajoutés ou retirés du conteneur d'application, qui redémarre. Rien n'est reconstruit",
|
||||
"Les données de l'application, sa base de données et les autres conteneurs"
|
||||
],
|
||||
[
|
||||
"Ce qui exécute la reconnaissance (Immich)",
|
||||
"Le conteneur d'apprentissage de la machine prend l'image et les appareils du CPU ou d'un GPU de l'hôte. Toute l'application est arrêtée et mise à jour, comme dans une mise à jour",
|
||||
"Le cache modèle, la bibliothèque et la base de données. Si quelque chose échoue, les conteneurs précédents et le choix précédent sont restaurés"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Une pile sans replay coordonné n'est pas mise à jour",
|
||||
"body": "Si la préparation d'une pile ne peut pas être reproduite, la mise à jour est refusée avant l'arrêt de la pile. L'application continue à fonctionner comme elle est."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "failure",
|
||||
"title": "6. Quand quelque chose échoue",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Pendant une installation, une erreur s'arrête et enlève les conteneurs incomplets que l'opération a créés, et le pont privé si l'opération l'a créé. Une pile n'est pas publiée comme valide jusqu'à ce que la séquence entière se termine."
|
||||
},
|
||||
{
|
||||
"p": "Une mise à jour est transactionnelle: toutes les images sont préparées d'abord, puis la pile s'arrête, chaque membre est sauvegardé et la sauvegarde vérifiée, et seulement alors chaque rootfs est remplacé. Les membres commencent un par un avec leur bilan de santé; si on échoue, chaque membre est restauré à partir du même ensemble de sauvegardes, de sorte que la base de données et l'application n'appartiennent jamais à différents moments."
|
||||
},
|
||||
{
|
||||
"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}}\"]",
|
||||
"labels": {
|
||||
"prepare": "Préparer chaque image",
|
||||
"stop": "Stop, membre principal d'abord",
|
||||
"backup": "Sauvegarde vérifiée de chaque CT",
|
||||
"replace": "Remplacer le rootfs",
|
||||
"healthy": "Tous opérationnels ?",
|
||||
"yes": "Oui",
|
||||
"no": "Non",
|
||||
"commit": "Publier les contrats",
|
||||
"rollback": "Restaurer chaque membre"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "not-assumed",
|
||||
"title": "Ce qu'une pile ne comprend pas",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Une suite installée dans un flux, comme la suite Arr, n'est pas une pile dépendante : ses conteneurs n'ont pas d'ordre de départ entre eux.",
|
||||
"Le réseau privé ne remplace pas l'authentification, TLS ou la configuration de chaque application.",
|
||||
"La sauvegarde d'un LXC ne contient pas le pont, le crochet ou les contrats du reste de la pile.",
|
||||
"Prowlarr, Sonarr ou Radarr ne reçoivent aucun indexeur, profil ou fournisseur de ProxMenux."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,305 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Données, chemins et réseau | ProxMenux",
|
||||
"description": "Comment OCI manager Apps conserve les données d’un conteneur OCI : disques du conteneur, répertoires de l’hôte, montages rclone, adresses et réseaux privés."
|
||||
},
|
||||
"header": {
|
||||
"title": "Données, chemins et réseau",
|
||||
"description": "Ce qui se trouve dans le rootfs, ce qui subsiste après son remplacement, comment les données sont partagées entre conteneurs et comment chacun obtient son adresse.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "La persistance se décide avant la création du LXC",
|
||||
"body": "Les volumes déclarés par l’image et son fichier Compose sont lus avant la création du conteneur. Chaque chemin à conserver après une mise à jour devient un point de montage indépendant du rootfs. Celui-ci ne contient donc que les fichiers appartenant à l’image et peut être remplacé."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "questions",
|
||||
"title": "Ce que demande l’installateur",
|
||||
"intro": "Le modèle fournit les chemins nécessaires à l’application. Chacun est placé sur un disque du conteneur ou dans un répertoire de l’hôte. D’autres chemins peuvent être ajoutés avant le récapitulatif.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Chemins nécessaires",
|
||||
"body": "<code>/config</code>, <code>/data</code>, les bibliothèques, les téléchargements et tous les volumes déclarés par l’application sont répertoriés."
|
||||
},
|
||||
{
|
||||
"title": "Emplacement",
|
||||
"body": "Chaque chemin est placé sur un disque du conteneur ou dans un répertoire existant de l’hôte."
|
||||
},
|
||||
{
|
||||
"title": "Stockage et taille",
|
||||
"body": "Un disque du conteneur est créé sur un stockage Proxmox VE avec la taille indiquée. L’installation par défaut utilise <code>local-lvm</code>. L’installation avancée demande le stockage de chaque chemin juste avant sa taille et propose celui du rootfs. Le disque apparaît sous le nom <code>vm-VMID-disk-N</code> et est rattaché comme <code>mpN</code>."
|
||||
},
|
||||
{
|
||||
"title": "Répertoire de l’hôte",
|
||||
"body": "Le répertoire de l’hôte est indiqué par son chemin. S’il n’existe pas, il est créé avec pour propriétaire l’utilisateur de l’hôte correspondant à celui du conteneur."
|
||||
},
|
||||
{
|
||||
"title": "Chemins supplémentaires",
|
||||
"body": "Avant l’installation, d’autres associations entre un chemin ou un volume de l’hôte et un chemin du conteneur peuvent être ajoutées."
|
||||
},
|
||||
{
|
||||
"title": "Récapitulatif",
|
||||
"body": "La correspondance complète des chemins est affichée avant la création du CT et enregistrée dans le contrat de l’instance."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "options",
|
||||
"title": "Les deux emplacements persistants",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Propriété",
|
||||
"Disque du conteneur",
|
||||
"Répertoire de l’hôte"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Dans la configuration",
|
||||
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
|
||||
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
|
||||
],
|
||||
[
|
||||
"Sauvegarde du conteneur (vzdump)",
|
||||
"Inclus avec <code>backup=1</code>",
|
||||
"Non inclus"
|
||||
],
|
||||
[
|
||||
"Taille",
|
||||
"Fixe ; extensible en redimensionnant le point de montage",
|
||||
"L’espace libre du système de fichiers ou du dataset de l’hôte"
|
||||
],
|
||||
[
|
||||
"Autres conteneurs",
|
||||
"Monté uniquement par son propre conteneur",
|
||||
"Le même répertoire peut être monté dans plusieurs conteneurs"
|
||||
],
|
||||
[
|
||||
"Snapshots et restauration",
|
||||
"Gérés par Proxmox VE avec le CT",
|
||||
"Gérés sur le stockage de l’hôte"
|
||||
],
|
||||
[
|
||||
"Lors de la suppression de l’application",
|
||||
"Supprimé avec le conteneur",
|
||||
"Conservé avec son contenu"
|
||||
],
|
||||
[
|
||||
"Lors du déplacement du CT vers un autre nœud",
|
||||
"Déplacé avec le CT",
|
||||
"Le même chemin doit exister sur l’autre nœud"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Le rootfs est réservé aux binaires et au contenu de l’image. Une mise à jour ou une recréation le remplace sans toucher à l’un ou l’autre type de point de montage."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "example",
|
||||
"title": "Exemple : un conteneur avec les deux emplacements",
|
||||
"blocks": [
|
||||
{
|
||||
"code": {
|
||||
"title": "Jellyfin installé comme CT 151 sur local-lvm (extrait)",
|
||||
"code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Une mise à jour ou une recréation remplace uniquement le rootfs : <code>mp0</code> conserve les utilisateurs, les bibliothèques et les paramètres, tandis que <code>mp1</code> donne toujours accès aux mêmes médias. Restaurer la sauvegarde du CT rétablit <code>/config</code>. Le répertoire des médias est restauré, si nécessaire, depuis la sauvegarde du stockage de l’hôte."
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Contrat",
|
||||
"detail": "/config"
|
||||
},
|
||||
{
|
||||
"label": "Emplacement",
|
||||
"detail": "Disque du conteneur\nou répertoire de l’hôte"
|
||||
},
|
||||
{
|
||||
"label": "LXC",
|
||||
"detail": "Toujours /config\npour l’application"
|
||||
}
|
||||
],
|
||||
"caption": "L’application voit le chemin déclaré par l’image ; seul son emplacement de stockage change."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "shared",
|
||||
"title": "Un répertoire de l’hôte, plusieurs conteneurs",
|
||||
"blocks": [
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "flowchart TB\n H[\"{{host}}<br/>/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent<br/>/data\"]\n H --> J[\"Jellyfin<br/>/data\"]\n H --> R[\"Radarr / Sonarr<br/>/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]",
|
||||
"labels": {
|
||||
"host": "Répertoire de l’hôte",
|
||||
"config": "Configuration propre"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Chaque conteneur conserve sa configuration sur son propre disque. La bibliothèque ou les téléchargements se trouvent dans un unique répertoire de l’hôte, monté au même chemin interne dans chaque conteneur. Ainsi, le chemin dans lequel une application écrit est celui depuis lequel une autre lit."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rclone",
|
||||
"title": "Stockage cloud avec l’application rclone",
|
||||
"intro": "Outre son installation, la fiche rclone du catalogue propose <strong>Activer un montage dans un conteneur OCI rclone existant</strong>. Un stockage distant déjà créé et autorisé dans l’interface web de rclone est monté et rendu accessible sur l’hôte. D’autres conteneurs peuvent alors l’utiliser comme un répertoire de l’hôte.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Conteneur et stockage distant",
|
||||
"body": "Le VMID du conteneur rclone, le nom exact du stockage distant et, éventuellement, un chemin à l’intérieur de celui-ci."
|
||||
},
|
||||
{
|
||||
"title": "Nom du montage et cache",
|
||||
"body": "Le nom du montage et le mode du cache VFS : <code>off</code>, <code>minimal</code>, <code>writes</code> ou <code>full</code> (par défaut)."
|
||||
},
|
||||
{
|
||||
"title": "Vues exposées",
|
||||
"body": "Une racine commune, <code>/mnt/oci-shared</code> par défaut, contient une vue en lecture-écriture dans <code>/mnt/oci-shared/remotes/NAME</code> et une vue en lecture seule dans <code>/mnt/oci-shared/remotes-ro/NAME</code>."
|
||||
},
|
||||
{
|
||||
"title": "Activation",
|
||||
"body": "Après confirmation, le CT est arrêté, sa commande de démarrage et un hookscript Proxmox VE sont configurés, puis il est redémarré. L’opération attend que les deux vues soient montées sur l’hôte."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Si le montage ne s’active pas",
|
||||
"body": "La configuration précédente du conteneur est restaurée, puis celui-ci est redémarré. Ainsi, un échec d’activation laisse rclone dans son état initial."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "network",
|
||||
"title": "Adresses et réseaux",
|
||||
"intro": "Une application à un seul conteneur a besoin d’une adresse. Une application à plusieurs conteneurs nécessite aussi un réseau stable entre ses membres.",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "network",
|
||||
"title": "Application à un seul conteneur",
|
||||
"body": "Le pont réseau est choisi, ainsi que DHCP ou une adresse fixe au format CIDR. Le LXC possède sa propre adresse et le récapitulatif affiche les URL complètes des services."
|
||||
},
|
||||
{
|
||||
"icon": "waypoints",
|
||||
"title": "Application à plusieurs conteneurs",
|
||||
"body": "Un sous-réseau libre est recherché et un pont privé persistant est créé. Chaque membre — application, base de données et cache — y reçoit une adresse fixe."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "LAN",
|
||||
"detail": "Adresse accessible\nservice principal uniquement"
|
||||
},
|
||||
{
|
||||
"label": "LXC principal",
|
||||
"detail": "Web / API\nLAN + réseau privé"
|
||||
},
|
||||
{
|
||||
"label": "Réseau privé",
|
||||
"detail": "PostgreSQL · Valkey · ML\nadresses fixes"
|
||||
}
|
||||
],
|
||||
"caption": "Les dépendances communiquent sur le réseau privé et n’ont pas d’adresse sur le LAN."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Le contrat de la pile enregistre le pont, le sous-réseau, les adresses et les relations entre services. La mise à jour de l’application réutilise la même topologie pour tous les membres. ProxMenux Monitor ouvre le conteneur principal à son adresse LAN, et non à celle du réseau privé."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ownership",
|
||||
"title": "Propriétaires des fichiers et répertoires",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Les nouveaux répertoires sont créés avec les UID et GID auxquels le LXC non privilégié est mappé.",
|
||||
"Le propriétaire des répertoires existants n’est pas modifié récursivement.",
|
||||
"Les sockets, fichiers système et chemins sensibles ne sont pas proposés comme répertoires génériques de l’hôte."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "backup",
|
||||
"title": "Ce que contient une sauvegarde du conteneur",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Élément",
|
||||
"Dans la sauvegarde vzdump du CT",
|
||||
"Lieu de conservation"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Rootfs OCI",
|
||||
"Oui",
|
||||
"Dans la sauvegarde du CT ; il peut aussi être recréé à partir de l’image et du contrat"
|
||||
],
|
||||
[
|
||||
"Disque du conteneur avec <code>backup=1</code>",
|
||||
"Oui",
|
||||
"La sauvegarde du CT"
|
||||
],
|
||||
[
|
||||
"Répertoire de l’hôte",
|
||||
"Non",
|
||||
"La sauvegarde du stockage de l’hôte"
|
||||
],
|
||||
[
|
||||
"Contrat de l’instance",
|
||||
"Oui, la copie conservée dans le CT",
|
||||
"<code>/.proxmenux/oci-record.json</code> dans le CT ; les copies supplémentaires de l’hôte et du cluster sont conservées séparément"
|
||||
],
|
||||
[
|
||||
"Application à plusieurs conteneurs",
|
||||
"Chaque membre dans sa propre sauvegarde",
|
||||
"Les sauvegardes de tous les membres, ainsi que le contrat de la pile et son pont réseau sur l’hôte"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user