Merge pull request #486 from jcastro/docs/review-oci-manager

docs: review OCI manager documentation in all seven translations
This commit is contained in:
MacRimi
2026-10-18 13:34:03 +02:00
committed by GitHub
59 changed files with 15774 additions and 281 deletions
@@ -0,0 +1,171 @@
{
"meta": {
"title": "So wird ein OCI-Image umgesetzt | ProxMenux",
"description": "Vom Image-Repository und der Compose-Datei über eine überprüfbare Vorlage und einen Bereitstellungsplan zu einem nativen LXC unter Proxmox VE – ohne Docker im Container."
},
"header": {
"title": "So wird ein OCI-Image umgesetzt",
"description": "Vom Image-Repository und der Compose-Datei über eine überprüfbare Vorlage und einen Bereitstellungsplan zu einem nativen LXC, ohne Docker darin zu installieren.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "pipeline",
"title": "Der Umsetzungsablauf",
"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": "Image-Repository",
"converter": "Konverter",
"template": "JSON-Vorlage",
"blockers": "Keine Hindernisse?",
"no": "Nein",
"yes": "Ja",
"review": "Prüfung / Overlay",
"plan": "Bereitstellungsplan",
"lxc": "Nativer LXC"
}
}
},
{
"p": "Der Konverter liest das vom Projekt veröffentlichte Image und die Compose-Datei und erzeugt eine JSON-Vorlage. Lassen sich Anforderungen noch nicht umsetzen und verhindern dadurch die Installation, wird die Vorlage vor der Veröffentlichung im Katalog geprüft. Eine Datei mit geprüften Anpassungen, das Overlay, löst diese Hindernisse. Nur Vorlagen ohne verbleibende Hindernisse werden zur Installation angeboten."
}
]
},
{
"id": "template",
"title": "Was die Vorlage bewahrt",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Image-Identität",
"body": "Repository, fortlaufend aktualisiertes Tag, Architektur, ermittelter Digest und Quellrevision."
},
{
"icon": "braces",
"title": "Container-Vertrag",
"body": "Entrypoint, Cmd, Umgebung, Benutzer, Arbeitsverzeichnis, Stoppsignal, Ports und Volumes."
},
{
"icon": "layers",
"title": "Umsetzung für Proxmox VE",
"body": "Ressourcen, Sicherheit, Mountpoints, Geräte, sysctls und Zustandsprüfungen sowie die jeweils nötigen Anpassungen mit ihrer Begründung."
},
{
"icon": "shield",
"title": "Kompatibilität",
"body": "Unterstützte Schlüssel, noch nicht umgesetzte Anforderungen, die die Installation verhindern, und der Status jeder Validierung."
}
]
}
}
]
},
{
"id": "sources",
"title": "OCI liefert den Prozess, Compose die Umgebung",
"blocks": [
{
"table": {
"headers": [
"Quelle",
"Beispiel",
"Natives Ergebnis"
],
"rows": [
[
"OCI-Metadaten",
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
"Proxmox VE importiert sie beim Erstellen des CT"
],
[
"Docker Compose",
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
"LXC-Umgebungseinträge, <code>mpN</code> und <code>devN</code>"
],
[
"ProxMenux-Profil",
"GPU, Zustandsprüfung, Zugangsdaten",
"Rückfragen und geprüfte Anpassungen"
],
[
"Benutzer",
"VMID, Speicher, Netzwerk",
"Der Instanzvertrag"
]
]
}
}
]
},
{
"id": "install",
"title": "Was während der Installation passiert",
"blocks": [
{
"steps": {
"items": [
{
"title": "Referenz auflösen",
"body": "Die Registry wird abgefragt, die Architektur des Hosts ausgewählt und der konkrete Digest festgehalten, auf den das fortlaufend aktualisierte Tag verweist."
},
{
"title": "Herunterladen und prüfen",
"body": "Skopeo lädt das Image als OCI-Archiv herunter. Bevor etwas erstellt wird, wird jede Schicht anhand ihres Digests geprüft und entpackt. Ist der Download beschädigt, wird er einmal wiederholt, bevor die Installation abbricht."
},
{
"title": "Dateisystem erstellen",
"body": "<code>pct create</code> erstellt das rootfs aus dem Archiv und übernimmt die offiziellen Prozessmetadaten des Images."
},
{
"title": "Ressourcen anbinden",
"body": "Die deklarierten Volumes, Netzwerkeinstellungen, Umgebung, Geräte und Sicherheitsprofile werden eingebunden."
},
{
"title": "Konsole",
"body": "Die Konsolenausgabe des Containers wird auf dem Host gespeichert. Die Proxmox-VE-Konsole öffnet eine Shell, sofern das Image eine enthält."
},
{
"title": "Prüfen",
"body": "Beim ersten Start wird gewartet, bis der Container eine Adresse hat und der Dienst antwortet. Schlägt dies fehl, wird die Installation nicht als erfolgreich gemeldet."
},
{
"title": "Konfiguration erfassen",
"body": "Die tatsächlich verwendete Konfiguration wird im Instanzvertrag gespeichert, den Aktualisierungen und Neuerstellungen verwenden."
}
]
}
}
]
},
{
"id": "example",
"title": "Beispiel: ein Image mit /config und /downloads",
"intro": "Eine typische Compose-Definition und die daraus erzeugte Proxmox-VE-Konfiguration. Die von der Anwendung erwarteten Pfade bleiben unverändert.",
"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 (Auszug)",
"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> ist ein zweiter Datenträger des Containers, der im gewählten Speicher <code>vm-VMID-disk-N</code> heißt. Er wird unter <code>/config</code> eingehängt und mit <code>backup=1</code> in die Containersicherung aufgenommen. <code>mp1</code> erstellt keinen Datenträger, sondern bindet das Host-Verzeichnis <code>/srv/downloads</code> unter <code>/downloads</code> im LXC ein. Port 8080 wird nicht weitergeleitet: Der LXC hat eine eigene Adresse, unter der der Dienst antwortet."
}
]
}
]
}
@@ -0,0 +1,278 @@
{
"meta": {
"title": "Image außerhalb des Katalogs installieren | ProxMenux",
"description": "Übernehmen Sie ein OCI-Image aus einer Compose-Datei, einer URL, einem docker run-Befehl oder einer Image-Referenz und prüfen Sie vor der Installation, welche Konfiguration ProxMenux umsetzen kann."
},
"header": {
"title": "Image außerhalb des Katalogs installieren",
"description": "Ein eigenes Image wird anhand seiner Compose-Datei, eines docker run-Befehls oder allein seiner Referenz für LXC umgesetzt. Das Ergebnis wird zur Prüfung angezeigt, bevor ein LXC erstellt wird.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Derselbe Konverter und Installer",
"body": "Die Option <strong>Image außerhalb des Katalogs installieren</strong> nutzt denselben Konverter und Installer wie die Katalogvorlagen. Der Unterschied: Der Vertrag wird erst in diesem Moment aus der angegebenen Definition erzeugt und vor dem Erstellen eines LXC validiert."
}
}
]
},
{
"id": "sources",
"title": "Wie das Image beschrieben wird",
"intro": "Die erste Ansicht fragt, wie das Image beschrieben ist. Vier Möglichkeiten liefern eine Definition, die umgesetzt wird. Eine fünfte verwendet nur den Image-Namen. Drei weitere lesen eine bereits geschriebene oci-compose-Datei.",
"blocks": [
{
"table": {
"headers": [
"Option",
"Was eingelesen wird"
],
"rows": [
[
"Compose-Datei im Terminal einfügen",
"Fügen Sie den YAML-Inhalt im Terminal ein und schließen Sie mit Ctrl+D ab."
],
[
"Compose-Datei auf diesem Host lesen",
"Ein Pfad auf dem Knoten, standardmäßig <code>/root/docker-compose.yml</code>. Die Datei muss existieren und darf höchstens 256 KiB groß sein."
],
[
"Compose-Datei von einer Adresse herunterladen",
"Eine <code>http://</code>- oder <code>https://</code>-Adresse, die den unverarbeiteten YAML-Inhalt bereitstellt. Es werden höchstens 256 KiB heruntergeladen."
],
[
"docker run-Befehl im Terminal einfügen",
"Der vom Projekt veröffentlichte Befehl. Ports, Umgebung, Volumes, Geräte, Capabilities, Benutzer, gemeinsam genutzter Speicher und die weiteren unterstützten Optionen werden umgesetzt."
],
[
"Nur die Image-Referenz, ohne Compose-Datei",
"Eine Referenz wie <code>ghcr.io/user/application:latest</code>. Die Registry wird abgefragt und die OCI-Metadaten des Images werden übernommen."
],
[
"oci-compose im Terminal einfügen",
"Fügen Sie den JSON-Inhalt im Terminal ein und schließen Sie mit Ctrl+D ab. Er wird nicht konvertiert, sondern geprüft und so installiert, wie er geschrieben ist."
],
[
"oci-compose-Datei auf diesem Host lesen",
"Eine JSON-Datei auf dem Knoten, standardmäßig <code>/root/oci-compose.json</code>, mit höchstens 2 MiB."
],
[
"oci-compose von einer Adresse herunterladen",
"Eine <code>http://</code>- oder <code>https://</code>-Adresse, die die JSON-Datei bereitstellt. Es werden höchstens 2 MiB heruntergeladen."
]
]
}
},
{
"figure": {
"src": "/oci-manager/custom-source-menu.png",
"alt": "Menü zur Auswahl der Beschreibung eines Images außerhalb des Katalogs",
"caption": "Möglichkeiten zur Beschreibung eines Images außerhalb des Katalogs."
}
}
]
},
{
"id": "reference-only",
"title": "Was die Image-Referenz allein liefert",
"intro": "Das Image enthält seine Prozessmetadaten, aber nicht die gesamte Umgebung, die eine Compose-Datei gewöhnlich ergänzt.",
"blocks": [
{
"table": {
"headers": [
"Aus dem Image gelesen",
"Nicht im Image enthalten",
"Folge"
],
"rows": [
[
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> und die enthaltene Umgebung",
"Variablen, die nur in der Dokumentation stehen",
"Werden bei der Installation oder über Ändern ergänzt"
],
[
"Vom Image deklarierte Volumes",
"Host-Verzeichnisse, die nur in der Compose-Datei angegeben sind",
"Weitere Pfade werden vor der Installation ergänzt"
],
[
"<code>EXPOSE</code>-Ports",
"URL, Protokoll oder funktionale Zustandsprüfung",
"Port und Prüfverfahren des Dienstes werden bestätigt"
],
[
"Architekturen und Digest in der Registry",
"Geräte, Privilegien oder externe Abhängigkeiten",
"Ohne eine entsprechende Anforderung in der Definition werden sie nicht aktiviert"
]
]
}
}
]
},
{
"id": "review",
"title": "Vor der Installation prüfen",
"intro": "Nach dem Umsetzen der Definition zeigt ProxMenux seine Interpretation, bevor VMID, Ressourcen oder Speicher abgefragt werden.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Analysieren",
"body": "Dienste, Image, Ports, Pfade, Umgebung, Geräte, Sicherheit und Zustandsprüfung werden eingelesen."
},
{
"title": "Registry abfragen",
"body": "Das Image muss in seiner Registry vorhanden sein; die veröffentlichten Architekturen werden aufgelistet. Bei einer privaten Registry wird das dafür gespeicherte Konto verwendet."
},
{
"title": "Nicht angewendete Optionen auflisten",
"body": "Labels, Docker-Netzwerke, Swarm-Einstellungen und andere Schlüssel ohne Wirkung in einem LXC werden aufgelistet."
},
{
"title": "Optionen ohne sichere Entsprechung blockieren",
"body": "Schlüssel ohne sichere Entsprechung erscheinen unter <strong>Nicht umsetzbare Optionen</strong>; die Installation wird dann nicht fortgesetzt. Nichts wird stillschweigend verworfen."
},
{
"title": "Geheime Werte abfragen",
"body": "Variablen, deren Namen auf Passwort, Token oder Schlüssel hinweisen, werden bei der Installation als sensible Werte abgefragt."
}
]
}
},
{
"figure": {
"src": "/oci-manager/custom-review.png",
"alt": "Zusammenfassung der Interpretation einer Compose-Datei durch ProxMenux",
"caption": "Zusammenfassung, die vor der Abfrage von VMID und Ressourcen erscheint."
}
},
{
"p": "Nach Bestätigung der Zusammenfassung folgt derselbe Ablauf wie im Katalog: Name, Standard- oder erweiterter Modus, VMID, CPU, Arbeitsspeicher, Netzwerk, Start mit dem Knoten, persistente und zusätzliche Pfade, kompatible Geräte und abschließende Zusammenfassung."
}
]
},
{
"id": "examples",
"title": "Eingabebeispiele",
"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": "Eine von Hand geschriebene oci-compose-Datei",
"intro": "oci-compose ist die JSON-Datei, aus der eine Anwendung installiert wird. Der Katalog enthält eine solche Datei pro Anwendung. Dasselbe Format kann von Hand geschrieben und über diese Option installiert werden.",
"blocks": [
{
"p": "Bei einer handgeschriebenen Datei legt der Autor Image, Ports, Variablen, Volumes und Installationsfragen fest. ProxMenux ergänzt den Rest beim Einlesen. Das Format kann Dinge ausdrücken, die Compose nicht enthält: Fragetexte, bei der Installation erzeugte Passwörter, GPU-Profile, Eigentümer einzelner Volumes, die Prüfung des ersten Starts und abschließend angezeigte Zugangsdaten."
},
{
"steps": {
"items": [
{
"title": "Prüfen",
"body": "Dateien mit Fehlern werden nicht installiert. Jeder Fehler nennt das betroffene Feld. Bei ungültigem JSON werden Zeile und Spalte angegeben."
},
{
"title": "Überprüfen",
"body": "Eine gültige Datei zeigt, was sie installiert: Image, Webadresse, Ports, persistente Pfade, abgefragte Variablen und geschriebene Dateien."
},
{
"title": "Installieren",
"body": "Die Installation erfolgt wie bei jeder Kataloganwendung mit Standard- oder erweiterten Einstellungen."
}
]
}
},
{
"calloutWarning": {
"title": "Eine Datei, die Privilegien festlegt",
"body": "oci-compose legt fest, was im Container eingehängt wird und mit welchen Privilegien. Die Prüfung zeigt dies vor der Installation. Installieren Sie nur Dateien aus vertrauenswürdigen Quellen."
}
},
{
"p": "Die <readmeLink>README der OCI-Engine</readmeLink> beschreibt das Format Block für Block und enthält zwei vollständige Beispiele. Auch ein Installationsdatensatz kann so eingelesen werden: Verwendet wird nur die ursprüngliche Vorlage, keine der damaligen Antworten."
}
]
},
{
"id": "private-registries",
"title": "Images aus privaten Registries",
"intro": "Ein Image aus einer privaten Registry, etwa ein privates GitHub-Paket oder ein privates Docker-Hub-Repository, wird mit einem in ProxMenux gespeicherten Konto gelesen.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Die Registry verweigert den Image-Zugriff",
"body": "Meldet die Registry, dass ein Konto benötigt wird, bietet die Prüfung eine Anmeldung an und liest das Image danach erneut."
},
{
"title": "Anmelden",
"body": "Benutzername und Passwort oder Zugriffstoken mit Download-Berechtigung. Die Registry prüft sie; gespeichert werden sie nur bei erfolgreicher Anmeldung."
},
{
"title": "Installieren und aktuell halten",
"body": "Dieses Konto wird beim Herunterladen während der Installation und ebenso für Aktualisieren, Ändern, Neuerstellen, Watchdog und die Update-Prüfung des Monitors verwendet – auf jedem Cluster-Knoten."
}
]
}
},
{
"p": "<strong>Registry-Konten</strong> im Hauptmenü von OCI manager Apps zeigt gespeicherte Konten nach Registry und Benutzer, niemals ihre geheimen Zugangsdaten. Pro Konto können Images geprüft, heruntergeladen oder installiert sowie Zugangsdaten aktualisiert oder entfernt werden."
},
{
"list": {
"items": [
"GitHub (<code>ghcr.io</code>): Als Benutzer dient das GitHub-Konto, als Passwort ein persönliches Zugriffstoken mit <code>read:packages</code>-Berechtigung.",
"Docker Hub (<code>docker.io</code>): Als Benutzer dient das Docker-Hub-Konto, als Passwort ein Zugriffstoken mit Leseberechtigung.",
"Andere Registries, auch mit eigenem Port wie <code>registry.example.com:5000</code>: Benutzername und Passwort oder Token dieser Registry."
]
}
},
{
"calloutInfo": {
"title": "Wo die Konten gespeichert werden",
"body": "Unter <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, nur für root lesbar, im selben Ordner wie die Speicherpasswörter von Proxmox. <code>/etc/pve</code> wird von allen Cluster-Knoten gemeinsam genutzt. Ein auf einem Knoten hinzugefügtes Konto gilt daher auf allen. Die Host-Sicherung enthält die Datei; die Deinstallation von ProxMenux entfernt sie auf allen Knoten."
}
}
]
},
{
"id": "limits",
"title": "Nicht installierbare Definitionen",
"blocks": [
{
"list": {
"items": [
"Ein Dockerfile ohne veröffentlichtes Image: Das Image muss zuerst gebaut und in einer OCI-Registry veröffentlicht werden.",
"Eine Compose-Datei mit mehreren Diensten: Diese Option installiert jeweils einen Dienst in einem Container, auch wenn mehrere Dienste dasselbe Image verwenden.",
"<code>configs</code>, externe Geheimnisse oder Geräteformate, die sich nicht eindeutig umsetzen lassen.",
"Shell-Ersetzungen wie <code>$(command)</code>: Stattdessen muss der resultierende Wert angegeben werden.",
"Nicht erkannte <code>docker run</code>-Optionen und <code>--env-file</code>: Verwenden Sie stattdessen eine Compose-Datei mit expliziten Werten."
]
}
}
]
}
]
}
@@ -0,0 +1,392 @@
{
"meta": {
"title": "Geräte und Beschleunigung | ProxMenux",
"description": "Wie OCI manager Apps GPU, NVIDIA, Coral, USB, FUSE und weitere Geräte als geprüfte native Proxmox-VE-Ressourcen für einen OCI-Container bereitstellt."
},
"header": {
"title": "Geräte und Beschleunigung",
"description": "GPU, NVIDIA, Coral, USB, FUSE und Blockgeräte werden validierte native Proxmox VE-Ressourcen des Containers.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "principle",
"title": "Das Gerät, das die Anwendung benötigt, nicht der gesamte Host",
"blocks": [
{
"p": "Ein in der Compose-Datei oder im Anwendungsprofil angefordertes Gerät wird als konkreter <code>devN</code>-Eintrag oder LXC-Mount eingerichtet. Das Anfordern einer GPU, eines USB-Geräts oder eines Coral-Beschleunigers macht den Container nicht privilegiert."
},
{
"flow": {
"nodes": [
{
"label": "Host-Inventar",
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
},
{
"label": "ProxMenux",
"detail": "Hersteller und\nBerechtigungen geprüft"
},
{
"label": "LXC",
"detail": "dasselbe Gerät\neffektive GID"
}
]
}
}
]
},
{
"id": "origin",
"title": "Woher die Geräteanforderung kommt",
"blocks": [
{
"table": {
"headers": [
"Quelle",
"Was gelesen wird",
"Was der Installateur macht"
],
"rows": [
[
"Docker Compose",
"<code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> und NVIDIA Anforderungen",
"Jede Anforderung wird zu einer Geräteanforderung, die zur Überprüfung angezeigt wird"
],
[
"Katalogprofil",
"Die tatsächliche GPU-, Coral-, OpenCL-, USB- oder FUSE-Unterstützung der Anwendung",
"Es werden nur die für dieses Image validierten Optionen angeboten"
],
[
"Bildmetadaten und Dokumentation",
"VA-API, Selkies, LinuxServer Mods oder die NVIDIA Laufzeit",
"Die dokumentierten Variablen und die Vorbereitung werden hinzugefügt"
],
[
"Auswahl der Nutzer",
"Nur CPU, Intel/AMD, OpenCL, NVIDIA oder ein optionales Gerät",
"Die Auswahl wird im Instanzvertrag gespeichert"
]
]
}
},
{
"calloutWarning": {
"title": "Erkannte Geräte werden nicht automatisch eingebunden",
"body": "Der Host wird inventarisiert, aber nur Geräte, die in der Compose-Datei oder in einem kompatiblen Profil deklariert sind, werden angeboten und angehängt. Ein GPU, USB-Dongle oder Coral auf dem Host ist nicht jedem LXC ausgesetzt."
}
}
]
},
{
"id": "identify",
"title": "Wie das Host-Gerät identifiziert wird",
"intro": "Bevor der LXC geändert wird, wird das Gerät auf dem Host gelesen und mit dem gewählten Profil verglichen.",
"blocks": [
{
"table": {
"headers": [
"Typ",
"Identität",
"Validierung"
],
"rows": [
[
"Intel/AMD DRM",
"<code>/dev/dri/renderD*</code> und <code>/sys/class/drm/NODE/device/vendor</code>",
"Ein Zeichengerät mit dem Anbieter <code>0x8086</code> (Intel) oder <code>0x1002</code> (AMD)"
],
[
"AMD OpenCL",
"Der Render-Knoten plus <code>/dev/kfd</code>, wenn das Profil es benötigt",
"Existenz, Typ, Anbieter, Berechtigungen und deklarierte Kompatibilität"
],
[
"AMD ROCm",
"Der Renderknoten, <code>/dev/kfd</code> und die Generation, die der Compute-Treiber in <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code> meldet",
"Eine GPU-Generation, für die das ROCm-Image der Anwendung passende Rechenkernel enthält — die dort genannten RDNA2-GPUs und neuere — wird unverändert angeboten. Andere GPUs dieser Familien, etwa Radeon 680M und 780M, werden als experimentell angeboten und nie vorausgewählt: ROCm unterstützt sie nicht offiziell, die Anwendung meldet sie als Generation ihrer Familie (<code>HSA_OVERRIDE_GFX_VERSION</code>), und vor dem Download des größeren Images ist eine Bestätigung erforderlich. Ältere GPUs, etwa die integrierte Grafik eines Ryzen 5000U, werden nicht angeboten; Immich führt die Erkennung weiter auf der CPU aus."
],
[
"NVIDIA",
"<code>nvidia-smi</code> und <code>nvidia-container-cli</code>",
"GPU, UUID, PCI-Bus, Treiberversion, Toolkit, <code>/dev/nvidia*</code>-Knoten, Binärdateien und Bibliotheken"
],
[
"Coral PCIe/M.2",
"<code>/dev/apex_N</code> und sein Link in <code>/sys/dev/char/MAJOR:MINOR</code>",
"Zeichengeräteknoten, Major-/Minor-Nummern, Eigentümer, GID und Berechtigungen"
],
[
"USB und serielle",
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> oder <code>/dev/bus/usb/BBB/DDD</code>",
"Zeichenknoten; für USB auch Anbieter, Produkt und Seriennummer, wenn sysfs sie veröffentlicht"
],
[
"KVM, TUN, FUSE, Video und generische SCSI",
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> oder <code>/dev/sgN</code>",
"Unterstützter Pfad, Knotentyp und effektive Berechtigungen"
],
[
"Optisches Laufwerk",
"<code>/dev/srN</code>",
"Ein Blockgerät"
]
]
}
}
]
},
{
"id": "install",
"title": "Was passiert während der Installation",
"blocks": [
{
"steps": {
"items": [
{
"title": "Das Template bietet seine Profile",
"body": "Nur CPU, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL oder NVIDIA. Die Optionen gehören zum Image, nicht zu einem gemeinsamen Menü."
},
{
"title": "Ein Profil wird gewählt",
"body": "Es definiert die Geräteknoten, die Umgebung, die Mods oder die Laufzeit, die die Anwendung benötigt."
},
{
"title": "Ein Pfad wird vorgeschlagen",
"body": "Für DRM <code>/dev/dri/renderD128</code>, das auf einem Host mit mehreren Renderknoten geändert werden kann. Für USB oder seriell wird der konkrete Knoten ausgewählt."
},
{
"title": "Validierung",
"body": "Existenz, Typ, erlaubter Anbieter, Berechtigungen und GID werden überprüft. Eine Abweichung stoppt die Operation."
},
{
"title": "Der Vertrag ist geschrieben",
"body": "Pfad, Modus, GID, Schreibzugriff und Profil werden für Updates und Neuerstellungen aufgezeichnet."
},
{
"title": "Einbinden und testen",
"body": "<code>pct set</code> fügt den <code>devN</code>-Eintrag hinzu und der Zugriff wird dann im LXC überprüft. LinuxServer-Images werden auch als Benutzer <code>abc</code> überprüft."
}
]
}
}
]
},
{
"id": "config",
"title": "Wie es in der LXC-Konfiguration erscheint",
"intro": "Beispiele: <code>dev0</code> und <code>dev1</code> sind die freien Slots, die Proxmox VE zuweist, und <code>renderD128</code>, <code>apex_0</code> und die GID hängen von der Hardware des Knotens ab.",
"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": "Ein spezifisches USB-Gerät",
"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": "Die GID wird mit <code>stat</code> auf dem Host gelesen und in den <code>devN</code>-Eintrag geschrieben; es wird nicht angenommen, dass die Gruppen <code>render</code> und <code>video</code> eine feste Nummer haben. Das Gerät behält den gleichen <code>/dev</code>-Pfad innerhalb des LXC, wo die anwendungseigenen Mechanismen danach suchen."
}
]
},
{
"id": "profiles",
"title": "Profile, die ein Image bieten kann",
"blocks": [
{
"table": {
"headers": [
"Profil",
"Umsetzung",
"Angeboten, wenn"
],
"rows": [
[
"Intel/AMD VA-API",
"<code>/dev/dri</code> Renderknoten",
"Die Anwendung unterstützt Videobeschleunigung"
],
[
"OpenCL",
"Renderknoten, <code>/dev/kfd</code> bei Bedarf und der offizielle Mod",
"Das Image oder Profil dokumentiert es"
],
[
"NVIDIA",
"Treibergeräte und Bibliotheken des Hosts",
"Der Host hat einen funktionierenden Treiber und das NVIDIA Container Toolkit"
],
[
"Coral",
"<code>/dev/apex_0</code> oder USB-Bus",
"Das Profil erklärt Coral-Unterstützung (Frigate)"
],
[
"USB, seriell, FUSE",
"Ein einzelnes Gerät, ein validierter Baum oder eine LXC-Funktion",
"Der Vertrag verlangt es"
]
]
}
}
]
},
{
"id": "nvidia",
"title": "NVIDIA",
"blocks": [
{
"calloutWarning": {
"title": "Voraussetzung auf dem Knoten: NVIDIA Container Toolkit",
"body": "Ein funktionierender Treiber auf Proxmox VE reicht nicht aus, um einem OCI-Image eine NVIDIA-GPU zu geben. OCI Manager Apps verwendet <code>nvidia-container-cli</code> aus dem NVIDIA Container Toolkit, um die Geräte zu identifizieren und die Binärdateien und Bibliotheken zu erhalten, die dem geladenen Treiber entsprechen."
}
},
{
"p": "<nvidiaLink>ProxMenux NVIDIA installer</nvidiaLink> installiert das NVIDIA Container Toolkit aus dem offiziellen NVIDIA-Repository zusammen mit dem Treiber. Es überprüft seine vier Pakete, validiert <code>nvidia-container-cli</code> und zeichnet das Ergebnis im Change Journal von <auditLink>Audit & Report</auditLink> auf."
},
{
"p": "Diese beiden Befehle auf dem Host zeigen an, ob der Treiber und das Toolkit verfügbar sind:"
},
{
"shell": {
"code": "nvidia-smi -L\nnvidia-container-cli --version"
}
},
{
"p": "Auf einem Host, auf dem der Treiber auf andere Weise installiert wurde, wird das Toolkit aus dem offiziellen stabilen Repository installiert:"
},
{
"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": "Das von OCI manager Apps verwendete Inventar stammt aus der Ausgabe von:"
},
{
"shell": {
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
}
},
{
"calloutInfo": {
"title": "Docker Laufzeitkonfiguration ist nicht beteiligt",
"body": "Die Container sind native LXCs ohne Docker-Daemon. Daher spielt <code>nvidia-ctk runtime configure --runtime=docker</code> keine Rolle: ProxMenux fragt <code>nvidia-container-cli</code> direkt ab und trägt Geräte und Mounts in die LXC-Konfiguration ein. Die aktuellen Befehle und unterstützten Plattformen stehen in der <toolkitLink>Installationsanleitung zum NVIDIA Container Toolkit</toolkitLink>."
}
},
{
"cards": {
"items": [
{
"icon": "cpu",
"title": "Inventar aus dem Treiber",
"body": "<code>nvidia-container-cli</code> listet Geräteknoten, Binärdateien, Firmware und Bibliotheken des installierten Treibers auf."
},
{
"icon": "refresh",
"title": "Keine feste Version",
"body": "Die Vorlage nennt keine Bibliotheksdateien. Das Profil wird vom aktuellen Host generiert."
},
{
"icon": "shield",
"title": "Nur lesbare Mounts",
"body": "Die Hostbibliotheken werden schreibgeschützt montiert, anstatt in den Container kopiert zu werden."
},
{
"icon": "hardDrive",
"title": "Treiberänderungen",
"body": "Nach einem Treiberwechsel wird das Inventar erneut generiert, bevor die betroffenen LXCs starten."
}
]
}
},
{
"code": {
"title": "NVIDIA Ergebnis (vereinfacht)",
"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": "Nur <code>/dev/nvidia0</code> zu übergeben ist nicht genug. Die Benutzerraumkomponenten des geladenen Treibers werden schreibgeschützt montiert, und <code>nvidia-smi</code> läuft dann innerhalb des LXC, um GPU, UUID, PCI-Bus und Version mit dem Host-Inventar zu vergleichen."
}
]
},
{
"id": "usb",
"title": "USB, serielle und USB Coral",
"blocks": [
{
"calloutWarning": {
"title": "USB-Nummerierung kann sich ändern",
"body": "Ein Pfad wie <code>/dev/bus/usb/003/004</code> kann sich ändern, wenn das Gerät wieder angeschlossen wird oder der Host neu gestartet wird. Das Profil zeichnet Anbieter, Produkt und Seriennummer auf, wenn sie verfügbar sind, aber eine neue Busadresse wird nicht automatisch neu zugeordnet."
}
},
{
"p": "Ein Peripheriegerät wird durch seinen konkreten Knoten angegeben: <code>/dev/ttyUSB0</code>, <code>/dev/ttyACM0</code>, <code>/dev/apex_0</code> oder <code>/dev/bus/usb/BBB/DDD</code>. Die Weitergabe des gesamten <code>/dev</code> wird nicht akzeptiert. Coral wird nur Anwendungen angeboten, deren Profil es deklariert."
}
]
},
{
"id": "trees",
"title": "Gerätebäume und LXC-Funktionen",
"blocks": [
{
"table": {
"headers": [
"Anforderung",
"Umsetzung",
"Umfang"
],
"rows": [
[
"<code>/dev/dvb</code>, <code>/dev/snd</code> oder <code>/dev/bus/usb</code>",
"Jeder Zeichenknoten des Baumes erhält seinen eigenen <code>devN</code>-Eintrag mit dem Host-Modus und GID",
"Nur der angeforderte Baum, nicht der Rest von <code>/dev</code>"
],
[
"<code>/dev/fuse</code>",
"Der Knoten und, wenn das Profil es benötigt, die <code>fuse=1</code>-Funktion",
"FUSE allein veröffentlicht keine Mounts für andere LXCs"
],
[
"<code>/dev/net/tun</code>",
"Ein <code>devN</code>-Eintrag auf demselben Pfad innerhalb des LXC",
"Die VPN- oder Netzwerkkonfiguration bleibt in der Anwendung"
],
[
"<code>/dev/kvm</code>",
"Ein validierter <code>devN</code>-Eintrag",
"Angeboten nur, wenn der Vertrag es verlangt"
]
]
}
}
]
},
{
"id": "security",
"title": "Bestätigungen nach Risikograd",
"blocks": [
{
"p": "Konkrete Geräte, optionale Privilegien, erforderliche Privilegien, AppArmor- oder seccomp-Entspannung und der Zugriff auf den Host-PID-Namespace werden als separate Fälle behandelt, nicht unter einem generischen privilegierten Label. Jede Option mit einem Risiko wird während der Installation erklärt und bestätigt."
}
]
}
]
}
+213
View File
@@ -0,0 +1,213 @@
{
"meta": {
"title": "OCI manager Apps | ProxMenux",
"description": "Führen Sie offizielle OCI-Images als native LXC-Container unter Proxmox VE aus – mit persistenten Daten, Gerätezugriff, Anwendungen aus mehreren Containern und transaktionalen Aktualisierungen."
},
"header": {
"title": "OCI manager Apps",
"description": "Offizielle OCI-Images laufen als native LXC-Container unter Proxmox VE. Das vom Maintainer veröffentlichte Image bleibt unverändert; ProxMenux bildet die Umgebung nach, die Docker Compose dafür eingerichtet hätte.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "model",
"blocks": [
{
"calloutInfo": {
"title": "Ein OCI-Image, ein nativer LXC",
"body": "In den Containern läuft keine Docker Engine. Proxmox VE importiert das Dateisystem und die OCI-Metadaten des Images. Die Anwendung wird zum Hauptprozess eines nativen LXC und lässt sich mit denselben Werkzeugen verwalten wie andere Container auf dem Knoten."
}
},
{
"flow": {
"nodes": [
{
"label": "Quelle",
"detail": "OCI-Image\nCompose und Dokumentation"
},
{
"label": "ProxMenux",
"detail": "JSON-Vertrag\nValidierung und Planung"
},
{
"label": "Proxmox VE",
"detail": "Nativer LXC\nVolumes und Geräte"
}
],
"caption": "Die Anwendung wird nicht neu gebaut. Ihre Umgebung wird deklarativ beschrieben und nachgebildet."
}
}
]
},
{
"id": "where",
"title": "Wo Sie es finden",
"intro": "Öffnen Sie auf dem Proxmox-Knoten als root den Eintrag <strong>OCI manager Apps (Technology Preview)</strong> im ProxMenux-Hauptmenü. Die erste Ansicht bietet:",
"blocks": [
{
"list": {
"items": [
"<strong>Anwendungen suchen</strong> – den gesamten Katalog nach Namen durchsuchen.",
"<strong>Alle Anwendungen</strong> – den vollständigen Katalog samt Anzahl der Anwendungen anzeigen.",
"<strong>Installierte OCI-Anwendungen verwalten</strong> – vorhandene Installationen aktualisieren, ändern, entfernen oder wiederherstellen.",
"<strong>Registry-Konten</strong> – Konten zum Installieren und Aktualisieren von Images aus privaten Registries verwalten.",
"<strong>Image außerhalb des Katalogs installieren</strong> – eine Compose-Datei, einen <code>docker run</code>-Befehl oder eine Image-Referenz übernehmen und anpassen.",
"Die Kategorien des Katalogs, jeweils mit der Anzahl ihrer Anwendungen."
]
}
},
{
"figure": {
"src": "/oci-manager/main-menu.png",
"alt": "Hauptansicht von OCI manager Apps mit Suche, Gesamtkatalog, Anwendungsverwaltung, eigenen Images und Katalogkategorien.",
"caption": "Hauptansicht von OCI manager Apps."
}
},
{
"p": "Nach der Auswahl einer Anwendung sehen Sie deren Beschreibung, das verwendete Image und zwei Installationsarten. <strong>Mit Standardeinstellungen installieren</strong> fragt nur die grundlegenden Entscheidungen ab: Speicher, Datenablage, Adresse und Start. <strong>Mit erweiterten Einstellungen installieren</strong> führt nacheinander durch alle Optionen: VMID und Ressourcen, Speicher für jeden Pfad, Netzwerk-Bridge und Geräte."
},
{
"p": "Tatsächlich getestete Anwendungen zeigen in dieser Ansicht <strong>Geprüft</strong> und sind in den Listen mit ✓ gekennzeichnet. Das gilt für Tests im ProxMenux-Labor ebenso wie für Tests durch die Community."
}
]
},
{
"id": "beta",
"title": "Warum es als Technology Preview gekennzeichnet ist",
"blocks": [
{
"p": "OCI manager Apps verwendet die Bezeichnung <strong>Technology Preview</strong>, die Proxmox VE den aus OCI-Images erstellten Anwendungscontainern zuweist. Deren Unterstützung wurde mit Proxmox VE 9.1 eingeführt. Die Bezeichnung betrifft die zugrunde liegende Proxmox-Technik, nicht die ProxMenux-Engine: Das Verhalten dieser Container kann sich zwischen Proxmox-VE-Versionen noch ändern. Die Kennzeichnung bleibt bestehen, bis Proxmox VE diese Unterstützung als stabil einstuft."
},
{
"p": "Die Funktionen von OCI manager Apps werden im ProxMenux-Labor getestet: Installation, Aktualisierung, Änderung, Neuerstellung, Sicherung, Wiederherstellung, Migration und Watchdog. Jede Anwendung wird separat geprüft. Tatsächlich getestete Anwendungen tragen die Kennzeichnung <strong>Geprüft</strong> und ein ✓ in den Listen."
}
]
},
{
"id": "translation",
"title": "Wie Docker Anforderungen beschreibt und OCI manager Apps sie umsetzt",
"blocks": [
{
"table": {
"headers": [
"Anforderung",
"Darstellung in Docker",
"Umsetzung durch OCI manager Apps"
],
"rows": [
[
"Anwendung ausführen",
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
"OCI-rootfs und Hauptprozess des LXC"
],
[
"Konfiguration erhalten",
"<code>volumes: /config</code>",
"Ein persistentes <code>mpN</code>-Volume, das in die Sicherung aufgenommen wird, oder ein Verzeichnis auf dem Host."
],
[
"Dienst bereitstellen",
"<code>ports</code>",
"Eine eigene Adresse für den LXC und die Zugriffs-URL des Dienstes."
],
[
"Hardware verwenden",
"<code>devices</code>, <code>group_add</code>",
"<code>devN</code>-Einträge mit der tatsächlich verwendeten Gruppen-ID (GID) des Hosts und einem validierten Profil."
],
[
"Abhängigkeiten verbinden",
"<code>networks</code>, <code>depends_on</code>",
"Eine private Netzwerk-Bridge, feste Adressen, Startreihenfolge und Zustandsprüfungen."
],
[
"Aktualisieren",
"Mit <code>pull</code> herunterladen und neu erstellen",
"Ein neues rootfs mit demselben Persistenzvertrag."
]
]
}
}
]
},
{
"id": "kept",
"title": "Was erhalten bleibt und was sich ändert",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Bleibt erhalten",
"body": "Das offizielle Image, seine internen Pfade, seine Umgebung, sein Startprozess und seine Nutzungsdokumentation."
},
{
"icon": "boxes",
"title": "Wird angepasst",
"body": "Die Laufzeitumgebung: Netzwerk, Persistenz, Geräte, Berechtigungen und Abhängigkeiten werden mit den nativen LXC-Funktionen von Proxmox VE umgesetzt."
},
{
"icon": "shield",
"title": "Ohne Entsprechung",
"body": "Eine Compose-Option ohne sichere Entsprechung wird als Installationshindernis aufgeführt. Vorlagen mit solchen Hindernissen werden nicht zur Installation angeboten. Sensible Optionen müssen während der Installation bestätigt werden."
},
{
"icon": "refresh",
"title": "Wird gespeichert",
"body": "Image-Digest, Ressourcen, Pfade, Netzwerk, Geräte und Zugehörigkeit zu einem Stack werden im Instanzvertrag gespeichert. Aktualisierungen und Neuerstellungen bilden diesen Vertrag wieder ab."
}
]
}
}
]
},
{
"id": "pages",
"title": "Seiten in diesem Abschnitt",
"blocks": [
{
"next": {
"items": [
{
"label": "So wird ein OCI-Image umgesetzt",
"href": "/docs/oci-manager/architecture",
"tail": "Vom Image und seiner Compose-Datei zu einem nativen LXC."
},
{
"label": "Image außerhalb des Katalogs installieren",
"href": "/docs/oci-manager/custom-image",
"tail": "Compose-Datei, docker run oder eine Image-Referenz."
},
{
"label": "Daten, Pfade und Netzwerk",
"href": "/docs/oci-manager/storage-network",
"tail": "Container-Volumes, Host-Verzeichnisse, rclone-Mounts und Adressen."
},
{
"label": "Geräte und Beschleunigung",
"href": "/docs/oci-manager/hardware",
"tail": "GPU, NVIDIA, Coral, USB und weitere Geräte."
},
{
"label": "Anwendungen mit mehreren Containern",
"href": "/docs/oci-manager/stacks",
"tail": "Anwendung, Datenbank und Cache als koordinierte LXCs."
},
{
"label": "Installieren, aktualisieren und ändern",
"href": "/docs/oci-manager/lifecycle",
"tail": "Der Instanzvertrag und seine Vorgänge."
},
{
"label": "In ProxMenux Monitor",
"href": "/docs/oci-manager/monitor",
"tail": "Versionen, Aktualisierungen, Konsolenausgabe und Terminal."
}
]
}
}
]
}
]
}
@@ -0,0 +1,499 @@
{
"meta": {
"title": "Installieren, Aktualisieren und Ändern | ProxMenux",
"description": "Der Instanzvertrag eines OCI-Containers und die darauf beruhenden Vorgänge: Aktualisieren, Ändern, Entfernen, Fortsetzen eines unterbrochenen Vorgangs und Wiederherstellen des Betriebs nach einer Wiederherstellung auf diesem oder einem anderen Host."
},
"header": {
"title": "Installation, Aktualisierung und Änderung",
"description": "Jede Instanz behält einen reproduzierbaren Vertrag, sodass ihr rootfs ersetzt werden kann, ohne Konfiguration oder persistente Daten zu verlieren.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "contract",
"title": "Der Instanzvertrag",
"blocks": [
{
"p": "Nach einer Installation wird die effektive Konfiguration in <code>/usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json</code> gespeichert. Es ist keine Kopie der ursprünglichen Compose-Datei: Es ist der reproduzierbare Vertrag des LXC, der auf diesem Host existiert."
},
{
"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": "Eine Kopie des Vertrags liegt im Container unter <code>/.proxmenux/oci-record.json</code> und ist nur für dessen Benutzer root lesbar. Eine Containersicherung enthält daher immer den zu diesem Zeitpunkt gültigen Vertrag. Eine zweite Kopie liegt unter <code>/etc/pve/priv/proxmenux/oci</code>; dieses Verzeichnis ist auf allen Clusterknoten verfügbar und nur für root des Hosts lesbar. Beide Kopien werden nach jeder Installation, Aktualisierung und Änderung geschrieben."
}
]
},
{
"id": "manage",
"title": "Verwalten installierter OCI-Anwendungen",
"intro": "Diese Option auf dem Hauptbildschirm listet die registrierten Instanzen mit ihrer Anwendung und ihrem Image auf. Vor jeder Aktion wird jede Instanz mit ihrem Vertrag abgeglichen; ein CT, der nicht mehr zu seinem Datensatz passt, wird weder geändert noch gelöscht. Dieselbe Aktualisierungsfunktion und derselbe Editor stehen auf der Registerkarte Aktualisierungen von <monitorLink>ProxMenux Monitor</monitorLink> bereit.",
"blocks": [
{
"table": {
"headers": [
"Option",
"Was sich ändert",
"Was erhalten bleibt"
],
"rows": [
[
"Aktualisieren Sie das Image mit der gespeicherten Konfiguration",
"Das rootfs wird durch das Image ersetzt, das der gespeicherte Kanal aktuell bereitstellt",
"Vertrag, Containerplatten, Hostverzeichnisse, Netzwerk und Geräte"
],
[
"Ändern: Ressourcen, Netzwerk, Pfade und GPU bearbeiten",
"Der Editor öffnet sich mit dem aktuellen Vertrag; der CT wird mit den Änderungen neu erstellt",
"Die Daten von Container-Disks und Host-Verzeichnissen"
],
[
"Watchdog: Neustart der Anwendung, wenn sie abstürzt",
"Ob die Anwendung nach einem selbstständigen Beenden erneut gestartet wird. Es wird nichts neu erstellt",
"Die gesamte Installation; nur die Wahl ist im Vertrag gespeichert"
],
[
"Entfernen: Löschen Sie die Anwendung und ihre Container",
"Der LXC oder jedes Mitglied eines Stacks und seine Verträge werden gelöscht",
"Host-Verzeichnisse mit ihren Inhalten"
]
]
}
},
{
"p": "Für eine Anwendung mit mehreren Containern bietet das Menü <strong>Alle Container der Anwendung aktualisieren</strong>, <strong>Zusätzliche Pfade und Geräte ändern</strong>, <strong>Alle Container mit ihrer gespeicherten Konfiguration neu erstellen</strong>, den Watchdog und die Entfernung. Ändern fügt die zusätzlichen Pfade und Geräte des Anwendungscontainers hinzu oder entfernt sie, ohne etwas neu zu erstellen. Bei Immich lässt sich damit auch ändern, womit die Erkennung ausgeführt wird. Neu erstellen erstellt jeden Container anhand des ursprünglich installierten Images neu, ohne nach einem neueren zu suchen."
},
{
"figure": {
"src": "/oci-manager/manage-menu.png",
"alt": "Liste der installierten OCI-Anwendungen und der Optionen zum Aktualisieren, Ändern und Entfernen",
"caption": "Verwalten Sie installierte OCI-Anwendungen."
}
}
]
},
{
"id": "update",
"title": "Transaktionsaktualisierung",
"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": "Benutzer",
"registry": "OCI-Register",
"update": "Instanz aktualisieren",
"resolve": "Tag auflösen",
"verify": "Archiv prüfen und Vorabprüfungen durchführen",
"backup": "Stoppen und sichern Sie den CT",
"import": "Neues rootfs importieren",
"reapply": "Den Vertrag erneut anwenden",
"healthy": "in Ordnung",
"failure": "Ausfall",
"commit": "Vertrag mit dem neuen Digest veröffentlicht",
"restored": "Frühere Instanz wiederhergestellt"
}
}
},
{
"list": {
"items": [
"Wenn die Registry weiterhin den installierten Digest bedient, wird nichts heruntergeladen und die Instanz nicht berührt.",
"Das neue Image wird Schicht für Schicht verifiziert, bevor der CT stoppt. Ein Download, der beschädigt ankommt, wird ein zweites Mal abgerufen; ein bereits zwischengespeichertes Image, das den Check nicht besteht, wird erneut heruntergeladen.",
"Nach der Installation in Proxmox VE geänderte Einstellungen (Arbeitsspeicher, Swap, Kerne, CPU-Limit, CPU-Priorität, Start mit dem Knoten) bleiben erhalten und werden in den neuen Vertrag übernommen.",
"Die LAN-Schnittstelle, die die Arr-Suite und Multi-Container-Anwendungen hinzufügen (<code>net1</code>) und die Startreihenfolge (<code>startup</code>) werden an den neuen Container zurückgegeben.",
"Jeder andere Unterschied zwischen dem CT und seinem Vertrag stoppt das Update, bevor der CT gestoppt wird."
]
}
},
{
"flow": {
"nodes": [
{
"label": "Vorher",
"detail": "rootfs A\n/config mp0\n/media Hostverzeichnis"
},
{
"label": "Aktualisierung",
"detail": "ersetzt nur\ndas rootfs"
},
{
"label": "Nachher",
"detail": "rootfs B\n/config mp0\n/media Hostverzeichnis"
}
]
}
},
{
"p": "Bevor etwas gestoppt wird, prüft der Vorgang, ob ausreichend Platz für die Sicherung vorhanden ist: die belegten Daten der zu sichernden Volumes plus eine Reserve. Die Sicherung wird neben dem Anwendungsdatensatz auf dem Systemlaufwerk des Hosts gespeichert. Reicht der Platz dort nicht aus, fragt das Menü nach einem anderen Host-Speicher, der Sicherungen unterstützt. Dort wird die Sicherung erstellt und nach Abschluss des Vorgangs gelöscht. Die Auswahl wird für diese Anwendung auch für geplante Aktualisierungen gespeichert. Hat kein Speicher ausreichend Platz, wird der Vorgang abgelehnt und die Anwendung bleibt unverändert. Der Platzbedarf des neuen Images wird vor dem Herunterladen ebenso geprüft."
}
]
},
{
"id": "recovery",
"title": "Wiederherstellung eines unterbrochenen Vorgangs",
"intro": "Ein Update und eine Änderung verwenden eine persistente Transaktion. Wenn der Prozess, das Terminal oder der Knoten nach dem Stoppen des CT unterbrochen wird, wird die Operation nicht als abgeschlossen angesehen.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Ausstehender Marker",
"body": "Beim Öffnen von „Installierte OCI-Anwendungen verwalten“ zeigt der gespeicherte Zustand, dass der Ersatz nie veröffentlicht wurde."
},
{
"title": "Status anzeigen",
"body": "Zeigt die Phase an, die erreicht wurde, ohne Container oder Daten zu ändern."
},
{
"title": "Wiederherstellen der vorherigen Installation",
"body": "Stellt die vor dem Ersatz erstellte und geprüfte native Sicherung sowie den vorherigen Vertrag wieder her."
},
{
"title": "Stacks als Einheit",
"body": "Für eine Multi-Container-Anwendung wird jedes Mitglied aus dem gleichen Transaktionspunkt wiederhergestellt, nicht nur das ausgewählte."
}
]
}
},
{
"calloutWarning": {
"title": "Host-Verzeichnisse liegen außerhalb des Rollbacks",
"body": "Die Sicherung umfasst das rootfs und die darin eingeschlossenen Containerlaufwerke. Ein Hostverzeichnis wird nicht zurückgesetzt, da andere LXCs dessen Daten verwenden können."
}
}
]
},
{
"id": "watchdog",
"title": "Watchdog: Neustart einer Anwendung, die stoppt",
"intro": "Proxmox hat keine Neustartrichtlinie: Wenn der Prozess eines Anwendungscontainers endet, bleibt der Container gestoppt. Mit dem Watchdog wird eine Anwendung, die von selbst aufhört, erneut gestartet. Es tut für eine OCI-Anwendung, was <code>restart: unless-stopped</code> in einer Compose-Datei tut.",
"blocks": [
{
"table": {
"headers": [
"Was passiert",
"Mit aktiviertem Watchdog"
],
"rows": [
[
"Die Anwendung stürzt ab oder ihr Prozess endet",
"Der Container wird innerhalb von Sekunden wieder gestartet"
],
[
"Es wird von Proxmox, vom Monitor oder mit <code>pct</code> gestoppt oder heruntergefahren",
"Er bleibt gestoppt, bis ihn jemand startet"
],
[
"Ein Backup, eine Migration oder eine ProxMenux-Operation arbeitet daran",
"Nichts wird getan, bis das endet"
],
[
"Er war beim Start des Hosts bereits gestoppt",
"Er bleibt gestoppt; dafür ist <strong>Mit Proxmox starten</strong> zuständig"
],
[
"Es stoppt direkt nach dem Start",
"Bei einer Anwendung, die Sekunden nach dem Start wieder stoppt oder gar nicht startet, werden fünf Startversuche unternommen. Dazwischen liegen Wartezeiten von 30 Sekunden, 1, 2 und 5 Minuten. Danach bleibt sie gestoppt und eine Benachrichtigung wird gesendet"
]
]
}
},
{
"p": "Das Installationsprogramm fragt in beiden Installationsmodi danach und schlägt den im Anwendungsrezept angegebenen Wert vor. Später lässt sich die Einstellung unter <strong>Installierte OCI-Anwendungen verwalten</strong> oder mit dem Schalter <strong>Watchdog</strong> des Containers in <monitorLink>ProxMenux Monitor</monitorLink> ändern. Sie gilt für alle Container einer Anwendung mit mehreren Containern. Ein einziger Host-Dienst, <code>proxmenux-oci-watchdog.service</code>, überwacht alle Anwendungen, für die dies aktiviert wurde; seine Installation erscheint auf der Registerkarte Änderungen von Audit & Report."
},
{
"calloutInfo": {
"title": "Was der Host nicht sagen kann",
"body": "Der Exit-Code der Anwendung erreicht den Host nicht. Daher sind ein reguläres Beenden und ein Absturz nicht unterscheidbar; in beiden Fällen wird neu gestartet, wie bei <code>always</code> und <code>unless-stopped</code> in Docker. Ein außerhalb von Proxmox mit <code>lxc-stop</code> oder <code>systemctl</code> angeforderter Stopp hinterlässt keinen Stopp-Task und wird als selbstständiges Beenden gewertet."
}
}
]
},
{
"id": "restore",
"title": "Backup, Wiederherstellung und ein weiterer Host",
"intro": "Eine mit vzdump oder Proxmox Backup Server erstellte Sicherung enthält den Container, die für die Sicherung ausgewählten Containerlaufwerke und die Kopie seines Vertrags. Was die Installation auf dem Host speichert, ist nicht darin enthalten. <strong>Installierte OCI-Anwendungen verwalten</strong> erkennt Container, die auf einem Host ohne ihren Vertrag wiederhergestellt wurden, etwa nach einer Proxmox-Neuinstallation oder auf einem anderen Host, und bietet ihre erneute Registrierung an.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Wiederherstellen der Container in Proxmox",
"body": "Vom Sicherungsspeicher, mit der ursprünglichen ID oder einer beliebigen freien ID. Bei einer Anwendung mit mehreren Containern werden alle ihre Container benötigt."
},
{
"title": "Installierte OCI-Anwendungen verwalten öffnen",
"body": "Die wiederhergestellten Container werden aufgelistet und die Wiederherstellung ihrer Registrierung wird angeboten. Die Schaltfläche <strong>Wiederherstellen</strong> auf der Registerkarte Aktualisierungen von <monitorLink>ProxMenux Monitor</monitorLink> öffnet denselben Vorgang."
},
{
"title": "Überprüfen Sie vor dem Wechsel",
"body": "Die Wiederherstellung überprüft, ob der Host alles hat, was jede Anwendung benötigt. Eine Anwendung, die nicht als Ganzes wiederhergestellt werden kann, bleibt so, wie sie gefunden wurde, mit dem Grund."
},
{
"title": "Registrieren und starten",
"body": "Der Vertrag wird auf diesem Host registriert und was die Installation darauf aufbewahrt, wird erneut geschrieben. Das Starten der Anwendungen ist eine separate Frage, die mit Nein beantwortet wird, wenn die ursprünglichen Container noch auf einem anderen Host ausgeführt werden."
}
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Dialog, der die wiederhergestellten Container auflistet und anbietet, sie wiederherzustellen",
"caption": "Die beim Öffnen von „Installierte OCI-Anwendungen verwalten“ angebotene Wiederherstellung."
}
},
{
"table": {
"headers": [
"Was der Host behalten hat",
"Nach der Wiederherstellung"
],
"rows": [
[
"Instanzvertrag",
"Wird aus der Kopie im Container registriert und mit der von Proxmox wiederhergestellten Konfiguration abgeglichen"
],
[
"Privates Netzwerk einer Multicontainer-Anwendung",
"Wird mit derselben Bridge und demselben Subnetz neu erstellt; die festen Adressen der Container ändern sich nicht"
],
[
"Startreihenfolge einer Anwendung mit mehreren Containern",
"Das Abhängigkeits-Hookscript und sein Vertrag werden wieder installiert; Snippets sind auf dem <code>local</code>-Speicher aktiviert, wenn kein Speicher sie akzeptiert"
],
[
"Netzwerk sysctls und Host-Monitor-Datei",
"Nochmals geschrieben in <code>/etc/pve/proxmenux</code>"
],
[
"NVIDIA Laufzeit",
"Der Hook eines unprivilegierten Containers wird erneut installiert. Ein privilegierter Container erhält die Treiberdateien dieses Hosts statt der Dateien seines ursprünglichen Hosts"
],
[
"Rclone mount",
"Das Hookscript und die Programme, die das Mount veröffentlichen, werden erneut geschrieben, mit den gleichen Ansichten auf dem Host"
],
[
"Host-Firewallregel eines Host-Monitors",
"Wird erneut abgefragt, für seinen Web-Port und das Subnetz der Bridge auf diesem Host"
],
[
"<code>lost+found</code> jeder wiederhergestellten Festplatte",
"Wird entfernt, wenn es leer ist; bei einer Wiederherstellung wird es angelegt, und manche Anwendungen starten nicht, wenn es in ihrem Datenverzeichnis liegt"
],
[
"Disks auf einem anderen Speicher wiederhergestellt",
"Der Vertrag wird auf den Speicher aktualisiert, auf dem sie sich jetzt befinden"
]
]
}
},
{
"p": "Ein mit einer anderen ID wiederhergestellter Container behält seine Anwendung. Der Vertrag, sein Konsolenprotokoll, seine Netzwerk-sysctls, das Hookscript einer Rclone-Einhängung und die Startreihenfolge einer Anwendung mit mehreren Containern werden mit den IDs registriert, die die Container auf diesem Host haben."
},
{
"table": {
"headers": [
"Was eine Wiederherstellung verhindert",
"Was zu tun ist"
],
"rows": [
[
"Ein Container einer Multicontainer-Anwendung fehlt",
"Stellen Sie es auch wieder her; Die Anwendung wird als Ganzes wiederhergestellt"
],
[
"Das private Subnetz wird bereits auf diesem Host verwendet",
"Die Wiederherstellung wird abgebrochen und nichts wird geändert: Die Adressen der Container sind fixiert und werden nicht in ein anderes Subnetz verschoben"
],
[
"Ein Hostverzeichnis existiert nicht",
"Mounten oder erstellen Sie es mit seinen Daten; ein Backup des Containers enthält keine Hostverzeichnisse"
],
[
"Ein Gerät existiert nicht auf diesem Host",
"Verbinden Sie es oder entfernen Sie es aus dem Container in Proxmox"
],
[
"Eine Anwendung mit NVIDIA auf einem Host ohne Treiber",
"Installieren Sie den NVIDIA-Treiber und das Container Toolkit"
],
[
"Das Backup wurde erstellt, bevor die Kopie des Vertrages existierte",
"Der Container bleibt als gewöhnlicher LXC und wird nicht wieder angeboten"
]
]
}
},
{
"calloutInfo": {
"title": "Ein Container, der zurückkommt",
"body": "Ein Container, der von einem älteren Backup wiederhergestellt, zu einem Snapshot zurückgerollt oder von einem anderen Knoten zurückgegeben wurde, trägt den Vertrag des Zustands, in dem er sich befindet. Wenn es für eine Operation ausgewählt wird und sein Vertrag von dem dieses Hosts abweicht, startet die Operation nicht und der Container wird zur Wiederherstellung angeboten."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Ergebnis der Wiederherstellung mit privatem Netzwerk, Startreihenfolge und registrierten Containern",
"caption": "Das Ergebnis einer Wiederherstellung, Schritt für Schritt."
}
}
]
},
{
"id": "remove",
"title": "Entfernen einer OCI-Anwendung",
"blocks": [
{
"p": "Vor der Bestätigung wird eine Zusammenfassung aus der tatsächlichen Konfiguration erstellt: die zu entfernenden Container, die damit gelöschten Daten, das freigegebene private Netzwerk und die erhaltenen Hostverzeichnisse. Die Bestätigung steht standardmäßig auf <strong>Nein</strong>, da die Daten gelöschter Laufwerke anschließend nicht wiederhergestellt werden können."
},
{
"table": {
"headers": [
"Ressource",
"Beim Entfernen",
"Grund"
],
"rows": [
[
"rootfs und Container-Festplatten",
"Gelöscht",
"Sie gehören nur zum Container"
],
[
"Hostverzeichnis",
"Bleibt mit seinem Inhalt erhalten",
"Andere Anwendungen können es verwenden"
],
[
"Host-Dateien des Containers",
"Gelöscht",
"Sein Konsolenprotokoll, Netzwerk-Sysctls, Rclone Mount Hookscript und seine Registrierung in der App-Registerkarte von ProxMenux Monitor dienen keinem anderen Container"
],
[
"Von mehreren Installationen gemeinsam genutzte Dateien",
"Gelöscht mit der letzten Installation, die sie verwendet",
"Die Host-Monitor-Datei und das Dependency-Hookscript von Multi-Container-Anwendungen"
],
[
"Instanzvertrag",
"Nach erfolgreicher Entfernung gelöscht",
"Kein CT ist mehr damit verbunden"
],
[
"Private Bridge eines Stacks",
"Mit dem Stack freigegeben",
"Es sind keine Mitglieder mehr zu verbinden"
],
[
"Von der Arr-Suite gemeinsam genutztes Netzwerk",
"Wird beim Entfernen der letzten Anwendung der Suite freigegeben",
"Jede Anwendung der Suite ist unabhängig und wird einzeln entfernt"
],
[
"Ein einzelnes Mitglied eines Stapels",
"Wird nicht einzeln entfernt",
"Die gesamte Anwendung wird entfernt, so dass kein Stapel unvollständig bleibt"
],
[
"Ein Container auf einem anderen Knoten des Clusters",
"Nicht entfernt",
"Seine Datensatz- und Hostdateien befinden sich auf dem Knoten, auf dem es installiert wurde: Es wird dort entfernt, nachdem es zurück migriert wurde."
]
]
}
},
{
"figure": {
"src": "/oci-manager/remove-summary.png",
"alt": "Zusammenfassung zum Entfernen mit den betroffenen Containern, Daten und Hostverzeichnissen",
"caption": "Die Entfernungszusammenfassung, aufgebaut aus der realen Konfiguration."
}
}
]
},
{
"id": "archives",
"title": "Heruntergeladene Images und Speicherplatz auf dem Host",
"blocks": [
{
"p": "Das OCI-Archiv dient zum Erstellen des rootfs; der laufende CT liest es nicht. Nach einer Installation oder Aktualisierung werden die dabei heruntergeladenen Archive mit ihrer Größe aufgelistet und zur Löschung angeboten. Ihre Löschung gibt Speicherplatz frei, ohne den Container oder seine Daten zu beeinträchtigen."
},
{
"calloutInfo": {
"title": "Updates benötigen das Archiv nicht",
"body": "Ohne Archiv löst ein Update den gespeicherten Kanal auf und lädt den neuen Digest herunter. Mit ihm wird ein Archiv nur dann wiederverwendet, wenn seine Referenz und Integrität mit dem übereinstimmen, was angefordert wird."
}
}
]
},
{
"id": "registry",
"title": "Einträge und Bereinigung",
"blocks": [
{
"p": "Beim Öffnen von <strong>Installierte OCI-Anwendungen verwalten</strong> werden zuerst Reste von Containern entfernt, die auf keinem Clusterknoten mehr existieren: der als Verlauf aufbewahrte Datensatz eines über die Proxmox-Oberfläche gelöschten Containers sowie Host-Dateien, die bei einer Entfernung zurückblieben. Ein Datensatz mit einem unterbrochenen Vorgang bleibt erhalten, da seine Sicherung noch benötigt werden könnte. Volumes und Hostverzeichnisse werden niemals aufgrund bloßer Schlussfolgerungen gelöscht."
}
]
},
{
"id": "cluster",
"title": "In einem Cluster: Migration und hohe Verfügbarkeit",
"intro": "Ein OCI-Container ist ein gewöhnlicher Proxmox-LXC: Er kann wie jeder andere migriert oder von HA verwaltet werden, mit denselben Einschränkungen. Alles, was er zum Starten benötigt, wird dort gespeichert, wo jeder Clusterknoten darauf zugreifen kann.",
"blocks": [
{
"table": {
"headers": [
"Teil",
"Auf einem anderen Knoten des Clusters"
],
"rows": [
[
"Konsolenlogbuch",
"Der Container erstellt <code>/var/log/proxmenux/oci</code> vor dem Start auf dem jeweiligen ausführenden Knoten. Jeder Knoten behält das Protokoll der von ihm ausgeführten Starts."
],
[
"Netzwerk sysctls und Host-Monitor",
"Werden in <code>/etc/pve/proxmenux</code> gespeichert, das alle Clusterknoten gemeinsam nutzen, sodass ein migrierter Container sie findet."
],
[
"Containerfestplatten",
"Proxmox verschiebt sie mit dem Container. Für HA müssen ihre Daten auf dem Zielknoten verfügbar sein, über gemeinsamen Speicher oder eine unterstützte Replikationskonfiguration."
],
[
"Host-Verzeichnisse und Geräte",
"Die gleichen Regeln wie bei jedem LXC: Ein Host-Verzeichnis muss auf dem Zielknoten vorhanden sein und als gemeinsam genutzt markiert werden, und ein GPU, Coral oder NPU muss dort vorhanden sein."
],
[
"ProxMenux-Datensatz",
"Der Vertrag bleibt auf dem Knoten, auf dem die Anwendung installiert wurde; alle Knoten lesen die Kopie unter <code>/etc/pve/priv/proxmenux/oci</code>. Eine migrierte Anwendung mit einem einzelnen Container wird auf dem Zielknoten registriert, sobald <strong>Installierte OCI-Anwendungen verwalten</strong> geöffnet oder eine Aktion für sie gestartet wird. Eine Anwendung mit mehreren Containern wird dort zur Wiederherstellung angeboten, da ihr privates Netzwerk auf diesem Knoten erstellt werden muss."
]
]
}
},
{
"calloutWarning": {
"title": "Nicht für hohe Verfügbarkeit",
"body": "Eine Multicontainer-Anwendung erreicht ihre Mitglieder über eine private Brücke des Knotens, auf dem sie installiert wurde, so dass ihre Mitglieder auf diesem Knoten bleiben. Ein Hostmonitor, z. B. Glances im Hostmodus oder Netdata, überwacht den Knoten, auf dem er ausgeführt wird; das Bewegen würde einen anderen Knoten überwachen."
}
},
{
"p": "Ein Backup, das außerhalb des Clusters wiederhergestellt wird, erhält die Dateien von <code>/etc/pve/proxmenux</code>, die der Container verwendet, wenn die Anwendung wiederhergestellt wird."
}
]
},
{
"id": "channel",
"title": "Ein Rolling Tag ist kein unbeaufsichtigtes Update",
"blocks": [
{
"p": "Der Katalog installiert das vom Maintainer veröffentlichte Rolling-Tag. Der tatsächliche Digest wird aufgelöst und aufgezeichnet und nur durch eine explizite Aktualisierung mit Vorabprüfung und Rollback geändert. <monitorLink>ProxMenux Monitor</monitorLink> vergleicht den installierten Digest mit dem von der Registry veröffentlichten Digest und zeigt und meldet, wenn ein neues Image verfügbar ist."
}
]
}
]
}
@@ -0,0 +1,213 @@
{
"meta": {
"title": "OCI Container in ProxMenux Monitor | ProxMenux",
"description": "Was ProxMenux Monitor für einen mit OCI manager Apps installierten Container zeigt: Anwendungs- und Image-Versionen, neue Images, Konsolenausgabe und Proxmox-VE-Terminal."
},
"header": {
"title": "In ProxMenux Monitor",
"description": "Ein mit OCI manager Apps installierter Container erscheint wie jeder andere LXC unter VMs & LXCs. Sein Detaildialog liest den Installationsdatensatz: Anwendungs- und Image-Versionen, neue Images, Konsolenausgabe und Terminal.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Die Aufzeichnung ist die Quelle",
"body": "OCI manager Apps kennt die installierte Anwendung und ihre Herkunft. Der Monitor liest diesen Installationsdatensatz, statt die Anwendung im Container zu untersuchen. Diese Informationen stehen deshalb sowohl bei laufendem als auch bei gestopptem Container zur Verfügung."
}
},
{
"table": {
"headers": [
"Tab.",
"Was ändert sich für einen OCI Container"
],
"rows": [
[
"Status",
"Ein <strong>Watchdog</strong> Switch unter Start beim Booten: Die Anwendung wird wieder gestartet, wenn sie von selbst stoppt"
],
[
"App",
"Die Anwendung wird aus dem Datensatz identifiziert und Updates werden nach Image verfolgt"
],
[
"Aktualisierungen",
"Das Image wird aktualisiert oder die Anwendung geändert, mit dem gleichen Ablauf wie das OCI-Menü"
],
[
"Mounts",
"Containerfestplatten und Hostverzeichnisse mit ihrer Belegung"
],
[
"Protokolle",
"Nur für OCI-Container: die Konsolenausgabe der Anwendung"
]
]
}
}
]
},
{
"id": "app",
"title": "App",
"intro": "Die Registerkarte <appLink>App</appLink> bietet die installierte Anwendung als Erkennung mit dem Namen, dem Logo, dem Port und dem Schema des Datensatzes. Die Registrierung öffnet den Editor mit der Methode <strong>OCI-Image (installiert von ProxMenux)</strong>, die keine Konfiguration benötigt.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "boxes",
"title": "Anwendung",
"body": "Die Version der Anwendung im Image, gelesen aus dem Image selbst: seine Umgebung oder seine <code>org.opencontainers.image.version</code> Label. Es ist informativ."
},
{
"icon": "archive",
"title": "Image",
"body": "Das Build-Datum und der Digest des installierten Images. Das Update wird hier entschieden: Der installierte Digest wird mit dem verglichen, den die Registry heute für dasselbe Tag veröffentlicht."
}
]
}
},
{
"list": {
"items": [
"Wenn die Registry einen neuen Digest veröffentlicht, zeigt die Karte <strong>Neues Image</strong> mit seinem Datum und Digest an, auch wenn sich die Anwendungsversion im Inneren nicht geändert hat: Ein Neuaufbau auf einer aktualisierten Basis ist ein Update.",
"Wenn die Digests übereinstimmen, liest die Karte <strong>Version</strong>.",
"Die Karte verlinkt auf das Repository des Images: das GitHub-Projekt oder die Docker-Hub-Seite für ein offizielles Image.",
"Der Zugangslink verwendet die LAN-Adresse des Containers, auch für das Hauptmitglied einer Multicontainer-Anwendung, die eine zweite Adresse in ihrem privaten Netzwerk hat.",
"Die Schaltfläche <strong>Daten aktualisieren</strong> liest den Datensatz und die Registry erneut. Die Optionen zum Suchen oder Registrieren weiterer Anwendungen werden nicht angeboten: Der Container enthält genau die Anwendung seines Datensatzes."
]
}
},
{
"figure": {
"src": "/oci-manager/monitor-app-tab.png",
"alt": "App-Tab eines OCI-Containers mit Anwendungsversion, Image und Repository-Link",
"caption": "Registerkarte App eines mit OCI manager Apps installierten Containers."
}
},
{
"p": "Der Check läuft einmal täglich mit den Update-Checks des Monitors und <strong>Daten aktualisieren</strong> führt ihn sofort aus. Ein neues Image wird als Benachrichtigung über die in <notificationsLink>Benachrichtigungen</notificationsLink> konfigurierten Kanäle gesendet. Das Update wird über den Tab Updates angewendet."
}
]
},
{
"id": "updates",
"title": "Aktualisierungen",
"intro": "Bei einem mit OCI manager Apps installierten Container zeigt die Registerkarte Updates die Anwendung mit ihrem installierten Image und gegebenenfalls dem neuen Image aus der Registry, im selben Format wie andere Anwendungen. Die Paket- und Anwendungs-Updater eines gewöhnlichen LXC werden nicht angeboten.",
"blocks": [
{
"table": {
"headers": [
"Schaltfläche",
"Was es öffnet"
],
"rows": [
[
"Aktualisierung",
"Die Aktualisierung aus <lifecycleLink>Installierte OCI-Anwendungen verwalten</lifecycleLink> für diesen Container im Monitor-Terminal. Sie kann mit oder ohne neues Image ausgeführt werden; ohne neues Image wird nichts verändert. Bei einer Multicontainer-Anwendung werden alle Mitglieder aktualisiert."
],
[
"Ändern",
"Der Editor der Anwendung (Ressourcen, Netzwerk, Pfade und GPU). In einer Multicontainer-Anwendung werden die zusätzlichen Pfade und Geräte des Anwendungscontainers hinzugefügt oder entfernt und in Immich wird geändert, was die Erkennung ausführt."
],
[
"Wiederherstellen",
"Ersetzt Update, wenn eine Operation auf dem Container unterbrochen wurde, und öffnet seine Wiederherstellung."
],
[
"Wiederherstellen (wiederhergestellter Container)",
"Wird für einen aus einem Backup wiederhergestellten Container ohne Vertrag auf diesem Host unter <strong>Wiederhergestellte OCI-Anwendung</strong> angezeigt. Öffnet die <lifecycleLink>Wiederherstellung</lifecycleLink> im Monitor-Terminal; Aktualisieren und Ändern erscheinen nach der Registrierung."
]
]
}
},
{
"p": "Externe Änderungen, Hostverzeichnisse und Multicontainer-Anwendungen werden wie im OCI-Menü behandelt. In einer Multicontainer-Anwendung erscheinen die Buttons und die Optionen nur auf dem Hauptcontainer; die anderen Mitglieder zeigen ihr Image, eine Notiz, dass sie vom Hauptcontainer aktualisiert werden, und eine Schaltfläche, die es öffnet. Wenn das Terminal schließt, werden das Image, der Datensatz und die Mounts erneut gelesen."
},
{
"table": {
"headers": [
"Option",
"Verhalten"
],
"rows": [
[
"Das vor dem Update erstellte Backup behalten",
"Jedes Update sichert den Container, um ihn wiederherzustellen, wenn das Update fehlschlägt. Mit dieser Option wird dasselbe Backup im ausgewählten Speicher gespeichert und erscheint unter den Backups des CT; auf Proxmox Backup Server wird vor dem Update ein Backup geschrieben."
],
[
"Geplante Updates",
"Das Image wird zum gewählten Zeitpunkt nur aktualisiert, wenn die Registry ein neues veröffentlicht, und optional nur, wenn es 1, 3, 7 oder 14 Tage alt ist. Ein Container mit Änderungen außerhalb von ProxMenux wird übersprungen und gemeldet."
]
]
}
}
]
},
{
"id": "logs",
"title": "Protokolle",
"intro": "Die Registerkarte Logs erscheint nur bei mit OCI manager Apps installierten Containern, zwischen Mounts und Backups. Sie zeigt Standardausgabe und Standardfehler des Hauptprozesses des Images, entsprechend der Ausgabe von <code>docker logs</code> bei Docker-Containern.",
"blocks": [
{
"list": {
"items": [
"Die Ausgabe wird auf dem Host in <code>/var/log/proxmenux/oci/VMID.console.log</code> (Modus 0600) vom ersten Start und über Neustarts gehalten, so dass sie mit gestopptem Container gelesen werden kann.",
"Die Datei wird bei 10 MB gedreht und behält drei komprimierte Kopien (<code>/etc/logrotate.d/proxmenux-oci</code>).",
"Jeder Start des Containers wird in der Ausgabe markiert. Die Registerkarte zeigt die Ausgabe seit dem letzten Start standardmäßig; <strong>Vollständiger Verlauf</strong> zeigt auch die vorherigen.",
"Wenn die Anwendung entfernt wird, wird ihre Ausgabe mit ihr entfernt.",
"Die letzten 100-, 500- oder 1000-Zeilen werden gezeigt. Während der Container läuft, werden neue Zeilen live verfolgt; das Scrollen nach oben pausiert das Folgen und <strong>Follow</strong> nimmt es wieder auf.",
"Ein Filter zeigt nur die Zeilen an, die einen Text enthalten, und <strong>Herunterladen</strong> speichert die geladenen Zeilen.",
"Farbcodes werden entfernt und eine Zeile, die eine Fortschrittsleiste neu zeichnet, wird in ihrem endgültigen Zustand angezeigt.",
"Die Registerkarte liest die Datei bei jedem Öffnen; es wird nicht zwischengespeichert."
]
}
},
{
"calloutInfo": {
"title": "Zugangsdaten beim ersten Start",
"body": "Images, die ein generiertes Passwort beim ersten Start ausdrucken, lassen es in dieser Ausgabe, wie <code>docker logs</code>. Der Installateur liest es von dort aus, um es in seiner Zusammenfassung zu zeigen."
}
},
{
"figure": {
"src": "/oci-manager/monitor-logs-tab.png",
"alt": "Logs Tab mit dem Konsolenausgang eines OCI-Containers, dem Zeilenwähler, dem Filter und der Follow-Taste",
"caption": "Konsolenausgabe eines OCI-Containers."
}
}
]
},
{
"id": "terminal",
"title": "Proxmox VE Konsole",
"blocks": [
{
"p": "Ein OCI-Image startet seinen eigenen Prozess als PID 1 und keinen Anmeldedienst. Die übliche LXC-Konsole würde deshalb ein Terminal ohne antwortenden Login-Prozess öffnen. Mit OCI manager Apps installierte Container erhalten <code>cmode: shell</code>: Die Proxmox-VE-Konsole öffnet über <code>lxc-attach</code> eine Shell, entsprechend <code>docker exec</code>. Die laufende Anwendung bleibt dabei unverändert."
},
{
"list": {
"items": [
"Die Shell ist diejenige, die <code>/etc/passwd</code> dem Root im Image gibt. Ein Image, dessen Root keine Shell hat oder keine ausliefert, behält die Standardkonsole.",
"Die Shell ist root im Container, ohne Passwort. Wer es öffnen kann, wird durch die <code>VM.Console</code>-Berechtigung von Proxmox VE entschieden.",
"Das Terminal des Monitors betritt den Container mit <code>pct enter</code>, was auf die gleiche Weise funktioniert."
]
}
}
]
},
{
"id": "mounts",
"title": "Mounts",
"blocks": [
{
"p": "Die Registerkarte <mountsLink>Mounts</mountsLink> listet die Festplatten und Hostverzeichnisse des Containers auf. Die Belegung einer Containerfestplatte auf Blockspeicher wie LVM-thin wird aus deren Dateisystem gelesen, das nur im Container eingehängt ist."
}
]
}
]
}
@@ -0,0 +1,404 @@
{
"meta": {
"title": "Multicontainer-Anwendungen | ProxMenux",
"description": "Wie OCI manager Apps eine Anwendung mit Datenbank und Cache als koordinierte native LXCs umsetzt: Planung, privates Netzwerk, Abhängigkeits-Hook, Validierung und transaktionale Aktualisierungen."
},
"header": {
"title": "Anwendungen mit mehreren Containern",
"description": "Eine Anwendung mit Datenbank, Cache und anderen Diensten wird zu mehreren koordinierten nativen LXCs, die als eine installiert und aktualisiert werden.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Eine Anwendung für den Benutzer, mehrere LXCs für Proxmox VE",
"body": "Eine Multicontainer-Definition ist ein Eintrag des Katalogs. Der Installer erstellt einen nativen LXC pro Dienst und behält seine Abhängigkeiten explizit. Immich, Nextcloud, Paperless-ngx und Tandoor werden auf diese Weise installiert."
}
},
{
"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": "Stack-Plan",
"app": "Anwendungs-LXC",
"appNet": "LAN + privat",
"db": "PostgreSQL LXC",
"cache": "Valkey LXC",
"private": "privat"
}
}
}
]
},
{
"id": "plan",
"title": "1. Der Plan, bevor ein Container existiert",
"blocks": [
{
"p": "Es wird kein LXC erstellt, während die Compose-Definition interpretiert wird. Ein vollständiger Plan steht an erster Stelle, mit jedem Mitglied, Image, VMID, Netzwerk, Pfad, Geheimnis, Ordnung und Gesundheitscheck. Wenn der Plan nicht konsistent ist, wird die Installation nicht gestartet."
},
{
"table": {
"headers": [
"Planelement",
"Inhalt",
"Vor dem Erstellen geprüft"
],
"rows": [
[
"Mitglieder",
"Hauptanwendung, Datenbank, Cache, maschinelles Lernen und andere Abhängigkeiten",
"Einzigartige VMIDs, bekannte Rollen und genau ein Hauptmitglied"
],
[
"Images",
"Rollende Referenz, Architektur und aufgelöster Digest jedes Dienstes",
"Alle existieren, unterstützen die Architektur und bestehen die OCI-Integritätsprüfung"
],
[
"Netzwerk",
"Private Bridge, Subnetz, eine feste Adresse pro Dienst und LAN-Zugang für das Hauptmitglied",
"Keine Kollision mit vorhandenen Brücken oder Subnetzen und keine wiederholte Adresse"
],
[
"Persistenz",
"Container-Disks, Host-Verzeichnisse, Besitzer und Backup",
"Keine überlappenden Pfade, Speicher verfügbar und deklarierte Berechtigungen"
],
[
"Geheimnisse",
"Datenbankpasswort, Anwendungsschlüssel und erste Anmeldeinformationen",
"Einmal generiert und nur an die Mitglieder gegeben, die sie verwenden"
],
[
"Lebenszyklus",
"Start-Order, Stop-Order und Gesundheitscheck pro Mitglied",
"Die Hauptanwendung startet zuletzt und stoppt zuerst"
]
]
}
}
]
},
{
"id": "create",
"title": "2. Erstellung, Mitglied für Mitglied",
"blocks": [
{
"steps": {
"items": [
{
"title": "Reservieren Sie jeden VMID",
"body": "Das Proxmox-VE-Inventar und das Instanzverzeichnis werden geprüft. Ein vorhandener CT wird nicht übernommen; ein Vertrag, der noch zu einer anderen Instanz gehört, wird nicht wiederverwendet."
},
{
"title": "Jedes Image vorbereiten",
"body": "Alle Images werden aufgelöst, heruntergeladen und verifiziert, bevor der erste Container erstellt wird."
},
{
"title": "Erstellen Sie alle Rootfs",
"body": "Die offiziellen OCI-Metadaten werden importiert und die ProxMenux-Instanzidentität und die Mitgliedsrolle hinzugefügt."
},
{
"title": "Privates Netzwerk",
"body": "Eine Brücke und ein Subnetz werden erstellt und jedes Mitglied erhält seine feste Adresse; nur das Hauptmitglied erhält auch die LAN-Schnittstelle."
},
{
"title": "Persistenz",
"body": "Jede Datenbank und Konfiguration erhält eine eigene Containerplatte; nur Daten, die freigegeben werden sollen, verwenden Hostverzeichnisse."
},
{
"title": "Umgebung",
"body": "Interne Endpunkte, Shared Secrets und Servicevariablen werden geschrieben. Die Anwendung erreicht ihre Abhängigkeiten an ihren reservierten Privatadressen."
},
{
"title": "Aufzeichnung",
"body": "Jedes Mitglied zeichnet seine native Konfiguration, die Rootfs-Änderungen, die Updates reproduzieren müssen, und seine Beziehung zum Stack auf."
}
]
}
}
]
},
{
"id": "checks",
"title": "3. Starten und Überprüfen Sie jeden Container",
"intro": "Ein erstellter LXC bedeutet noch keinen betriebsbereiten Dienst. Die Abhängigkeiten starten der Reihe nach und durchlaufen jeweils eine dienstspezifische Prüfung.",
"blocks": [
{
"table": {
"headers": [
"Dienst",
"Überprüfung",
"Was es zeigt"
],
"rows": [
[
"PostgreSQL",
"<code>pg_isready</code> im CT mit erwartetem Host, Benutzer und Datenbank",
"Der Server akzeptiert Verbindungen für die konfigurierte Datenbank"
],
[
"Redis / Valkey",
"<code>redis-cli</code> oder <code>valkey-cli</code> <code>PING</code> gegen seine Privatadresse",
"Der Broker hört zu und antwortet"
],
[
"Immich Maschinelles Lernen",
"HTTP <code>GET /ping</code>, plus eine Überprüfung der ausgewählten GPU-Laufzeit",
"Der Service antwortet und die angeforderte Beschleunigung ist nicht auf CPU zurückgefallen"
],
[
"Nextcloud",
"<code>GET /status.php</code> mit <code>installed=true</code>, <code>maintenance=false</code> und <code>needsDbUpgrade=false</code>",
"Initialisierung ohne anstehende Migration beendet"
],
[
"Paperless-ngx / Tandoor",
"HTTP über die LAN-Adresse und den realen Port des Dienstes",
"Das Frontend und seine Abhängigkeiten stellen die Anwendung bereit"
],
[
"Hauptanwendung",
"Der Endpunkt seines Templates, zum Beispiel <code>/api/server/ping</code> in Immich",
"Der gesamte Stapel arbeitet durch die Anwendung, die die Abhängigkeiten verwendet"
]
]
}
},
{
"calloutWarning": {
"title": "Laufend bedeutet nicht funktionsfähig",
"body": "Der laufende Zustand sagt nur, dass der LXC-Prozess existiert. Wenn der Dienst eine bessere Prüfung bietet, wird eine Exec- oder HTTP-Prüfung mit einem Timeout verwendet. Wenn ein Mitglied stoppt oder seine Prüfung nicht besteht, wird der Stapel nicht als installiert deklariert."
}
}
]
},
{
"id": "hook",
"title": "4. Der Abhängigkeits-Hook",
"blocks": [
{
"p": "Der Haken wird nur auf den Hauptcontainer eines abhängigen Stapels gesetzt. Proxmox VE behält das Skript als Snippet und führt es als <code>hookscript</code> dieses CT aus. Das Stack-Rezept ist nicht im Skript geschrieben: Es befindet sich in einem separaten privaten Vertrag."
},
{
"codeGrid": {
"items": [
{
"title": "Hauptkonfiguration CT",
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
},
{
"title": "Privatvertrag (Beispiel)",
"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": "Vollständige Quelle von proxmenux-stack-dependencies.sh",
"pathCode": "local:snippets/proxmenux-stack-dependencies.sh",
"snippetCode": "stackDependencyHook"
}
},
{
"p": "Das Skript ist für jeden Stack gleich. VMIDs, Namen, Prüftypen und Timeouts stammen aus dem privaten Vertrag <code>/etc/pve/priv/proxmenux-stack-VMID.json</code> jedes Stacks."
},
{
"steps": {
"items": [
{
"title": "Proxmox VE ruft pre-start auf",
"body": "Bevor der Haupt-CT startet, läuft der Hook mit seinem VMID und der Lebenszyklusphase."
},
{
"title": "Eine Sperre pro Stack",
"body": "<code>flock</code> auf <code>/run/lock/proxmenux-stack-VMID.lock</code> verhindert zwei Startsequenzen gleichzeitig."
},
{
"title": "Der Vertrag wird gelesen und validiert",
"body": "Ein bekanntes Schema, numerische Abhängigkeiten, Labels, ein exec, http oder Running Check und ein positives Timeout sind erforderlich."
},
{
"title": "Abhängigkeiten in der Reihenfolge",
"body": "Jeder CT muss vorhanden sein; ein gestoppter wird gestartet und ein bereits laufender wird nicht neu gestartet."
},
{
"title": "Auf Betriebsbereitschaft warten",
"body": "Der Check läuft alle zwei Sekunden, und der CT wird ebenfalls bestätigt, dass er noch läuft."
},
{
"title": "Der Haupt-CT startet",
"body": "Wenn jede Abhängigkeit bereit ist, endet der Vorstart und Proxmox VE startet die Anwendung."
}
]
}
},
{
"calloutInfo": {
"title": "Der Haken stoppt Abhängigkeiten nicht",
"body": "Die Post-Start-, Pre-Stop- und Post-Stop-Phasen tun nichts. Das Stoppen des Haupt-CT lässt PostgreSQL, Redis, Valkey oder Machine Learning laufen. Der Hook ordnet den Start an; er verwandelt nicht mehrere LXCs in einen Prozess."
}
},
{
"table": {
"headers": [
"Typ",
"Beispiel",
"Spätere Starts"
],
"rows": [
[
"Abhängiger Stapel",
"Immich, Nextcloud, Anwendung mit PostgreSQL",
"Der Haken des Haupt-CT startet die Abhängigkeiten und wartet auf sie"
],
[
"Anwendungssuite",
"Arr Suite",
"Kein Hauptmitglied: jeder LXC folgt seinem eigenen <code>onboot</code>"
],
[
"Einzelne Anwendung",
"Jellyfin",
"Proxmox VE startet diesen LXC direkt"
]
]
}
}
]
},
{
"id": "stack-checks",
"title": "5. Kontrollen am Stapel als Ganzes",
"blocks": [
{
"list": {
"items": [
"Jede VMID existiert, ist einzigartig und behält die erwartete Instanzidentität.",
"Jeder Vertrag gehört zum selben Stack, behält seine Rolle und seine aufgezeichnete native Konfiguration.",
"Das Hauptmitglied ist das letzte in <code>start_order</code> und das erste in <code>stop_order</code>.",
"Es fehlt keine Member-, Volume- oder Rootfs-Adaption.",
"Der Haken zeigt auf das offizielle Snippet, sein Inhalt ist unverändert und sein Vertrag entspricht dem Stapelrezept.",
"Die beobachteten Images und Digests stimmen mit den vorbereiteten OCI-Archiven überein.",
"Geräte, GPU-Profile, Mounts, Geheimnisse und Endpunkte stimmen immer noch mit den Verträgen überein.",
"Nachdem alle Abhängigkeiten ihre Prüfung bestanden haben, prüft der Endpunkt der Hauptanwendung die Integration zwischen den Mitgliedern."
]
}
}
]
},
{
"id": "manage",
"title": "Verwalten eines installierten Stapels",
"intro": "Unter <strong>Installierte OCI-Anwendungen verwalten</strong> führt jedes Mitglied zum gesamten Stack. Das Menü bietet <strong>Alle Container der Anwendung aktualisieren</strong>, <strong>Zusätzliche Pfade und Geräte ändern</strong>, <strong>Alle Container mit ihrer gespeicherten Konfiguration neu erstellen</strong> und <strong>Entfernen: Anwendung und Container löschen</strong>. Die Neuerstellung baut jeden Container anhand des gespeicherten Digests aus seinem ursprünglichen Image neu auf, ohne nach einem neueren zu suchen. Sie verwendet dieselben Schritte wie ein Update und wird für aktualisierbare Stacks angeboten.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Jedes Mitglied",
"body": "Der Vertrag des Mitglieds nennt die Haupt-VMID und die vollständige Liste der Mitglieder."
},
{
"title": "Der Stapel ist reproduzierbar",
"body": "Identitäten, Verträge, Hook, Anpassungen und eine koordinierte Wiederholung für dieses Rezept werden validiert."
},
{
"title": "Images zuerst",
"body": "Die Anwendung wird nicht gestoppt, bis jeder Digest gelöst, heruntergeladen und verifiziert wurde."
},
{
"title": "Stoppen und sichern Sie das Set",
"body": "Verifizierte native Backups werden mit gestopptem Stack übernommen, sodass Anwendung und Datenbanken zum selben Zeitpunkt gehören."
},
{
"title": "Aktualisieren und überprüfen Sie jedes Mitglied",
"body": "Anpassung, Netzwerk, Mounts, Geheimnisse und Geräte werden vor dem Gesundheitscheck jedes Mitglieds erneut angewendet."
},
{
"title": "Alles veröffentlichen oder wiederherstellen",
"body": "Die neuen Verträge werden nur veröffentlicht, wenn jedes Mitglied besteht. Wenn einer scheitert, wird jedes Mitglied wiederhergestellt."
}
]
}
},
{
"table": {
"headers": [
"Ändern",
"Was sich ändert",
"Was erhalten bleibt"
],
"rows": [
[
"Extra Pfade und Geräte",
"Sie werden dem Anwendungscontainer hinzugefügt oder daraus entfernt, der neu gestartet wird. Es wird nichts neu erstellt",
"Die Daten der Anwendung, ihrer Datenbank und der anderen Container"
],
[
"Was die Erkennung ausführt (Immich)",
"Der Machine Learning Container nimmt das Image und die Geräte des CPU oder eines GPU des Hosts auf. Die gesamte Anwendung wird gestoppt und aktualisiert, wie in einem Update",
"Der Modell-Cache, die Bibliothek und die Datenbank. Wenn etwas fehlschlägt, werden die vorherigen Container und die vorherige Auswahl wiederhergestellt"
]
]
}
},
{
"calloutWarning": {
"title": "Ein Stack ohne koordinierte Wiederholung wird nicht aktualisiert",
"body": "Wenn die Vorbereitung eines Stapels nicht reproduziert werden kann, wird die Aktualisierung abgelehnt, bevor der Stapel gestoppt wird. Die Anwendung läuft so, wie sie ist."
}
}
]
},
{
"id": "failure",
"title": "6. Wenn etwas versagt",
"blocks": [
{
"p": "Während einer Installation stoppt und entfernt ein Fehler die unvollständigen Container, die die Operation erstellt hat, und die private Bridge, wenn die Operation sie erstellt hat. Ein Stack wird nicht als gültig veröffentlicht, bis die gesamte Sequenz beendet ist."
},
{
"p": "Ein Update ist transaktional: Alle Images werden zuerst vorbereitet, dann stoppt der Stapel, jedes Mitglied wird gesichert und das Backup verifiziert, und nur dann werden alle Rootfs ersetzt. Mitglieder beginnen eins nach dem anderen mit ihrem Gesundheitscheck; Wenn einer fehlschlägt, wird jedes Mitglied aus dem gleichen Backup-Satz wiederhergestellt, so dass die Datenbank und die Anwendung niemals zu verschiedenen Momenten gehören."
},
{
"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": "Jedes Image vorbereiten",
"stop": "Stop, Hauptelement zuerst",
"backup": "Verifiziertes Backup jedes CT",
"replace": "rootfs ersetzen",
"healthy": "Alle funktionsfähig?",
"yes": "Ja",
"no": "Nein",
"commit": "Verträge veröffentlichen",
"rollback": "Jedes Mitglied wiederherstellen"
}
}
}
]
},
{
"id": "not-assumed",
"title": "Was ein Stack nicht beinhaltet",
"blocks": [
{
"list": {
"items": [
"Eine in einem Fluss installierte Suite, wie die Arr-Suite, ist kein abhängiger Stapel: Ihre Container haben keine Startreihenfolge zwischen ihnen.",
"Das private Netzwerk ersetzt nicht die Authentifizierung, TLS oder die Konfiguration jeder Anwendung.",
"Das Backup eines LXC enthält nicht die Brücke, den Haken oder die Verträge des Rests des Stapels.",
"Prowlarr, Sonarr oder Radarr erhalten von ProxMenux keine Indexer, Profile oder Anbieter."
]
}
}
]
}
]
}
@@ -0,0 +1,305 @@
{
"meta": {
"title": "Daten, Pfade und Netzwerk | ProxMenux",
"description": "So bewahrt OCI manager Apps die Daten eines OCI-Containers: Container-Datenträger, Host-Verzeichnisse, rclone-Mounts, Adressen und private Netzwerke."
},
"header": {
"title": "Daten, Pfade und Netzwerk",
"description": "Was im rootfs liegt, was beim Ersetzen erhalten bleibt, wie Container Daten gemeinsam nutzen und wie jeder Container seine Adresse erhält.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Persistenz wird vor dem Erstellen des LXC festgelegt",
"body": "Vor dem Erstellen des Containers werden die vom Image und seiner Compose-Datei deklarierten Volumes ausgelesen. Jeder Pfad, der eine Aktualisierung überstehen muss, erhält einen vom rootfs unabhängigen Mountpoint. Das rootfs enthält damit nur die zum Image gehörenden Dateien und kann ersetzt werden."
}
}
]
},
{
"id": "questions",
"title": "Was der Installer abfragt",
"intro": "Die Vorlage gibt die von der Anwendung benötigten Pfade vor. Jeder wird auf einem Container-Datenträger oder in einem Host-Verzeichnis abgelegt. Vor der Zusammenfassung können weitere Pfade ergänzt werden.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Benötigte Pfade",
"body": "<code>/config</code>, <code>/data</code>, Bibliotheken, Downloads und alle von der Anwendung deklarierten Volumes werden aufgelistet."
},
{
"title": "Speicherort",
"body": "Jeder Pfad wird auf einem Container-Datenträger oder in einem vorhandenen Host-Verzeichnis abgelegt."
},
{
"title": "Speicher und Größe",
"body": "Ein Container-Datenträger wird mit der angegebenen Größe auf einem Proxmox-VE-Speicher erstellt. Die Standardinstallation verwendet <code>local-lvm</code>. Die erweiterte Installation fragt für jeden Pfad zuerst den Speicher und dann die Größe ab; vorgeschlagen wird der Speicher des rootfs. Der Datenträger erscheint als <code>vm-VMID-disk-N</code> und wird als <code>mpN</code> eingebunden."
},
{
"title": "Host-Verzeichnis",
"body": "Das Host-Verzeichnis wird über seinen Pfad angegeben. Existiert es noch nicht, wird es angelegt und dem Host-Benutzer zugeordnet, auf den der Container-Benutzer abgebildet wird."
},
{
"title": "Weitere Pfade",
"body": "Vor der Installation können weitere Zuordnungen von Host-Pfad oder Volume zu einem Pfad im Container ergänzt werden."
},
{
"title": "Zusammenfassung",
"body": "Vor dem Erstellen des CT wird die vollständige Pfadzuordnung angezeigt und im Instanzvertrag gespeichert."
}
]
}
}
]
},
{
"id": "options",
"title": "Die beiden persistenten Speicherorte",
"blocks": [
{
"table": {
"headers": [
"Eigenschaft",
"Container-Datenträger",
"Host-Verzeichnis"
],
"rows": [
[
"In der Konfiguration",
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
],
[
"Containersicherung (vzdump)",
"Mit <code>backup=1</code> enthalten",
"Nicht enthalten"
],
[
"Größe",
"Festgelegt; durch Vergrößern des Mountpoints erweiterbar",
"Der freie Platz im Dateisystem oder Dataset des Hosts"
],
[
"Andere Container",
"Nur vom zugehörigen Container eingebunden",
"Dasselbe Verzeichnis kann in mehrere Container eingebunden werden"
],
[
"Snapshots und Wiederherstellung",
"Von Proxmox VE zusammen mit dem CT verwaltet",
"Im Speicher des Hosts verwaltet"
],
[
"Beim Entfernen der Anwendung",
"Wird mit dem Container gelöscht",
"Bleibt mit seinem Inhalt erhalten"
],
[
"Beim Verschieben des CT auf einen anderen Knoten",
"Wird mit dem CT verschoben",
"Derselbe Pfad muss auf dem anderen Knoten vorhanden sein"
]
]
}
},
{
"p": "Das rootfs ist den Binärdateien und dem Inhalt des Images vorbehalten. Eine Aktualisierung oder Neuerstellung ersetzt es, ohne eine der beiden Arten von Mountpoints anzutasten."
}
]
},
{
"id": "example",
"title": "Beispiel: ein Container mit beiden Speicherorten",
"blocks": [
{
"code": {
"title": "Jellyfin als CT 151 auf local-lvm installiert (Auszug)",
"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": "Eine Aktualisierung oder Neuerstellung ersetzt nur das rootfs: <code>mp0</code> bewahrt Benutzer, Bibliotheken und Einstellungen, während <code>mp1</code> weiterhin dieselben Medien bereitstellt. Die Wiederherstellung der CT-Sicherung stellt <code>/config</code> wieder her. Das Medienverzeichnis wird bei Bedarf aus der Sicherung des Host-Speichers wiederhergestellt."
},
{
"flow": {
"nodes": [
{
"label": "Vertrag",
"detail": "/config"
},
{
"label": "Speicherort",
"detail": "Container-Datenträger\noder Host-Verzeichnis"
},
{
"label": "LXC",
"detail": "Für die Anwendung\nimmer /config"
}
],
"caption": "Die Anwendung sieht den vom Image vorgegebenen Pfad. Nur der Speicherort ändert sich."
}
}
]
},
{
"id": "shared",
"title": "Ein Host-Verzeichnis, mehrere Container",
"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": "Host-Verzeichnis",
"config": "Eigene Konfiguration"
}
}
},
{
"p": "Jeder Container speichert seine Konfiguration auf einem eigenen Datenträger. Bibliothek oder Downloads liegen in einem gemeinsamen Host-Verzeichnis, das in allen Containern unter demselben internen Pfad eingebunden wird. So ist der Pfad, in den eine Anwendung schreibt, derselbe, aus dem eine andere liest."
}
]
},
{
"id": "rclone",
"title": "Cloud-Speicher über die rclone-Anwendung",
"intro": "Der rclone-Eintrag im Katalog bietet neben der Installation auch <strong>Mount in einem vorhandenen rclone-OCI-Container aktivieren</strong>. Dabei wird ein bereits in der rclone-Weboberfläche angelegtes und autorisiertes Remote eingehängt und auf dem Host bereitgestellt. Andere Container können es als Host-Verzeichnis nutzen.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Container und Remote",
"body": "Die VMID des rclone-Containers, der genaue Name des Remotes und optional ein Pfad darin."
},
{
"title": "Mount-Name und Cache",
"body": "Der Name des Mounts und der VFS-Cache-Modus: <code>off</code>, <code>minimal</code>, <code>writes</code> oder <code>full</code> (Standard)."
},
{
"title": "Bereitgestellte Ansichten",
"body": "Ein gemeinsames Stammverzeichnis, standardmäßig <code>/mnt/oci-shared</code>, enthält eine Ansicht mit Lese- und Schreibzugriff unter <code>/mnt/oci-shared/remotes/NAME</code> sowie eine schreibgeschützte Ansicht unter <code>/mnt/oci-shared/remotes-ro/NAME</code>."
},
{
"title": "Aktivierung",
"body": "Nach der Bestätigung wird der CT gestoppt. Sein Startbefehl und ein Proxmox-VE-Hookscript werden eingerichtet, dann wird er wieder gestartet. Der Vorgang wartet, bis beide Ansichten auf dem Host eingehängt sind."
}
]
}
},
{
"calloutInfo": {
"title": "Wenn der Mount nicht zustande kommt",
"body": "Die vorherige Container-Konfiguration wird wiederhergestellt und der Container erneut gestartet. Eine fehlgeschlagene Aktivierung lässt rclone damit im bisherigen Zustand."
}
}
]
},
{
"id": "network",
"title": "Adressen und Netzwerke",
"intro": "Eine einzelne Anwendung benötigt eine Adresse. Eine Anwendung aus mehreren Containern braucht zusätzlich ein stabiles Netzwerk zwischen ihren Mitgliedern.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "network",
"title": "Anwendung mit einem Container",
"body": "Gewählt werden die Netzwerk-Bridge sowie DHCP oder eine feste Adresse im CIDR-Format. Der LXC hat eine eigene Adresse, und die Zusammenfassung zeigt die vollständigen Dienst-URLs."
},
{
"icon": "waypoints",
"title": "Anwendung mit mehreren Containern",
"body": "Ein freies Subnetz wird ermittelt und eine dauerhafte private Bridge erstellt. Jedes Mitglied – Anwendung, Datenbank und Cache – erhält dort eine feste Adresse."
}
]
}
},
{
"flow": {
"nodes": [
{
"label": "LAN",
"detail": "Erreichbare Adresse\nnur für den Hauptdienst"
},
{
"label": "Haupt-LXC",
"detail": "Web / API\nLAN + privates Netzwerk"
},
{
"label": "Privates Netzwerk",
"detail": "PostgreSQL · Valkey · ML\nfeste Adressen"
}
],
"caption": "Abhängigkeiten kommunizieren über das private Netzwerk und haben keine Adresse im LAN."
}
},
{
"p": "Der Stack-Vertrag speichert Bridge, Subnetz, Adressen und Beziehungen zwischen den Diensten. Bei einer Aktualisierung der Anwendung wird dieselbe Topologie für alle Mitglieder wiederverwendet. ProxMenux Monitor öffnet den Hauptcontainer über seine LAN-Adresse, nicht über seine Adresse im privaten Netzwerk."
}
]
},
{
"id": "ownership",
"title": "Datei- und Verzeichnisbesitz",
"blocks": [
{
"list": {
"items": [
"Neue Verzeichnisse werden mit der UID und GID angelegt, auf die der unprivilegierte LXC abgebildet wird.",
"Bei vorhandenen Verzeichnissen wird der Eigentümer nicht rekursiv geändert.",
"Sockets, Systemdateien und sensible Pfade werden nicht als allgemeine Host-Verzeichnisse angeboten."
]
}
}
]
},
{
"id": "backup",
"title": "Was eine Containersicherung enthält",
"blocks": [
{
"table": {
"headers": [
"Bestandteil",
"In der vzdump-Sicherung des CT",
"Aufbewahrungsort"
],
"rows": [
[
"OCI-rootfs",
"Ja",
"In der CT-Sicherung; außerdem aus Image und Vertrag neu erstellbar"
],
[
"Container-Datenträger mit <code>backup=1</code>",
"Ja",
"Die CT-Sicherung"
],
[
"Host-Verzeichnis",
"Nein",
"Die Sicherung des Host-Speichers"
],
[
"Instanzvertrag",
"Ja, die im CT mitgeführte Kopie",
"<code>/.proxmenux/oci-record.json</code> im CT; weitere Host- und Cluster-Kopien werden separat gespeichert"
],
[
"Anwendung mit mehreren Containern",
"Jedes Mitglied in einer eigenen Sicherung",
"Die Sicherungen aller Mitglieder sowie der Stack-Vertrag und seine Netzwerk-Bridge auf dem Host"
]
]
}
}
]
}
]
}
@@ -192,7 +192,7 @@
"list": {
"items": [
"A Dockerfile without a published image: the image has to be built and published in an OCI registry first.",
"A Compose file with several services: it is blocked because it describes more than one image. This option installs a single container.",
"A Compose file with several services is blocked: this option installs one service in one container at a time, even when several services use the same image.",
"<code>configs</code>, external secrets or device formats that cannot be translated unambiguously.",
"Shell substitutions such as <code>$(command)</code>: the resulting value has to be written instead.",
"<code>docker run</code> options that are not recognised, and <code>--env-file</code>: an explicit Compose file is read instead."
@@ -215,7 +215,7 @@
{
"id": "restore",
"title": "Backup, restore and another host",
"intro": "A backup made with vzdump or Proxmox Backup Server includes the container, its disks and the copy of its contract. What the installation keeps on the host is not part of it. <strong>Manage installed OCI applications</strong> detects the containers restored on a host that has no contract for them, a new Proxmox installation or another host, and offers to register them again.",
"intro": "A backup made with vzdump or Proxmox Backup Server includes the container, the container disks selected for backup and the copy of its contract. What the installation keeps on the host is not part of it. <strong>Manage installed OCI applications</strong> detects the containers restored on a host that has no contract for them, a new Proxmox installation or another host, and offers to register them again.",
"blocks": [
{
"steps": {
@@ -462,7 +462,7 @@
],
[
"Container disks",
"Proxmox moves them with the container. HA needs them on shared storage."
"Proxmox moves them with the container. HA needs their data available on the target node, through shared storage or a supported replication setup."
],
[
"Host directories and devices",
@@ -179,7 +179,7 @@
["OCI rootfs", "Yes", "The CT backup; it can also be rebuilt from the image and the contract"],
["Container disk with <code>backup=1</code>", "Yes", "The CT backup"],
["Host directory", "No", "The backup of the host storage"],
["Instance contract", "No", "<code>/usr/local/share/proxmenux/oci/instances/VMID/</code> on the host"],
["Instance contract", "Yes, the copy carried inside the CT", "<code>/.proxmenux/oci-record.json</code> inside the CT; additional host and cluster copies are kept separately"],
["Multi-container application", "Each member in its own backup", "The backups of every member, plus the stack contract and its bridge on the host"]
]
}
@@ -1,17 +1,17 @@
{
"meta": {
"title": "Cómo se traduce una imagen OCI | ProxMenux",
"description": "Del repositorio de la imagen y su archivo Compose a una plantilla revisable, un plan de despliegue y un LXC nativo de Proxmox VE, sin Docker dentro."
"title": "Cómo se adapta una imagen OCI | ProxMenux",
"description": "Del repositorio de la imagen y su archivo Compose a una plantilla que puedes revisar, un plan de despliegue y un LXC nativo de Proxmox VE, sin Docker dentro."
},
"header": {
"title": "Cómo se traduce una imagen OCI",
"description": "Del repositorio de la imagen y su archivo Compose a una plantilla revisable, un plan de despliegue y un LXC nativo, sin instalar Docker dentro.",
"title": "Cómo se adapta una imagen OCI",
"description": "Del repositorio de la imagen y su archivo Compose a una plantilla que puedes revisar, un plan de despliegue y un LXC nativo, sin instalar Docker dentro.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "pipeline",
"title": "La cadena de traducción",
"title": "El proceso de adaptación",
"blocks": [
{
"mermaid": {
@@ -20,7 +20,7 @@
"repo": "Repositorio de la imagen",
"converter": "Conversor",
"template": "Plantilla JSON",
"blockers": "¿Sin bloqueos?",
"blockers": "¿Sin impedimentos?",
"no": "No",
"yes": "Sí",
"review": "Revisión / overlay",
@@ -30,7 +30,7 @@
}
},
{
"p": "El conversor lee la imagen y el archivo Compose que publica su proyecto y escribe una plantilla JSON. Una plantilla con bloqueos sin traducir pasa por revisión, donde un overlay curado los resuelve, antes de publicarse en el catálogo. Solo las plantillas sin bloqueos se ofrecen para instalar."
"p": "El conversor lee la imagen y el archivo Compose publicados por el proyecto y genera una plantilla JSON. Si quedan requisitos que no se han podido adaptar y que impiden la instalación, la plantilla pasa por una revisión: un archivo de ajustes revisados, llamado overlay, los resuelve antes de publicarla en el catálogo. Solo se ofrecen para instalar las plantillas que no tienen impedimentos pendientes."
}
]
},
@@ -41,10 +41,26 @@
{
"cards": {
"items": [
{ "icon": "archive", "title": "Identidad de la imagen", "body": "Repositorio, etiqueta rolling, arquitectura, digest resuelto y revisión del origen." },
{ "icon": "braces", "title": "Contrato del contenedor", "body": "Entrypoint, Cmd, entorno, usuario, directorio de trabajo, señal de parada, puertos y volúmenes." },
{ "icon": "layers", "title": "Traducción a Proxmox VE", "body": "Recursos, seguridad, puntos de montaje, dispositivos, sysctls, healthchecks y las adaptaciones que necesita cada uno, con su motivo." },
{ "icon": "shield", "title": "Compatibilidad", "body": "Claves admitidas, bloqueos sin traducir y el estado de cada validación." }
{
"icon": "archive",
"title": "Identidad de la imagen",
"body": "Repositorio, etiqueta de actualización continua, arquitectura, digest resuelto y revisión de origen."
},
{
"icon": "braces",
"title": "Contrato del contenedor",
"body": "Entrypoint, Cmd, entorno, usuario, directorio de trabajo, señal de parada, puertos y volúmenes."
},
{
"icon": "layers",
"title": "Adaptación a Proxmox VE",
"body": "Recursos, seguridad, puntos de montaje, dispositivos, sysctls, comprobaciones de estado y las adaptaciones necesarias en cada caso, con su justificación."
},
{
"icon": "shield",
"title": "Compatibilidad",
"body": "Claves compatibles, requisitos pendientes de adaptar que impiden la instalación y estado de cada validación."
}
]
}
}
@@ -56,12 +72,32 @@
"blocks": [
{
"table": {
"headers": ["Origen", "Ejemplo", "Resultado nativo"],
"headers": [
"Origen",
"Ejemplo",
"Resultado nativo"
],
"rows": [
["Metadatos OCI", "<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>", "Proxmox VE los importa al crear el CT"],
["Docker Compose", "<code>environment</code>, <code>volumes</code>, <code>devices</code>", "entradas de entorno del LXC, <code>mpN</code> y <code>devN</code>"],
["Perfil de ProxMenux", "GPU, healthcheck, credenciales", "preguntas y adaptaciones revisadas"],
["Usuario", "VMID, almacenamiento, red", "el contrato de la instancia"]
[
"Metadatos OCI",
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
"Proxmox VE los importa al crear el CT"
],
[
"Docker Compose",
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
"Entradas de entorno de LXC, <code>mpN</code> y <code>devN</code>"
],
[
"Perfil de ProxMenux",
"GPU, comprobación de estado, credenciales",
"Preguntas y adaptaciones revisadas"
],
[
"Usuario",
"VMID, almacenamiento, red",
"El contrato de la instancia"
]
]
}
}
@@ -69,18 +105,39 @@
},
{
"id": "install",
"title": "Qué ocurre durante una instalación",
"title": "Qué ocurre durante la instalación",
"blocks": [
{
"steps": {
"items": [
{ "title": "Resolver", "body": "Se consulta el registro, se selecciona la arquitectura del host y se fija el digest efectivo de la etiqueta rolling." },
{ "title": "Descargar y verificar", "body": "Skopeo descarga la imagen como archivo OCI, y cada capa se comprueba contra su digest y se descomprime antes de crear nada. Una descarga dañada se repite una vez antes de detener la instalación." },
{ "title": "Construir", "body": "<code>pct create</code> construye el rootfs a partir del archivo y conserva los metadatos oficiales de proceso de la imagen." },
{ "title": "Conectar", "body": "Se añaden los volúmenes, la red, el entorno, los dispositivos y los perfiles de seguridad declarados." },
{ "title": "Consola", "body": "La salida de consola del contenedor se guarda en el host, y la consola de Proxmox VE abre un shell cuando la imagen incluye uno." },
{ "title": "Comprobar", "body": "El primer arranque espera una dirección y la respuesta del servicio; un fallo no se presenta como instalación correcta." },
{ "title": "Registrar", "body": "La configuración efectiva se escribe en el contrato de la instancia que usan las actualizaciones y las recreaciones." }
{
"title": "Resolver la referencia",
"body": "Se consulta el registro, se selecciona la arquitectura del host y se fija el digest concreto al que apunta la etiqueta de actualización continua."
},
{
"title": "Descargar y verificar",
"body": "Skopeo descarga la imagen como un archivo OCI. Antes de crear nada, se verifica el digest de cada capa y se descomprimen todas las capas. Si la descarga está dañada, se vuelve a descargar una vez antes de detener la instalación."
},
{
"title": "Crear el sistema de archivos",
"body": "<code>pct create</code> crea el rootfs a partir del archivo y conserva los metadatos oficiales del proceso de la imagen."
},
{
"title": "Conectar los recursos",
"body": "Se aplican los volúmenes, la red, el entorno, los dispositivos y los perfiles de seguridad declarados."
},
{
"title": "Consola",
"body": "La salida de consola del contenedor se guarda en el host. La consola de Proxmox VE abre una shell si la imagen incluye una."
},
{
"title": "Comprobar",
"body": "En el primer arranque se espera a que el contenedor tenga una dirección y el servicio responda. Si falla, la instalación no se da por completada correctamente."
},
{
"title": "Registrar la configuración",
"body": "La configuración efectiva se guarda en el contrato de la instancia que utilizan las actualizaciones y las recreaciones."
}
]
}
}
@@ -89,7 +146,7 @@
{
"id": "example",
"title": "Ejemplo: una imagen con /config y /downloads",
"intro": "Una definición habitual de Compose y la configuración de Proxmox VE en la que se convierte. Las rutas que espera la aplicación no cambian.",
"intro": "Una definición Compose habitual y la configuración de Proxmox VE que se genera a partir de ella. Las rutas que espera la aplicación no cambian.",
"blocks": [
{
"codeGrid": {
@@ -99,14 +156,14 @@
"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 (extracto)",
"title": "/etc/pve/lxc/VMID.conf (fragmento)",
"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> es un segundo disco que pertenece al contenedor, con el nombre <code>vm-VMID-disk-N</code> en el almacenamiento elegido. Se monta en <code>/config</code> y, con <code>backup=1</code>, forma parte del backup del contenedor. <code>mp1</code> no crea ningún disco: enlaza el directorio del host <code>/srv/downloads</code> con <code>/downloads</code> dentro del LXC. El puerto 8080 no se mapea: el LXC tiene una dirección propia y el servicio responde en ella."
"p": "<code>mp0</code> es un segundo disco que pertenece al contenedor, con el nombre <code>vm-VMID-disk-N</code> en el almacenamiento seleccionado. Se monta en <code>/config</code> y, con <code>backup=1</code>, forma parte del backup del contenedor. <code>mp1</code> no crea ningún disco: monta el directorio del host <code>/srv/downloads</code> en <code>/downloads</code> dentro del LXC. El puerto 8080 no se mapea: el LXC tiene su propia dirección y el servicio responde en ella."
}
]
}
@@ -1,11 +1,11 @@
{
"meta": {
"title": "Instalar una imagen que no está en el catálogo | ProxMenux",
"description": "Traducción de una imagen OCI desde un archivo Compose, una URL, un comando docker run o una referencia de imagen, con revisión de lo que ProxMenux puede reproducir antes de instalarla."
"title": "Instalar una imagen fuera del catálogo | ProxMenux",
"description": "Adapta una imagen OCI a partir de un archivo Compose, una URL, un comando docker run o una referencia de imagen, y revisa qué puede reproducir ProxMenux antes de instalarla."
},
"header": {
"title": "Instalar una imagen que no está en el catálogo",
"description": "Una imagen propia se traduce desde su archivo Compose, un comando docker run o solo su referencia, y el resultado se presenta para revisión antes de crear ningún LXC.",
"title": "Instalar una imagen que no esté en el catálogo",
"description": "Tu imagen se adapta a partir de su archivo Compose, de un comando docker run o de su referencia. El resultado se muestra para que lo revises antes de crear ningún LXC.",
"section": "OCI manager Apps"
},
"sections": [
@@ -14,8 +14,8 @@
"blocks": [
{
"calloutInfo": {
"title": "El mismo conversor, el mismo instalador",
"body": "La opción <strong>Instalar una imagen que no está en el catálogo</strong> utiliza el conversor y el instalador de las plantillas del catálogo. La diferencia es que el contrato se genera en ese momento a partir de la definición aportada y se valida antes de crear ningún LXC."
"title": "El mismo conversor y el mismo instalador",
"body": "La opción <strong>Instalar una imagen que no esté en el catálogo</strong> utiliza el mismo conversor y el mismo instalador que las plantillas del catálogo. La diferencia es que el contrato se genera en ese momento a partir de la definición proporcionada y se valida antes de crear ningún LXC."
}
}
]
@@ -23,45 +23,92 @@
{
"id": "sources",
"title": "Cómo se describe la imagen",
"intro": "La primera pantalla pregunta cómo se describe la imagen. Cuatro formas aportan una definición que se traduce, una quinta usa solo el nombre de la imagen y tres reciben un oci-compose ya escrito.",
"intro": "La primera pantalla pregunta cómo vas a describir la imagen. Cuatro opciones reciben una definición que se adapta, una quinta usa solo el nombre de la imagen y otras tres leen un oci-compose ya escrito.",
"blocks": [
{
"table": {
"headers": ["Opción", "Qué lee"],
"headers": [
"Opción",
"Qué lee"
],
"rows": [
["Pegar su archivo Compose en la terminal", "El YAML se pega en la terminal y termina con Ctrl+D."],
["Leer su archivo Compose desde un archivo de este host", "Una ruta del nodo, <code>/root/docker-compose.yml</code> por defecto. El archivo debe existir y ocupar como máximo 256 KiB."],
["Descargar su archivo Compose desde una dirección", "Una dirección <code>http://</code> o <code>https://</code> que sirva el YAML sin procesar. Se descargan como máximo 256 KiB."],
["Pegar su comando docker run en la terminal", "El comando que publica el proyecto. Se traducen puertos, entorno, volúmenes, dispositivos, capacidades, usuario, memoria compartida y el resto de opciones admitidas."],
["Solo la referencia de la imagen, sin archivo Compose", "Una referencia como <code>ghcr.io/user/application:latest</code>. Se consulta el registro y se conservan los metadatos OCI de la imagen."],
["Pegar un oci-compose en la terminal", "El JSON se pega en la terminal y termina con Ctrl+D. No se traduce: se comprueba y se instala tal como está escrito."],
["Leer un oci-compose desde un archivo de este host", "Un archivo JSON del nodo, <code>/root/oci-compose.json</code> por defecto, de 2 MiB como máximo."],
["Descargar un oci-compose desde una dirección", "Una dirección <code>http://</code> o <code>https://</code> que sirva el archivo JSON. Se descargan como máximo 2 MiB."]
[
"Pegar su archivo Compose en la terminal",
"Pega el YAML en la terminal y termina con Ctrl+D."
],
[
"Leer su archivo Compose desde este host",
"Una ruta del nodo; la predeterminada es <code>/root/docker-compose.yml</code>. El archivo debe existir y no superar los 256 KiB."
],
[
"Descargar su archivo Compose desde una dirección",
"Una dirección <code>http://</code> o <code>https://</code> que sirva el YAML sin procesar. Se descargan como máximo 256 KiB."
],
[
"Pegar su comando docker run en la terminal",
"El comando publicado por el proyecto. Se adaptan los puertos, el entorno, los volúmenes, los dispositivos, las capabilities, el usuario, la memoria compartida y las demás opciones compatibles."
],
[
"Solo la referencia de imagen, sin archivo Compose",
"Una referencia como <code>ghcr.io/user/application:latest</code>. Se consulta el registro y se conservan los metadatos OCI de la imagen."
],
[
"Pegar un oci-compose en la terminal",
"Pega el JSON en la terminal y termina con Ctrl+D. No se convierte: se valida y se instala tal como está escrito."
],
[
"Leer un oci-compose desde este host",
"Un archivo JSON del nodo, <code>/root/oci-compose.json</code> por defecto, de un máximo de 2 MiB."
],
[
"Descargar un oci-compose desde una dirección",
"Una dirección <code>http://</code> o <code>https://</code> que sirva el archivo JSON. Se descargan como máximo 2 MiB."
]
]
}
},
{
"figure": {
"src": "/oci-manager/custom-source-menu.png",
"alt": "Menú que pregunta cómo se describe una imagen que no está en el catálogo",
"caption": "Las formas de describir una imagen que no está en el catálogo."
"alt": "Menú para elegir cómo describir una imagen que no está en el catálogo",
"caption": "Formas de describir una imagen fuera del catálogo."
}
}
]
},
{
"id": "reference-only",
"title": "Qué aporta solo la referencia de la imagen",
"intro": "Una imagen lleva sus metadatos de proceso, pero no todo lo que un archivo Compose suele añadir a su alrededor.",
"title": "Qué aporta una referencia de imagen por sí sola",
"intro": "La imagen contiene los metadatos de su proceso, pero no todo el entorno que suele añadir un archivo Compose.",
"blocks": [
{
"table": {
"headers": ["Se lee de la imagen", "No está en la imagen", "Consecuencia"],
"headers": [
"Se lee de la imagen",
"No está en la imagen",
"Consecuencia"
],
"rows": [
["<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> y entorno integrado", "Variables que solo aparecen en la documentación", "Se añaden durante la instalación o con Modificar"],
["Volúmenes declarados por la imagen", "Directorios del host que solo nombra un archivo Compose", "Las rutas adicionales se añaden antes de instalar"],
["Puertos <code>EXPOSE</code>", "La URL, el protocolo o un healthcheck funcional", "Se confirman el puerto y la forma de comprobar el servicio"],
["Arquitecturas y digest del registro", "Dispositivos, privilegios o dependencias externas", "Ninguno se activa sin una definición que lo pida"]
[
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> y el entorno incorporado",
"Variables que solo figuran en la documentación",
"Se añaden durante la instalación o desde Modificar"
],
[
"Volúmenes declarados por la imagen",
"Directorios del host que solo se indican en Compose",
"Las rutas adicionales se añaden antes de instalar"
],
[
"Puertos <code>EXPOSE</code>",
"La URL, el protocolo o la comprobación funcional del servicio",
"Se confirman el puerto y la forma de comprobar el servicio"
],
[
"Arquitecturas y digest del registro",
"Dispositivos, privilegios o dependencias externas",
"No se habilitan sin una definición que los solicite"
]
]
}
}
@@ -69,29 +116,44 @@
},
{
"id": "review",
"title": "Revisión antes de instalar",
"intro": "Tras traducir la definición, ProxMenux muestra lo que ha entendido antes de pedir VMID, recursos o almacenamiento.",
"title": "Revisar antes de instalar",
"intro": "Tras adaptar la definición, ProxMenux muestra cómo la ha interpretado antes de preguntar el VMID, los recursos o el almacenamiento.",
"blocks": [
{
"steps": {
"items": [
{ "title": "Analizar", "body": "Se leen servicios, imagen, puertos, rutas, entorno, dispositivos, seguridad y healthcheck." },
{ "title": "Consultar el registro", "body": "La imagen debe existir en su registro, y se enumeran las arquitecturas que publica. Un registro privado se lee con la cuenta guardada para él." },
{ "title": "Enumerar lo que no se aplica", "body": "Se enumeran las etiquetas, las redes Docker, los ajustes de Swarm y el resto de claves que no tienen efecto en un LXC." },
{ "title": "Bloquear lo que no puede traducirse", "body": "Una clave sin equivalencia segura aparece en <strong>Lo que no puede traducirse</strong> y la instalación no continúa. Nada se descarta en silencio." },
{ "title": "Pedir los secretos", "body": "Las variables cuyo nombre corresponde a una contraseña, un token o una clave se convierten en preguntas sensibles de la instalación." }
{
"title": "Analizar",
"body": "Se leen servicios, imagen, puertos, rutas, entorno, dispositivos, seguridad y comprobaciones de estado."
},
{
"title": "Consultar el registro",
"body": "La imagen debe existir en el registro y se muestran las arquitecturas publicadas. Si el registro es privado, se utiliza la cuenta guardada para él."
},
{
"title": "Enumerar lo que no se aplica",
"body": "Se enumeran las etiquetas, redes de Docker, ajustes de Swarm y otras claves que no tienen efecto en un LXC."
},
{
"title": "Bloquear opciones sin equivalente seguro",
"body": "Las claves sin equivalente seguro aparecen en <strong>Opciones sin equivalente</strong> e impiden continuar con la instalación. No se descartan silenciosamente."
},
{
"title": "Solicitar secretos",
"body": "Las variables cuyo nombre indica una contraseña, token o clave se solicitan como datos sensibles durante la instalación."
}
]
}
},
{
"figure": {
"src": "/oci-manager/custom-review.png",
"alt": "Resumen de lo que ProxMenux ha entendido de un archivo Compose",
"caption": "El resumen que se muestra antes de que la instalación pida VMID y recursos."
"alt": "Resumen de cómo ProxMenux ha interpretado el archivo Compose",
"caption": "Resumen mostrado antes de que el instalador pregunte el VMID y los recursos."
}
},
{
"p": "Tras aceptar el resumen, el recorrido es el del catálogo: nombre, modo predeterminado o avanzado, VMID, CPU, memoria, red, arranque con el nodo, rutas persistentes, rutas adicionales, dispositivos compatibles y resumen final."
"p": "Tras aceptar el resumen se sigue el mismo asistente que en el catálogo: nombre, modo predeterminado o avanzado, VMID, CPU, memoria, red, arranque con el nodo, rutas persistentes, rutas adicionales, dispositivos compatibles y resumen final."
}
]
},
@@ -118,68 +180,79 @@
{
"id": "oci-compose",
"title": "Un oci-compose escrito a mano",
"intro": "Un oci-compose es el archivo JSON desde el que se instala una aplicación. El catálogo guarda uno por cada aplicación, y el mismo formato puede escribirse a mano e instalarse con esta opción.",
"intro": "Un oci-compose es el archivo JSON a partir del cual se instala una aplicación. El catálogo conserva uno por aplicación. Puedes escribir el mismo formato a mano e instalarlo con esta opción.",
"blocks": [
{
"p": "El que se escribe a mano indica lo que decide su autor: la imagen, sus puertos, variables y volúmenes, y lo que pregunta la instalación. ProxMenux completa el resto al leer el archivo. Puede decir lo que un archivo Compose no puede: el texto de una pregunta, una contraseña generada durante la instalación, un perfil de GPU, el propietario de cada volumen, la comprobación del primer arranque o las credenciales que se muestran al terminar."
"p": "Al escribirlo a mano, el autor decide la imagen, los puertos, las variables, los volúmenes y las preguntas de la instalación. ProxMenux completa el resto al leer el archivo. Permite expresar lo que Compose no incluye: el texto de una pregunta, una contraseña generada durante la instalación, un perfil de GPU, el propietario de cada volumen, la comprobación del primer arranque o las credenciales mostradas al final."
},
{
"steps": {
"items": [
{
"title": "Comprobar",
"body": "Un archivo con errores no se instala. Cada error indica el campo en el que está, y un archivo que no es JSON válido indica la línea y la columna."
"body": "Los archivos con errores no se instalan. Cada error indica el campo afectado; si el JSON no es válido, se muestran la línea y la columna."
},
{
"title": "Revisar",
"body": "Un archivo válido muestra lo que instala: imagen, dirección web, puertos, rutas persistentes, las variables que pide la instalación y los archivos que escribe."
"body": "Si el archivo es válido, se muestra lo que instalará: imagen, dirección web, puertos, rutas persistentes, variables que solicitará el instalador y archivos que escribirá."
},
{
"title": "Instalar",
"body": "La instalación es la de cualquier aplicación del catálogo, con ajustes por defecto o avanzados."
"body": "Se utiliza el mismo instalador que para cualquier aplicación del catálogo, con ajustes predeterminados o avanzados."
}
]
}
},
{
"calloutWarning": {
"title": "Un archivo que decide privilegios",
"body": "Un oci-compose decide qué se monta en el contenedor y con qué privilegios. El resumen lo indica antes de instalar: instala solo archivos que vengan de una fuente de confianza."
"title": "Un archivo que decide los privilegios",
"body": "El oci-compose determina qué se monta dentro del contenedor y con qué privilegios. La revisión lo muestra antes de instalar: utiliza únicamente archivos de fuentes de confianza."
}
},
{
"p": "El formato se describe bloque a bloque, con dos ejemplos completos, en el <readmeLink>README del motor OCI</readmeLink>. El registro de una instalación se lee de la misma forma: solo se usa la plantilla con la que se instaló, y ninguna de las respuestas de esa instalación."
"p": "El <readmeLink>README del motor OCI</readmeLink> explica el formato bloque a bloque e incluye dos ejemplos completos. También se puede leer el registro de una instalación: solo se utiliza la plantilla original, sin incorporar ninguna de las respuestas de aquella instalación."
}
]
},
{
"id": "private-registries",
"title": "Imágenes en registros privados",
"intro": "Una imagen en un registro privado, como un paquete privado de GitHub o un repositorio privado de Docker Hub, se lee con una cuenta guardada en ProxMenux.",
"title": "Imágenes de registros privados",
"intro": "Las imágenes de registros privados, como un paquete privado de GitHub o un repositorio privado de Docker Hub, se consultan con una cuenta guardada en ProxMenux.",
"blocks": [
{
"steps": {
"items": [
{ "title": "El registro rechaza la imagen", "body": "Cuando el registro responde que la imagen necesita una cuenta, la revisión ofrece iniciar sesión en ese registro y vuelve a leer la imagen." },
{ "title": "Iniciar sesión", "body": "Un usuario y una contraseña o un token de acceso que puedan descargar la imagen. El registro los comprueba y solo se guardan si los acepta." },
{ "title": "Instalar y mantener al día", "body": "La instalación descarga la imagen con esa cuenta, y también las actualizaciones, Modificar, Recrear, la vigilancia y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster." }
{
"title": "El registro deniega el acceso a la imagen",
"body": "Si el registro indica que la imagen requiere una cuenta, la revisión ofrece iniciar sesión en ese registro y vuelve a consultar la imagen."
},
{
"title": "Iniciar sesión",
"body": "Un usuario y una contraseña o token con permiso para descargar la imagen. El registro los comprueba y solo se guardan si los acepta."
},
{
"title": "Instalar y mantener al día",
"body": "Esa cuenta se utiliza para descargar la imagen durante la instalación y también en las actualizaciones, Modificar, Recrear, la vigilancia y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster."
}
]
}
},
{ "p": "<strong>Cuentas de registro</strong>, en el menú principal de OCI manager Apps, lista las cuentas guardadas por registro y usuario, nunca su secreto. Desde cada cuenta se puede comprobar, descargar o instalar una imagen, y actualizar o eliminar la cuenta." },
{
"p": "<strong>Cuentas de registros</strong>, en el menú principal de OCI manager Apps, muestra las cuentas guardadas por registro y usuario, nunca sus secretos. Desde cada cuenta puedes comprobar, descargar o instalar una imagen, actualizar las credenciales o eliminarlas."
},
{
"list": {
"items": [
"GitHub (<code>ghcr.io</code>): el usuario es la cuenta de GitHub, y la contraseña un token de acceso personal con el permiso <code>read:packages</code>.",
"Docker Hub (<code>docker.io</code>): el usuario es la cuenta de Docker Hub, y la contraseña un token de acceso con permiso de lectura.",
"Otros registros, también uno con su propio puerto como <code>registry.example.com:5000</code>: el usuario y la contraseña o token que da ese registro."
"GitHub (<code>ghcr.io</code>): el usuario es la cuenta de GitHub y la contraseña es un token de acceso personal con permiso <code>read:packages</code>.",
"Docker Hub (<code>docker.io</code>): el usuario es la cuenta de Docker Hub y la contraseña es un token con permiso de lectura.",
"Otros registros, incluidos los que usan un puerto propio como <code>registry.example.com:5000</code>: el usuario y la contraseña o token que proporcione ese registro."
]
}
},
{
"calloutInfo": {
"title": "Dónde se guardan",
"body": "En <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, legible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de sus almacenamientos. <code>/etc/pve</code> lo comparten todos los nodos del clúster, así que una cuenta añadida en un nodo se usa en todos. El backup del host lo incluye, y al desinstalar ProxMenux se elimina de todos los nodos."
"title": "Dónde se guardan las cuentas",
"body": "En <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, accesible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de almacenamiento. <code>/etc/pve</code> se comparte entre los nodos del clúster, de modo que una cuenta añadida en un nodo se utiliza en todos. El backup del host incluye ese archivo y desinstalar ProxMenux lo elimina de todos los nodos."
}
}
]
@@ -191,11 +264,11 @@
{
"list": {
"items": [
"Un Dockerfile sin imagen publicada: la imagen debe construirse y publicarse antes en un registro OCI.",
"Un archivo Compose con varios servicios: queda bloqueado porque describe más de una imagen. Esta opción instala un único contenedor.",
"<code>configs</code>, secretos externos o formatos de dispositivo que no pueden traducirse sin ambigüedad.",
"Sustituciones del shell como <code>$(command)</code>: debe escribirse el valor resultante.",
"Opciones de <code>docker run</code> no reconocidas y <code>--env-file</code>: se lee en su lugar un archivo Compose explícito."
"Un Dockerfile sin imagen publicada: primero hay que construir la imagen y publicarla en un registro OCI.",
"Un archivo Compose con varios servicios: se bloquea porque esta opción instala un único servicio por contenedor, aunque varios servicios utilicen la misma imagen.",
"<code>configs</code>, secretos externos o formatos de dispositivo que no puedan adaptarse de forma inequívoca.",
"Sustituciones de shell como <code>$(command)</code>: hay que escribir directamente el valor resultante.",
"Opciones de <code>docker run</code> no reconocidas y <code>--env-file</code>: utiliza un archivo Compose con los valores explícitos."
]
}
}
+203 -44
View File
@@ -19,9 +19,18 @@
{
"flow": {
"nodes": [
{ "label": "Inventario del host", "detail": "/dev/dri/renderD128\nGID 993 · Intel" },
{ "label": "ProxMenux", "detail": "fabricante y\npermisos comprobados" },
{ "label": "LXC", "detail": "mismo dispositivo\nGID efectivo" }
{
"label": "Inventario del host",
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
},
{
"label": "ProxMenux",
"detail": "fabricante y\npermisos comprobados"
},
{
"label": "LXC",
"detail": "mismo dispositivo\nGID efectivo"
}
]
}
}
@@ -33,12 +42,32 @@
"blocks": [
{
"table": {
"headers": ["Origen", "Qué se lee", "Qué hace el instalador"],
"headers": [
"Origen",
"Qué se lee",
"Qué hace el instalador"
],
"rows": [
["Docker Compose", "<code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> y peticiones NVIDIA", "Cada requisito se convierte en una petición de dispositivo que se muestra para revisión"],
["Perfil del catálogo", "El soporte de GPU, Coral, OpenCL, USB o FUSE que tiene realmente la aplicación", "Solo se ofrecen las opciones validadas para esa imagen"],
["Metadatos y documentación de la imagen", "VA-API, Selkies, mods de LinuxServer o el runtime NVIDIA", "Se añaden las variables y la preparación documentadas"],
["Selección del usuario", "Solo CPU, Intel/AMD, OpenCL, NVIDIA o un dispositivo opcional", "La selección se guarda en el contrato de la instancia"]
[
"Docker Compose",
"<code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> y peticiones NVIDIA",
"Cada requisito se convierte en una petición de dispositivo que se muestra para revisión"
],
[
"Perfil del catálogo",
"El soporte de GPU, Coral, OpenCL, USB o FUSE que tiene realmente la aplicación",
"Solo se ofrecen las opciones validadas para esa imagen"
],
[
"Metadatos y documentación de la imagen",
"VA-API, Selkies, mods de LinuxServer o el runtime NVIDIA",
"Se añaden las variables y la preparación documentadas"
],
[
"Selección del usuario",
"Solo CPU, Intel/AMD, OpenCL, NVIDIA o un dispositivo opcional",
"La selección se guarda en el contrato de la instancia"
]
]
}
},
@@ -57,16 +86,52 @@
"blocks": [
{
"table": {
"headers": ["Tipo", "Identificación", "Validación"],
"headers": [
"Tipo",
"Identificación",
"Validación"
],
"rows": [
["Intel/AMD DRM", "<code>/dev/dri/renderD*</code> y <code>/sys/class/drm/NODE/device/vendor</code>", "Un dispositivo de caracteres con fabricante <code>0x8086</code> (Intel) o <code>0x1002</code> (AMD)"],
["OpenCL AMD", "El render node, más <code>/dev/kfd</code> cuando el perfil lo necesita", "Existencia, tipo, fabricante, permisos y compatibilidad declarada"],
["AMD ROCm", "El nodo de render, <code>/dev/kfd</code> y la generación que declara el driver de cómputo en <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>", "Una generación para la que la imagen ROCm de la aplicación trae kernels, las GPU RDNA2 que incluye y las posteriores, se ofrece tal cual. Las demás GPU de esas familias, como las Radeon 680M y 780M, se ofrecen como experimentales y nunca son la opción propuesta: ROCm no las soporta oficialmente, la aplicación las presenta como la generación de su familia (<code>HSA_OVERRIDE_GFX_VERSION</code>) y el instalador pide confirmación antes de descargar la imagen, que es más grande. Una GPU anterior, como los gráficos integrados de un Ryzen 5000U, no se ofrece e Immich deja el reconocimiento en la CPU"],
["NVIDIA", "<code>nvidia-smi</code> y <code>nvidia-container-cli</code>", "GPU, UUID, bus PCI, versión del driver, Toolkit, nodos <code>/dev/nvidia*</code>, binarios y librerías"],
["Coral PCIe/M.2", "<code>/dev/apex_N</code> y su enlace en <code>/sys/dev/char/MAJOR:MINOR</code>", "Nodo de caracteres, major/minor, propietario, GID y permisos"],
["USB y serie", "<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> o <code>/dev/bus/usb/BBB/DDD</code>", "Nodo de caracteres; en USB también fabricante, producto y número de serie cuando sysfs los publica"],
["KVM, TUN, FUSE, vídeo y SCSI genérico", "<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> o <code>/dev/sgN</code>", "Ruta admitida, tipo de nodo y permisos efectivos"],
["Unidad óptica", "<code>/dev/srN</code>", "Un dispositivo de bloques"]
[
"Intel/AMD DRM",
"<code>/dev/dri/renderD*</code> y <code>/sys/class/drm/NODE/device/vendor</code>",
"Un dispositivo de caracteres con fabricante <code>0x8086</code> (Intel) o <code>0x1002</code> (AMD)"
],
[
"OpenCL AMD",
"El render node, más <code>/dev/kfd</code> cuando el perfil lo necesita",
"Existencia, tipo, fabricante, permisos y compatibilidad declarada"
],
[
"AMD ROCm",
"El nodo de render, <code>/dev/kfd</code> y la generación que declara el driver de cómputo en <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>",
"Una generación para la que la imagen ROCm de la aplicación trae kernels, las GPU RDNA2 que incluye y las posteriores, se ofrece tal cual. Las demás GPU de esas familias, como las Radeon 680M y 780M, se ofrecen como experimentales y nunca son la opción propuesta: ROCm no las soporta oficialmente, la aplicación las presenta como la generación de su familia (<code>HSA_OVERRIDE_GFX_VERSION</code>) y el instalador pide confirmación antes de descargar la imagen, que es más grande. Una GPU anterior, como los gráficos integrados de un Ryzen 5000U, no se ofrece e Immich deja el reconocimiento en la CPU"
],
[
"NVIDIA",
"<code>nvidia-smi</code> y <code>nvidia-container-cli</code>",
"GPU, UUID, bus PCI, versión del driver, Toolkit, nodos <code>/dev/nvidia*</code>, binarios y librerías"
],
[
"Coral PCIe/M.2",
"<code>/dev/apex_N</code> y su enlace en <code>/sys/dev/char/MAJOR:MINOR</code>",
"Nodo de caracteres, major/minor, propietario, GID y permisos"
],
[
"USB y serie",
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> o <code>/dev/bus/usb/BBB/DDD</code>",
"Nodo de caracteres; en USB también fabricante, producto y número de serie cuando sysfs los publica"
],
[
"KVM, TUN, FUSE, vídeo y SCSI genérico",
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> o <code>/dev/sgN</code>",
"Ruta admitida, tipo de nodo y permisos efectivos"
],
[
"Unidad óptica",
"<code>/dev/srN</code>",
"Un dispositivo de bloques"
]
]
}
}
@@ -79,12 +144,30 @@
{
"steps": {
"items": [
{ "title": "La plantilla ofrece sus perfiles", "body": "Por ejemplo solo CPU, Intel/AMD VA-API, OpenCL AMD, OpenCL Intel o NVIDIA. Las opciones pertenecen a la imagen, no a un menú común." },
{ "title": "Se elige un perfil", "body": "Define los nodos de dispositivo, el entorno, los mods o el runtime que necesita la aplicación." },
{ "title": "Se propone una ruta", "body": "Para DRM, <code>/dev/dri/renderD128</code>, que puede cambiarse en un host con varios render nodes. Para USB o serie se selecciona el nodo concreto." },
{ "title": "Validación", "body": "Se comprueban existencia, tipo, fabricante admitido, permisos y GID. Una discrepancia detiene la operación." },
{ "title": "Se escribe el contrato", "body": "Ruta, modo, GID, acceso de escritura y perfil quedan registrados para las actualizaciones y las recreaciones." },
{ "title": "Conexión y prueba", "body": "<code>pct set</code> añade la entrada <code>devN</code> y después se comprueba el acceso dentro del LXC. Las imágenes de LinuxServer se comprueban también como usuario <code>abc</code>." }
{
"title": "La plantilla ofrece sus perfiles",
"body": "Por ejemplo solo CPU, Intel/AMD VA-API, OpenCL AMD, OpenCL Intel o NVIDIA. Las opciones pertenecen a la imagen, no a un menú común."
},
{
"title": "Se elige un perfil",
"body": "Define los nodos de dispositivo, el entorno, los mods o el runtime que necesita la aplicación."
},
{
"title": "Se propone una ruta",
"body": "Para DRM, <code>/dev/dri/renderD128</code>, que puede cambiarse en un host con varios render nodes. Para USB o serie se selecciona el nodo concreto."
},
{
"title": "Validación",
"body": "Se comprueban existencia, tipo, fabricante admitido, permisos y GID. Una discrepancia detiene la operación."
},
{
"title": "Se escribe el contrato",
"body": "Ruta, modo, GID, acceso de escritura y perfil quedan registrados para las actualizaciones y las recreaciones."
},
{
"title": "Conexión y prueba",
"body": "<code>pct set</code> añade la entrada <code>devN</code> y después se comprueba el acceso dentro del LXC. Las imágenes de LinuxServer se comprueban también como usuario <code>abc</code>."
}
]
}
}
@@ -98,10 +181,22 @@
{
"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 dispositivo USB concreto", "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" },
{ "title": "OpenCL AMD", "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" }
{
"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 dispositivo USB concreto",
"code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0"
},
{
"title": "OpenCL AMD",
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0"
}
]
}
},
@@ -116,13 +211,37 @@
"blocks": [
{
"table": {
"headers": ["Perfil", "Traducción", "Se ofrece cuando"],
"headers": [
"Perfil",
"Configuración resultante",
"Se ofrece cuando"
],
"rows": [
["Intel/AMD VA-API", "Render node de <code>/dev/dri</code>", "La aplicación admite aceleración de vídeo"],
["OpenCL", "Render node, <code>/dev/kfd</code> si hace falta y el mod oficial", "La imagen o el perfil lo documentan"],
["NVIDIA", "Dispositivos y librerías del driver del host", "El host tiene un driver operativo y NVIDIA Container Toolkit"],
["Coral", "<code>/dev/apex_0</code> o el bus USB", "El perfil declara soporte de Coral (Frigate)"],
["USB, serie, FUSE", "Un dispositivo concreto, un árbol validado o una función LXC", "El contrato lo pide"]
[
"Intel/AMD VA-API",
"Render node de <code>/dev/dri</code>",
"La aplicación admite aceleración de vídeo"
],
[
"OpenCL",
"Render node, <code>/dev/kfd</code> si hace falta y el mod oficial",
"La imagen o el perfil lo documentan"
],
[
"NVIDIA",
"Dispositivos y librerías del driver del host",
"El host tiene un driver operativo y NVIDIA Container Toolkit"
],
[
"Coral",
"<code>/dev/apex_0</code> o el bus USB",
"El perfil declara soporte de Coral (Frigate)"
],
[
"USB, serie, FUSE",
"Un dispositivo concreto, un árbol validado o una función LXC",
"El contrato lo pide"
]
]
}
}
@@ -145,7 +264,9 @@
"p": "Estos dos comandos, en el host, muestran si el driver y el Toolkit están disponibles:"
},
{
"shell": { "code": "nvidia-smi -L\nnvidia-container-cli --version" }
"shell": {
"code": "nvidia-smi -L\nnvidia-container-cli --version"
}
},
{
"p": "En un host cuyo driver se instaló por otros medios, el Toolkit se instala desde el repositorio estable oficial:"
@@ -159,7 +280,9 @@
"p": "El inventario que usa OCI manager Apps es la salida de:"
},
{
"shell": { "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" }
"shell": {
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
}
},
{
"calloutInfo": {
@@ -170,10 +293,26 @@
{
"cards": {
"items": [
{ "icon": "cpu", "title": "Inventario desde el driver", "body": "<code>nvidia-container-cli</code> enumera los nodos de dispositivo, los binarios, el firmware y las librerías del driver instalado." },
{ "icon": "refresh", "title": "Sin versión fija", "body": "La plantilla no nombra archivos de librería. El perfil se genera a partir del host actual." },
{ "icon": "shield", "title": "Montajes de solo lectura", "body": "Las librerías del host se montan en solo lectura en lugar de copiarse dentro del contenedor." },
{ "icon": "hardDrive", "title": "Cambios de driver", "body": "Tras un cambio de driver, el inventario se genera de nuevo antes de que arranquen los LXC afectados." }
{
"icon": "cpu",
"title": "Inventario desde el driver",
"body": "<code>nvidia-container-cli</code> enumera los nodos de dispositivo, los binarios, el firmware y las librerías del driver instalado."
},
{
"icon": "refresh",
"title": "Sin versión fija",
"body": "La plantilla no nombra archivos de librería. El perfil se genera a partir del host actual."
},
{
"icon": "shield",
"title": "Montajes de solo lectura",
"body": "Las librerías del host se montan en solo lectura en lugar de copiarse dentro del contenedor."
},
{
"icon": "hardDrive",
"title": "Cambios de driver",
"body": "Tras un cambio de driver, el inventario se genera de nuevo antes de que arranquen los LXC afectados."
}
]
}
},
@@ -209,12 +348,32 @@
"blocks": [
{
"table": {
"headers": ["Petición", "Traducción", "Alcance"],
"headers": [
"Petición",
"Configuración resultante",
"Alcance"
],
"rows": [
["<code>/dev/dvb</code>, <code>/dev/snd</code> o <code>/dev/bus/usb</code>", "Cada nodo de caracteres del árbol recibe su propia entrada <code>devN</code> con el modo y el GID del host", "Solo el árbol pedido, no el resto de <code>/dev</code>"],
["<code>/dev/fuse</code>", "El nodo y, cuando el perfil lo necesita, la función <code>fuse=1</code>", "FUSE por sí solo no publica montajes a otros LXC"],
["<code>/dev/net/tun</code>", "Una entrada <code>devN</code> en la misma ruta dentro del LXC", "La configuración de la VPN o de la red queda en la aplicación"],
["<code>/dev/kvm</code>", "Una entrada <code>devN</code> validada", "Solo se ofrece cuando el contrato lo pide"]
[
"<code>/dev/dvb</code>, <code>/dev/snd</code> o <code>/dev/bus/usb</code>",
"Cada nodo de caracteres del árbol recibe su propia entrada <code>devN</code> con el modo y el GID del host",
"Solo el árbol pedido, no el resto de <code>/dev</code>"
],
[
"<code>/dev/fuse</code>",
"El nodo y, cuando el perfil lo necesita, la función <code>fuse=1</code>",
"FUSE por sí solo no publica montajes a otros LXC"
],
[
"<code>/dev/net/tun</code>",
"Una entrada <code>devN</code> en la misma ruta dentro del LXC",
"La configuración de la VPN o de la red queda en la aplicación"
],
[
"<code>/dev/kvm</code>",
"Una entrada <code>devN</code> validada",
"Solo se ofrece cuando el contrato lo pide"
]
]
}
}
+125 -40
View File
@@ -1,11 +1,11 @@
{
"meta": {
"title": "OCI manager Apps | ProxMenux",
"description": "Imágenes OCI oficiales ejecutadas como contenedores LXC nativos de Proxmox VE, con datos persistentes, dispositivos, aplicaciones multicontenedor y actualizaciones transaccionales."
"description": "Ejecuta imágenes OCI oficiales como contenedores LXC nativos de Proxmox VE, con datos persistentes, acceso a dispositivos, aplicaciones con varios contenedores y actualizaciones transaccionales."
},
"header": {
"title": "OCI manager Apps",
"description": "Las imágenes OCI oficiales se ejecutan como contenedores LXC nativos de Proxmox VE. La imagen sigue siendo la que publica su responsable; ProxMenux reproduce el entorno que Docker Compose habría creado a su alrededor.",
"description": "Las imágenes OCI oficiales se ejecutan como contenedores LXC nativos de Proxmox VE. Se utiliza la misma imagen que publica su desarrollador; ProxMenux reproduce el entorno que Docker Compose habría creado a su alrededor.",
"section": "OCI manager Apps"
},
"sections": [
@@ -15,34 +15,43 @@
{
"calloutInfo": {
"title": "Una imagen OCI, un LXC nativo",
"body": "Dentro de los contenedores no se ejecuta ningún motor Docker. Proxmox VE importa el sistema de archivos de la imagen y sus metadatos OCI, y la aplicación pasa a ser el proceso principal de un LXC nativo, gestionado con las mismas herramientas que cualquier otro contenedor del nodo."
"body": "No se ejecuta Docker Engine dentro de los contenedores. Proxmox VE importa el sistema de archivos de la imagen y sus metadatos OCI; la aplicación pasa a ser el proceso principal de un LXC nativo, administrado con las mismas herramientas que cualquier otro contenedor del nodo."
}
},
{
"flow": {
"nodes": [
{ "label": "Origen", "detail": "Imagen OCI\nCompose y documentación" },
{ "label": "ProxMenux", "detail": "Contrato JSON\nvalidación y plan" },
{ "label": "Proxmox VE", "detail": "LXC nativo\nvolúmenes y dispositivos" }
{
"label": "Origen",
"detail": "Imagen OCI\nCompose y documentación"
},
{
"label": "ProxMenux",
"detail": "Contrato JSON\nvalidación y planificación"
},
{
"label": "Proxmox VE",
"detail": "LXC nativo\nvolúmenes y dispositivos"
}
],
"caption": "La aplicación no se reconstruye: su entorno se reproduce de forma declarativa."
"caption": "Se utiliza la aplicación original; su entorno se define de forma declarativa y se reproduce."
}
}
]
},
{
"id": "where",
"title": "Dónde se encuentra",
"intro": "OCI manager Apps se abre desde la opción <strong>OCI manager Apps (Technology Preview)</strong> del menú principal de ProxMenux, en el nodo Proxmox y como root. Su primera pantalla ofrece:",
"title": "Dónde encontrarlo",
"intro": "OCI manager Apps se abre desde la opción <strong>OCI manager Apps (Technology Preview)</strong> del menú principal de ProxMenux, en el nodo Proxmox y como root. La primera pantalla ofrece:",
"blocks": [
{
"list": {
"items": [
"<strong>Buscar aplicaciones</strong>: búsqueda por nombre en todo el catálogo.",
"<strong>Todas las aplicaciones</strong>: el catálogo completo, con el número de aplicaciones.",
"<strong>Gestionar aplicaciones OCI instaladas</strong>: actualizar, modificar, eliminar o recuperar lo instalado.",
"<strong>Cuentas de registro</strong>: las cuentas con las que se instalan y actualizan imágenes de registros privados.",
"<strong>Instalar una imagen que no está en el catálogo</strong>: traducción de un archivo Compose, un comando <code>docker run</code> o una referencia de imagen.",
"<strong>Buscar aplicaciones</strong>: busca por nombre en todo el catálogo.",
"<strong>Todas las aplicaciones</strong>: muestra el catálogo completo y su número de aplicaciones.",
"<strong>Gestionar aplicaciones OCI instaladas</strong>: actualiza, modifica, elimina o recupera las aplicaciones que ya has instalado.",
"<strong>Cuentas de registros</strong>: administra las cuentas utilizadas para instalar y actualizar imágenes de registros privados.",
"<strong>Instalar una imagen que no esté en el catálogo</strong>: adapta un archivo Compose, un comando <code>docker run</code> o una referencia de imagen.",
"Las categorías del catálogo, cada una con su número de aplicaciones."
]
}
@@ -50,40 +59,72 @@
{
"figure": {
"src": "/oci-manager/main-menu.png",
"alt": "Pantalla principal de OCI manager Apps con la búsqueda, todas las aplicaciones, la gestión, la imagen propia y las categorías del catálogo",
"alt": "Pantalla principal de OCI manager Apps con búsqueda, listado completo, gestión de aplicaciones, imágenes fuera del catálogo y categorías.",
"caption": "Pantalla principal de OCI manager Apps."
}
},
{
"p": "Al seleccionar una aplicación se muestra su descripción, la imagen que ejecuta y dos modos de instalación: <strong>Instalar con la configuración predeterminada</strong>, que pregunta solo lo que decide toda instalación (almacenamiento, dónde van los datos, dirección e inicio), e <strong>Instalar con la configuración avanzada</strong>, que abre cada decisión en orden: VMID y recursos, el almacenamiento de cada ruta, el bridge y los dispositivos."
"p": "Al seleccionar una aplicación se muestran su descripción, la imagen que utiliza y dos modos de instalación. <strong>Instalar con ajustes predeterminados</strong> solo pregunta lo esencial de cada instalación: almacenamiento, ubicación de los datos, dirección y arranque. <strong>Instalar con ajustes avanzados</strong> recorre todas las decisiones en orden: VMID y recursos, almacenamiento de cada ruta, puente de red y dispositivos."
},
{
"p": "Una aplicación probada en real muestra <strong>Verificado</strong> en esa vista y aparece marcada con ✓ en las listas, tanto si se probó en el laboratorio de ProxMenux como si la probó la comunidad."
"p": "Las aplicaciones que se han probado realmente muestran <strong>Verificado</strong> en esa vista y una marca ✓ en las listas, tanto si la prueba se hizo en el laboratorio de ProxMenux como si la realizó la comunidad."
}
]
},
{
"id": "beta",
"title": "Por qué es una Technology Preview",
"title": "Por qué lleva la etiqueta Technology Preview",
"blocks": [
{ "p": "OCI manager Apps lleva la etiqueta <strong>Technology Preview</strong> que Proxmox VE da a los contenedores de aplicación creados a partir de imágenes OCI, introducidos en Proxmox VE 9.1. Se refiere a aquello sobre lo que funciona OCI manager Apps, no al motor de ProxMenux: el comportamiento de esos contenedores todavía puede cambiar entre versiones de Proxmox VE. La etiqueta se mantiene hasta que Proxmox VE dé ese soporte por estable." },
{ "p": "El motor de OCI manager Apps (instalación, actualización, modificación, recreación, backups, restauración, migración y vigilancia) está probado en el laboratorio de ProxMenux. Cada aplicación se prueba por separado: las que se han probado de verdad muestran <strong>Verified</strong> y llevan una ✓ en las listas." }
{
"p": "OCI manager Apps mantiene la etiqueta <strong>Technology Preview</strong> que Proxmox VE asigna a los contenedores de aplicaciones creados a partir de imágenes OCI, cuyo soporte se introdujo en Proxmox VE 9.1. La etiqueta se refiere a la tecnología sobre la que funciona OCI manager Apps, no al motor de ProxMenux: el comportamiento de estos contenedores puede cambiar entre versiones de Proxmox VE. Se mantendrá hasta que Proxmox VE considere estable ese soporte."
},
{
"p": "El motor de OCI manager Apps se prueba en el laboratorio de ProxMenux: instalación, actualización, modificación, recreación, backups, restauración, migración y vigilancia. Cada aplicación se verifica por separado. Las que se han probado realmente muestran <strong>Verificado</strong> y llevan un ✓ en las listas."
}
]
},
{
"id": "translation",
"title": "Lo que Docker expresa y en qué lo convierte OCI manager Apps",
"title": "Cómo describe Docker los requisitos y cómo los aplica OCI manager Apps",
"blocks": [
{
"table": {
"headers": ["Necesidad", "Docker la expresa como", "OCI manager Apps la convierte en"],
"headers": [
"Requisito",
"Cómo lo expresa Docker",
"Cómo lo aplica OCI manager Apps"
],
"rows": [
["Ejecutar la aplicación", "<code>image</code>, <code>entrypoint</code>, <code>command</code>", "rootfs OCI y proceso principal del LXC"],
["Conservar la configuración", "<code>volumes: /config</code>", "un disco <code>mpN</code> persistente incluido en el backup, o un directorio del host"],
["Publicar el servicio", "<code>ports</code>", "una dirección propia del LXC y la URL de acceso al servicio"],
["Usar hardware", "<code>devices</code>, <code>group_add</code>", "entradas <code>devN</code> con el GID efectivo del host y un perfil validado"],
["Conectar dependencias", "<code>networks</code>, <code>depends_on</code>", "un bridge privado, direcciones fijas, orden de arranque y healthchecks"],
["Actualizar", "<code>pull</code> y recrear", "un rootfs nuevo con el mismo contrato persistente"]
[
"Ejecutar la aplicación",
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
"El rootfs de la imagen OCI y el proceso principal del LXC"
],
[
"Conservar la configuración",
"<code>volumes: /config</code>",
"Un volumen persistente <code>mpN</code> incluido en el backup, o bien un directorio del host."
],
[
"Publicar el servicio",
"<code>ports</code>",
"Una dirección propia para el LXC y la URL de acceso al servicio."
],
[
"Usar hardware",
"<code>devices</code>, <code>group_add</code>",
"Entradas <code>devN</code> con el GID efectivo del host y un perfil validado."
],
[
"Conectar las dependencias",
"<code>networks</code>, <code>depends_on</code>",
"Un puente de red privado, direcciones fijas, orden de arranque y comprobaciones de estado."
],
[
"Actualizar",
"Descargar con <code>pull</code> y recrear",
"Un rootfs nuevo que mantiene el mismo contrato de persistencia."
]
]
}
}
@@ -91,15 +132,31 @@
},
{
"id": "kept",
"title": "Qué se mantiene y qué cambia",
"title": "Qué se conserva y qué cambia",
"blocks": [
{
"cards": {
"items": [
{ "icon": "archive", "title": "Se mantiene", "body": "La imagen oficial, sus rutas internas, su entorno, su proceso de arranque y su documentación funcional." },
{ "icon": "boxes", "title": "Se adapta", "body": "El entorno de ejecución: red, persistencia, dispositivos, permisos y dependencias usan primitivas LXC nativas de Proxmox VE." },
{ "icon": "shield", "title": "No se traduce", "body": "Una clave de Compose sin equivalencia segura figura como bloqueo. Las plantillas con bloqueos no se ofrecen, y las opciones sensibles se confirman durante la instalación." },
{ "icon": "refresh", "title": "Se registra", "body": "Digest de la imagen, recursos, rutas, red, dispositivos y pertenencia a una pila quedan en el contrato de la instancia, que las actualizaciones y las recreaciones reproducen." }
{
"icon": "archive",
"title": "Se conserva",
"body": "La imagen oficial, sus rutas internas, su entorno, su proceso de arranque y su documentación de uso."
},
{
"icon": "boxes",
"title": "Se adapta",
"body": "El entorno de ejecución: la red, la persistencia, los dispositivos, los permisos y las dependencias utilizan los mecanismos nativos de LXC de Proxmox VE."
},
{
"icon": "shield",
"title": "Sin equivalente",
"body": "Una opción de Compose sin una equivalencia segura se registra como un impedimento para la instalación. Las plantillas con impedimentos no se ofrecen para instalar, y las opciones sensibles requieren confirmación durante el asistente."
},
{
"icon": "refresh",
"title": "Se registra",
"body": "El digest de la imagen, los recursos, las rutas, la red, los dispositivos y la pertenencia a una pila se guardan en el contrato de la instancia. Las actualizaciones y recreaciones reproducen ese contrato."
}
]
}
}
@@ -112,13 +169,41 @@
{
"next": {
"items": [
{ "label": "Cómo se traduce una imagen OCI", "href": "/docs/oci-manager/architecture", "tail": "de la imagen y su archivo Compose a un LXC nativo." },
{ "label": "Instalar una imagen que no está en el catálogo", "href": "/docs/oci-manager/custom-image", "tail": "Compose, docker run o una referencia de imagen." },
{ "label": "Datos, rutas y red", "href": "/docs/oci-manager/storage-network", "tail": "discos del contenedor, directorios del host, montajes Rclone y direcciones." },
{ "label": "Dispositivos y aceleración", "href": "/docs/oci-manager/hardware", "tail": "GPU, NVIDIA, Coral, USB y otros dispositivos." },
{ "label": "Aplicaciones multicontenedor", "href": "/docs/oci-manager/stacks", "tail": "aplicación, base de datos y caché como LXC coordinados." },
{ "label": "Instalar, actualizar y modificar", "href": "/docs/oci-manager/lifecycle", "tail": "el contrato de la instancia y sus operaciones." },
{ "label": "En ProxMenux Monitor", "href": "/docs/oci-manager/monitor", "tail": "versiones, actualizaciones, salida de consola y terminal." }
{
"label": "Cómo se adapta una imagen OCI",
"href": "/docs/oci-manager/architecture",
"tail": "De la imagen y su archivo Compose a un LXC nativo."
},
{
"label": "Instalar una imagen que no esté en el catálogo",
"href": "/docs/oci-manager/custom-image",
"tail": "Un archivo Compose, un comando docker run o una referencia de imagen."
},
{
"label": "Datos, rutas y red",
"href": "/docs/oci-manager/storage-network",
"tail": "Volúmenes del contenedor, directorios del host, montajes con rclone y direcciones."
},
{
"label": "Dispositivos y aceleración",
"href": "/docs/oci-manager/hardware",
"tail": "GPU, NVIDIA, Coral, USB y otros dispositivos."
},
{
"label": "Aplicaciones con varios contenedores",
"href": "/docs/oci-manager/stacks",
"tail": "Aplicación, base de datos y caché en varios LXC coordinados."
},
{
"label": "Instalar, actualizar y modificar",
"href": "/docs/oci-manager/lifecycle",
"tail": "El contrato de la instancia y sus operaciones."
},
{
"label": "En ProxMenux Monitor",
"href": "/docs/oci-manager/monitor",
"tail": "Versiones, actualizaciones, salida de consola y terminal."
}
]
}
}
@@ -18,7 +18,7 @@
},
{
"code": {
"code": "instances/\n└── 105/\n └── oci-compose.json\n ├── imagen y digest resuelto\n ├── recursos y red\n ├── entorno (secretos protegidos)\n ├── discos del contenedor y directorios del host\n ├── perfil de hardware y dispositivos\n ├── log de consola y modo de terminal\n └── pertenencia a una pila y ciclo de vida"
"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"
}
},
{
@@ -86,7 +86,7 @@
"registry": "Registro OCI",
"update": "Actualizar la instancia",
"resolve": "Resolver la etiqueta",
"verify": "Verificar el archivo y preflight",
"verify": "Verificar el archivo y realizar las comprobaciones previas",
"backup": "Detener y respaldar el CT",
"import": "Importar el rootfs nuevo",
"reapply": "Aplicar de nuevo el contrato",
@@ -215,7 +215,7 @@
{
"id": "restore",
"title": "Backup, restauración y otro host",
"intro": "Un backup hecho con vzdump o Proxmox Backup Server incluye el contenedor, sus discos y la copia de su contrato. Lo que la instalación guarda en el host no forma parte de él. <strong>Gestionar aplicaciones OCI instaladas</strong> detecta los contenedores restaurados en un host que no tiene su contrato, un Proxmox recién instalado u otro host, y ofrece registrarlos de nuevo.",
"intro": "Un backup hecho con vzdump o Proxmox Backup Server incluye el contenedor, los discos del contenedor seleccionados para el backup y la copia de su contrato. Lo que la instalación guarda en el host no forma parte de él. <strong>Gestionar aplicaciones OCI instaladas</strong> detecta los contenedores restaurados en un host que no tiene su contrato, un Proxmox recién instalado u otro host, y ofrece registrarlos de nuevo.",
"blocks": [
{
"steps": {
@@ -462,7 +462,7 @@
],
[
"Discos del contenedor",
"Proxmox los mueve con el contenedor. HA necesita que estén en un almacenamiento compartido."
"Proxmox los mueve con el contenedor. HA necesita sus datos disponibles en el nodo de destino, mediante almacenamiento compartido o una configuración de replicación compatible."
],
[
"Directorios del host y dispositivos",
@@ -52,7 +52,7 @@
},
{
"id": "app",
"title": "App",
"title": "Aplicación",
"intro": "La pestaña <appLink>App</appLink> ofrece la aplicación instalada como una detección, con el nombre, el logo, el puerto y el esquema del registro. Al registrarla se abre el editor con el método <strong>Imagen OCI (instalada por ProxMenux)</strong>, que no necesita configuración.",
"blocks": [
{
+200 -46
View File
@@ -4,7 +4,7 @@
"description": "Cómo convierte OCI manager Apps una aplicación con su base de datos y su caché en LXC nativos coordinados: plan, red privada, hook de dependencias, validación y actualizaciones transaccionales."
},
"header": {
"title": "Aplicaciones multicontenedor",
"title": "Aplicaciones con varios contenedores",
"description": "Una aplicación con su base de datos, su caché y otros servicios se convierte en varios LXC nativos coordinados, que se instalan y actualizan como uno solo.",
"section": "OCI manager Apps"
},
@@ -21,7 +21,14 @@
{
"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 pila", "app": "LXC de la aplicación", "appNet": "LAN + privada", "db": "LXC PostgreSQL", "cache": "LXC Valkey", "private": "privada" }
"labels": {
"plan": "Plan de la pila",
"app": "LXC de la aplicación",
"appNet": "LAN + privada",
"db": "LXC PostgreSQL",
"cache": "LXC Valkey",
"private": "privada"
}
}
}
]
@@ -35,14 +42,42 @@
},
{
"table": {
"headers": ["Elemento del plan", "Contenido", "Comprobado antes de crear nada"],
"headers": [
"Elemento del plan",
"Contenido",
"Comprobado antes de crear nada"
],
"rows": [
["Miembros", "Aplicación principal, base de datos, caché, aprendizaje automático y demás dependencias", "VMID únicos, roles conocidos y exactamente un miembro principal"],
["Imágenes", "Referencia rolling, arquitectura y digest resuelto de cada servicio", "Todas existen, admiten la arquitectura y superan la verificación de integridad OCI"],
["Red", "Bridge privado, subred, una dirección fija por servicio y acceso LAN para el miembro principal", "Sin colisión con bridges o subredes existentes y sin direcciones repetidas"],
["Persistencia", "Discos del contenedor, directorios del host, propietarios y backup", "Rutas sin solapamientos, almacenamiento disponible y permisos declarados"],
["Secretos", "Contraseña de la base de datos, claves de la aplicación y credenciales iniciales", "Se generan una vez y solo se entregan a los miembros que los usan"],
["Ciclo de vida", "Orden de arranque, orden de parada y una comprobación de salud por miembro", "La aplicación principal arranca la última y se detiene la primera"]
[
"Miembros",
"Aplicación principal, base de datos, caché, aprendizaje automático y demás dependencias",
"VMID únicos, roles conocidos y exactamente un miembro principal"
],
[
"Imágenes",
"Referencia rolling, arquitectura y digest resuelto de cada servicio",
"Todas existen, admiten la arquitectura y superan la verificación de integridad OCI"
],
[
"Red",
"Bridge privado, subred, una dirección fija por servicio y acceso LAN para el miembro principal",
"Sin colisión con bridges o subredes existentes y sin direcciones repetidas"
],
[
"Persistencia",
"Discos del contenedor, directorios del host, propietarios y backup",
"Rutas sin solapamientos, almacenamiento disponible y permisos declarados"
],
[
"Secretos",
"Contraseña de la base de datos, claves de la aplicación y credenciales iniciales",
"Se generan una vez y solo se entregan a los miembros que los usan"
],
[
"Ciclo de vida",
"Orden de arranque, orden de parada y una comprobación de salud por miembro",
"La aplicación principal arranca la última y se detiene la primera"
]
]
}
}
@@ -55,13 +90,34 @@
{
"steps": {
"items": [
{ "title": "Reservar todos los VMID", "body": "Se comprueban el inventario de Proxmox VE y el registro de instancias. No se adopta un CT existente ni se reutiliza un contrato que todavía pertenece a otra instancia." },
{ "title": "Preparar todas las imágenes", "body": "Todas las imágenes se resuelven, descargan y verifican antes de crear el primer contenedor." },
{ "title": "Crear cada rootfs", "body": "Se importan los metadatos OCI oficiales y se añaden la identidad de instancia de ProxMenux y el rol del miembro." },
{ "title": "Red privada", "body": "Se crean un bridge y una subred y cada miembro recibe su dirección fija; solo el miembro principal recibe además la interfaz de la LAN." },
{ "title": "Persistencia", "body": "Cada base de datos y configuración recibe su propio disco del contenedor; solo los datos destinados a compartirse usan directorios del host." },
{ "title": "Entorno", "body": "Se escriben los endpoints internos, los secretos compartidos y las variables de servicio. La aplicación llega a sus dependencias en sus direcciones privadas reservadas." },
{ "title": "Registro", "body": "Cada miembro registra su configuración nativa, los cambios del rootfs que las actualizaciones deben reproducir y su relación con la pila." }
{
"title": "Reservar todos los VMID",
"body": "Se comprueban el inventario de Proxmox VE y el registro de instancias. No se adopta un CT existente ni se reutiliza un contrato que todavía pertenece a otra instancia."
},
{
"title": "Preparar todas las imágenes",
"body": "Todas las imágenes se resuelven, descargan y verifican antes de crear el primer contenedor."
},
{
"title": "Crear cada rootfs",
"body": "Se importan los metadatos OCI oficiales y se añaden la identidad de instancia de ProxMenux y el rol del miembro."
},
{
"title": "Red privada",
"body": "Se crean un bridge y una subred y cada miembro recibe su dirección fija; solo el miembro principal recibe además la interfaz de la LAN."
},
{
"title": "Persistencia",
"body": "Cada base de datos y configuración recibe su propio disco del contenedor; solo los datos destinados a compartirse usan directorios del host."
},
{
"title": "Entorno",
"body": "Se escriben los endpoints internos, los secretos compartidos y las variables de servicio. La aplicación llega a sus dependencias en sus direcciones privadas reservadas."
},
{
"title": "Registro",
"body": "Cada miembro registra su configuración nativa, los cambios del rootfs que las actualizaciones deben reproducir y su relación con la pila."
}
]
}
}
@@ -74,20 +130,48 @@
"blocks": [
{
"table": {
"headers": ["Servicio", "Comprobación", "Qué demuestra"],
"headers": [
"Servicio",
"Comprobación",
"Qué demuestra"
],
"rows": [
["PostgreSQL", "<code>pg_isready</code> en el CT con el host, el usuario y la base de datos esperados", "El servidor acepta conexiones para la base de datos configurada"],
["Redis / Valkey", "<code>redis-cli</code> o <code>valkey-cli</code> <code>PING</code> contra su dirección privada", "El broker escucha y responde"],
["Aprendizaje automático de Immich", "HTTP <code>GET /ping</code>, más una comprobación del runtime GPU seleccionado", "El servicio responde y la aceleración pedida no ha pasado a CPU"],
["Nextcloud", "<code>GET /status.php</code> con <code>installed=true</code>, <code>maintenance=false</code> y <code>needsDbUpgrade=false</code>", "La inicialización terminó sin migraciones pendientes"],
["Paperless-ngx / Tandoor", "HTTP en la dirección de la LAN y el puerto real del servicio", "El frontend y sus dependencias sirven la aplicación"],
["Aplicación principal", "El endpoint de su plantilla, por ejemplo <code>/api/server/ping</code> en Immich", "La pila completa funciona a través de la aplicación que usa las dependencias"]
[
"PostgreSQL",
"<code>pg_isready</code> en el CT con el host, el usuario y la base de datos esperados",
"El servidor acepta conexiones para la base de datos configurada"
],
[
"Redis / Valkey",
"<code>redis-cli</code> o <code>valkey-cli</code> <code>PING</code> contra su dirección privada",
"El broker escucha y responde"
],
[
"Aprendizaje automático de Immich",
"HTTP <code>GET /ping</code>, más una comprobación del runtime GPU seleccionado",
"El servicio responde y la aceleración pedida no ha pasado a CPU"
],
[
"Nextcloud",
"<code>GET /status.php</code> con <code>installed=true</code>, <code>maintenance=false</code> y <code>needsDbUpgrade=false</code>",
"La inicialización terminó sin migraciones pendientes"
],
[
"Paperless-ngx / Tandoor",
"HTTP en la dirección de la LAN y el puerto real del servicio",
"El frontend y sus dependencias sirven la aplicación"
],
[
"Aplicación principal",
"El endpoint de su plantilla, por ejemplo <code>/api/server/ping</code> en Immich",
"La pila completa funciona a través de la aplicación que usa las dependencias"
]
]
}
},
{
"calloutWarning": {
"title": "running no significa healthy",
"title": "En ejecución no significa que funcione correctamente",
"body": "El estado running solo indica que existe el proceso del LXC. Cuando el servicio ofrece una comprobación mejor, se usa una comprobación exec o HTTP con un tiempo límite. Si un miembro se detiene o no supera su comprobación, la pila no se declara instalada."
}
}
@@ -103,8 +187,14 @@
{
"codeGrid": {
"items": [
{ "title": "Configuración del CT principal", "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" },
{ "title": "Contrato privado (ejemplo)", "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}" }
{
"title": "Configuración del CT principal",
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
},
{
"title": "Contrato privado (ejemplo)",
"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}"
}
]
}
},
@@ -121,12 +211,30 @@
{
"steps": {
"items": [
{ "title": "Proxmox VE llama a pre-start", "body": "Antes de arrancar el CT principal, el hook se ejecuta con su VMID y la fase del ciclo de vida." },
{ "title": "Un bloqueo por pila", "body": "<code>flock</code> sobre <code>/run/lock/proxmenux-stack-VMID.lock</code> impide dos secuencias de arranque a la vez." },
{ "title": "Se lee y valida el contrato", "body": "Se exigen un esquema conocido, dependencias numéricas, etiquetas, una comprobación exec, http o running y un tiempo límite positivo." },
{ "title": "Dependencias en orden", "body": "Cada CT debe existir; uno detenido se arranca y uno que ya está en marcha no se reinicia." },
{ "title": "Espera de salud", "body": "La comprobación se ejecuta cada dos segundos y se confirma además que el CT sigue en marcha." },
{ "title": "Arranca el CT principal", "body": "Cuando todas las dependencias están listas, pre-start termina y Proxmox VE arranca la aplicación." }
{
"title": "Proxmox VE llama a pre-start",
"body": "Antes de arrancar el CT principal, el hook se ejecuta con su VMID y la fase del ciclo de vida."
},
{
"title": "Un bloqueo por pila",
"body": "<code>flock</code> sobre <code>/run/lock/proxmenux-stack-VMID.lock</code> impide dos secuencias de arranque a la vez."
},
{
"title": "Se lee y valida el contrato",
"body": "Se exigen un esquema conocido, dependencias numéricas, etiquetas, una comprobación exec, http o running y un tiempo límite positivo."
},
{
"title": "Dependencias en orden",
"body": "Cada CT debe existir; uno detenido se arranca y uno que ya está en marcha no se reinicia."
},
{
"title": "Esperar a que el servicio esté listo",
"body": "La comprobación se ejecuta cada dos segundos y se confirma además que el CT sigue en marcha."
},
{
"title": "Arranca el CT principal",
"body": "Cuando todas las dependencias están listas, pre-start termina y Proxmox VE arranca la aplicación."
}
]
}
},
@@ -138,11 +246,27 @@
},
{
"table": {
"headers": ["Tipo", "Ejemplo", "Arranques posteriores"],
"headers": [
"Tipo",
"Ejemplo",
"Arranques posteriores"
],
"rows": [
["Pila dependiente", "Immich, Nextcloud, aplicación con PostgreSQL", "El hook del CT principal arranca las dependencias y las espera"],
["Suite de aplicaciones", "Suite Arr", "Sin miembro principal: cada LXC sigue su propio <code>onboot</code>"],
["Aplicación simple", "Jellyfin", "Proxmox VE arranca directamente ese LXC"]
[
"Pila dependiente",
"Immich, Nextcloud, aplicación con PostgreSQL",
"El hook del CT principal arranca las dependencias y las espera"
],
[
"Suite de aplicaciones",
"Suite Arr",
"Sin miembro principal: cada LXC sigue su propio <code>onboot</code>"
],
[
"Aplicación simple",
"Jellyfin",
"Proxmox VE arranca directamente ese LXC"
]
]
}
}
@@ -176,21 +300,51 @@
{
"steps": {
"items": [
{ "title": "Cualquier miembro", "body": "El contrato del miembro indica el VMID principal y la lista completa de miembros." },
{ "title": "La pila es reproducible", "body": "Se validan identidades, contratos, hook, adaptaciones y la existencia de una reproducción coordinada para esa receta." },
{ "title": "Primero las imágenes", "body": "La aplicación no se detiene hasta que todos los digests están resueltos, descargados y verificados." },
{ "title": "Detener y respaldar el conjunto", "body": "Los backups nativos verificados se toman con la pila detenida, de modo que aplicación y bases de datos corresponden al mismo momento." },
{ "title": "Actualizar y comprobar cada miembro", "body": "Adaptación, red, montajes, secretos y dispositivos se aplican de nuevo antes de la comprobación de salud de cada miembro." },
{ "title": "Publicar o recuperar todo", "body": "Los contratos nuevos solo se publican cuando todos los miembros pasan. Si uno falla, se restauran todos." }
{
"title": "Cualquier miembro",
"body": "El contrato del miembro indica el VMID principal y la lista completa de miembros."
},
{
"title": "La pila es reproducible",
"body": "Se validan identidades, contratos, hook, adaptaciones y la existencia de una reproducción coordinada para esa receta."
},
{
"title": "Primero las imágenes",
"body": "La aplicación no se detiene hasta que todos los digests están resueltos, descargados y verificados."
},
{
"title": "Detener y respaldar el conjunto",
"body": "Los backups nativos verificados se toman con la pila detenida, de modo que aplicación y bases de datos corresponden al mismo momento."
},
{
"title": "Actualizar y comprobar cada miembro",
"body": "Adaptación, red, montajes, secretos y dispositivos se aplican de nuevo antes de la comprobación de salud de cada miembro."
},
{
"title": "Publicar o recuperar todo",
"body": "Los contratos nuevos solo se publican cuando todos los miembros pasan. Si uno falla, se restauran todos."
}
]
}
},
{
"table": {
"headers": ["Modificar", "Qué cambia", "Qué se conserva"],
"headers": [
"Modificar",
"Qué cambia",
"Qué se conserva"
],
"rows": [
["Rutas y dispositivos extra", "Se añaden al contenedor de la aplicación o se eliminan de él, y el contenedor se reinicia. No se reconstruye nada", "Los datos de la aplicación, su base de datos y los demás contenedores"],
["Qué ejecuta el reconocimiento (Immich)", "El contenedor Machine learning toma la imagen y los dispositivos de la CPU o de una GPU del host. Toda la aplicación se detiene y se actualiza, como en una actualización", "La caché de modelos, la biblioteca y la base de datos. Si algo falla, se restauran los contenedores y la opción anteriores"]
[
"Rutas y dispositivos extra",
"Se añaden al contenedor de la aplicación o se eliminan de él, y el contenedor se reinicia. No se reconstruye nada",
"Los datos de la aplicación, su base de datos y los demás contenedores"
],
[
"Qué ejecuta el reconocimiento (Immich)",
"El contenedor Machine learning toma la imagen y los dispositivos de la CPU o de una GPU del host. Toda la aplicación se detiene y se actualiza, como en una actualización",
"La caché de modelos, la biblioteca y la base de datos. Si algo falla, se restauran los contenedores y la opción anteriores"
]
]
}
},
@@ -220,7 +374,7 @@
"stop": "Detener, primero el principal",
"backup": "Backup verificado de cada CT",
"replace": "Sustituir el rootfs",
"healthy": "¿Todos sanos?",
"healthy": "¿Todos funcionan correctamente?",
"yes": "Sí",
"no": "No",
"commit": "Publicar los contratos",
@@ -1,11 +1,11 @@
{
"meta": {
"title": "Datos, rutas y red | ProxMenux",
"description": "Cómo conserva OCI manager Apps los datos de un contenedor OCI: discos del contenedor, directorios del host, montajes Rclone, direcciones y redes privadas."
"description": "Cómo conserva OCI manager Apps los datos de un contenedor OCI: discos del contenedor, directorios del host, montajes con rclone, direcciones y redes privadas."
},
"header": {
"title": "Datos, rutas y red",
"description": "Qué vive en el rootfs, qué sobrevive a su sustitución, cómo se comparten datos entre contenedores y cómo obtiene cada contenedor su dirección.",
"description": "Qué se guarda en el rootfs, qué sobrevive a su sustitución, cómo se comparten datos entre contenedores y cómo obtiene cada uno su dirección.",
"section": "OCI manager Apps"
},
"sections": [
@@ -14,8 +14,8 @@
"blocks": [
{
"calloutInfo": {
"title": "La persistencia se decide antes de que exista el LXC",
"body": "Los volúmenes que publican la imagen y su archivo Compose se leen antes de crear el contenedor. Cada ruta que debe sobrevivir a una actualización se convierte en un punto de montaje independiente del rootfs, de modo que el rootfs solo contiene lo que pertenece a la imagen y puede sustituirse."
"title": "La persistencia se decide antes de crear el LXC",
"body": "Antes de crear el contenedor se leen los volúmenes declarados por la imagen y por su archivo Compose. Cada ruta que deba conservarse tras una actualización se convierte en un punto de montaje independiente del rootfs. Así, el rootfs solo contiene lo que pertenece a la imagen y puede sustituirse."
}
}
]
@@ -23,17 +23,35 @@
{
"id": "questions",
"title": "Qué pregunta el instalador",
"intro": "La plantilla aporta las rutas que necesita la aplicación. Cada una se sitúa en un disco del contenedor o en un directorio del host, y pueden añadirse más rutas antes del resumen.",
"intro": "La plantilla proporciona las rutas que necesita la aplicación. Cada una se ubica en un disco del contenedor o en un directorio del host, y se pueden añadir más rutas antes del resumen.",
"blocks": [
{
"steps": {
"items": [
{ "title": "Rutas requeridas", "body": "Se enumeran <code>/config</code>, <code>/data</code>, bibliotecas, descargas y cualquier volumen que declare la aplicación." },
{ "title": "Ubicación", "body": "Cada ruta se sitúa en un disco del contenedor o en un directorio existente del host." },
{ "title": "Almacenamiento y tamaño", "body": "Un disco del contenedor se crea en un almacenamiento de Proxmox VE con el tamaño indicado. La instalación por defecto usa <code>local-lvm</code>; la instalación avanzada pregunta el almacenamiento de cada ruta justo antes de su tamaño y propone el del rootfs. Aparece como <code>vm-VMID-disk-N</code> y se conecta como <code>mpN</code>." },
{ "title": "Directorio del host", "body": "Un directorio del host se indica por su ruta. Si no existe, se crea con el propietario que mapea el contenedor." },
{ "title": "Rutas adicionales", "body": "Antes de instalar pueden añadirse más pares de ruta del host o volumen y ruta del contenedor." },
{ "title": "Resumen", "body": "La relación completa se muestra antes de crear el CT y se guarda en su contrato de instancia." }
{
"title": "Rutas necesarias",
"body": "Se enumeran <code>/config</code>, <code>/data</code>, bibliotecas, descargas y todos los volúmenes declarados por la aplicación."
},
{
"title": "Ubicación",
"body": "Cada ruta se ubica en un disco del contenedor o en un directorio del host ya existente."
},
{
"title": "Almacenamiento y tamaño",
"body": "Se crea un disco del contenedor en un almacenamiento de Proxmox VE con el tamaño indicado. La instalación predeterminada usa <code>local-lvm</code>; la avanzada pregunta el almacenamiento de cada ruta justo antes de su tamaño y propone el del rootfs. El disco aparece como <code>vm-VMID-disk-N</code> y se conecta como <code>mpN</code>."
},
{
"title": "Directorio del host",
"body": "El directorio del host se indica mediante su ruta. Si no existe, se crea con el usuario al que se mapea el del contenedor como propietario."
},
{
"title": "Rutas adicionales",
"body": "Antes de instalar se pueden añadir más pares de ruta o volumen del host y ruta dentro del contenedor."
},
{
"title": "Resumen",
"body": "Antes de crear el CT se muestra la correspondencia completa de rutas y se guarda en el contrato de la instancia."
}
]
}
}
@@ -45,44 +63,85 @@
"blocks": [
{
"table": {
"headers": ["Propiedad", "Disco del contenedor", "Directorio del host"],
"headers": [
"Propiedad",
"Disco del contenedor",
"Directorio del host"
],
"rows": [
["En la configuración", "<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>", "<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"],
["Backup del contenedor (vzdump)", "Incluido, con <code>backup=1</code>", "No incluido"],
["Tamaño", "Fijo; crece con un redimensionado del punto de montaje", "El espacio libre del sistema de archivos o dataset del host"],
["Otros contenedores", "Solo lo monta su propio contenedor", "El mismo directorio puede montarse en varios contenedores"],
["Snapshots y restauración", "Los gestiona Proxmox VE junto con el CT", "Se gestionan en el almacenamiento del host"],
["Al eliminar la aplicación", "Se elimina con el contenedor", "Se conserva, con su contenido"],
["Al mover el CT a otro nodo", "Se mueve con el CT", "La misma ruta debe existir en el otro nodo"]
[
"En la configuración",
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
],
[
"Backup del contenedor (vzdump)",
"Incluido, con <code>backup=1</code>",
"No incluido"
],
[
"Tamaño",
"Fijo; se amplía redimensionando el punto de montaje",
"El espacio libre del sistema de archivos o dataset del host"
],
[
"Otros contenedores",
"Solo lo monta el contenedor al que pertenece",
"El mismo directorio se puede montar en varios contenedores"
],
[
"Snapshots y restauración",
"Los gestiona Proxmox VE junto con el CT",
"Se gestionan en el almacenamiento del host"
],
[
"Al eliminar la aplicación",
"Se elimina con el contenedor",
"Se conserva con su contenido"
],
[
"Al mover el CT a otro nodo",
"Se mueve con el CT",
"La misma ruta debe existir en el otro nodo"
]
]
}
},
{
"p": "El rootfs queda reservado para los binarios y el contenido de la imagen. Una actualización o una recreación lo sustituye sin tocar ninguno de los dos tipos de punto de montaje."
"p": "El rootfs se reserva para los binarios y el contenido de la imagen. Una actualización o recreación lo sustituye sin tocar ninguno de los dos tipos de punto de montaje."
}
]
},
{
"id": "example",
"title": "Ejemplo: un contenedor con las dos ubicaciones",
"title": "Ejemplo: un contenedor con ambas ubicaciones",
"blocks": [
{
"code": {
"title": "Jellyfin instalado como CT 151 en local-lvm (extracto)",
"code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Disco del contenedor, incluido en el backup del CT\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Directorio del host, fuera del backup del CT\nmp1: /mnt/oci-shared/media,mp=/data/media"
"title": "Jellyfin instalado como CT 151 en local-lvm (fragmento)",
"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": "Una actualización o una recreación sustituye solo el rootfs: <code>mp0</code> conserva usuarios, bibliotecas y ajustes, y <code>mp1</code> sigue mostrando los mismos archivos multimedia. Restaurar el backup del CT devuelve <code>/config</code>; el directorio multimedia se restaura, si hace falta, desde el backup del almacenamiento del host."
"p": "Una actualización o recreación solo sustituye el rootfs: <code>mp0</code> conserva usuarios, bibliotecas y ajustes, y <code>mp1</code> sigue mostrando los mismos archivos multimedia. Al restaurar el backup del CT se recupera <code>/config</code>; si hace falta restaurar el directorio multimedia, se utiliza el backup del almacenamiento del host."
},
{
"flow": {
"nodes": [
{ "label": "Contrato", "detail": "/config" },
{ "label": "Ubicación", "detail": "disco del contenedor\no directorio del host" },
{ "label": "LXC", "detail": "siempre /config\npara la aplicación" }
{
"label": "Contrato",
"detail": "/config"
},
{
"label": "Ubicación",
"detail": "Disco del contenedor\no directorio del host"
},
{
"label": "LXC",
"detail": "Siempre /config\npara la aplicación"
}
],
"caption": "La aplicación ve la ruta que publica la imagen; solo cambia dónde se guarda."
"caption": "La aplicación ve la ruta declarada por la imagen; solo cambia dónde se almacena."
}
}
]
@@ -94,33 +153,48 @@
{
"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": "Directorio del host", "config": "configuración propia" }
"labels": {
"host": "Directorio del host",
"config": "Configuración propia"
}
}
},
{
"p": "Cada contenedor guarda su configuración en su propio disco. La biblioteca o las descargas son un único directorio del host montado en la misma ruta interna de todos los contenedores, de modo que la ruta en la que escribe una aplicación es la misma en la que lee otra."
"p": "Cada contenedor guarda su configuración en su propio disco. La biblioteca o las descargas se guardan en un único directorio del host, montado en la misma ruta interna en todos los contenedores. Así, una ruta en la que escribe una aplicación es la misma desde la que lee otra."
}
]
},
{
"id": "rclone",
"title": "Almacenamiento en la nube con la aplicación Rclone",
"intro": "La aplicación Rclone del catálogo ofrece, además de su instalación, <strong>Activar un montaje en un contenedor Rclone OCI existente</strong>. Monta un remoto ya creado y autorizado en la interfaz web de Rclone y lo publica en el host, donde otros contenedores pueden usarlo como directorio del host.",
"title": "Almacenamiento en la nube mediante la aplicación rclone",
"intro": "Además de instalarla, la ficha de rclone en el catálogo permite <strong>Activar un montaje en un contenedor OCI de rclone existente</strong>. Se monta un remoto ya creado y autorizado en la interfaz web de rclone y se publica en el host. Otros contenedores pueden usarlo como un directorio del host.",
"blocks": [
{
"steps": {
"items": [
{ "title": "Contenedor y remoto", "body": "El VMID del contenedor Rclone, el nombre exacto del remoto y, opcionalmente, una ruta dentro de él." },
{ "title": "Nombre y caché", "body": "El nombre del montaje y el modo de caché VFS: <code>off</code>, <code>minimal</code>, <code>writes</code> o <code>full</code> (por defecto)." },
{ "title": "Vistas publicadas", "body": "Una raíz común, <code>/mnt/oci-shared</code> de forma predeterminada, contiene una vista de lectura y escritura en <code>/mnt/oci-shared/remotes/NAME</code> y otra de solo lectura en <code>/mnt/oci-shared/remotes-ro/NAME</code>." },
{ "title": "Activación", "body": "Tras una confirmación, el CT se detiene, se configuran su orden de arranque y un hookscript de Proxmox VE, y se vuelve a iniciar. La operación espera hasta que las dos vistas están montadas en el host." }
{
"title": "Contenedor y remoto",
"body": "El VMID del contenedor de rclone, el nombre exacto del remoto y, opcionalmente, una ruta dentro de él."
},
{
"title": "Nombre del montaje y caché",
"body": "El nombre del montaje y el modo de caché VFS: <code>off</code>, <code>minimal</code>, <code>writes</code> o <code>full</code> (predeterminado)."
},
{
"title": "Vistas publicadas",
"body": "Una raíz común, <code>/mnt/oci-shared</code> de forma predeterminada, contiene una vista de lectura y escritura en <code>/mnt/oci-shared/remotes/NAME</code> y otra de solo lectura en <code>/mnt/oci-shared/remotes-ro/NAME</code>."
},
{
"title": "Activación",
"body": "Tras confirmar, se detiene el CT, se configuran su comando de arranque y un hookscript de Proxmox VE y se vuelve a iniciar. La operación espera a que ambas vistas estén montadas en el host."
}
]
}
},
{
"calloutInfo": {
"title": "Si el montaje no llega a activarse",
"body": "Se restaura la configuración anterior del contenedor y se vuelve a iniciar, de modo que una activación fallida deja Rclone como estaba."
"title": "Si el montaje no se activa",
"body": "Se restaura la configuración anterior del contenedor y se vuelve a iniciar. Así, si la activación falla, rclone queda como estaba."
}
}
]
@@ -128,41 +202,58 @@
{
"id": "network",
"title": "Direcciones y redes",
"intro": "Una aplicación simple necesita una dirección. Una aplicación multicontenedor necesita además una red estable entre sus miembros.",
"intro": "Una aplicación de un solo contenedor necesita una dirección. Una aplicación con varios contenedores también necesita una red estable entre sus miembros.",
"blocks": [
{
"cards": {
"items": [
{ "icon": "network", "title": "Aplicación simple", "body": "Se eligen el bridge y DHCP o una dirección CIDR fija. El LXC tiene una dirección propia y el resumen muestra las URL completas de los servicios." },
{ "icon": "waypoints", "title": "Aplicación multicontenedor", "body": "Se busca una subred libre, se crea un bridge privado persistente y cada miembro (aplicación, base de datos, caché) recibe en él una dirección fija." }
{
"icon": "network",
"title": "Aplicación de un contenedor",
"body": "Se elige el puente de red y DHCP o una dirección fija en formato CIDR. El LXC tiene su propia dirección y el resumen muestra las URL completas de los servicios."
},
{
"icon": "waypoints",
"title": "Aplicación con varios contenedores",
"body": "Se busca una subred libre, se crea un puente privado persistente y cada miembro —aplicación, base de datos y caché— recibe una dirección fija en él."
}
]
}
},
{
"flow": {
"nodes": [
{ "label": "LAN", "detail": "dirección accesible\nsolo el servicio principal" },
{ "label": "LXC principal", "detail": "web / API\nLAN + red privada" },
{ "label": "Red privada", "detail": "PostgreSQL · Valkey · ML\ndirecciones fijas" }
{
"label": "LAN",
"detail": "Dirección accesible\nsolo para el servicio principal"
},
{
"label": "LXC principal",
"detail": "Web / API\nLAN + red privada"
},
{
"label": "Red privada",
"detail": "PostgreSQL · Valkey · ML\ndirecciones fijas"
}
],
"caption": "Las dependencias se comunican por la red privada y no tienen dirección en la LAN."
"caption": "Las dependencias se comunican por la red privada y no tienen una dirección en la LAN."
}
},
{
"p": "El contrato de la pila guarda el bridge, la subred, las direcciones y las relaciones entre servicios. La actualización de la aplicación reutiliza la misma topología en todos sus miembros. ProxMenux Monitor abre el contenedor principal en su dirección de la LAN, no en la de la red privada."
"p": "El contrato de la pila guarda el puente, la subred, las direcciones y las relaciones entre servicios. Al actualizar la aplicación se reutiliza la misma topología para todos sus miembros. ProxMenux Monitor abre el contenedor principal en su dirección de la LAN, no en la de la red privada."
}
]
},
{
"id": "ownership",
"title": "Propietarios",
"title": "Propietarios de archivos y directorios",
"blocks": [
{
"list": {
"items": [
"Los directorios nuevos se crean con el UID y el GID que mapea el LXC no privilegiado.",
"Los directorios existentes no cambian de propietario de forma recursiva.",
"Los sockets, los archivos del sistema y las rutas sensibles no se ofrecen como directorios del host genéricos."
"Los directorios nuevos se crean con el UID y el GID a los que se mapea el LXC sin privilegios.",
"No se cambia recursivamente el propietario de los directorios existentes.",
"Los sockets, archivos del sistema y rutas sensibles no se ofrecen como directorios genéricos del host."
]
}
}
@@ -174,13 +265,37 @@
"blocks": [
{
"table": {
"headers": ["Elemento", "En el vzdump del CT", "Dónde se conserva"],
"headers": [
"Elemento",
"En el backup vzdump del CT",
"Dónde se conserva"
],
"rows": [
["rootfs OCI", "Sí", "El backup del CT; también puede reconstruirse desde la imagen y el contrato"],
["Disco del contenedor con <code>backup=1</code>", "Sí", "El backup del CT"],
["Directorio del host", "No", "El backup del almacenamiento del host"],
["Contrato de la instancia", "No", "<code>/usr/local/share/proxmenux/oci/instances/VMID/</code> en el host"],
["Aplicación multicontenedor", "Cada miembro en su propio backup", "Los backups de cada miembro, más el contrato de la pila y su bridge en el host"]
[
"Rootfs OCI",
"Sí",
"En el backup del CT; también se puede reconstruir a partir de la imagen y el contrato"
],
[
"Disco del contenedor con <code>backup=1</code>",
"Sí",
"El backup del CT"
],
[
"Directorio del host",
"No",
"El backup del almacenamiento del host"
],
[
"Contrato de la instancia",
"Sí, la copia que guarda el CT",
"<code>/.proxmenux/oci-record.json</code> dentro del CT; las copias adicionales del host y del clúster se guardan por separado"
],
[
"Aplicación con varios contenedores",
"Cada miembro en su propio backup",
"Los backups de todos los miembros, más el contrato de la pila y su puente de red en el host"
]
]
}
}
@@ -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."
}
]
}
]
}
+213
View File
@@ -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"
]
]
}
}
]
}
]
}
@@ -0,0 +1,171 @@
{
"meta": {
"title": "Come viene adattata un’immagine OCI | ProxMenux",
"description": "Dal repository dell’immagine e dal suo file Compose a un modello verificabile, un piano di distribuzione e un LXC nativo di Proxmox VE, senza Docker al suo interno."
},
"header": {
"title": "Come viene adattata un’immagine OCI",
"description": "Dal repository dell’immagine e dal suo file Compose a un modello verificabile, un piano di distribuzione e un LXC nativo, senza installare Docker al suo interno.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "pipeline",
"title": "Il processo di adattamento",
"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": "Repository dell’immagine",
"converter": "Convertitore",
"template": "Modello JSON",
"blockers": "Nessun requisito bloccante?",
"no": "No",
"yes": "Sì",
"review": "Revisione / overlay",
"plan": "Piano di distribuzione",
"lxc": "LXC nativo"
}
}
},
{
"p": "Il convertitore legge l’immagine e il file Compose pubblicati dal progetto e genera un modello JSON. Se alcuni requisiti non possono ancora essere adattati e impediscono l’installazione, il modello viene revisionato prima della pubblicazione nel catalogo. Un file di modifiche verificate, chiamato overlay, risolve questi problemi. Solo i modelli senza requisiti bloccanti vengono proposti per l’installazione."
}
]
},
{
"id": "template",
"title": "Cosa conserva il modello",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Identità dell’immagine",
"body": "Repository, tag ad aggiornamento continuo, architettura, digest risolto e revisione di origine."
},
{
"icon": "braces",
"title": "Contratto del container",
"body": "Entrypoint, Cmd, ambiente, utente, directory di lavoro, segnale di arresto, porte e volumi."
},
{
"icon": "layers",
"title": "Adattamento a Proxmox VE",
"body": "Risorse, sicurezza, punti di mount, dispositivi, sysctls, controlli di stato e adattamenti necessari per ciascuno, con la relativa motivazione."
},
{
"icon": "shield",
"title": "Compatibilità",
"body": "Chiavi supportate, requisiti non adattati che impediscono l’installazione e stato di ogni verifica."
}
]
}
}
]
},
{
"id": "sources",
"title": "OCI fornisce il processo, Compose l’ambiente",
"blocks": [
{
"table": {
"headers": [
"Origine",
"Esempio",
"Risultato nativo"
],
"rows": [
[
"Metadati OCI",
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
"Proxmox VE li importa durante la creazione del CT"
],
[
"Docker Compose",
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
"Voci dell’ambiente LXC, <code>mpN</code> e <code>devN</code>"
],
[
"Profilo ProxMenux",
"GPU, controllo di stato, credenziali",
"Domande e adattamenti verificati"
],
[
"Utente",
"VMID, storage, rete",
"Il contratto dell’istanza"
]
]
}
}
]
},
{
"id": "install",
"title": "Cosa succede durante l’installazione",
"blocks": [
{
"steps": {
"items": [
{
"title": "Risolvere il riferimento",
"body": "Viene interrogato il registro, viene scelta l’architettura dell’host e viene fissato il digest esatto a cui punta il tag ad aggiornamento continuo."
},
{
"title": "Scaricare e verificare",
"body": "Skopeo scarica l’immagine come archivio OCI. Prima di creare qualsiasi risorsa, ogni livello viene verificato rispetto al suo digest e decompresso. Se il download è danneggiato, viene ripetuto una volta prima di interrompere l’installazione."
},
{
"title": "Creare il filesystem",
"body": "<code>pct create</code> crea il rootfs a partire dall’archivio e conserva i metadati ufficiali del processo dell’immagine."
},
{
"title": "Collegare le risorse",
"body": "Vengono applicati i volumi, la rete, l’ambiente, i dispositivi e i profili di sicurezza dichiarati."
},
{
"title": "Console",
"body": "L’output della console del container viene conservato sull’host. La console di Proxmox VE apre una shell se l’immagine ne include una."
},
{
"title": "Verificare",
"body": "Al primo avvio si attende che il container riceva un indirizzo e che il servizio risponda. In caso di errore, l’installazione non viene indicata come riuscita."
},
{
"title": "Registrare la configurazione",
"body": "La configurazione effettiva viene salvata nel contratto dell’istanza usato per gli aggiornamenti e le ricreazioni."
}
]
}
}
]
},
{
"id": "example",
"title": "Esempio: un’immagine con /config e /downloads",
"intro": "Una definizione Compose comune e la configurazione Proxmox VE che ne deriva. I percorsi attesi dall’applicazione non cambiano.",
"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 (estratto)",
"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> è un secondo disco appartenente al container, denominato <code>vm-VMID-disk-N</code> sullo storage selezionato. Viene montato in <code>/config</code> e, con <code>backup=1</code>, incluso nel backup del container. <code>mp1</code> non crea alcun disco: monta la directory dell’host <code>/srv/downloads</code> in <code>/downloads</code> all’interno dell’LXC. La porta 8080 non viene mappata: l’LXC ha un proprio indirizzo e il servizio risponde su quello."
}
]
}
]
}
@@ -0,0 +1,278 @@
{
"meta": {
"title": "Installare un’immagine non presente nel catalogo | ProxMenux",
"description": "Adatta un’immagine OCI da un file Compose, un URL, un comando docker run o un riferimento all’immagine e verifica cosa può riprodurre ProxMenux prima di installarla."
},
"header": {
"title": "Installa un’immagine non presente nel catalogo",
"description": "L’immagine viene adattata dal suo file Compose, da un comando docker run o dal solo riferimento. Il risultato viene mostrato per la revisione prima di creare qualsiasi LXC.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Lo stesso convertitore e lo stesso installer",
"body": "L’opzione <strong>Installa un’immagine non presente nel catalogo</strong> usa il convertitore e l’installer dei modelli del catalogo. La differenza è che il contratto viene generato al momento dalla definizione fornita e verificato prima di creare qualsiasi LXC."
}
}
]
},
{
"id": "sources",
"title": "Come viene descritta l’immagine",
"intro": "La prima schermata chiede come viene descritta l’immagine. Quattro opzioni forniscono una definizione da adattare, una quinta usa solo il nome dell’immagine e altre tre leggono un oci-compose già scritto.",
"blocks": [
{
"table": {
"headers": [
"Opzione",
"Cosa legge"
],
"rows": [
[
"Incolla il file Compose nel terminale",
"Incolla il contenuto YAML nel terminale e termina con Ctrl+D."
],
[
"Leggi il file Compose da questo host",
"Un percorso sul nodo, <code>/root/docker-compose.yml</code> per impostazione predefinita. Il file deve esistere e non superare 256 KiB."
],
[
"Scarica il file Compose da un indirizzo",
"Un indirizzo <code>http://</code> o <code>https://</code> che fornisce il contenuto YAML grezzo. Vengono scaricati al massimo 256 KiB."
],
[
"Incolla il comando docker run nel terminale",
"Il comando pubblicato dal progetto. Vengono adattati porte, ambiente, volumi, dispositivi, capability, utente, memoria condivisa e le altre opzioni supportate."
],
[
"Solo il riferimento all’immagine, senza file Compose",
"Un riferimento come <code>ghcr.io/user/application:latest</code>. Viene interrogato il registro e vengono conservati i metadati OCI dell’immagine."
],
[
"Incolla un oci-compose nel terminale",
"Incolla il JSON nel terminale e termina con Ctrl+D. Non viene convertito: viene verificato e installato così come è scritto."
],
[
"Leggi un oci-compose da questo host",
"Un file JSON sul nodo, <code>/root/oci-compose.json</code> per impostazione predefinita, di massimo 2 MiB."
],
[
"Scarica un oci-compose da un indirizzo",
"Un indirizzo <code>http://</code> o <code>https://</code> che fornisce il file JSON. Vengono scaricati al massimo 2 MiB."
]
]
}
},
{
"figure": {
"src": "/oci-manager/custom-source-menu.png",
"alt": "Menu per scegliere come descrivere un’immagine non presente nel catalogo",
"caption": "Modi per descrivere un’immagine non presente nel catalogo."
}
}
]
},
{
"id": "reference-only",
"title": "Cosa fornisce il solo riferimento all’immagine",
"intro": "L’immagine contiene i metadati del processo, ma non tutto l’ambiente che normalmente aggiunge un file Compose.",
"blocks": [
{
"table": {
"headers": [
"Letto dall’immagine",
"Non presente nell’immagine",
"Conseguenza"
],
"rows": [
[
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> e l’ambiente incorporato",
"Variabili presenti solo nella documentazione",
"Vengono aggiunte durante l’installazione o con Modifica"
],
[
"Volumi dichiarati dall’immagine",
"Directory dell’host indicate solo nel file Compose",
"I percorsi aggiuntivi vengono inseriti prima dell’installazione"
],
[
"Porte <code>EXPOSE</code>",
"L’URL, il protocollo o il controllo funzionale del servizio",
"Vengono confermati la porta e il metodo di verifica del servizio"
],
[
"Architetture e digest nel registro",
"Dispositivi, privilegi o dipendenze esterne",
"Non vengono abilitati senza una definizione che li richieda"
]
]
}
}
]
},
{
"id": "review",
"title": "Verifica prima di installare",
"intro": "Dopo aver adattato la definizione, ProxMenux mostra come l’ha interpretata prima di chiedere VMID, risorse o storage.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Analizza",
"body": "Vengono letti servizi, immagine, porte, percorsi, ambiente, dispositivi, sicurezza e controllo di stato."
},
{
"title": "Interroga il registro",
"body": "L’immagine deve esistere nel registro e vengono elencate le architetture pubblicate. Per un registro privato viene usato l’account salvato per quel registro."
},
{
"title": "Elenca ciò che non viene applicato",
"body": "Vengono elencati label, reti Docker, impostazioni Swarm e altre chiavi che non hanno effetto su un LXC."
},
{
"title": "Blocca le opzioni senza equivalente sicuro",
"body": "Le chiavi senza un equivalente sicuro compaiono in <strong>Opzioni senza equivalente</strong> e impediscono di proseguire con l’installazione. Non vengono ignorate senza avviso."
},
{
"title": "Richiedi i segreti",
"body": "Le variabili il cui nome indica una password, un token o una chiave vengono richieste come dati sensibili durante l’installazione."
}
]
}
},
{
"figure": {
"src": "/oci-manager/custom-review.png",
"alt": "Riepilogo di come ProxMenux ha interpretato il file Compose",
"caption": "Riepilogo mostrato prima che l’installer chieda VMID e risorse."
}
},
{
"p": "Dopo aver accettato il riepilogo, il flusso è quello del catalogo: nome, modalità predefinita o avanzata, VMID, CPU, memoria, rete, avvio con il nodo, percorsi persistenti e aggiuntivi, dispositivi compatibili e riepilogo finale."
}
]
},
{
"id": "examples",
"title": "Esempi di input",
"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 scritto a mano",
"intro": "Un oci-compose è il file JSON da cui viene installata un’applicazione. Il catalogo ne conserva uno per ogni applicazione. Lo stesso formato può essere scritto a mano e installato con questa opzione.",
"blocks": [
{
"p": "In un file scritto a mano l’autore decide immagine, porte, variabili, volumi e domande dell’installazione. ProxMenux completa il resto durante la lettura. Il formato può esprimere ciò che Compose non prevede: il testo di una domanda, una password generata all’installazione, un profilo GPU, il proprietario di ciascun volume, il controllo del primo avvio o le credenziali mostrate alla fine."
},
{
"steps": {
"items": [
{
"title": "Verifica",
"body": "I file con errori non vengono installati. Ogni errore indica il campo interessato; se il JSON non è valido, vengono segnalate riga e colonna."
},
{
"title": "Rivedi",
"body": "Un file valido mostra cosa installa: immagine, indirizzo web, porte, percorsi persistenti, variabili richieste dall’installer e file che verranno scritti."
},
{
"title": "Installa",
"body": "L’installazione è la stessa delle applicazioni del catalogo, con impostazioni predefinite o avanzate."
}
]
}
},
{
"calloutWarning": {
"title": "Un file che determina i privilegi",
"body": "Un oci-compose stabilisce cosa viene montato nel container e con quali privilegi. La revisione lo mostra prima dell’installazione: installa solo file provenienti da fonti attendibili."
}
},
{
"p": "Il <readmeLink>README del motore OCI</readmeLink> descrive il formato blocco per blocco con due esempi completi. Anche il record di un’installazione può essere letto nello stesso modo: viene usato solo il modello originale, senza alcuna delle risposte di quell’installazione."
}
]
},
{
"id": "private-registries",
"title": "Immagini in registri privati",
"intro": "Un’immagine in un registro privato, come un pacchetto privato su GitHub o un repository privato su Docker Hub, viene letta con un account salvato in ProxMenux.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Il registro nega l’accesso all’immagine",
"body": "Quando il registro indica che l’immagine richiede un account, la revisione propone di accedere a quel registro e legge di nuovo l’immagine."
},
{
"title": "Accedi",
"body": "Un nome utente e una password o un token autorizzato a scaricare l’immagine. Il registro li verifica e vengono salvati solo se accettati."
},
{
"title": "Installa e mantieni aggiornato",
"body": "L’account viene usato per scaricare l’immagine durante l’installazione e anche per aggiornamenti, Modifica, Ricrea, watchdog e ricerca degli aggiornamenti del Monitor, su qualsiasi nodo del cluster."
}
]
}
},
{
"p": "<strong>Account dei registri</strong>, nel menu principale di OCI manager Apps, elenca gli account salvati per registro e utente, senza mostrarne i segreti. Da ogni account puoi verificare, scaricare o installare un’immagine e aggiornare o rimuovere le credenziali."
},
{
"list": {
"items": [
"GitHub (<code>ghcr.io</code>): l’utente è l’account GitHub e la password è un token di accesso personale con il permesso <code>read:packages</code>.",
"Docker Hub (<code>docker.io</code>): l’utente è l’account Docker Hub e la password è un token di accesso con permesso di lettura.",
"Altri registri, anche con una porta propria come <code>registry.example.com:5000</code>: nome utente e password o token forniti da quel registro."
]
}
},
{
"calloutInfo": {
"title": "Dove vengono salvati gli account",
"body": "In <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, leggibile solo da root, nella stessa cartella in cui Proxmox conserva le password degli storage. <code>/etc/pve</code> è condiviso tra tutti i nodi del cluster, quindi un account aggiunto su un nodo viene usato su tutti. Il backup dell’host include il file e la disinstallazione di ProxMenux lo rimuove da tutti i nodi."
}
}
]
},
{
"id": "limits",
"title": "Definizioni che non vengono installate",
"blocks": [
{
"list": {
"items": [
"Un Dockerfile senza immagine pubblicata: prima occorre creare l’immagine e pubblicarla in un registro OCI.",
"Un file Compose con più servizi: viene bloccato perché questa opzione installa un solo servizio per container, anche se più servizi usano la stessa immagine.",
"<code>configs</code>, segreti esterni o formati di dispositivi che non possono essere adattati senza ambiguità.",
"Sostituzioni della shell come <code>$(command)</code>: occorre inserire direttamente il valore risultante.",
"Opzioni <code>docker run</code> non riconosciute e <code>--env-file</code>: usa invece un file Compose con valori espliciti."
]
}
}
]
}
]
}
@@ -0,0 +1,392 @@
{
"meta": {
"title": "Dispositivi e accelerazione | ProxMenux",
"description": "Come OCI manager Apps passa GPU, NVIDIA, Coral, USB, FUSE e altri dispositivi a un contenitore OCI come risorse native Proxmox VE convalidate."
},
"header": {
"title": "Dispositivi e accelerazione",
"description": "I dispositivi GPU, NVIDIA, Coral, USB, FUSE e a blocchi diventano risorse native convalidate Proxmox VE del contenitore.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "principle",
"title": "Il dispositivo di cui l'applicazione ha bisogno, non l'intero host",
"blocks": [
{
"p": "Un dispositivo richiesto dal file Compose o dal profilo dell’applicazione viene configurato come voce <code>devN</code> specifica o come montaggio LXC. Richiedere una GPU, un dispositivo USB o un acceleratore Coral non rende il container privilegiato."
},
{
"flow": {
"nodes": [
{
"label": "Inventario host",
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
},
{
"label": "ProxMenux",
"detail": "produttore e\npermessi verificati"
},
{
"label": "LXC",
"detail": "stesso dispositivo\nGID effettivo"
}
]
}
}
]
},
{
"id": "origin",
"title": "Da dove proviene la richiesta del dispositivo",
"blocks": [
{
"table": {
"headers": [
"Fonte",
"Cosa si legge",
"Cosa fa l'installatore"
],
"rows": [
[
"Docker Compose",
"<code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> e NVIDIA richieste",
"Ogni esigenza diventa una richiesta di dispositivo mostrata per la revisione"
],
[
"Profilo del catalogo",
"Il supporto effettivo dell’applicazione per GPU, Coral, OpenCL, USB o FUSE",
"Solo le opzioni convalidate per quell'immagine sono offerte"
],
[
"Metadati e documentazione dell’immagine",
"VA-API, Selkies, mod LinuxServer o runtime NVIDIA",
"Vengono aggiunte le variabili documentate e la preparazione"
],
[
"Selezione utente",
"CPU solo, Intel/AMD, OpenCL, NVIDIA o un dispositivo opzionale",
"La selezione viene memorizzata nel contratto di istanza"
]
]
}
},
{
"calloutWarning": {
"title": "I dispositivi rilevati non vengono collegati automaticamente",
"body": "Viene creato un inventario dell’host, ma solo i dispositivi dichiarati dal file Compose o da un profilo compatibile sono offerti e allegati. Una GPU, USB dongle o Coral presente sull'host non è esposto ad ogni LXC."
}
}
]
},
{
"id": "identify",
"title": "Come viene identificato il dispositivo host",
"intro": "Prima della modifica del LXC, il dispositivo viene letto sull'host e abbinato al profilo scelto.",
"blocks": [
{
"table": {
"headers": [
"Tipo",
"Identità",
"Validazione"
],
"rows": [
[
"Intel/AMD DRM",
"<code>/dev/dri/renderD*</code> e <code>/sys/class/drm/NODE/device/vendor</code>",
"Un dispositivo a caratteri con il fornitore <code>0x8086</code> (Intel) o <code>0x1002</code> (AMD)"
],
[
"AMD OpenCL",
"Il nodo di rendering, più <code>/dev/kfd</code> quando il profilo ne ha bisogno",
"Esistenza, tipo, fornitore, autorizzazioni e compatibilità dichiarata"
],
[
"AMD ROCm",
"Il nodo di rendering, <code>/dev/kfd</code> e la generazione indicata dal driver di calcolo in <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>",
"Una generazione per cui l’immagine ROCm dell’applicazione include kernel di calcolo — le GPU RDNA2 indicate e quelle più recenti — viene proposta così com’è. Le altre GPU di queste famiglie, come Radeon 680M e 780M, sono proposte come sperimentali e non sono mai preselezionate: ROCm non le supporta ufficialmente, l’applicazione le presenta come la generazione della rispettiva famiglia (<code>HSA_OVERRIDE_GFX_VERSION</code>) e l’installatore chiede conferma prima di scaricare l’immagine più grande. Una GPU precedente, come la grafica integrata di un Ryzen 5000U, non viene proposta e Immich mantiene il riconoscimento sulla CPU."
],
[
"NVIDIA",
"<code>nvidia-smi</code> e <code>nvidia-container-cli</code>",
"GPU, UUID, bus PCI, versione driver, Toolkit, nodi <code>/dev/nvidia*</code>, binari e librerie"
],
[
"Coral PCIe/M.2",
"<code>/dev/apex_N</code> e il suo collegamento in <code>/sys/dev/char/MAJOR:MINOR</code>",
"Nodo a caratteri, numeri major/minor, proprietario, GID e permessi"
],
[
"USB e seriale",
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> o <code>/dev/bus/usb/BBB/DDD</code>",
"Nodo di carattere; per USB anche produttore, prodotto e seriale quando sysfs li pubblica"
],
[
"KVM, TUN, FUSE, video e SCSI generici",
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> o <code>/dev/sgN</code>",
"Percorso supportato, tipo nodo e permessi effettivi"
],
[
"Unità ottica",
"<code>/dev/srN</code>",
"Un dispositivo a blocchi"
]
]
}
}
]
},
{
"id": "install",
"title": "Cosa succede durante l'installazione",
"blocks": [
{
"steps": {
"items": [
{
"title": "Il modello offre i suoi profili",
"body": "Ad esempio solo CPU, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL o NVIDIA. Le opzioni appartengono all'immagine, non a un menu comune."
},
{
"title": "Viene scelto un profilo",
"body": "Definisce i nodi del dispositivo, ambiente, mod o runtime di cui l'applicazione ha bisogno."
},
{
"title": "Si propone un percorso",
"body": "Per DRM, <code>/dev/dri/renderD128</code>, che può essere modificato su un host con diversi nodi di rendering. Per USB o seriale, viene selezionato il nodo specifico."
},
{
"title": "Validazione",
"body": "Esistenza, tipo, fornitore consentito, autorizzazioni e GID sono controllati. Un errore blocca l'operazione."
},
{
"title": "Il contratto è scritto",
"body": "Percorso, modalità, GID, accesso scrittura e profilo sono registrati per aggiornamenti e ricreazioni."
},
{
"title": "Collega e verifica",
"body": "<code>pct set</code> aggiunge l'ingresso <code>devN</code> e l'accesso viene quindi controllato all'interno del LXC. Le immagini LinuxServer vengono anche controllate come utente <code>abc</code>."
}
]
}
}
]
},
{
"id": "config",
"title": "Come appare nella configurazione LXC",
"intro": "Valori illustrativi: <code>dev0</code> e <code>dev1</code> sono gli slot liberi assegnati da Proxmox VE; <code>renderD128</code>, <code>apex_0</code> e il GID dipendono dall’hardware del nodo.",
"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 dispositivo USB specifico",
"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": "Il GID è letto con <code>stat</code> sull'host e scritto all'ingresso <code>devN</code>; i gruppi <code>render</code> e <code>video</code> non si presume abbiano un numero fisso. Il dispositivo mantiene lo stesso percorso <code>/dev</code> all'interno del LXC, dove i propri meccanismi dell'applicazione lo cercano."
}
]
},
{
"id": "profiles",
"title": "Profili che un’immagine può offrire",
"blocks": [
{
"table": {
"headers": [
"Profilo",
"Configurazione risultante",
"Offerto quando"
],
"rows": [
[
"Intel/AMD VA-API",
"Nodo di rendering <code>/dev/dri</code>",
"L'applicazione supporta l'accelerazione video"
],
[
"OpenCL",
"Nodo di rendering, <code>/dev/kfd</code> quando necessario e mod ufficiale",
"L'immagine o il profilo lo documentano"
],
[
"NVIDIA",
"Dispositivi driver e librerie dell'host",
"L’host dispone di un driver funzionante e di NVIDIA Container Toolkit"
],
[
"Coral",
"<code>/dev/apex_0</code> o il bus USB",
"Il profilo dichiara il supporto Coral (Frigate)"
],
[
"USB, seriale, FUSE",
"Un singolo dispositivo, un albero convalidato o una funzione LXC",
"Il contratto lo chiede"
]
]
}
}
]
},
{
"id": "nvidia",
"title": "NVIDIA",
"blocks": [
{
"calloutWarning": {
"title": "Requisito del nodo: NVIDIA Container Toolkit",
"body": "Un driver funzionante su Proxmox VE non è sufficiente per dare un NVIDIA GPU ad un'immagine OCI. OCI manager Apps utilizza <code>nvidia-container-cli</code>, dal NVIDIA Container Toolkit, per identificare i dispositivi e per ottenere i binari e le librerie che corrispondono al driver caricato."
}
},
{
"p": "L’<nvidiaLink>installatore NVIDIA di ProxMenux</nvidiaLink> installa NVIDIA Container Toolkit dal repository ufficiale NVIDIA insieme al driver. Controlla i quattro pacchetti, convalida <code>nvidia-container-cli</code> e registra il risultato nel registro delle modifiche di <auditLink>Audit & Report</auditLink>."
},
{
"p": "Questi due comandi sull'host mostrano se il driver e il Toolkit sono disponibili:"
},
{
"shell": {
"code": "nvidia-smi -L\nnvidia-container-cli --version"
}
},
{
"p": "Su un host dove il driver è stato installato con altri mezzi, il Toolkit è installato dal repository ufficiale stabile:"
},
{
"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’inventario utilizzato da OCI manager Apps è l'output di:"
},
{
"shell": {
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
}
},
{
"calloutInfo": {
"title": "La configurazione di runtime Docker non è coinvolta",
"body": "I container sono LXC nativi e non usano un demone Docker, quindi <code>nvidia-ctk runtime configure --runtime=docker</code> non interviene: ProxMenux interroga direttamente <code>nvidia-container-cli</code> e configura dispositivi e montaggi LXC. I comandi e le piattaforme supportate sono mantenuti nella <toolkitLink>guida di installazione di NVIDIA Container Toolkit</toolkitLink>."
}
},
{
"cards": {
"items": [
{
"icon": "cpu",
"title": "Inventario dal driver",
"body": "<code>nvidia-container-cli</code> elenca i nodi del dispositivo, i binari, il firmware e le librerie del driver installato."
},
{
"icon": "refresh",
"title": "Nessuna versione fissa",
"body": "Il modello non nomina i file della libreria. Il profilo viene generato dall'host corrente."
},
{
"icon": "shield",
"title": "Montaggi in sola lettura",
"body": "Le librerie ospitanti sono montate in sola lettura invece di essere copiate nel contenitore."
},
{
"icon": "hardDrive",
"title": "Modifiche dei driver",
"body": "Dopo che un driver cambia l'inventario viene generato nuovamente prima dell'avvio dei LXC colpiti."
}
]
}
},
{
"code": {
"title": "Risultati NVIDIA (semplificati)",
"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": "Passare solo <code>/dev/nvidia0</code> non è sufficiente. I componenti user-space del driver caricato sono montati in sola lettura e <code>nvidia-smi</code> poi funziona all'interno del LXC per confrontare GPU, UUID, PCI bus e versione con l'inventario host."
}
]
},
{
"id": "usb",
"title": "USB, seriale e USB Coral",
"blocks": [
{
"calloutWarning": {
"title": "Numerazione USB può cambiare",
"body": "Un percorso come <code>/dev/bus/usb/003/004</code> può cambiare quando il dispositivo viene ricollegato o l'host si riavvia. Il profilo registra il fornitore, il prodotto e la serie quando sono disponibili, ma un nuovo indirizzo del bus non viene rimappato automaticamente."
}
},
{
"p": "Una periferica è data dal suo nodo specifico: <code>/dev/ttyUSB0</code>, <code>/dev/ttyACM0</code>, <code>/dev/apex_0</code> o <code>/dev/bus/usb/BBB/DDD</code>. Passare l'intero <code>/dev</code> non è accettato. Coral è offerto solo a applicazioni il cui profilo lo dichiara."
}
]
},
{
"id": "trees",
"title": "Alberi dei dispositivi e funzionalità LXC",
"blocks": [
{
"table": {
"headers": [
"Richiesta",
"Configurazione risultante",
"Ambito"
],
"rows": [
[
"<code>/dev/dvb</code>, <code>/dev/snd</code> o <code>/dev/bus/usb</code>",
"Ogni nodo di carattere dell'albero ottiene il proprio ingresso <code>devN</code> con la modalità host e GID",
"Solo l'albero richiesto, non il resto di <code>/dev</code>"
],
[
"<code>/dev/fuse</code>",
"Il nodo e, quando il profilo ne ha bisogno, la funzione <code>fuse=1</code>",
"FUSE da solo non rende disponibili i montaggi agli altri LXC"
],
[
"<code>/dev/net/tun</code>",
"Un ingresso <code>devN</code> nello stesso percorso all'interno del LXC",
"La configurazione VPN o di rete rimane nell’applicazione"
],
[
"<code>/dev/kvm</code>",
"Una voce valida <code>devN</code>",
"Offerto solo quando il contratto lo chiede"
]
]
}
}
]
},
{
"id": "security",
"title": "Conferma per livello di rischio",
"blocks": [
{
"p": "Dispositivi concreti, privilegio facoltativo, privilegio richiesto, allentamento di AppArmor o seccomp e accesso al namespace PID host sono trattati come casi separati, non sotto una generica etichetta privilegiata. Ogni opzione con un rischio viene spiegata e confermata durante l'installazione."
}
]
}
]
}
+213
View File
@@ -0,0 +1,213 @@
{
"meta": {
"title": "OCI manager Apps | ProxMenux",
"description": "Esegui immagini OCI ufficiali come container LXC nativi di Proxmox VE, con dati persistenti, accesso ai dispositivi, applicazioni composte da più container e aggiornamenti transazionali."
},
"header": {
"title": "OCI manager Apps",
"description": "Le immagini OCI ufficiali vengono eseguite come container LXC nativi di Proxmox VE. L’immagine rimane quella pubblicata dal manutentore; ProxMenux ricrea l’ambiente che Docker Compose avrebbe predisposto intorno ad essa.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "model",
"blocks": [
{
"calloutInfo": {
"title": "Un’immagine OCI, un LXC nativo",
"body": "Nei container non viene eseguito Docker Engine. Proxmox VE importa il filesystem dell’immagine e i suoi metadati OCI. L’applicazione diventa il processo principale di un LXC nativo, gestito con gli stessi strumenti degli altri container del nodo."
}
},
{
"flow": {
"nodes": [
{
"label": "Origine",
"detail": "Immagine OCI\nCompose e documentazione"
},
{
"label": "ProxMenux",
"detail": "Contratto JSON\nvalidazione e pianificazione"
},
{
"label": "Proxmox VE",
"detail": "LXC nativo\nvolumi e dispositivi"
}
],
"caption": "Si usa l’applicazione originale: il suo ambiente viene descritto in modo dichiarativo e riprodotto."
}
}
]
},
{
"id": "where",
"title": "Dove si trova",
"intro": "Sul nodo Proxmox, come root, apri <strong>OCI manager Apps (Technology Preview)</strong> dal menu principale di ProxMenux. La prima schermata offre:",
"blocks": [
{
"list": {
"items": [
"<strong>Cerca applicazioni</strong>: cerca per nome nell’intero catalogo.",
"<strong>Tutte le applicazioni</strong>: mostra il catalogo completo e il numero di applicazioni.",
"<strong>Gestisci le applicazioni OCI installate</strong>: aggiorna, modifica, rimuovi o recupera le applicazioni già installate.",
"<strong>Account dei registri</strong>: gestisci gli account usati per installare e aggiornare immagini da registri privati.",
"<strong>Installa un’immagine non presente nel catalogo</strong>: adatta un file Compose, un comando <code>docker run</code> o un riferimento a un’immagine.",
"Le categorie del catalogo, ciascuna con il numero di applicazioni."
]
}
},
{
"figure": {
"src": "/oci-manager/main-menu.png",
"alt": "Schermata principale di OCI manager Apps con ricerca, catalogo completo, gestione delle applicazioni, immagini fuori catalogo e categorie.",
"caption": "Schermata principale di OCI manager Apps."
}
},
{
"p": "Selezionando un’applicazione vengono mostrati la descrizione, l’immagine usata e due modalità di installazione. <strong>Installa con le impostazioni predefinite</strong> chiede solo le scelte essenziali: storage, posizione dei dati, indirizzo e avvio. <strong>Installa con le impostazioni avanzate</strong> presenta tutte le decisioni in ordine: VMID e risorse, storage per ogni percorso, bridge di rete e dispositivi."
},
{
"p": "Le applicazioni provate sul campo mostrano <strong>Verificato</strong> in questa schermata e un ✓ negli elenchi, sia per i test del laboratorio ProxMenux sia per quelli della community."
}
]
},
{
"id": "beta",
"title": "Perché mantiene l’etichetta Technology Preview",
"blocks": [
{
"p": "OCI manager Apps mantiene l’etichetta <strong>Technology Preview</strong> assegnata da Proxmox VE ai container applicativi creati da immagini OCI, il cui supporto è stato introdotto in Proxmox VE 9.1. L’etichetta riguarda la tecnologia su cui si basa OCI manager Apps, non il motore di ProxMenux: il comportamento di questi container può ancora cambiare tra le versioni di Proxmox VE. Rimarrà finché Proxmox VE non considererà stabile tale supporto."
},
{
"p": "Il motore di OCI manager Apps viene testato nel laboratorio ProxMenux: installazione, aggiornamento, modifica, ricreazione, backup, ripristino, migrazione e watchdog. Ogni applicazione viene verificata separatamente. Quelle provate sul campo mostrano <strong>Verificato</strong> e un ✓ negli elenchi."
}
]
},
{
"id": "translation",
"title": "Come Docker descrive i requisiti e come li realizza OCI manager Apps",
"blocks": [
{
"table": {
"headers": [
"Requisito",
"Come lo esprime Docker",
"Come lo realizza OCI manager Apps"
],
"rows": [
[
"Eseguire l’applicazione",
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
"Il rootfs OCI e il processo principale dell’LXC"
],
[
"Conservare la configurazione",
"<code>volumes: /config</code>",
"Un volume persistente <code>mpN</code> incluso nel backup, oppure una directory dell’host."
],
[
"Rendere accessibile il servizio",
"<code>ports</code>",
"Un indirizzo proprio per l’LXC e l’URL di accesso al servizio."
],
[
"Usare l’hardware",
"<code>devices</code>, <code>group_add</code>",
"Voci <code>devN</code> con il GID effettivo dell’host e un profilo validato."
],
[
"Collegare le dipendenze",
"<code>networks</code>, <code>depends_on</code>",
"Un bridge di rete privato, indirizzi fissi, ordine di avvio e controlli di stato."
],
[
"Aggiornare",
"Scaricare con <code>pull</code> e ricreare",
"Un nuovo rootfs che mantiene lo stesso contratto di persistenza."
]
]
}
}
]
},
{
"id": "kept",
"title": "Cosa viene conservato e cosa cambia",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Conservato",
"body": "L’immagine ufficiale, i percorsi interni, l’ambiente, il processo di avvio e la documentazione d’uso."
},
{
"icon": "boxes",
"title": "Adattato",
"body": "L’ambiente di esecuzione: rete, persistenza, dispositivi, permessi e dipendenze utilizzano i meccanismi LXC nativi di Proxmox VE."
},
{
"icon": "shield",
"title": "Senza equivalente",
"body": "Un’opzione Compose senza un equivalente sicuro viene segnalata come requisito bloccante. I modelli con requisiti bloccanti non vengono proposti per l’installazione e le opzioni sensibili richiedono conferma durante la procedura."
},
{
"icon": "refresh",
"title": "Registrato",
"body": "Il digest dell’immagine, le risorse, i percorsi, la rete, i dispositivi e l’appartenenza a uno stack vengono salvati nel contratto dell’istanza. Aggiornamenti e ricreazioni riproducono tale contratto."
}
]
}
}
]
},
{
"id": "pages",
"title": "Pagine di questa sezione",
"blocks": [
{
"next": {
"items": [
{
"label": "Come viene adattata un’immagine OCI",
"href": "/docs/oci-manager/architecture",
"tail": "Dall’immagine e dal suo file Compose a un LXC nativo."
},
{
"label": "Installare un’immagine non presente nel catalogo",
"href": "/docs/oci-manager/custom-image",
"tail": "Un file Compose, un comando docker run o un riferimento a un’immagine."
},
{
"label": "Dati, percorsi e rete",
"href": "/docs/oci-manager/storage-network",
"tail": "Volumi del container, directory dell’host, mount con rclone e indirizzi."
},
{
"label": "Dispositivi e accelerazione",
"href": "/docs/oci-manager/hardware",
"tail": "GPU, NVIDIA, Coral, USB e altri dispositivi."
},
{
"label": "Applicazioni con più container",
"href": "/docs/oci-manager/stacks",
"tail": "Applicazione, database e cache in LXC coordinati."
},
{
"label": "Installazione, aggiornamento e modifica",
"href": "/docs/oci-manager/lifecycle",
"tail": "Il contratto dell’istanza e le sue operazioni."
},
{
"label": "In ProxMenux Monitor",
"href": "/docs/oci-manager/monitor",
"tail": "Versioni, aggiornamenti, output della console e terminale."
}
]
}
}
]
}
]
}
@@ -0,0 +1,499 @@
{
"meta": {
"title": "Installare, aggiornare e modificare | ProxMenux",
"description": "Il contratto di istanza di un contenitore OCI e le operazioni che lo utilizzano: aggiornamento, modifica, rimozione, recupero di un'operazione interrotta e recupero dopo un ripristino su questo o un altro host."
},
"header": {
"title": "Installare, aggiornare e modificare",
"description": "Ogni istanza conserva un contratto riproducibile, così il suo rootfs può essere sostituito senza perdere la configurazione o i dati persistenti.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "contract",
"title": "Il contratto di istanza",
"blocks": [
{
"p": "Dopo l'installazione, la configurazione effettiva viene salvata in <code>/usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json</code>. Non è una copia del file Compose originale: è il contratto riproducibile del LXC presente su questo host."
},
{
"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": "Una copia del contratto si trova nel contenitore, in <code>/.proxmenux/oci-record.json</code>, ed è leggibile solo dall'utente root del contenitore. Il backup del contenitore include quindi sempre il contratto in uso in quel momento. Una seconda copia si trova in <code>/etc/pve/priv/proxmenux/oci</code>, condiviso da tutti i nodi del cluster e leggibile solo da root dell'host. Entrambe le copie vengono scritte dopo ogni installazione, aggiornamento e modifica."
}
]
},
{
"id": "manage",
"title": "Gestisci le applicazioni OCI installate",
"intro": "Questa opzione della schermata principale elenca le istanze registrate con la relativa applicazione e immagine. Prima di ogni azione, ciascuna istanza viene confrontata con il proprio contratto; un CT che non corrisponde più al proprio record non viene né modificato né eliminato. Lo stesso aggiornamento e lo stesso editor sono disponibili nella scheda Aggiornamenti di <monitorLink>ProxMenux Monitor</monitorLink>.",
"blocks": [
{
"table": {
"headers": [
"Opzione",
"Che cosa cambia",
"Che cosa viene conservato"
],
"rows": [
[
"Aggiorna l’immagine mantenendo la configurazione salvata",
"Il rootfs viene sostituito dall'immagine attualmente pubblicata dal canale salvato",
"Contratto, dischi container, directory host, rete e dispositivi"
],
[
"Modifica risorse, rete, percorsi e GPU",
"L’editor si apre con il contratto attuale; il CT viene ricreato con le modifiche",
"I dati dei dischi container e delle directory host"
],
[
"Watchdog: riavviare l'applicazione quando si blocca",
"Determina se l'applicazione viene riavviata quando si arresta da sola. Non viene ricreato nulla",
"L'intera installazione; solo la scelta viene salvata nel contratto"
],
[
"Rimuovi: elimina l'applicazione e i suoi container",
"Il LXC, o ogni membro di uno stack, e i loro contratti vengono eliminati",
"Directory dell’host, con il loro contenuto"
]
]
}
},
{
"p": "Per un'applicazione con più contenitori, il menu offre <strong>Aggiorna tutti i contenitori dell'applicazione</strong>, <strong>Modifica percorsi e dispositivi aggiuntivi</strong>, <strong>Ricrea tutti i contenitori con la configurazione salvata</strong>, il watchdog e la rimozione. Modifica aggiunge o rimuove percorsi e dispositivi aggiuntivi del contenitore applicativo senza ricreare nulla e, in Immich, cambia il componente che esegue il riconoscimento. Ricrea ricostruisce ogni contenitore dall'immagine usata per installarlo, senza cercarne una più recente."
},
{
"figure": {
"src": "/oci-manager/manage-menu.png",
"alt": "Elenco delle applicazioni OCI installate e delle opzioni di aggiornamento, modifica e rimozione",
"caption": "Gestione delle applicazioni OCI installate."
}
}
]
},
{
"id": "update",
"title": "Un aggiornamento transazionale",
"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": "Utente",
"registry": "Registro OCI",
"update": "Aggiorna istanza",
"resolve": "Risolvere il tag",
"verify": "Verifica archivio e controlli preliminari",
"backup": "Arresta e salva un backup del CT",
"import": "Importa il nuovo rootfs",
"reapply": "Applicare nuovamente il contratto",
"healthy": "integro",
"failure": "guasto",
"commit": "Contratto pubblicato con il nuovo digest",
"restored": "Precedente istanza ripristinata"
}
}
},
{
"list": {
"items": [
"Se il registro restituisce ancora il digest installato, non viene scaricato nulla e l’istanza rimane invariata.",
"La nuova immagine viene verificata livello per livello prima di arrestare il CT. Un download danneggiato viene ripetuto una seconda volta; un’immagine già nella cache che non supera la verifica viene scaricata di nuovo.",
"Le impostazioni modificate in Proxmox VE dopo l’installazione (memoria, swap, core, limite e priorità della CPU, avvio con il nodo) vengono conservate e incluse nel nuovo contratto.",
"L'interfaccia LAN che la suite Arr e le applicazioni multi-container aggiungono (<code>net1</code>) e l'ordine di avvio (<code>startup</code>) sono restituiti al nuovo contenitore come sono.",
"Qualsiasi altra differenza tra il CT e il suo contratto interrompe l’aggiornamento prima che il CT venga arrestato."
]
}
},
{
"flow": {
"nodes": [
{
"label": "Prima",
"detail": "rootfs A\n/config mp0\ndirectory host /media"
},
{
"label": "Aggiornamento",
"detail": "sostituisce solo\nil rootfs"
},
{
"label": "Dopo",
"detail": "rootfs B\n/config mp0\ndirectory host /media"
}
]
}
},
{
"p": "Prima di arrestare qualsiasi cosa, l’operazione verifica lo spazio necessario al backup: i dati in uso nei volumi inclusi, più un margine. Il backup viene scritto accanto al record dell’applicazione, sul disco di sistema dell’host. Se lo spazio non basta, il menu richiede un altro storage dell’host che supporti i backup: il backup viene creato lì ed eliminato al termine dell’operazione. La scelta viene memorizzata per l’applicazione, anche per gli aggiornamenti pianificati. Se nessuno storage ha spazio sufficiente, l’operazione viene rifiutata e l’applicazione resta invariata. Anche lo spazio per la nuova immagine viene verificato prima del download."
}
]
},
{
"id": "recovery",
"title": "Recuperare un'operazione interrotta",
"intro": "L’aggiornamento e la modifica usano una transazione persistente. Se il processo, il terminale o il nodo subisce un’interruzione dopo l’arresto del CT, l’operazione non viene considerata conclusa.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Indicatore di operazione in sospeso",
"body": "Aprendo Gestisci le applicazioni OCI installate, lo stato salvato indica che la sostituzione non è mai stata pubblicata."
},
{
"title": "Visualizza stato",
"body": "Mostra la fase raggiunta senza cambiare contenitori o dati."
},
{
"title": "Ripristina l’installazione precedente",
"body": "Ripristina il backup nativo verificato eseguito prima della sostituzione e il contratto precedente."
},
{
"title": "Stacks come unità",
"body": "Per un'applicazione multicontainer, ogni membro viene recuperato dallo stesso punto di transazione, non solo quello selezionato."
}
]
}
},
{
"calloutWarning": {
"title": "Le directory dell’host sono escluse dal rollback",
"body": "Il backup comprende il rootfs e i dischi del contenitore inclusi nella copia. Una directory dell’host non viene riportata allo stato precedente, perché altri LXC potrebbero usarne i dati."
}
}
]
},
{
"id": "watchdog",
"title": "Watchdog: riavviare un’applicazione che si arresta",
"intro": "Proxmox non ha una politica di riavvio: quando termina il processo di un contenitore applicativo, il contenitore resta arrestato. Con il watchdog attivo, un’applicazione che si arresta da sola viene riavviata. Per un’applicazione OCI svolge il ruolo di <code>restart: unless-stopped</code> in un file Compose.",
"blocks": [
{
"table": {
"headers": [
"Cosa succede?",
"Con il watchdog attivo"
],
"rows": [
[
"L'applicazione si blocca o il suo processo termina",
"Il contenitore viene riavviato entro pochi secondi"
],
[
"Viene fermato o spento da Proxmox, dal Monitor o con <code>pct</code>",
"Resta arrestato finché qualcuno non lo avvia"
],
[
"Un backup, una migrazione o un'operazione ProxMenux sta lavorando su di esso",
"Niente è fatto fino a che non finisce"
],
[
"Era già arrestato all’avvio dell’host",
"Resta arrestato; lo decide <strong>Avvia con Proxmox</strong>"
],
[
"Continua ad arrestarsi subito dopo l’avvio",
"Per un’applicazione che si arresta pochi secondi dopo l’avvio o che non si avvia, vengono effettuati cinque tentativi, con attese di 30 secondi, 1, 2 e 5 minuti tra un tentativo e l’altro. Poi viene lasciata arrestata e viene inviata una notifica"
]
]
}
},
{
"p": "L’installatore lo chiede in entrambe le modalità e propone il valore dichiarato nella ricetta dell’applicazione. In seguito si può cambiare da <strong>Gestisci le applicazioni OCI installate</strong> o con l’interruttore <strong>Watchdog</strong> del contenitore in <monitorLink>ProxMenux Monitor</monitorLink>; vale per tutti i contenitori di un’applicazione con più contenitori. Un unico servizio dell’host, <code>proxmenux-oci-watchdog.service</code>, sorveglia tutte le applicazioni che lo hanno richiesto; la sua installazione compare nella scheda Modifiche di Audit & Report."
},
{
"calloutInfo": {
"title": "Ciò che l’host non può distinguere",
"body": "Il codice di uscita dell’applicazione non raggiunge l’host: un’uscita regolare e un arresto anomalo risultano quindi indistinguibili e in entrambi i casi l’applicazione viene riavviata, come con <code>always</code> e <code>unless-stopped</code> in Docker. Un arresto richiesto fuori da Proxmox, con <code>lxc-stop</code> o <code>systemctl</code>, non lascia un’attività di arresto e viene interpretato come un arresto spontaneo."
}
}
]
},
{
"id": "restore",
"title": "Backup, ripristino e un altro host",
"intro": "Un backup creato con vzdump o Proxmox Backup Server include il contenitore, i dischi del contenitore selezionati per il backup e la copia del suo contratto. Ciò che l’installazione conserva sull’host non vi è incluso. <strong>Gestisci le applicazioni OCI installate</strong> rileva i contenitori ripristinati su un host privo del loro contratto, dopo una nuova installazione di Proxmox o su un altro host, e propone di registrarli di nuovo.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Ripristinare i contenitori in Proxmox",
"body": "Dall'archivio di backup, con l'ID originale o con uno qualsiasi libero. Un'applicazione multi-container ha bisogno di tutti i suoi contenitori."
},
{
"title": "Apri Gestisci applicazioni OCI installate",
"body": "Vengono elencati i contenitori ripristinati e viene proposto il recupero. Il pulsante <strong>Recupera</strong> nella scheda Aggiornamenti di <monitorLink>ProxMenux Monitor</monitorLink> apre lo stesso recupero."
},
{
"title": "Controllare prima di cambiare",
"body": "Il recupero verifica che l’host disponga di tutto ciò che serve a ciascuna applicazione. Se un’applicazione non può essere recuperata interamente, viene lasciata invariata e viene indicato il motivo."
},
{
"title": "Registra e avvia",
"body": "Il contratto viene registrato su questo host e gli elementi che l’installazione vi conservava vengono riscritti. L’avvio delle applicazioni viene chiesto separatamente: rispondi No se i contenitori originali sono ancora in esecuzione su un altro host."
}
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Finestra di dialogo che elenca i contenitori ripristinati e ne propone il recupero",
"caption": "Il recupero offerto quando si apre Gestione applicazioni OCI installate."
}
},
{
"table": {
"headers": [
"Ciò che l’host conservava",
"Dopo il recupero"
],
"rows": [
[
"Contratto dell’istanza",
"Registrato dalla copia presente nel contenitore, verificata rispetto alla configurazione ripristinata da Proxmox"
],
[
"Rete privata di un'applicazione multicontainer",
"Creato nuovamente con lo stesso ponte e sottorete; gli indirizzi fissi dei contenitori non cambiano"
],
[
"Ordine di avvio di un’applicazione con più contenitori",
"L’hookscript delle dipendenze e il suo contratto vengono reinstallati; gli snippet vengono abilitati nello storage <code>local</code> se nessuno storage li supporta"
],
[
"Sysctl di rete e file del monitor dell’host",
"Scritto di nuovo in <code>/etc/pve/proxmenux</code>"
],
[
"Runtime NVIDIA",
"L’hook di un contenitore non privilegiato viene reinstallato. Un contenitore privilegiato riceve i file del driver di questo host al posto di quelli dell’host di origine"
],
[
"Montaggio Rclone",
"L’hookscript e i programmi che rendono disponibile il mount vengono riscritti, con le stesse viste sull’host"
],
[
"Regola del firewall host di un monitor host",
"Viene chiesto di nuovo, per la sua porta web e la sottorete del bridge su questo host"
],
[
"<code>lost+found</code> di ogni disco restaurato",
"Viene rimosso se vuoto; il ripristino lo crea e alcune applicazioni non si avviano se è presente tra i loro dati"
],
[
"Dischi ripristinati su un altro storage",
"Il contratto viene aggiornato con lo storage su cui si trovano ora"
]
]
}
},
{
"p": "Un container ripristinato con un ID diverso conserva la propria applicazione. Il contratto, il log della console, i parametri sysctl di rete, lo hookscript del montaggio Rclone e l’ordine di avvio di un’applicazione composta da più container vengono registrati usando gli ID assegnati ai container su questo host."
},
{
"table": {
"headers": [
"Cosa ferma un recupero",
"Cosa fare"
],
"rows": [
[
"Manca un contenitore di un'applicazione multi-container",
"Ripristina anche quello; l’applicazione viene recuperata per intero"
],
[
"La sottorete privata è già utilizzata su questo host",
"Il recupero è annullato e nulla è cambiato: gli indirizzi dei contenitori sono fissi e non vengono spostati in un'altra subnet"
],
[
"Una directory host non esiste",
"Montare o crearlo con i suoi dati; un backup del contenitore non include directory host"
],
[
"Un dispositivo non esiste su questo host",
"Collegarlo o rimuoverlo dal contenitore in Proxmox"
],
[
"Un'applicazione con NVIDIA su un host senza driver",
"Installa il driver NVIDIA e il Container Toolkit"
],
[
"Il backup è stato fatto prima che la copia del contratto esistesse",
"Il contenitore rimane come un normale LXC e non viene offerto di nuovo"
]
]
}
},
{
"calloutInfo": {
"title": "Un contenitore che ritorna",
"body": "Un contenitore ripristinato su se stesso da un backup precedente, riportato a uno snapshot o rientrato da un altro nodo porta il contratto dello stato in cui si trova. Se viene selezionato per un’operazione e il suo contratto differisce da quello dell’host, l’operazione non parte e viene proposto il recupero del contenitore."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Risultato del recupero con la rete privata, l’ordine di avvio e i contenitori registrati",
"caption": "Il risultato di un recupero, passo dopo passo."
}
}
]
},
{
"id": "remove",
"title": "Rimozione di un'applicazione OCI",
"blocks": [
{
"p": "Prima della conferma viene creato un riepilogo dalla configurazione effettiva: i contenitori da rimuovere, i dati eliminati insieme a loro, la rete privata liberata e le directory dell’host conservate. La conferma è impostata su <strong>No</strong> per impostazione predefinita, perché i dati dei dischi eliminati non possono essere recuperati in seguito."
},
{
"table": {
"headers": [
"Risorsa",
"Alla rimozione",
"Motivo"
],
"rows": [
[
"rootfs e dischi del contenitore",
"Eliminati",
"Essi appartengono solo al contenitore"
],
[
"Directory host",
"Tenuto, con il suo contenuto",
"Altre applicazioni possono utilizzarlo"
],
[
"File host del contenitore",
"Eliminati",
"Il log della console, i parametri sysctl di rete, l’hookscript del mount Rclone e la registrazione nella scheda App di ProxMenux Monitor non servono ad altri contenitori"
],
[
"File condivisi da più installazioni",
"Eliminato con l'ultima installazione che li utilizza",
"Il file del monitor dell’host e l’hookscript delle dipendenze delle applicazioni con più contenitori"
],
[
"Contratto dell’istanza",
"Eliminato dopo una rimozione di successo",
"Non vi è più associato alcun CT"
],
[
"Ponte privato di una pila",
"Rilasciato con lo stack",
"Non ha più membri da collegare"
],
[
"Rete condivisa dalla suite Arr",
"Rilasciato con l'ultima applicazione della suite",
"Ogni applicazione della suite è indipendente e viene rimossa da sola"
],
[
"Un singolo membro di una pila",
"Non rimosso da solo",
"L'intera applicazione viene rimossa, quindi nessun stack viene lasciato incompleto"
],
[
"Un contenitore su un altro nodo del cluster",
"Non rimosso",
"I suoi file di registrazione e host sono sul nodo dove è stato installato: viene rimosso lì, dopo la migrazione indietro"
]
]
}
},
{
"figure": {
"src": "/oci-manager/remove-summary.png",
"alt": "Riepilogo di rimozione con i container, i dati e le directory host interessate",
"caption": "Il sommario di rimozione, costruito dalla configurazione reale."
}
}
]
},
{
"id": "archives",
"title": "Immagini scaricate e spazio host",
"blocks": [
{
"p": "L’archivio OCI serve a costruire il rootfs; il CT in esecuzione non lo legge. Dopo un’installazione o un aggiornamento, gli archivi scaricati durante l’operazione vengono elencati con le loro dimensioni e ne viene proposta l’eliminazione. Eliminarli libera spazio senza influire sul contenitore o sui suoi dati."
},
{
"calloutInfo": {
"title": "Gli aggiornamenti non hanno bisogno dell'archivio",
"body": "Senza l'archivio, un aggiornamento risolve il canale salvato e scarica il nuovo digest. Con esso, un archivio viene riutilizzato solo quando il suo riferimento e l'integrità corrispondono a ciò che è richiesto."
}
}
]
},
{
"id": "registry",
"title": "Registro e pulizia",
"blocks": [
{
"p": "Aprendo <strong>Gestisci le applicazioni OCI installate</strong>, vengono prima rimossi i resti dei contenitori che non esistono su alcun nodo del cluster: il record conservato come cronologia dopo l’eliminazione dall’interfaccia Proxmox e i file sull’host lasciati da una rimozione. Un record con un’operazione incompleta viene conservato, perché il relativo backup potrebbe ancora servire. Volumi e directory dell’host non vengono mai eliminati per deduzione."
}
]
},
{
"id": "cluster",
"title": "In un cluster: migrazione e elevata disponibilità",
"intro": "Un contenitore OCI è un normale LXC Proxmox: può essere migrato o gestito da HA come gli altri, con gli stessi limiti. Ciò che gli serve per avviarsi viene conservato dove ogni nodo del cluster può trovarlo.",
"blocks": [
{
"table": {
"headers": [
"Parte",
"Su un altro nodo del cluster"
],
"rows": [
[
"Registro della console",
"Il contenitore crea <code>/var/log/proxmenux/oci</code> prima di avviarsi, su qualunque nodo lo esegua. Ogni nodo conserva il log degli avvii eseguiti su quel nodo."
],
[
"Sysctl di rete e monitor dell’host",
"Tenuto in <code>/etc/pve/proxmenux</code>, che ogni nodo del cluster condivide, quindi un contenitore migrato li trova."
],
[
"Dischi del contenitore",
"Proxmox li sposta con il contenitore. HA richiede che i dati siano disponibili sul nodo di destinazione tramite storage condiviso o una configurazione di replica supportata."
],
[
"directory e dispositivi host",
"Valgono le stesse regole degli altri LXC: una directory dell’host deve esistere sul nodo di destinazione ed essere contrassegnata come condivisa, e una GPU, un Coral o una NPU deve essere presente su quel nodo."
],
[
"Record ProxMenux",
"Il contratto resta sul nodo in cui l’applicazione è stata installata e ogni nodo legge la copia conservata in <code>/etc/pve/priv/proxmenux/oci</code>. Dopo la migrazione, un’applicazione con un solo contenitore viene registrata sul nodo di destinazione quando si apre <strong>Gestisci le applicazioni OCI installate</strong> o si avvia un’operazione su di essa. Per un’applicazione con più contenitori viene proposto il recupero, perché la rete privata deve essere creata su quel nodo."
]
]
}
},
{
"calloutWarning": {
"title": "Non per alta disponibilità",
"body": "Un'applicazione multicontainer raggiunge i suoi membri attraverso un ponte privato del nodo su cui è stato installato, quindi i suoi membri rimangono su quel nodo. Un monitor host, come Glances in modalità host o Netdata, monitora il nodo su cui corre; spostandolo monitorerebbe un altro nodo."
}
},
{
"p": "Quando si recupera l’applicazione, un backup ripristinato fuori dal cluster riceve i file di <code>/etc/pve/proxmenux</code> usati dal contenitore."
}
]
},
{
"id": "channel",
"title": "Un rolling tag non è un aggiornamento incustodito",
"blocks": [
{
"p": "Il catalogo installa il rolling tag pubblicato dal manutentore, ma il digest effettivo viene risolto e registrato e cambia solo con un aggiornamento esplicito, dotato di controlli preliminari e rollback. <monitorLink>ProxMenux Monitor</monitorLink> confronta il digest installato con quello pubblicato dal registro e segnala, anche con una notifica, la disponibilità di una nuova immagine."
}
]
}
]
}
@@ -0,0 +1,213 @@
{
"meta": {
"title": "Contenitori OCI in ProxMenux Monitor | ProxMenux",
"description": "Ciò che ProxMenux Monitor mostra per un contenitore installato da OCI manager Apps: versioni di applicazione e immagine, nuove immagini, uscita console e terminale Proxmox VE."
},
"header": {
"title": "In ProxMenux Monitor",
"description": "Un contenitore installato da OCI manager Apps appare in VMs & LXCs come qualsiasi altro LXC. Il suo modal legge il record di installazione: versioni di applicazione e immagine, nuove immagini, uscita console e terminale.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Il record è la fonte",
"body": "OCI manager Apps sa cosa ha installato e da dove viene. Il Monitor legge quel record di installazione invece di interrogare il container, quindi i dati sono gli stessi se il contenitore è in esecuzione o interrotto."
}
},
{
"table": {
"headers": [
"Scheda",
"Quali cambiamenti per un contenitore OCI"
],
"rows": [
[
"Stato",
"Un commutatore <strong>Watchdog</strong> sotto Start al boot: l'applicazione viene riavviata quando si ferma da sola"
],
[
"App",
"L'applicazione è identificata dal record, e gli aggiornamenti sono tracciati dall'immagine"
],
[
"Aggiornamenti",
"L'immagine viene aggiornata o l'applicazione modificata, con lo stesso flusso del menu OCI"
],
[
"Montaggi",
"Dischi del container e directory dell’host, con il relativo utilizzo"
],
[
"Log",
"Solo per contenitori OCI: l'uscita della console dell'applicazione"
]
]
}
}
]
},
{
"id": "app",
"title": "App",
"intro": "La scheda <appLink>App</appLink> offre l'applicazione installata come rilevamento, con il nome, il logo, la porta e lo schema del record. Registrandolo si apre l'editor con il metodo <strong>Immagine OCI (installata da ProxMenux)</strong>, che non ha bisogno di configurazione.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "boxes",
"title": "Applicazione",
"body": "La versione dell'applicazione all'interno dell'immagine, letta dall'immagine stessa: il suo ambiente o la sua etichetta <code>org.opencontainers.image.version</code>. È informativo."
},
{
"icon": "archive",
"title": "Immagine",
"body": "La data di creazione e digest dell'immagine installata. L'aggiornamento si decide qui: il digest installato viene confrontato con quello che il registro pubblica oggi per lo stesso tag."
}
]
}
},
{
"list": {
"items": [
"Quando il registro pubblica un nuovo digest, la scheda mostra <strong>Nuova immagine</strong> con la sua data e digest, anche se la versione dell'applicazione al suo interno non è cambiata: una ricostruzione su una base aggiornata è un aggiornamento.",
"Quando i digest coincidono, la scheda mostra <strong>Versione</strong>.",
"La scheda si collega al repository dell'immagine: il suo progetto GitHub, o la sua pagina Hub Docker per un'immagine ufficiale.",
"Il collegamento di accesso utilizza l'indirizzo LAN del contenitore, anche per il membro principale di un'applicazione multi-container, che ha un secondo indirizzo sulla sua rete privata.",
"Il pulsante <strong>Aggiorna dati</strong> rilegge il record dell’installazione e il registro delle immagini. Non vengono proposte opzioni per cercare o registrare altre applicazioni: il container contiene esattamente l’applicazione descritta nel suo record."
]
}
},
{
"figure": {
"src": "/oci-manager/monitor-app-tab.png",
"alt": "Scheda App di un contenitore OCI con la versione dell'applicazione, l'immagine e il link del repository",
"caption": "Scheda app di un contenitore installato da OCI manager Apps."
}
},
{
"p": "Il controllo viene eseguito una volta al giorno con i controlli di aggiornamento del Monitor e <strong>Aggiorna dati</strong> lo esegue subito. Una nuova immagine viene inviata come notifica attraverso i canali configurati in <notificationsLink>Notifiche</notificationsLink>. L'aggiornamento viene applicato dalla scheda Aggiornamenti."
}
]
},
{
"id": "updates",
"title": "Aggiornamenti",
"intro": "Per un contenitore installato da OCI manager Apps la scheda Aggiornamenti mostra l'applicazione con la sua immagine installata e, quando il registro pubblica una, la nuova immagine, nello stesso formato di qualsiasi altra applicazione. Gli strumenti di aggiornamento di pacchetti e applicazioni di un normale LXC non appaiono.",
"blocks": [
{
"table": {
"headers": [
"Pulsante",
"Che cosa si apre"
],
"rows": [
[
"Aggiornamento",
"L’aggiornamento di <lifecycleLink>Gestisci applicazioni OCI installate</lifecycleLink> per questo container, nel terminale di Monitor. Può essere eseguito anche senza una nuova immagine; in quel caso non cambia nulla. In un’applicazione composta da più container aggiorna tutti i membri."
],
[
"Modifica",
"L'editor dell'applicazione (risorse, rete, percorsi e GPU). In un'applicazione multi-container aggiunge o rimuove i percorsi e i dispositivi aggiuntivi del contenitore di applicazione e, in Immich, cambia ciò che esegue il riconoscimento."
],
[
"Recupera",
"Sostituisce l'aggiornamento quando un'operazione sul contenitore è stata interrotta e apre il suo recupero."
],
[
"Recupera (container ripristinato)",
"Mostrato per un container ripristinato da un backup che non ha un contratto su questo host, sotto <strong>Applicazione OCI ripristinata</strong>. Apre il <lifecycleLink>recupero</lifecycleLink> nel terminale di Monitor; Aggiorna e Modifica compaiono dopo la registrazione."
]
]
}
},
{
"p": "Modifiche esterne, directory dell’host e applicazioni composte da più container vengono gestite come nel menu OCI. Per queste applicazioni, pulsanti e opzioni compaiono solo nel container principale. Gli altri membri mostrano la propria immagine, una nota che rimanda al principale per gli aggiornamenti e un pulsante per aprirlo. Alla chiusura del terminale vengono riletti l’immagine, il record e i montaggi."
},
{
"table": {
"headers": [
"Opzione",
"Comportamento"
],
"rows": [
[
"Conserva il backup eseguito prima dell'aggiornamento",
"Ogni aggiornamento esegue il backup del container per ripristinarlo se l'aggiornamento non riesce. Con questa opzione, lo stesso backup viene mantenuto nello storage scelto e compare tra i backup del CT; su Proxmox Backup Server viene scritto un backup prima dell'aggiornamento."
],
[
"Aggiornamenti pianificati",
"L’immagine viene aggiornata all’ora scelta solo se il registro ne pubblica una nuova, con la possibilità di attendere che abbia 1, 3, 7 o 14 giorni. Un container modificato al di fuori di ProxMenux viene saltato e segnalato."
]
]
}
}
]
},
{
"id": "logs",
"title": "Log",
"intro": "La scheda Logs appare solo per i contenitori installati da OCI manager Apps, tra Mounts e Backups. Mostra l'uscita standard e l'errore del processo principale dell'immagine, la stessa uscita mostra <code>docker logs</code> per un contenitore Docker.",
"blocks": [
{
"list": {
"items": [
"L'output viene mantenuto sull'host in <code>/var/log/proxmenux/oci/VMID.console.log</code> (mode 0600), dal primo avvio e attraverso riavviamenti, in modo da poter essere letto con il contenitore fermato.",
"Il file viene ruotato a 10 MB, mantenendo tre copie compresse (<code>/etc/logrotate.d/proxmenux-oci</code>).",
"Ogni avvio del contenitore è contrassegnato nell'uscita. La scheda mostra l'output dall'ultimo avvio per impostazione predefinita; <strong>Cronologia completa</strong> mostra anche quelli precedenti.",
"Quando l'applicazione viene rimossa, la sua uscita viene rimossa con essa.",
"Vengono mostrate le ultime 100, 500 o 1000 righe. Mentre il container è in esecuzione, le nuove righe sono seguite in tempo reale; scorrere verso l’alto mette in pausa il seguito e <strong>Segui</strong> lo riprende.",
"Un filtro mostra solo le linee che contengono un testo e <strong>Scarica</strong> salva le linee caricate.",
"I codici a colori sono rimossi e una linea che una barra di avanzamento ridisegna è mostrata nel suo stato finale.",
"La scheda legge il file a ogni apertura; non usa una copia in cache."
]
}
},
{
"calloutInfo": {
"title": "credenziali di primo avviamento",
"body": "Le immagini che stampano una password generata sul loro primo inizio lo lasciano in questa uscita, come fa <code>docker logs</code>. L'installatore lo legge da lì per mostrarlo nel suo riassunto."
}
},
{
"figure": {
"src": "/oci-manager/monitor-logs-tab.png",
"alt": "Scheda di log con l'uscita della console di un contenitore OCI, il selettore della linea, il filtro e il pulsante seguente",
"caption": "Uscita console di un contenitore OCI."
}
}
]
},
{
"id": "terminal",
"title": "Console Proxmox VE",
"blocks": [
{
"p": "Un'immagine OCI esegue il proprio processo come PID 1 e nessun servizio di login, quindi la console predefinita di un LXC aprirebbe un terminale in cui nulla risponde. I contenitori installati da OCI manager Apps sono creati con <code>cmode: shell</code>: la console Proxmox VE apre una shell con <code>lxc-attach</code>, l'equivalente di <code>docker exec</code>, con l'applicazione in esecuzione intatta."
},
{
"list": {
"items": [
"La shell è quella assegnata a root nell’immagine da <code>/etc/passwd</code>. Se root non ha una shell o l’immagine non ne include alcuna, viene mantenuta la console predefinita.",
"La shell viene eseguita come root all'interno del contenitore, senza una password. Chi può aprirlo è deciso dal permesso <code>VM.Console</code> di Proxmox VE.",
"Il terminale del Monitor entra nel contenitore con <code>pct enter</code>, che funziona allo stesso modo."
]
}
}
]
},
{
"id": "mounts",
"title": "Montaggi",
"blocks": [
{
"p": "La scheda <mountsLink>Mounts</mountsLink> elenca i dischi container e le directory host del contenitore. L'uso di un disco contenitore su blocco di archiviazione come LVM-thin è letto dal filesystem del disco, che è montato solo all'interno del contenitore."
}
]
}
]
}
@@ -0,0 +1,404 @@
{
"meta": {
"title": "Applicazioni multicontainer | ProxMenux",
"description": "Come OCI manager Apps trasforma un'applicazione con il suo database e la cache in LXCs nativi coordinati: piano, rete privata, gancio di dipendenza, convalida e aggiornamenti transazionali."
},
"header": {
"title": "Applicazioni con più container",
"description": "Un'applicazione con il suo database, la cache e altri servizi diventa diversi LXC nativi coordinati, installati e aggiornati come uno.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Un'applicazione per l'utente, diversi LXC per Proxmox VE",
"body": "Una definizione multi-container è una voce del catalogo. L'installatore crea un LXC nativo per servizio e mantiene esplicite le proprie dipendenze. Immich, Nextcloud, Paperless-ngx e Tandoor sono installati in questo modo."
}
},
{
"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": "Piano di stack",
"app": "Applicazione LXC",
"appNet": "LAN + privato",
"db": "PostgreSQL LXC",
"cache": "Valkey LXC",
"private": "privato"
}
}
}
]
},
{
"id": "plan",
"title": "1. Il piano, prima che esista un contenitore",
"blocks": [
{
"p": "Nessun LXC viene creato mentre la definizione Compose viene interpretata. Un piano completo arriva prima, con ogni membro, immagine, VMID, rete, percorso, segreto, ordine e controllo sanitario. Se il piano non è coerente, l'installazione non inizia."
},
{
"table": {
"headers": [
"Elemento di piano",
"Contenuto",
"Controllato prima di creare qualcosa"
],
"rows": [
[
"Membri",
"Applicazione principale, database, cache, machine learning e altre dipendenze",
"VMID unici, ruoli noti e esattamente un membro principale"
],
[
"Immagini",
"Riferimento rolling, architettura e digest risolto di ogni servizio",
"Tutte esistono, supportano l’architettura e superano il controllo di integrità OCI"
],
[
"Rete",
"Ponte privato, subnet, indirizzo fisso per servizio e accesso LAN per il membro principale",
"Nessuna collisione con ponti o sottorete esistenti e nessun indirizzo ripetuto"
],
[
"Persistenza",
"Dischi dei container, directory dell’host, proprietari e backup",
"Nessun percorso sovrapposto, deposito disponibile e permessi dichiarati"
],
[
"Segreti",
"password del database, chiavi dell'applicazione e credenziali iniziali",
"Generati una volta e forniti solo ai membri che li usano"
],
[
"Ciclo di vita",
"Ordine di inizio, ordine di arresto e un controllo sanitario per membro",
"L'applicazione principale inizia l'ultima e si ferma prima"
]
]
}
}
]
},
{
"id": "create",
"title": "2. Creazione, membro per membro",
"blocks": [
{
"steps": {
"items": [
{
"title": "Prenota ogni VMID",
"body": "L'inventario Proxmox VE e il registro delle istanze sono controllati. Un CT esistente non è adottato e un contratto che appartiene ancora ad un'altra istanza non viene riutilizzato."
},
{
"title": "Preparare ogni immagine",
"body": "Tutte le immagini vengono risolte, scaricate e verificate prima che venga creato il primo contenitore."
},
{
"title": "Creare ogni rootfs",
"body": "I metadati OCI ufficiali sono importati, e l'identità di istanza ProxMenux e il ruolo membro sono aggiunti."
},
{
"title": "Rete privata",
"body": "Viene creato un ponte e una subnet e ogni membro riceve il suo indirizzo fisso; solo il membro principale riceve anche l'interfaccia LAN."
},
{
"title": "Persistenza",
"body": "Ogni database e configurazione ottiene il proprio disco contenitore; solo i dati destinati ad essere condivisi utilizzano directory host."
},
{
"title": "Ambiente",
"body": "Vengono scritti endpoint interni, segreti condivisi e variabili di servizio. L'applicazione raggiunge le sue dipendenze nei loro indirizzi privati riservati."
},
{
"title": "Registrazione",
"body": "Ogni membro registra la sua configurazione nativa, le modifiche rootfs che gli aggiornamenti devono riprodurre e la sua relazione con lo stack."
}
]
}
}
]
},
{
"id": "checks",
"title": "3. Avviare e controllare ogni contenitore",
"intro": "Un LXC creato non significa un servizio pronto. Le dipendenze iniziano in ordine e ognuno passa un controllo specifico al suo servizio.",
"blocks": [
{
"table": {
"headers": [
"Servizio",
"Controllo",
"Cosa mostra"
],
"rows": [
[
"PostgreSQL",
"<code>pg_isready</code> nel CT con l'host previsto, l'utente e il database",
"Il server accetta le connessioni per il database configurato"
],
[
"Redis / Valkey",
"<code>redis-cli</code> o <code>valkey-cli</code> <code>PING</code> contro il suo indirizzo privato",
"Il broker ascolta e risponde"
],
[
"Machine learning Immich",
"HTTP <code>GET /ping</code>, oltre a un controllo del runtime GPU selezionato",
"Il servizio risponde e l’accelerazione richiesta non è passata alla CPU"
],
[
"Nextcloud",
"<code>GET /status.php</code> con <code>installed=true</code>, <code>maintenance=false</code> e <code>needsDbUpgrade=false</code>",
"Inizializzazione terminata senza migrazione in sospeso"
],
[
"Paperless-ngx / Tandoor",
"HTTP sull'indirizzo LAN e vera porta del servizio",
"Il frontend e le sue dipendenze servono l'applicazione"
],
[
"Applicazione principale",
"Il punto finale del suo modello, ad esempio <code>/api/server/ping</code> in Immich",
"L'intero stack funziona attraverso l'applicazione che utilizza le dipendenze"
]
]
}
},
{
"calloutWarning": {
"title": "In esecuzione non significa funzionante",
"body": "Lo stato in esecuzione dice solo che esiste il processo LXC. Se il servizio offre un controllo migliore, viene utilizzato un controllo exec o HTTP con un timeout. Se un membro si ferma o non supera la verifica, lo stack non viene dichiarato installato."
}
}
]
},
{
"id": "hook",
"title": "4. Il gancio di dipendenza",
"blocks": [
{
"p": "Il gancio è impostato solo sul contenitore principale di uno stack dipendente. Proxmox VE mantiene lo script come snippet e lo gestisce come <code>hookscript</code> di quel CT. La ricetta dello stack non è scritta nello script: vive in un contratto privato separato."
},
{
"codeGrid": {
"items": [
{
"title": "Configurazione principale CT",
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
},
{
"title": "Contratto privato (esempio)",
"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": "Fonte completa di proxmenux-stack-dependencies.sh",
"pathCode": "local:snippets/proxmenux-stack-dependencies.sh",
"snippetCode": "stackDependencyHook"
}
},
{
"p": "Lo script è lo stesso per ogni stack. VMID, nomi, tipi di controllo e timeout provengono dal contratto privato <code>/etc/pve/priv/proxmenux-stack-VMID.json</code> di ogni stack."
},
{
"steps": {
"items": [
{
"title": "Proxmox VE chiama pre-start",
"body": "Prima dell'avvio principale di CT, il gancio viene eseguito con il VMID e la fase del ciclo di vita."
},
{
"title": "Un blocco per stack",
"body": "<code>flock</code> su <code>/run/lock/proxmenux-stack-VMID.lock</code> previene due sequenze di avvio contemporaneamente."
},
{
"title": "Il contratto viene letto e convalidato",
"body": "Uno schema noto, dipendenze numeriche, etichette, un exec, http o controllo in esecuzione e un timeout positivo sono necessari."
},
{
"title": "Dipendenze in ordine",
"body": "Ogni CT deve esistere; se è fermo viene avviato, se è già in esecuzione non viene riavviato."
},
{
"title": "Attendi che il servizio sia pronto",
"body": "Il controllo viene eseguito ogni due secondi, e il CT è confermato anche di essere ancora in esecuzione."
},
{
"title": "Il principale CT inizia",
"body": "Quando ogni dipendenza è pronta, pre-start termina e Proxmox VE avvia l'applicazione."
}
]
}
},
{
"calloutInfo": {
"title": "Il gancio non ferma le dipendenze",
"body": "Le fasi post-start, pre-stop e post-stop non fanno nulla. Arrestare il CT principale lascia in esecuzione PostgreSQL, Redis, Valkey o il machine learning. L’hook ordina l’avvio; non trasforma diversi LXC in un unico processo."
}
},
{
"table": {
"headers": [
"Tipo",
"Esempio",
"Avvii successivi"
],
"rows": [
[
"stack dipendente",
"Immich, Nextcloud, applicazione con PostgreSQL",
"L’hook del CT principale avvia le dipendenze e attende che siano pronte."
],
[
"Suite di applicazione",
"Suite Arr",
"Nessun membro principale: ogni LXC segue il proprio <code>onboot</code>"
],
[
"Applicazione singola",
"Jellyfin",
"Proxmox VE avvia direttamente LXC"
]
]
}
}
]
},
{
"id": "stack-checks",
"title": "5. Controlla sullo stack nel suo complesso",
"blocks": [
{
"list": {
"items": [
"Ogni VMID esiste, è unico e mantiene l'identità di istanza prevista.",
"Ogni contratto appartiene allo stesso stack, mantiene il suo ruolo e la sua configurazione nativa registrata.",
"Il membro principale è l’ultimo in <code>start_order</code> e il primo in <code>stop_order</code>.",
"Nessun membro, volume o adattamento rootfs manca.",
"Il gancio punta al snippet ufficiale, il suo contenuto è invariato e il suo contratto corrisponde alla ricetta stack.",
"Le immagini e i digest osservati corrispondono agli archivi OCI preparati.",
"Dispositivi, profili GPU, montaggi, segreti ed endpoint corrispondono ancora ai contratti.",
"Quando tutte le dipendenze superano i controlli, l’endpoint dell’applicazione principale verifica l’integrazione fra i membri."
]
}
}
]
},
{
"id": "manage",
"title": "Gestione di uno stack installato",
"intro": "In <strong>Gestisci applicazioni OCI installate</strong>, qualsiasi membro porta all’intero stack. Il menu offre <strong>Aggiorna tutti i container dell’applicazione</strong>, <strong>Modifica percorsi e dispositivi aggiuntivi</strong>, <strong>Ricrea tutti i container con la configurazione salvata</strong> e <strong>Rimuovi: elimina l’applicazione e i suoi container</strong>. Ricrea ricostruisce ogni container dall’immagine originale tramite il digest salvato, senza cercarne una più recente, seguendo gli stessi passaggi di un aggiornamento. È disponibile per gli stack aggiornabili.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Qualsiasi membro",
"body": "Il contratto dei membri nomina il VMID principale e l'elenco completo dei membri."
},
{
"title": "Lo stack è riproducibile",
"body": "Identità, contratti, gancio, adattamenti e una ripetizione coordinata per quella ricetta sono convalidati."
},
{
"title": "Immagini prima",
"body": "L'applicazione non viene fermata fino a quando ogni digest è stato risolto, scaricato e verificato."
},
{
"title": "Arresta i componenti e crea un backup dell'insieme",
"body": "I backup nativi verificati sono presi con lo stack fermato, quindi l'applicazione e i database appartengono allo stesso momento."
},
{
"title": "Aggiornare e controllare ogni membro",
"body": "Adattamento, rete, montaggi, segreti e dispositivi vengono applicati nuovamente prima del controllo di integrità di ciascun membro."
},
{
"title": "Pubblica o recupera tutto",
"body": "I nuovi contratti sono pubblicati solo quando ogni membro passa. Se uno fallisce, ogni membro viene ripristinato."
}
]
}
},
{
"table": {
"headers": [
"Modifica",
"Quali cambiamenti",
"Cosa viene conservato"
],
"rows": [
[
"Percorsi e dispositivi aggiuntivi",
"Vengono aggiunti o rimossi dal contenitore di applicazione, che si riavvia. Nulla è ricostruito",
"I dati dell'applicazione, il suo database e gli altri contenitori"
],
[
"Che cosa esegue il riconoscimento (Immich)",
"Il contenitore di apprendimento automatico prende l'immagine e i dispositivi del CPU o di un GPU dell'host. L'intera applicazione viene interrotta e aggiornata, come in un aggiornamento",
"La cache del modello, la libreria e il database. Se qualcosa fallisce, i contenitori precedenti e la scelta precedente vengono ripristinati"
]
]
}
},
{
"calloutWarning": {
"title": "Una pila senza un replay coordinato non è aggiornata",
"body": "Se la preparazione di uno stack non può essere riprodotta, l'aggiornamento viene rifiutato prima che lo stack venga interrotto. L'applicazione continua a funzionare come è."
}
}
]
},
{
"id": "failure",
"title": "6. Quando qualcosa fallisce",
"blocks": [
{
"p": "Durante un'installazione, un errore si ferma e rimuove i contenitori incompleti che l'operazione ha creato, e il ponte privato se l'operazione l'ha creata. Una pila non viene pubblicata come valida fino al termine dell'intera sequenza."
},
{
"p": "Un aggiornamento è transazionale: tutte le immagini sono preparate prima, poi lo stack si ferma, viene eseguito e verificato il backup di ogni membro, e solo allora è sostituito ogni rootfs. I membri iniziano uno per uno con il loro controllo sanitario; se uno fallisce, ogni membro viene ripristinato dalla stessa serie di backup, quindi il database e l'applicazione non appartengono mai a momenti diversi."
},
{
"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": "Preparare ogni immagine",
"stop": "Stop, primo membro principale",
"backup": "Backup verificato di ogni CT",
"replace": "Sostituisci il rootfs",
"healthy": "Tutti funzionanti?",
"yes": "Sì",
"no": "No",
"commit": "Pubblica i contratti",
"rollback": "Ripristinare ogni membro"
}
}
}
]
},
{
"id": "not-assumed",
"title": "Che cosa uno stack non include",
"blocks": [
{
"list": {
"items": [
"Una suite installata in un unico flusso, come la suite Arr, non è uno stack dipendente: i suoi contenitori non hanno ordine di partenza tra di loro.",
"La rete privata non sostituisce l'autenticazione, TLS o la configurazione di ogni applicazione.",
"Il backup di un LXC non contiene il ponte, il gancio o i contratti del resto dello stack.",
"Prowlarr, Sonarr o Radarr non ricevono indici, profili o fornitori da ProxMenux."
]
}
}
]
}
]
}
@@ -0,0 +1,305 @@
{
"meta": {
"title": "Dati, percorsi e rete | ProxMenux",
"description": "Come OCI manager Apps conserva i dati di un container OCI: dischi del container, directory dell’host, mount con rclone, indirizzi e reti private."
},
"header": {
"title": "Dati, percorsi e rete",
"description": "Cosa risiede nel rootfs, cosa viene conservato quando lo si sostituisce, come si condividono i dati tra container e come ciascuno ottiene il proprio indirizzo.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "La persistenza si decide prima di creare l’LXC",
"body": "I volumi dichiarati dall’immagine e dal suo file Compose vengono letti prima di creare il container. Ogni percorso da conservare dopo un aggiornamento diventa un punto di mount indipendente dal rootfs. In questo modo, il rootfs contiene solo ciò che appartiene all’immagine e può essere sostituito."
}
}
]
},
{
"id": "questions",
"title": "Cosa chiede l’installer",
"intro": "Il modello fornisce i percorsi necessari all’applicazione. Ciascuno viene collocato su un disco del container o in una directory dell’host; prima del riepilogo si possono aggiungere altri percorsi.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Percorsi necessari",
"body": "Vengono elencati <code>/config</code>, <code>/data</code>, librerie, download e tutti i volumi dichiarati dall’applicazione."
},
{
"title": "Posizione",
"body": "Ogni percorso viene collocato su un disco del container o in una directory già esistente sull’host."
},
{
"title": "Storage e dimensione",
"body": "Viene creato un disco del container su uno storage Proxmox VE con la dimensione indicata. L’installazione predefinita usa <code>local-lvm</code>; quella avanzata chiede lo storage di ogni percorso subito prima della dimensione e propone quello del rootfs. Il disco appare come <code>vm-VMID-disk-N</code> e viene collegato come <code>mpN</code>."
},
{
"title": "Directory dell’host",
"body": "La directory dell’host viene indicata tramite il suo percorso. Se non esiste, viene creata e assegnata all’utente dell’host a cui viene mappato quello del container."
},
{
"title": "Percorsi aggiuntivi",
"body": "Prima dell’installazione si possono aggiungere altre coppie formate da un percorso o volume dell’host e dal relativo percorso nel container."
},
{
"title": "Riepilogo",
"body": "La mappatura completa viene mostrata prima della creazione del CT e salvata nel contratto dell’istanza."
}
]
}
}
]
},
{
"id": "options",
"title": "Le due posizioni persistenti",
"blocks": [
{
"table": {
"headers": [
"Proprietà",
"Disco del container",
"Directory dell’host"
],
"rows": [
[
"Nella configurazione",
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
],
[
"Backup del container (vzdump)",
"Incluso con <code>backup=1</code>",
"Non incluso"
],
[
"Dimensione",
"Fissa; si aumenta ridimensionando il punto di mount",
"Lo spazio libero del filesystem o del dataset dell’host"
],
[
"Altri container",
"Montato solo dal container a cui appartiene",
"La stessa directory può essere montata in più container"
],
[
"Snapshot e ripristino",
"Gestiti da Proxmox VE insieme al CT",
"Gestiti sullo storage dell’host"
],
[
"Rimozione dell’applicazione",
"Eliminato con il container",
"Conservato con il suo contenuto"
],
[
"Spostamento del CT su un altro nodo",
"Si sposta con il CT",
"Lo stesso percorso deve esistere sull’altro nodo"
]
]
}
},
{
"p": "Il rootfs è riservato ai binari e al contenuto dell’immagine. Un aggiornamento o una ricreazione lo sostituisce senza toccare nessuno dei due tipi di punto di mount."
}
]
},
{
"id": "example",
"title": "Esempio: un container con entrambe le posizioni",
"blocks": [
{
"code": {
"title": "Jellyfin installato come CT 151 su local-lvm (estratto)",
"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": "Un aggiornamento o una ricreazione sostituisce solo il rootfs: <code>mp0</code> conserva utenti, librerie e impostazioni, mentre <code>mp1</code> continua a mostrare gli stessi contenuti multimediali. Il ripristino del backup del CT recupera <code>/config</code>; se necessario, la directory dei contenuti multimediali viene ripristinata dal backup dello storage dell’host."
},
{
"flow": {
"nodes": [
{
"label": "Contratto",
"detail": "/config"
},
{
"label": "Posizione",
"detail": "Disco del container\no directory dell’host"
},
{
"label": "LXC",
"detail": "Sempre /config\nper l’applicazione"
}
],
"caption": "L’applicazione vede il percorso dichiarato dall’immagine; cambia solo dove viene memorizzato."
}
}
]
},
{
"id": "shared",
"title": "Una directory dell’host, più container",
"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": "Directory dell’host",
"config": "Configurazione propria"
}
}
},
{
"p": "Ogni container conserva la propria configurazione sul suo disco. La libreria o i download si trovano in un’unica directory dell’host, montata nello stesso percorso interno in tutti i container. Così il percorso in cui scrive un’applicazione è lo stesso da cui legge un’altra."
}
]
},
{
"id": "rclone",
"title": "Storage cloud tramite l’applicazione rclone",
"intro": "Oltre all’installazione, la scheda di rclone nel catalogo offre <strong>Abilita un mount in un container OCI rclone esistente</strong>. Viene montato un remote già creato e autorizzato nell’interfaccia web di rclone, che viene poi reso disponibile sull’host. Gli altri container possono usarlo come una directory dell’host.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Container e remote",
"body": "Il VMID del container rclone, il nome esatto del remote e, facoltativamente, un percorso al suo interno."
},
{
"title": "Nome del mount e cache",
"body": "Il nome del mount e la modalità della cache VFS: <code>off</code>, <code>minimal</code>, <code>writes</code> o <code>full</code> (predefinita)."
},
{
"title": "Viste pubblicate",
"body": "Una radice comune, <code>/mnt/oci-shared</code> per impostazione predefinita, contiene una vista in lettura e scrittura in <code>/mnt/oci-shared/remotes/NAME</code> e una in sola lettura in <code>/mnt/oci-shared/remotes-ro/NAME</code>."
},
{
"title": "Attivazione",
"body": "Dopo la conferma, il CT viene arrestato, vengono configurati il suo comando di avvio e un hookscript di Proxmox VE, quindi viene riavviato. L’operazione attende che entrambe le viste siano montate sull’host."
}
]
}
},
{
"calloutInfo": {
"title": "Se il mount non viene attivato",
"body": "Viene ripristinata la configurazione precedente del container, che viene quindi riavviato. In questo modo, se l’attivazione fallisce, rclone resta com’era."
}
}
]
},
{
"id": "network",
"title": "Indirizzi e reti",
"intro": "Un’applicazione con un solo container ha bisogno di un indirizzo. Un’applicazione con più container richiede anche una rete stabile tra i suoi componenti.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "network",
"title": "Applicazione con un solo container",
"body": "Si sceglie il bridge di rete e si imposta DHCP oppure un indirizzo fisso in formato CIDR. L’LXC ha un proprio indirizzo e il riepilogo mostra gli URL completi dei servizi."
},
{
"icon": "waypoints",
"title": "Applicazione con più container",
"body": "Viene individuata una sottorete libera e creato un bridge privato persistente. Ogni componente — applicazione, database e cache — riceve un indirizzo fisso su quella rete."
}
]
}
},
{
"flow": {
"nodes": [
{
"label": "LAN",
"detail": "Indirizzo raggiungibile\nsolo per il servizio principale"
},
{
"label": "LXC principale",
"detail": "Web / API\nLAN + rete privata"
},
{
"label": "Rete privata",
"detail": "PostgreSQL · Valkey · ML\nindirizzi fissi"
}
],
"caption": "Le dipendenze comunicano sulla rete privata e non hanno un indirizzo sulla LAN."
}
},
{
"p": "Il contratto dello stack conserva bridge, sottorete, indirizzi e relazioni tra i servizi. L’aggiornamento dell’applicazione riutilizza la stessa topologia per tutti i componenti. ProxMenux Monitor apre il container principale al suo indirizzo LAN, non a quello della rete privata."
}
]
},
{
"id": "ownership",
"title": "Proprietà di file e directory",
"blocks": [
{
"list": {
"items": [
"Le nuove directory vengono create con UID e GID a cui viene mappato l’LXC non privilegiato.",
"Il proprietario delle directory esistenti non viene modificato ricorsivamente.",
"Socket, file di sistema e percorsi sensibili non vengono proposti come directory generiche dell’host."
]
}
}
]
},
{
"id": "backup",
"title": "Cosa contiene un backup del container",
"blocks": [
{
"table": {
"headers": [
"Elemento",
"Nel backup vzdump del CT",
"Dove viene conservato"
],
"rows": [
[
"Rootfs OCI",
"Sì",
"Nel backup del CT; può anche essere ricreato dall’immagine e dal contratto"
],
[
"Disco del container con <code>backup=1</code>",
"Sì",
"Il backup del CT"
],
[
"Directory dell’host",
"No",
"Il backup dello storage dell’host"
],
[
"Contratto dell’istanza",
"Sì, la copia conservata nel CT",
"<code>/.proxmenux/oci-record.json</code> nel CT; le copie aggiuntive dell’host e del cluster sono conservate separatamente"
],
[
"Applicazione con più container",
"Ogni componente nel proprio backup",
"I backup di tutti i componenti, più il contratto dello stack e il suo bridge di rete sull’host"
]
]
}
}
]
}
]
}
@@ -0,0 +1,171 @@
{
"meta": {
"title": "Como é adaptada uma imagem OCI | ProxMenux",
"description": "Do repositório da imagem e do respetivo ficheiro Compose a um modelo que pode ser revisto, um plano de implementação e um LXC nativo do Proxmox VE, sem Docker no seu interior."
},
"header": {
"title": "Como é adaptada uma imagem OCI",
"description": "Do repositório da imagem e do respetivo ficheiro Compose a um modelo que pode ser revisto, um plano de implementação e um LXC nativo, sem instalar Docker no seu interior.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "pipeline",
"title": "O processo de adaptação",
"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": "Repositório da imagem",
"converter": "Conversor",
"template": "Modelo JSON",
"blockers": "Sem impedimentos?",
"no": "Não",
"yes": "Sim",
"review": "Revisão / overlay",
"plan": "Plano de implementação",
"lxc": "LXC nativo"
}
}
},
{
"p": "O conversor lê a imagem e o ficheiro Compose publicados pelo projeto e gera um modelo JSON. Se houver requisitos ainda não adaptados que impeçam a instalação, o modelo é revisto antes de ser publicado no catálogo. Um ficheiro de ajustes revistos, chamado overlay, resolve esses impedimentos. Só os modelos sem impedimentos pendentes são propostos para instalação."
}
]
},
{
"id": "template",
"title": "O que o modelo preserva",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Identidade da imagem",
"body": "Repositório, tag de atualização contínua, arquitetura, digest resolvido e revisão de origem."
},
{
"icon": "braces",
"title": "Contrato do contentor",
"body": "Entrypoint, Cmd, ambiente, utilizador, diretório de trabalho, sinal de paragem, portas e volumes."
},
{
"icon": "layers",
"title": "Adaptação ao Proxmox VE",
"body": "Recursos, segurança, pontos de montagem, dispositivos, sysctls, verificações de estado e as adaptações necessárias em cada caso, com a respetiva justificação."
},
{
"icon": "shield",
"title": "Compatibilidade",
"body": "Chaves suportadas, requisitos por adaptar que impedem a instalação e estado de cada validação."
}
]
}
}
]
},
{
"id": "sources",
"title": "O OCI fornece o processo; o Compose fornece o ambiente",
"blocks": [
{
"table": {
"headers": [
"Origem",
"Exemplo",
"Resultado nativo"
],
"rows": [
[
"Metadados OCI",
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
"O Proxmox VE importa-os ao criar o CT"
],
[
"Docker Compose",
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
"Entradas de ambiente LXC, <code>mpN</code> e <code>devN</code>"
],
[
"Perfil do ProxMenux",
"GPU, verificação de estado, credenciais",
"Perguntas e adaptações revistas"
],
[
"Utilizador",
"VMID, armazenamento, rede",
"O contrato da instância"
]
]
}
}
]
},
{
"id": "install",
"title": "O que acontece durante a instalação",
"blocks": [
{
"steps": {
"items": [
{
"title": "Resolver a referência",
"body": "O registo é consultado, a arquitetura do host é selecionada e é fixado o digest exato para o qual aponta a tag de atualização contínua."
},
{
"title": "Descarregar e verificar",
"body": "O Skopeo descarrega a imagem como um arquivo OCI. Antes de criar qualquer recurso, cada camada é verificada através do respetivo digest e descomprimida. Se a descarga estiver danificada, é repetida uma vez antes de a instalação ser interrompida."
},
{
"title": "Criar o sistema de ficheiros",
"body": "O <code>pct create</code> cria o rootfs a partir do arquivo e preserva os metadados oficiais do processo da imagem."
},
{
"title": "Ligar os recursos",
"body": "São aplicados os volumes, a rede, o ambiente, os dispositivos e os perfis de segurança declarados."
},
{
"title": "Consola",
"body": "A saída da consola do contentor é guardada no host. A consola do Proxmox VE abre uma shell se a imagem incluir uma."
},
{
"title": "Verificar",
"body": "No primeiro arranque, aguarda-se que o contentor tenha um endereço e que o serviço responda. Em caso de falha, a instalação não é apresentada como concluída com sucesso."
},
{
"title": "Registar a configuração",
"body": "A configuração efetiva é guardada no contrato da instância utilizado nas atualizações e recriações."
}
]
}
}
]
},
{
"id": "example",
"title": "Exemplo: uma imagem com /config e /downloads",
"intro": "Uma definição Compose habitual e a configuração do Proxmox VE que dela resulta. Os caminhos esperados pela aplicação não mudam.",
"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 (excerto)",
"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": "O <code>mp0</code> é um segundo disco pertencente ao contentor, com o nome <code>vm-VMID-disk-N</code> no armazenamento selecionado. É montado em <code>/config</code> e, com <code>backup=1</code>, incluído na cópia de segurança do contentor. O <code>mp1</code> não cria um disco: monta o diretório do host <code>/srv/downloads</code> em <code>/downloads</code> dentro do LXC. A porta 8080 não é mapeada: o LXC tem um endereço próprio e o serviço responde nesse endereço."
}
]
}
]
}
@@ -0,0 +1,278 @@
{
"meta": {
"title": "Instalar uma imagem fora do catálogo | ProxMenux",
"description": "Adapte uma imagem OCI a partir de um ficheiro Compose, de um URL, de um comando docker run ou de uma referência de imagem e reveja o que o ProxMenux consegue reproduzir antes de a instalar."
},
"header": {
"title": "Instalar uma imagem fora do catálogo",
"description": "A sua imagem é adaptada a partir do ficheiro Compose, de um comando docker run ou apenas da referência. O resultado é apresentado para revisão antes de criar qualquer LXC.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "O mesmo conversor e o mesmo instalador",
"body": "A opção <strong>Instalar uma imagem fora do catálogo</strong> utiliza o mesmo conversor e instalador dos modelos do catálogo. A diferença é que o contrato é gerado nesse momento a partir da definição fornecida e validado antes de criar qualquer LXC."
}
}
]
},
{
"id": "sources",
"title": "Como é descrita a imagem",
"intro": "O primeiro ecrã pergunta como é descrita a imagem. Quatro opções recebem uma definição a adaptar, uma quinta utiliza apenas o nome da imagem e outras três leem um oci-compose já escrito.",
"blocks": [
{
"table": {
"headers": [
"Opção",
"O que é lido"
],
"rows": [
[
"Colar o ficheiro Compose no terminal",
"Cole o conteúdo YAML no terminal e termine com Ctrl+D."
],
[
"Ler o ficheiro Compose deste host",
"Um caminho no nó, <code>/root/docker-compose.yml</code> por predefinição. O ficheiro tem de existir e não ultrapassar 256 KiB."
],
[
"Descarregar o ficheiro Compose de um endereço",
"Um endereço <code>http://</code> ou <code>https://</code> que disponibilize o YAML em bruto. São descarregados no máximo 256 KiB."
],
[
"Colar o comando docker run no terminal",
"O comando publicado pelo projeto. São adaptadas as portas, o ambiente, os volumes, os dispositivos, as capabilities, o utilizador, a memória partilhada e as restantes opções suportadas."
],
[
"Apenas a referência da imagem, sem ficheiro Compose",
"Uma referência como <code>ghcr.io/user/application:latest</code>. O registo é consultado e os metadados OCI da imagem são preservados."
],
[
"Colar um oci-compose no terminal",
"Cole o JSON no terminal e termine com Ctrl+D. Não é convertido: é validado e instalado tal como está escrito."
],
[
"Ler um oci-compose deste host",
"Um ficheiro JSON no nó, <code>/root/oci-compose.json</code> por predefinição, com um máximo de 2 MiB."
],
[
"Descarregar um oci-compose de um endereço",
"Um endereço <code>http://</code> ou <code>https://</code> que disponibilize o ficheiro JSON. São descarregados no máximo 2 MiB."
]
]
}
},
{
"figure": {
"src": "/oci-manager/custom-source-menu.png",
"alt": "Menu para escolher como descrever uma imagem fora do catálogo",
"caption": "Formas de descrever uma imagem fora do catálogo."
}
}
]
},
{
"id": "reference-only",
"title": "O que fornece apenas a referência da imagem",
"intro": "A imagem contém os metadados do seu processo, mas não todo o ambiente que um ficheiro Compose costuma acrescentar.",
"blocks": [
{
"table": {
"headers": [
"Lido da imagem",
"Ausente da imagem",
"Consequência"
],
"rows": [
[
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> e o ambiente incorporado",
"Variáveis presentes apenas na documentação",
"São acrescentadas na instalação ou em Modificar"
],
[
"Volumes declarados pela imagem",
"Diretórios do host indicados apenas no ficheiro Compose",
"Os caminhos adicionais são acrescentados antes da instalação"
],
[
"Portas <code>EXPOSE</code>",
"O URL, o protocolo ou a verificação funcional do serviço",
"São confirmados a porta e o método de verificação do serviço"
],
[
"Arquiteturas e digest no registo",
"Dispositivos, privilégios ou dependências externas",
"Não são ativados sem uma definição que os solicite"
]
]
}
}
]
},
{
"id": "review",
"title": "Rever antes de instalar",
"intro": "Após adaptar a definição, o ProxMenux apresenta como a interpretou antes de perguntar o VMID, os recursos ou o armazenamento.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Analisar",
"body": "São lidos os serviços, a imagem, as portas, os caminhos, o ambiente, os dispositivos, a segurança e a verificação de estado."
},
{
"title": "Consultar o registo",
"body": "A imagem tem de existir no registo e são apresentadas as arquiteturas publicadas. Um registo privado é consultado com a conta guardada para ele."
},
{
"title": "Listar o que não é aplicado",
"body": "São listados os labels, as redes Docker, as definições Swarm e outras chaves sem efeito num LXC."
},
{
"title": "Bloquear opções sem equivalente seguro",
"body": "As chaves sem equivalente seguro aparecem em <strong>Opções sem equivalente</strong> e impedem a continuação da instalação. Nenhuma é descartada sem aviso."
},
{
"title": "Pedir segredos",
"body": "As variáveis cujo nome indica uma palavra-passe, token ou chave são pedidas como dados sensíveis durante a instalação."
}
]
}
},
{
"figure": {
"src": "/oci-manager/custom-review.png",
"alt": "Resumo da interpretação do ficheiro Compose pelo ProxMenux",
"caption": "Resumo apresentado antes de o instalador perguntar o VMID e os recursos."
}
},
{
"p": "Após aceitar o resumo, segue-se o mesmo assistente do catálogo: nome, modo predefinido ou avançado, VMID, CPU, memória, rede, arranque com o nó, caminhos persistentes e adicionais, dispositivos compatíveis e resumo final."
}
]
},
{
"id": "examples",
"title": "Exemplos de entrada",
"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": "Um oci-compose escrito à mão",
"intro": "Um oci-compose é o ficheiro JSON a partir do qual se instala uma aplicação. O catálogo guarda um por aplicação. O mesmo formato pode ser escrito à mão e instalado com esta opção.",
"blocks": [
{
"p": "Num ficheiro escrito à mão, o autor define a imagem, as portas, as variáveis, os volumes e as perguntas da instalação. O ProxMenux completa o resto ao ler o ficheiro. O formato permite expressar o que o Compose não prevê: o texto de uma pergunta, uma palavra-passe gerada durante a instalação, um perfil de GPU, o proprietário de cada volume, a verificação do primeiro arranque ou as credenciais apresentadas no fim."
},
{
"steps": {
"items": [
{
"title": "Verificar",
"body": "Os ficheiros com erros não são instalados. Cada erro indica o campo afetado; se o JSON for inválido, são indicadas a linha e a coluna."
},
{
"title": "Rever",
"body": "Um ficheiro válido apresenta o que instala: imagem, endereço web, portas, caminhos persistentes, variáveis pedidas pelo instalador e ficheiros que serão escritos."
},
{
"title": "Instalar",
"body": "A instalação segue o mesmo processo das aplicações do catálogo, com definições predefinidas ou avançadas."
}
]
}
},
{
"calloutWarning": {
"title": "Um ficheiro que define os privilégios",
"body": "Um oci-compose determina o que é montado no contentor e com que privilégios. A revisão mostra-o antes da instalação: instale apenas ficheiros de fontes de confiança."
}
},
{
"p": "O <readmeLink>README do motor OCI</readmeLink> descreve o formato bloco a bloco, com dois exemplos completos. O registo de uma instalação também pode ser lido desta forma: apenas é utilizado o modelo original, sem nenhuma das respostas dessa instalação."
}
]
},
{
"id": "private-registries",
"title": "Imagens em registos privados",
"intro": "Uma imagem num registo privado, como um pacote privado do GitHub ou um repositório privado do Docker Hub, é consultada com uma conta guardada no ProxMenux.",
"blocks": [
{
"steps": {
"items": [
{
"title": "O registo recusa o acesso à imagem",
"body": "Quando o registo indica que a imagem requer uma conta, a revisão propõe iniciar sessão nesse registo e consulta novamente a imagem."
},
{
"title": "Iniciar sessão",
"body": "Um utilizador e uma palavra-passe ou token com permissão para descarregar a imagem. O registo verifica-os e só são guardados se forem aceites."
},
{
"title": "Instalar e manter atualizado",
"body": "A conta é utilizada para descarregar a imagem na instalação e também nas atualizações, em Modificar, Recriar, no watchdog e na verificação de atualizações do Monitor, em qualquer nó do cluster."
}
]
}
},
{
"p": "<strong>Contas de registos</strong>, no menu principal do OCI manager Apps, apresenta as contas guardadas por registo e utilizador, nunca os seus segredos. Cada conta permite verificar, descarregar ou instalar uma imagem, atualizar as credenciais ou removê-las."
},
{
"list": {
"items": [
"GitHub (<code>ghcr.io</code>): o utilizador é a conta GitHub e a palavra-passe é um token de acesso pessoal com a permissão <code>read:packages</code>.",
"Docker Hub (<code>docker.io</code>): o utilizador é a conta Docker Hub e a palavra-passe é um token de acesso com permissão de leitura.",
"Outros registos, incluindo os que usam uma porta própria como <code>registry.example.com:5000</code>: o utilizador e a palavra-passe ou token fornecidos por esse registo."
]
}
},
{
"calloutInfo": {
"title": "Onde são guardadas as contas",
"body": "Em <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, legível apenas por root, na mesma pasta onde o Proxmox guarda as palavras-passe de armazenamento. <code>/etc/pve</code> é partilhado por todos os nós do cluster, pelo que uma conta adicionada num nó é utilizada em todos. A cópia do host inclui o ficheiro e a desinstalação do ProxMenux remove-o de todos os nós."
}
}
]
},
{
"id": "limits",
"title": "Definições que não são instaladas",
"blocks": [
{
"list": {
"items": [
"Um Dockerfile sem imagem publicada: primeiro é necessário construir a imagem e publicá-la num registo OCI.",
"Um ficheiro Compose com vários serviços: é bloqueado porque esta opção instala um único serviço por contentor, mesmo que vários serviços utilizem a mesma imagem.",
"<code>configs</code>, segredos externos ou formatos de dispositivo que não possam ser adaptados sem ambiguidade.",
"Substituições de shell como <code>$(command)</code>: é necessário escrever diretamente o valor resultante.",
"Opções <code>docker run</code> não reconhecidas e <code>--env-file</code>: utilize antes um ficheiro Compose com valores explícitos."
]
}
}
]
}
]
}
@@ -0,0 +1,392 @@
{
"meta": {
"title": "Dispositivos e aceleração ProxMenux",
"description": "Como o OCI Manager Apps passa GPU, NVIDIA, Coral, USB, FUSE e outros dispositivos para um recipiente OCI como recursos Proxmox VE nativos validados."
},
"header": {
"title": "Dispositivos e aceleração",
"description": "GPU, NVIDIA, Coral, USB, FUSE e dispositivos de bloco tornam-se os recursos de Proxmox VE nativos validados do recipiente.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "principle",
"title": "O dispositivo de que a aplicação necessita, não a máquina inteira",
"blocks": [
{
"p": "Um dispositivo solicitado pelo arquivo Compose ou pelo perfil da aplicação torna-se uma entrada de <code>devN</code> ou uma montagem LXC. Pedir um GPU, um dispositivo USB ou um Coral não torna o recipiente privilegiado."
},
{
"flow": {
"nodes": [
{
"label": "Inventário da máquina",
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
},
{
"label": "ProxMenux",
"detail": "fornecedor e\npermissões verificadas"
},
{
"label": "LXC",
"detail": "mesmo dispositivo\nGID efetivo"
}
]
}
}
]
},
{
"id": "origin",
"title": "De onde vem o pedido do dispositivo",
"blocks": [
{
"table": {
"headers": [
"Origem",
"O que é lido",
"O que o instalador faz"
],
"rows": [
[
"Docker Compose",
"Pedidos de <code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> e NVIDIA",
"Cada requisito torna-se um pedido de dispositivo mostrado para revisão"
],
[
"Perfil do catálogo",
"O suporte que o aplicativo realmente tem para GPU, Coral, OpenCL, USB ou FUSE",
"Apenas são oferecidas as opções validadas para essa imagem"
],
[
"Metadados e documentação da imagem",
"VA-API, Selkies, LinuxServer mods ou o tempo de execução NVIDIA",
"As variáveis documentadas e preparação são adicionadas"
],
[
"Seleção do usuário",
"Apenas CPU, Intel/AMD, OpenCL, NVIDIA ou um dispositivo opcional",
"A seleção é armazenada no contrato de instância"
]
]
}
},
{
"calloutWarning": {
"title": "Os dispositivos detectados não são anexados automaticamente",
"body": "O host é inventariado, mas apenas dispositivos declarados pelo arquivo Compose ou por um perfil compatível são oferecidos e anexados. Um GPU, dongle USB ou Coral presente no host não é exposto a cada LXC."
}
}
]
},
{
"id": "identify",
"title": "Como o dispositivo da máquina é identificado",
"intro": "Antes de o LXC ser modificado, o dispositivo é lido no host e corresponde ao perfil escolhido.",
"blocks": [
{
"table": {
"headers": [
"Tipo",
"Identidade",
"Validação"
],
"rows": [
[
"Intel/AMD DRM",
"<code>/dev/dri/renderD*</code> e <code>/sys/class/drm/NODE/device/vendor</code>",
"Um dispositivo de caracteres com o fornecedor <code>0x8086</code> (Intel) ou <code>0x1002</code> (AMD)"
],
[
"AMD OpenCL",
"O nó de renderização, mais <code>/dev/kfd</code> quando o perfil precisa dele",
"Existência, tipo, fornecedor, permissões e compatibilidade declarada"
],
[
"AMD ROCm",
"O nó de renderização, <code>/dev/kfd</code> e a geração que o controlador de computação relata em <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>",
"Uma geração para a qual a imagem ROCm do aplicativo inclui kernels de computação — as GPUs RDNA2 citadas e as mais recentes — é oferecida sem adaptação. As outras GPUs dessas famílias, como Radeon 680M e 780M, são oferecidas como experimentais e nunca são a opção sugerida: o ROCm não as suporta oficialmente, o aplicativo as apresenta como a geração de sua família (<code>HSA_OVERRIDE_GFX_VERSION</code>) e o instalador pede confirmação antes de baixar a imagem maior. Uma GPU mais antiga, como a integrada de um Ryzen 5000U, não é oferecida e o Immich mantém o reconhecimento na CPU."
],
[
"NVIDIA",
"<code>nvidia-smi</code> e <code>nvidia-container-cli</code>",
"GPU, UUID, PCI bus, versão driver, Toolkit, <code>/dev/nvidia*</code> nós, binários e bibliotecas"
],
[
"Coral PCIe/M.2",
"<code>/dev/apex_N</code> e sua ligação em <code>/sys/dev/char/MAJOR:MINOR</code>",
"Nó de caracteres, major/menor, proprietário, GID e permissões"
],
[
"USB e serial",
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> ou <code>/dev/bus/usb/BBB/DDD</code>",
"Nó de caracteres; para USB também fornecedor, produto e série quando sysfs publica-los"
],
[
"KVM, TUN, FUSE, vídeo e SCSI genérico",
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> ou <code>/dev/sgN</code>",
"Caminho suportado, tipo de nó e permissões efetivas"
],
[
"Unidade óptica",
"<code>/dev/srN</code>",
"Um dispositivo de bloco"
]
]
}
}
]
},
{
"id": "install",
"title": "O que acontece durante a instalação",
"blocks": [
{
"steps": {
"items": [
{
"title": "O modelo oferece seus perfis",
"body": "Por exemplo, CPU apenas, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL ou NVIDIA. As opções pertencem à imagem, não a um menu comum."
},
{
"title": "Um perfil é escolhido",
"body": "Ele define os nós do dispositivo, ambiente, mods ou tempo de execução que a aplicação precisa."
},
{
"title": "É proposto um caminho",
"body": "Para DRM, <code>/dev/dri/renderD128</code>, que pode ser alterado em um host com vários nós de renderização. Para USB ou serial, o nó específico é selecionado."
},
{
"title": "Validação",
"body": "Existência, tipo, fornecedor permitido, permissões e GID são verificados. Um desencontro impede a operação."
},
{
"title": "O contrato está escrito",
"body": "Caminho, modo, GID, acesso de escrita e perfil são gravados para atualizações e recriações."
},
{
"title": "Anexar e testar",
"body": "<code>pct set</code> adiciona a entrada <code>devN</code> e o acesso é então verificado dentro do LXC. As imagens LinuxServer também são verificadas como usuário <code>abc</code>."
}
]
}
}
]
},
{
"id": "config",
"title": "Como aparece na configuração LXC",
"intro": "Valores ilustrativos: <code>dev0</code> e <code>dev1</code> são as atribuições de slots livres Proxmox VE, e <code>renderD128</code>, <code>apex_0</code> e o GID dependem do hardware do nó.",
"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": "Um dispositivo USB específico",
"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": "O GID é lido com <code>stat</code> no host e escrito na entrada <code>devN</code>; os grupos <code>render</code> e <code>video</code> não são assumidos como tendo um número fixo. O dispositivo mantém o mesmo caminho <code>/dev</code> dentro do LXC, onde os próprios mecanismos da aplicação procuram por ele."
}
]
},
{
"id": "profiles",
"title": "Perfis que uma imagem pode oferecer",
"blocks": [
{
"table": {
"headers": [
"Perfil",
"Configuração resultante",
"Oferecido quando"
],
"rows": [
[
"Intel/AMD VA-API",
"Nó de renderização <code>/dev/dri</code>",
"O aplicativo suporta aceleração de vídeo"
],
[
"OpenCL",
"Nó de renderização, <code>/dev/kfd</code> quando necessário e o mod oficial",
"A imagem ou perfil documenta- a"
],
[
"NVIDIA",
"Dispositivos de driver e bibliotecas da máquina",
"O host tem um driver funcionando e o NVIDIA Container Toolkit"
],
[
"Coral",
"<code>/dev/apex_0</code> ou o barramento USB",
"O perfil declara suporte ao Coral (Frigate)"
],
[
"USB, série, FUSE",
"Um único dispositivo, uma árvore validada ou uma funcionalidade LXC",
"O contrato pede-o."
]
]
}
}
]
},
{
"id": "nvidia",
"title": "NVIDIA",
"blocks": [
{
"calloutWarning": {
"title": "Requisito do nó: NVIDIA Container Toolkit",
"body": "Um driver funcional em Proxmox VE não é suficiente para dar um NVIDIA GPU a uma imagem OCI. O OCI Manager Apps usa <code>nvidia-container-cli</code>, do NVIDIA Container Toolkit, para identificar os dispositivos e obter os binários e bibliotecas que correspondem ao driver carregado."
}
},
{
"p": "O <nvidiaLink>ProxMenux NVIDIA instalador</nvidiaLink> instala o NVIDIA Container Toolkit do repositório oficial NVIDIA juntamente com o driver. Ele verifica seus quatro pacotes, valida o <code>nvidia-container-cli</code> e registra o resultado na registro de alterações do <auditLink>Audit & Report</auditLink>."
},
{
"p": "Estes dois comandos na máquina mostram se o driver e o Toolkit estão disponíveis:"
},
{
"shell": {
"code": "nvidia-smi -L\nnvidia-container-cli --version"
}
},
{
"p": "Em uma máquina onde o driver foi instalado por outros meios, o Toolkit é instalado a partir do repositório estável oficial:"
},
{
"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": "O inventário que o OCI manager Apps usa é a saída de:"
},
{
"shell": {
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
}
},
{
"calloutInfo": {
"title": "A configuração do tempo de execução do Docker não está envolvida",
"body": "Os contêineres são LXC nativos e não usam daemon Docker, portanto <code>nvidia-ctk runtime configure --runtime=docker</code> não faz parte do processo: o ProxMenux consulta <code>nvidia-container-cli</code> diretamente e configura os dispositivos e montagens LXC. Os comandos e as plataformas suportadas são mantidos no <toolkitLink>guia de instalação do NVIDIA Container Toolkit</toolkitLink>."
}
},
{
"cards": {
"items": [
{
"icon": "cpu",
"title": "Inventário do driver",
"body": "<code>nvidia-container-cli</code> lista os nós do dispositivo, binários, firmware e bibliotecas do driver instalado."
},
{
"icon": "refresh",
"title": "Nenhuma versão fixa",
"body": "O modelo não nomeia arquivos de bibliotecas. O perfil é gerado a partir da máquina atual."
},
{
"icon": "shield",
"title": "Montagens somente de leitura",
"body": "As bibliotecas host são montadas somente para leitura em vez de serem copiadas para o recipiente."
},
{
"icon": "hardDrive",
"title": "Alterações do driver",
"body": "Após uma mudança de driver, o inventário é gerado novamente antes do início dos LXCs afetados."
}
]
}
},
{
"code": {
"title": "Resultado NVIDIA (simplificado)",
"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": "Passar apenas <code>/dev/nvidia0</code> não é suficiente. Os componentes de espaço de usuário do driver carregado são montados somente de leitura, e <code>nvidia-smi</code> então é executado dentro do LXC para comparar GPU, UUID, PCI bus e versão com o inventário host."
}
]
},
{
"id": "usb",
"title": "Coral USB, serial e USB",
"blocks": [
{
"calloutWarning": {
"title": "Numeração USB pode mudar",
"body": "Um caminho como o <code>/dev/bus/usb/003/004</code> pode mudar quando o dispositivo é reconectado ou a máquina reinicia. O perfil registra fornecedor, produto e série quando estão disponíveis, mas um novo endereço de barramento não é remapeado automaticamente."
}
},
{
"p": "Um periférico é dado pelo seu nó específico: <code>/dev/ttyUSB0</code>, <code>/dev/ttyACM0</code>, <code>/dev/apex_0</code> ou <code>/dev/bus/usb/BBB/DDD</code>. Não é aceite passar todo o <code>/dev</code>. O Coral é oferecido apenas para aplicações cujo perfil o declara."
}
]
},
{
"id": "trees",
"title": "Árvores de dispositivos e recursos LXC",
"blocks": [
{
"table": {
"headers": [
"Pedido",
"Configuração resultante",
"Escopo"
],
"rows": [
[
"<code>/dev/dvb</code>, <code>/dev/snd</code> ou <code>/dev/bus/usb</code>",
"Cada nó de caracteres da árvore recebe sua própria entrada <code>devN</code> com o modo host e GID",
"Apenas a árvore solicitada, e não o resto do <code>/dev</code>"
],
[
"<code>/dev/fuse</code>",
"O nó e, quando o perfil precisa dele, o recurso <code>fuse=1</code>",
"O FUSE sozinho não publica montagens para outros LXCs"
],
[
"<code>/dev/net/tun</code>",
"Uma entrada <code>devN</code> no mesmo caminho dentro do LXC",
"A configuração VPN ou rede permanece na aplicação"
],
[
"<code>/dev/kvm</code>",
"Uma entrada <code>devN</code> validada",
"Oferecido apenas quando o contrato o solicitar"
]
]
}
}
]
},
{
"id": "security",
"title": "Confirmações por nível de risco",
"blocks": [
{
"p": "Dispositivos específicos, privilégio opcional, privilégio exigido, relaxamento AppArmor ou seccomp e acesso ao espaço de nomes PID do hospedeiro são tratados como casos separados, não sob uma etiqueta genérica privilegiada. Cada opção com risco é explicada e confirmada durante a instalação."
}
]
}
]
}
+213
View File
@@ -0,0 +1,213 @@
{
"meta": {
"title": "OCI manager Apps | ProxMenux",
"description": "Execute imagens OCI oficiais como contentores LXC nativos do Proxmox VE, com dados persistentes, acesso a dispositivos, aplicações com vários contentores e atualizações transacionais."
},
"header": {
"title": "OCI manager Apps",
"description": "As imagens OCI oficiais são executadas como contentores LXC nativos do Proxmox VE. A imagem continua a ser a publicada pelo respetivo responsável; o ProxMenux reproduz o ambiente que o Docker Compose teria criado à sua volta.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "model",
"blocks": [
{
"calloutInfo": {
"title": "Uma imagem OCI, um LXC nativo",
"body": "O Docker Engine não é executado dentro dos contentores. O Proxmox VE importa o sistema de ficheiros da imagem e os seus metadados OCI. A aplicação passa a ser o processo principal de um LXC nativo, gerido com as mesmas ferramentas dos restantes contentores do nó."
}
},
{
"flow": {
"nodes": [
{
"label": "Origem",
"detail": "Imagem OCI\nCompose e documentação"
},
{
"label": "ProxMenux",
"detail": "Contrato JSON\nvalidação e planeamento"
},
{
"label": "Proxmox VE",
"detail": "LXC nativo\nvolumes e dispositivos"
}
],
"caption": "É utilizada a aplicação original; o seu ambiente é descrito de forma declarativa e reproduzido."
}
}
]
},
{
"id": "where",
"title": "Onde encontrar",
"intro": "No nó Proxmox, como root, abra <strong>OCI manager Apps (Technology Preview)</strong> no menu principal do ProxMenux. O primeiro ecrã apresenta:",
"blocks": [
{
"list": {
"items": [
"<strong>Pesquisar aplicações</strong>: pesquisar por nome em todo o catálogo.",
"<strong>Todas as aplicações</strong>: apresentar o catálogo completo e o número de aplicações.",
"<strong>Gerir aplicações OCI instaladas</strong>: atualizar, modificar, remover ou recuperar as aplicações já instaladas.",
"<strong>Contas de registos</strong>: gerir as contas utilizadas para instalar e atualizar imagens de registos privados.",
"<strong>Instalar uma imagem fora do catálogo</strong>: adaptar um ficheiro Compose, um comando <code>docker run</code> ou uma referência de imagem.",
"As categorias do catálogo, cada uma com o respetivo número de aplicações."
]
}
},
{
"figure": {
"src": "/oci-manager/main-menu.png",
"alt": "Ecrã principal do OCI manager Apps com pesquisa, catálogo completo, gestão de aplicações, imagens fora do catálogo e categorias.",
"caption": "Ecrã principal do OCI manager Apps."
}
},
{
"p": "Ao selecionar uma aplicação, são apresentadas a descrição, a imagem utilizada e duas opções de instalação. <strong>Instalar com as definições predefinidas</strong> pergunta apenas o essencial: armazenamento, localização dos dados, endereço e arranque. <strong>Instalar com as definições avançadas</strong> percorre todas as decisões por ordem: VMID e recursos, armazenamento de cada caminho, bridge de rede e dispositivos."
},
{
"p": "As aplicações efetivamente testadas apresentam <strong>Verificado</strong> nesta vista e um ✓ nas listas, quer o teste tenha sido realizado no laboratório do ProxMenux quer pela comunidade."
}
]
},
{
"id": "beta",
"title": "Por que mantém a designação Technology Preview",
"blocks": [
{
"p": "O OCI manager Apps mantém a designação <strong>Technology Preview</strong> que o Proxmox VE atribui aos contentores de aplicações criados a partir de imagens OCI, cujo suporte foi introduzido no Proxmox VE 9.1. A designação refere-se à tecnologia em que o OCI manager Apps se baseia, não ao motor do ProxMenux: o comportamento destes contentores ainda pode mudar entre versões do Proxmox VE. Será mantida até que o Proxmox VE considere esse suporte estável."
},
{
"p": "O motor do OCI manager Apps é testado no laboratório do ProxMenux: instalação, atualização, modificação, recriação, cópia de segurança, restauro, migração e watchdog. Cada aplicação é verificada separadamente. As que foram efetivamente testadas apresentam <strong>Verificado</strong> e um ✓ nas listas."
}
]
},
{
"id": "translation",
"title": "Como o Docker descreve os requisitos e como o OCI manager Apps os concretiza",
"blocks": [
{
"table": {
"headers": [
"Requisito",
"Como é expresso no Docker",
"Como é concretizado pelo OCI manager Apps"
],
"rows": [
[
"Executar a aplicação",
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
"O rootfs OCI e o processo principal do LXC"
],
[
"Preservar a configuração",
"<code>volumes: /config</code>",
"Um volume persistente <code>mpN</code> incluído na cópia de segurança ou um diretório do host."
],
[
"Disponibilizar o serviço",
"<code>ports</code>",
"Um endereço próprio para o LXC e o URL de acesso ao serviço."
],
[
"Utilizar hardware",
"<code>devices</code>, <code>group_add</code>",
"Entradas <code>devN</code> com o GID efetivo do host e um perfil validado."
],
[
"Ligar as dependências",
"<code>networks</code>, <code>depends_on</code>",
"Uma bridge de rede privada, endereços fixos, ordem de arranque e verificações de estado."
],
[
"Atualizar",
"Descarregar com <code>pull</code> e recriar",
"Um novo rootfs com o mesmo contrato de persistência."
]
]
}
}
]
},
{
"id": "kept",
"title": "O que é preservado e o que muda",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Preservado",
"body": "A imagem oficial, os caminhos internos, o ambiente, o processo de arranque e a documentação de utilização."
},
{
"icon": "boxes",
"title": "Adaptado",
"body": "O ambiente de execução: rede, persistência, dispositivos, permissões e dependências utilizam os mecanismos LXC nativos do Proxmox VE."
},
{
"icon": "shield",
"title": "Sem equivalente",
"body": "Uma opção Compose sem equivalente seguro é identificada como impedimento à instalação. Os modelos com impedimentos não são propostos para instalação e as opções sensíveis exigem confirmação durante o assistente."
},
{
"icon": "refresh",
"title": "Registado",
"body": "O digest da imagem, os recursos, os caminhos, a rede, os dispositivos e a pertença a uma stack são guardados no contrato da instância. As atualizações e recriações reproduzem esse contrato."
}
]
}
}
]
},
{
"id": "pages",
"title": "Páginas desta secção",
"blocks": [
{
"next": {
"items": [
{
"label": "Como é adaptada uma imagem OCI",
"href": "/docs/oci-manager/architecture",
"tail": "Da imagem e do respetivo ficheiro Compose a um LXC nativo."
},
{
"label": "Instalar uma imagem fora do catálogo",
"href": "/docs/oci-manager/custom-image",
"tail": "Um ficheiro Compose, um comando docker run ou uma referência de imagem."
},
{
"label": "Dados, caminhos e rede",
"href": "/docs/oci-manager/storage-network",
"tail": "Volumes do contentor, diretórios do host, montagens com rclone e endereços."
},
{
"label": "Dispositivos e aceleração",
"href": "/docs/oci-manager/hardware",
"tail": "GPU, NVIDIA, Coral, USB e outros dispositivos."
},
{
"label": "Aplicações com vários contentores",
"href": "/docs/oci-manager/stacks",
"tail": "Aplicação, base de dados e cache em LXC coordenados."
},
{
"label": "Instalar, atualizar e modificar",
"href": "/docs/oci-manager/lifecycle",
"tail": "O contrato da instância e as respetivas operações."
},
{
"label": "No ProxMenux Monitor",
"href": "/docs/oci-manager/monitor",
"tail": "Versões, atualizações, saída da consola e terminal."
}
]
}
}
]
}
]
}
@@ -0,0 +1,499 @@
{
"meta": {
"title": "Instalar, atualizar e modificar | ProxMenux",
"description": "O contrato de instância de um contentor OCI e as operações que o utilizam: atualização, modificação, remoção, recuperação de uma operação interrompida e recuperação após um restauro neste ou noutro host."
},
"header": {
"title": "Instalar, atualizar e modificar",
"description": "Cada instância mantém um contrato reprodutível, permitindo substituir o seu rootfs sem perder a configuração ou os dados persistentes.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "contract",
"title": "O contrato de instância",
"blocks": [
{
"p": "Após a instalação, a configuração efetiva é guardada em <code>/usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json</code>. Não é uma cópia do ficheiro Compose original: é o contrato reprodutível do LXC existente neste host."
},
{
"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": "Uma cópia do contrato fica dentro do contentor, em <code>/.proxmenux/oci-record.json</code>, e só pode ser lida pelo utilizador root do contentor. Assim, uma cópia de segurança do contentor inclui sempre o contrato que estava em vigor nesse momento. Uma segunda cópia é mantida em <code>/etc/pve/priv/proxmenux/oci</code>, partilhado por todos os nós do cluster e legível apenas por root do host. Ambas são escritas após cada instalação, atualização e alteração."
}
]
},
{
"id": "manage",
"title": "Gerenciar aplicativos OCI instalados",
"intro": "Esta opção da tela principal lista as instâncias registradas com sua aplicação e imagem. Cada um é verificado em relação ao seu contrato antes de qualquer ação; um CT que já não corresponde ao seu registro não é modificado nem excluído. A mesma atualização e o mesmo editor são oferecidos na aba Atualizações do <monitorLink>ProxMenux Monitor</monitorLink>.",
"blocks": [
{
"table": {
"headers": [
"Opção",
"O que muda",
"O que é guardado"
],
"rows": [
[
"Atualizar a imagem com a configuração salva",
"O rootfs é substituído pela imagem que o canal salvo publica hoje",
"Contrato, discos de contêiner, diretórios de host, rede e dispositivos"
],
[
"Modificar: editar recursos, rede, caminhos e GPU",
"O editor abre com o contrato atual; o CT é reconstruído com as alterações",
"Os dados dos discos de contentores e pastas da máquina"
],
[
"Watchdog: reinicie o aplicativo quando ele falhar",
"Se o aplicativo é iniciado novamente quando ele pára por conta própria. Nada é reconstruído.",
"Toda a instalação; somente a escolha é salva no contrato"
],
[
"Remover: eliminar a aplicação e os seus contentores",
"O LXC, ou cada membro de uma pilha, e seus contratos são excluídos",
"Directórios da máquina, com o seu conteúdo"
]
]
}
},
{
"p": "Para uma aplicação com vários contentores, o menu oferece <strong>Atualizar todos os contentores da aplicação</strong>, <strong>Modificar caminhos e dispositivos adicionais</strong>, <strong>Recriar todos os contentores com a configuração guardada</strong>, o watchdog e a remoção. Modificar adiciona ou remove caminhos e dispositivos adicionais do contentor da aplicação sem recriar nada e, no Immich, altera o componente que executa o reconhecimento. Recriar reconstrói cada contentor a partir da imagem com que foi instalado, sem procurar uma mais recente."
},
{
"figure": {
"src": "/oci-manager/manage-menu.png",
"alt": "Lista de aplicativos OCI instalados e as opções de atualização, modificação e remoção",
"caption": "Gerencie aplicativos OCI instalados."
}
}
]
},
{
"id": "update",
"title": "Uma atualização transacional",
"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": "Usuário",
"registry": "Registo de OCI",
"update": "Atualizar instância",
"resolve": "Resolver a etiqueta",
"verify": "Verificar o arquivo e executar as verificações prévias",
"backup": "Pare e faça backup do CT",
"import": "Importar o novo rootfs",
"reapply": "Aplicar o contrato novamente",
"healthy": "íntegro",
"failure": "falha",
"commit": "Contrato publicado com o novo digest",
"restored": "A instância anterior foi restaurada"
}
}
},
{
"list": {
"items": [
"Quando o registro ainda serve o digest instalado, nada é baixado e a instância não é tocada.",
"A nova imagem é verificada camada a camada antes de parar o CT. Uma transferência que chega danificada é repetida uma segunda vez; uma imagem já em cache que não passa na verificação é transferida novamente.",
"As definições alteradas no Proxmox VE após a instalação (memória, swap, núcleos, limite e prioridade da CPU, arranque com o nó) são mantidas e incluídas no novo contrato.",
"A interface LAN adicionada pela suite Arr e pelas aplicações com vários contentores (<code>net1</code>) e a ordem de arranque (<code>startup</code>) são repostas sem alterações no novo contentor.",
"Qualquer outra diferença entre o CT e o seu contrato interrompe a atualização antes de parar o CT."
]
}
},
{
"flow": {
"nodes": [
{
"label": "Antes",
"detail": "rootfs A\n/config mp0\nDirectório da máquina /media"
},
{
"label": "Atualizar",
"detail": "substitui apenas\no rootfs"
},
{
"label": "Após",
"detail": "rootfs B\n/config mp0\nDirectório da máquina /media"
}
]
}
},
{
"p": "Antes de parar seja o que for, a operação verifica o espaço necessário para a cópia de segurança: os dados utilizados nos volumes incluídos, mais uma margem. A cópia é guardada junto ao registo da aplicação, no disco de sistema do host. Se não houver espaço suficiente, o menu pede outro armazenamento do host que aceite cópias de segurança. A cópia é criada aí e eliminada no fim da operação. A escolha fica guardada para essa aplicação, incluindo as atualizações agendadas. Se nenhum armazenamento tiver espaço suficiente, a operação é recusada e a aplicação fica como estava. O espaço necessário para a nova imagem também é verificado antes da transferência."
}
]
},
{
"id": "recovery",
"title": "Recuperar uma operação interrompida",
"intro": "Uma atualização e uma mudança usam uma transação persistente. Se o processo, o terminal ou o nó são interrompidos após a parada do CT, a operação não é tomada como terminada.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Marcador pendente",
"body": "Ao abrir Gerir aplicações OCI instaladas, o estado guardado mostra que a substituição nunca chegou a ser publicada."
},
{
"title": "Ver o estado",
"body": "Mostra a fase atingida sem alterar contentores ou dados."
},
{
"title": "Recuperar a instalação anterior",
"body": "Restaura a cópia de segurança nativa verificada, criada antes da substituição, e o contrato anterior."
},
{
"title": "Pilha como unidade",
"body": "Para um aplicativo multi-contentor, cada membro é recuperado do mesmo ponto de transação, não apenas o selecionado."
}
]
}
},
{
"calloutWarning": {
"title": "Os diretórios da máquina estão fora do rollback",
"body": "A cópia de segurança abrange o rootfs e os discos do contentor nela incluídos. Um diretório do host não é reposto no estado anterior, pois outros LXC podem utilizar os seus dados."
}
}
]
},
{
"id": "watchdog",
"title": "Watchdog: reiniciar uma aplicação que pára",
"intro": "O Proxmox não tem uma política de reinício: quando termina o processo de um contentor de aplicação, o contentor fica parado. Com o watchdog ativo, uma aplicação que para por si própria é iniciada novamente. Para uma aplicação OCI, faz o que <code>restart: unless-stopped</code> faz num ficheiro Compose.",
"blocks": [
{
"table": {
"headers": [
"O que acontece?",
"Com o watchdog ativo"
],
"rows": [
[
"O aplicativo trava ou seu processo termina",
"O contentor é iniciado novamente em segundos"
],
[
"É parado ou desligado do Proxmox, do Monitor ou com <code>pct</code>",
"Fica parado até alguém o iniciar"
],
[
"Um backup, uma migração ou uma operação ProxMenux está trabalhando nele",
"Nada é feito até que isso acabe."
],
[
"Já estava parado quando o host arrancou",
"Fica parado; isso é determinado por <strong>Iniciar com o Proxmox</strong>"
],
[
"Ele continua parando logo após começar",
"Uma aplicação que volta a parar segundos depois de arrancar, ou que não arranca, tem cinco tentativas de início, com intervalos de 30 segundos, 1, 2 e 5 minutos. Depois fica parada e é enviada uma notificação"
]
]
}
},
{
"p": "O instalador faz esta pergunta nos dois modos de instalação e propõe o valor declarado na receita da aplicação. Mais tarde, a opção pode ser alterada em <strong>Gerir aplicações OCI instaladas</strong> ou no interruptor <strong>Watchdog</strong> do contentor em <monitorLink>ProxMenux Monitor</monitorLink>; aplica-se a todos os contentores de uma aplicação com vários contentores. Um único serviço do host, <code>proxmenux-oci-watchdog.service</code>, vigia todas as aplicações que o pediram; a sua instalação aparece no separador Alterações de Audit & Report."
},
{
"calloutInfo": {
"title": "O que a máquina não pode dizer",
"body": "O código de saída da aplicação não chega ao host, pelo que uma saída normal e uma falha são indistinguíveis e ambas provocam um reinício, como <code>always</code> e <code>unless-stopped</code> no Docker. Uma paragem pedida fora do Proxmox, com <code>lxc-stop</code> ou <code>systemctl</code>, não deixa uma tarefa de paragem e é interpretada como uma paragem espontânea."
}
}
]
},
{
"id": "restore",
"title": "Backup, restauração e outra máquina",
"intro": "Uma cópia de segurança feita com vzdump ou Proxmox Backup Server inclui o contentor, os discos do contentor selecionados para a cópia e a cópia do seu contrato. O que a instalação guarda no host não faz parte dela. <strong>Gerir aplicações OCI instaladas</strong> deteta contentores restaurados num host sem o respetivo contrato, após uma nova instalação do Proxmox ou noutro host, e oferece o novo registo.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Restaurar os contentores no Proxmox",
"body": "A partir do armazenamento de cópias de segurança, com o ID original ou qualquer ID livre. Uma aplicação com vários contentores precisa de todos eles."
},
{
"title": "Abrir Gerenciar aplicativos OCI instalados",
"body": "Os contentores restaurados são listados e é oferecida a recuperação. O botão <strong>Recuperar</strong> do separador Atualizações de <monitorLink>ProxMenux Monitor</monitorLink> abre a mesma recuperação."
},
{
"title": "Verificar antes de mudar",
"body": "A recuperação verifica se o host tem tudo o que cada aplicação precisa. Uma aplicação que não possa ser recuperada por completo fica como estava, com indicação do motivo."
},
{
"title": "Registar e iniciar",
"body": "O contrato está registrado neste host e o que a instalação manteve nele é escrito novamente. Iniciar as aplicações é uma pergunta separada, respondida com Não quando os recipientes originais ainda estão em execução em outro host."
}
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Diálogo que lista os contentores restaurados e oferece a sua recuperação",
"caption": "A recuperação oferecida quando Gerenciar aplicativos OCI instalados abre."
}
},
{
"table": {
"headers": [
"O que o host guardava",
"Após a recuperação"
],
"rows": [
[
"Contrato de instância",
"Registado a partir da cópia no contentor, verificada face à configuração restaurada pelo Proxmox"
],
[
"Rede privada de uma aplicação multi-contentor",
"Criado novamente com a mesma ponte e sub-rede; os endereços fixos dos contentores não mudam"
],
[
"Ordem de arranque de uma aplicação com vários contentores",
"O hookscript de dependências e o seu contrato são instalados novamente; os snippets são ativados no armazenamento <code>local</code> quando nenhum armazenamento os aceita"
],
[
"Sysctls de rede e ficheiro de monitorização da máquina",
"Escrito novamente em <code>/etc/pve/proxmenux</code>"
],
[
"Ambiente de execução NVIDIA",
"O hook de um contentor sem privilégios é instalado novamente. Um contentor privilegiado recebe os ficheiros do controlador deste host em vez dos do host de origem"
],
[
"Montagem Rclone",
"O hookscript e os programas que publicam a montagem são escritos novamente, com as mesmas vistas na máquina"
],
[
"Regra da firewall do host para um monitor do host",
"É pedida novamente, para a porta web e a sub-rede da bridge neste host"
],
[
"<code>lost+found</code> de cada disco restaurado",
"É removido quando está vazio; um restauro cria-o e algumas aplicações não arrancam se estiver presente nos seus dados"
],
[
"Discos restaurados em outro armazenamento",
"O contrato é atualizado para o armazenamento em que eles estão agora"
]
]
}
},
{
"p": "Um recipiente restaurado com outro ID mantém sua aplicação. O contrato, seu log de console, seus sysctls de rede, o hookscript de uma montagem Rclone e a ordem de início de uma aplicação multi-contentor são registrados com os IDs que os contêineres têm neste host."
},
{
"table": {
"headers": [
"O que impede uma recuperação",
"O que fazer"
],
"rows": [
[
"Falta um contentor de uma aplicação com vários contentores",
"Restaure-o também; o aplicativo é recuperado inteiro"
],
[
"A sub- rede privada já é usada nesta máquina",
"A recuperação é cancelada e nada é alterado: os endereços dos contentores são fixados e não são movidos para outra subrede"
],
[
"Não existe uma pasta da máquina",
"Montar ou criar com os seus dados; uma cópia de segurança do contentor não inclui pastas da máquina"
],
[
"Não existe um dispositivo nesta máquina",
"Ligue-o ou remova-o do contentor no Proxmox"
],
[
"Um aplicativo com NVIDIA em uma máquina sem o driver",
"Instale o controlador NVIDIA e o Container Toolkit"
],
[
"O backup foi feito antes da cópia do contrato existir",
"O recipiente permanece como um LXC normal e não é oferecido novamente"
]
]
}
},
{
"calloutInfo": {
"title": "Um contentor que volta",
"body": "Um contentor restaurado sobre si próprio a partir de uma cópia de segurança anterior, reposto num snapshot ou devolvido de outro nó transporta o contrato do estado em que se encontra. Se for selecionado para uma operação e o seu contrato diferir do deste host, a operação não começa e é oferecida a recuperação do contentor."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Resultado da recuperação com a rede privada, a ordem de início e os contentores registados",
"caption": "Resultado de uma recuperação, passo a passo."
}
}
]
},
{
"id": "remove",
"title": "Removendo uma aplicação OCI",
"blocks": [
{
"p": "Antes da confirmação é criado um resumo da configuração real: os contentores removidos, os dados eliminados com eles, a rede privada libertada e os diretórios do host mantidos. A confirmação tem <strong>Não</strong> como resposta predefinida, pois os dados dos discos eliminados não podem ser recuperados depois."
},
{
"table": {
"headers": [
"Recurso",
"Ao remover",
"Justificação"
],
"rows": [
[
"rootfs e discos de contentores",
"Removido",
"Pertencem apenas ao recipiente."
],
[
"Pasta da máquina",
"Mantido, com o seu conteúdo",
"Outras aplicações podem utilizá-lo"
],
[
"Ficheiros do contentor no host",
"Removido",
"O registo da consola, os parâmetros sysctl de rede, o hookscript da montagem Rclone e o registo no separador App do ProxMenux Monitor não servem outros contentores"
],
[
"Ficheiros partilhados por várias instalações",
"Excluído com a última instalação que os usa",
"O arquivo host-monitor e o hookscript de dependência de aplicativos multi-contentor"
],
[
"Contrato de instância",
"Excluído após uma remoção bem- sucedida",
"Nenhum CT está mais associado a ele"
],
[
"Ponte privada de uma pilha",
"Libertada com a pilha",
"Não tem mais membros para conectar"
],
[
"Rede partilhada pela suite Arr",
"Libertada com a última aplicação da suite",
"Cada aplicação da suite é independente e é removida por conta própria"
],
[
"Um único membro de uma pilha",
"Não removido isoladamente",
"O aplicativo inteiro é removido, então nenhuma pilha fica incompleta"
],
[
"Um recipiente em outro nó do cluster",
"Não removido",
"Seus arquivos de registro e host estão no nó onde foi instalado: ele é removido lá, depois de migrar de volta"
]
]
}
},
{
"figure": {
"src": "/oci-manager/remove-summary.png",
"alt": "Resumo de remoção com os recipientes, dados e diretórios do host afetados",
"caption": "O resumo de remoção, construído a partir da configuração real."
}
}
]
},
{
"id": "archives",
"title": "Imagens transferidas e espaço da máquina",
"blocks": [
{
"p": "O arquivo OCI é usado para criar o rootfs; o CT em execução não o lê. Após uma instalação ou atualização, são listados os arquivos transferidos nessa operação, com o respetivo tamanho, e é oferecida a sua eliminação. Eliminá-los liberta espaço sem afetar o contentor ou os seus dados."
},
{
"calloutInfo": {
"title": "As atualizações não precisam do arquivo",
"body": "Sem o arquivo, uma atualização resolve o canal salvo e baixa o novo digest. Com ele, um arquivo é reutilizado apenas quando sua referência e integridade correspondem ao que é solicitado."
}
}
]
},
{
"id": "registry",
"title": "Registo e limpeza",
"blocks": [
{
"p": "Ao abrir <strong>Gerir aplicações OCI instaladas</strong>, são primeiro removidos os restos de contentores que não existem em nenhum nó do cluster: o registo guardado como histórico após a eliminação na interface do Proxmox e os ficheiros do host deixados por uma remoção. Um registo com uma operação incompleta é mantido, pois a sua cópia de segurança ainda pode ser necessária. Os volumes e diretórios do host nunca são eliminados por dedução."
}
]
},
{
"id": "cluster",
"title": "Em um cluster: migração e alta disponibilidade",
"intro": "Um contentor OCI é um LXC normal do Proxmox: pode ser migrado ou gerido por HA como os restantes, com as mesmas limitações. O que precisa para arrancar é guardado onde todos os nós do cluster o encontram.",
"blocks": [
{
"table": {
"headers": [
"Parte",
"Em outro nó do cluster"
],
"rows": [
[
"Registo da consola",
"O contentor cria <code>/var/log/proxmenux/oci</code> antes de arrancar, no nó que o executa. Cada nó mantém o registo dos arranques que executou."
],
[
"Sysctls de rede e monitor host",
"Mantido em <code>/etc/pve/proxmenux</code>, que cada nó do cluster compartilha, então um contêiner migrado os encontra."
],
[
"Discos de contentores",
"O Proxmox move-os com o contentor. O HA precisa dos dados disponíveis no nó de destino, através de armazenamento partilhado ou de uma configuração de replicação suportada."
],
[
"Directórios e dispositivos da máquina",
"As mesmas regras que qualquer LXC: um diretório host deve existir no nó alvo e ser marcado como compartilhado, e um GPU, Coral ou NPU deve estar presente lá."
],
[
"Registo ProxMenux",
"O contrato permanece no nó onde a aplicação foi instalada, e todos os nós leem a cópia mantida em <code>/etc/pve/priv/proxmenux/oci</code>. Uma aplicação com um só contentor que migra é registada no nó de destino ao abrir <strong>Gerir aplicações OCI instaladas</strong> ou ao iniciar uma operação para ela. Uma aplicação com vários contentores é oferecida para recuperação nesse nó, pois a sua rede privada tem de ser criada aí."
]
]
}
},
{
"calloutWarning": {
"title": "Não para alta disponibilidade",
"body": "Uma aplicação multi-contentor atinge seus membros através de uma ponte privada do nó onde foi instalado, então seus membros permanecem nesse nó. Um monitor host, como o Glances no modo host ou o Netdata, monitora o nó em que ele é executado; movendo-o monitoraria outro nó."
}
},
{
"p": "Um backup restaurado fora do cluster recebe os arquivos de <code>/etc/pve/proxmenux</code> que o recipiente usa quando o aplicativo é recuperado."
}
]
},
{
"id": "channel",
"title": "Uma etiqueta rolling não é uma atualização sem supervisão",
"blocks": [
{
"p": "O catálogo instala a etiqueta rolling publicada pelo responsável, mas o digest efetivo é resolvido e registado e só muda através de uma atualização explícita, com verificações prévias e rollback. O <monitorLink>ProxMenux Monitor</monitorLink> compara o digest instalado com o publicado pelo registo e apresenta um aviso e uma notificação quando há uma nova imagem disponível."
}
]
}
]
}
@@ -0,0 +1,213 @@
{
"meta": {
"title": "Contêineres OCI no ProxMenux Monitor | ProxMenux",
"description": "O que o ProxMenux Monitor mostra para um container instalado pelo OCI Manager Apps: versões de aplicativos e imagens, novas imagens, saída do console e o terminal Proxmox VE."
},
"header": {
"title": "No ProxMenux Monitor",
"description": "Um recipiente instalado pelo OCI Manager Apps aparece em VMs & LXCs como qualquer outro LXC. Seu modal lê o registro de instalação: versões de aplicação e imagem, novas imagens, saída de console e terminal.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "O registro é a fonte",
"body": "O OCI Manager Apps sabe o que ele instalou e de onde veio. O Monitor lê esse registro de instalação em vez de sondar o recipiente, por isso os dados são os mesmos se o recipiente está em execução ou parado."
}
},
{
"table": {
"headers": [
"Página",
"O que muda para um recipiente OCI"
],
"rows": [
[
"Estado",
"Um interruptor <strong>Watchdog</strong> em Iniciar no arranque: o aplicativo é iniciado novamente quando pára por conta própria"
],
[
"Aplicativo",
"O aplicativo é identificado a partir do registro, e as atualizações são monitoradas pela imagem"
],
[
"Atualizações",
"A imagem é atualizada ou a aplicação modificada, com o mesmo fluxo que o menu OCI"
],
[
"Montagens",
"Discos de contentores e pastas de máquinas, com a sua utilização"
],
[
"Registros",
"Apenas para recipientes OCI: a saída do console da aplicação"
]
]
}
}
]
},
{
"id": "app",
"title": "Aplicativo",
"intro": "A aba <appLink>App</appLink> oferece o aplicativo instalado como uma detecção, com o nome, logotipo, porta e esquema do registro. Registrando-o abre o editor com o método <strong>Imagem OCI (instalada por ProxMenux)</strong>, que não precisa de configuração.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "boxes",
"title": "Aplicação",
"body": "A versão da aplicação dentro da imagem, lida a partir da imagem em si: o seu ambiente ou a sua etiqueta <code>org.opencontainers.image.version</code>. É informativo."
},
{
"icon": "archive",
"title": "Imagem",
"body": "A data de compilação e o digest da imagem instalada. A atualização é decidida aqui: o digest instalado é comparado com o que o registro publica hoje para a mesma tag."
}
]
}
},
{
"list": {
"items": [
"Quando o registro publica um novo digest, o cartão mostra <strong>Nova imagem</strong> com sua data e digest, mesmo que a versão do aplicativo dentro não mudou: uma reconstrução em uma base atualizada é uma atualização.",
"Quando os digests coincidem, o cartão mostra <strong>Versão</strong>.",
"O cartão faz links para o repositório da imagem: seu projeto GitHub, ou sua página Docker Hub para uma imagem oficial.",
"O link de acesso usa o endereço LAN do recipiente, também para o principal membro de um aplicativo multi-contentor, que tem um segundo endereço em sua rede privada.",
"O botão <strong>Atualizar dados</strong> lê novamente o registro de instalação e o registro de imagens. Não são oferecidas opções para procurar ou registrar outro aplicativo: o contêiner contém exatamente o aplicativo de seu registro."
]
}
},
{
"figure": {
"src": "/oci-manager/monitor-app-tab.png",
"alt": "Página de aplicação de um contentor OCI com a versão da aplicação, a imagem e o link do repositório",
"caption": "Página da aplicação de um recipiente instalado pelo OCI Manager Apps."
}
},
{
"p": "A verificação é executada uma vez por dia com as verificações de atualização do Monitor e o <strong>Atualizar dados</strong> a executa imediatamente. Uma nova imagem é enviada como uma notificação através dos canais configurados em <notificationsLink>Notificações</notificationsLink>. A atualização é aplicada na aba Atualizações."
}
]
},
{
"id": "updates",
"title": "Atualizações",
"intro": "Para um contêiner instalado pelo OCI Manager Apps a aba Atualizações mostra o aplicativo com sua imagem instalada e, quando o registro publica uma, a nova imagem, no mesmo formato que qualquer outra aplicação. Os atualizadores de pacotes e aplicativos de um LXC comum não aparecem.",
"blocks": [
{
"table": {
"headers": [
"Botão",
"O que abre"
],
"rows": [
[
"Atualizar",
"A atualização de <lifecycleLink>Gerenciar aplicativos OCI instalados</lifecycleLink> para este contêiner, no terminal do Monitor. Pode ser executada com ou sem uma nova imagem; sem imagem nova, nada muda. Em um aplicativo com vários contêineres, atualiza todos os membros."
],
[
"Modificar",
"O editor da aplicação (recursos, rede, caminhos e GPU). Em uma aplicação multi-contentor adiciona ou remove os caminhos e dispositivos extras do recipiente de aplicação e, em Immich, altera o que executa o reconhecimento."
],
[
"Recuperar",
"Substitui a atualização quando uma operação no recipiente foi interrompida e abre sua recuperação."
],
[
"Recuperar (contêiner restaurado)",
"Exibido para um contêiner restaurado de backup que não tem contrato neste host, em <strong>Aplicativo OCI restaurado</strong>. Abre a <lifecycleLink>recuperação</lifecycleLink> no terminal do Monitor; Atualizar e Modificar aparecem após o registro."
]
]
}
},
{
"p": "Alterações externas, diretórios host e aplicativos multi-contentores são tratados como no menu OCI. Em uma aplicação multi-contentor, os botões e as opções aparecem apenas no recipiente principal; os outros membros mostram sua imagem, uma nota de que eles são atualizados do recipiente principal e um botão que a abre. Quando o terminal fecha, a imagem, o registro e as montagens são lidos novamente."
},
{
"table": {
"headers": [
"Opção",
"Comportamento"
],
"rows": [
[
"Manter o backup feito antes da atualização",
"Cada atualização faz backup do recipiente para restaurá-lo se a atualização falhar. Com esta opção, o mesmo backup é mantido no armazenamento escolhido e aparece entre os backups do CT; em Proxmox Backup Server um backup é escrito antes da atualização."
],
[
"Atualizações agendadas",
"A imagem é atualizada no horário escolhido somente se o registro publicar uma nova, com a opção de esperar que ela tenha 1, 3, 7 ou 14 dias. Um contêiner com alterações feitas fora do ProxMenux é ignorado e reportado."
]
]
}
}
]
},
{
"id": "logs",
"title": "Registros",
"intro": "A guia Logs aparece apenas para recipientes instalados pelo OCI Manager Apps, entre Mounts e Backups. Ele mostra a saída padrão e erro do processo principal da imagem, a mesma saída <code>docker logs</code> mostra para um recipiente Docker.",
"blocks": [
{
"list": {
"items": [
"A saída é mantida no host em <code>/var/log/proxmenux/oci/VMID.console.log</code> (modo 0600), desde o primeiro início e através de reinícios, para que possa ser lido com o recipiente parado.",
"O arquivo é rodado em 10 MB, mantendo três cópias comprimidas (<code>/etc/logrotate.d/proxmenux-oci</code>).",
"Cada início do recipiente é marcado na saída. A aba mostra a saída desde o último início por padrão; <strong>Histórico completo</strong> também mostra as anteriores.",
"Quando o aplicativo é removido, sua saída é removida com ele.",
"São exibidas as últimas 100, 500 ou 1000 linhas. Enquanto o contêiner está em execução, as novas linhas são acompanhadas ao vivo; rolar para cima pausa o acompanhamento e <strong>Acompanhar</strong> o retoma.",
"Um filtro mostra apenas as linhas que contêm um texto, e <strong>Baixar</strong> salva as linhas carregadas.",
"Os códigos de cores são removidos e uma linha que uma barra de progresso redesenha é mostrada em seu estado final.",
"A aba lê o arquivo a cada abertura, sem usar uma cópia em cache."
]
}
},
{
"calloutInfo": {
"title": "Credenciais de primeiro início",
"body": "Imagens que imprimem uma senha gerada em seu primeiro início deixam-na nesta saída, como <code>docker logs</code> faz. O instalador lê-o de lá para o mostrar em seu resumo."
}
},
{
"figure": {
"src": "/oci-manager/monitor-logs-tab.png",
"alt": "Aba Logs com a saída do console de um contêiner OCI, seletor de linhas, filtro e botão de acompanhamento",
"caption": "Saída do console de um recipiente OCI."
}
}
]
},
{
"id": "terminal",
"title": "Consola Proxmox VE",
"blocks": [
{
"p": "Uma imagem OCI executa seu próprio processo como PID 1 e nenhum serviço de login, então o console padrão de um LXC abriria um terminal onde nada responde. Containers instalados pelo OCI Manager Apps são criados com <code>cmode: shell</code>: o console Proxmox VE abre uma shell com <code>lxc-attach</code>, o equivalente a <code>docker exec</code>, com a aplicação em execução intocada."
},
{
"list": {
"items": [
"O shell é o que <code>/etc/passwd</code> atribui ao root na imagem. Se root não tiver shell ou a imagem não incluir nenhum, o console padrão será mantido.",
"O shell é root dentro do recipiente, sem senha. Quem pode abri-lo é decidido pela permissão <code>VM.Console</code> de Proxmox VE.",
"O terminal do Monitor entra no recipiente com <code>pct enter</code>, que funciona da mesma forma."
]
}
}
]
},
{
"id": "mounts",
"title": "Montagens",
"blocks": [
{
"p": "A aba <mountsLink>Montagens</mountsLink> lista os discos do contêiner e seus diretórios do host. O uso de um disco em armazenamento de blocos, como LVM-thin, é lido do sistema de arquivos desse disco, montado apenas dentro do contêiner."
}
]
}
]
}
@@ -0,0 +1,404 @@
{
"meta": {
"title": "Aplicações multi-contêineres ProxMenux",
"description": "Como o OCI Manager Apps transforma um aplicativo com seu banco de dados e cache em LXCs nativos coordenados: plano, rede privada, gancho de dependência, validação e atualizações transacionais."
},
"header": {
"title": "Aplicações com vários contentores",
"description": "Uma aplicação com seu banco de dados, cache e outros serviços torna-se vários LXCs nativos coordenados, instalados e atualizados como um.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Um aplicativo para o usuário, vários LXCs para Proxmox VE",
"body": "Uma definição multi-contentor é uma entrada do catálogo. O instalador cria um LXC nativo por serviço e mantém suas dependências explícitas. Immich, Nextcloud, Paperless-ngx e Tandoor são instalados desta forma."
}
},
{
"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": "Plano de pilha",
"app": "Aplicação LXC",
"appNet": "LAN + privado",
"db": "PostgreSQL LXC",
"cache": "Valkey LXC",
"private": "privado"
}
}
}
]
},
{
"id": "plan",
"title": "1. O plano, antes de existir qualquer recipiente",
"blocks": [
{
"p": "Nenhum LXC é criado enquanto a definição Compose é interpretada. Um plano completo vem em primeiro lugar, com cada membro, imagem, VMID, rede, caminho, segredo, ordem e verificação de saúde. Se o plano não for consistente, a instalação não começa."
},
{
"table": {
"headers": [
"Elemento do plano",
"Conteúdo",
"Verificado antes de criar qualquer coisa"
],
"rows": [
[
"Membros",
"Aplicação principal, banco de dados, cache, aprendizado de máquina e outras dependências",
"VMIDs exclusivos, papéis conhecidos e exatamente um membro principal"
],
[
"Imagens",
"Referência rolling, arquitetura e digest resolvido de cada serviço",
"Todos existem, suportam a arquitetura e passam pela verificação de integridade do OCI"
],
[
"Rede",
"Ponte privada, sub-rede, endereço fixo por serviço e acesso LAN para o membro principal",
"Sem colisão com pontes ou subredes existentes e sem endereço repetido"
],
[
"Persistência",
"Discos de container, diretórios de host, proprietários e backup",
"Nenhum caminho sobreposto, armazenamento disponível e permissões declaradas"
],
[
"Segredos",
"Senha do banco de dados, chaves do aplicativo e credenciais iniciais",
"Gerado uma vez e dado apenas aos membros que os usam"
],
[
"Ciclo de vida",
"Ordem de início, ordem de parada e uma verificação de funcionamento por membro",
"A aplicação principal começa por último e pára primeiro"
]
]
}
}
]
},
{
"id": "create",
"title": "2. Criação, membro por membro",
"blocks": [
{
"steps": {
"items": [
{
"title": "Reserve cada VMID",
"body": "O inventário Proxmox VE e o registro de instância são verificados. Um CT existente não é adotado e um contrato que ainda pertence a outra instância não é reutilizado."
},
{
"title": "Preparar cada imagem",
"body": "Todas as imagens são resolvidas, baixadas e verificadas antes da criação do primeiro container."
},
{
"title": "Criar cada rootfs",
"body": "Os metadados oficiais do OCI são importados, e a identidade da instância ProxMenux e o papel de membro são adicionados."
},
{
"title": "Rede privada",
"body": "Uma ponte e uma sub-rede são criadas e cada membro recebe seu endereço fixo; apenas o membro principal também recebe a interface LAN."
},
{
"title": "Persistência",
"body": "Cada banco de dados e configuração obtém seu próprio disco de contêiner; somente os dados destinados a serem compartilhados usam diretórios de host."
},
{
"title": "Ambiente",
"body": "Endpoints internos, segredos compartilhados e variáveis de serviço são escritos. O aplicativo atinge suas dependências em seus endereços privados reservados."
},
{
"title": "Registro",
"body": "Cada membro registra sua configuração nativa, as mudanças rootfs que as atualizações têm que reproduzir e sua relação com a pilha."
}
]
}
}
]
},
{
"id": "checks",
"title": "3. Iniciar e verificar cada recipiente",
"intro": "Um LXC criado não significa um serviço pronto. As dependências começam em ordem e cada um passa uma verificação específica para o seu serviço.",
"blocks": [
{
"table": {
"headers": [
"Serviço",
"Verificação",
"O que mostra"
],
"rows": [
[
"PostgreSQL",
"<code>pg_isready</code> no CT com o host, usuário e banco de dados esperados",
"O servidor aceita conexões para o banco de dados configurado"
],
[
"Redis / Valkey",
"<code>redis-cli</code> ou <code>valkey-cli</code> <code>PING</code> contra o seu endereço privado",
"O broker escuta e responde"
],
[
"aprendizado de máquina Immich",
"HTTP <code>GET /ping</code>, mais uma verificação do tempo de execução GPU selecionado",
"O serviço responde e a aceleração solicitada não passou a usar a CPU"
],
[
"Nextcloud",
"<code>GET /status.php</code> com <code>installed=true</code>, <code>maintenance=false</code> e <code>needsDbUpgrade=false</code>",
"A inicialização terminou sem migração pendente"
],
[
"Paperless-ngx / Tandoor",
"HTTP no endereço LAN e porto real do serviço",
"O frontend e suas dependências servem a aplicação"
],
[
"Aplicação principal",
"O ponto final do seu modelo, por exemplo, <code>/api/server/ping</code> em Immich",
"A pilha inteira funciona através da aplicação que usa as dependências"
]
]
}
},
{
"calloutWarning": {
"title": "Em execução não significa funcionando corretamente",
"body": "O estado em execução apenas diz que o processo LXC existe. Quando o serviço oferece uma verificação melhor, é utilizado uma verificação exec ou HTTP com tempo limite. Se um membro para ou falha na verificação, a pilha não é declarada instalada."
}
}
]
},
{
"id": "hook",
"title": "4. O gancho de dependência",
"blocks": [
{
"p": "O gancho é definido apenas no recipiente principal de uma pilha dependente. Proxmox VE mantém o script como um trecho e o executa como o <code>hookscript</code> daquele CT. A receita da pilha não é escrita no script: ela vive em um contrato privado separado."
},
{
"codeGrid": {
"items": [
{
"title": "Configuração principal do CT",
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
},
{
"title": "Contrato privado (exemplo)",
"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": "Fonte completa de proxmenux-stack-dependencies.sh",
"pathCode": "local:snippets/proxmenux-stack-dependencies.sh",
"snippetCode": "stackDependencyHook"
}
},
{
"p": "O script é o mesmo para cada pilha. VMIDs, nomes, tipos de verificação e timeouts vêm do contrato privado <code>/etc/pve/priv/proxmenux-stack-VMID.json</code> de cada pilha."
},
{
"steps": {
"items": [
{
"title": "O Proxmox VE chama pre-start",
"body": "Antes do início do CT principal, o gancho funciona com o seu VMID e a fase do ciclo de vida."
},
{
"title": "Um bloqueio por pilha",
"body": "<code>flock</code> em <code>/run/lock/proxmenux-stack-VMID.lock</code> impede duas sequências de início ao mesmo tempo."
},
{
"title": "O contrato é lido e validado",
"body": "São exigidos um esquema conhecido, dependências numéricas, rótulos, uma verificação exec, http ou running e um tempo limite positivo."
},
{
"title": "Dependências em ordem",
"body": "Cada CT deve existir; um parado é iniciado e um já em execução não é reiniciado."
},
{
"title": "Esperar o serviço ficar pronto",
"body": "A verificação é executada a cada dois segundos, e o CT também é confirmado para estar ainda em execução."
},
{
"title": "O CT principal começa",
"body": "Quando cada dependência está pronta, termina pré-inicial e o Proxmox VE inicia a aplicação."
}
]
}
},
{
"calloutInfo": {
"title": "O gancho não para dependências",
"body": "As fases pós-início, pré-parar e pós-parar não fazem nada. Parar o CT principal deixa PostgreSQL, Redis, Valkey ou aprendizado de máquina em execução. O gancho ordena o início; ele não transforma vários LXCs em um processo."
}
},
{
"table": {
"headers": [
"Tipo",
"Exemplo",
"Início posterior"
],
"rows": [
[
"Pilha dependente",
"Immich, Nextcloud, aplicação com PostgreSQL",
"O gancho do CT principal inicia as dependências e espera por eles"
],
[
"Conjunto de aplicativos",
"Conjunto de aplicações Arr",
"Nenhum membro principal: cada LXC segue o seu próprio <code>onboot</code>"
],
[
"Aplicação única",
"Jellyfin",
"Proxmox VE inicia esse LXC diretamente"
]
]
}
}
]
},
{
"id": "stack-checks",
"title": "5. Verifica a pilha como um todo",
"blocks": [
{
"list": {
"items": [
"Cada VMID existe, é único e mantém a identidade de instância esperada.",
"Cada contrato pertence à mesma pilha, mantém seu papel e sua configuração nativa gravada.",
"O membro principal é o último em <code>start_order</code> e o primeiro em <code>stop_order</code>.",
"Nenhum membro, volume ou adaptação rootfs está faltando.",
"O gancho aponta para o trecho oficial, seu conteúdo é inalterado e seu contrato corresponde à receita da pilha.",
"As imagens e digests observados correspondem aos arquivos OCI preparados.",
"Dispositivos, perfis GPU, montagens, segredos e endpoints ainda correspondem aos contratos.",
"Após cada dependência passar, o ponto final da aplicação principal verifica a integração entre os membros."
]
}
}
]
},
{
"id": "manage",
"title": "Gerenciando uma pilha instalada",
"intro": "Em <strong>Gerenciar aplicativos OCI instalados</strong>, qualquer membro leva à pilha inteira. O menu oferece <strong>Atualizar todos os contêineres do aplicativo</strong>, <strong>Modificar caminhos e dispositivos extras</strong>, <strong>Recriar todos os contêineres com a configuração salva</strong> e <strong>Remover: excluir o aplicativo e seus contêineres</strong>. Recriar reconstrói cada contêiner da imagem original pelo digest salvo, sem procurar uma mais nova, seguindo os mesmos passos de uma atualização. A opção aparece para pilhas que podem ser atualizadas.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Qualquer membro",
"body": "O contrato dos membros nomeia o VMID principal e a lista completa de membros."
},
{
"title": "A pilha é reprodutível",
"body": "Identificações, contratos, gancho, adaptações e uma repetição coordenada para essa receita são validadas."
},
{
"title": "Primeiro as imagens",
"body": "O aplicativo não é parado até que cada digest tenha sido resolvido, baixado e verificado."
},
{
"title": "Parar e fazer backup do conjunto",
"body": "Os backups nativos verificados são feitos com a pilha parada, então a aplicação e os bancos de dados pertencem ao mesmo momento."
},
{
"title": "Atualizar e verificar cada membro",
"body": "Adaptação, rede, montagens, segredos e dispositivos são novamente aplicados antes do exame de saúde de cada membro."
},
{
"title": "Publicar ou recuperar tudo",
"body": "Os novos contratos só são publicados quando todos os membros passam. Se alguém falhar, cada membro é restaurado."
}
]
}
},
{
"table": {
"headers": [
"Modificar",
"O que muda",
"O que é guardado"
],
"rows": [
[
"Caminhos e dispositivos adicionais",
"Eles são adicionados ou removidos do recipiente de aplicação, que reinicia. Nada é reconstruído.",
"Os dados da aplicação, da sua base de dados e dos outros contentores"
],
[
"O que executa o reconhecimento (Immich)",
"O recipiente de aprendizado de máquina leva a imagem e os dispositivos do CPU ou de um GPU do hospedeiro. Todo o aplicativo é parado e atualizado, como em uma atualização",
"O cache do modelo, a biblioteca e o banco de dados. Se algo falhar, os recipientes anteriores e a escolha anterior são restaurados"
]
]
}
},
{
"calloutWarning": {
"title": "Uma pilha sem uma repetição coordenada não é atualizada",
"body": "Se a preparação de uma pilha não puder ser reproduzida, a atualização é recusada antes de a pilha ser parada. A aplicação continua a correr como está."
}
}
]
},
{
"id": "failure",
"title": "6. Quando algo falha",
"blocks": [
{
"p": "Durante uma instalação, um erro para e remove os contêineres incompletos que a operação criou, e a ponte privada se a operação criou. Uma pilha não é publicada como válida até que toda a sequência termine."
},
{
"p": "Uma atualização é transacional: todas as imagens são preparadas primeiro, depois a pilha pára, cada membro é feito backup e o backup verificado, e só então é substituído cada rootfs. Os membros começam um a um com seu exame de saúde; se um falha, cada membro é restaurado a partir do mesmo conjunto de backups, de modo que o banco de dados eo aplicativo nunca pertencem a momentos diferentes."
},
{
"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": "Preparar cada imagem",
"stop": "Parar, membro principal primeiro",
"backup": "Cópia de segurança verificada de cada CT",
"replace": "Substituir rootfs",
"healthy": "Todos funcionando corretamente?",
"yes": "Sim",
"no": "Não",
"commit": "Publicar contratos",
"rollback": "Restaurar cada membro"
}
}
}
]
},
{
"id": "not-assumed",
"title": "O que uma pilha não inclui",
"blocks": [
{
"list": {
"items": [
"Uma suíte instalada em um fluxo, como a suíte Arr, não é uma pilha dependente: seus recipientes não têm ordem de início entre eles.",
"A rede privada não substitui a autenticação, TLS ou a configuração de cada aplicativo.",
"O backup de um LXC não contém a ponte, o gancho ou os contratos do resto da pilha.",
"Prowlarr, Sonarr ou Radarr não recebem indexadores, perfis ou provedores de ProxMenux."
]
}
}
]
}
]
}
@@ -0,0 +1,305 @@
{
"meta": {
"title": "Dados, caminhos e rede | ProxMenux",
"description": "Como o OCI manager Apps preserva os dados de um contentor OCI: discos do contentor, diretórios do host, montagens com rclone, endereços e redes privadas."
},
"header": {
"title": "Dados, caminhos e rede",
"description": "O que fica no rootfs, o que é preservado quando este é substituído, como os dados são partilhados entre contentores e como cada um obtém o seu endereço.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "A persistência é decidida antes de criar o LXC",
"body": "Os volumes declarados pela imagem e pelo respetivo ficheiro Compose são lidos antes de criar o contentor. Cada caminho que deva ser preservado após uma atualização torna-se um ponto de montagem independente do rootfs. Assim, o rootfs contém apenas o que pertence à imagem e pode ser substituído."
}
}
]
},
{
"id": "questions",
"title": "O que o instalador pergunta",
"intro": "O modelo fornece os caminhos necessários à aplicação. Cada um é colocado num disco do contentor ou num diretório do host, e podem ser acrescentados mais caminhos antes do resumo.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Caminhos necessários",
"body": "São apresentados <code>/config</code>, <code>/data</code>, bibliotecas, descargas e todos os volumes declarados pela aplicação."
},
{
"title": "Localização",
"body": "Cada caminho é colocado num disco do contentor ou num diretório já existente no host."
},
{
"title": "Armazenamento e tamanho",
"body": "É criado um disco do contentor num armazenamento do Proxmox VE com o tamanho indicado. A instalação predefinida utiliza <code>local-lvm</code>; a avançada pergunta o armazenamento de cada caminho imediatamente antes do tamanho e propõe o do rootfs. O disco aparece como <code>vm-VMID-disk-N</code> e é associado como <code>mpN</code>."
},
{
"title": "Diretório do host",
"body": "O diretório do host é indicado pelo seu caminho. Se não existir, é criado e atribuído ao utilizador do host para o qual é mapeado o utilizador do contentor."
},
{
"title": "Caminhos adicionais",
"body": "Antes de instalar, podem ser acrescentados mais pares de caminho ou volume do host e caminho dentro do contentor."
},
{
"title": "Resumo",
"body": "O mapeamento completo é apresentado antes de criar o CT e guardado no contrato da instância."
}
]
}
}
]
},
{
"id": "options",
"title": "As duas localizações persistentes",
"blocks": [
{
"table": {
"headers": [
"Propriedade",
"Disco do contentor",
"Diretório do host"
],
"rows": [
[
"Na configuração",
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
],
[
"Cópia de segurança do contentor (vzdump)",
"Incluído, com <code>backup=1</code>",
"Não incluído"
],
[
"Tamanho",
"Fixo; aumenta-se redimensionando o ponto de montagem",
"O espaço livre do sistema de ficheiros ou dataset do host"
],
[
"Outros contentores",
"Montado apenas pelo contentor a que pertence",
"O mesmo diretório pode ser montado em vários contentores"
],
[
"Snapshots e restauro",
"Geridos pelo Proxmox VE juntamente com o CT",
"Geridos no armazenamento do host"
],
[
"Ao remover a aplicação",
"Eliminado com o contentor",
"Preservado com o seu conteúdo"
],
[
"Ao mover o CT para outro nó",
"É movido com o CT",
"O mesmo caminho tem de existir no outro nó"
]
]
}
},
{
"p": "O rootfs fica reservado para os binários e o conteúdo da imagem. Uma atualização ou recriação substitui-o sem tocar em nenhum dos dois tipos de ponto de montagem."
}
]
},
{
"id": "example",
"title": "Exemplo: um contentor com ambas as localizações",
"blocks": [
{
"code": {
"title": "Jellyfin instalado como CT 151 em local-lvm (excerto)",
"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": "Uma atualização ou recriação substitui apenas o rootfs: o <code>mp0</code> preserva utilizadores, bibliotecas e definições, e o <code>mp1</code> continua a apresentar os mesmos ficheiros multimédia. Restaurar a cópia do CT recupera <code>/config</code>; se necessário, o diretório multimédia é restaurado a partir da cópia de segurança do armazenamento do host."
},
{
"flow": {
"nodes": [
{
"label": "Contrato",
"detail": "/config"
},
{
"label": "Localização",
"detail": "Disco do contentor\nou diretório do host"
},
{
"label": "LXC",
"detail": "Sempre /config\npara a aplicação"
}
],
"caption": "A aplicação vê o caminho declarado pela imagem; só muda o local onde é armazenado."
}
}
]
},
{
"id": "shared",
"title": "Um diretório do host, vários contentores",
"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": "Diretório do host",
"config": "Configuração própria"
}
}
},
{
"p": "Cada contentor guarda a sua configuração no respetivo disco. A biblioteca ou as descargas ficam num único diretório do host, montado no mesmo caminho interno em todos os contentores. Assim, o caminho onde uma aplicação escreve é o mesmo de onde outra lê."
}
]
},
{
"id": "rclone",
"title": "Armazenamento na nuvem através da aplicação rclone",
"intro": "Além da instalação, a ficha do rclone no catálogo permite <strong>Ativar uma montagem num contentor OCI de rclone existente</strong>. É montado um armazenamento remoto já criado e autorizado na interface web do rclone e disponibilizado no host. Outros contentores podem utilizá-lo como um diretório do host.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Contentor e armazenamento remoto",
"body": "O VMID do contentor de rclone, o nome exato do armazenamento remoto e, opcionalmente, um caminho dentro dele."
},
{
"title": "Nome da montagem e cache",
"body": "O nome da montagem e o modo de cache VFS: <code>off</code>, <code>minimal</code>, <code>writes</code> ou <code>full</code> (predefinido)."
},
{
"title": "Vistas disponibilizadas",
"body": "Uma raiz comum, <code>/mnt/oci-shared</code> por predefinição, contém uma vista de leitura e escrita em <code>/mnt/oci-shared/remotes/NAME</code> e uma vista só de leitura em <code>/mnt/oci-shared/remotes-ro/NAME</code>."
},
{
"title": "Ativação",
"body": "Após confirmação, o CT é parado, o seu comando de arranque e um hookscript do Proxmox VE são configurados e o CT é iniciado novamente. A operação aguarda até ambas as vistas estarem montadas no host."
}
]
}
},
{
"calloutInfo": {
"title": "Se a montagem não for ativada",
"body": "A configuração anterior do contentor é restaurada e este é iniciado novamente. Assim, se a ativação falhar, o rclone fica como estava."
}
}
]
},
{
"id": "network",
"title": "Endereços e redes",
"intro": "Uma aplicação com um só contentor precisa de um endereço. Uma aplicação com vários contentores também precisa de uma rede estável entre os seus membros.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "network",
"title": "Aplicação com um só contentor",
"body": "Escolhe-se a bridge de rede e DHCP ou um endereço fixo em formato CIDR. O LXC tem um endereço próprio e o resumo apresenta os URL completos dos serviços."
},
{
"icon": "waypoints",
"title": "Aplicação com vários contentores",
"body": "É encontrada uma sub-rede livre e criada uma bridge privada persistente. Cada membro — aplicação, base de dados e cache — recebe nela um endereço fixo."
}
]
}
},
{
"flow": {
"nodes": [
{
"label": "LAN",
"detail": "Endereço acessível\napenas para o serviço principal"
},
{
"label": "LXC principal",
"detail": "Web / API\nLAN + rede privada"
},
{
"label": "Rede privada",
"detail": "PostgreSQL · Valkey · ML\nendereços fixos"
}
],
"caption": "As dependências comunicam pela rede privada e não têm um endereço na LAN."
}
},
{
"p": "O contrato da stack guarda a bridge, a sub-rede, os endereços e as relações entre serviços. Ao atualizar a aplicação, a mesma topologia é reutilizada para todos os membros. O ProxMenux Monitor abre o contentor principal no seu endereço LAN, não no da rede privada."
}
]
},
{
"id": "ownership",
"title": "Proprietários de ficheiros e diretórios",
"blocks": [
{
"list": {
"items": [
"Os novos diretórios são criados com o UID e o GID para os quais é mapeado o LXC sem privilégios.",
"O proprietário dos diretórios existentes não é alterado de forma recursiva.",
"Sockets, ficheiros de sistema e caminhos sensíveis não são propostos como diretórios genéricos do host."
]
}
}
]
},
{
"id": "backup",
"title": "O que contém uma cópia de segurança do contentor",
"blocks": [
{
"table": {
"headers": [
"Elemento",
"Na cópia vzdump do CT",
"Onde é guardado"
],
"rows": [
[
"Rootfs OCI",
"Sim",
"Na cópia do CT; também pode ser reconstruído a partir da imagem e do contrato"
],
[
"Disco do contentor com <code>backup=1</code>",
"Sim",
"A cópia do CT"
],
[
"Diretório do host",
"Não",
"A cópia de segurança do armazenamento do host"
],
[
"Contrato da instância",
"Sim, a cópia guardada no CT",
"<code>/.proxmenux/oci-record.json</code> dentro do CT; as cópias adicionais do host e do cluster são guardadas separadamente"
],
[
"Aplicação com vários contentores",
"Cada membro na sua própria cópia",
"As cópias de todos os membros, mais o contrato da stack e a respetiva bridge no host"
]
]
}
}
]
}
]
}
@@ -0,0 +1,171 @@
{
"meta": {
"title": "Ako sa prispôsobí obraz OCI | ProxMenux",
"description": "Od repozitára obrazu a jeho súboru Compose cez skontrolovateľnú šablónu a plán nasadenia až po natívny LXC v Proxmox VE, bez Dockeru v kontajneri."
},
"header": {
"title": "Ako sa prispôsobí obraz OCI",
"description": "Od repozitára obrazu a jeho súboru Compose cez skontrolovateľnú šablónu a plán nasadenia až po natívny LXC, bez inštalácie Dockeru v kontajneri.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "pipeline",
"title": "Postup prispôsobenia",
"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": "Repozitár obrazu",
"converter": "Konvertor",
"template": "Šablóna JSON",
"blockers": "Bez prekážok?",
"no": "Nie",
"yes": "Áno",
"review": "Kontrola / overlay",
"plan": "Plán nasadenia",
"lxc": "Natívny LXC"
}
}
},
{
"p": "Konvertor načíta obraz a súbor Compose zverejnené projektom a vytvorí šablónu JSON. Ak niektoré požiadavky ešte nie sú prispôsobené a bránia inštalácii, šablóna pred zverejnením v katalógu prejde kontrolou. Súbor overených úprav, nazývaný overlay, tieto prekážky vyrieši. Na inštaláciu sa ponúkajú iba šablóny bez nevyriešených prekážok."
}
]
},
{
"id": "template",
"title": "Čo šablóna zachováva",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Identita obrazu",
"body": "Repozitár, priebežne aktualizovaná značka, architektúra, zistený digest a revízia zdroja."
},
{
"icon": "braces",
"title": "Kontrakt kontajnera",
"body": "Entrypoint, Cmd, prostredie, používateľ, pracovný adresár, signál na zastavenie, porty a zväzky."
},
{
"icon": "layers",
"title": "Prispôsobenie pre Proxmox VE",
"body": "Zdroje, zabezpečenie, prípojné body, zariadenia, sysctls, kontroly stavu a potrebné úpravy pre každú položku vrátane ich zdôvodnenia."
},
{
"icon": "shield",
"title": "Kompatibilita",
"body": "Podporované kľúče, neprispôsobené požiadavky brániace inštalácii a stav každej kontroly."
}
]
}
}
]
},
{
"id": "sources",
"title": "OCI poskytuje proces, Compose poskytuje prostredie",
"blocks": [
{
"table": {
"headers": [
"Zdroj",
"Príklad",
"Natívny výsledok"
],
"rows": [
[
"Metadáta OCI",
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
"Proxmox VE ich importuje pri vytváraní CT"
],
[
"Docker Compose",
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
"Záznamy prostredia LXC, <code>mpN</code> a <code>devN</code>"
],
[
"Profil ProxMenux",
"GPU, kontrola stavu, prihlasovacie údaje",
"Otázky a overené úpravy"
],
[
"Používateľ",
"VMID, úložisko, sieť",
"Kontrakt inštancie"
]
]
}
}
]
},
{
"id": "install",
"title": "Čo sa deje počas inštalácie",
"blocks": [
{
"steps": {
"items": [
{
"title": "Zistiť konkrétny obraz",
"body": "Vyhľadá sa obraz v registri, vyberie sa architektúra hostiteľa a zaznamená sa konkrétny digest, na ktorý odkazuje priebežne aktualizovaná značka."
},
{
"title": "Stiahnuť a overiť",
"body": "Skopeo stiahne obraz ako archív OCI. Pred vytvorením akýchkoľvek prostriedkov sa každá vrstva overí podľa jej digestu a rozbalí. Ak je stiahnutý súbor poškodený, sťahovanie sa ešte raz zopakuje, až potom sa inštalácia zastaví."
},
{
"title": "Vytvoriť súborový systém",
"body": "<code>pct create</code> vytvorí rootfs z archívu a zachová oficiálne metadáta procesu obrazu."
},
{
"title": "Pripojiť prostriedky",
"body": "Pripoja sa deklarované zväzky a zariadenia a nastavia sa sieť, prostredie a bezpečnostné profily."
},
{
"title": "Konzola",
"body": "Výstup konzoly kontajnera sa uchováva na hostiteľovi. Konzola Proxmox VE otvorí shell, ak ho obraz obsahuje."
},
{
"title": "Overiť",
"body": "Pri prvom spustení sa čaká na pridelenie adresy a odpoveď služby. V prípade zlyhania sa inštalácia neoznačí za úspešnú."
},
{
"title": "Zaznamenať konfiguráciu",
"body": "Výsledná konfigurácia sa uloží do kontraktu inštancie, ktorý sa používa pri aktualizáciách a opätovnom vytvorení."
}
]
}
}
]
},
{
"id": "example",
"title": "Príklad: obraz s /config a /downloads",
"intro": "Bežná definícia Compose a konfigurácia Proxmox VE, ktorá z nej vznikne. Cesty očakávané aplikáciou sa nemenia.",
"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 (úryvok)",
"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> je druhý disk patriaci kontajneru, na zvolenom úložisku pomenovaný <code>vm-VMID-disk-N</code>. Pripája sa do <code>/config</code> a pri <code>backup=1</code> je súčasťou zálohy kontajnera. <code>mp1</code> nevytvára disk: pripája adresár hostiteľa <code>/srv/downloads</code> do <code>/downloads</code> v LXC. Port 8080 sa nemapuje: LXC má vlastnú adresu a služba odpovedá na nej."
}
]
}
]
}
@@ -0,0 +1,278 @@
{
"meta": {
"title": "Inštalácia obrazu mimo katalógu | ProxMenux",
"description": "Prispôsobte obraz OCI zo súboru Compose, URL, príkazu docker run alebo odkazu na obraz a pred inštaláciou skontrolujte, čo ProxMenux dokáže reprodukovať."
},
"header": {
"title": "Nainštalovať obraz mimo katalógu",
"description": "Vlastný obraz sa prispôsobí zo súboru Compose, príkazu docker run alebo iba z odkazu na obraz. Výsledok sa zobrazí na kontrolu skôr, než sa vytvorí akýkoľvek LXC.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Rovnaký konvertor a inštalátor",
"body": "Voľba <strong>Nainštalovať obraz mimo katalógu</strong> používa rovnaký konvertor a inštalátor ako šablóny katalógu. Rozdiel je v tom, že kontrakt sa vytvorí až vtedy zo zadanej definície a overí sa pred vytvorením akéhokoľvek LXC."
}
}
]
},
{
"id": "sources",
"title": "Ako je obraz opísaný",
"intro": "Úvodná obrazovka sa pýta, ako je obraz opísaný. Štyri možnosti poskytnú definíciu na prispôsobenie, piata používa iba názov obrazu a ďalšie tri načítajú už napísaný oci-compose.",
"blocks": [
{
"table": {
"headers": [
"Voľba",
"Čo sa načíta"
],
"rows": [
[
"Vložiť súbor Compose do terminálu",
"Vložte obsah YAML do terminálu a ukončite ho pomocou Ctrl+D."
],
[
"Načítať súbor Compose z tohto hostiteľa",
"Cesta na uzle, predvolene <code>/root/docker-compose.yml</code>. Súbor musí existovať a nesmie presiahnuť 256 KiB."
],
[
"Stiahnuť súbor Compose z adresy",
"Adresa <code>http://</code> alebo <code>https://</code>, ktorá poskytuje nespracovaný YAML. Stiahne sa najviac 256 KiB."
],
[
"Vložiť príkaz docker run do terminálu",
"Príkaz zverejnený projektom. Prispôsobia sa porty, prostredie, zväzky, zariadenia, capabilities, používateľ, zdieľaná pamäť a ďalšie podporované voľby."
],
[
"Iba odkaz na obraz, bez súboru Compose",
"Odkaz, napríklad <code>ghcr.io/user/application:latest</code>. Vyhľadá sa obraz v registri a zachovajú sa jeho metadáta OCI."
],
[
"Vložiť oci-compose do terminálu",
"Vložte JSON do terminálu a ukončite ho pomocou Ctrl+D. Nekonvertuje sa: overí sa a nainštaluje tak, ako je napísaný."
],
[
"Načítať oci-compose z tohto hostiteľa",
"Súbor JSON na uzle, predvolene <code>/root/oci-compose.json</code>, s veľkosťou najviac 2 MiB."
],
[
"Stiahnuť oci-compose z adresy",
"Adresa <code>http://</code> alebo <code>https://</code>, ktorá poskytuje súbor JSON. Stiahnu sa najviac 2 MiB."
]
]
}
},
{
"figure": {
"src": "/oci-manager/custom-source-menu.png",
"alt": "Menu výberu spôsobu opisu obrazu mimo katalógu",
"caption": "Spôsoby opisu obrazu mimo katalógu."
}
}
]
},
{
"id": "reference-only",
"title": "Čo poskytuje samotný odkaz na obraz",
"intro": "Obraz obsahuje metadáta svojho procesu, nie však celé prostredie, ktoré zvyčajne dopĺňa súbor Compose.",
"blocks": [
{
"table": {
"headers": [
"Načítané z obrazu",
"Nie je v obraze",
"Dôsledok"
],
"rows": [
[
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> a zahrnuté prostredie",
"Premenné uvedené iba v dokumentácii",
"Pridajú sa pri inštalácii alebo cez Upraviť"
],
[
"Zväzky deklarované obrazom",
"Adresáre hostiteľa uvedené iba v súbore Compose",
"Ďalšie cesty sa pridajú pred inštaláciou"
],
[
"Porty <code>EXPOSE</code>",
"URL, protokol alebo funkčná kontrola služby",
"Potvrdí sa port a spôsob kontroly služby"
],
[
"Architektúry a digest v registri",
"Zariadenia, oprávnenia alebo externé závislosti",
"Bez požiadavky v definícii sa nepovolia"
]
]
}
}
]
},
{
"id": "review",
"title": "Kontrola pred inštaláciou",
"intro": "Po prispôsobení definície ProxMenux zobrazí, ako ju pochopil, ešte pred otázkami na VMID, zdroje a úložisko.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Analyzovať",
"body": "Načítajú sa služby, obraz, porty, cesty, prostredie, zariadenia, zabezpečenie a kontroly stavu."
},
{
"title": "Overiť obraz v registri",
"body": "Obraz musí existovať v registri a zobrazia sa jeho publikované architektúry. Súkromný register sa načíta pomocou účtu uloženého pre daný register."
},
{
"title": "Uviesť nepoužité voľby",
"body": "Vypíšu sa štítky, siete Docker, nastavenia Swarm a ďalšie kľúče, ktoré nemajú na LXC vplyv."
},
{
"title": "Zablokovať voľby bez bezpečného ekvivalentu",
"body": "Kľúče bez bezpečného ekvivalentu sa zobrazia v časti <strong>Voľby bez ekvivalentu</strong> a inštalácia nepokračuje. Žiadny sa nevynechá bez upozornenia."
},
{
"title": "Vyžiadať tajné údaje",
"body": "Premenné, ktorých názov označuje heslo, token alebo kľúč, sa pri inštalácii vyžiadajú ako citlivé údaje."
}
]
}
},
{
"figure": {
"src": "/oci-manager/custom-review.png",
"alt": "Súhrn interpretácie súboru Compose v ProxMenux",
"caption": "Súhrn zobrazený pred otázkami na VMID a zdroje."
}
},
{
"p": "Po potvrdení súhrnu nasleduje rovnaký postup ako v katalógu: názov, predvolený alebo rozšírený režim, VMID, CPU, pamäť, sieť, spúšťanie s uzlom, trvalé a ďalšie cesty, kompatibilné zariadenia a záverečný súhrn."
}
]
},
{
"id": "examples",
"title": "Príklady vstupu",
"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": "Ručne napísaný oci-compose",
"intro": "oci-compose je súbor JSON, z ktorého sa inštaluje aplikácia. Katalóg uchováva jeden pre každú aplikáciu. Rovnaký formát možno napísať ručne a nainštalovať touto voľbou.",
"blocks": [
{
"p": "V ručne napísanom súbore autor určí obraz, porty, premenné, zväzky a otázky pri inštalácii. ProxMenux pri načítaní doplní zvyšok. Formát vyjadrí aj to, čo Compose neobsahuje: text otázky, heslo vytvorené pri inštalácii, profil GPU, vlastníka každého zväzku, kontrolu prvého spustenia alebo prihlasovacie údaje zobrazené na konci."
},
{
"steps": {
"items": [
{
"title": "Overiť",
"body": "Súbor s chybami sa nenainštaluje. Každá chyba označí príslušné pole; pri neplatnom JSON sa uvedie riadok a stĺpec."
},
{
"title": "Skontrolovať",
"body": "Platný súbor zobrazí, čo nainštaluje: obraz, webovú adresu, porty, trvalé cesty, premenné požadované pri inštalácii a súbory, ktoré zapíše."
},
{
"title": "Nainštalovať",
"body": "Inštalácia je rovnaká ako pri aplikáciách katalógu, s predvolenými alebo rozšírenými nastaveniami."
}
]
}
},
{
"calloutWarning": {
"title": "Súbor, ktorý určuje oprávnenia",
"body": "oci-compose určuje, čo sa v kontajneri pripojí a s akými oprávneniami. Kontrola to ukáže pred inštaláciou: používajte iba súbory z dôveryhodných zdrojov."
}
},
{
"p": "Formát je opísaný po blokoch s dvoma úplnými príkladmi v <readmeLink>README enginu OCI</readmeLink>. Rovnakým spôsobom možno načítať aj záznam inštalácie: použije sa iba pôvodná šablóna, nie odpovede z danej inštalácie."
}
]
},
{
"id": "private-registries",
"title": "Obrazy v súkromných registroch",
"intro": "Obraz zo súkromného registra, napríklad súkromný balík GitHub alebo repozitár Docker Hub, sa načíta pomocou účtu uloženého v ProxMenux.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Register odmietne prístup k obrazu",
"body": "Ak register oznámi, že obraz vyžaduje účet, kontrola ponúkne prihlásenie a potom obraz načíta znova."
},
{
"title": "Prihlásiť sa",
"body": "Používateľské meno a heslo alebo token s oprávnením na stiahnutie obrazu. Register ich overí a uložia sa iba pri úspešnom overení."
},
{
"title": "Nainštalovať a udržiavať aktuálne",
"body": "Účet sa použije na stiahnutie obrazu pri inštalácii aj pri aktualizáciách, úpravách, opätovnom vytvorení, vo watchdogu a pri kontrole aktualizácií Monitora na ľubovoľnom uzle klastra."
}
]
}
},
{
"p": "<strong>Účty registrov</strong> v hlavnom menu OCI manager Apps zobrazujú uložené účty podľa registra a používateľa, nikdy nie ich tajné údaje. Z každého účtu možno overiť, stiahnuť alebo nainštalovať obraz a aktualizovať alebo odstrániť prihlasovacie údaje."
},
{
"list": {
"items": [
"GitHub (<code>ghcr.io</code>): používateľ je účet GitHub a heslo je osobný prístupový token s oprávnením <code>read:packages</code>.",
"Docker Hub (<code>docker.io</code>): používateľ je účet Docker Hub a heslo je prístupový token s oprávnením na čítanie.",
"Ostatné registre, aj s vlastným portom, napríklad <code>registry.example.com:5000</code>: používateľské meno a heslo alebo token poskytnuté daným registrom."
]
}
},
{
"calloutInfo": {
"title": "Kde sa účty ukladajú",
"body": "V <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, ktorý môže čítať iba root, v rovnakom adresári ako heslá úložísk Proxmox. <code>/etc/pve</code> zdieľajú všetky uzly klastra, preto sa účet pridaný na jednom uzle používa na všetkých. Záloha hostiteľa tento súbor obsahuje a odinštalovanie ProxMenux ho odstráni zo všetkých uzlov."
}
}
]
},
{
"id": "limits",
"title": "Definície, ktoré sa nenainštalujú",
"blocks": [
{
"list": {
"items": [
"Dockerfile bez publikovaného obrazu: obraz sa musí najprv zostaviť a zverejniť v registri OCI.",
"Súbor Compose s viacerými službami sa zablokuje, pretože táto voľba inštaluje iba jednu službu do jedného kontajnera, aj keď viaceré služby používajú rovnaký obraz.",
"<code>configs</code>, externé tajné údaje alebo formáty zariadení, ktoré nemožno jednoznačne prispôsobiť.",
"Nahradenia shellu, napríklad <code>$(command)</code>: namiesto nich treba zapísať výslednú hodnotu.",
"Nerozpoznané voľby <code>docker run</code> a <code>--env-file</code>: namiesto nich použite súbor Compose s výslovne uvedenými hodnotami."
]
}
}
]
}
]
}
@@ -0,0 +1,392 @@
{
"meta": {
"title": "Zariadenia a zrýchlenie ProxMenux",
"description": "Ako OCI manager Apps sprístupňuje GPU, NVIDIA, Coral, USB, FUSE a ďalšie zariadenia kontajneru OCI ako overené natívne zdroje Proxmox VE."
},
"header": {
"title": "Zariadenia a akcelerácia",
"description": "GPU, NVIDIA, Coral, USB, FUSE a blokové zariadenia sa stávajú overenými natívnymi zdrojmi Proxmox VE pre kontajner.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "principle",
"title": "Zariadenie, ktoré aplikácia potrebuje, nie celý hostiteľ",
"blocks": [
{
"p": "Zariadenie požadované súborom Compose alebo aplikačným profilom sa stáva konkrétnou položkou <code>devN</code> alebo LXC pripojením. Požiadanie o GPU, USB zariadenie alebo Coral nerobí kontajner privilegovaným."
},
{
"flow": {
"nodes": [
{
"label": "Inventár hostiteľa",
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
},
{
"label": "ProxMenux",
"detail": "výrobca a\noverenie oprávnení"
},
{
"label": "LXC",
"detail": "rovnaké zariadenie\nefektívne GID"
}
]
}
}
]
},
{
"id": "origin",
"title": "Odkiaľ pochádza požiadavka na zariadenie",
"blocks": [
{
"table": {
"headers": [
"Zdroj",
"Čo sa číta",
"Čo robí inštalátor"
],
"rows": [
[
"Docker Compose",
"<code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> a NVIDIA žiadosti",
"Každá požiadavka sa stáva požiadavkou zariadenia zobrazenou na preskúmanie"
],
[
"Katalógový profil",
"Podpora GPU, Coral, OpenCL, USB alebo FUSE, ktorú aplikácia skutočne má",
"Ponúkajú sa len možnosti overené pre tento obraz"
],
[
"Metadáta a dokumentácia obrazu",
"VA-API, Selkies, LinuxServer mods alebo NVIDIA runtime",
"Pridávajú sa zdokumentované premenné a príprava"
],
[
"Výber užívateľa",
"iba CPU, Intel/AMD, OpenCL, NVIDIA alebo voliteľné zariadenie",
"Výber je uložený v inštančnej zmluve"
]
]
}
},
{
"calloutWarning": {
"title": "Zistené zariadenia sa nepripájajú automaticky",
"body": "Na hostiteľovi sa vytvorí inventár, ale ponúknu a pripoja sa len zariadenia deklarované v súbore Compose alebo kompatibilnom profile. GPU, USB adaptér či Coral prítomný na hostiteľovi sa nesprístupní každému LXC."
}
}
]
},
{
"id": "identify",
"title": "Ako sa identifikuje hostiteľské zariadenie",
"intro": "Pred úpravou LXC sa zariadenie číta na hostiteľovi a zodpovedá zvolenému profilu.",
"blocks": [
{
"table": {
"headers": [
"Typ",
"Identita",
"Overenie"
],
"rows": [
[
"Intel/AMD DRM",
"<code>/dev/dri/renderD*</code> a <code>/sys/class/drm/NODE/device/vendor</code>",
"Znakové zariadenie s výrobcom <code>0x8086</code> (Intel) alebo <code>0x1002</code> (AMD)"
],
[
"AMD OpenCL",
"Renderovací uzol a <code>/dev/kfd</code>, ak ho profil potrebuje",
"Existencia, typ, výrobca, oprávnenia a deklarovaná zlučiteľnosť"
],
[
"AMD ROCm",
"Renderovací uzol, <code>/dev/kfd</code> a generácia, ktorú výpočtový ovládač hlási v <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>",
"Generácia, pre ktorú obraz ROCm aplikácie obsahuje výpočtové jadrá — uvedené GPU RDNA2 a novšie — sa ponúkne bez úprav. Ostatné GPU týchto rodín, napríklad Radeon 680M a 780M, sa ponúkajú ako experimentálne a nikdy nie sú navrhnutou voľbou: ROCm ich oficiálne nepodporuje, aplikácia ich prezentuje ako generáciu danej rodiny (<code>HSA_OVERRIDE_GFX_VERSION</code>) a inštalátor pred stiahnutím väčšieho obrazu vyžiada potvrdenie. Staršia GPU, napríklad integrovaná grafika Ryzen 5000U, sa neponúkne a Immich ponechá rozpoznávanie na CPU."
],
[
"NVIDIA",
"<code>nvidia-smi</code> a <code>nvidia-container-cli</code>",
"GPU, UUID, PCI bus, verzia ovládača, Toolkit, uzly <code>/dev/nvidia*</code>, binárne súbory a knižnice"
],
[
"Coral PCIe/M.2",
"<code>/dev/apex_N</code> a jeho odkaz na <code>/sys/dev/char/MAJOR:MINOR</code>",
"Uzol znakového zariadenia, čísla major/minor, vlastník, GID a oprávnenia"
],
[
"USB a sériové",
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> alebo <code>/dev/bus/usb/BBB/DDD</code>",
"Uzol znakového zariadenia; pri USB aj výrobca, produkt a sériové číslo, ak ich sysfs zverejňuje"
],
[
"KVM, TUN, FUSE, video a generické SCSI",
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> alebo <code>/dev/sgN</code>",
"Podporovaná cesta, typ uzla a účinné práva"
],
[
"Optická mechanika",
"<code>/dev/srN</code>",
"Blokové zariadenie"
]
]
}
}
]
},
{
"id": "install",
"title": "Čo sa stane počas inštalácie",
"blocks": [
{
"steps": {
"items": [
{
"title": "Šablóna ponúka svoje profily",
"body": "Napríklad len CPU, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL alebo NVIDIA. Možnosti patria k obrazu, nie k spoločnému menu."
},
{
"title": "Vyberie sa profil",
"body": "Určuje uzly zariadení, prostredie, mody alebo runtime, ktoré aplikácia potrebuje."
},
{
"title": "Navrhuje sa cesta",
"body": "Pre DRM, <code>/dev/dri/renderD128</code>, ktoré môžu byť zmenené na hostiteľa s niekoľkými renderových uzlov. Pre USB alebo sériový je vybraný konkrétny uzol."
},
{
"title": "Overenie",
"body": "Existencia, typ, povolený výrobca, povolenia a GID sú kontrolované. Nesúlad zastaví operáciu."
},
{
"title": "Zapíše sa kontrakt",
"body": "Cesta, režim, GID, zápis a profil sa zaznamenávajú pre aktualizácie a opätovné vytvorenia."
},
{
"title": "Pripojenie a skúška",
"body": "<code>pct set</code> pridáva položku <code>devN</code> a prístup sa potom kontroluje vo vnútri LXC. LinuxServer obrazy sú tiež kontrolované ako používateľ <code>abc</code>."
}
]
}
}
]
},
{
"id": "config",
"title": "Ako sa objavuje v konfigurácii LXC",
"intro": "Ilustračné hodnoty: <code>dev0</code> a <code>dev1</code> sú voľné pozície priradené Proxmox VE. <code>renderD128</code>, <code>apex_0</code> a GID závisia od hardvéru uzla.",
"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": "Špecifické USB zariadenie",
"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": "GID sa načíta na hostiteľovi pomocou <code>stat</code> a zapíše do položky <code>devN</code>; nepredpokladá sa, že skupiny <code>render</code> a <code>video</code> majú pevné číslo. Zariadenie má v LXC rovnakú cestu <code>/dev</code>, na ktorej ho vyhľadávajú vlastné mechanizmy aplikácie."
}
]
},
{
"id": "profiles",
"title": "Profily, ktoré môže obraz ponúknuť",
"blocks": [
{
"table": {
"headers": [
"Profil",
"Výsledná konfigurácia",
"Ponúknuté, keď"
],
"rows": [
[
"Intel/AMD VA-API",
"Renderovací uzol <code>/dev/dri</code>",
"Aplikácia podporuje video zrýchlenie"
],
[
"OpenCL",
"Render uzol, <code>/dev/kfd</code> v prípade potreby a oficiálny mod",
"Obraz alebo profil ho dokumentuje"
],
[
"NVIDIA",
"Zariadenia a knižnice ovládača na hostiteľovi",
"Hostiteľ má funkčný ovládač a NVIDIA Container Toolkit"
],
[
"Coral",
"<code>/dev/apex_0</code> alebo zbernica USB",
"Profil vyhlasuje Coral podporu (Frigate)"
],
[
"USB, sériové, FUSE",
"Jediné zariadenie, validovaný strom alebo funkcia LXC",
"Zmluva o ňu žiada"
]
]
}
}
]
},
{
"id": "nvidia",
"title": "NVIDIA",
"blocks": [
{
"calloutWarning": {
"title": "Požiadavka na uzol: NVIDIA Container Toolkit",
"body": "Funkčný ovládač na Proxmox VE nestačí na sprístupnenie GPU NVIDIA obrazu OCI. OCI manager Apps používa <code>nvidia-container-cli</code> zo súpravy NVIDIA Container Toolkit na identifikáciu zariadení a získanie binárnych súborov a knižníc zodpovedajúcich načítanému ovládaču."
}
},
{
"p": "<nvidiaLink>Inštalátor NVIDIA nástroja ProxMenux</nvidiaLink> nainštaluje NVIDIA Container Toolkit z oficiálneho repozitára NVIDIA spolu s ovládačom. Skontroluje jeho štyri balíky, overí <code>nvidia-container-cli</code> a zaznamená výsledok do denníka zmien <auditLink>Audit a správa</auditLink>."
},
{
"p": "Tieto dva príkazy na hostiteľovi ukazujú, či je k dispozícii ovládač a súbor nástrojov:"
},
{
"shell": {
"code": "nvidia-smi -L\nnvidia-container-cli --version"
}
},
{
"p": "Na hostiteľovi, kde bol ovládač nainštalovaný inými prostriedkami, je Toolkit nainštalovaný z oficiálneho stabilného úložiska:"
},
{
"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": "Inventár, ktorý používa OCI manager Apps, je výstupom príkazu:"
},
{
"shell": {
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
}
},
{
"calloutInfo": {
"title": "Konfigurácia Runtime Docker nie je zahrnutá",
"body": "Kontajnery sú natívne LXC a nepoužívajú démona Docker, takže <code>nvidia-ctk runtime configure --runtime=docker</code> nehrá žiadnu úlohu: ProxMenux priamo volá <code>nvidia-container-cli</code> a zapíše zariadenia a pripojenia LXC. Príkazy a podporované platformy sú uvedené v <toolkitLink>návode na inštaláciu NVIDIA Container Toolkit</toolkitLink>."
}
},
{
"cards": {
"items": [
{
"icon": "cpu",
"title": "Inventár z ovládača",
"body": "<code>nvidia-container-cli</code> uvádza uzly zariadenia, binárne súbory, firmware a knižnice nainštalovaného ovládača."
},
{
"icon": "refresh",
"title": "Bez pevnej verzie",
"body": "Šablóna nepomenuje súbory knižnice. Profil je generovaný z aktuálneho hostiteľa."
},
{
"icon": "shield",
"title": "Pripojenia iba na čítanie",
"body": "Hostiteľské knižnice sú namontované iba na čítanie namiesto kopírovania do kontajnera."
},
{
"icon": "hardDrive",
"title": "Zmeny ovládača",
"body": "Po zmene ovládača sa inventár znovu vygeneruje pred začiatkom postihnutých LXC."
}
]
}
},
{
"code": {
"title": "Výsledok NVIDIA (zjednodušený)",
"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": "Sprístupniť len <code>/dev/nvidia0</code> nestačí. Komponenty užívateľského priestoru načítaného ovládača sú namontované len na čítanie a <code>nvidia-smi</code> potom beží vnútri LXC pre porovnanie GPU, UUID, PCI zbernice a verzie s inventárom hostiteľa."
}
]
},
{
"id": "usb",
"title": "USB, sériové a USB Coral",
"blocks": [
{
"calloutWarning": {
"title": "Číslovanie USB sa môže zmeniť",
"body": "Cesta ako <code>/dev/bus/usb/003/004</code> sa môže zmeniť po opätovnom pripojení zariadenia alebo reštarte hostiteľa. Profil zaznamená výrobcu, produkt a sériové číslo, ak sú dostupné, ale nová adresa zbernice sa automaticky nepremapuje."
}
},
{
"p": "Periférne zariadenie je daný jeho konkrétnym uzlom: <code>/dev/ttyUSB0</code>, <code>/dev/ttyACM0</code>, <code>/dev/apex_0</code> alebo <code>/dev/bus/usb/BBB/DDD</code>. Sprístupnenie celého <code>/dev</code> nie je akceptovaný. Coral je ponúkaný len pre aplikácie, ktorých profil deklaruje."
}
]
},
{
"id": "trees",
"title": "Stromy zariadení a funkcie LXC",
"blocks": [
{
"table": {
"headers": [
"Žiadosť",
"Výsledná konfigurácia",
"Rozsah"
],
"rows": [
[
"<code>/dev/dvb</code>, <code>/dev/snd</code> alebo <code>/dev/bus/usb</code>",
"Každý uzol znakového zariadenia v strome dostane vlastnú položku <code>devN</code> s režimom a GID hostiteľa",
"Len požadovaný strom, nie zvyšok <code>/dev</code>"
],
[
"<code>/dev/fuse</code>",
"Uzol a, keď ho profil potrebuje, funkcia <code>fuse=1</code>",
"Samotná FUSE nepublikuje pripojenia do iných LXC"
],
[
"<code>/dev/net/tun</code>",
"Položka <code>devN</code> s rovnakou cestou vo vnútri LXC",
"VPN alebo konfigurácia siete zostáva v aplikácii"
],
[
"<code>/dev/kvm</code>",
"Potvrdená položka <code>devN</code>",
"Ponúkané iba vtedy, keď o to zmluva požiada"
]
]
}
}
]
},
{
"id": "security",
"title": "Potvrdenie podľa úrovne rizika",
"blocks": [
{
"p": "Konkrétne zariadenia, voliteľné privilégium, požadované privilégium, AppArmor alebo seccomp relaxácia a prístup k mennému priestoru PID hostiteľa sa považujú za samostatné prípady, nie pod jedným generickým privilegovaným označením. Každá možnosť s rizikom sa vysvetľuje a potvrdzuje počas inštalácie."
}
]
}
]
}
+213
View File
@@ -0,0 +1,213 @@
{
"meta": {
"title": "OCI manager Apps | ProxMenux",
"description": "Spúšťajte oficiálne obrazy OCI ako natívne kontajnery LXC v Proxmox VE, s trvalými údajmi, prístupom k zariadeniam, aplikáciami s viacerými kontajnermi a transakčnými aktualizáciami."
},
"header": {
"title": "OCI manager Apps",
"description": "Oficiálne obrazy OCI bežia ako natívne kontajnery LXC v Proxmox VE. Používa sa rovnaký obraz, aký zverejňuje jeho správca; ProxMenux vytvorí prostredie, ktoré by okolo neho pripravil Docker Compose.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "model",
"blocks": [
{
"calloutInfo": {
"title": "Jeden obraz OCI, jeden natívny LXC",
"body": "V kontajneroch nebeží Docker Engine. Proxmox VE importuje súborový systém obrazu a jeho metadáta OCI. Aplikácia sa stane hlavným procesom natívneho LXC, ktorý sa spravuje rovnakými nástrojmi ako ostatné kontajnery uzla."
}
},
{
"flow": {
"nodes": [
{
"label": "Zdroj",
"detail": "Obraz OCI\nCompose a dokumentácia"
},
{
"label": "ProxMenux",
"detail": "Kontrakt JSON\noverenie a plánovanie"
},
{
"label": "Proxmox VE",
"detail": "Natívny LXC\nzväzky a zariadenia"
}
],
"caption": "Používa sa pôvodná aplikácia; jej prostredie sa deklaratívne opíše a následne znovu vytvorí."
}
}
]
},
{
"id": "where",
"title": "Kde ho nájdete",
"intro": "Na uzle Proxmox otvorte ako root položku <strong>OCI manager Apps (Technology Preview)</strong> v hlavnom menu ProxMenux. Úvodná obrazovka ponúka:",
"blocks": [
{
"list": {
"items": [
"<strong>Vyhľadať aplikácie</strong> – vyhľadávanie podľa názvu v celom katalógu.",
"<strong>Všetky aplikácie</strong> – úplný katalóg s počtom aplikácií.",
"<strong>Spravovať nainštalované aplikácie OCI</strong> – aktualizovať, upravovať, odstraňovať alebo obnovovať existujúce inštalácie.",
"<strong>Účty registrov</strong> – správa účtov na inštaláciu a aktualizáciu obrazov zo súkromných registrov.",
"<strong>Nainštalovať obraz mimo katalógu</strong> – prispôsobiť súbor Compose, príkaz <code>docker run</code> alebo odkaz na obraz.",
"Kategórie katalógu, každá s počtom aplikácií."
]
}
},
{
"figure": {
"src": "/oci-manager/main-menu.png",
"alt": "Hlavná obrazovka OCI manager Apps s vyhľadávaním, úplným katalógom, správou aplikácií, obrazmi mimo katalógu a kategóriami.",
"caption": "Hlavná obrazovka OCI manager Apps."
}
},
{
"p": "Po výbere aplikácie sa zobrazí jej opis, používaný obraz a dva režimy inštalácie. <strong>Inštalovať s predvolenými nastaveniami</strong> sa pýta len na základné voľby: úložisko, umiestnenie údajov, adresu a spustenie. <strong>Inštalovať s rozšírenými nastaveniami</strong> postupne prejde všetky rozhodnutia: VMID a zdroje, úložisko pre každú cestu, sieťový most a zariadenia."
},
{
"p": "Aplikácie, ktoré boli skutočne otestované, majú v tomto zobrazení označenie <strong>Overené</strong> a v zoznamoch značku ✓. Platí to pre testy v laboratóriu ProxMenux aj pre testy komunity."
}
]
},
{
"id": "beta",
"title": "Prečo má označenie Technology Preview",
"blocks": [
{
"p": "OCI manager Apps ponecháva označenie <strong>Technology Preview</strong>, ktoré Proxmox VE používa pre aplikačné kontajnery vytvorené z obrazov OCI. Ich podpora bola zavedená v Proxmox VE 9.1. Označenie sa týka technológie, na ktorej OCI manager Apps beží, nie jadra ProxMenuxu: správanie týchto kontajnerov sa ešte môže meniť medzi vydaniami Proxmox VE. Označenie zostane, kým Proxmox VE túto podporu neoznačí za stabilnú."
},
{
"p": "Funkcie OCI manager Apps sa testujú v laboratóriu ProxMenux: inštalácia, aktualizácia, úpravy, opätovné vytvorenie, zálohovanie, obnova, migrácia a watchdog. Každá aplikácia sa overuje samostatne. Skutočne otestované aplikácie majú označenie <strong>Overené</strong> a v zoznamoch značku ✓."
}
]
},
{
"id": "translation",
"title": "Ako Docker opisuje požiadavky a OCI manager Apps ich realizuje",
"blocks": [
{
"table": {
"headers": [
"Požiadavka",
"Vyjadrenie v Dockeri",
"Realizácia v OCI manager Apps"
],
"rows": [
[
"Spustiť aplikáciu",
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
"Rootfs obrazu OCI a hlavný proces LXC"
],
[
"Zachovať konfiguráciu",
"<code>volumes: /config</code>",
"Trvalý zväzok <code>mpN</code> zahrnutý do zálohy alebo adresár na hostiteľovi."
],
[
"Sprístupniť službu",
"<code>ports</code>",
"Vlastná adresa pre LXC a URL na prístup k službe."
],
[
"Použiť hardvér",
"<code>devices</code>, <code>group_add</code>",
"Záznamy <code>devN</code> s efektívnym GID hostiteľa a overeným profilom."
],
[
"Prepojiť závislosti",
"<code>networks</code>, <code>depends_on</code>",
"Súkromný sieťový most, pevné adresy, poradie spúšťania a kontroly stavu."
],
[
"Aktualizovať",
"Stiahnuť cez <code>pull</code> a znovu vytvoriť",
"Nový rootfs so zachovaným kontraktom trvalých údajov."
]
]
}
}
]
},
{
"id": "kept",
"title": "Čo zostáva a čo sa mení",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Zachované",
"body": "Oficiálny obraz, jeho vnútorné cesty, prostredie, proces spustenia a dokumentácia používania."
},
{
"icon": "boxes",
"title": "Prispôsobené",
"body": "Prostredie behu: sieť, trvalé údaje, zariadenia, oprávnenia a závislosti využívajú natívne mechanizmy LXC v Proxmox VE."
},
{
"icon": "shield",
"title": "Bez ekvivalentu",
"body": "Voľba Compose bez bezpečného ekvivalentu sa označí ako prekážka inštalácie. Šablóny s takými prekážkami sa na inštaláciu neponúkajú a citlivé voľby vyžadujú potvrdenie v sprievodcovi."
},
{
"icon": "refresh",
"title": "Uložené",
"body": "Digest obrazu, zdroje, cesty, sieť, zariadenia a príslušnosť k zostave sa ukladajú do kontraktu inštancie. Aktualizácie aj opätovné vytvorenie tento kontrakt zachovávajú."
}
]
}
}
]
},
{
"id": "pages",
"title": "Stránky tejto časti",
"blocks": [
{
"next": {
"items": [
{
"label": "Ako sa prispôsobí obraz OCI",
"href": "/docs/oci-manager/architecture",
"tail": "Od obrazu a jeho súboru Compose k natívnemu LXC."
},
{
"label": "Inštalácia obrazu mimo katalógu",
"href": "/docs/oci-manager/custom-image",
"tail": "Súbor Compose, príkaz docker run alebo odkaz na obraz."
},
{
"label": "Údaje, cesty a sieť",
"href": "/docs/oci-manager/storage-network",
"tail": "Zväzky kontajnera, adresáre hostiteľa, pripojenia cez rclone a adresy."
},
{
"label": "Zariadenia a akcelerácia",
"href": "/docs/oci-manager/hardware",
"tail": "GPU, NVIDIA, Coral, USB a ďalšie zariadenia."
},
{
"label": "Aplikácie s viacerými kontajnermi",
"href": "/docs/oci-manager/stacks",
"tail": "Aplikácia, databáza a vyrovnávacia pamäť v koordinovaných LXC."
},
{
"label": "Inštalácia, aktualizácia a úpravy",
"href": "/docs/oci-manager/lifecycle",
"tail": "Kontrakt inštancie a operácie s ním."
},
{
"label": "V ProxMenux Monitor",
"href": "/docs/oci-manager/monitor",
"tail": "Verzie, aktualizácie, výstup konzoly a terminál."
}
]
}
}
]
}
]
}
@@ -0,0 +1,499 @@
{
"meta": {
"title": "Inštalácia, aktualizácia a úpravy | ProxMenux",
"description": "Kontrakt inštancie kontajnera OCI a operácie, ktoré ho používajú: aktualizácia, úprava, odstránenie, zotavenie z prerušenej operácie a obnovenie prevádzky po obnove zo zálohy na tomto alebo inom hostiteľovi."
},
"header": {
"title": "Inštalácia, aktualizácia a úpravy",
"description": "Každá inštancia uchováva reprodukovateľný kontrakt, takže jej rootfs možno nahradiť bez straty konfigurácie alebo trvalých dát.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "contract",
"title": "Kontrakt inštancie",
"blocks": [
{
"p": "Po inštalácii sa výsledná konfigurácia uloží do <code>/usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json</code>. Nejde o kópiu pôvodného súboru Compose: je to reprodukovateľný kontrakt kontajnera LXC, ktorý existuje na tomto hostiteľovi."
},
{
"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": "Kópia kontraktu sa nachádza v kontajneri v <code>/.proxmenux/oci-record.json</code> a môže ju čítať iba používateľ root kontajnera. Záloha kontajnera preto vždy obsahuje kontrakt platný v čase zálohovania. Druhá kópia je uložená v <code>/etc/pve/priv/proxmenux/oci</code>, ktorý zdieľajú všetky uzly klastra a môže ho čítať iba root hostiteľa. Obe kópie sa zapisujú po každej inštalácii, aktualizácii a zmene."
}
]
},
{
"id": "manage",
"title": "Spravovať nainštalované aplikácie OCI",
"intro": "Táto možnosť na hlavnej obrazovke zobrazí registrované inštancie s ich aplikáciou a obrazom. Pred každou akciou sa každá inštancia porovná so svojím kontraktom; CT, ktorý už nezodpovedá svojmu záznamu, sa neupraví ani neodstráni. Rovnaká aktualizácia a rovnaký editor sú dostupné na karte Aktualizácie v <monitorLink>ProxMenux Monitor</monitorLink>.",
"blocks": [
{
"table": {
"headers": [
"Možnosť",
"Čo sa zmení?",
"Čo sa uchováva"
],
"rows": [
[
"Aktualizovať obraz pomocou uloženej konfigurácie",
"Rootfs sa nahradí obrazom, ktorý uložený kanál aktuálne publikuje",
"Zmluva, kontajnerové disky, hostiteľské adresáre, siete a zariadenia"
],
[
"Upraviť: upraviť zdroje, sieť, cesty a GPU",
"Editor sa otvorí s aktuálnym kontraktom; CT sa znova vytvorí so zmenami",
"Dáta kontajnerových diskov a hostiteľských adresárov"
],
[
"Watchdog: reštartovať aplikáciu pri havárii",
"Určuje, či sa aplikácia znova spustí, keď sa sama zastaví. Nič sa nevytvára znova",
"Celá inštalácia; len voľba je uložená v zmluve"
],
[
"Odstrániť: odstrániť aplikáciu a jej kontajnery",
"LXC alebo všetci členovia zostavy a ich kontrakty sa odstránia",
"Hostiteľské adresáre s obsahom"
]
]
}
},
{
"p": "Pre aplikáciu s viacerými kontajnermi menu ponúka <strong>Aktualizovať všetky kontajnery aplikácie</strong>, <strong>Upraviť ďalšie cesty a zariadenia</strong>, <strong>Znovu vytvoriť všetky kontajnery s uloženou konfiguráciou</strong>, watchdog a odstránenie. Úprava pridáva alebo odstraňuje ďalšie cesty a zariadenia aplikačného kontajnera bez opätovného vytvárania. V Immich tiež mení zariadenie, ktoré vykonáva rozpoznávanie. Opätovné vytvorenie zostaví každý kontajner z pôvodne nainštalovaného obrazu bez vyhľadávania novšieho."
},
{
"figure": {
"src": "/oci-manager/manage-menu.png",
"alt": "Zoznam nainštalovaných aplikácií OCI s možnosťami aktualizácie, úpravy a odstránenia",
"caption": "Spravovať nainštalované aplikácie OCI."
}
}
]
},
{
"id": "update",
"title": "Transakčná aktualizácia",
"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": "Používateľ",
"registry": "Register OCI",
"update": "Aktualizovať inštanciu",
"resolve": "Zistiť obraz podľa značky",
"verify": "Overiť archív a vykonať predbežné kontroly",
"backup": "Zastaviť a zálohovať CT",
"import": "Importovať nové rootfs",
"reapply": "Znova použiť kontrakt",
"healthy": "v poriadku",
"failure": "zlyhanie",
"commit": "Kontrakt zverejnený s novým digestom",
"restored": "Predchádzajúca inštancia obnovená"
}
}
},
{
"list": {
"items": [
"Ak register stále poskytuje nainštalovaný digest, nič sa nesťahuje a inštancia zostáva nezmenená.",
"Nový obraz sa overí vrstvu po vrstve ešte pred zastavením CT. Poškodené stiahnutie sa zopakuje druhýkrát; obraz už uložený vo vyrovnávacej pamäti, ktorý neprejde kontrolou, sa stiahne znova.",
"Nastavenia zmenené v Proxmox VE po inštalácii (pamäť, swap, jadrá, limit CPU, priorita CPU, spustenie spolu s uzlom) sa zachovajú a prenesú do nového kontraktu.",
"Rozhranie LAN, ktoré pridáva súprava Arr a aplikácie s viacerými kontajnermi (<code>net1</code>), aj poradie spúšťania (<code>startup</code>) sa bez zmeny prenesú do nového kontajnera.",
"Akýkoľvek iný rozdiel medzi CT a jeho zmluvou zastaví aktualizáciu pred zastavením CT."
]
}
},
{
"flow": {
"nodes": [
{
"label": "Pred",
"detail": "rootfs A\n/config mp0\n/media hostiteľský adresár"
},
{
"label": "Aktualizácia",
"detail": "nahradí iba\nrootfs"
},
{
"label": "Po",
"detail": "rootfs B\n/config mp0\n/media hostiteľský adresár"
}
]
}
},
{
"p": "Pred zastavením čohokoľvek sa overí dostatok miesta pre zálohu: využité dáta na zálohovaných zväzkoch plus rezerva. Záloha sa zapisuje vedľa záznamu aplikácie na systémový disk hostiteľa. Ak tam nie je dosť miesta, ponuka vyžiada iné úložisko hostiteľa podporujúce zálohy. Záloha sa vytvorí tam a po skončení operácie sa odstráni. Výber sa zapamätá pre danú aplikáciu aj pre plánované aktualizácie. Ak žiadne úložisko nemá dosť miesta, operácia sa odmietne a aplikácia zostane nezmenená. Rovnako sa pred stiahnutím overí miesto pre nový obraz."
}
]
},
{
"id": "recovery",
"title": "Zotavenie z prerušenej operácie",
"intro": "Aktualizácia aj úprava používajú trvalo uloženú transakciu. Ak sa proces, terminál alebo uzol preruší po zastavení CT, operácia sa nepovažuje za dokončenú.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Značka nedokončenej operácie",
"body": "Keď sa otvorí správa nainštalovaných aplikácií OCI, uložený stav ukazuje, že výmena nebola nikdy zverejnená."
},
{
"title": "Zobraziť stav",
"body": "Zobrazí dosiahnutú fázu bez zmeny kontajnerov alebo dát."
},
{
"title": "Obnoviť predchádzajúcu inštaláciu",
"body": "Obnoví overenú natívnu zálohu vytvorenú pred výmenou aj predchádzajúci kontrakt."
},
{
"title": "Zostavy ako celok",
"body": "V prípade aplikácie s viacerými kontajnermi je každý člen obnovený z rovnakého transakčného bodu, nielen z vybraného."
}
]
}
},
{
"calloutWarning": {
"title": "Hostiteľské adresáre sú mimo návratu do pôvodného stavu",
"body": "Záloha zahŕňa rootfs a disky kontajnera, ktoré sú do nej zahrnuté. Hostiteľský adresár sa nevracia do predchádzajúceho stavu, pretože jeho dáta môžu používať iné kontajnery LXC."
}
}
]
},
{
"id": "watchdog",
"title": "Watchdog: reštartovanie aplikácie, ktorá sa zastaví",
"intro": "Proxmox nemá politiku reštartovania: keď sa proces aplikačného kontajnera skončí, kontajner zostane zastavený. Pri zapnutom watchdogu sa aplikácia, ktorá sa sama zastaví, znova spustí. Pre aplikáciu OCI zabezpečuje to, čo <code>restart: unless-stopped</code> v súbore Compose.",
"blocks": [
{
"table": {
"headers": [
"Čo sa stane?",
"So zapnutým watchdogom"
],
"rows": [
[
"Aplikácia havaruje alebo jej proces končí",
"Kontajner sa znova spustí do niekoľkých sekúnd"
],
[
"Zastaví sa alebo vypne cez Proxmox, Monitor alebo pomocou <code>pct</code>",
"Zostane zastavený, kým ho niekto nespustí"
],
[
"Pracuje na tom záloha, migrácia alebo operácia ProxMenux",
"Nič sa nerobí, kým to neskončí."
],
[
"Bol už zastavený pri spustení hostiteľa",
"Zostane zastavený; rozhoduje o tom <strong>Spustiť s Proxmox</strong>"
],
[
"Opakovane sa zastavuje hneď po spustení",
"Aplikácia, ktorá sa zastaví v priebehu niekoľkých sekúnd po spustení alebo sa nespustí vôbec, sa skúsi spustiť päťkrát s odstupmi 30 sekúnd, 1, 2 a 5 minút. Potom zostane zastavená a odošle sa oznámenie"
]
]
}
},
{
"p": "Inštalátor sa na túto možnosť pýta v oboch režimoch inštalácie a navrhuje hodnotu uvedenú v recepte aplikácie. Neskôr sa mení cez <strong>Spravovať nainštalované aplikácie OCI</strong> alebo prepínačom <strong>Watchdog</strong> kontajnera v <monitorLink>ProxMenux Monitor</monitorLink> a platí pre všetky kontajnery aplikácie. Jediná služba hostiteľa, <code>proxmenux-oci-watchdog.service</code>, sleduje všetky aplikácie, ktoré si to vyžiadali; jej inštalácia je uvedená na karte Zmeny v Audit & Report."
},
{
"calloutInfo": {
"title": "Čo hostiteľ nevie povedať",
"body": "Návratový kód aplikácie sa k hostiteľovi nedostane, takže riadne ukončenie a pád vyzerajú rovnako a v oboch prípadoch nasleduje reštart, podobne ako pri <code>always</code> a <code>unless-stopped</code> v Dockeri. Zastavenie vyžiadané mimo Proxmox pomocou <code>lxc-stop</code> alebo <code>systemctl</code> nevytvorí úlohu zastavenia a považuje sa za samovoľné zastavenie."
}
}
]
},
{
"id": "restore",
"title": "Zálohovanie, obnova a ďalší hostiteľ",
"intro": "Záloha vytvorená pomocou vzdump alebo Proxmox Backup Server obsahuje kontajner, disky kontajnera vybrané na zálohovanie a kópiu jeho kontraktu. To, čo inštalácia uchováva na hostiteľovi, do nej nepatrí. <strong>Spravovať nainštalované aplikácie OCI</strong> rozpozná kontajnery obnovené na hostiteľovi, ktorý nemá ich kontrakt, napríklad po novej inštalácii Proxmox alebo na inom hostiteľovi, a ponúkne ich opätovnú registráciu.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Obnoviť kontajnery v Proxmoxe",
"body": "Zo zálohovacieho úložiska, s pôvodným ID alebo ľubovoľným voľným ID. Aplikácia s viacerými kontajnermi potrebuje všetky svoje kontajnery."
},
{
"title": "Otvoriť Spravovať nainštalované aplikácie OCI",
"body": "Zobrazia sa obnovené kontajnery a ponúkne sa obnovenie. Tlačidlo <strong>Obnoviť</strong> na karte Aktualizácie <monitorLink>ProxMenux Monitor</monitorLink> otvorí rovnaké obnovenie."
},
{
"title": "Pred zmenou skontrolujte",
"body": "Obnova overí, či hostiteľ má všetko, čo každá aplikácia potrebuje. Aplikácia, ktorú nemožno obnoviť ako celok, zostane nezmenená a uvedie sa dôvod."
},
{
"title": "Registrácia a spustenie",
"body": "Kontrakt sa zaregistruje na tomto hostiteľovi a znova sa zapíše to, čo na ňom inštalácia uchovávala. Spustenie aplikácií je samostatná otázka, na ktorú treba odpovedať Nie, ak pôvodné kontajnery stále bežia na inom hostiteľovi."
}
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Dialóg, ktorý uvádza obnovené kontajnery a ponúka ich obnoviť",
"caption": "Obnova ponúknutá po otvorení Spravovať nainštalované aplikácie OCI."
}
},
{
"table": {
"headers": [
"Čo si hostiteľ nechal?",
"Po zotavení"
],
"rows": [
[
"Kontrakt inštancie",
"Zaregistruje sa z kópie v kontajneri, ktorá sa porovná s konfiguráciou obnovenou systémom Proxmox"
],
[
"Súkromná sieť multikontajnerovej aplikácie",
"Znova sa vytvorí s rovnakým mostom a podsieťou; pevné adresy kontajnerov sa nezmenia"
],
[
"Poradie spúšťania aplikácie s viacerými kontajnermi",
"Hookscript závislostí a jeho kontrakt sa znova nainštalujú; ak žiadne úložisko nepodporuje snippets, povolia sa na úložisku <code>local</code>"
],
[
"Sieťové sysctls a súbor host-monitor",
"Znova sa zapíšu do <code>/etc/pve/proxmenux</code>"
],
[
"Runtime NVIDIA",
"Hook neprivilegovaného kontajnera sa znova nainštaluje. Privilegovaný kontajner dostane súbory ovládača tohto hostiteľa namiesto súborov pôvodného hostiteľa"
],
[
"Pripojenie Rclone",
"Hookscript a programy, ktoré sprístupňujú pripojenie, sa znova zapíšu s rovnakými pohľadmi na hostiteľovi"
],
[
"Pravidlo firewallu hostiteľa pre monitor hostiteľa",
"Znova sa vyžiada súhlas pre webový port a podsieť mosta na tomto hostiteľovi"
],
[
"<code>lost+found</code> z každého obnoveného disku",
"Odstráni sa, ak je prázdny; obnova ho vytvorí a niektoré aplikácie sa nespustia, ak je medzi ich dátami"
],
[
"Disky obnovené na inom úložisku",
"Kontrakt sa aktualizuje podľa úložiska, na ktorom sa teraz nachádzajú"
]
]
}
},
{
"p": "Kontajner obnovený s iným ID si zachová svoju aplikáciu. Kontrakt, záznam konzoly, sieťové nastavenia sysctl, hookscript pripojenia Rclone a poradie spúšťania viackontajnerovej aplikácie sa zaregistrujú s ID, ktoré majú kontajnery na tomto hostiteľovi."
},
{
"table": {
"headers": [
"Čo bráni obnove",
"Čo urobiť"
],
"rows": [
[
"Chýba kontajner aplikácie s viacerými kontajnermi",
"Obnovte aj tento kontajner; aplikácia sa obnovuje ako celok"
],
[
"Súkromná podsieť sa už používa na tomto hostiteľovi",
"Obnova sa zruší a nič sa nezmení: adresy kontajnerov sú pevné a nepresúvajú sa do inej podsiete"
],
[
"Adresár hostiteľa neexistuje",
"Pripojiť alebo vytvoriť s jeho dátami; záloha kontajnera nezahŕňa adresáre hostiteľa"
],
[
"Zariadenie neexistuje na tomto hostiteľovi",
"Pripojte ho alebo ho odstráňte z kontajnera v Proxmox"
],
[
"Aplikácia s NVIDIA na hostiteľovi bez ovládača",
"Nainštalujte ovládač NVIDIA a Container Toolkit"
],
[
"Záloha bola vytvorená skôr, než existovala kópia kontraktu",
"Kontajner zostáva ako bežný LXC a nie je opäť ponúkaný"
]
]
}
},
{
"calloutInfo": {
"title": "Kontajner, ktorý sa vráti",
"body": "Kontajner obnovený s pôvodným ID zo staršej zálohy, vrátený do snímky alebo presunutý späť z iného uzla nesie kontrakt svojho aktuálneho stavu. Ak sa pri výbere na operáciu jeho kontrakt líši od kontraktu na tomto hostiteľovi, operácia sa nespustí a ponúkne sa obnova kontajnera."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Výsledok obnovy so súkromnou sieťou, poradím spúšťania a zaregistrovanými kontajnermi",
"caption": "Výsledok zotavenia, krok za krokom."
}
}
]
},
{
"id": "remove",
"title": "Odstránenie aplikácie OCI",
"blocks": [
{
"p": "Pred potvrdením je zostavený súhrn zo skutočnej konfigurácie: kontajnery, ktoré sú odstránené, údaje s nimi vymazané, súkromná sieť, ktorá je uvoľnená a hostiteľské adresáre, ktoré sú uchovávané. Potvrdenie je predvolene <strong>Nie</strong>, pretože údaje z vymazaných diskov nie je možné následne obnoviť."
},
{
"table": {
"headers": [
"Prostriedok",
"Po odstránení",
"Dôvod"
],
"rows": [
[
"rootfs a kontajnerové disky",
"Odstránia sa",
"Patria len do kontajnera."
],
[
"Adresár hostiteľa",
"Zachová sa aj s obsahom",
"Iné aplikácie ho môžu používať"
],
[
"Hostiteľské súbory kontajnera",
"Odstránia sa",
"Jeho záznam konzoly, sieťové parametre sysctl, hookscript pripojenia Rclone a registrácia na karte App v ProxMenux Monitor neslúžia žiadnemu inému kontajneru"
],
[
"Súbory zdieľané viacerými inštaláciami",
"Vymazané s poslednou inštaláciou, ktorá ich používa",
"Súbor monitora hostiteľa a hookscript závislostí aplikácií s viacerými kontajnermi"
],
[
"Kontrakt inštancie",
"Odstráni sa po úspešnom odstránení aplikácie",
"Už s ním nie je spojený žiadny CT"
],
[
"Súkromný most zostavy",
"Uvoľní sa spolu so zostavou",
"Nemá žiadnych členov na pripojenie"
],
[
"Sieť zdieľaná súpravou Arr",
"Uvoľní sa s poslednou aplikáciou súpravy",
"Každá aplikácia súpravy je nezávislá a odstraňuje sa samostatne"
],
[
"Jeden člen zostavy",
"Neodstránené samostatne",
"Odstráni sa celá aplikácia, aby nezostala neúplná zostava"
],
[
"Kontajner na inom uzle klastra",
"Neodstránené",
"Jeho záznam a súbory na hostiteľovi sú na uzle, kde bol nainštalovaný: odstráni sa tam po migrácii späť"
]
]
}
},
{
"figure": {
"src": "/oci-manager/remove-summary.png",
"alt": "Prehľad odstránenia s dotknutými kontajnermi, dátami a adresármi hostiteľa",
"caption": "Prehľad odstránenia, postavený z reálnej konfigurácie."
}
}
]
},
{
"id": "archives",
"title": "Stiahnuté obrazy a miesto na hostiteľovi",
"blocks": [
{
"p": "Archív OCI slúži na vytvorenie rootfs; bežiaci CT ho nečíta. Po inštalácii alebo aktualizácii sa zobrazia archívy stiahnuté počas danej operácie aj s ich veľkosťou a ponúkne sa ich odstránenie. Odstránením sa uvoľní miesto bez vplyvu na kontajner alebo jeho dáta."
},
{
"calloutInfo": {
"title": "Aktualizácie nepotrebujú archív",
"body": "Bez archívu aktualizácia vyrieši uložený kanál a stiahne nový digest. S ním sa archív znova použije iba vtedy, keď sa jeho referencia a integrita zhodujú s požadovaným."
}
}
]
},
{
"id": "registry",
"title": "Register a čistenie",
"blocks": [
{
"p": "Pri otvorení <strong>Spravovať nainštalované aplikácie OCI</strong> sa najskôr odstránia pozostatky kontajnerov, ktoré už neexistujú na žiadnom uzle klastra: uložený záznam kontajnera odstráneného cez rozhranie Proxmox, uchovávaný ako história, a súbory hostiteľa, ktoré zostali po odstránení. Záznam s nedokončenou operáciou sa zachová, pretože jeho záloha môže byť ešte potrebná. Zväzky ani adresáre hostiteľa sa nikdy neodstraňujú na základe domnienok."
}
]
},
{
"id": "cluster",
"title": "V klastri: migrácia a vysoká dostupnosť",
"intro": "Kontajner OCI je bežný LXC Proxmox: možno ho migrovať alebo spravovať pomocou HA ako ostatné, s rovnakými obmedzeniami. Všetko potrebné na spustenie je uložené tam, kde to nájde každý uzol klastra.",
"blocks": [
{
"table": {
"headers": [
"Časť",
"Na inom uzle klastra"
],
"rows": [
[
"Konzolový log",
"Kontajner pred spustením vytvorí <code>/var/log/proxmenux/oci</code> na uzle, ktorý ho spúšťa. Každý uzol uchováva záznam spustení, ktoré vykonal."
],
[
"Sieťové parametre sysctl a monitor hostiteľa",
"Uchovávajú sa v <code>/etc/pve/proxmenux</code>, ktorý zdieľajú všetky uzly klastra, takže migrovaný kontajner ich nájde."
],
[
"Kontajnerové disky",
"Proxmox ich presúva s kontajnerom. HA potrebuje mať ich dáta dostupné na cieľovom uzle cez zdieľané úložisko alebo podporovanú konfiguráciu replikácie."
],
[
"Hostiteľské adresáre a zariadenia",
"Rovnaké pravidlá ako všetky LXC: hostiteľský adresár musí existovať na cieľovom uzle a musí byť označený ako zdieľaný a musí tam byť prítomný GPU, Coral alebo NPU."
],
[
"Záznam ProxMenux",
"Kontrakt zostáva na uzle, kde bola aplikácia nainštalovaná, a každý uzol číta kópiu v <code>/etc/pve/priv/proxmenux/oci</code>. Migrovaná aplikácia s jedným kontajnerom sa zaregistruje na cieľovom uzle po otvorení <strong>Spravovať nainštalované aplikácie OCI</strong> alebo po spustení operácie pre danú aplikáciu. Aplikácia s viacerými kontajnermi sa tam ponúkne na obnovu, pretože jej súkromná sieť sa musí vytvoriť na tomto uzle."
]
]
}
},
{
"calloutWarning": {
"title": "Nie je určené pre vysokú dostupnosť",
"body": "Aplikácia s viacerými kontajnermi komunikuje so svojimi členmi cez súkromný most uzla, na ktorom bola nainštalovaná, preto jej členovia zostávajú na tomto uzle. Monitor hostiteľa, napríklad Glances v režime hostiteľa alebo Netdata, sleduje uzol, na ktorom beží; presunutím by sledoval iný uzol."
}
},
{
"p": "Pri obnove aplikácie dostane záloha obnovená mimo klastra súbory z <code>/etc/pve/proxmenux</code>, ktoré kontajner používa."
}
]
},
{
"id": "channel",
"title": "Priebežne aktualizovaná značka neznamená bezobslužnú aktualizáciu",
"blocks": [
{
"p": "Katalóg nainštaluje priebežne aktualizovanú značku, ktorú publikuje správca, ale skutočný digest sa zistí a zaznamená a zmení sa iba explicitnou aktualizáciou s predbežnou kontrolou a možnosťou návratu späť. <monitorLink>ProxMenux Monitor</monitorLink> porovná nainštalovaný digest s digestom publikovaným registrom a zobrazí aj odošle upozornenie, keď je dostupný nový obraz."
}
]
}
]
}
@@ -0,0 +1,213 @@
{
"meta": {
"title": "Kontajnery OCI v ProxMenux Monitor | ProxMenux",
"description": "Čo ProxMenux Monitor zobrazuje pre kontajner nainštalovaný cez OCI manager Apps: verzie aplikácie a obrazu, nové obrazy, výstup konzoly a terminál Proxmox VE."
},
"header": {
"title": "V ProxMenux Monitore",
"description": "Kontajner nainštalovaný cez OCI manager Apps sa zobrazuje v časti VM a LXC ako každý iný LXC. Jeho detail načíta záznam inštalácie: verzie aplikácie a obrazu, nové obrazy, výstup konzoly a terminál.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Záznam je zdroj",
"body": "OCI manager Apps vie, čo nainštaloval a odkiaľ to pochádza. Monitor načíta tento záznam inštalácie namiesto vyhľadávania aplikácie v kontajneri. Tieto údaje sú preto rovnaké pri spustenom aj zastavenom kontajneri."
}
},
{
"table": {
"headers": [
"Karta",
"Čo sa mení pri kontajneri OCI"
],
"rows": [
[
"Stav",
"Prepínač <strong>Watchdog</strong> pod Start at boot: aplikácia sa znova spustí, keď sa sama zastaví"
],
[
"Aplikácia",
"Aplikácia je identifikovaná zo záznamu a aktualizácie sú sledované obrazom"
],
[
"Aktualizácie",
"Obraz je aktualizovaný alebo aplikácia upravená s rovnakým tokom ako OCI menu"
],
[
"Pripojenia",
"Kontajnerové disky a hostiteľské adresáre s ich použitím"
],
[
"Logy",
"Len pre kontajnery OCI: výstup konzoly aplikácie"
]
]
}
}
]
},
{
"id": "app",
"title": "Aplikácia",
"intro": "Záložka <appLink>App</appLink> ponúka nainštalovanú aplikáciu ako detekciu s názvom, logom, portom a schémou záznamu. Zaregistrovanie otvára editor metódou <strong>Obraz OCI (nainštalovaný ProxMenux)</strong>, ktorá nepotrebuje konfiguráciu.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "boxes",
"title": "Aplikácia",
"body": "Verzia aplikácie v obraze, načítaná zo samotného obrazu: z jeho prostredia alebo štítku <code>org.opencontainers.image.version</code>. Je to informatívny údaj."
},
{
"icon": "archive",
"title": "Obraz",
"body": "Dátum zostavenia a digest nainštalovaného obrazu. O aktualizácii sa rozhoduje tu: nainštalovaný digest sa porovná s tým, ktorý register dnes publikuje pre rovnakú značku."
}
]
}
},
{
"list": {
"items": [
"Keď register zverejní nový digest, na karte sa zobrazí <strong>Nový obraz</strong> s jeho dátumom a digest, aj keď sa verzia aplikácie vo vnútri nezmenila: prestavba na aktualizovanej báze je aktualizáciou.",
"Keď sa hodnoty digest zhodujú, karta zobrazí <strong>Verzia</strong>.",
"Karta odkazuje na úložisko obrazu: jeho projekt GitHub alebo jeho stránku Docker Hub pre oficiálny obraz.",
"Prístupové spojenie používa LAN adresu kontajnera, aj pre hlavného člena viackontajnerovej aplikácie, ktorá má druhú adresu vo svojej súkromnej sieti.",
"Tlačidlo <strong>Obnoviť údaje</strong> znovu načíta záznam aj register obrazov. Možnosti vyhľadávania alebo registrácie ďalších aplikácií sa neponúkajú: kontajner obsahuje presne aplikáciu zo svojho záznamu."
]
}
},
{
"figure": {
"src": "/oci-manager/monitor-app-tab.png",
"alt": "App záložka kontajnera OCI s verziou aplikácie, obrazom a odkazom na úložisko",
"caption": "Karta Aplikácia kontajnera nainštalovaného cez OCI manager Apps."
}
},
{
"p": "Kontrola prebieha raz denne s kontrolami aktualizácií monitora a <strong>Obnoviť údaje</strong> ju spustí okamžite. Nový obraz sa odošle ako upozornenie prostredníctvom kanálov nakonfigurovaných v <notificationsLink>Upozornenia</notificationsLink>. Aktualizácia sa aplikuje na karte Aktualizácie."
}
]
},
{
"id": "updates",
"title": "Aktualizácie",
"intro": "Pri kontajneri nainštalovanom cez OCI manager Apps zobrazuje karta Aktualizácie aplikáciu s nainštalovaným obrazom a prípadným novým obrazom z registra, rovnako ako pri ostatných aplikáciách. Nástroje na aktualizáciu balíkov a aplikácií bežného LXC sa nezobrazujú.",
"blocks": [
{
"table": {
"headers": [
"Tlačidlo",
"Čo to otvára?"
],
"rows": [
[
"Aktualizácia",
"Aktualizácia z časti <lifecycleLink>Spravovať nainštalované aplikácie OCI</lifecycleLink> pre tento kontajner v termináli Monitor. Možno ju spustiť aj bez nového obrazu; vtedy sa nič nezmení. Vo viackontajnerovej aplikácii aktualizuje všetkých členov."
],
[
"Upraviť",
"Editor aplikácie (zdroje, sieť, cesty a GPU). Vo viackontajnerovej aplikácii pridáva alebo odstraňuje ďalšie cesty a zariadenia aplikačného kontajnera a v Immich mení, čo vykonáva rozpoznávanie."
],
[
"Obnoviť",
"Nahradí Aktualizáciu po prerušení operácie na kontajneri a otvorí jeho obnovu."
],
[
"Obnoviť (obnovený kontajner)",
"Zobrazí sa pri kontajneri obnovenom zo zálohy, ktorý na tomto hostiteľovi nemá kontrakt, v časti <strong>Obnovená aplikácia OCI</strong>. Otvorí <lifecycleLink>obnovu</lifecycleLink> v termináli Monitor; po registrácii sa zobrazia možnosti Aktualizovať a Upraviť."
]
]
}
},
{
"p": "Externé zmeny, hostiteľské adresáre a multikontajnerové aplikácie sú spracované ako v ponuke OCI. Vo viackontajnerovej aplikácii sa tlačidlá a možnosti zobrazia len na hlavnom kontajneri; ostatní členovia zobrazujú svoj obraz, poznámku, že sú aktualizované z hlavného kontajnera a tlačidlo, ktoré ho otvára. Keď sa terminál uzavrie, obraz, záznam a pripojenia sa znovu prečítajú."
},
{
"table": {
"headers": [
"Možnosť",
"Správanie"
],
"rows": [
[
"Ponechať zálohu vytvorenú pred aktualizáciou",
"Každá aktualizácia zálohuje kontajner, aby ho bolo možné obnoviť pri zlyhaní aktualizácie. Pri tejto voľbe sa tá istá záloha ponechá vo vybranom úložisku a zobrazí medzi zálohami CT; pri Proxmox Backup Server sa záloha zapíše pred aktualizáciou."
],
[
"Plánované aktualizácie",
"Obraz sa aktualizuje v zvolenom čase iba vtedy, keď register publikuje nový obraz; voliteľne až po jeho dosiahnutí veku 1, 3, 7 alebo 14 dní. Kontajner so zmenami mimo ProxMenux sa preskočí a nahlási."
]
]
}
}
]
},
{
"id": "logs",
"title": "Logy",
"intro": "Karta Záznamy sa zobrazuje iba pri kontajneroch nainštalovaných cez OCI manager Apps, medzi kartami Pripojenia a Zálohy. Zobrazuje štandardný a chybový výstup hlavného procesu obrazu, teda rovnaký výstup ako <code>docker logs</code> pri kontajneri Docker.",
"blocks": [
{
"list": {
"items": [
"Výstup sa uchováva na hostiteľovi v <code>/var/log/proxmenux/oci/VMID.console.log</code> (režim 0600) od prvého spustenia aj cez reštarty, takže ho možno čítať pri zastavenom kontajneri.",
"Súbor sa otáča na 10 MB, pričom sa uchovávajú tri komprimované kópie (<code>/etc/logrotate.d/proxmenux-oci</code>).",
"Každý začiatok kontajnera je označený vo výstupe. Karta štandardne zobrazuje výstup od posledného spustenia; <strong>Úplná história</strong> zobrazuje aj predchádzajúce.",
"Po odstránení aplikácie sa odstráni jej výstup.",
"Zobrazuje sa posledných 100, 500 alebo 1000 riadkov. Počas behu kontajnera sa nové riadky sledujú naživo; posunutie nahor sledovanie pozastaví a tlačidlo <strong>Sledovať</strong> ho obnoví.",
"Filter zobrazí iba riadky, ktoré obsahujú text a <strong>Stiahnuť</strong> uloží načítané riadky.",
"Farebné kódy sa odstránia a riadok opakovane prekresľovaný ukazovateľom priebehu sa zobrazí v konečnom stave.",
"Karta načíta súbor pri každom otvorení; nepoužíva vyrovnávaciu pamäť."
]
}
},
{
"calloutInfo": {
"title": "Prihlasovacie údaje pri prvom spustení",
"body": "Obrazy, ktoré vytlačia vygenerované heslo na ich prvom štarte, to nechajú v tomto výstupe, ako to robí <code>docker logs</code>. Inštalátor ho odtiaľ prečíta, aby ju ukázal v súhrne."
}
},
{
"figure": {
"src": "/oci-manager/monitor-logs-tab.png",
"alt": "Karta záznamov s výstupom konzoly kontajnera OCI, výberom počtu riadkov, filtrom a tlačidlom sledovania",
"caption": "Konzolový výstup kontajnera OCI."
}
}
]
},
{
"id": "terminal",
"title": "konzola Proxmox VE",
"blocks": [
{
"p": "Obraz OCI spúšťa vlastný proces ako PID 1 a neobsahuje prihlasovaciu službu. Predvolená konzola LXC by preto otvorila terminál bez procesu, ktorý by odpovedal na prihlásenie. Kontajnery nainštalované cez OCI manager Apps sa vytvárajú s <code>cmode: shell</code>: konzola Proxmox VE otvorí shell pomocou <code>lxc-attach</code>, čo zodpovedá <code>docker exec</code>. Spustená aplikácia zostáva nedotknutá."
},
{
"list": {
"items": [
"Shell je ten, ktorý súbor <code>/etc/passwd</code> v obraze priraďuje používateľovi root. Ak root nemá shell alebo obraz žiadny neobsahuje, zostane predvolená konzola.",
"Shell beží ako root vnútri kontajnera, bez hesla. O tom, kto ho môže otvoriť, rozhoduje <code>VM.Console</code> povolenie Proxmox VE.",
"Terminál monitora vstupuje do kontajnera s <code>pct enter</code>, ktorý funguje rovnako."
]
}
}
]
},
{
"id": "mounts",
"title": "Pripojenia",
"blocks": [
{
"p": "Karta <mountsLink>Pripojenia</mountsLink> uvádza disky kontajnera a jeho adresáre hostiteľa. Využitie disku kontajnera na blokovom úložisku, napríklad LVM-thin, sa číta zo súborového systému disku, ktorý je pripojený iba v kontajneri."
}
]
}
]
}
@@ -0,0 +1,404 @@
{
"meta": {
"title": "Aplikácie s viacerými kontajnermi | ProxMenux",
"description": "Ako OCI manager Apps mení aplikáciu s databázou a vyrovnávacou pamäťou na koordinované natívne LXC: plán, súkromná sieť, hook závislostí, overenie a transakčné aktualizácie."
},
"header": {
"title": "Aplikácie s viacerými kontajnermi",
"description": "Aplikácia so svojou databázou, vyrovnávacou pamäťou a ďalšími službami sa stáva niekoľkými koordinovanými LXC, nainštalovanými a aktualizovanými ako jedna.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Jedna aplikácia pre užívateľa, niekoľko LXC pre Proxmox VE",
"body": "Definícia viacerých kontajnerov je jedným záznamom v katalógu. Inštalátor vytvorí jeden natívny LXC pre každú službu a explicitne spravuje ich závislosti. Immich, Nextcloud, Paperless-ngx a Tandoor sú nainštalované týmto spôsobom."
}
},
{
"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": "Stack plán",
"app": "Aplikácia LXC",
"appNet": "LAN + súkromné",
"db": "PostgreSQL LXC",
"cache": "Valkey LXC",
"private": "súkromné"
}
}
}
]
},
{
"id": "plan",
"title": "1. Plán ešte pred vytvorením kontajnerov",
"blocks": [
{
"p": "Počas spracovania definície Compose sa nevytvára žiadny LXC. Najprv vznikne úplný plán so všetkými členmi, obrazmi, VMID, sieťami, cestami, tajnými údajmi, poradím a kontrolami stavu. Ak plán nie je konzistentný, inštalácia sa nezačne."
},
{
"table": {
"headers": [
"Prvok plánu",
"Obsah",
"Overenie pred vytvorením čohokoľvek"
],
"rows": [
[
"Členovia",
"Hlavná aplikácia, databáza, vyrovnávacia pamäť, strojové učenie a iné závislosti",
"Jedinečné VMID, známe úlohy a presne jeden hlavný člen"
],
[
"Obrazy",
"Priebežne aktualizovaný odkaz, architektúra a určený digest každej služby",
"Všetky existujú, podporujú architektúru a prejdú kontrolou integrity OCI"
],
[
"Sieť",
"Súkromný most, podsieť, pevná adresa pre každú službu a prístup LAN pre hlavného člena",
"Žiadna zrážka s existujúcimi mostmi alebo podsietami a žiadna opakovaná adresa"
],
[
"Perzistencia",
"Kontajnerové disky, hostiteľské adresáre, majitelia a zálohovanie",
"Žiadne prekrývanie ciest, dostupné úložisko a deklarované oprávnenia"
],
[
"Tajomstvá",
"Heslo databázy, aplikačné kľúče a počiatočné prihlasovacie údaje",
"Generované raz a podané iba členom, ktorí ich používajú"
],
[
"Životný cyklus",
"Poradie spúšťania, poradie zastavovania a kontrola stavu každého člena",
"Hlavná aplikácia sa spúšťa posledná a zastavuje prvá"
]
]
}
}
]
},
{
"id": "create",
"title": "2. Vytváranie jednotlivých členov",
"blocks": [
{
"steps": {
"items": [
{
"title": "Rezervujte každý VMID",
"body": "Súpis Proxmox VE a inštančný register sú kontrolované. Existujúce CT nie je prijaté a zmluva, ktorá stále patrí do inej inštancie, sa opätovne nepoužíva."
},
{
"title": "Pripravte každý obraz",
"body": "Všetky obrazy sú vyriešené, stiahnuté a overené pred vytvorením prvého kontajnera."
},
{
"title": "Vytvoriť každý rootfs",
"body": "Importujú sa oficiálne metadáta OCI a pridá sa identita inštancie ProxMenux a rola člena."
},
{
"title": "Súkromná sieť",
"body": "Vytvorí sa most a podsieť a každý člen dostane pevnú adresu; iba hlavný člen navyše dostane rozhranie LAN."
},
{
"title": "Perzistencia",
"body": "Každá databáza a konfigurácia dostane svoj vlastný disk kontajnera; iba údaje určené na zdieľanie používajú adresáre hostiteľov."
},
{
"title": "Prostredie",
"body": "Zapíšu sa interné koncové body, zdieľané tajné údaje a premenné služieb. Aplikácia pristupuje k svojim závislostiam cez ich vyhradené súkromné adresy."
},
{
"title": "Záznam",
"body": "Každý člen zaznamenáva svoju natívnu konfiguráciu, rootfs zmeny, ktoré aktualizácie musia reprodukovať a jeho vzťah k stohu."
}
]
}
}
]
},
{
"id": "checks",
"title": "3. Spustiť a skontrolovať každý kontajner",
"intro": "Vytvorený LXC ešte neznamená pripravenú službu. Závislosti sa spúšťajú v určenom poradí a každá prejde kontrolou špecifickou pre danú službu.",
"blocks": [
{
"table": {
"headers": [
"Služba",
"Kontrola",
"Čo ukazuje"
],
"rows": [
[
"PostgreSQL",
"<code>pg_isready</code> v CT s očakávaným hostiteľom, používateľom a databázou",
"Server akceptuje spojenia pre nakonfigurovanú databázu"
],
[
"Redis / Valkey",
"<code>redis-cli</code> alebo <code>valkey-cli</code> s príkazom <code>PING</code> na jeho súkromnej adrese",
"Broker počúva a odpovedá"
],
[
"Immich strojové učenie",
"HTTP <code>GET /ping</code>, plus kontrola zvoleného runtime GPU",
"Služba odpovedá a požadovaná akcelerácia neprešla na CPU"
],
[
"Nextcloud",
"<code>GET /status.php</code> s <code>installed=true</code>, <code>maintenance=false</code> a <code>needsDbUpgrade=false</code>",
"Inicializácia ukončená bez ďalšej migrácie"
],
[
"Paperless-ngx / Tandoor",
"HTTP na adrese LAN a skutočnom porte služby",
"Frontend a jeho závislosti poskytujú aplikáciu"
],
[
"Hlavná aplikácia",
"Koncový bod jeho šablóny, napríklad <code>/api/server/ping</code> v Immich",
"Celý zásobník pracuje prostredníctvom aplikácie, ktorá používa závislosti"
]
]
}
},
{
"calloutWarning": {
"title": "Spustený neznamená funkčný",
"body": "Stav spustené len hovorí, že proces LXC existuje. Tam, kde služba ponúka lepšiu kontrolu, sa používa exec alebo HTTP kontrola s časovým limitom. Ak člen zastaví alebo zlyhá jeho kontrola, zásobník nie je deklarovaný ako nainštalovaný."
}
}
]
},
{
"id": "hook",
"title": "4. Hook závislostí",
"blocks": [
{
"p": "Hook sa nastaví iba na hlavnom kontajneri zostavy so závislosťami. Proxmox VE uchováva skript ako snippet a spúšťa ho ako <code>hookscript</code> daného CT. Recept zostavy nie je zapísaný v skripte: nachádza sa v samostatnom súkromnom kontrakte."
},
{
"codeGrid": {
"items": [
{
"title": "Hlavné nastavenie CT",
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
},
{
"title": "Súkromná zmluva (príklad)",
"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": "Kompletný zdroj proxmenux-stack-dependencies.sh",
"pathCode": "local:snippets/proxmenux-stack-dependencies.sh",
"snippetCode": "stackDependencyHook"
}
},
{
"p": "Skript je rovnaký pre každý zásobník. VMID, názvy, kontrolné typy a timeouty pochádzajú zo súkromného kontraktu <code>/etc/pve/priv/proxmenux-stack-VMID.json</code> každého zásobníka."
},
{
"steps": {
"items": [
{
"title": "Proxmox VE zavolá pre-start",
"body": "Pred spustením hlavného CT sa hook spustí s jeho VMID a fázou životného cyklu."
},
{
"title": "Zámok na zásobník",
"body": "<code>flock</code> na <code>/run/lock/proxmenux-stack-VMID.lock</code> zabraňuje dvom štartovým sekvenciám súčasne."
},
{
"title": "Zmluva je prečítaná a overená",
"body": "Požaduje sa známa schéma, numerické závislosti, etikety, exec, http alebo kontrola chodu a pozitívny timeout."
},
{
"title": "Závislosti v poradí",
"body": "Každý CT musí existovať; zastavený sa spustí, už spustený sa nereštartuje."
},
{
"title": "Čakanie na pripravenosť služby",
"body": "Kontrola beží každé dve sekundy, a CT je tiež potvrdené, že stále beží."
},
{
"title": "Hlavné CT začína",
"body": "Keď je každá závislosť pripravená, pre-start končí a Proxmox VE spustí aplikáciu."
}
]
}
},
{
"calloutInfo": {
"title": "Háčik nezastaví závislosť",
"body": "Fázy post-start, pre-stop a post-stop nič nevykonávajú. Zastavenie hlavného CT ponechá PostgreSQL, Redis, Valkey alebo strojové učenie spustené. Hook určuje poradie spúšťania; nemení viaceré LXC na jeden proces."
}
},
{
"table": {
"headers": [
"Typ",
"Príklad",
"Neskoršie spustenia"
],
"rows": [
[
"Závislý zásobník",
"Immich, Nextcloud, aplikácia s PostgreSQL",
"Hook hlavného CT spustí závislosti a čaká na ich pripravenosť."
],
[
"Súprava aplikácií",
"Súprava Arr",
"Žiadny hlavný člen: každý LXC sleduje svoje vlastné <code>onboot</code>"
],
[
"Samostatná aplikácia",
"Jellyfin",
"Proxmox VE spustí daný LXC priamo"
]
]
}
}
]
},
{
"id": "stack-checks",
"title": "5. Kontrola stohu ako celku",
"blocks": [
{
"list": {
"items": [
"Každý VMID existuje, je jedinečný a udržiava očakávanú inštančnú identitu.",
"Každý kontrakt patrí do rovnakej zostavy, zachováva svoju rolu a zaznamenanú natívnu konfiguráciu.",
"Hlavný člen je posledný v <code>start_order</code> a prvý v <code>stop_order</code>.",
"Nechýba žiadny člen, zväzok ani úprava rootfs.",
"Hook odkazuje na oficiálny snippet, jeho obsah sa nezmenil a jeho kontrakt zodpovedá receptu zostavy.",
"Zistené obrazy a hodnoty digest zodpovedajú pripraveným archívom OCI.",
"Zariadenia, profily GPU, pripojenia, tajomstvá a koncové body stále zodpovedajú zmluvám.",
"Keď všetky závislosti prejdú kontrolou, koncový bod hlavnej aplikácie overí integráciu medzi členmi."
]
}
}
]
},
{
"id": "manage",
"title": "Správa nainštalovaného zásobníka",
"intro": "V časti <strong>Spravovať nainštalované aplikácie OCI</strong> vedie každý člen k celej zostave. Ponuka obsahuje <strong>Aktualizovať všetky kontajnery aplikácie</strong>, <strong>Upraviť dodatočné cesty a zariadenia</strong>, <strong>Znova vytvoriť všetky kontajnery s uloženou konfiguráciou</strong> a <strong>Odstrániť: vymazať aplikáciu a jej kontajnery</strong>. Opätovné vytvorenie zostaví každý kontajner z pôvodného obrazu podľa uloženého digestu bez hľadania novšieho obrazu. Používa rovnaké kroky ako aktualizácia a ponúka sa pre aktualizovateľné zostavy.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Každý člen",
"body": "Zmluva člena menuje hlavné VMID a kompletný zoznam členov."
},
{
"title": "Stack je reprodukovateľný",
"body": "Overia sa identity, kontrakty, hook, úpravy a koordinované opätovné vykonanie daného receptu."
},
{
"title": "Prvé obrazy",
"body": "Aplikácia sa nezastaví, kým sa každý digest neurčí, nestiahne a neoverí."
},
{
"title": "Zastaviť súčasti a zálohovať celú zostavu",
"body": "Overené natívne zálohy sa vytvoria pri zastavenej zostave, aby aplikácia a databázy zodpovedali rovnakému okamihu."
},
{
"title": "Aktualizovať a skontrolovať každého člena",
"body": "Adaptácia, sieť, pripojenia, tajomstvá a zariadenia sa používajú opäť pred kontrolou stavu každého člena."
},
{
"title": "Publikovať alebo obnoviť všetko",
"body": "Nové zmluvy sa uverejňujú iba vtedy, keď každý člen prejde. Ak jeden zlyhá, každý člen je obnovený."
}
]
}
},
{
"table": {
"headers": [
"Upraviť",
"Čo sa zmení?",
"Čo sa uchováva"
],
"rows": [
[
"Extra cesty a zariadenia",
"Pridajú sa do aplikačného kontajnera alebo sa z neho odstránia a kontajner sa reštartuje. Nič sa znova nevytvára.",
"Údaje aplikácie, jej databázy a ostatných kontajnerov"
],
[
"Čo spúšťa rozpoznanie (Immich)",
"Kontajner strojového učenia dostane obraz a zariadenia pre CPU alebo GPU hostiteľa. Celá aplikácia sa zastaví a aktualizuje rovnakým postupom ako pri aktualizácii.",
"Modelová vyrovnávacia pamäť, knižnica a databáza. Ak niečo zlyhá, predchádzajúce kontajnery a predchádzajúca voľba sú obnovené"
]
]
}
},
{
"calloutWarning": {
"title": "Zostava bez koordinovaného opätovného vykonania sa neaktualizuje",
"body": "Ak sa príprava zásobníka nedá reprodukovať, aktualizácia sa zamietne pred zastavením zásobníka. Aplikácia funguje tak, ako je."
}
}
]
},
{
"id": "failure",
"title": "6. Keď niečo zlyhá",
"blocks": [
{
"p": "Ak počas inštalácie nastane chyba, zastavia a odstránia sa neúplné kontajnery vytvorené touto operáciou aj súkromný most, ak ho operácia vytvorila. Zostava sa nezverejní ako platná, kým neskončí celý postup."
},
{
"p": "Aktualizácia je transakčná: všetky obrazy sú pripravené ako prvé, potom stack zastaví, každý člen je zálohovaný a záloha overená, a len potom je každý rootfs nahradený. Členovia začínajú jeden po druhom so zdravotnou kontrolou; ak jeden zlyhá, každý člen je obnovený z rovnakého súboru záloh, takže databáza a aplikácia nikdy nepatria do rôznych momentov."
},
{
"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": "Pripravte každý obraz",
"stop": "Stop, hlavný člen prvý",
"backup": "Overená záloha každého CT",
"replace": "Nahradiť rootfs",
"healthy": "Sú všetky funkčné?",
"yes": "Áno",
"no": "Nie",
"commit": "Zverejniť kontrakty",
"rollback": "Obnoviť každého člena"
}
}
}
]
},
{
"id": "not-assumed",
"title": "Čo zásobník nezahŕňa",
"blocks": [
{
"list": {
"items": [
"Súprava nainštalovaná v jednom postupe, napríklad súprava Arr, nie je zostavou so závislosťami: jej kontajnery nemajú určené vzájomné poradie spúšťania.",
"Súkromná sieť nenahrádza autentifikáciu, TLS ani konfiguráciu každej aplikácie.",
"Zálohovanie jedného LXC neobsahuje most, hák ani zmluvy zvyšku zásobníka.",
"Prowlarr, Sonarr alebo Radarr neprijímajú žiadne indexátory, profily alebo poskytovateľov z ProxMenux."
]
}
}
]
}
]
}
@@ -0,0 +1,305 @@
{
"meta": {
"title": "Údaje, cesty a sieť | ProxMenux",
"description": "Ako OCI manager Apps uchováva údaje kontajnera OCI: disky kontajnera, adresáre hostiteľa, pripojenia cez rclone, adresy a súkromné siete."
},
"header": {
"title": "Údaje, cesty a sieť",
"description": "Čo sa nachádza v rootfs, čo sa zachová pri jeho výmene, ako sa zdieľajú údaje medzi kontajnermi a ako každý kontajner získa svoju adresu.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Trvalé uloženie údajov sa určí pred vytvorením LXC",
"body": "Pred vytvorením kontajnera sa načítajú zväzky deklarované obrazom a jeho súborom Compose. Každá cesta, ktorá sa má zachovať po aktualizácii, sa stane prípojným bodom nezávislým od rootfs. Rootfs tak obsahuje iba súbory patriace obrazu a možno ho vymeniť."
}
}
]
},
{
"id": "questions",
"title": "Na čo sa pýta inštalátor",
"intro": "Šablóna poskytuje cesty potrebné pre aplikáciu. Každá sa umiestni na disk kontajnera alebo do adresára hostiteľa. Pred súhrnom možno pridať ďalšie cesty.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Potrebné cesty",
"body": "Zobrazia sa <code>/config</code>, <code>/data</code>, knižnice, stiahnuté súbory a všetky zväzky deklarované aplikáciou."
},
{
"title": "Umiestnenie",
"body": "Každá cesta sa umiestni na disk kontajnera alebo do existujúceho adresára hostiteľa."
},
{
"title": "Úložisko a veľkosť",
"body": "Na úložisku Proxmox VE sa vytvorí disk kontajnera so zadanou veľkosťou. Predvolená inštalácia používa <code>local-lvm</code>. Rozšírená inštalácia sa pri každej ceste pýta najprv na úložisko a potom na veľkosť; navrhuje úložisko rootfs. Disk sa zobrazuje ako <code>vm-VMID-disk-N</code> a pripája sa ako <code>mpN</code>."
},
{
"title": "Adresár hostiteľa",
"body": "Adresár hostiteľa sa zadáva jeho cestou. Ak neexistuje, vytvorí sa a jeho vlastníkom bude používateľ hostiteľa, na ktorého sa mapuje používateľ kontajnera."
},
{
"title": "Ďalšie cesty",
"body": "Pred inštaláciou možno pridať ďalšie dvojice cesty alebo zväzku hostiteľa a cesty v kontajneri."
},
{
"title": "Súhrn",
"body": "Pred vytvorením CT sa zobrazí úplné mapovanie ciest a uloží sa do kontraktu inštancie."
}
]
}
}
]
},
{
"id": "options",
"title": "Dve možnosti trvalého uloženia",
"blocks": [
{
"table": {
"headers": [
"Vlastnosť",
"Disk kontajnera",
"Adresár hostiteľa"
],
"rows": [
[
"V konfigurácii",
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
],
[
"Záloha kontajnera (vzdump)",
"Zahrnutý pri <code>backup=1</code>",
"Nezahrnutý"
],
[
"Veľkosť",
"Pevná; zväčšuje sa zmenou veľkosti prípojného bodu",
"Voľné miesto v súborovom systéme alebo datasete hostiteľa"
],
[
"Ostatné kontajnery",
"Pripája ho iba kontajner, ktorému patrí",
"Ten istý adresár možno pripojiť do viacerých kontajnerov"
],
[
"Snapshoty a obnova",
"Spravuje ich Proxmox VE spolu s CT",
"Spravujú sa na úložisku hostiteľa"
],
[
"Pri odstránení aplikácie",
"Odstráni sa spolu s kontajnerom",
"Zachová sa aj s obsahom"
],
[
"Pri presune CT na iný uzol",
"Presunie sa spolu s CT",
"Na druhom uzle musí existovať rovnaká cesta"
]
]
}
},
{
"p": "Rootfs je vyhradený pre binárne súbory a obsah obrazu. Aktualizácia alebo opätovné vytvorenie ho nahradí bez zásahu do ktoréhokoľvek z dvoch typov prípojných bodov."
}
]
},
{
"id": "example",
"title": "Príklad: kontajner s oboma umiestneniami",
"blocks": [
{
"code": {
"title": "Jellyfin nainštalovaný ako CT 151 na local-lvm (úryvok)",
"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": "Aktualizácia alebo opätovné vytvorenie nahradí iba rootfs: <code>mp0</code> zachová používateľov, knižnice a nastavenia a <code>mp1</code> naďalej sprístupňuje rovnaké médiá. Obnova zálohy CT obnoví <code>/config</code>. Adresár s médiami sa v prípade potreby obnovuje zo zálohy úložiska hostiteľa."
},
{
"flow": {
"nodes": [
{
"label": "Kontrakt",
"detail": "/config"
},
{
"label": "Umiestnenie",
"detail": "Disk kontajnera\nalebo adresár hostiteľa"
},
{
"label": "LXC",
"detail": "Pre aplikáciu\nvždy /config"
}
],
"caption": "Aplikácia vidí cestu deklarovanú obrazom; mení sa iba miesto jej uloženia."
}
}
]
},
{
"id": "shared",
"title": "Jeden adresár hostiteľa, viacero kontajnerov",
"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": "Adresár hostiteľa",
"config": "Vlastná konfigurácia"
}
}
},
{
"p": "Každý kontajner uchováva svoju konfiguráciu na vlastnom disku. Knižnica alebo stiahnuté súbory sú v jednom adresári hostiteľa, pripojenom na rovnakej vnútornej ceste v každom kontajneri. Cesta, do ktorej jedna aplikácia zapisuje, je preto rovnaká ako cesta, z ktorej druhá číta."
}
]
},
{
"id": "rclone",
"title": "Cloudové úložisko cez aplikáciu rclone",
"intro": "Položka rclone v katalógu okrem inštalácie ponúka aj možnosť <strong>Aktivovať pripojenie v existujúcom kontajneri OCI s rclone</strong>. Pripojí sa vzdialené úložisko, ktoré už bolo vytvorené a autorizované vo webovom rozhraní rclone, a sprístupní sa na hostiteľovi. Ostatné kontajnery ho môžu používať ako adresár hostiteľa.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Kontajner a vzdialené úložisko",
"body": "VMID kontajnera s rclone, presný názov vzdialeného úložiska a voliteľne cesta v ňom."
},
{
"title": "Názov pripojenia a vyrovnávacia pamäť",
"body": "Názov pripojenia a režim vyrovnávacej pamäte VFS: <code>off</code>, <code>minimal</code>, <code>writes</code> alebo <code>full</code> (predvolený)."
},
{
"title": "Sprístupnené zobrazenia",
"body": "Spoločný koreňový adresár, predvolene <code>/mnt/oci-shared</code>, obsahuje zobrazenie na čítanie aj zápis v <code>/mnt/oci-shared/remotes/NAME</code> a zobrazenie iba na čítanie v <code>/mnt/oci-shared/remotes-ro/NAME</code>."
},
{
"title": "Aktivácia",
"body": "Po potvrdení sa CT zastaví, nastaví sa jeho spúšťací príkaz a hookscript Proxmox VE a znova sa spustí. Operácia čaká, kým budú obe zobrazenia pripojené na hostiteľovi."
}
]
}
},
{
"calloutInfo": {
"title": "Ak sa pripojenie neaktivuje",
"body": "Obnoví sa predchádzajúca konfigurácia kontajnera a kontajner sa znova spustí. Ak aktivácia zlyhá, rclone tak zostane v pôvodnom stave."
}
}
]
},
{
"id": "network",
"title": "Adresy a siete",
"intro": "Aplikácia s jedným kontajnerom potrebuje adresu. Aplikácia s viacerými kontajnermi potrebuje aj stabilnú sieť medzi svojimi členmi.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "network",
"title": "Aplikácia s jedným kontajnerom",
"body": "Vyberie sa sieťový most a DHCP alebo pevná adresa vo formáte CIDR. LXC má vlastnú adresu a súhrn zobrazuje úplné URL služieb."
},
{
"icon": "waypoints",
"title": "Aplikácia s viacerými kontajnermi",
"body": "Vyhľadá sa voľná podsieť a vytvorí sa trvalý súkromný sieťový most. Každý člen — aplikácia, databáza a vyrovnávacia pamäť — v ňom dostane pevnú adresu."
}
]
}
},
{
"flow": {
"nodes": [
{
"label": "LAN",
"detail": "Dostupná adresa\niba pre hlavnú službu"
},
{
"label": "Hlavný LXC",
"detail": "Web / API\nLAN + súkromná sieť"
},
{
"label": "Súkromná sieť",
"detail": "PostgreSQL · Valkey · ML\npevné adresy"
}
],
"caption": "Závislé služby komunikujú cez súkromnú sieť a nemajú adresu v LAN."
}
},
{
"p": "Kontrakt zostavy uchováva sieťový most, podsieť, adresy a vzťahy medzi službami. Pri aktualizácii aplikácie sa pre všetkých členov znovu použije rovnaká topológia. ProxMenux Monitor otvára hlavný kontajner na jeho adrese v LAN, nie na adrese v súkromnej sieti."
}
]
},
{
"id": "ownership",
"title": "Vlastníctvo súborov a adresárov",
"blocks": [
{
"list": {
"items": [
"Nové adresáre sa vytvárajú s UID a GID, na ktoré sa mapuje neprivilegovaný LXC.",
"Vlastníctvo existujúcich adresárov sa nemení rekurzívne.",
"Sockety, systémové súbory a citlivé cesty sa neponúkajú ako bežné adresáre hostiteľa."
]
}
}
]
},
{
"id": "backup",
"title": "Čo obsahuje záloha kontajnera",
"blocks": [
{
"table": {
"headers": [
"Položka",
"V zálohe vzdump kontajnera CT",
"Kde sa uchováva"
],
"rows": [
[
"Rootfs OCI",
"Áno",
"V zálohe CT; možno ho tiež znovu vytvoriť z obrazu a kontraktu"
],
[
"Disk kontajnera s <code>backup=1</code>",
"Áno",
"Záloha CT"
],
[
"Adresár hostiteľa",
"Nie",
"Záloha úložiska hostiteľa"
],
[
"Kontrakt inštancie",
"Áno, kópia uložená v CT",
"<code>/.proxmenux/oci-record.json</code> v CT; ďalšie kópie hostiteľa a klastra sa uchovávajú samostatne"
],
[
"Aplikácia s viacerými kontajnermi",
"Každý člen vo vlastnej zálohe",
"Zálohy všetkých členov spolu s kontraktom zostavy a jej sieťovým mostom na hostiteľovi"
]
]
}
}
]
}
]
}
@@ -0,0 +1,171 @@
{
"meta": {
"title": "Så anpassas en OCI-avbildning | ProxMenux",
"description": "Från avbildningens arkiv och Compose-fil till en granskningsbar mall, en distributionsplan och en LXC direkt i Proxmox VE, utan Docker i containern."
},
"header": {
"title": "Så anpassas en OCI-avbildning",
"description": "Från avbildningens arkiv och Compose-fil till en granskningsbar mall, en distributionsplan och en LXC direkt i Proxmox VE, utan att installera Docker i containern.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "pipeline",
"title": "Anpassningsflödet",
"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": "Avbildningens arkiv",
"converter": "Konverterare",
"template": "JSON-mall",
"blockers": "Inga hinder?",
"no": "Nej",
"yes": "Ja",
"review": "Granskning / overlay",
"plan": "Distributionsplan",
"lxc": "LXC direkt i Proxmox VE"
}
}
},
{
"p": "Konverteraren läser avbildningen och Compose-filen som projektet publicerar och skapar en JSON-mall. Om krav ännu inte har kunnat anpassas och hindrar installationen granskas mallen innan den publiceras i katalogen. En fil med granskade anpassningar, en så kallad overlay, löser dessa hinder. Bara mallar utan kvarstående hinder erbjuds för installation."
}
]
},
{
"id": "template",
"title": "Vad mallen bevarar",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Avbildningens identitet",
"body": "Arkiv, löpande uppdaterad tagg, arkitektur, fastställd digest och källrevision."
},
{
"icon": "braces",
"title": "Containerkontrakt",
"body": "Entrypoint, Cmd, miljö, användare, arbetskatalog, stoppsignal, portar och volymer."
},
{
"icon": "layers",
"title": "Anpassning till Proxmox VE",
"body": "Resurser, säkerhet, monteringspunkter, enheter, sysctls, hälsokontroller och de anpassningar som behövs för var och en, med motivering."
},
{
"icon": "shield",
"title": "Kompatibilitet",
"body": "Nycklar som stöds, krav som ännu inte anpassats och hindrar installationen samt status för varje validering."
}
]
}
}
]
},
{
"id": "sources",
"title": "OCI anger processen, Compose anger miljön",
"blocks": [
{
"table": {
"headers": [
"Källa",
"Exempel",
"Resultat i Proxmox VE"
],
"rows": [
[
"OCI-metadata",
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
"Proxmox VE importerar dem när CT:n skapas"
],
[
"Docker Compose",
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
"Miljöposter för LXC, <code>mpN</code> och <code>devN</code>"
],
[
"ProxMenux-profil",
"GPU, hälsokontroll, inloggningsuppgifter",
"Frågor och granskade anpassningar"
],
[
"Användare",
"VMID, lagring, nätverk",
"Instanskontraktet"
]
]
}
}
]
},
{
"id": "install",
"title": "Vad som händer under installationen",
"blocks": [
{
"steps": {
"items": [
{
"title": "Fastställ avbildningen",
"body": "Registret frågas, värdens arkitektur väljs och den exakta digest som den löpande uppdaterade taggen pekar på fastställs."
},
{
"title": "Hämta och verifiera",
"body": "Skopeo hämtar avbildningen som ett OCI-arkiv. Innan något skapas kontrolleras varje lager mot sin digest och packas upp. Om hämtningen är skadad görs ett nytt försök innan installationen avbryts."
},
{
"title": "Skapa filsystemet",
"body": "<code>pct create</code> skapar rootfs från arkivet och bevarar avbildningens officiella processmetadata."
},
{
"title": "Anslut resurserna",
"body": "Deklarerade volymer, nätverk, miljö, enheter och säkerhetsprofiler kopplas in."
},
{
"title": "Konsol",
"body": "Containerns konsolutdata sparas på värden. Konsolen i Proxmox VE öppnar ett skal om avbildningen innehåller ett."
},
{
"title": "Kontrollera",
"body": "Vid första starten väntar installationen på en adress och på att tjänsten ska svara. Ett misslyckande rapporteras inte som en lyckad installation."
},
{
"title": "Registrera konfigurationen",
"body": "Den faktiska konfigurationen sparas i instanskontraktet som används vid uppdateringar och återskapande."
}
]
}
}
]
},
{
"id": "example",
"title": "Exempel: en avbildning med /config och /downloads",
"intro": "En vanlig Compose-definition och den Proxmox VE-konfiguration som den omvandlas till. Sökvägarna som programmet förväntar sig ändras inte.",
"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 (utdrag)",
"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> är en andra disk som tillhör containern och heter <code>vm-VMID-disk-N</code> på den valda lagringen. Den monteras på <code>/config</code> och ingår i containerns säkerhetskopia med <code>backup=1</code>. <code>mp1</code> skapar ingen disk: värdens katalog <code>/srv/downloads</code> monteras på <code>/downloads</code> i LXC-containern. Port 8080 mappas inte: LXC-containern har en egen adress där tjänsten svarar."
}
]
}
]
}
@@ -0,0 +1,278 @@
{
"meta": {
"title": "Installera en avbildning utanför katalogen | ProxMenux",
"description": "Anpassa en OCI-avbildning från en Compose-fil, en URL, ett docker run-kommando eller en avbildningsreferens och granska vad ProxMenux kan återskapa före installationen."
},
"header": {
"title": "Installera en avbildning utanför katalogen",
"description": "Din avbildning anpassas från sin Compose-fil, ett docker run-kommando eller enbart referensen. Resultatet visas för granskning innan någon LXC-container skapas.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Samma konverterare och installationsflöde",
"body": "Alternativet <strong>Installera en avbildning utanför katalogen</strong> använder samma konverterare och installationsflöde som katalogmallarna. Skillnaden är att kontraktet skapas vid det tillfället från den angivna definitionen och valideras innan någon LXC-container skapas."
}
}
]
},
{
"id": "sources",
"title": "Så beskrivs avbildningen",
"intro": "Första vyn frågar hur avbildningen beskrivs. Fyra alternativ läser en definition som anpassas, ett femte använder bara avbildningens namn och tre andra läser en färdig oci-compose-fil.",
"blocks": [
{
"table": {
"headers": [
"Alternativ",
"Vad som läses"
],
"rows": [
[
"Klistra in Compose-filen i terminalen",
"Klistra in YAML-innehållet i terminalen och avsluta med Ctrl+D."
],
[
"Läs Compose-filen från värden",
"En sökväg på noden, som standard <code>/root/docker-compose.yml</code>. Filen måste finnas och får vara högst 256 KiB."
],
[
"Hämta Compose-filen från en adress",
"En <code>http://</code>- eller <code>https://</code>-adress som tillhandahåller rå YAML. Högst 256 KiB hämtas."
],
[
"Klistra in docker run-kommandot i terminalen",
"Kommandot som projektet publicerar. Portar, miljö, volymer, enheter, capabilities, användare, delat minne och andra alternativ som stöds anpassas."
],
[
"Bara avbildningsreferensen, utan Compose-fil",
"En referens som <code>ghcr.io/user/application:latest</code>. Registret frågas och avbildningens OCI-metadata bevaras."
],
[
"Klistra in en oci-compose i terminalen",
"Klistra in JSON-innehållet i terminalen och avsluta med Ctrl+D. Det konverteras inte utan kontrolleras och installeras som det är skrivet."
],
[
"Läs en oci-compose-fil från värden",
"En JSON-fil på noden, som standard <code>/root/oci-compose.json</code>, på högst 2 MiB."
],
[
"Hämta en oci-compose från en adress",
"En <code>http://</code>- eller <code>https://</code>-adress som tillhandahåller JSON-filen. Högst 2 MiB hämtas."
]
]
}
},
{
"figure": {
"src": "/oci-manager/custom-source-menu.png",
"alt": "Meny för att välja hur en avbildning utanför katalogen ska beskrivas",
"caption": "Olika sätt att beskriva en avbildning utanför katalogen."
}
}
]
},
{
"id": "reference-only",
"title": "Vad enbart avbildningsreferensen ger",
"intro": "Avbildningen innehåller processens metadata, men inte allt som en Compose-fil brukar lägga till runt den.",
"blocks": [
{
"table": {
"headers": [
"Läses från avbildningen",
"Finns inte i avbildningen",
"Konsekvens"
],
"rows": [
[
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> och den inbyggda miljön",
"Variabler som bara finns i dokumentationen",
"Läggs till under installationen eller via Ändra"
],
[
"Volymer som avbildningen deklarerar",
"Kataloger på värden som bara anges i Compose-filen",
"Ytterligare sökvägar läggs till före installationen"
],
[
"<code>EXPOSE</code>-portar",
"URL, protokoll eller funktionell hälsokontroll",
"Porten och sättet att kontrollera tjänsten bekräftas"
],
[
"Arkitekturer och digest i registret",
"Enheter, privilegier eller externa beroenden",
"Aktiveras inte utan en definition som begär dem"
]
]
}
}
]
},
{
"id": "review",
"title": "Granska före installationen",
"intro": "Efter att definitionen anpassats visar ProxMenux hur den har tolkats, innan VMID, resurser eller lagring efterfrågas.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Analysera",
"body": "Tjänster, avbildning, portar, sökvägar, miljö, enheter, säkerhet och hälsokontroll läses in."
},
{
"title": "Fråga registret",
"body": "Avbildningen måste finnas i registret och de publicerade arkitekturerna listas. Ett privat register läses med kontot som sparats för det."
},
{
"title": "Lista det som inte tillämpas",
"body": "Etiketter, Docker-nätverk, Swarm-inställningar och andra nycklar som inte påverkar en LXC-container listas."
},
{
"title": "Blockera alternativ utan säker motsvarighet",
"body": "Nycklar utan säker motsvarighet visas under <strong>Alternativ utan motsvarighet</strong> och installationen fortsätter inte. Inget ignoreras utan besked."
},
{
"title": "Fråga efter hemliga uppgifter",
"body": "Variabler vars namn tyder på lösenord, token eller nyckel efterfrågas som känsliga uppgifter under installationen."
}
]
}
},
{
"figure": {
"src": "/oci-manager/custom-review.png",
"alt": "Sammanfattning av hur ProxMenux har tolkat Compose-filen",
"caption": "Sammanfattningen som visas innan installationen frågar efter VMID och resurser."
}
},
{
"p": "Efter att sammanfattningen godkänts följer samma flöde som i katalogen: namn, standardläge eller avancerat läge, VMID, CPU, minne, nätverk, start med noden, beständiga och extra sökvägar, kompatibla enheter och en slutlig sammanfattning."
}
]
},
{
"id": "examples",
"title": "Exempel på indata",
"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": "En oci-compose skriven för hand",
"intro": "En oci-compose är JSON-filen som ett program installeras från. Katalogen innehåller en sådan fil per program. Samma format kan skrivas för hand och installeras med det här alternativet.",
"blocks": [
{
"p": "I en handskriven fil bestämmer författaren avbildning, portar, variabler, volymer och installationsfrågor. ProxMenux kompletterar resten när filen läses. Formatet kan ange sådant som Compose inte kan: frågetexter, ett lösenord som skapas under installationen, en GPU-profil, ägaren till varje volym, kontrollen vid första starten eller inloggningsuppgifterna som visas till sist."
},
{
"steps": {
"items": [
{
"title": "Kontrollera",
"body": "En fil med fel installeras inte. Varje fel anger vilket fält det gäller; vid ogiltig JSON visas rad och kolumn."
},
{
"title": "Granska",
"body": "En giltig fil visar vad den installerar: avbildning, webbadress, portar, beständiga sökvägar, variabler som efterfrågas och filer som skrivs."
},
{
"title": "Installera",
"body": "Installationen är densamma som för katalogens program, med standardinställningar eller avancerade inställningar."
}
]
}
},
{
"calloutWarning": {
"title": "En fil som bestämmer privilegierna",
"body": "En oci-compose bestämmer vad som monteras i containern och med vilka privilegier. Granskningen visar detta före installationen: installera bara filer från betrodda källor."
}
},
{
"p": "Formatet beskrivs block för block med två fullständiga exempel i <readmeLink>OCI-motorns README</readmeLink>. Även en installationspost kan läsas på samma sätt: bara den ursprungliga mallen används, inga av svaren från den installationen."
}
]
},
{
"id": "private-registries",
"title": "Avbildningar i privata register",
"intro": "En avbildning i ett privat register, till exempel ett privat GitHub-paket eller ett privat Docker Hub-arkiv, läses med ett konto som sparats i ProxMenux.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Registret nekar åtkomst till avbildningen",
"body": "Om registret svarar att avbildningen kräver ett konto erbjuder granskningen inloggning och läser sedan avbildningen igen."
},
{
"title": "Logga in",
"body": "Ett användarnamn och ett lösenord eller en token som får hämta avbildningen. Registret kontrollerar uppgifterna och de sparas bara om de godkänns."
},
{
"title": "Installera och håll uppdaterat",
"body": "Kontot används för att hämta avbildningen under installationen och även vid uppdatering, Ändra, Återskapa, watchdog och Monitors uppdateringskontroll, på alla noder i klustret."
}
]
}
},
{
"p": "<strong>Registerkonton</strong> i huvudmenyn för OCI manager Apps visar sparade konton per register och användare, aldrig deras hemliga uppgifter. Från varje konto kan du kontrollera, hämta eller installera en avbildning samt uppdatera eller ta bort inloggningsuppgifterna."
},
{
"list": {
"items": [
"GitHub (<code>ghcr.io</code>): användaren är GitHub-kontot och lösenordet en personlig åtkomsttoken med behörigheten <code>read:packages</code>.",
"Docker Hub (<code>docker.io</code>): användaren är Docker Hub-kontot och lösenordet en åtkomsttoken med läsbehörighet.",
"Andra register, även med egen port som <code>registry.example.com:5000</code>: användarnamn och lösenord eller token som registret tillhandahåller."
]
}
},
{
"calloutInfo": {
"title": "Var kontona sparas",
"body": "I <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, läsbar bara av root, i samma mapp där Proxmox sparar lagringslösenord. <code>/etc/pve</code> delas mellan alla noder i klustret, så ett konto som läggs till på en nod används på alla. Värdens säkerhetskopia innehåller filen och avinstallation av ProxMenux tar bort den från alla noder."
}
}
]
},
{
"id": "limits",
"title": "Definitioner som inte installeras",
"blocks": [
{
"list": {
"items": [
"En Dockerfile utan publicerad avbildning: avbildningen måste först byggas och publiceras i ett OCI-register.",
"En Compose-fil med flera tjänster blockeras eftersom det här alternativet installerar en tjänst i en container, även om flera tjänster använder samma avbildning.",
"<code>configs</code>, externa hemligheter eller enhetsformat som inte kan anpassas entydigt.",
"Skalsubstitutioner som <code>$(command)</code>: ange det resulterande värdet direkt i stället.",
"Okända <code>docker run</code>-alternativ och <code>--env-file</code>: använd en Compose-fil med uttryckliga värden i stället."
]
}
}
]
}
]
}
@@ -0,0 +1,392 @@
{
"meta": {
"title": "Enheter och acceleration | ProxMenux",
"description": "Hur OCI manager Apps ger en OCI-container tillgång till GPU, NVIDIA, Coral, USB, FUSE och andra enheter som validerade inbyggda Proxmox VE-resurser."
},
"header": {
"title": "Enheter och acceleration",
"description": "GPU, NVIDIA, Coral, USB, FUSE och blockenheter blir validerade inbyggda Proxmox VE-resurser för containern.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "principle",
"title": "Enheten som programmet behöver, inte hela värden",
"blocks": [
{
"p": "En enhet som begärs av Compose-filen eller av applikationsprofilen blir en konkret <code>devN</code>-post eller LXC-montering. Be om en GPU, en USB-enhet eller en Coral gör inte containern privilegierad."
},
{
"flow": {
"nodes": [
{
"label": "Värdinventering",
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
},
{
"label": "ProxMenux",
"detail": "tillverkare och\nbehörigheter kontrollerade"
},
{
"label": "LXC",
"detail": "samma enhet\neffektiv GID"
}
]
}
}
]
},
{
"id": "origin",
"title": "Varifrån enhetsbegäran kommer",
"blocks": [
{
"table": {
"headers": [
"Källa",
"Vad läses",
"Vad installationsprogrammet gör"
],
"rows": [
[
"Docker Compose",
"<code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> och NVIDIA förfrågningar",
"Varje krav blir en begäran om enhet som visas för granskning"
],
[
"Katalogprofil",
"Programmets faktiska stöd för GPU, Coral, OpenCL, USB eller FUSE",
"Endast de alternativ som valideras för den avbildningen erbjuds"
],
[
"Avbildningens metadata och dokumentation",
"VA-API, Selkies, LinuxServer mods eller NVIDIA runtime",
"Dokumenterade variabler och förberedelser läggs till"
],
[
"Användarval",
"CPU endast, Intel/AMD, OpenCL, NVIDIA eller en valfri enhet",
"Urvalet lagras i instansavtalet"
]
]
}
},
{
"calloutWarning": {
"title": "Upptäckta enheter ansluts inte automatiskt",
"body": "Värden är inventerad, men endast enheter som deklareras av Compose-filen eller av en kompatibel profil erbjuds och bifogas. En GPU, USB-dongel eller Coral närvarande på värden är inte utsatt för varje LXC."
}
}
]
},
{
"id": "identify",
"title": "Hur värdenheten identifieras",
"intro": "Innan LXC modifieras läses enheten på värden och matchas mot den valda profilen.",
"blocks": [
{
"table": {
"headers": [
"Typ",
"Identitet",
"Validering"
],
"rows": [
[
"Intel/AMD DRM",
"<code>/dev/dri/renderD*</code> och <code>/sys/class/drm/NODE/device/vendor</code>",
"En teckenenhet med leverantör <code>0x8086</code> (Intel) eller <code>0x1002</code> (AMD)"
],
[
"AMD OpenCL",
"Rendernoden plus <code>/dev/kfd</code> när profilen behöver den",
"Existens, typ, leverantör, behörigheter och förklarad kompatibilitet"
],
[
"AMD ROCm",
"Rendernoden, <code>/dev/kfd</code> och generationen som beräkningsdrivrutinen rapporterar i <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>",
"En generation som programmets ROCm-avbildning innehåller beräkningskärnor för — de namngivna RDNA2-GPU:erna och nyare — erbjuds utan anpassning. Andra GPU:er i dessa familjer, till exempel Radeon 680M och 780M, erbjuds som experimentella och väljs aldrig som föreslaget alternativ: ROCm stöder dem inte officiellt, programmet presenterar dem som familjens generation (<code>HSA_OVERRIDE_GFX_VERSION</code>) och installeraren begär bekräftelse innan den större avbildningen hämtas. Äldre GPU:er, till exempel den integrerade grafiken i Ryzen 5000U, erbjuds inte och Immich fortsätter köra igenkänningen på CPU:n."
],
[
"NVIDIA",
"<code>nvidia-smi</code> och <code>nvidia-container-cli</code>",
"GPU, UUID, PCI buss, drivrutinsversion, Toolkit, <code>/dev/nvidia*</code> noder, binärer och bibliotek"
],
[
"Coral PCIe/M.2",
"<code>/dev/apex_N</code> och dess länk i <code>/sys/dev/char/MAJOR:MINOR</code>",
"Teckenenhetsnod, major/minor-nummer, ägare, GID och behörigheter"
],
[
"USB och seriell",
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> eller <code>/dev/bus/usb/BBB/DDD</code>",
"Teckenenhetsnod; för USB även tillverkare, produkt och serienummer när sysfs publicerar dem"
],
[
"KVM, TUN, FUSE, video och generisk SCSI",
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> eller <code>/dev/sgN</code>",
"Sökväg som stöds, nodtyp och effektiva behörigheter"
],
[
"Optisk enhet",
"<code>/dev/srN</code>",
"En blockenhet"
]
]
}
}
]
},
{
"id": "install",
"title": "Vad händer under installationen",
"blocks": [
{
"steps": {
"items": [
{
"title": "Mallen erbjuder sina profiler",
"body": "Till exempel CPU endast, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL eller NVIDIA. Alternativen hör till avbildningen, inte till en vanlig meny."
},
{
"title": "En profil väljs",
"body": "Den anger enhetsnoder, miljö, moddar eller den körmiljö som programmet behöver."
},
{
"title": "En väg föreslås",
"body": "För DRM, <code>/dev/dri/renderD128</code>, som kan ändras på en värd med flera rendernoder. För USB eller seriell, är den specifika noden vald."
},
{
"title": "Validering",
"body": "Existens, typ, tillåten leverantör, behörigheter och GID kontrolleras. En missmatchning stoppar operationen."
},
{
"title": "Kontraktet är skrivet",
"body": "Sökväg, läge, GID, skrivåtkomst och profil sparas för uppdateringar och när containern skapas om."
},
{
"title": "Anslut och testa",
"body": "<code>pct set</code> lägger till <code>devN</code> inträde och åtkomst kontrolleras sedan inuti LXC. LinuxServer avbildningar kontrolleras också som användare <code>abc</code>."
}
]
}
}
]
},
{
"id": "config",
"title": "Hur det visas i LXC-konfigurationen",
"intro": "Exempelvärden: <code>dev0</code> och <code>dev1</code> är lediga platser som Proxmox VE tilldelar, och <code>renderD128</code>, <code>apex_0</code> samt GID beror på nodens maskinvara.",
"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": "En specifik USB-enhet",
"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": "GID läses med <code>stat</code> på värden och skrivs till <code>devN</code>-posten; <code>render</code> och <code>video</code>-grupper antas inte ha ett fast nummer. Enheten håller samma <code>/dev</code>-väg inuti LXC, där programmets egna mekanismer letar efter det."
}
]
},
{
"id": "profiles",
"title": "Profiler en avbildning kan erbjuda",
"blocks": [
{
"table": {
"headers": [
"Profil",
"Resulterande konfiguration",
"Erbjuds när"
],
"rows": [
[
"Intel/AMD VA-API",
"Rendernod i <code>/dev/dri</code>",
"Applikationen stöder videoacceleration"
],
[
"OpenCL",
"Rendernod, <code>/dev/kfd</code> vid behov och den officiella modden",
"Avbildningen eller profilen dokumenterar den"
],
[
"NVIDIA",
"Värdens drivrutinsenheter och bibliotek",
"Värden har en fungerande drivrutin och NVIDIA Container Toolkit"
],
[
"Coral",
"<code>/dev/apex_0</code> eller USB buss",
"Profilen förklarar Coral Support (Frigate)"
],
[
"USB, seriell, FUSE",
"En enhet, ett validerat träd eller en LXC-funktion",
"Kontraktet begär det"
]
]
}
}
]
},
{
"id": "nvidia",
"title": "NVIDIA",
"blocks": [
{
"calloutWarning": {
"title": "Nodkrav: NVIDIA Container Toolkit",
"body": "En fungerande drivrutin på Proxmox VE är inte tillräckligt för att ge en NVIDIA GPU till en OCI-avbildning. OCI Manager Apps använder <code>nvidia-container-cli</code>, från NVIDIA Container Toolkit, för att identifiera enheterna och för att få binärer och bibliotek som matchar den laddade drivrutinen."
}
},
{
"p": "<nvidiaLink>ProxMenux NVIDIA-installerare</nvidiaLink> installerar NVIDIA Container Toolkit från NVIDIAs officiella arkiv tillsammans med drivrutinen. Den kontrollerar dess fyra paket, validerar <code>nvidia-container-cli</code> och registrerar resultatet i ändringsloggen för <auditLink>Audit & Report</auditLink>."
},
{
"p": "Dessa två kommandon på värden visar om drivrutinen och Toolkit är tillgängliga:"
},
{
"shell": {
"code": "nvidia-smi -L\nnvidia-container-cli --version"
}
},
{
"p": "På en värd där drivrutinen installerades på annat sätt installeras Toolkit från det officiella stabila förvaret:"
},
{
"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": "Inventeringen OCI Manager Apps använder är utdata av:"
},
{
"shell": {
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
}
},
{
"calloutInfo": {
"title": "Docker runtime konfiguration är inte involverad",
"body": "Containrarna är inbyggda LXC:er utan Docker-demon, så <code>nvidia-ctk runtime configure --runtime=docker</code> ingår inte: ProxMenux frågar <code>nvidia-container-cli</code> direkt och skriver LXC-enheter och monteringar. Kommandon och plattformar som stöds underhålls i <toolkitLink>installationsguiden för NVIDIA Container Toolkit</toolkitLink>."
}
},
{
"cards": {
"items": [
{
"icon": "cpu",
"title": "Inventering från drivrutinen",
"body": "<code>nvidia-container-cli</code> listar enhetsnoder, binärer, firmware och bibliotek av den installerade drivrutinen."
},
{
"icon": "refresh",
"title": "Ingen fast version",
"body": "Mallen anger inga biblioteksfilnamn. Profilen genereras från den aktuella värden."
},
{
"icon": "shield",
"title": "Skrivskyddade monteringar",
"body": "Värdens bibliotek monteras skrivskyddat i stället för att kopieras till containern."
},
{
"icon": "hardDrive",
"title": "Ändringar av drivrutin",
"body": "Efter en drivrutinsändring genereras inventeringen på nytt innan berörda LXC:er startar."
}
]
}
},
{
"code": {
"title": "NVIDIA resultat (förenklad)",
"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": "Att bara ge tillgång till <code>/dev/nvidia0</code> räcker inte. Den laddade drivrutinens användarkomponenter monteras skrivskyddat, och <code>nvidia-smi</code> körs sedan i LXC:n för att jämföra GPU, UUID, PCI-buss och version med värdens inventering."
}
]
},
{
"id": "usb",
"title": "USB, seriell och USB Coral",
"blocks": [
{
"calloutWarning": {
"title": "USB-nummer kan ändra",
"body": "En väg som <code>/dev/bus/usb/003/004</code> kan ändras när enheten är återansluten eller värden startar om. Profilen registrerar tillverkaren, produkten och serienumret när de är tillgängliga, men en ny bussadress mappas om inte automatiskt."
}
},
{
"p": "En kringutrustning anges med sin specifika nod: <code>/dev/ttyUSB0</code>, <code>/dev/ttyACM0</code>, <code>/dev/apex_0</code> eller <code>/dev/bus/usb/BBB/DDD</code>. Att passera hela <code>/dev</code> accepteras inte. Coral erbjuds endast program vars profil anger det."
}
]
},
{
"id": "trees",
"title": "Enhetsträd och LXC-funktioner",
"blocks": [
{
"table": {
"headers": [
"Begäran",
"Resulterande konfiguration",
"Omfattning"
],
"rows": [
[
"<code>/dev/dvb</code>, <code>/dev/snd</code> eller <code>/dev/bus/usb</code>",
"Varje teckenenhetsnod i trädet får en egen <code>devN</code>-post med värdens läge och GID",
"Endast det begärda trädet, inte resten av <code>/dev</code>"
],
[
"<code>/dev/fuse</code>",
"Noden och när profilen behöver den, funktionen <code>fuse=1</code>",
"FUSE offentliggör inte fästen till andra LXCs"
],
[
"<code>/dev/net/tun</code>",
"En <code>devN</code>-post med samma sökväg inuti LXC:n",
"VPN- eller nätverkskonfigurationen stannar i programmet"
],
[
"<code>/dev/kvm</code>",
"En validerad <code>devN</code>-post",
"Erbjuds endast när kontraktet begär det"
]
]
}
}
]
},
{
"id": "security",
"title": "Bekräftelser av risknivå",
"blocks": [
{
"p": "Konkreta enheter, valfri privilegiering, krävs privilegier, AppArmor eller seccomp avslappning och tillgång till värd PID-namnrymden behandlas som separata fall, inte under en generisk privilegierad etikett. Varje alternativ med en risk förklaras och bekräftas under installationen."
}
]
}
]
}
+213
View File
@@ -0,0 +1,213 @@
{
"meta": {
"title": "OCI manager Apps | ProxMenux",
"description": "Kör officiella OCI-avbildningar som LXC-containrar direkt i Proxmox VE, med beständiga data, enhetsåtkomst, program med flera containrar och transaktionsbaserade uppdateringar."
},
"header": {
"title": "OCI manager Apps",
"description": "Officiella OCI-avbildningar körs som inbyggda LXC-containrar i Proxmox VE. Avbildningen är fortfarande den som underhållaren publicerar; ProxMenux återskapar miljön som Docker Compose annars skulle ha skapat runt den.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "model",
"blocks": [
{
"calloutInfo": {
"title": "En OCI-avbildning, en LXC direkt i Proxmox VE",
"body": "Ingen Docker Engine körs i containrarna. Proxmox VE importerar avbildningens filsystem och OCI-metadata. Programmet blir huvudprocessen i en inbyggd LXC-container som hanteras med samma verktyg som övriga containrar på noden."
}
},
{
"flow": {
"nodes": [
{
"label": "Källa",
"detail": "OCI-avbildning\nCompose och dokumentation"
},
{
"label": "ProxMenux",
"detail": "JSON-kontrakt\nvalidering och planering"
},
{
"label": "Proxmox VE",
"detail": "LXC direkt i Proxmox VE\nvolymer och enheter"
}
],
"caption": "Programmet byggs inte om. Dess miljö beskrivs deklarativt och återskapas."
}
}
]
},
{
"id": "where",
"title": "Var du hittar det",
"intro": "Öppna <strong>OCI manager Apps (Technology Preview)</strong> i ProxMenux huvudmeny på Proxmox-noden som root. Den första vyn erbjuder:",
"blocks": [
{
"list": {
"items": [
"<strong>Sök program</strong> – sök efter namn i hela katalogen.",
"<strong>Alla program</strong> – visa hela katalogen och antalet program.",
"<strong>Hantera installerade OCI-program</strong> – uppdatera, ändra, ta bort eller återställ befintliga installationer.",
"<strong>Registerkonton</strong> – hantera konton för att installera och uppdatera avbildningar från privata register.",
"<strong>Installera en avbildning utanför katalogen</strong> – anpassa en Compose-fil, ett <code>docker run</code>-kommando eller en avbildningsreferens.",
"Katalogens kategorier, var och en med sitt antal program."
]
}
},
{
"figure": {
"src": "/oci-manager/main-menu.png",
"alt": "Huvudvyn i OCI manager Apps med sökning, hela katalogen, programhantering, avbildningar utanför katalogen och kategorier.",
"caption": "Huvudvyn i OCI manager Apps."
}
},
{
"p": "När du väljer ett program visas dess beskrivning, avbildningen som används och två installationslägen. <strong>Installera med standardinställningar</strong> frågar bara efter grundvalen: lagring, dataplacering, adress och start. <strong>Installera med avancerade inställningar</strong> går igenom alla val i ordning: VMID och resurser, lagring för varje sökväg, nätverksbrygga och enheter."
},
{
"p": "Program som faktiskt har testats visas som <strong>Verifierad</strong> i den här vyn och markeras med ✓ i listorna, oavsett om testet gjordes i ProxMenux labb eller av användargemenskapen."
}
]
},
{
"id": "beta",
"title": "Varför beteckningen Technology Preview används",
"blocks": [
{
"p": "OCI manager Apps behåller beteckningen <strong>Technology Preview</strong> som Proxmox VE använder för programcontainrar skapade från OCI-avbildningar. Stödet infördes i Proxmox VE 9.1. Beteckningen gäller tekniken som OCI manager Apps bygger på, inte ProxMenux-motorn: containrarnas beteende kan fortfarande ändras mellan Proxmox VE-versioner. Beteckningen behålls tills Proxmox VE bedömer att stödet är stabilt."
},
{
"p": "Funktionerna i OCI manager Apps testas i ProxMenux labb: installation, uppdatering, ändringar, återskapande, säkerhetskopiering, återställning, migrering och watchdog. Varje program testas separat. De som faktiskt har testats visas som <strong>Verifierad</strong> och markeras med ✓ i listorna."
}
]
},
{
"id": "translation",
"title": "Så beskriver Docker kraven och så omsätter OCI manager Apps dem",
"blocks": [
{
"table": {
"headers": [
"Krav",
"Så uttrycks det i Docker",
"Så omsätts det i OCI manager Apps"
],
"rows": [
[
"Kör programmet",
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
"OCI-avbildningens rootfs och LXC-containerns huvudprocess"
],
[
"Bevara konfigurationen",
"<code>volumes: /config</code>",
"En beständig <code>mpN</code>-volym som tas med i säkerhetskopian, eller en katalog på värden."
],
[
"Gör tjänsten tillgänglig",
"<code>ports</code>",
"En egen adress för LXC-containern och tjänstens åtkomst-URL."
],
[
"Använd maskinvara",
"<code>devices</code>, <code>group_add</code>",
"<code>devN</code>-poster med värdens effektiva grupp-ID (GID) och en validerad profil."
],
[
"Koppla ihop beroenden",
"<code>networks</code>, <code>depends_on</code>",
"En privat nätverksbrygga, fasta adresser, startordning och hälsokontroller."
],
[
"Uppdatera",
"Hämta med <code>pull</code> och återskapa",
"Ett nytt rootfs med samma kontrakt för beständiga data."
]
]
}
}
]
},
{
"id": "kept",
"title": "Vad som bevaras och vad som ändras",
"blocks": [
{
"cards": {
"items": [
{
"icon": "archive",
"title": "Bevaras",
"body": "Den officiella avbildningen, dess interna sökvägar, miljö, startprocess och användardokumentation."
},
{
"icon": "boxes",
"title": "Anpassas",
"body": "Körmiljön: nätverk, beständiga data, enheter, behörigheter och beroenden använder de inbyggda LXC-funktionerna i Proxmox VE."
},
{
"icon": "shield",
"title": "Utan motsvarighet",
"body": "Ett Compose-alternativ utan en säker motsvarighet markeras som ett hinder för installationen. Mallar med sådana hinder erbjuds inte för installation, och känsliga alternativ måste bekräftas i installationsguiden."
},
{
"icon": "refresh",
"title": "Sparas",
"body": "Avbildningens digest, resurser, sökvägar, nätverk, enheter och tillhörighet till en stack sparas i instanskontraktet. Uppdateringar och återskapande följer samma kontrakt."
}
]
}
}
]
},
{
"id": "pages",
"title": "Sidor i det här avsnittet",
"blocks": [
{
"next": {
"items": [
{
"label": "Så anpassas en OCI-avbildning",
"href": "/docs/oci-manager/architecture",
"tail": "Från avbildningen och dess Compose-fil till en LXC direkt i Proxmox VE."
},
{
"label": "Installera en avbildning utanför katalogen",
"href": "/docs/oci-manager/custom-image",
"tail": "En Compose-fil, ett docker run-kommando eller en avbildningsreferens."
},
{
"label": "Data, sökvägar och nätverk",
"href": "/docs/oci-manager/storage-network",
"tail": "Containervolymer, kataloger på värden, rclone-monteringar och adresser."
},
{
"label": "Enheter och acceleration",
"href": "/docs/oci-manager/hardware",
"tail": "GPU, NVIDIA, Coral, USB och andra enheter."
},
{
"label": "Program med flera containrar",
"href": "/docs/oci-manager/stacks",
"tail": "Program, databas och cache i samordnade LXC-containrar."
},
{
"label": "Installera, uppdatera och ändra",
"href": "/docs/oci-manager/lifecycle",
"tail": "Instanskontraktet och dess åtgärder."
},
{
"label": "I ProxMenux Monitor",
"href": "/docs/oci-manager/monitor",
"tail": "Versioner, uppdateringar, konsolutdata och terminal."
}
]
}
}
]
}
]
}
@@ -0,0 +1,499 @@
{
"meta": {
"title": "Installera, uppdatera och ändra | ProxMenux",
"description": "Instanskontraktet för en OCI-container och de åtgärder som använder det: uppdatering, ändring, borttagning, återupptagning av en avbruten åtgärd och återställning av driften efter en återläsning på denna eller en annan värd."
},
"header": {
"title": "Installera, uppdatera och modifiera",
"description": "Varje instans behåller ett reproducerbart kontrakt, så att dess rootfs kan ersättas utan att konfiguration eller beständiga data går förlorade.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "contract",
"title": "Instanskontraktet",
"blocks": [
{
"p": "Efter installationen sparas den faktiska konfigurationen i <code>/usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json</code>. Det är inte en kopia av den ursprungliga Compose-filen, utan ett reproducerbart kontrakt för den LXC som finns på värden."
},
{
"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": "En kopia av kontraktet finns i containern under <code>/.proxmenux/oci-record.json</code> och kan bara läsas av containerns root-användare. En säkerhetskopia av containern innehåller därför alltid det kontrakt som gällde då. En andra kopia sparas i <code>/etc/pve/priv/proxmenux/oci</code>, som delas av alla noder i klustret och bara kan läsas av värdens root-användare. Båda kopiorna skrivs efter varje installation, uppdatering och ändring."
}
]
},
{
"id": "manage",
"title": "Hantera installerade OCI-program",
"intro": "Det här alternativet på huvudskärmen listar registrerade instanser med tillhörande program och avbildning. Varje instans kontrolleras mot sitt kontrakt före varje åtgärd. En CT som inte längre stämmer med sin post varken ändras eller tas bort. Samma uppdatering och editor finns på fliken Uppdateringar i <monitorLink>ProxMenux Monitor</monitorLink>.",
"blocks": [
{
"table": {
"headers": [
"Alternativ",
"Vad ändras",
"Vad bevaras"
],
"rows": [
[
"Uppdatera avbildningen med sparad konfiguration",
"Rootfs ersätts med den avbildning som den sparade kanalen publicerar för närvarande",
"Kontrakt, containerdiskar, värdkataloger, nätverk och enheter"
],
[
"Ändra: redigera resurser, nätverk, sökvägar och GPU",
"Editorn öppnas med det aktuella kontraktet; CT:n byggs om med ändringarna",
"Data på containerdiskar och i värdkataloger"
],
[
"Watchdog: starta om programmet när det kraschar",
"Om programmet ska startas igen när det stannar av sig självt. Ingenting byggs om",
"Hela installationen; endast valet sparas i kontraktet"
],
[
"Ta bort: ta bort programmet och dess containrar",
"LXC, eller varje medlem i en stack, och deras kontrakt raderas",
"Värdkataloger, med deras innehåll"
]
]
}
},
{
"p": "För ett program med flera containrar erbjuder menyn <strong>Uppdatera alla programmets containrar</strong>, <strong>Ändra extra sökvägar och enheter</strong>, <strong>Återskapa alla containrar med sparad konfiguration</strong>, watchdog och borttagning. Ändra lägger till eller tar bort extra sökvägar och enheter i programcontainern utan att bygga om något och ändrar i Immich vad som kör igenkänningen. Återskapa bygger om varje container från den avbildning som användes vid installationen utan att söka efter en nyare."
},
{
"figure": {
"src": "/oci-manager/manage-menu.png",
"alt": "Lista över installerade OCI-program med alternativ för att uppdatera, ändra och ta bort",
"caption": "Hantera installerade OCI-program."
}
}
]
},
{
"id": "update",
"title": "En transaktionell uppdatering",
"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": "Användare",
"registry": "OCI-registret",
"update": "Uppdatera instans",
"resolve": "Slå upp taggen",
"verify": "Verifiera arkivet och kör förkontroller",
"backup": "Stoppa och säkerhetskopiera CT:n",
"import": "Importera det nya rootfs",
"reapply": "Applicera kontraktet igen",
"healthy": "frisk",
"failure": "misslyckande",
"commit": "Kontraktet publiceras med den nya digesten",
"restored": "Tidigare instans återställd"
}
}
},
{
"list": {
"items": [
"Om registret fortfarande tillhandahåller den installerade digesten laddas ingenting ned och instansen lämnas orörd.",
"Den nya avbildningen verifieras lager för lager innan CT:n stoppas. En skadad nedladdning hämtas en andra gång; en redan cachad avbildning som inte klarar kontrollen laddas ned igen.",
"Inställningar som ändrats i Proxmox VE efter installationen (minne, swap, kärnor, CPU-gräns, CPU-prioritet och start med noden) bevaras och förs över till det nya kontraktet.",
"LAN-gränssnittet som Arr-sviten och multi-container-applikationerna lägger till (<code>net1</code>) och startordern (<code>startup</code>) ges tillbaka till den nya containern som de är.",
"Alla andra skillnader mellan CT och dess kontrakt stoppar uppdateringen innan CT stoppas."
]
}
},
{
"flow": {
"nodes": [
{
"label": "Före",
"detail": "rootfs A\n/config mp0\n/media värdkatalog"
},
{
"label": "Uppdatering",
"detail": "ersätter endast\nrootfs"
},
{
"label": "Efter",
"detail": "rootfs B\n/config mp0\n/media värdkatalog"
}
]
}
},
{
"p": "Innan något stoppas kontrolleras att det finns plats för säkerhetskopian: använda data på de volymer som ingår, plus en marginal. Den skrivs intill programmets post på värdens systemdisk. Om utrymmet inte räcker ber menyn om en annan lagring på värden som stöder säkerhetskopior. Kopian skapas där och tas bort när åtgärden är klar. Valet sparas för programmet, även för schemalagda uppdateringar. Om ingen lagring har tillräckligt med plats avvisas åtgärden och programmet förblir oförändrat. Utrymmet för den nya avbildningen kontrolleras på samma sätt före nedladdningen."
}
]
},
{
"id": "recovery",
"title": "Återställa en avbruten operation",
"intro": "En uppdatering och en förändring använder en ihållande transaktion. Om processen, terminalen eller noden avbryts efter CT-stoppen, är operationen inte färdig.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Markör för väntande åtgärd",
"body": "När Hantera installerade OCI-program öppnas visar det sparade tillståndet att ersättningen aldrig publicerades."
},
{
"title": "Visa status",
"body": "Visar den fas som uppnåddes utan att ändra containrar eller data."
},
{
"title": "Återställ den tidigare installationen",
"body": "Återläser den verifierade säkerhetskopia i plattformens eget format som togs före ersättningen samt det tidigare kontraktet."
},
{
"title": "Stackar som en enhet",
"body": "För en multicontainer-applikation återhämtas varje medlem från samma transaktionspunkt, inte bara den valda."
}
]
}
},
{
"calloutWarning": {
"title": "Värdkataloger ingår inte i återställningen",
"body": "Säkerhetskopian omfattar rootfs och de containerdiskar som ingår i den. En värdkatalog återställs inte till sitt tidigare tillstånd, eftersom andra LXC-containrar kan använda dess data."
}
}
]
},
{
"id": "watchdog",
"title": "Watchdog: starta om ett program som stannar",
"intro": "Proxmox har ingen omstartspolicy: när processen i en programcontainer avslutas förblir containern stoppad. Med watchdog aktiverad startas ett program som stannar av sig självt igen. För ett OCI-program gör den vad <code>restart: unless-stopped</code> gör i en Compose-fil.",
"blocks": [
{
"table": {
"headers": [
"Vad händer",
"Med Watchdog på"
],
"rows": [
[
"Programmet kraschar eller dess process avslutas",
"Containern startas igen inom några sekunder"
],
[
"Det stoppas eller stängs av från Proxmox, från Monitor eller med <code>pct</code>",
"Den förblir stoppad tills någon startar den"
],
[
"En backup, en migration eller en ProxMenux-operation arbetar med den",
"Ingenting görs förrän det slutar"
],
[
"Den var redan stoppad när värden startade",
"Den förblir stoppad; detta styrs av <strong>Starta med Proxmox</strong>"
],
[
"Den stannar upprepade gånger direkt efter start",
"För ett program som stannar inom några sekunder efter start, eller inte startar alls, görs fem startförsök med 30 sekunders, 1, 2 och 5 minuters väntan mellan försöken. Därefter lämnas det stoppat och en avisering skickas"
]
]
}
},
{
"p": "Installationsprogrammet frågar om detta i båda installationslägena och föreslår värdet från programmets recept. Inställningen kan senare ändras under <strong>Hantera installerade OCI-program</strong> eller med containerns <strong>Watchdog</strong>-reglage i <monitorLink>ProxMenux Monitor</monitorLink> och gäller alla containrar i ett program med flera containrar. En enda tjänst på värden, <code>proxmenux-oci-watchdog.service</code>, övervakar alla program som begärt det. Installationen visas på fliken Ändringar i Audit & Report."
},
{
"calloutInfo": {
"title": "Vad värden inte kan avgöra",
"body": "Programmets slutkod når inte värden, så ett normalt avslut och en krasch ser likadana ut och leder båda till omstart, som <code>always</code> och <code>unless-stopped</code> i Docker. Ett stopp som begärs utanför Proxmox med <code>lxc-stop</code> eller <code>systemctl</code> lämnar ingen stoppuppgift och tolkas som att programmet stannade av sig självt."
}
}
]
},
{
"id": "restore",
"title": "Backup, restaurering och en annan värd",
"intro": "En säkerhetskopia som görs med vzdump eller Proxmox Backup Server innehåller containern, de containerdiskar som valts för säkerhetskopiering och kopian av dess kontrakt. Det som installationen sparar på värden ingår inte. <strong>Hantera installerade OCI-program</strong> upptäcker containrar som återlästs på en värd utan deras kontrakt, efter en ny Proxmox-installation eller på en annan värd, och erbjuder att registrera dem igen.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Återställ containrarna i Proxmox",
"body": "Från säkerhetskopieringslagringen, med det ursprungliga ID:t eller ett annat ledigt ID. Ett program med flera containrar behöver samtliga sina containrar."
},
{
"title": "Öppna Hantera installerade OCI-program",
"body": "De återlästa containrarna listas och återställning erbjuds. Knappen <strong>Återställ</strong> på fliken Uppdateringar i <monitorLink>ProxMenux Monitor</monitorLink> öppnar samma återställning."
},
{
"title": "Kontrollera innan du ändrar",
"body": "Återställningen kontrollerar att värden har allt som varje program behöver. Ett program som inte kan återställas i sin helhet lämnas oförändrat och orsaken anges."
},
{
"title": "Registrera och starta",
"body": "Kontraktet registreras på den här värden och det som installationen sparade där skrivs på nytt. Om programmen ska startas är en separat fråga. Svara Nej om de ursprungliga containrarna fortfarande körs på en annan värd."
}
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Dialog som listar de restaurerade containrarna och erbjuder att återställa dem",
"caption": "Återställningen som erbjuds när Hantera installerade OCI-program öppnas."
}
},
{
"table": {
"headers": [
"Vad värden sparade",
"Efter återhämtningen"
],
"rows": [
[
"Instanskontrakt",
"Registreras från kopian i containern, som kontrolleras mot den konfiguration som Proxmox återläste"
],
[
"Privat nätverk av en multi-container-applikation",
"Skapad igen med samma bro och undernät; de fasta adresserna i containrarna ändras inte"
],
[
"Startorder för en multicontainer-applikation",
"Beroende hookscript och dess kontrakt installeras igen; snippets är aktiverade på <code>local</code> lagring när ingen lagring accepterar dem"
],
[
"Nätverks-sysctl och fil för värdövervakning",
"Skriven igen i <code>/etc/pve/proxmenux</code>"
],
[
"NVIDIA-körmiljö",
"Hooken för en oprivilegierad container installeras på nytt. En privilegierad container får den här värdens drivrutinsfiler i stället för filerna från ursprungsvärden"
],
[
"Rclone montering",
"Hookscriptet och de program som gör monteringen tillgänglig skrivs på nytt, med samma vyer på värden"
],
[
"Brandväggsregel på värden för en värdmonitor",
"Efterfrågas igen för dess webbport och bryggans undernät på den här värden"
],
[
"<code>lost+found</code> av varje återställd disk",
"Tas bort om den är tom; en återläsning skapar den och vissa program kan inte starta om den finns bland deras data"
],
[
"Diskar som återlästs till annan lagring",
"Kontraktet uppdateras till lagringen de är på nu"
]
]
}
},
{
"p": "En container som återlästs med ett annat ID behåller sitt program. Kontraktet, konsolloggen, nätverksparametrarna för sysctl, hookscriptet för en Rclone-montering och startordningen för ett program med flera containrar registreras med de ID:n som containrarna har på den här värden."
},
{
"table": {
"headers": [
"Vad hindrar en återställning",
"Vad du gör"
],
"rows": [
[
"En container av en multicontainer-applikation saknas",
"Återläs den också; programmet återställs i sin helhet"
],
[
"Det privata undernätet används redan på den här värden",
"Återhämtningen avbryts och ingenting ändras: adresserna till containrarna är fasta och flyttas inte till ett annat undernät."
],
[
"En värdkatalog finns inte",
"Montera eller skapa den med dess data; en säkerhetskopia av containern inkluderar inte värdkataloger"
],
[
"En enhet finns inte på denna värd",
"Anslut den eller ta bort den från containern i Proxmox"
],
[
"Ett program med NVIDIA på en värd utan drivrutinen",
"Installera NVIDIA-drivrutinen och Container Toolkit"
],
[
"Backupen gjordes innan kopian av kontraktet fanns",
"Containern stannar som en vanlig LXC och erbjuds inte igen"
]
]
}
},
{
"calloutInfo": {
"title": "En container som kommer tillbaka",
"body": "En container som återlästs över sig själv från en äldre säkerhetskopia, återställts till en ögonblicksbild eller återvänt från en annan nod bär kontraktet för sitt nuvarande tillstånd. Om den väljs för en åtgärd och dess kontrakt skiljer sig från värdens startar åtgärden inte, och containern erbjuds för återställning."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Resultatet av återhämtningen med det privata nätverket, startordern och de registrerade containrarna",
"caption": "Resultatet av en återhämtning steg för steg."
}
}
]
},
{
"id": "remove",
"title": "Ta bort en OCI-applikation",
"blocks": [
{
"p": "Före bekräftelsen skapas en sammanfattning utifrån den faktiska konfigurationen: containrarna som tas bort, data som raderas med dem, det privata nätverket som frigörs och värdkatalogerna som bevaras. Bekräftelsen är förvald till <strong>Nej</strong>, eftersom data på raderade diskar inte kan återställas efteråt."
},
{
"table": {
"headers": [
"Resurs",
"Vid borttagning",
"Orsak"
],
"rows": [
[
"rootfs och containerdiskar",
"Raderas",
"De tillhör endast containern"
],
[
"Värdkatalog",
"Bevaras med sitt innehåll",
"Andra applikationer kan använda den"
],
[
"Containerns filer på värden",
"Raderas",
"Dess konsollogg, nätverkssysctls, Rclone montering hookscript och dess registrering i App-fliken ProxMenux Monitor tjänar ingen annan container"
],
[
"Filer som delas av flera installationer",
"Tas bort när den sista installationen som använder dem tas bort",
"Värdmonitorfilen och hookscriptet för beroenden i program med flera containrar"
],
[
"Instanskontrakt",
"Tas bort efter en framgångsrik borttagning",
"Ingen CT är associerad med den mer"
],
[
"Privat brygga för en stack",
"Frigörs med stacken",
"Det har inga medlemmar kvar att ansluta"
],
[
"Nätverk som delas av Arr-paketet",
"Frigörs när det sista programmet i sviten tas bort",
"Varje program i sviten är oberoende och tas bort separat"
],
[
"En enda medlem av en stack",
"Tas inte bort separat",
"Hela applikationen tas bort, så ingen stack lämnas ofullständig"
],
[
"En container på en annan nod av klustret",
"Inte borttagen",
"Dess rekord och värdfiler är på noden där den installerades: den tas bort där, efter att ha migrerat den tillbaka."
]
]
}
},
{
"figure": {
"src": "/oci-manager/remove-summary.png",
"alt": "Sammanfattning av borttagningen med berörda containrar, data och värdkataloger",
"caption": "Sammanfattningen av borttagningen, skapad utifrån den faktiska konfigurationen."
}
}
]
},
{
"id": "archives",
"title": "Nedladdade avbildningar och utrymme på värden",
"blocks": [
{
"p": "OCI-arkivet används för att bygga rootfs; den körande CT:n läser det inte. Efter en installation eller uppdatering listas de arkiv som laddades ned under åtgärden med sina storlekar, och borttagning erbjuds. Att ta bort dem frigör utrymme utan att påverka containern eller dess data."
},
{
"calloutInfo": {
"title": "Uppdateringar behöver inte arkivet",
"body": "Utan arkivet slår en uppdatering upp den sparade kanalen och laddar ned den nya digesten. Om arkivet finns återanvänds det bara när dess referens och integritet motsvarar det som begärs."
}
}
]
},
{
"id": "registry",
"title": "Register och rensning",
"blocks": [
{
"p": "När <strong>Hantera installerade OCI-program</strong> öppnas tas först rester bort efter containrar som inte längre finns på någon nod i klustret: posten som sparats som historik efter borttagning via Proxmox-gränssnittet och värdfiler som lämnats kvar efter en borttagning. En post med en halvfärdig åtgärd behålls eftersom säkerhetskopian fortfarande kan behövas. Volymer och värdkataloger raderas aldrig utifrån antaganden."
}
]
},
{
"id": "cluster",
"title": "I ett kluster: migration och hög tillgänglighet",
"intro": "En OCI-container är en vanlig Proxmox-LXC: den kan migreras eller hanteras av HA som andra containrar, med samma begränsningar. Det som behövs för att starta den sparas där alla noder i klustret kan hitta det.",
"blocks": [
{
"table": {
"headers": [
"Delar",
"På en annan nod av klustret"
],
"rows": [
[
"Konsollogg",
"Containern skapar <code>/var/log/proxmenux/oci</code> före start på den nod som kör den. Varje nod sparar loggen för de starter som utförts där."
],
[
"Nätverks-sysctl och värdmonitor",
"Sparas i <code>/etc/pve/proxmenux</code>, som delas av alla noder i klustret, så att en migrerad container hittar dem."
],
[
"Containerdiskar",
"Proxmox flyttar dem med containern. HA behöver ha deras data tillgängliga på målnoden via delad lagring eller en replikering som stöds."
],
[
"Värdkataloger och enheter",
"Samma regler som alla LXC: en värdkatalog måste finnas på målnoden och markeras som delad, och en GPU, Coral eller NPU måste finnas där."
],
[
"ProxMenux-post",
"Kontraktet stannar på noden där programmet installerades, och varje nod läser kopian i <code>/etc/pve/priv/proxmenux/oci</code>. Ett program med en enda container som migreras registreras på målnoden när <strong>Hantera installerade OCI-program</strong> öppnas eller en åtgärd startas för programmet. Ett program med flera containrar erbjuds för återställning där eftersom dess privata nätverk måste skapas på den noden."
]
]
}
},
{
"calloutWarning": {
"title": "Inte för hög tillgänglighet",
"body": "En multi-container-applikation når sina medlemmar genom en privat bro av noden som den installerades på, så dess medlemmar stannar på den noden. En värdmonitor, såsom Glances i värdläge eller Netdata, övervakar den nod som den körs på; flytta den skulle övervaka en annan nod."
}
},
{
"p": "När programmet återställs får en säkerhetskopia som återlästs utanför klustret de filer från <code>/etc/pve/proxmenux</code> som containern använder."
}
]
},
{
"id": "channel",
"title": "En rullande tag är inte en obevakad uppdatering",
"blocks": [
{
"p": "Katalogen installerar den rullande tagg som underhållaren publicerar, men den faktiska digesten slås upp och sparas och ändras bara genom en uttrycklig uppdatering med förkontroller och återställning. <monitorLink>ProxMenux Monitor</monitorLink> jämför den installerade digesten med den som registret publicerar och visar och aviserar när en ny avbildning är tillgänglig."
}
]
}
]
}
@@ -0,0 +1,213 @@
{
"meta": {
"title": "OCI-behållare i ProxMenux Monitor | ProxMenux",
"description": "Vad ProxMenux Monitor visar för en container installerad av OCI Manager Apps: applikations- och avbildningsversioner, nya avbildningar, konsolutdata och Proxmox VE-terminalen."
},
"header": {
"title": "I ProxMenux Monitor",
"description": "En container installerad av OCI Manager Apps visas i VMs & LXCs som alla andra LXC. Dess modal läser installationsposten: applikations- och avbildningsversioner, nya avbildningar, konsolutdata och terminal.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Posten är källan",
"body": "OCI Manager Apps vet vad den installerade och var den kom ifrån. Monitorn läser det installationsrekordet istället för att prova containern, så data är detsamma om containern körs eller stoppas."
}
},
{
"table": {
"headers": [
"Flik",
"Vilka förändringar för en OCI container"
],
"rows": [
[
"Status",
"En <strong>Watchdog</strong>-brytare under Start vid start: programmet startas igen när det stannar på egen hand."
],
[
"App",
"Programmet identifieras från posten och uppdateringar spåras av avbildning"
],
[
"Uppdateringar",
"Avbildningen uppdateras eller programmet ändras, med samma flöde som OCI-menyn"
],
[
"Monteringar",
"Container diskar och värd kataloger, med deras användning"
],
[
"Loggar",
"Endast för OCI-containrar: programmets konsolutdata"
]
]
}
}
]
},
{
"id": "app",
"title": "App",
"intro": "<appLink>App</appLink>-fliken erbjuder den installerade applikationen som en detektering, med namnet, logotypen, porten och schemat för posten. När den registreras öppnas redigeraren med metoden <strong>OCI-avbildning (installerad av ProxMenux) </strong>, som inte behöver någon konfiguration.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "boxes",
"title": "Program",
"body": "Versionen av applikationen i avbildningen, läs från själva avbildningen: dess miljö eller <code>org.opencontainers.image.version</code>-etiketten. Det är informativt."
},
{
"icon": "archive",
"title": "Avbildning",
"body": "Byggdatum och digest för den installerade avbildningen. Uppdateringen avgörs här: installerad digest jämförs med den som registret publicerar för samma tagg i dag."
}
]
}
},
{
"list": {
"items": [
"När registret publicerar en ny digest visar kortet <strong>Ny avbildning</strong> med datum och digest, även om programversionen inuti inte ändrats: en ombyggnad på en uppdaterad bas är en uppdatering.",
"När digestvärdena matchar visar kortet <strong>Version</strong>.",
"Kortet länkar till bildförvaret: dess GitHub-projekt, eller dess Docker Hub-sida för en officiell avbildning.",
"Tillgångslänken använder containerns LAN-adress, även för huvudmedlemmen i en multi-container-applikation, som har en andra adress på sitt privata nätverk.",
"Knappen <strong>Uppdatera data</strong> läser installationsposten och avbildningsregistret igen. Alternativen för att söka efter eller registrera andra program visas inte: containern innehåller exakt det program som anges i posten."
]
}
},
{
"figure": {
"src": "/oci-manager/monitor-app-tab.png",
"alt": "App-fliken för en OCI-behållare med applikationsversionen, avbildningen och förvaringslänken",
"caption": "App-fliken för en container installerad av OCI Manager Apps."
}
},
{
"p": "Kontrollen körs en gång om dagen med uppdateringskontrollerna av Monitor, och <strong>Uppdatera data</strong> kör den omedelbart. En ny avbildning skickas som ett meddelande via de kanaler som konfigureras i <notificationsLink>Aviseringar</notificationsLink>. Uppdateringen tillämpas från fliken Uppdateringar."
}
]
},
{
"id": "updates",
"title": "Uppdateringar",
"intro": "För en container installerad av OCI Manager Apps visar fliken Uppdateringar programmet med sin installerade avbildning och när registret publicerar en, den nya avbildningen, i samma format som alla andra program. Paket- och programuppdaterarna för en vanlig LXC visas inte.",
"blocks": [
{
"table": {
"headers": [
"Knapp",
"Vad det öppnar"
],
"rows": [
[
"Uppdatering",
"Uppdateringen från <lifecycleLink>Hantera installerade OCI-program</lifecycleLink> för denna container i Monitors terminal. Den kan köras med eller utan ny avbildning; utan en ny avbildning ändras ingenting. I ett program med flera containrar uppdateras alla medlemmar."
],
[
"Ändra",
"Redigeraren för programmet (resurser, nätverk, vägar och GPU). I en multi-container-applikation lägger den till eller tar bort de extra vägarna och enheterna i applikationsbehållaren och i Immich ändrar det som kör igenkänning."
],
[
"Återställ",
"Ersätter uppdatering när en operation på containern avbröts och öppnar sin återhämtning."
],
[
"Återställ (återställd container)",
"Visas för en container återställd från säkerhetskopia som saknar kontrakt på denna värd, under <strong>Återställt OCI-program</strong>. Öppnar <lifecycleLink>återställningen</lifecycleLink> i Monitors terminal; Uppdatera och Ändra visas när den har registrerats."
]
]
}
},
{
"p": "Externa förändringar, värdkataloger och multi-container-applikationer hanteras som i OCI-menyn. I en multi-container-applikation visas knapparna och alternativen endast på huvudbehållaren; de andra medlemmarna visar sin avbildning, en anteckning om att de uppdateras från huvudbehållaren och en knapp som öppnar den. När terminalen stängs läses avbildningen, posten och monteringarna igen."
},
{
"table": {
"headers": [
"Alternativ",
"Beteende"
],
"rows": [
[
"Behåll säkerhetskopian som tas före uppdateringen",
"Varje uppdatering backar upp containern för att återställa den om uppdateringen misslyckas. Med det här alternativet hålls samma säkerhetskopiering i den valda lagringen och visas bland säkerhetskopiorna i CT; på Proxmox Backup Server skrivs en säkerhetskopia före uppdateringen."
],
[
"Schemalagda uppdateringar",
"Avbildningen uppdateras vid vald tid bara om registret publicerar en ny, med möjlighet att vänta tills den är 1, 3, 7 eller 14 dagar gammal. En container med ändringar gjorda utanför ProxMenux hoppas över och rapporteras."
]
]
}
}
]
},
{
"id": "logs",
"title": "Loggar",
"intro": "Logs-fliken visas bara för containrar installerade av OCI manager Apps, mellan Monteringar och Säkerhetskopior. Den visar standardutdata och standardfel från avbildningens huvudprocess, samma utdata som <code>docker logs</code> visar för en Docker-container.",
"blocks": [
{
"list": {
"items": [
"Utdata sparas på värden i <code>/var/log/proxmenux/oci/VMID.console.log</code> (läge 0600), från första starten och över omstarter, så att de kan läsas när containern är stoppad.",
"Filen roteras på 10 MB och håller tre komprimerade kopior (<code>/etc/logrotate.d/proxmenux-oci</code>).",
"Varje start av containern är markerad i utgången. Fliken visar utgången sedan den sista starten som standard; <strong>Full historia</strong> visar också de tidigare.",
"När programmet tas bort tas även dess utdata bort.",
"De senaste 100, 500 eller 1000 raderna visas. När containern körs följs nya rader i realtid; om du rullar upp pausas följningen och <strong>Följ</strong> återupptar den.",
"Ett filter visar endast linjer som innehåller en text, och <strong>Ladda ner</strong> sparar linjerna laddade.",
"Färgkoder tas bort och en rad som ritas om av en förloppsindikator visas i sitt slutliga tillstånd.",
"Fliken läser filen varje gång den öppnas; den mellanlagras inte."
]
}
},
{
"calloutInfo": {
"title": "Inloggningsuppgifter vid första starten",
"body": "Avbildningar som skriver ut ett genererat lösenord på sin första start lämnar det i denna utgång, som <code>docker logs</code> gör. Installatören läser den därifrån för att visa den i sin sammanfattning."
}
},
{
"figure": {
"src": "/oci-manager/monitor-logs-tab.png",
"alt": "Logs-fliken med konsolutgången av en OCI-behållare, linjeväljaren, filtret och följknappen",
"caption": "Konsolutgång av en OCI-behållare."
}
}
]
},
{
"id": "terminal",
"title": "Proxmox VE konsol",
"blocks": [
{
"p": "En OCI-bild kör sin egen process som PID 1 och ingen inloggningstjänst, så standardkonsolen för en LXC skulle öppna en terminal där inget svarar. Containers installerade av OCI Manager Apps skapas med <code>cmode: shell</code>: Proxmox VE-konsolen öppnar ett skal med <code>lxc-attach</code>, motsvarande <code>docker exec</code>, med den löpande applikationen orörd."
},
{
"list": {
"items": [
"Skalet är det som <code>/etc/passwd</code> anger för root i avbildningen. Om root saknar skal eller avbildningen inte innehåller något behålls standardkonsolen.",
"Skalet körs som root i containern, utan ett lösenord. Vem kan öppna det beslutas av <code>VM.Console</code> tillstånd av Proxmox VE.",
"Monitorns terminal går in i containern med <code>pct enter</code>, som fungerar på samma sätt."
]
}
}
]
},
{
"id": "mounts",
"title": "Monteringar",
"blocks": [
{
"p": "<mountsLink>Monteringar</mountsLink>-fliken listar containerns diskar och värdkataloger. Användningen av en containerdisk på blocklagring som LVM-thin läses från diskens filsystem, som bara är monterat inuti containern."
}
]
}
]
}
@@ -0,0 +1,404 @@
{
"meta": {
"title": "Multi-container applikationer | ProxMenux",
"description": "Hur OCI Manager Apps förvandlar en applikation med sin databas och cache till samordnade inbyggda LXC:er: plan, privat nätverk, beroendehook, validering och transaktionsuppdateringar."
},
"header": {
"title": "Program med flera containrar",
"description": "En applikation med sin databas, cache och andra tjänster blir flera samordnade inbyggda LXC:er, installerade och uppdaterade som en.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "En applikation för användaren, flera LXCs för Proxmox VE",
"body": "En multi-container definition är en post av katalogen. Installationsprogrammet skapar en inbyggd LXC per tjänst och håller sina beroenden explicit. Immich, Nextcloud, Paperless-ngx och Tandoor installeras på detta sätt."
}
},
{
"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": "Stackplan",
"app": "Programmets LXC",
"appNet": "LAN + privat",
"db": "PostgreSQL LXC",
"cache": "Valkey LXC",
"private": "privat"
}
}
}
]
},
{
"id": "plan",
"title": "1. Planen, innan någon container finns",
"blocks": [
{
"p": "Inget LXC skapas medan Compose definitionen tolkas. En komplett plan kommer först, med varje medlem, avbildning, VMID, nätverk, väg, hemlighet, ordning och hälsokontroll. Om planen inte är konsekvent startar installationen inte."
},
{
"table": {
"headers": [
"Planelement",
"Innehåll",
"Kontrolleras innan du skapar något"
],
"rows": [
[
"Medlemmar",
"Huvudapplikation, databas, cache, maskininlärning och andra beroenden",
"Unika VMID, kända roller och exakt en huvudmedlem"
],
[
"Avbilder",
"Rullande referens, arkitektur och fastställd digest för varje tjänst",
"Alla finns, stöder arkitekturen och klarar OCI-integritetskontrollen"
],
[
"Nätverk",
"Privat bro, subnet, en fast adress per tjänst och LAN-åtkomst för huvudmedlemmen",
"Ingen kollision med befintliga broar eller undernät och ingen upprepad adress"
],
[
"Persistens",
"Container diskar, värdkataloger, ägare och backup",
"Inga överlappande vägar, lagring tillgängliga och deklarerade behörigheter"
],
[
"Hemligheter",
"Databaslösenord, applikationsnycklar och inledande inloggningsuppgifter",
"Genereras en gång och ges endast till de medlemmar som använder dem"
],
[
"Livscykel",
"Startorder, stopporder och hälsokontroll per medlem",
"Huvudapplikationen börjar sist och stoppar först"
]
]
}
}
]
},
{
"id": "create",
"title": "2. Skapa en medlem i taget",
"blocks": [
{
"steps": {
"items": [
{
"title": "Reservera varje VMID",
"body": "Proxmox VE-inventeringen och instansregistret kontrolleras. En befintlig CT tas inte över och ett kontrakt som fortfarande tillhör en annan instans återanvänds inte."
},
{
"title": "Förbered varje avbildning",
"body": "Alla avbildningar löses, laddas ner och verifieras innan den första containern skapas."
},
{
"title": "Skapa varje rootfs",
"body": "Den officiella OCI-metadatan importeras och ProxMenux-instansidentiteten och medlemsrollen läggs till."
},
{
"title": "Privat nätverk",
"body": "En bro och undernät skapas och varje medlem får sin fasta adress; endast huvudmedlemmen får också LAN-gränssnittet."
},
{
"title": "Persistens",
"body": "Varje databas och konfiguration får sin egen containerdisk; endast data avsedda att delas använder värdkataloger."
},
{
"title": "Miljö",
"body": "Interna slutpunkter, delade hemligheter och servicevariabler skrivs. Programmet når sina beroenden på deras reserverade privata adresser."
},
{
"title": "Post",
"body": "Varje medlem registrerar sin inbyggda konfiguration, de rootfs-ändringar som uppdateringar måste återskapa och sin relation till stacken."
}
]
}
}
]
},
{
"id": "checks",
"title": "3. Börja och kontrollera varje container",
"intro": "En skapad LXC betyder inte att tjänsten är redo. Beroendena startar i ordning och varje tjänst genomgår en egen kontroll.",
"blocks": [
{
"table": {
"headers": [
"Tjänst",
"Kontroll",
"Vad det visar"
],
"rows": [
[
"PostgreSQL",
"<code>pg_isready</code> i CT med förväntad värd, användare och databas",
"Servern accepterar anslutningar för den konfigurerade databasen"
],
[
"Redis / Valkey",
"<code>redis-cli</code> eller <code>valkey-cli</code> <code>PING</code> mot sin privata adress",
"Brokern lyssnar och svarar"
],
[
"Immich maskininlärning",
"HTTP <code>GET /ping</code>, plus en kontroll av den valda GPU runtime",
"Tjänsten svarar och den begärda accelerationen har inte fallit tillbaka till CPU"
],
[
"Nextcloud",
"<code>GET /status.php</code> med <code>installed=true</code>, <code>maintenance=false</code> och <code>needsDbUpgrade=false</code>",
"Initieringen är klar utan väntande migrering"
],
[
"Paperless-ngx / Tandoor",
"HTTP på LAN-adressen och tjänstens faktiska port",
"Frontend och dess beroenden tillhandahåller programmet"
],
[
"Huvudapplikation",
"Slutpunkten för dess mall, till exempel <code>/api/server/ping</code> i Immich",
"Hela stacken fungerar genom programmet som använder beroenden"
]
]
}
},
{
"calloutWarning": {
"title": "Körs betyder inte att allt fungerar",
"body": "Det löpande tillståndet säger bara att LXC-processen existerar. Där tjänsten erbjuder en bättre check, en exec eller HTTP check med en timeout används. Om en medlem slutar eller misslyckas med sin kontroll, deklareras inte stacken installerad."
}
}
]
},
{
"id": "hook",
"title": "4. Beroende hook",
"blocks": [
{
"p": "Kroken är endast inställd på huvudbehållaren av en beroende stack. Proxmox VE håller manuset som en snippet och kör det som <code>hookscript</code> av den CT. Receptet är inte skrivet i manuset: det lever i ett separat privat kontrakt."
},
{
"codeGrid": {
"items": [
{
"title": "Huvud CT konfiguration",
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
},
{
"title": "Privat kontrakt (exempel)",
"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": "Fullständig källa till proxmenux-stack-dependencies.sh",
"pathCode": "local:snippets/proxmenux-stack-dependencies.sh",
"snippetCode": "stackDependencyHook"
}
},
{
"p": "Skriptet är detsamma för varje stack. VMID, namn, checktyper och timeouts kommer från det privata kontraktet <code>/etc/pve/priv/proxmenux-stack-VMID.json</code> av varje stack."
},
{
"steps": {
"items": [
{
"title": "Proxmox VE anropar pre-start",
"body": "Innan CT startar körs kroken med sin VMID och livscykelfasen."
},
{
"title": "Ett lås per stack",
"body": "<code>flock</code> på <code>/run/lock/proxmenux-stack-VMID.lock</code> förhindrar två startsekvenser samtidigt."
},
{
"title": "Kontraktet läses och valideras",
"body": "Ett känt schema, numeriska beroenden, etiketter, en exec, http eller kör kontroll och en positiv timeout krävs."
},
{
"title": "Beroende i ordning",
"body": "Varje CT måste finnas; en stoppad startas och en som redan körs inte startas om."
},
{
"title": "Vänta tills tjänsten är redo",
"body": "Kontrollen körs vartannat sekund, och CT bekräftas också vara igång."
},
{
"title": "Huvud CT startar",
"body": "När alla beroenden är redo avslutas pre-start och Proxmox VE startar programmet."
}
]
}
},
{
"calloutInfo": {
"title": "Kroken stoppar inte beroenden",
"body": "Faserna post-start, pre-stop och post-stop gör ingenting. Om huvud-CT:n stoppas fortsätter PostgreSQL, Redis, Valkey eller maskininlärningen att köras. Hooken ordnar starten; den gör inte flera LXC:er till en process."
}
},
{
"table": {
"headers": [
"Typ",
"Exempel",
"Senare starter"
],
"rows": [
[
"Beroende stack",
"Immich, Nextcloud, applikation med PostgreSQL",
"Huvud-CT:ns hook startar beroendena och väntar på dem"
],
[
"Applikationssvit",
"Arr-programsviten",
"Ingen huvudmedlem: varje LXC följer sin egen <code>onboot</code>"
],
[
"Enskilt program",
"Jellyfin",
"Proxmox VE startar den LXC:n direkt"
]
]
}
}
]
},
{
"id": "stack-checks",
"title": "5. Kontroller på stacken som helhet",
"blocks": [
{
"list": {
"items": [
"Varje VMID finns, är unik och håller den förväntade instansidentiteten.",
"Varje kontrakt tillhör samma stack och behåller sin roll och registrerade inbyggda konfiguration.",
"Huvudmedlemmen är senast i <code>start_order</code> och först i <code>stop_order</code>.",
"Ingen medlem, volym eller rootfs anpassning saknas.",
"Kroken pekar på den officiella snippet, dess innehåll är oförändrat och dess kontrakt matchar stack receptet.",
"De observerade avbildningarna och digestvärdena matchar de förberedda OCI-arkiven.",
"Enheter, GPU-profiler, monteringar, hemligheter och ändpunkter matchar fortfarande kontrakten.",
"När alla beroenden har klarat kontrollerna verifierar huvudprogrammets ändpunkt integrationen mellan medlemmarna."
]
}
}
]
},
{
"id": "manage",
"title": "Hantera en installerad stack",
"intro": "Under <strong>Hantera installerade OCI-program</strong> leder varje medlem till hela stacken. Menyn erbjuder <strong>Uppdatera alla programmets containrar</strong>, <strong>Ändra extra sökvägar och enheter</strong>, <strong>Återskapa alla containrar med sparad konfiguration</strong> och <strong>Ta bort: radera programmet och dess containrar</strong>. Återskapa bygger om varje container från dess ursprungliga avbildning med sparad digest, utan att leta efter en nyare. Samma steg som vid en uppdatering används; alternativet erbjuds för stackar som kan uppdateras.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Alla medlemmar",
"body": "Medlemmens kontrakt anger huvud-VMID och den fullständiga listan över medlemmar."
},
{
"title": "Stacken är reproducerbar",
"body": "Identiteter, kontrakt, krok, anpassningar och en samordnad replay för det receptet valideras."
},
{
"title": "Avbildningar först",
"body": "Programmet stoppas inte förrän varje digest har fastställts, hämtats och verifierats."
},
{
"title": "Stoppa och backa upp setet",
"body": "Verifierade inbyggda säkerhetskopior tas när stacken är stoppad, så att program och databaser motsvarar samma tidpunkt."
},
{
"title": "Uppdatera och kontrollera varje medlem",
"body": "Anpassning, nätverk, fästen, hemligheter och enheter appliceras igen innan hälsokontrollen av varje medlem."
},
{
"title": "Publicera eller återställa allt",
"body": "De nya kontrakten publiceras endast när varje medlem passerar. Om man misslyckas återställs varje medlem."
}
]
}
},
{
"table": {
"headers": [
"Ändra",
"Vilka förändringar",
"Vad som behålls"
],
"rows": [
[
"Extra sökvägar och enheter",
"De läggs till eller tas bort från applikationsbehållaren, som startar om. Ingenting byggs om",
"Uppgifterna för programmet, dess databas och andra containrar"
],
[
"Vad som kör igenkänningen (Immich)",
"Maskininlärningsbehållaren tar avbildningen och enheterna i CPU eller en GPU av värden. Hela programmet stoppas och uppdateras, som i en uppdatering",
"Modellcachen, biblioteket och databasen. Om något misslyckas, återställs tidigare containrar och tidigare val"
]
]
}
},
{
"calloutWarning": {
"title": "En stack utan samordnad replay uppdateras inte",
"body": "Om beredningen av en stack inte kan reproduceras vägras uppdateringen innan stacken stoppas. Applikationen fortsätter att fungera som det är."
}
}
]
},
{
"id": "failure",
"title": "6. När något misslyckas",
"blocks": [
{
"p": "Under en installation stannar ett fel och tar bort de ofullständiga containrarna som skapats och den privata broen om operationen skapade den. En stack publiceras inte som giltig tills hela sekvensen avslutas."
},
{
"p": "En uppdatering är transaktionell: alla avbildningar är förberedda först, sedan stacken stannar, varje medlem backas upp och backup verifieras, och först då är varje rootfs ersatt. Medlemmar startar en efter en med sin hälsokontroll; om man misslyckas återställs varje medlem från samma uppsättning säkerhetskopior, så databasen och programmet hör aldrig till olika ögonblick."
},
{
"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": "Förbered varje avbildning",
"stop": "Sluta, huvudmedlem först",
"backup": "Verifierad säkerhetskopia av varje CT",
"replace": "Ersätt rootfs",
"healthy": "Fungerar alla?",
"yes": "Ja",
"no": "Nej",
"commit": "Publicera avtal",
"rollback": "Återställ varje medlem"
}
}
}
]
},
{
"id": "not-assumed",
"title": "Vad en stack inte inkluderar",
"blocks": [
{
"list": {
"items": [
"En svit installerad i ett flöde, till exempel Arr-sviten, är inte en beroende stack: dess containrar har ingen startordning mellan dem.",
"Det privata nätverket ersätter inte autentisering, TLS eller konfigurationen av varje applikation.",
"Säkerhetskopieringen av en LXC innehåller inte bron, kroken eller kontrakten i resten av stacken.",
"Prowlarr, Sonarr eller Radarr får inga indexerare, profiler eller leverantörer från ProxMenux."
]
}
}
]
}
]
}
@@ -0,0 +1,305 @@
{
"meta": {
"title": "Data, sökvägar och nätverk | ProxMenux",
"description": "Så bevarar OCI manager Apps data i en OCI-container: containerdiskar, kataloger på värden, rclone-monteringar, adresser och privata nätverk."
},
"header": {
"title": "Data, sökvägar och nätverk",
"description": "Vad som finns i rootfs, vad som bevaras när det ersätts, hur data delas mellan containrar och hur varje container får sin adress.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Beständig lagring bestäms innan LXC-containern skapas",
"body": "Volymerna som deklareras av avbildningen och dess Compose-fil läses innan containern skapas. Varje sökväg som måste bevaras vid en uppdatering blir en monteringspunkt som är oberoende av rootfs. Därmed innehåller rootfs bara det som tillhör avbildningen och kan ersättas."
}
}
]
},
{
"id": "questions",
"title": "Vad installationsguiden frågar efter",
"intro": "Mallen anger de sökvägar som programmet behöver. Var och en placeras på en containerdisk eller i en katalog på värden. Fler sökvägar kan läggas till före sammanfattningen.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Nödvändiga sökvägar",
"body": "<code>/config</code>, <code>/data</code>, bibliotek, hämtningar och alla volymer som programmet deklarerar listas."
},
{
"title": "Plats",
"body": "Varje sökväg placeras på en containerdisk eller i en befintlig katalog på värden."
},
{
"title": "Lagring och storlek",
"body": "En containerdisk skapas på en Proxmox VE-lagring med den angivna storleken. Standardinstallationen använder <code>local-lvm</code>. Den avancerade installationen frågar efter lagring för varje sökväg strax före storleken och föreslår lagringen för rootfs. Disken visas som <code>vm-VMID-disk-N</code> och ansluts som <code>mpN</code>."
},
{
"title": "Katalog på värden",
"body": "Katalogen på värden anges med sin sökväg. Om den inte finns skapas den med den värdanvändare som containeranvändaren mappas till som ägare."
},
{
"title": "Ytterligare sökvägar",
"body": "Före installationen kan fler kopplingar läggas till mellan en sökväg eller volym på värden och en sökväg i containern."
},
{
"title": "Sammanfattning",
"body": "Hela sökvägsmappningen visas innan CT:n skapas och sparas i instanskontraktet."
}
]
}
}
]
},
{
"id": "options",
"title": "De två platserna för beständig lagring",
"blocks": [
{
"table": {
"headers": [
"Egenskap",
"Containerdisk",
"Katalog på värden"
],
"rows": [
[
"I konfigurationen",
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
],
[
"Containerns säkerhetskopia (vzdump)",
"Ingår med <code>backup=1</code>",
"Ingår inte"
],
[
"Storlek",
"Fast; kan utökas genom att ändra monteringspunktens storlek",
"Det lediga utrymmet i värdens filsystem eller dataset"
],
[
"Andra containrar",
"Monteras bara av den container som den tillhör",
"Samma katalog kan monteras i flera containrar"
],
[
"Ögonblicksbilder och återställning",
"Hanteras av Proxmox VE tillsammans med CT:n",
"Hanteras på värdens lagring"
],
[
"När programmet tas bort",
"Tas bort med containern",
"Bevaras med sitt innehåll"
],
[
"När CT:n flyttas till en annan nod",
"Flyttas med CT:n",
"Samma sökväg måste finnas på den andra noden"
]
]
}
},
{
"p": "Rootfs är reserverat för binärfilerna och avbildningens innehåll. En uppdatering eller ett återskapande ersätter det utan att röra någon av de två typerna av monteringspunkt."
}
]
},
{
"id": "example",
"title": "Exempel: en container med båda platserna",
"blocks": [
{
"code": {
"title": "Jellyfin installerat som CT 151 på local-lvm (utdrag)",
"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": "En uppdatering eller ett återskapande ersätter bara rootfs: <code>mp0</code> bevarar användare, bibliotek och inställningar, och <code>mp1</code> visar fortfarande samma medier. När CT:ns säkerhetskopia återställs kommer <code>/config</code> tillbaka. Mediekatalogen återställs vid behov från säkerhetskopian av värdens lagring."
},
{
"flow": {
"nodes": [
{
"label": "Kontrakt",
"detail": "/config"
},
{
"label": "Plats",
"detail": "Containerdisk\neller katalog på värden"
},
{
"label": "LXC",
"detail": "Alltid /config\nför programmet"
}
],
"caption": "Programmet ser sökvägen som avbildningen anger. Bara lagringsplatsen ändras."
}
}
]
},
{
"id": "shared",
"title": "En katalog på värden, flera containrar",
"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": "Katalog på värden",
"config": "Egen konfiguration"
}
}
},
{
"p": "Varje container sparar sin konfiguration på sin egen disk. Biblioteket eller hämtningarna ligger i en enda katalog på värden som monteras på samma interna sökväg i alla containrar. Därmed är sökvägen som ett program skriver till samma sökväg som ett annat läser från."
}
]
},
{
"id": "rclone",
"title": "Molnlagring via programmet rclone",
"intro": "Utöver installation erbjuder rclone-posten i katalogen <strong>Aktivera en montering i en befintlig OCI-container med rclone</strong>. En fjärrlagring som redan skapats och auktoriserats i rclones webbgränssnitt monteras och görs tillgänglig på värden. Andra containrar kan använda den som en katalog på värden.",
"blocks": [
{
"steps": {
"items": [
{
"title": "Container och fjärrlagring",
"body": "VMID för rclone-containern, fjärrlagringens exakta namn och, valfritt, en sökväg i den."
},
{
"title": "Monteringens namn och cache",
"body": "Monteringens namn och VFS-cacheläget: <code>off</code>, <code>minimal</code>, <code>writes</code> eller <code>full</code> (standard)."
},
{
"title": "Tillgängliga vyer",
"body": "En gemensam rot, som standard <code>/mnt/oci-shared</code>, innehåller en läs- och skrivbar vy i <code>/mnt/oci-shared/remotes/NAME</code> och en skrivskyddad vy i <code>/mnt/oci-shared/remotes-ro/NAME</code>."
},
{
"title": "Aktivering",
"body": "Efter bekräftelsen stoppas CT:n, dess startkommando och ett Proxmox VE-hookscript konfigureras, och den startas igen. Åtgärden väntar tills båda vyerna är monterade på värden."
}
]
}
},
{
"calloutInfo": {
"title": "Om monteringen inte aktiveras",
"body": "Containerns tidigare konfiguration återställs och containern startas igen. En misslyckad aktivering lämnar därmed rclone som det var."
}
}
]
},
{
"id": "network",
"title": "Adresser och nätverk",
"intro": "Ett program med en enda container behöver en adress. Ett program med flera containrar behöver också ett stabilt nätverk mellan sina delar.",
"blocks": [
{
"cards": {
"items": [
{
"icon": "network",
"title": "Program med en container",
"body": "En nätverksbrygga väljs tillsammans med DHCP eller en fast adress i CIDR-format. LXC-containern har en egen adress och sammanfattningen visar tjänsternas fullständiga URL:er."
},
{
"icon": "waypoints",
"title": "Program med flera containrar",
"body": "Ett ledigt subnät hittas och en beständig privat brygga skapas. Varje del – program, databas och cache – får en fast adress på nätverket."
}
]
}
},
{
"flow": {
"nodes": [
{
"label": "LAN",
"detail": "Nåbar adress\nbara huvudtjänsten"
},
{
"label": "Huvud-LXC",
"detail": "Webb / API\nLAN + privat nätverk"
},
{
"label": "Privat nätverk",
"detail": "PostgreSQL · Valkey · ML\nfasta adresser"
}
],
"caption": "Beroenden kommunicerar över det privata nätverket och har ingen adress på LAN:et."
}
},
{
"p": "Stackkontraktet sparar brygga, subnät, adresser och relationerna mellan tjänsterna. När programmet uppdateras återanvänds samma topologi för alla delar. ProxMenux Monitor öppnar huvudcontainern på dess LAN-adress, inte dess adress på det privata nätverket."
}
]
},
{
"id": "ownership",
"title": "Ägarskap för filer och kataloger",
"blocks": [
{
"list": {
"items": [
"Nya kataloger skapas med de UID och GID som den oprivilegierade LXC-containern mappas till.",
"Ägarskapet för befintliga kataloger ändras inte rekursivt.",
"Socklar, systemfiler och känsliga sökvägar erbjuds inte som vanliga kataloger på värden."
]
}
}
]
},
{
"id": "backup",
"title": "Vad en säkerhetskopia av containern innehåller",
"blocks": [
{
"table": {
"headers": [
"Del",
"I CT:ns vzdump-säkerhetskopia",
"Var det sparas"
],
"rows": [
[
"OCI-rootfs",
"Ja",
"I CT:ns säkerhetskopia; kan också återskapas från avbildningen och kontraktet"
],
[
"Containerdisk med <code>backup=1</code>",
"Ja",
"CT:ns säkerhetskopia"
],
[
"Katalog på värden",
"Nej",
"Säkerhetskopian av värdens lagring"
],
[
"Instanskontrakt",
"Ja, kopian som finns i CT:n",
"<code>/.proxmenux/oci-record.json</code> i CT:n; ytterligare kopior på värden och i klustret sparas separat"
],
[
"Program med flera containrar",
"Varje del i sin egen säkerhetskopia",
"Säkerhetskopiorna av alla delar samt stackkontraktet och dess nätverksbrygga på värden"
]
]
}
}
]
}
]
}