docs: review OCI manager documentation in all seven translations

This commit is contained in:
Jonatan
2026-10-17 15:08:53 +02:00
parent ce1a3de719
commit d15876d940
60 changed files with 15788 additions and 285 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"
]
]
}
}
]
}
]
}