mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 19:02:31 +00:00
Merge pull request #486 from jcastro/docs/review-oci-manager
docs: review OCI manager documentation in all seven translations
This commit is contained in:
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Cómo se traduce una imagen OCI | ProxMenux",
|
||||
"description": "Del repositorio de la imagen y su archivo Compose a una plantilla revisable, un plan de despliegue y un LXC nativo de Proxmox VE, sin Docker dentro."
|
||||
"title": "Cómo se adapta una imagen OCI | ProxMenux",
|
||||
"description": "Del repositorio de la imagen y su archivo Compose a una plantilla que puedes revisar, un plan de despliegue y un LXC nativo de Proxmox VE, sin Docker dentro."
|
||||
},
|
||||
"header": {
|
||||
"title": "Cómo se traduce una imagen OCI",
|
||||
"description": "Del repositorio de la imagen y su archivo Compose a una plantilla revisable, un plan de despliegue y un LXC nativo, sin instalar Docker dentro.",
|
||||
"title": "Cómo se adapta una imagen OCI",
|
||||
"description": "Del repositorio de la imagen y su archivo Compose a una plantilla que puedes revisar, un plan de despliegue y un LXC nativo, sin instalar Docker dentro.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "pipeline",
|
||||
"title": "La cadena de traducción",
|
||||
"title": "El proceso de adaptación",
|
||||
"blocks": [
|
||||
{
|
||||
"mermaid": {
|
||||
@@ -20,7 +20,7 @@
|
||||
"repo": "Repositorio de la imagen",
|
||||
"converter": "Conversor",
|
||||
"template": "Plantilla JSON",
|
||||
"blockers": "¿Sin bloqueos?",
|
||||
"blockers": "¿Sin impedimentos?",
|
||||
"no": "No",
|
||||
"yes": "Sí",
|
||||
"review": "Revisión / overlay",
|
||||
@@ -30,7 +30,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "El conversor lee la imagen y el archivo Compose que publica su proyecto y escribe una plantilla JSON. Una plantilla con bloqueos sin traducir pasa por revisión, donde un overlay curado los resuelve, antes de publicarse en el catálogo. Solo las plantillas sin bloqueos se ofrecen para instalar."
|
||||
"p": "El conversor lee la imagen y el archivo Compose publicados por el proyecto y genera una plantilla JSON. Si quedan requisitos que no se han podido adaptar y que impiden la instalación, la plantilla pasa por una revisión: un archivo de ajustes revisados, llamado overlay, los resuelve antes de publicarla en el catálogo. Solo se ofrecen para instalar las plantillas que no tienen impedimentos pendientes."
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -41,10 +41,26 @@
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{ "icon": "archive", "title": "Identidad de la imagen", "body": "Repositorio, etiqueta rolling, arquitectura, digest resuelto y revisión del origen." },
|
||||
{ "icon": "braces", "title": "Contrato del contenedor", "body": "Entrypoint, Cmd, entorno, usuario, directorio de trabajo, señal de parada, puertos y volúmenes." },
|
||||
{ "icon": "layers", "title": "Traducción a Proxmox VE", "body": "Recursos, seguridad, puntos de montaje, dispositivos, sysctls, healthchecks y las adaptaciones que necesita cada uno, con su motivo." },
|
||||
{ "icon": "shield", "title": "Compatibilidad", "body": "Claves admitidas, bloqueos sin traducir y el estado de cada validación." }
|
||||
{
|
||||
"icon": "archive",
|
||||
"title": "Identidad de la imagen",
|
||||
"body": "Repositorio, etiqueta de actualización continua, arquitectura, digest resuelto y revisión de origen."
|
||||
},
|
||||
{
|
||||
"icon": "braces",
|
||||
"title": "Contrato del contenedor",
|
||||
"body": "Entrypoint, Cmd, entorno, usuario, directorio de trabajo, señal de parada, puertos y volúmenes."
|
||||
},
|
||||
{
|
||||
"icon": "layers",
|
||||
"title": "Adaptación a Proxmox VE",
|
||||
"body": "Recursos, seguridad, puntos de montaje, dispositivos, sysctls, comprobaciones de estado y las adaptaciones necesarias en cada caso, con su justificación."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Compatibilidad",
|
||||
"body": "Claves compatibles, requisitos pendientes de adaptar que impiden la instalación y estado de cada validación."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -56,12 +72,32 @@
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Origen", "Ejemplo", "Resultado nativo"],
|
||||
"headers": [
|
||||
"Origen",
|
||||
"Ejemplo",
|
||||
"Resultado nativo"
|
||||
],
|
||||
"rows": [
|
||||
["Metadatos OCI", "<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>", "Proxmox VE los importa al crear el CT"],
|
||||
["Docker Compose", "<code>environment</code>, <code>volumes</code>, <code>devices</code>", "entradas de entorno del LXC, <code>mpN</code> y <code>devN</code>"],
|
||||
["Perfil de ProxMenux", "GPU, healthcheck, credenciales", "preguntas y adaptaciones revisadas"],
|
||||
["Usuario", "VMID, almacenamiento, red", "el contrato de la instancia"]
|
||||
[
|
||||
"Metadatos OCI",
|
||||
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
|
||||
"Proxmox VE los importa al crear el CT"
|
||||
],
|
||||
[
|
||||
"Docker Compose",
|
||||
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
|
||||
"Entradas de entorno de LXC, <code>mpN</code> y <code>devN</code>"
|
||||
],
|
||||
[
|
||||
"Perfil de ProxMenux",
|
||||
"GPU, comprobación de estado, credenciales",
|
||||
"Preguntas y adaptaciones revisadas"
|
||||
],
|
||||
[
|
||||
"Usuario",
|
||||
"VMID, almacenamiento, red",
|
||||
"El contrato de la instancia"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -69,18 +105,39 @@
|
||||
},
|
||||
{
|
||||
"id": "install",
|
||||
"title": "Qué ocurre durante una instalación",
|
||||
"title": "Qué ocurre durante la instalación",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "Resolver", "body": "Se consulta el registro, se selecciona la arquitectura del host y se fija el digest efectivo de la etiqueta rolling." },
|
||||
{ "title": "Descargar y verificar", "body": "Skopeo descarga la imagen como archivo OCI, y cada capa se comprueba contra su digest y se descomprime antes de crear nada. Una descarga dañada se repite una vez antes de detener la instalación." },
|
||||
{ "title": "Construir", "body": "<code>pct create</code> construye el rootfs a partir del archivo y conserva los metadatos oficiales de proceso de la imagen." },
|
||||
{ "title": "Conectar", "body": "Se añaden los volúmenes, la red, el entorno, los dispositivos y los perfiles de seguridad declarados." },
|
||||
{ "title": "Consola", "body": "La salida de consola del contenedor se guarda en el host, y la consola de Proxmox VE abre un shell cuando la imagen incluye uno." },
|
||||
{ "title": "Comprobar", "body": "El primer arranque espera una dirección y la respuesta del servicio; un fallo no se presenta como instalación correcta." },
|
||||
{ "title": "Registrar", "body": "La configuración efectiva se escribe en el contrato de la instancia que usan las actualizaciones y las recreaciones." }
|
||||
{
|
||||
"title": "Resolver la referencia",
|
||||
"body": "Se consulta el registro, se selecciona la arquitectura del host y se fija el digest concreto al que apunta la etiqueta de actualización continua."
|
||||
},
|
||||
{
|
||||
"title": "Descargar y verificar",
|
||||
"body": "Skopeo descarga la imagen como un archivo OCI. Antes de crear nada, se verifica el digest de cada capa y se descomprimen todas las capas. Si la descarga está dañada, se vuelve a descargar una vez antes de detener la instalación."
|
||||
},
|
||||
{
|
||||
"title": "Crear el sistema de archivos",
|
||||
"body": "<code>pct create</code> crea el rootfs a partir del archivo y conserva los metadatos oficiales del proceso de la imagen."
|
||||
},
|
||||
{
|
||||
"title": "Conectar los recursos",
|
||||
"body": "Se aplican los volúmenes, la red, el entorno, los dispositivos y los perfiles de seguridad declarados."
|
||||
},
|
||||
{
|
||||
"title": "Consola",
|
||||
"body": "La salida de consola del contenedor se guarda en el host. La consola de Proxmox VE abre una shell si la imagen incluye una."
|
||||
},
|
||||
{
|
||||
"title": "Comprobar",
|
||||
"body": "En el primer arranque se espera a que el contenedor tenga una dirección y el servicio responda. Si falla, la instalación no se da por completada correctamente."
|
||||
},
|
||||
{
|
||||
"title": "Registrar la configuración",
|
||||
"body": "La configuración efectiva se guarda en el contrato de la instancia que utilizan las actualizaciones y las recreaciones."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -89,7 +146,7 @@
|
||||
{
|
||||
"id": "example",
|
||||
"title": "Ejemplo: una imagen con /config y /downloads",
|
||||
"intro": "Una definición habitual de Compose y la configuración de Proxmox VE en la que se convierte. Las rutas que espera la aplicación no cambian.",
|
||||
"intro": "Una definición Compose habitual y la configuración de Proxmox VE que se genera a partir de ella. Las rutas que espera la aplicación no cambian.",
|
||||
"blocks": [
|
||||
{
|
||||
"codeGrid": {
|
||||
@@ -99,14 +156,14 @@
|
||||
"code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080"
|
||||
},
|
||||
{
|
||||
"title": "/etc/pve/lxc/VMID.conf (extracto)",
|
||||
"title": "/etc/pve/lxc/VMID.conf (fragmento)",
|
||||
"code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "<code>mp0</code> es un segundo disco que pertenece al contenedor, con el nombre <code>vm-VMID-disk-N</code> en el almacenamiento elegido. Se monta en <code>/config</code> y, con <code>backup=1</code>, forma parte del backup del contenedor. <code>mp1</code> no crea ningún disco: enlaza el directorio del host <code>/srv/downloads</code> con <code>/downloads</code> dentro del LXC. El puerto 8080 no se mapea: el LXC tiene una dirección propia y el servicio responde en ella."
|
||||
"p": "<code>mp0</code> es un segundo disco que pertenece al contenedor, con el nombre <code>vm-VMID-disk-N</code> en el almacenamiento seleccionado. Se monta en <code>/config</code> y, con <code>backup=1</code>, forma parte del backup del contenedor. <code>mp1</code> no crea ningún disco: monta el directorio del host <code>/srv/downloads</code> en <code>/downloads</code> dentro del LXC. El puerto 8080 no se mapea: el LXC tiene su propia dirección y el servicio responde en ella."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar una imagen que no está en el catálogo | ProxMenux",
|
||||
"description": "Traducción de una imagen OCI desde un archivo Compose, una URL, un comando docker run o una referencia de imagen, con revisión de lo que ProxMenux puede reproducir antes de instalarla."
|
||||
"title": "Instalar una imagen fuera del catálogo | ProxMenux",
|
||||
"description": "Adapta una imagen OCI a partir de un archivo Compose, una URL, un comando docker run o una referencia de imagen, y revisa qué puede reproducir ProxMenux antes de instalarla."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar una imagen que no está en el catálogo",
|
||||
"description": "Una imagen propia se traduce desde su archivo Compose, un comando docker run o solo su referencia, y el resultado se presenta para revisión antes de crear ningún LXC.",
|
||||
"title": "Instalar una imagen que no esté en el catálogo",
|
||||
"description": "Tu imagen se adapta a partir de su archivo Compose, de un comando docker run o de su referencia. El resultado se muestra para que lo revises antes de crear ningún LXC.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
@@ -14,8 +14,8 @@
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "El mismo conversor, el mismo instalador",
|
||||
"body": "La opción <strong>Instalar una imagen que no está en el catálogo</strong> utiliza el conversor y el instalador de las plantillas del catálogo. La diferencia es que el contrato se genera en ese momento a partir de la definición aportada y se valida antes de crear ningún LXC."
|
||||
"title": "El mismo conversor y el mismo instalador",
|
||||
"body": "La opción <strong>Instalar una imagen que no esté en el catálogo</strong> utiliza el mismo conversor y el mismo instalador que las plantillas del catálogo. La diferencia es que el contrato se genera en ese momento a partir de la definición proporcionada y se valida antes de crear ningún LXC."
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -23,45 +23,92 @@
|
||||
{
|
||||
"id": "sources",
|
||||
"title": "Cómo se describe la imagen",
|
||||
"intro": "La primera pantalla pregunta cómo se describe la imagen. Cuatro formas aportan una definición que se traduce, una quinta usa solo el nombre de la imagen y tres reciben un oci-compose ya escrito.",
|
||||
"intro": "La primera pantalla pregunta cómo vas a describir la imagen. Cuatro opciones reciben una definición que se adapta, una quinta usa solo el nombre de la imagen y otras tres leen un oci-compose ya escrito.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Opción", "Qué lee"],
|
||||
"headers": [
|
||||
"Opción",
|
||||
"Qué lee"
|
||||
],
|
||||
"rows": [
|
||||
["Pegar su archivo Compose en la terminal", "El YAML se pega en la terminal y termina con Ctrl+D."],
|
||||
["Leer su archivo Compose desde un archivo de este host", "Una ruta del nodo, <code>/root/docker-compose.yml</code> por defecto. El archivo debe existir y ocupar como máximo 256 KiB."],
|
||||
["Descargar su archivo Compose desde una dirección", "Una dirección <code>http://</code> o <code>https://</code> que sirva el YAML sin procesar. Se descargan como máximo 256 KiB."],
|
||||
["Pegar su comando docker run en la terminal", "El comando que publica el proyecto. Se traducen puertos, entorno, volúmenes, dispositivos, capacidades, usuario, memoria compartida y el resto de opciones admitidas."],
|
||||
["Solo la referencia de la imagen, sin archivo Compose", "Una referencia como <code>ghcr.io/user/application:latest</code>. Se consulta el registro y se conservan los metadatos OCI de la imagen."],
|
||||
["Pegar un oci-compose en la terminal", "El JSON se pega en la terminal y termina con Ctrl+D. No se traduce: se comprueba y se instala tal como está escrito."],
|
||||
["Leer un oci-compose desde un archivo de este host", "Un archivo JSON del nodo, <code>/root/oci-compose.json</code> por defecto, de 2 MiB como máximo."],
|
||||
["Descargar un oci-compose desde una dirección", "Una dirección <code>http://</code> o <code>https://</code> que sirva el archivo JSON. Se descargan como máximo 2 MiB."]
|
||||
[
|
||||
"Pegar su archivo Compose en la terminal",
|
||||
"Pega el YAML en la terminal y termina con Ctrl+D."
|
||||
],
|
||||
[
|
||||
"Leer su archivo Compose desde este host",
|
||||
"Una ruta del nodo; la predeterminada es <code>/root/docker-compose.yml</code>. El archivo debe existir y no superar los 256 KiB."
|
||||
],
|
||||
[
|
||||
"Descargar su archivo Compose desde una dirección",
|
||||
"Una dirección <code>http://</code> o <code>https://</code> que sirva el YAML sin procesar. Se descargan como máximo 256 KiB."
|
||||
],
|
||||
[
|
||||
"Pegar su comando docker run en la terminal",
|
||||
"El comando publicado por el proyecto. Se adaptan los puertos, el entorno, los volúmenes, los dispositivos, las capabilities, el usuario, la memoria compartida y las demás opciones compatibles."
|
||||
],
|
||||
[
|
||||
"Solo la referencia de imagen, sin archivo Compose",
|
||||
"Una referencia como <code>ghcr.io/user/application:latest</code>. Se consulta el registro y se conservan los metadatos OCI de la imagen."
|
||||
],
|
||||
[
|
||||
"Pegar un oci-compose en la terminal",
|
||||
"Pega el JSON en la terminal y termina con Ctrl+D. No se convierte: se valida y se instala tal como está escrito."
|
||||
],
|
||||
[
|
||||
"Leer un oci-compose desde este host",
|
||||
"Un archivo JSON del nodo, <code>/root/oci-compose.json</code> por defecto, de un máximo de 2 MiB."
|
||||
],
|
||||
[
|
||||
"Descargar un oci-compose desde una dirección",
|
||||
"Una dirección <code>http://</code> o <code>https://</code> que sirva el archivo JSON. Se descargan como máximo 2 MiB."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/custom-source-menu.png",
|
||||
"alt": "Menú que pregunta cómo se describe una imagen que no está en el catálogo",
|
||||
"caption": "Las formas de describir una imagen que no está en el catálogo."
|
||||
"alt": "Menú para elegir cómo describir una imagen que no está en el catálogo",
|
||||
"caption": "Formas de describir una imagen fuera del catálogo."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "reference-only",
|
||||
"title": "Qué aporta solo la referencia de la imagen",
|
||||
"intro": "Una imagen lleva sus metadatos de proceso, pero no todo lo que un archivo Compose suele añadir a su alrededor.",
|
||||
"title": "Qué aporta una referencia de imagen por sí sola",
|
||||
"intro": "La imagen contiene los metadatos de su proceso, pero no todo el entorno que suele añadir un archivo Compose.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Se lee de la imagen", "No está en la imagen", "Consecuencia"],
|
||||
"headers": [
|
||||
"Se lee de la imagen",
|
||||
"No está en la imagen",
|
||||
"Consecuencia"
|
||||
],
|
||||
"rows": [
|
||||
["<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> y entorno integrado", "Variables que solo aparecen en la documentación", "Se añaden durante la instalación o con Modificar"],
|
||||
["Volúmenes declarados por la imagen", "Directorios del host que solo nombra un archivo Compose", "Las rutas adicionales se añaden antes de instalar"],
|
||||
["Puertos <code>EXPOSE</code>", "La URL, el protocolo o un healthcheck funcional", "Se confirman el puerto y la forma de comprobar el servicio"],
|
||||
["Arquitecturas y digest del registro", "Dispositivos, privilegios o dependencias externas", "Ninguno se activa sin una definición que lo pida"]
|
||||
[
|
||||
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> y el entorno incorporado",
|
||||
"Variables que solo figuran en la documentación",
|
||||
"Se añaden durante la instalación o desde Modificar"
|
||||
],
|
||||
[
|
||||
"Volúmenes declarados por la imagen",
|
||||
"Directorios del host que solo se indican en Compose",
|
||||
"Las rutas adicionales se añaden antes de instalar"
|
||||
],
|
||||
[
|
||||
"Puertos <code>EXPOSE</code>",
|
||||
"La URL, el protocolo o la comprobación funcional del servicio",
|
||||
"Se confirman el puerto y la forma de comprobar el servicio"
|
||||
],
|
||||
[
|
||||
"Arquitecturas y digest del registro",
|
||||
"Dispositivos, privilegios o dependencias externas",
|
||||
"No se habilitan sin una definición que los solicite"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -69,29 +116,44 @@
|
||||
},
|
||||
{
|
||||
"id": "review",
|
||||
"title": "Revisión antes de instalar",
|
||||
"intro": "Tras traducir la definición, ProxMenux muestra lo que ha entendido antes de pedir VMID, recursos o almacenamiento.",
|
||||
"title": "Revisar antes de instalar",
|
||||
"intro": "Tras adaptar la definición, ProxMenux muestra cómo la ha interpretado antes de preguntar el VMID, los recursos o el almacenamiento.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "Analizar", "body": "Se leen servicios, imagen, puertos, rutas, entorno, dispositivos, seguridad y healthcheck." },
|
||||
{ "title": "Consultar el registro", "body": "La imagen debe existir en su registro, y se enumeran las arquitecturas que publica. Un registro privado se lee con la cuenta guardada para él." },
|
||||
{ "title": "Enumerar lo que no se aplica", "body": "Se enumeran las etiquetas, las redes Docker, los ajustes de Swarm y el resto de claves que no tienen efecto en un LXC." },
|
||||
{ "title": "Bloquear lo que no puede traducirse", "body": "Una clave sin equivalencia segura aparece en <strong>Lo que no puede traducirse</strong> y la instalación no continúa. Nada se descarta en silencio." },
|
||||
{ "title": "Pedir los secretos", "body": "Las variables cuyo nombre corresponde a una contraseña, un token o una clave se convierten en preguntas sensibles de la instalación." }
|
||||
{
|
||||
"title": "Analizar",
|
||||
"body": "Se leen servicios, imagen, puertos, rutas, entorno, dispositivos, seguridad y comprobaciones de estado."
|
||||
},
|
||||
{
|
||||
"title": "Consultar el registro",
|
||||
"body": "La imagen debe existir en el registro y se muestran las arquitecturas publicadas. Si el registro es privado, se utiliza la cuenta guardada para él."
|
||||
},
|
||||
{
|
||||
"title": "Enumerar lo que no se aplica",
|
||||
"body": "Se enumeran las etiquetas, redes de Docker, ajustes de Swarm y otras claves que no tienen efecto en un LXC."
|
||||
},
|
||||
{
|
||||
"title": "Bloquear opciones sin equivalente seguro",
|
||||
"body": "Las claves sin equivalente seguro aparecen en <strong>Opciones sin equivalente</strong> e impiden continuar con la instalación. No se descartan silenciosamente."
|
||||
},
|
||||
{
|
||||
"title": "Solicitar secretos",
|
||||
"body": "Las variables cuyo nombre indica una contraseña, token o clave se solicitan como datos sensibles durante la instalación."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/custom-review.png",
|
||||
"alt": "Resumen de lo que ProxMenux ha entendido de un archivo Compose",
|
||||
"caption": "El resumen que se muestra antes de que la instalación pida VMID y recursos."
|
||||
"alt": "Resumen de cómo ProxMenux ha interpretado el archivo Compose",
|
||||
"caption": "Resumen mostrado antes de que el instalador pregunte el VMID y los recursos."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Tras aceptar el resumen, el recorrido es el del catálogo: nombre, modo predeterminado o avanzado, VMID, CPU, memoria, red, arranque con el nodo, rutas persistentes, rutas adicionales, dispositivos compatibles y resumen final."
|
||||
"p": "Tras aceptar el resumen se sigue el mismo asistente que en el catálogo: nombre, modo predeterminado o avanzado, VMID, CPU, memoria, red, arranque con el nodo, rutas persistentes, rutas adicionales, dispositivos compatibles y resumen final."
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -118,68 +180,79 @@
|
||||
{
|
||||
"id": "oci-compose",
|
||||
"title": "Un oci-compose escrito a mano",
|
||||
"intro": "Un oci-compose es el archivo JSON desde el que se instala una aplicación. El catálogo guarda uno por cada aplicación, y el mismo formato puede escribirse a mano e instalarse con esta opción.",
|
||||
"intro": "Un oci-compose es el archivo JSON a partir del cual se instala una aplicación. El catálogo conserva uno por aplicación. Puedes escribir el mismo formato a mano e instalarlo con esta opción.",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "El que se escribe a mano indica lo que decide su autor: la imagen, sus puertos, variables y volúmenes, y lo que pregunta la instalación. ProxMenux completa el resto al leer el archivo. Puede decir lo que un archivo Compose no puede: el texto de una pregunta, una contraseña generada durante la instalación, un perfil de GPU, el propietario de cada volumen, la comprobación del primer arranque o las credenciales que se muestran al terminar."
|
||||
"p": "Al escribirlo a mano, el autor decide la imagen, los puertos, las variables, los volúmenes y las preguntas de la instalación. ProxMenux completa el resto al leer el archivo. Permite expresar lo que Compose no incluye: el texto de una pregunta, una contraseña generada durante la instalación, un perfil de GPU, el propietario de cada volumen, la comprobación del primer arranque o las credenciales mostradas al final."
|
||||
},
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Comprobar",
|
||||
"body": "Un archivo con errores no se instala. Cada error indica el campo en el que está, y un archivo que no es JSON válido indica la línea y la columna."
|
||||
"body": "Los archivos con errores no se instalan. Cada error indica el campo afectado; si el JSON no es válido, se muestran la línea y la columna."
|
||||
},
|
||||
{
|
||||
"title": "Revisar",
|
||||
"body": "Un archivo válido muestra lo que instala: imagen, dirección web, puertos, rutas persistentes, las variables que pide la instalación y los archivos que escribe."
|
||||
"body": "Si el archivo es válido, se muestra lo que instalará: imagen, dirección web, puertos, rutas persistentes, variables que solicitará el instalador y archivos que escribirá."
|
||||
},
|
||||
{
|
||||
"title": "Instalar",
|
||||
"body": "La instalación es la de cualquier aplicación del catálogo, con ajustes por defecto o avanzados."
|
||||
"body": "Se utiliza el mismo instalador que para cualquier aplicación del catálogo, con ajustes predeterminados o avanzados."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Un archivo que decide privilegios",
|
||||
"body": "Un oci-compose decide qué se monta en el contenedor y con qué privilegios. El resumen lo indica antes de instalar: instala solo archivos que vengan de una fuente de confianza."
|
||||
"title": "Un archivo que decide los privilegios",
|
||||
"body": "El oci-compose determina qué se monta dentro del contenedor y con qué privilegios. La revisión lo muestra antes de instalar: utiliza únicamente archivos de fuentes de confianza."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "El formato se describe bloque a bloque, con dos ejemplos completos, en el <readmeLink>README del motor OCI</readmeLink>. El registro de una instalación se lee de la misma forma: solo se usa la plantilla con la que se instaló, y ninguna de las respuestas de esa instalación."
|
||||
"p": "El <readmeLink>README del motor OCI</readmeLink> explica el formato bloque a bloque e incluye dos ejemplos completos. También se puede leer el registro de una instalación: solo se utiliza la plantilla original, sin incorporar ninguna de las respuestas de aquella instalación."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "private-registries",
|
||||
"title": "Imágenes en registros privados",
|
||||
"intro": "Una imagen en un registro privado, como un paquete privado de GitHub o un repositorio privado de Docker Hub, se lee con una cuenta guardada en ProxMenux.",
|
||||
"title": "Imágenes de registros privados",
|
||||
"intro": "Las imágenes de registros privados, como un paquete privado de GitHub o un repositorio privado de Docker Hub, se consultan con una cuenta guardada en ProxMenux.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "El registro rechaza la imagen", "body": "Cuando el registro responde que la imagen necesita una cuenta, la revisión ofrece iniciar sesión en ese registro y vuelve a leer la imagen." },
|
||||
{ "title": "Iniciar sesión", "body": "Un usuario y una contraseña o un token de acceso que puedan descargar la imagen. El registro los comprueba y solo se guardan si los acepta." },
|
||||
{ "title": "Instalar y mantener al día", "body": "La instalación descarga la imagen con esa cuenta, y también las actualizaciones, Modificar, Recrear, la vigilancia y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster." }
|
||||
{
|
||||
"title": "El registro deniega el acceso a la imagen",
|
||||
"body": "Si el registro indica que la imagen requiere una cuenta, la revisión ofrece iniciar sesión en ese registro y vuelve a consultar la imagen."
|
||||
},
|
||||
{
|
||||
"title": "Iniciar sesión",
|
||||
"body": "Un usuario y una contraseña o token con permiso para descargar la imagen. El registro los comprueba y solo se guardan si los acepta."
|
||||
},
|
||||
{
|
||||
"title": "Instalar y mantener al día",
|
||||
"body": "Esa cuenta se utiliza para descargar la imagen durante la instalación y también en las actualizaciones, Modificar, Recrear, la vigilancia y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{ "p": "<strong>Cuentas de registro</strong>, en el menú principal de OCI manager Apps, lista las cuentas guardadas por registro y usuario, nunca su secreto. Desde cada cuenta se puede comprobar, descargar o instalar una imagen, y actualizar o eliminar la cuenta." },
|
||||
{
|
||||
"p": "<strong>Cuentas de registros</strong>, en el menú principal de OCI manager Apps, muestra las cuentas guardadas por registro y usuario, nunca sus secretos. Desde cada cuenta puedes comprobar, descargar o instalar una imagen, actualizar las credenciales o eliminarlas."
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"GitHub (<code>ghcr.io</code>): el usuario es la cuenta de GitHub, y la contraseña un token de acceso personal con el permiso <code>read:packages</code>.",
|
||||
"Docker Hub (<code>docker.io</code>): el usuario es la cuenta de Docker Hub, y la contraseña un token de acceso con permiso de lectura.",
|
||||
"Otros registros, también uno con su propio puerto como <code>registry.example.com:5000</code>: el usuario y la contraseña o token que da ese registro."
|
||||
"GitHub (<code>ghcr.io</code>): el usuario es la cuenta de GitHub y la contraseña es un token de acceso personal con permiso <code>read:packages</code>.",
|
||||
"Docker Hub (<code>docker.io</code>): el usuario es la cuenta de Docker Hub y la contraseña es un token con permiso de lectura.",
|
||||
"Otros registros, incluidos los que usan un puerto propio como <code>registry.example.com:5000</code>: el usuario y la contraseña o token que proporcione ese registro."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Dónde se guardan",
|
||||
"body": "En <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, legible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de sus almacenamientos. <code>/etc/pve</code> lo comparten todos los nodos del clúster, así que una cuenta añadida en un nodo se usa en todos. El backup del host lo incluye, y al desinstalar ProxMenux se elimina de todos los nodos."
|
||||
"title": "Dónde se guardan las cuentas",
|
||||
"body": "En <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, accesible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de almacenamiento. <code>/etc/pve</code> se comparte entre los nodos del clúster, de modo que una cuenta añadida en un nodo se utiliza en todos. El backup del host incluye ese archivo y desinstalar ProxMenux lo elimina de todos los nodos."
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -191,11 +264,11 @@
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Un Dockerfile sin imagen publicada: la imagen debe construirse y publicarse antes en un registro OCI.",
|
||||
"Un archivo Compose con varios servicios: queda bloqueado porque describe más de una imagen. Esta opción instala un único contenedor.",
|
||||
"<code>configs</code>, secretos externos o formatos de dispositivo que no pueden traducirse sin ambigüedad.",
|
||||
"Sustituciones del shell como <code>$(command)</code>: debe escribirse el valor resultante.",
|
||||
"Opciones de <code>docker run</code> no reconocidas y <code>--env-file</code>: se lee en su lugar un archivo Compose explícito."
|
||||
"Un Dockerfile sin imagen publicada: primero hay que construir la imagen y publicarla en un registro OCI.",
|
||||
"Un archivo Compose con varios servicios: se bloquea porque esta opción instala un único servicio por contenedor, aunque varios servicios utilicen la misma imagen.",
|
||||
"<code>configs</code>, secretos externos o formatos de dispositivo que no puedan adaptarse de forma inequívoca.",
|
||||
"Sustituciones de shell como <code>$(command)</code>: hay que escribir directamente el valor resultante.",
|
||||
"Opciones de <code>docker run</code> no reconocidas y <code>--env-file</code>: utiliza un archivo Compose con los valores explícitos."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,9 +19,18 @@
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{ "label": "Inventario del host", "detail": "/dev/dri/renderD128\nGID 993 · Intel" },
|
||||
{ "label": "ProxMenux", "detail": "fabricante y\npermisos comprobados" },
|
||||
{ "label": "LXC", "detail": "mismo dispositivo\nGID efectivo" }
|
||||
{
|
||||
"label": "Inventario del host",
|
||||
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux",
|
||||
"detail": "fabricante y\npermisos comprobados"
|
||||
},
|
||||
{
|
||||
"label": "LXC",
|
||||
"detail": "mismo dispositivo\nGID efectivo"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -33,12 +42,32 @@
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Origen", "Qué se lee", "Qué hace el instalador"],
|
||||
"headers": [
|
||||
"Origen",
|
||||
"Qué se lee",
|
||||
"Qué hace el instalador"
|
||||
],
|
||||
"rows": [
|
||||
["Docker Compose", "<code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> y peticiones NVIDIA", "Cada requisito se convierte en una petición de dispositivo que se muestra para revisión"],
|
||||
["Perfil del catálogo", "El soporte de GPU, Coral, OpenCL, USB o FUSE que tiene realmente la aplicación", "Solo se ofrecen las opciones validadas para esa imagen"],
|
||||
["Metadatos y documentación de la imagen", "VA-API, Selkies, mods de LinuxServer o el runtime NVIDIA", "Se añaden las variables y la preparación documentadas"],
|
||||
["Selección del usuario", "Solo CPU, Intel/AMD, OpenCL, NVIDIA o un dispositivo opcional", "La selección se guarda en el contrato de la instancia"]
|
||||
[
|
||||
"Docker Compose",
|
||||
"<code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> y peticiones NVIDIA",
|
||||
"Cada requisito se convierte en una petición de dispositivo que se muestra para revisión"
|
||||
],
|
||||
[
|
||||
"Perfil del catálogo",
|
||||
"El soporte de GPU, Coral, OpenCL, USB o FUSE que tiene realmente la aplicación",
|
||||
"Solo se ofrecen las opciones validadas para esa imagen"
|
||||
],
|
||||
[
|
||||
"Metadatos y documentación de la imagen",
|
||||
"VA-API, Selkies, mods de LinuxServer o el runtime NVIDIA",
|
||||
"Se añaden las variables y la preparación documentadas"
|
||||
],
|
||||
[
|
||||
"Selección del usuario",
|
||||
"Solo CPU, Intel/AMD, OpenCL, NVIDIA o un dispositivo opcional",
|
||||
"La selección se guarda en el contrato de la instancia"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -57,16 +86,52 @@
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Tipo", "Identificación", "Validación"],
|
||||
"headers": [
|
||||
"Tipo",
|
||||
"Identificación",
|
||||
"Validación"
|
||||
],
|
||||
"rows": [
|
||||
["Intel/AMD DRM", "<code>/dev/dri/renderD*</code> y <code>/sys/class/drm/NODE/device/vendor</code>", "Un dispositivo de caracteres con fabricante <code>0x8086</code> (Intel) o <code>0x1002</code> (AMD)"],
|
||||
["OpenCL AMD", "El render node, más <code>/dev/kfd</code> cuando el perfil lo necesita", "Existencia, tipo, fabricante, permisos y compatibilidad declarada"],
|
||||
["AMD ROCm", "El nodo de render, <code>/dev/kfd</code> y la generación que declara el driver de cómputo en <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>", "Una generación para la que la imagen ROCm de la aplicación trae kernels, las GPU RDNA2 que incluye y las posteriores, se ofrece tal cual. Las demás GPU de esas familias, como las Radeon 680M y 780M, se ofrecen como experimentales y nunca son la opción propuesta: ROCm no las soporta oficialmente, la aplicación las presenta como la generación de su familia (<code>HSA_OVERRIDE_GFX_VERSION</code>) y el instalador pide confirmación antes de descargar la imagen, que es más grande. Una GPU anterior, como los gráficos integrados de un Ryzen 5000U, no se ofrece e Immich deja el reconocimiento en la CPU"],
|
||||
["NVIDIA", "<code>nvidia-smi</code> y <code>nvidia-container-cli</code>", "GPU, UUID, bus PCI, versión del driver, Toolkit, nodos <code>/dev/nvidia*</code>, binarios y librerías"],
|
||||
["Coral PCIe/M.2", "<code>/dev/apex_N</code> y su enlace en <code>/sys/dev/char/MAJOR:MINOR</code>", "Nodo de caracteres, major/minor, propietario, GID y permisos"],
|
||||
["USB y serie", "<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> o <code>/dev/bus/usb/BBB/DDD</code>", "Nodo de caracteres; en USB también fabricante, producto y número de serie cuando sysfs los publica"],
|
||||
["KVM, TUN, FUSE, vídeo y SCSI genérico", "<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> o <code>/dev/sgN</code>", "Ruta admitida, tipo de nodo y permisos efectivos"],
|
||||
["Unidad óptica", "<code>/dev/srN</code>", "Un dispositivo de bloques"]
|
||||
[
|
||||
"Intel/AMD DRM",
|
||||
"<code>/dev/dri/renderD*</code> y <code>/sys/class/drm/NODE/device/vendor</code>",
|
||||
"Un dispositivo de caracteres con fabricante <code>0x8086</code> (Intel) o <code>0x1002</code> (AMD)"
|
||||
],
|
||||
[
|
||||
"OpenCL AMD",
|
||||
"El render node, más <code>/dev/kfd</code> cuando el perfil lo necesita",
|
||||
"Existencia, tipo, fabricante, permisos y compatibilidad declarada"
|
||||
],
|
||||
[
|
||||
"AMD ROCm",
|
||||
"El nodo de render, <code>/dev/kfd</code> y la generación que declara el driver de cómputo en <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>",
|
||||
"Una generación para la que la imagen ROCm de la aplicación trae kernels, las GPU RDNA2 que incluye y las posteriores, se ofrece tal cual. Las demás GPU de esas familias, como las Radeon 680M y 780M, se ofrecen como experimentales y nunca son la opción propuesta: ROCm no las soporta oficialmente, la aplicación las presenta como la generación de su familia (<code>HSA_OVERRIDE_GFX_VERSION</code>) y el instalador pide confirmación antes de descargar la imagen, que es más grande. Una GPU anterior, como los gráficos integrados de un Ryzen 5000U, no se ofrece e Immich deja el reconocimiento en la CPU"
|
||||
],
|
||||
[
|
||||
"NVIDIA",
|
||||
"<code>nvidia-smi</code> y <code>nvidia-container-cli</code>",
|
||||
"GPU, UUID, bus PCI, versión del driver, Toolkit, nodos <code>/dev/nvidia*</code>, binarios y librerías"
|
||||
],
|
||||
[
|
||||
"Coral PCIe/M.2",
|
||||
"<code>/dev/apex_N</code> y su enlace en <code>/sys/dev/char/MAJOR:MINOR</code>",
|
||||
"Nodo de caracteres, major/minor, propietario, GID y permisos"
|
||||
],
|
||||
[
|
||||
"USB y serie",
|
||||
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> o <code>/dev/bus/usb/BBB/DDD</code>",
|
||||
"Nodo de caracteres; en USB también fabricante, producto y número de serie cuando sysfs los publica"
|
||||
],
|
||||
[
|
||||
"KVM, TUN, FUSE, vídeo y SCSI genérico",
|
||||
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> o <code>/dev/sgN</code>",
|
||||
"Ruta admitida, tipo de nodo y permisos efectivos"
|
||||
],
|
||||
[
|
||||
"Unidad óptica",
|
||||
"<code>/dev/srN</code>",
|
||||
"Un dispositivo de bloques"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -79,12 +144,30 @@
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "La plantilla ofrece sus perfiles", "body": "Por ejemplo solo CPU, Intel/AMD VA-API, OpenCL AMD, OpenCL Intel o NVIDIA. Las opciones pertenecen a la imagen, no a un menú común." },
|
||||
{ "title": "Se elige un perfil", "body": "Define los nodos de dispositivo, el entorno, los mods o el runtime que necesita la aplicación." },
|
||||
{ "title": "Se propone una ruta", "body": "Para DRM, <code>/dev/dri/renderD128</code>, que puede cambiarse en un host con varios render nodes. Para USB o serie se selecciona el nodo concreto." },
|
||||
{ "title": "Validación", "body": "Se comprueban existencia, tipo, fabricante admitido, permisos y GID. Una discrepancia detiene la operación." },
|
||||
{ "title": "Se escribe el contrato", "body": "Ruta, modo, GID, acceso de escritura y perfil quedan registrados para las actualizaciones y las recreaciones." },
|
||||
{ "title": "Conexión y prueba", "body": "<code>pct set</code> añade la entrada <code>devN</code> y después se comprueba el acceso dentro del LXC. Las imágenes de LinuxServer se comprueban también como usuario <code>abc</code>." }
|
||||
{
|
||||
"title": "La plantilla ofrece sus perfiles",
|
||||
"body": "Por ejemplo solo CPU, Intel/AMD VA-API, OpenCL AMD, OpenCL Intel o NVIDIA. Las opciones pertenecen a la imagen, no a un menú común."
|
||||
},
|
||||
{
|
||||
"title": "Se elige un perfil",
|
||||
"body": "Define los nodos de dispositivo, el entorno, los mods o el runtime que necesita la aplicación."
|
||||
},
|
||||
{
|
||||
"title": "Se propone una ruta",
|
||||
"body": "Para DRM, <code>/dev/dri/renderD128</code>, que puede cambiarse en un host con varios render nodes. Para USB o serie se selecciona el nodo concreto."
|
||||
},
|
||||
{
|
||||
"title": "Validación",
|
||||
"body": "Se comprueban existencia, tipo, fabricante admitido, permisos y GID. Una discrepancia detiene la operación."
|
||||
},
|
||||
{
|
||||
"title": "Se escribe el contrato",
|
||||
"body": "Ruta, modo, GID, acceso de escritura y perfil quedan registrados para las actualizaciones y las recreaciones."
|
||||
},
|
||||
{
|
||||
"title": "Conexión y prueba",
|
||||
"body": "<code>pct set</code> añade la entrada <code>devN</code> y después se comprueba el acceso dentro del LXC. Las imágenes de LinuxServer se comprueban también como usuario <code>abc</code>."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -98,10 +181,22 @@
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{ "title": "Intel/AMD VA-API", "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" },
|
||||
{ "title": "Coral PCIe/M.2", "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" },
|
||||
{ "title": "Un dispositivo USB concreto", "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" },
|
||||
{ "title": "OpenCL AMD", "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" }
|
||||
{
|
||||
"title": "Intel/AMD VA-API",
|
||||
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "Coral PCIe/M.2",
|
||||
"code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "Un dispositivo USB concreto",
|
||||
"code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "OpenCL AMD",
|
||||
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -116,13 +211,37 @@
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Perfil", "Traducción", "Se ofrece cuando"],
|
||||
"headers": [
|
||||
"Perfil",
|
||||
"Configuración resultante",
|
||||
"Se ofrece cuando"
|
||||
],
|
||||
"rows": [
|
||||
["Intel/AMD VA-API", "Render node de <code>/dev/dri</code>", "La aplicación admite aceleración de vídeo"],
|
||||
["OpenCL", "Render node, <code>/dev/kfd</code> si hace falta y el mod oficial", "La imagen o el perfil lo documentan"],
|
||||
["NVIDIA", "Dispositivos y librerías del driver del host", "El host tiene un driver operativo y NVIDIA Container Toolkit"],
|
||||
["Coral", "<code>/dev/apex_0</code> o el bus USB", "El perfil declara soporte de Coral (Frigate)"],
|
||||
["USB, serie, FUSE", "Un dispositivo concreto, un árbol validado o una función LXC", "El contrato lo pide"]
|
||||
[
|
||||
"Intel/AMD VA-API",
|
||||
"Render node de <code>/dev/dri</code>",
|
||||
"La aplicación admite aceleración de vídeo"
|
||||
],
|
||||
[
|
||||
"OpenCL",
|
||||
"Render node, <code>/dev/kfd</code> si hace falta y el mod oficial",
|
||||
"La imagen o el perfil lo documentan"
|
||||
],
|
||||
[
|
||||
"NVIDIA",
|
||||
"Dispositivos y librerías del driver del host",
|
||||
"El host tiene un driver operativo y NVIDIA Container Toolkit"
|
||||
],
|
||||
[
|
||||
"Coral",
|
||||
"<code>/dev/apex_0</code> o el bus USB",
|
||||
"El perfil declara soporte de Coral (Frigate)"
|
||||
],
|
||||
[
|
||||
"USB, serie, FUSE",
|
||||
"Un dispositivo concreto, un árbol validado o una función LXC",
|
||||
"El contrato lo pide"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -145,7 +264,9 @@
|
||||
"p": "Estos dos comandos, en el host, muestran si el driver y el Toolkit están disponibles:"
|
||||
},
|
||||
{
|
||||
"shell": { "code": "nvidia-smi -L\nnvidia-container-cli --version" }
|
||||
"shell": {
|
||||
"code": "nvidia-smi -L\nnvidia-container-cli --version"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "En un host cuyo driver se instaló por otros medios, el Toolkit se instala desde el repositorio estable oficial:"
|
||||
@@ -159,7 +280,9 @@
|
||||
"p": "El inventario que usa OCI manager Apps es la salida de:"
|
||||
},
|
||||
{
|
||||
"shell": { "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" }
|
||||
"shell": {
|
||||
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
@@ -170,10 +293,26 @@
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{ "icon": "cpu", "title": "Inventario desde el driver", "body": "<code>nvidia-container-cli</code> enumera los nodos de dispositivo, los binarios, el firmware y las librerías del driver instalado." },
|
||||
{ "icon": "refresh", "title": "Sin versión fija", "body": "La plantilla no nombra archivos de librería. El perfil se genera a partir del host actual." },
|
||||
{ "icon": "shield", "title": "Montajes de solo lectura", "body": "Las librerías del host se montan en solo lectura en lugar de copiarse dentro del contenedor." },
|
||||
{ "icon": "hardDrive", "title": "Cambios de driver", "body": "Tras un cambio de driver, el inventario se genera de nuevo antes de que arranquen los LXC afectados." }
|
||||
{
|
||||
"icon": "cpu",
|
||||
"title": "Inventario desde el driver",
|
||||
"body": "<code>nvidia-container-cli</code> enumera los nodos de dispositivo, los binarios, el firmware y las librerías del driver instalado."
|
||||
},
|
||||
{
|
||||
"icon": "refresh",
|
||||
"title": "Sin versión fija",
|
||||
"body": "La plantilla no nombra archivos de librería. El perfil se genera a partir del host actual."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Montajes de solo lectura",
|
||||
"body": "Las librerías del host se montan en solo lectura en lugar de copiarse dentro del contenedor."
|
||||
},
|
||||
{
|
||||
"icon": "hardDrive",
|
||||
"title": "Cambios de driver",
|
||||
"body": "Tras un cambio de driver, el inventario se genera de nuevo antes de que arranquen los LXC afectados."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -209,12 +348,32 @@
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Petición", "Traducción", "Alcance"],
|
||||
"headers": [
|
||||
"Petición",
|
||||
"Configuración resultante",
|
||||
"Alcance"
|
||||
],
|
||||
"rows": [
|
||||
["<code>/dev/dvb</code>, <code>/dev/snd</code> o <code>/dev/bus/usb</code>", "Cada nodo de caracteres del árbol recibe su propia entrada <code>devN</code> con el modo y el GID del host", "Solo el árbol pedido, no el resto de <code>/dev</code>"],
|
||||
["<code>/dev/fuse</code>", "El nodo y, cuando el perfil lo necesita, la función <code>fuse=1</code>", "FUSE por sí solo no publica montajes a otros LXC"],
|
||||
["<code>/dev/net/tun</code>", "Una entrada <code>devN</code> en la misma ruta dentro del LXC", "La configuración de la VPN o de la red queda en la aplicación"],
|
||||
["<code>/dev/kvm</code>", "Una entrada <code>devN</code> validada", "Solo se ofrece cuando el contrato lo pide"]
|
||||
[
|
||||
"<code>/dev/dvb</code>, <code>/dev/snd</code> o <code>/dev/bus/usb</code>",
|
||||
"Cada nodo de caracteres del árbol recibe su propia entrada <code>devN</code> con el modo y el GID del host",
|
||||
"Solo el árbol pedido, no el resto de <code>/dev</code>"
|
||||
],
|
||||
[
|
||||
"<code>/dev/fuse</code>",
|
||||
"El nodo y, cuando el perfil lo necesita, la función <code>fuse=1</code>",
|
||||
"FUSE por sí solo no publica montajes a otros LXC"
|
||||
],
|
||||
[
|
||||
"<code>/dev/net/tun</code>",
|
||||
"Una entrada <code>devN</code> en la misma ruta dentro del LXC",
|
||||
"La configuración de la VPN o de la red queda en la aplicación"
|
||||
],
|
||||
[
|
||||
"<code>/dev/kvm</code>",
|
||||
"Una entrada <code>devN</code> validada",
|
||||
"Solo se ofrece cuando el contrato lo pide"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "OCI manager Apps | ProxMenux",
|
||||
"description": "Imágenes OCI oficiales ejecutadas como contenedores LXC nativos de Proxmox VE, con datos persistentes, dispositivos, aplicaciones multicontenedor y actualizaciones transaccionales."
|
||||
"description": "Ejecuta imágenes OCI oficiales como contenedores LXC nativos de Proxmox VE, con datos persistentes, acceso a dispositivos, aplicaciones con varios contenedores y actualizaciones transaccionales."
|
||||
},
|
||||
"header": {
|
||||
"title": "OCI manager Apps",
|
||||
"description": "Las imágenes OCI oficiales se ejecutan como contenedores LXC nativos de Proxmox VE. La imagen sigue siendo la que publica su responsable; ProxMenux reproduce el entorno que Docker Compose habría creado a su alrededor.",
|
||||
"description": "Las imágenes OCI oficiales se ejecutan como contenedores LXC nativos de Proxmox VE. Se utiliza la misma imagen que publica su desarrollador; ProxMenux reproduce el entorno que Docker Compose habría creado a su alrededor.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
@@ -15,34 +15,43 @@
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Una imagen OCI, un LXC nativo",
|
||||
"body": "Dentro de los contenedores no se ejecuta ningún motor Docker. Proxmox VE importa el sistema de archivos de la imagen y sus metadatos OCI, y la aplicación pasa a ser el proceso principal de un LXC nativo, gestionado con las mismas herramientas que cualquier otro contenedor del nodo."
|
||||
"body": "No se ejecuta Docker Engine dentro de los contenedores. Proxmox VE importa el sistema de archivos de la imagen y sus metadatos OCI; la aplicación pasa a ser el proceso principal de un LXC nativo, administrado con las mismas herramientas que cualquier otro contenedor del nodo."
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{ "label": "Origen", "detail": "Imagen OCI\nCompose y documentación" },
|
||||
{ "label": "ProxMenux", "detail": "Contrato JSON\nvalidación y plan" },
|
||||
{ "label": "Proxmox VE", "detail": "LXC nativo\nvolúmenes y dispositivos" }
|
||||
{
|
||||
"label": "Origen",
|
||||
"detail": "Imagen OCI\nCompose y documentación"
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux",
|
||||
"detail": "Contrato JSON\nvalidación y planificación"
|
||||
},
|
||||
{
|
||||
"label": "Proxmox VE",
|
||||
"detail": "LXC nativo\nvolúmenes y dispositivos"
|
||||
}
|
||||
],
|
||||
"caption": "La aplicación no se reconstruye: su entorno se reproduce de forma declarativa."
|
||||
"caption": "Se utiliza la aplicación original; su entorno se define de forma declarativa y se reproduce."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "where",
|
||||
"title": "Dónde se encuentra",
|
||||
"intro": "OCI manager Apps se abre desde la opción <strong>OCI manager Apps (Technology Preview)</strong> del menú principal de ProxMenux, en el nodo Proxmox y como root. Su primera pantalla ofrece:",
|
||||
"title": "Dónde encontrarlo",
|
||||
"intro": "OCI manager Apps se abre desde la opción <strong>OCI manager Apps (Technology Preview)</strong> del menú principal de ProxMenux, en el nodo Proxmox y como root. La primera pantalla ofrece:",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"<strong>Buscar aplicaciones</strong>: búsqueda por nombre en todo el catálogo.",
|
||||
"<strong>Todas las aplicaciones</strong>: el catálogo completo, con el número de aplicaciones.",
|
||||
"<strong>Gestionar aplicaciones OCI instaladas</strong>: actualizar, modificar, eliminar o recuperar lo instalado.",
|
||||
"<strong>Cuentas de registro</strong>: las cuentas con las que se instalan y actualizan imágenes de registros privados.",
|
||||
"<strong>Instalar una imagen que no está en el catálogo</strong>: traducción de un archivo Compose, un comando <code>docker run</code> o una referencia de imagen.",
|
||||
"<strong>Buscar aplicaciones</strong>: busca por nombre en todo el catálogo.",
|
||||
"<strong>Todas las aplicaciones</strong>: muestra el catálogo completo y su número de aplicaciones.",
|
||||
"<strong>Gestionar aplicaciones OCI instaladas</strong>: actualiza, modifica, elimina o recupera las aplicaciones que ya has instalado.",
|
||||
"<strong>Cuentas de registros</strong>: administra las cuentas utilizadas para instalar y actualizar imágenes de registros privados.",
|
||||
"<strong>Instalar una imagen que no esté en el catálogo</strong>: adapta un archivo Compose, un comando <code>docker run</code> o una referencia de imagen.",
|
||||
"Las categorías del catálogo, cada una con su número de aplicaciones."
|
||||
]
|
||||
}
|
||||
@@ -50,40 +59,72 @@
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/main-menu.png",
|
||||
"alt": "Pantalla principal de OCI manager Apps con la búsqueda, todas las aplicaciones, la gestión, la imagen propia y las categorías del catálogo",
|
||||
"alt": "Pantalla principal de OCI manager Apps con búsqueda, listado completo, gestión de aplicaciones, imágenes fuera del catálogo y categorías.",
|
||||
"caption": "Pantalla principal de OCI manager Apps."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Al seleccionar una aplicación se muestra su descripción, la imagen que ejecuta y dos modos de instalación: <strong>Instalar con la configuración predeterminada</strong>, que pregunta solo lo que decide toda instalación (almacenamiento, dónde van los datos, dirección e inicio), e <strong>Instalar con la configuración avanzada</strong>, que abre cada decisión en orden: VMID y recursos, el almacenamiento de cada ruta, el bridge y los dispositivos."
|
||||
"p": "Al seleccionar una aplicación se muestran su descripción, la imagen que utiliza y dos modos de instalación. <strong>Instalar con ajustes predeterminados</strong> solo pregunta lo esencial de cada instalación: almacenamiento, ubicación de los datos, dirección y arranque. <strong>Instalar con ajustes avanzados</strong> recorre todas las decisiones en orden: VMID y recursos, almacenamiento de cada ruta, puente de red y dispositivos."
|
||||
},
|
||||
{
|
||||
"p": "Una aplicación probada en real muestra <strong>Verificado</strong> en esa vista y aparece marcada con ✓ en las listas, tanto si se probó en el laboratorio de ProxMenux como si la probó la comunidad."
|
||||
"p": "Las aplicaciones que se han probado realmente muestran <strong>Verificado</strong> en esa vista y una marca ✓ en las listas, tanto si la prueba se hizo en el laboratorio de ProxMenux como si la realizó la comunidad."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "beta",
|
||||
"title": "Por qué es una Technology Preview",
|
||||
"title": "Por qué lleva la etiqueta Technology Preview",
|
||||
"blocks": [
|
||||
{ "p": "OCI manager Apps lleva la etiqueta <strong>Technology Preview</strong> que Proxmox VE da a los contenedores de aplicación creados a partir de imágenes OCI, introducidos en Proxmox VE 9.1. Se refiere a aquello sobre lo que funciona OCI manager Apps, no al motor de ProxMenux: el comportamiento de esos contenedores todavía puede cambiar entre versiones de Proxmox VE. La etiqueta se mantiene hasta que Proxmox VE dé ese soporte por estable." },
|
||||
{ "p": "El motor de OCI manager Apps (instalación, actualización, modificación, recreación, backups, restauración, migración y vigilancia) está probado en el laboratorio de ProxMenux. Cada aplicación se prueba por separado: las que se han probado de verdad muestran <strong>Verified</strong> y llevan una ✓ en las listas." }
|
||||
{
|
||||
"p": "OCI manager Apps mantiene la etiqueta <strong>Technology Preview</strong> que Proxmox VE asigna a los contenedores de aplicaciones creados a partir de imágenes OCI, cuyo soporte se introdujo en Proxmox VE 9.1. La etiqueta se refiere a la tecnología sobre la que funciona OCI manager Apps, no al motor de ProxMenux: el comportamiento de estos contenedores puede cambiar entre versiones de Proxmox VE. Se mantendrá hasta que Proxmox VE considere estable ese soporte."
|
||||
},
|
||||
{
|
||||
"p": "El motor de OCI manager Apps se prueba en el laboratorio de ProxMenux: instalación, actualización, modificación, recreación, backups, restauración, migración y vigilancia. Cada aplicación se verifica por separado. Las que se han probado realmente muestran <strong>Verificado</strong> y llevan un ✓ en las listas."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "translation",
|
||||
"title": "Lo que Docker expresa y en qué lo convierte OCI manager Apps",
|
||||
"title": "Cómo describe Docker los requisitos y cómo los aplica OCI manager Apps",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Necesidad", "Docker la expresa como", "OCI manager Apps la convierte en"],
|
||||
"headers": [
|
||||
"Requisito",
|
||||
"Cómo lo expresa Docker",
|
||||
"Cómo lo aplica OCI manager Apps"
|
||||
],
|
||||
"rows": [
|
||||
["Ejecutar la aplicación", "<code>image</code>, <code>entrypoint</code>, <code>command</code>", "rootfs OCI y proceso principal del LXC"],
|
||||
["Conservar la configuración", "<code>volumes: /config</code>", "un disco <code>mpN</code> persistente incluido en el backup, o un directorio del host"],
|
||||
["Publicar el servicio", "<code>ports</code>", "una dirección propia del LXC y la URL de acceso al servicio"],
|
||||
["Usar hardware", "<code>devices</code>, <code>group_add</code>", "entradas <code>devN</code> con el GID efectivo del host y un perfil validado"],
|
||||
["Conectar dependencias", "<code>networks</code>, <code>depends_on</code>", "un bridge privado, direcciones fijas, orden de arranque y healthchecks"],
|
||||
["Actualizar", "<code>pull</code> y recrear", "un rootfs nuevo con el mismo contrato persistente"]
|
||||
[
|
||||
"Ejecutar la aplicación",
|
||||
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
|
||||
"El rootfs de la imagen OCI y el proceso principal del LXC"
|
||||
],
|
||||
[
|
||||
"Conservar la configuración",
|
||||
"<code>volumes: /config</code>",
|
||||
"Un volumen persistente <code>mpN</code> incluido en el backup, o bien un directorio del host."
|
||||
],
|
||||
[
|
||||
"Publicar el servicio",
|
||||
"<code>ports</code>",
|
||||
"Una dirección propia para el LXC y la URL de acceso al servicio."
|
||||
],
|
||||
[
|
||||
"Usar hardware",
|
||||
"<code>devices</code>, <code>group_add</code>",
|
||||
"Entradas <code>devN</code> con el GID efectivo del host y un perfil validado."
|
||||
],
|
||||
[
|
||||
"Conectar las dependencias",
|
||||
"<code>networks</code>, <code>depends_on</code>",
|
||||
"Un puente de red privado, direcciones fijas, orden de arranque y comprobaciones de estado."
|
||||
],
|
||||
[
|
||||
"Actualizar",
|
||||
"Descargar con <code>pull</code> y recrear",
|
||||
"Un rootfs nuevo que mantiene el mismo contrato de persistencia."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -91,15 +132,31 @@
|
||||
},
|
||||
{
|
||||
"id": "kept",
|
||||
"title": "Qué se mantiene y qué cambia",
|
||||
"title": "Qué se conserva y qué cambia",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{ "icon": "archive", "title": "Se mantiene", "body": "La imagen oficial, sus rutas internas, su entorno, su proceso de arranque y su documentación funcional." },
|
||||
{ "icon": "boxes", "title": "Se adapta", "body": "El entorno de ejecución: red, persistencia, dispositivos, permisos y dependencias usan primitivas LXC nativas de Proxmox VE." },
|
||||
{ "icon": "shield", "title": "No se traduce", "body": "Una clave de Compose sin equivalencia segura figura como bloqueo. Las plantillas con bloqueos no se ofrecen, y las opciones sensibles se confirman durante la instalación." },
|
||||
{ "icon": "refresh", "title": "Se registra", "body": "Digest de la imagen, recursos, rutas, red, dispositivos y pertenencia a una pila quedan en el contrato de la instancia, que las actualizaciones y las recreaciones reproducen." }
|
||||
{
|
||||
"icon": "archive",
|
||||
"title": "Se conserva",
|
||||
"body": "La imagen oficial, sus rutas internas, su entorno, su proceso de arranque y su documentación de uso."
|
||||
},
|
||||
{
|
||||
"icon": "boxes",
|
||||
"title": "Se adapta",
|
||||
"body": "El entorno de ejecución: la red, la persistencia, los dispositivos, los permisos y las dependencias utilizan los mecanismos nativos de LXC de Proxmox VE."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Sin equivalente",
|
||||
"body": "Una opción de Compose sin una equivalencia segura se registra como un impedimento para la instalación. Las plantillas con impedimentos no se ofrecen para instalar, y las opciones sensibles requieren confirmación durante el asistente."
|
||||
},
|
||||
{
|
||||
"icon": "refresh",
|
||||
"title": "Se registra",
|
||||
"body": "El digest de la imagen, los recursos, las rutas, la red, los dispositivos y la pertenencia a una pila se guardan en el contrato de la instancia. Las actualizaciones y recreaciones reproducen ese contrato."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -112,13 +169,41 @@
|
||||
{
|
||||
"next": {
|
||||
"items": [
|
||||
{ "label": "Cómo se traduce una imagen OCI", "href": "/docs/oci-manager/architecture", "tail": "de la imagen y su archivo Compose a un LXC nativo." },
|
||||
{ "label": "Instalar una imagen que no está en el catálogo", "href": "/docs/oci-manager/custom-image", "tail": "Compose, docker run o una referencia de imagen." },
|
||||
{ "label": "Datos, rutas y red", "href": "/docs/oci-manager/storage-network", "tail": "discos del contenedor, directorios del host, montajes Rclone y direcciones." },
|
||||
{ "label": "Dispositivos y aceleración", "href": "/docs/oci-manager/hardware", "tail": "GPU, NVIDIA, Coral, USB y otros dispositivos." },
|
||||
{ "label": "Aplicaciones multicontenedor", "href": "/docs/oci-manager/stacks", "tail": "aplicación, base de datos y caché como LXC coordinados." },
|
||||
{ "label": "Instalar, actualizar y modificar", "href": "/docs/oci-manager/lifecycle", "tail": "el contrato de la instancia y sus operaciones." },
|
||||
{ "label": "En ProxMenux Monitor", "href": "/docs/oci-manager/monitor", "tail": "versiones, actualizaciones, salida de consola y terminal." }
|
||||
{
|
||||
"label": "Cómo se adapta una imagen OCI",
|
||||
"href": "/docs/oci-manager/architecture",
|
||||
"tail": "De la imagen y su archivo Compose a un LXC nativo."
|
||||
},
|
||||
{
|
||||
"label": "Instalar una imagen que no esté en el catálogo",
|
||||
"href": "/docs/oci-manager/custom-image",
|
||||
"tail": "Un archivo Compose, un comando docker run o una referencia de imagen."
|
||||
},
|
||||
{
|
||||
"label": "Datos, rutas y red",
|
||||
"href": "/docs/oci-manager/storage-network",
|
||||
"tail": "Volúmenes del contenedor, directorios del host, montajes con rclone y direcciones."
|
||||
},
|
||||
{
|
||||
"label": "Dispositivos y aceleración",
|
||||
"href": "/docs/oci-manager/hardware",
|
||||
"tail": "GPU, NVIDIA, Coral, USB y otros dispositivos."
|
||||
},
|
||||
{
|
||||
"label": "Aplicaciones con varios contenedores",
|
||||
"href": "/docs/oci-manager/stacks",
|
||||
"tail": "Aplicación, base de datos y caché en varios LXC coordinados."
|
||||
},
|
||||
{
|
||||
"label": "Instalar, actualizar y modificar",
|
||||
"href": "/docs/oci-manager/lifecycle",
|
||||
"tail": "El contrato de la instancia y sus operaciones."
|
||||
},
|
||||
{
|
||||
"label": "En ProxMenux Monitor",
|
||||
"href": "/docs/oci-manager/monitor",
|
||||
"tail": "Versiones, actualizaciones, salida de consola y terminal."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
},
|
||||
{
|
||||
"code": {
|
||||
"code": "instances/\n└── 105/\n └── oci-compose.json\n ├── imagen y digest resuelto\n ├── recursos y red\n ├── entorno (secretos protegidos)\n ├── discos del contenedor y directorios del host\n ├── perfil de hardware y dispositivos\n ├── log de consola y modo de terminal\n └── pertenencia a una pila y ciclo de vida"
|
||||
"code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -86,7 +86,7 @@
|
||||
"registry": "Registro OCI",
|
||||
"update": "Actualizar la instancia",
|
||||
"resolve": "Resolver la etiqueta",
|
||||
"verify": "Verificar el archivo y preflight",
|
||||
"verify": "Verificar el archivo y realizar las comprobaciones previas",
|
||||
"backup": "Detener y respaldar el CT",
|
||||
"import": "Importar el rootfs nuevo",
|
||||
"reapply": "Aplicar de nuevo el contrato",
|
||||
@@ -215,7 +215,7 @@
|
||||
{
|
||||
"id": "restore",
|
||||
"title": "Backup, restauración y otro host",
|
||||
"intro": "Un backup hecho con vzdump o Proxmox Backup Server incluye el contenedor, sus discos y la copia de su contrato. Lo que la instalación guarda en el host no forma parte de él. <strong>Gestionar aplicaciones OCI instaladas</strong> detecta los contenedores restaurados en un host que no tiene su contrato, un Proxmox recién instalado u otro host, y ofrece registrarlos de nuevo.",
|
||||
"intro": "Un backup hecho con vzdump o Proxmox Backup Server incluye el contenedor, los discos del contenedor seleccionados para el backup y la copia de su contrato. Lo que la instalación guarda en el host no forma parte de él. <strong>Gestionar aplicaciones OCI instaladas</strong> detecta los contenedores restaurados en un host que no tiene su contrato, un Proxmox recién instalado u otro host, y ofrece registrarlos de nuevo.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
@@ -462,7 +462,7 @@
|
||||
],
|
||||
[
|
||||
"Discos del contenedor",
|
||||
"Proxmox los mueve con el contenedor. HA necesita que estén en un almacenamiento compartido."
|
||||
"Proxmox los mueve con el contenedor. HA necesita sus datos disponibles en el nodo de destino, mediante almacenamiento compartido o una configuración de replicación compatible."
|
||||
],
|
||||
[
|
||||
"Directorios del host y dispositivos",
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
},
|
||||
{
|
||||
"id": "app",
|
||||
"title": "App",
|
||||
"title": "Aplicación",
|
||||
"intro": "La pestaña <appLink>App</appLink> ofrece la aplicación instalada como una detección, con el nombre, el logo, el puerto y el esquema del registro. Al registrarla se abre el editor con el método <strong>Imagen OCI (instalada por ProxMenux)</strong>, que no necesita configuración.",
|
||||
"blocks": [
|
||||
{
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "Cómo convierte OCI manager Apps una aplicación con su base de datos y su caché en LXC nativos coordinados: plan, red privada, hook de dependencias, validación y actualizaciones transaccionales."
|
||||
},
|
||||
"header": {
|
||||
"title": "Aplicaciones multicontenedor",
|
||||
"title": "Aplicaciones con varios contenedores",
|
||||
"description": "Una aplicación con su base de datos, su caché y otros servicios se convierte en varios LXC nativos coordinados, que se instalan y actualizan como uno solo.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
@@ -21,7 +21,14 @@
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}<br/>{{appNet}}\"]\n O --> D[\"{{db}}<br/>{{private}}\"]\n O --> R[\"{{cache}}<br/>{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A",
|
||||
"labels": { "plan": "Plan de la pila", "app": "LXC de la aplicación", "appNet": "LAN + privada", "db": "LXC PostgreSQL", "cache": "LXC Valkey", "private": "privada" }
|
||||
"labels": {
|
||||
"plan": "Plan de la pila",
|
||||
"app": "LXC de la aplicación",
|
||||
"appNet": "LAN + privada",
|
||||
"db": "LXC PostgreSQL",
|
||||
"cache": "LXC Valkey",
|
||||
"private": "privada"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -35,14 +42,42 @@
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Elemento del plan", "Contenido", "Comprobado antes de crear nada"],
|
||||
"headers": [
|
||||
"Elemento del plan",
|
||||
"Contenido",
|
||||
"Comprobado antes de crear nada"
|
||||
],
|
||||
"rows": [
|
||||
["Miembros", "Aplicación principal, base de datos, caché, aprendizaje automático y demás dependencias", "VMID únicos, roles conocidos y exactamente un miembro principal"],
|
||||
["Imágenes", "Referencia rolling, arquitectura y digest resuelto de cada servicio", "Todas existen, admiten la arquitectura y superan la verificación de integridad OCI"],
|
||||
["Red", "Bridge privado, subred, una dirección fija por servicio y acceso LAN para el miembro principal", "Sin colisión con bridges o subredes existentes y sin direcciones repetidas"],
|
||||
["Persistencia", "Discos del contenedor, directorios del host, propietarios y backup", "Rutas sin solapamientos, almacenamiento disponible y permisos declarados"],
|
||||
["Secretos", "Contraseña de la base de datos, claves de la aplicación y credenciales iniciales", "Se generan una vez y solo se entregan a los miembros que los usan"],
|
||||
["Ciclo de vida", "Orden de arranque, orden de parada y una comprobación de salud por miembro", "La aplicación principal arranca la última y se detiene la primera"]
|
||||
[
|
||||
"Miembros",
|
||||
"Aplicación principal, base de datos, caché, aprendizaje automático y demás dependencias",
|
||||
"VMID únicos, roles conocidos y exactamente un miembro principal"
|
||||
],
|
||||
[
|
||||
"Imágenes",
|
||||
"Referencia rolling, arquitectura y digest resuelto de cada servicio",
|
||||
"Todas existen, admiten la arquitectura y superan la verificación de integridad OCI"
|
||||
],
|
||||
[
|
||||
"Red",
|
||||
"Bridge privado, subred, una dirección fija por servicio y acceso LAN para el miembro principal",
|
||||
"Sin colisión con bridges o subredes existentes y sin direcciones repetidas"
|
||||
],
|
||||
[
|
||||
"Persistencia",
|
||||
"Discos del contenedor, directorios del host, propietarios y backup",
|
||||
"Rutas sin solapamientos, almacenamiento disponible y permisos declarados"
|
||||
],
|
||||
[
|
||||
"Secretos",
|
||||
"Contraseña de la base de datos, claves de la aplicación y credenciales iniciales",
|
||||
"Se generan una vez y solo se entregan a los miembros que los usan"
|
||||
],
|
||||
[
|
||||
"Ciclo de vida",
|
||||
"Orden de arranque, orden de parada y una comprobación de salud por miembro",
|
||||
"La aplicación principal arranca la última y se detiene la primera"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -55,13 +90,34 @@
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "Reservar todos los VMID", "body": "Se comprueban el inventario de Proxmox VE y el registro de instancias. No se adopta un CT existente ni se reutiliza un contrato que todavía pertenece a otra instancia." },
|
||||
{ "title": "Preparar todas las imágenes", "body": "Todas las imágenes se resuelven, descargan y verifican antes de crear el primer contenedor." },
|
||||
{ "title": "Crear cada rootfs", "body": "Se importan los metadatos OCI oficiales y se añaden la identidad de instancia de ProxMenux y el rol del miembro." },
|
||||
{ "title": "Red privada", "body": "Se crean un bridge y una subred y cada miembro recibe su dirección fija; solo el miembro principal recibe además la interfaz de la LAN." },
|
||||
{ "title": "Persistencia", "body": "Cada base de datos y configuración recibe su propio disco del contenedor; solo los datos destinados a compartirse usan directorios del host." },
|
||||
{ "title": "Entorno", "body": "Se escriben los endpoints internos, los secretos compartidos y las variables de servicio. La aplicación llega a sus dependencias en sus direcciones privadas reservadas." },
|
||||
{ "title": "Registro", "body": "Cada miembro registra su configuración nativa, los cambios del rootfs que las actualizaciones deben reproducir y su relación con la pila." }
|
||||
{
|
||||
"title": "Reservar todos los VMID",
|
||||
"body": "Se comprueban el inventario de Proxmox VE y el registro de instancias. No se adopta un CT existente ni se reutiliza un contrato que todavía pertenece a otra instancia."
|
||||
},
|
||||
{
|
||||
"title": "Preparar todas las imágenes",
|
||||
"body": "Todas las imágenes se resuelven, descargan y verifican antes de crear el primer contenedor."
|
||||
},
|
||||
{
|
||||
"title": "Crear cada rootfs",
|
||||
"body": "Se importan los metadatos OCI oficiales y se añaden la identidad de instancia de ProxMenux y el rol del miembro."
|
||||
},
|
||||
{
|
||||
"title": "Red privada",
|
||||
"body": "Se crean un bridge y una subred y cada miembro recibe su dirección fija; solo el miembro principal recibe además la interfaz de la LAN."
|
||||
},
|
||||
{
|
||||
"title": "Persistencia",
|
||||
"body": "Cada base de datos y configuración recibe su propio disco del contenedor; solo los datos destinados a compartirse usan directorios del host."
|
||||
},
|
||||
{
|
||||
"title": "Entorno",
|
||||
"body": "Se escriben los endpoints internos, los secretos compartidos y las variables de servicio. La aplicación llega a sus dependencias en sus direcciones privadas reservadas."
|
||||
},
|
||||
{
|
||||
"title": "Registro",
|
||||
"body": "Cada miembro registra su configuración nativa, los cambios del rootfs que las actualizaciones deben reproducir y su relación con la pila."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -74,20 +130,48 @@
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Servicio", "Comprobación", "Qué demuestra"],
|
||||
"headers": [
|
||||
"Servicio",
|
||||
"Comprobación",
|
||||
"Qué demuestra"
|
||||
],
|
||||
"rows": [
|
||||
["PostgreSQL", "<code>pg_isready</code> en el CT con el host, el usuario y la base de datos esperados", "El servidor acepta conexiones para la base de datos configurada"],
|
||||
["Redis / Valkey", "<code>redis-cli</code> o <code>valkey-cli</code> <code>PING</code> contra su dirección privada", "El broker escucha y responde"],
|
||||
["Aprendizaje automático de Immich", "HTTP <code>GET /ping</code>, más una comprobación del runtime GPU seleccionado", "El servicio responde y la aceleración pedida no ha pasado a CPU"],
|
||||
["Nextcloud", "<code>GET /status.php</code> con <code>installed=true</code>, <code>maintenance=false</code> y <code>needsDbUpgrade=false</code>", "La inicialización terminó sin migraciones pendientes"],
|
||||
["Paperless-ngx / Tandoor", "HTTP en la dirección de la LAN y el puerto real del servicio", "El frontend y sus dependencias sirven la aplicación"],
|
||||
["Aplicación principal", "El endpoint de su plantilla, por ejemplo <code>/api/server/ping</code> en Immich", "La pila completa funciona a través de la aplicación que usa las dependencias"]
|
||||
[
|
||||
"PostgreSQL",
|
||||
"<code>pg_isready</code> en el CT con el host, el usuario y la base de datos esperados",
|
||||
"El servidor acepta conexiones para la base de datos configurada"
|
||||
],
|
||||
[
|
||||
"Redis / Valkey",
|
||||
"<code>redis-cli</code> o <code>valkey-cli</code> <code>PING</code> contra su dirección privada",
|
||||
"El broker escucha y responde"
|
||||
],
|
||||
[
|
||||
"Aprendizaje automático de Immich",
|
||||
"HTTP <code>GET /ping</code>, más una comprobación del runtime GPU seleccionado",
|
||||
"El servicio responde y la aceleración pedida no ha pasado a CPU"
|
||||
],
|
||||
[
|
||||
"Nextcloud",
|
||||
"<code>GET /status.php</code> con <code>installed=true</code>, <code>maintenance=false</code> y <code>needsDbUpgrade=false</code>",
|
||||
"La inicialización terminó sin migraciones pendientes"
|
||||
],
|
||||
[
|
||||
"Paperless-ngx / Tandoor",
|
||||
"HTTP en la dirección de la LAN y el puerto real del servicio",
|
||||
"El frontend y sus dependencias sirven la aplicación"
|
||||
],
|
||||
[
|
||||
"Aplicación principal",
|
||||
"El endpoint de su plantilla, por ejemplo <code>/api/server/ping</code> en Immich",
|
||||
"La pila completa funciona a través de la aplicación que usa las dependencias"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "running no significa healthy",
|
||||
"title": "En ejecución no significa que funcione correctamente",
|
||||
"body": "El estado running solo indica que existe el proceso del LXC. Cuando el servicio ofrece una comprobación mejor, se usa una comprobación exec o HTTP con un tiempo límite. Si un miembro se detiene o no supera su comprobación, la pila no se declara instalada."
|
||||
}
|
||||
}
|
||||
@@ -103,8 +187,14 @@
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{ "title": "Configuración del CT principal", "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" },
|
||||
{ "title": "Contrato privado (ejemplo)", "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" }
|
||||
{
|
||||
"title": "Configuración del CT principal",
|
||||
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
|
||||
},
|
||||
{
|
||||
"title": "Contrato privado (ejemplo)",
|
||||
"code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -121,12 +211,30 @@
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "Proxmox VE llama a pre-start", "body": "Antes de arrancar el CT principal, el hook se ejecuta con su VMID y la fase del ciclo de vida." },
|
||||
{ "title": "Un bloqueo por pila", "body": "<code>flock</code> sobre <code>/run/lock/proxmenux-stack-VMID.lock</code> impide dos secuencias de arranque a la vez." },
|
||||
{ "title": "Se lee y valida el contrato", "body": "Se exigen un esquema conocido, dependencias numéricas, etiquetas, una comprobación exec, http o running y un tiempo límite positivo." },
|
||||
{ "title": "Dependencias en orden", "body": "Cada CT debe existir; uno detenido se arranca y uno que ya está en marcha no se reinicia." },
|
||||
{ "title": "Espera de salud", "body": "La comprobación se ejecuta cada dos segundos y se confirma además que el CT sigue en marcha." },
|
||||
{ "title": "Arranca el CT principal", "body": "Cuando todas las dependencias están listas, pre-start termina y Proxmox VE arranca la aplicación." }
|
||||
{
|
||||
"title": "Proxmox VE llama a pre-start",
|
||||
"body": "Antes de arrancar el CT principal, el hook se ejecuta con su VMID y la fase del ciclo de vida."
|
||||
},
|
||||
{
|
||||
"title": "Un bloqueo por pila",
|
||||
"body": "<code>flock</code> sobre <code>/run/lock/proxmenux-stack-VMID.lock</code> impide dos secuencias de arranque a la vez."
|
||||
},
|
||||
{
|
||||
"title": "Se lee y valida el contrato",
|
||||
"body": "Se exigen un esquema conocido, dependencias numéricas, etiquetas, una comprobación exec, http o running y un tiempo límite positivo."
|
||||
},
|
||||
{
|
||||
"title": "Dependencias en orden",
|
||||
"body": "Cada CT debe existir; uno detenido se arranca y uno que ya está en marcha no se reinicia."
|
||||
},
|
||||
{
|
||||
"title": "Esperar a que el servicio esté listo",
|
||||
"body": "La comprobación se ejecuta cada dos segundos y se confirma además que el CT sigue en marcha."
|
||||
},
|
||||
{
|
||||
"title": "Arranca el CT principal",
|
||||
"body": "Cuando todas las dependencias están listas, pre-start termina y Proxmox VE arranca la aplicación."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -138,11 +246,27 @@
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Tipo", "Ejemplo", "Arranques posteriores"],
|
||||
"headers": [
|
||||
"Tipo",
|
||||
"Ejemplo",
|
||||
"Arranques posteriores"
|
||||
],
|
||||
"rows": [
|
||||
["Pila dependiente", "Immich, Nextcloud, aplicación con PostgreSQL", "El hook del CT principal arranca las dependencias y las espera"],
|
||||
["Suite de aplicaciones", "Suite Arr", "Sin miembro principal: cada LXC sigue su propio <code>onboot</code>"],
|
||||
["Aplicación simple", "Jellyfin", "Proxmox VE arranca directamente ese LXC"]
|
||||
[
|
||||
"Pila dependiente",
|
||||
"Immich, Nextcloud, aplicación con PostgreSQL",
|
||||
"El hook del CT principal arranca las dependencias y las espera"
|
||||
],
|
||||
[
|
||||
"Suite de aplicaciones",
|
||||
"Suite Arr",
|
||||
"Sin miembro principal: cada LXC sigue su propio <code>onboot</code>"
|
||||
],
|
||||
[
|
||||
"Aplicación simple",
|
||||
"Jellyfin",
|
||||
"Proxmox VE arranca directamente ese LXC"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -176,21 +300,51 @@
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "Cualquier miembro", "body": "El contrato del miembro indica el VMID principal y la lista completa de miembros." },
|
||||
{ "title": "La pila es reproducible", "body": "Se validan identidades, contratos, hook, adaptaciones y la existencia de una reproducción coordinada para esa receta." },
|
||||
{ "title": "Primero las imágenes", "body": "La aplicación no se detiene hasta que todos los digests están resueltos, descargados y verificados." },
|
||||
{ "title": "Detener y respaldar el conjunto", "body": "Los backups nativos verificados se toman con la pila detenida, de modo que aplicación y bases de datos corresponden al mismo momento." },
|
||||
{ "title": "Actualizar y comprobar cada miembro", "body": "Adaptación, red, montajes, secretos y dispositivos se aplican de nuevo antes de la comprobación de salud de cada miembro." },
|
||||
{ "title": "Publicar o recuperar todo", "body": "Los contratos nuevos solo se publican cuando todos los miembros pasan. Si uno falla, se restauran todos." }
|
||||
{
|
||||
"title": "Cualquier miembro",
|
||||
"body": "El contrato del miembro indica el VMID principal y la lista completa de miembros."
|
||||
},
|
||||
{
|
||||
"title": "La pila es reproducible",
|
||||
"body": "Se validan identidades, contratos, hook, adaptaciones y la existencia de una reproducción coordinada para esa receta."
|
||||
},
|
||||
{
|
||||
"title": "Primero las imágenes",
|
||||
"body": "La aplicación no se detiene hasta que todos los digests están resueltos, descargados y verificados."
|
||||
},
|
||||
{
|
||||
"title": "Detener y respaldar el conjunto",
|
||||
"body": "Los backups nativos verificados se toman con la pila detenida, de modo que aplicación y bases de datos corresponden al mismo momento."
|
||||
},
|
||||
{
|
||||
"title": "Actualizar y comprobar cada miembro",
|
||||
"body": "Adaptación, red, montajes, secretos y dispositivos se aplican de nuevo antes de la comprobación de salud de cada miembro."
|
||||
},
|
||||
{
|
||||
"title": "Publicar o recuperar todo",
|
||||
"body": "Los contratos nuevos solo se publican cuando todos los miembros pasan. Si uno falla, se restauran todos."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Modificar", "Qué cambia", "Qué se conserva"],
|
||||
"headers": [
|
||||
"Modificar",
|
||||
"Qué cambia",
|
||||
"Qué se conserva"
|
||||
],
|
||||
"rows": [
|
||||
["Rutas y dispositivos extra", "Se añaden al contenedor de la aplicación o se eliminan de él, y el contenedor se reinicia. No se reconstruye nada", "Los datos de la aplicación, su base de datos y los demás contenedores"],
|
||||
["Qué ejecuta el reconocimiento (Immich)", "El contenedor Machine learning toma la imagen y los dispositivos de la CPU o de una GPU del host. Toda la aplicación se detiene y se actualiza, como en una actualización", "La caché de modelos, la biblioteca y la base de datos. Si algo falla, se restauran los contenedores y la opción anteriores"]
|
||||
[
|
||||
"Rutas y dispositivos extra",
|
||||
"Se añaden al contenedor de la aplicación o se eliminan de él, y el contenedor se reinicia. No se reconstruye nada",
|
||||
"Los datos de la aplicación, su base de datos y los demás contenedores"
|
||||
],
|
||||
[
|
||||
"Qué ejecuta el reconocimiento (Immich)",
|
||||
"El contenedor Machine learning toma la imagen y los dispositivos de la CPU o de una GPU del host. Toda la aplicación se detiene y se actualiza, como en una actualización",
|
||||
"La caché de modelos, la biblioteca y la base de datos. Si algo falla, se restauran los contenedores y la opción anteriores"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -220,7 +374,7 @@
|
||||
"stop": "Detener, primero el principal",
|
||||
"backup": "Backup verificado de cada CT",
|
||||
"replace": "Sustituir el rootfs",
|
||||
"healthy": "¿Todos sanos?",
|
||||
"healthy": "¿Todos funcionan correctamente?",
|
||||
"yes": "Sí",
|
||||
"no": "No",
|
||||
"commit": "Publicar los contratos",
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Datos, rutas y red | ProxMenux",
|
||||
"description": "Cómo conserva OCI manager Apps los datos de un contenedor OCI: discos del contenedor, directorios del host, montajes Rclone, direcciones y redes privadas."
|
||||
"description": "Cómo conserva OCI manager Apps los datos de un contenedor OCI: discos del contenedor, directorios del host, montajes con rclone, direcciones y redes privadas."
|
||||
},
|
||||
"header": {
|
||||
"title": "Datos, rutas y red",
|
||||
"description": "Qué vive en el rootfs, qué sobrevive a su sustitución, cómo se comparten datos entre contenedores y cómo obtiene cada contenedor su dirección.",
|
||||
"description": "Qué se guarda en el rootfs, qué sobrevive a su sustitución, cómo se comparten datos entre contenedores y cómo obtiene cada uno su dirección.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
@@ -14,8 +14,8 @@
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "La persistencia se decide antes de que exista el LXC",
|
||||
"body": "Los volúmenes que publican la imagen y su archivo Compose se leen antes de crear el contenedor. Cada ruta que debe sobrevivir a una actualización se convierte en un punto de montaje independiente del rootfs, de modo que el rootfs solo contiene lo que pertenece a la imagen y puede sustituirse."
|
||||
"title": "La persistencia se decide antes de crear el LXC",
|
||||
"body": "Antes de crear el contenedor se leen los volúmenes declarados por la imagen y por su archivo Compose. Cada ruta que deba conservarse tras una actualización se convierte en un punto de montaje independiente del rootfs. Así, el rootfs solo contiene lo que pertenece a la imagen y puede sustituirse."
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -23,17 +23,35 @@
|
||||
{
|
||||
"id": "questions",
|
||||
"title": "Qué pregunta el instalador",
|
||||
"intro": "La plantilla aporta las rutas que necesita la aplicación. Cada una se sitúa en un disco del contenedor o en un directorio del host, y pueden añadirse más rutas antes del resumen.",
|
||||
"intro": "La plantilla proporciona las rutas que necesita la aplicación. Cada una se ubica en un disco del contenedor o en un directorio del host, y se pueden añadir más rutas antes del resumen.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "Rutas requeridas", "body": "Se enumeran <code>/config</code>, <code>/data</code>, bibliotecas, descargas y cualquier volumen que declare la aplicación." },
|
||||
{ "title": "Ubicación", "body": "Cada ruta se sitúa en un disco del contenedor o en un directorio existente del host." },
|
||||
{ "title": "Almacenamiento y tamaño", "body": "Un disco del contenedor se crea en un almacenamiento de Proxmox VE con el tamaño indicado. La instalación por defecto usa <code>local-lvm</code>; la instalación avanzada pregunta el almacenamiento de cada ruta justo antes de su tamaño y propone el del rootfs. Aparece como <code>vm-VMID-disk-N</code> y se conecta como <code>mpN</code>." },
|
||||
{ "title": "Directorio del host", "body": "Un directorio del host se indica por su ruta. Si no existe, se crea con el propietario que mapea el contenedor." },
|
||||
{ "title": "Rutas adicionales", "body": "Antes de instalar pueden añadirse más pares de ruta del host o volumen y ruta del contenedor." },
|
||||
{ "title": "Resumen", "body": "La relación completa se muestra antes de crear el CT y se guarda en su contrato de instancia." }
|
||||
{
|
||||
"title": "Rutas necesarias",
|
||||
"body": "Se enumeran <code>/config</code>, <code>/data</code>, bibliotecas, descargas y todos los volúmenes declarados por la aplicación."
|
||||
},
|
||||
{
|
||||
"title": "Ubicación",
|
||||
"body": "Cada ruta se ubica en un disco del contenedor o en un directorio del host ya existente."
|
||||
},
|
||||
{
|
||||
"title": "Almacenamiento y tamaño",
|
||||
"body": "Se crea un disco del contenedor en un almacenamiento de Proxmox VE con el tamaño indicado. La instalación predeterminada usa <code>local-lvm</code>; la avanzada pregunta el almacenamiento de cada ruta justo antes de su tamaño y propone el del rootfs. El disco aparece como <code>vm-VMID-disk-N</code> y se conecta como <code>mpN</code>."
|
||||
},
|
||||
{
|
||||
"title": "Directorio del host",
|
||||
"body": "El directorio del host se indica mediante su ruta. Si no existe, se crea con el usuario al que se mapea el del contenedor como propietario."
|
||||
},
|
||||
{
|
||||
"title": "Rutas adicionales",
|
||||
"body": "Antes de instalar se pueden añadir más pares de ruta o volumen del host y ruta dentro del contenedor."
|
||||
},
|
||||
{
|
||||
"title": "Resumen",
|
||||
"body": "Antes de crear el CT se muestra la correspondencia completa de rutas y se guarda en el contrato de la instancia."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -45,44 +63,85 @@
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Propiedad", "Disco del contenedor", "Directorio del host"],
|
||||
"headers": [
|
||||
"Propiedad",
|
||||
"Disco del contenedor",
|
||||
"Directorio del host"
|
||||
],
|
||||
"rows": [
|
||||
["En la configuración", "<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>", "<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"],
|
||||
["Backup del contenedor (vzdump)", "Incluido, con <code>backup=1</code>", "No incluido"],
|
||||
["Tamaño", "Fijo; crece con un redimensionado del punto de montaje", "El espacio libre del sistema de archivos o dataset del host"],
|
||||
["Otros contenedores", "Solo lo monta su propio contenedor", "El mismo directorio puede montarse en varios contenedores"],
|
||||
["Snapshots y restauración", "Los gestiona Proxmox VE junto con el CT", "Se gestionan en el almacenamiento del host"],
|
||||
["Al eliminar la aplicación", "Se elimina con el contenedor", "Se conserva, con su contenido"],
|
||||
["Al mover el CT a otro nodo", "Se mueve con el CT", "La misma ruta debe existir en el otro nodo"]
|
||||
[
|
||||
"En la configuración",
|
||||
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
|
||||
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
|
||||
],
|
||||
[
|
||||
"Backup del contenedor (vzdump)",
|
||||
"Incluido, con <code>backup=1</code>",
|
||||
"No incluido"
|
||||
],
|
||||
[
|
||||
"Tamaño",
|
||||
"Fijo; se amplía redimensionando el punto de montaje",
|
||||
"El espacio libre del sistema de archivos o dataset del host"
|
||||
],
|
||||
[
|
||||
"Otros contenedores",
|
||||
"Solo lo monta el contenedor al que pertenece",
|
||||
"El mismo directorio se puede montar en varios contenedores"
|
||||
],
|
||||
[
|
||||
"Snapshots y restauración",
|
||||
"Los gestiona Proxmox VE junto con el CT",
|
||||
"Se gestionan en el almacenamiento del host"
|
||||
],
|
||||
[
|
||||
"Al eliminar la aplicación",
|
||||
"Se elimina con el contenedor",
|
||||
"Se conserva con su contenido"
|
||||
],
|
||||
[
|
||||
"Al mover el CT a otro nodo",
|
||||
"Se mueve con el CT",
|
||||
"La misma ruta debe existir en el otro nodo"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "El rootfs queda reservado para los binarios y el contenido de la imagen. Una actualización o una recreación lo sustituye sin tocar ninguno de los dos tipos de punto de montaje."
|
||||
"p": "El rootfs se reserva para los binarios y el contenido de la imagen. Una actualización o recreación lo sustituye sin tocar ninguno de los dos tipos de punto de montaje."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "example",
|
||||
"title": "Ejemplo: un contenedor con las dos ubicaciones",
|
||||
"title": "Ejemplo: un contenedor con ambas ubicaciones",
|
||||
"blocks": [
|
||||
{
|
||||
"code": {
|
||||
"title": "Jellyfin instalado como CT 151 en local-lvm (extracto)",
|
||||
"code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Disco del contenedor, incluido en el backup del CT\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Directorio del host, fuera del backup del CT\nmp1: /mnt/oci-shared/media,mp=/data/media"
|
||||
"title": "Jellyfin instalado como CT 151 en local-lvm (fragmento)",
|
||||
"code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Una actualización o una recreación sustituye solo el rootfs: <code>mp0</code> conserva usuarios, bibliotecas y ajustes, y <code>mp1</code> sigue mostrando los mismos archivos multimedia. Restaurar el backup del CT devuelve <code>/config</code>; el directorio multimedia se restaura, si hace falta, desde el backup del almacenamiento del host."
|
||||
"p": "Una actualización o recreación solo sustituye el rootfs: <code>mp0</code> conserva usuarios, bibliotecas y ajustes, y <code>mp1</code> sigue mostrando los mismos archivos multimedia. Al restaurar el backup del CT se recupera <code>/config</code>; si hace falta restaurar el directorio multimedia, se utiliza el backup del almacenamiento del host."
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{ "label": "Contrato", "detail": "/config" },
|
||||
{ "label": "Ubicación", "detail": "disco del contenedor\no directorio del host" },
|
||||
{ "label": "LXC", "detail": "siempre /config\npara la aplicación" }
|
||||
{
|
||||
"label": "Contrato",
|
||||
"detail": "/config"
|
||||
},
|
||||
{
|
||||
"label": "Ubicación",
|
||||
"detail": "Disco del contenedor\no directorio del host"
|
||||
},
|
||||
{
|
||||
"label": "LXC",
|
||||
"detail": "Siempre /config\npara la aplicación"
|
||||
}
|
||||
],
|
||||
"caption": "La aplicación ve la ruta que publica la imagen; solo cambia dónde se guarda."
|
||||
"caption": "La aplicación ve la ruta declarada por la imagen; solo cambia dónde se almacena."
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -94,33 +153,48 @@
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "flowchart TB\n H[\"{{host}}<br/>/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent<br/>/data\"]\n H --> J[\"Jellyfin<br/>/data\"]\n H --> R[\"Radarr / Sonarr<br/>/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]",
|
||||
"labels": { "host": "Directorio del host", "config": "configuración propia" }
|
||||
"labels": {
|
||||
"host": "Directorio del host",
|
||||
"config": "Configuración propia"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Cada contenedor guarda su configuración en su propio disco. La biblioteca o las descargas son un único directorio del host montado en la misma ruta interna de todos los contenedores, de modo que la ruta en la que escribe una aplicación es la misma en la que lee otra."
|
||||
"p": "Cada contenedor guarda su configuración en su propio disco. La biblioteca o las descargas se guardan en un único directorio del host, montado en la misma ruta interna en todos los contenedores. Así, una ruta en la que escribe una aplicación es la misma desde la que lee otra."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rclone",
|
||||
"title": "Almacenamiento en la nube con la aplicación Rclone",
|
||||
"intro": "La aplicación Rclone del catálogo ofrece, además de su instalación, <strong>Activar un montaje en un contenedor Rclone OCI existente</strong>. Monta un remoto ya creado y autorizado en la interfaz web de Rclone y lo publica en el host, donde otros contenedores pueden usarlo como directorio del host.",
|
||||
"title": "Almacenamiento en la nube mediante la aplicación rclone",
|
||||
"intro": "Además de instalarla, la ficha de rclone en el catálogo permite <strong>Activar un montaje en un contenedor OCI de rclone existente</strong>. Se monta un remoto ya creado y autorizado en la interfaz web de rclone y se publica en el host. Otros contenedores pueden usarlo como un directorio del host.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{ "title": "Contenedor y remoto", "body": "El VMID del contenedor Rclone, el nombre exacto del remoto y, opcionalmente, una ruta dentro de él." },
|
||||
{ "title": "Nombre y caché", "body": "El nombre del montaje y el modo de caché VFS: <code>off</code>, <code>minimal</code>, <code>writes</code> o <code>full</code> (por defecto)." },
|
||||
{ "title": "Vistas publicadas", "body": "Una raíz común, <code>/mnt/oci-shared</code> de forma predeterminada, contiene una vista de lectura y escritura en <code>/mnt/oci-shared/remotes/NAME</code> y otra de solo lectura en <code>/mnt/oci-shared/remotes-ro/NAME</code>." },
|
||||
{ "title": "Activación", "body": "Tras una confirmación, el CT se detiene, se configuran su orden de arranque y un hookscript de Proxmox VE, y se vuelve a iniciar. La operación espera hasta que las dos vistas están montadas en el host." }
|
||||
{
|
||||
"title": "Contenedor y remoto",
|
||||
"body": "El VMID del contenedor de rclone, el nombre exacto del remoto y, opcionalmente, una ruta dentro de él."
|
||||
},
|
||||
{
|
||||
"title": "Nombre del montaje y caché",
|
||||
"body": "El nombre del montaje y el modo de caché VFS: <code>off</code>, <code>minimal</code>, <code>writes</code> o <code>full</code> (predeterminado)."
|
||||
},
|
||||
{
|
||||
"title": "Vistas publicadas",
|
||||
"body": "Una raíz común, <code>/mnt/oci-shared</code> de forma predeterminada, contiene una vista de lectura y escritura en <code>/mnt/oci-shared/remotes/NAME</code> y otra de solo lectura en <code>/mnt/oci-shared/remotes-ro/NAME</code>."
|
||||
},
|
||||
{
|
||||
"title": "Activación",
|
||||
"body": "Tras confirmar, se detiene el CT, se configuran su comando de arranque y un hookscript de Proxmox VE y se vuelve a iniciar. La operación espera a que ambas vistas estén montadas en el host."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Si el montaje no llega a activarse",
|
||||
"body": "Se restaura la configuración anterior del contenedor y se vuelve a iniciar, de modo que una activación fallida deja Rclone como estaba."
|
||||
"title": "Si el montaje no se activa",
|
||||
"body": "Se restaura la configuración anterior del contenedor y se vuelve a iniciar. Así, si la activación falla, rclone queda como estaba."
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -128,41 +202,58 @@
|
||||
{
|
||||
"id": "network",
|
||||
"title": "Direcciones y redes",
|
||||
"intro": "Una aplicación simple necesita una dirección. Una aplicación multicontenedor necesita además una red estable entre sus miembros.",
|
||||
"intro": "Una aplicación de un solo contenedor necesita una dirección. Una aplicación con varios contenedores también necesita una red estable entre sus miembros.",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{ "icon": "network", "title": "Aplicación simple", "body": "Se eligen el bridge y DHCP o una dirección CIDR fija. El LXC tiene una dirección propia y el resumen muestra las URL completas de los servicios." },
|
||||
{ "icon": "waypoints", "title": "Aplicación multicontenedor", "body": "Se busca una subred libre, se crea un bridge privado persistente y cada miembro (aplicación, base de datos, caché) recibe en él una dirección fija." }
|
||||
{
|
||||
"icon": "network",
|
||||
"title": "Aplicación de un contenedor",
|
||||
"body": "Se elige el puente de red y DHCP o una dirección fija en formato CIDR. El LXC tiene su propia dirección y el resumen muestra las URL completas de los servicios."
|
||||
},
|
||||
{
|
||||
"icon": "waypoints",
|
||||
"title": "Aplicación con varios contenedores",
|
||||
"body": "Se busca una subred libre, se crea un puente privado persistente y cada miembro —aplicación, base de datos y caché— recibe una dirección fija en él."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{ "label": "LAN", "detail": "dirección accesible\nsolo el servicio principal" },
|
||||
{ "label": "LXC principal", "detail": "web / API\nLAN + red privada" },
|
||||
{ "label": "Red privada", "detail": "PostgreSQL · Valkey · ML\ndirecciones fijas" }
|
||||
{
|
||||
"label": "LAN",
|
||||
"detail": "Dirección accesible\nsolo para el servicio principal"
|
||||
},
|
||||
{
|
||||
"label": "LXC principal",
|
||||
"detail": "Web / API\nLAN + red privada"
|
||||
},
|
||||
{
|
||||
"label": "Red privada",
|
||||
"detail": "PostgreSQL · Valkey · ML\ndirecciones fijas"
|
||||
}
|
||||
],
|
||||
"caption": "Las dependencias se comunican por la red privada y no tienen dirección en la LAN."
|
||||
"caption": "Las dependencias se comunican por la red privada y no tienen una dirección en la LAN."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "El contrato de la pila guarda el bridge, la subred, las direcciones y las relaciones entre servicios. La actualización de la aplicación reutiliza la misma topología en todos sus miembros. ProxMenux Monitor abre el contenedor principal en su dirección de la LAN, no en la de la red privada."
|
||||
"p": "El contrato de la pila guarda el puente, la subred, las direcciones y las relaciones entre servicios. Al actualizar la aplicación se reutiliza la misma topología para todos sus miembros. ProxMenux Monitor abre el contenedor principal en su dirección de la LAN, no en la de la red privada."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ownership",
|
||||
"title": "Propietarios",
|
||||
"title": "Propietarios de archivos y directorios",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Los directorios nuevos se crean con el UID y el GID que mapea el LXC no privilegiado.",
|
||||
"Los directorios existentes no cambian de propietario de forma recursiva.",
|
||||
"Los sockets, los archivos del sistema y las rutas sensibles no se ofrecen como directorios del host genéricos."
|
||||
"Los directorios nuevos se crean con el UID y el GID a los que se mapea el LXC sin privilegios.",
|
||||
"No se cambia recursivamente el propietario de los directorios existentes.",
|
||||
"Los sockets, archivos del sistema y rutas sensibles no se ofrecen como directorios genéricos del host."
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -174,13 +265,37 @@
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": ["Elemento", "En el vzdump del CT", "Dónde se conserva"],
|
||||
"headers": [
|
||||
"Elemento",
|
||||
"En el backup vzdump del CT",
|
||||
"Dónde se conserva"
|
||||
],
|
||||
"rows": [
|
||||
["rootfs OCI", "Sí", "El backup del CT; también puede reconstruirse desde la imagen y el contrato"],
|
||||
["Disco del contenedor con <code>backup=1</code>", "Sí", "El backup del CT"],
|
||||
["Directorio del host", "No", "El backup del almacenamiento del host"],
|
||||
["Contrato de la instancia", "No", "<code>/usr/local/share/proxmenux/oci/instances/VMID/</code> en el host"],
|
||||
["Aplicación multicontenedor", "Cada miembro en su propio backup", "Los backups de cada miembro, más el contrato de la pila y su bridge en el host"]
|
||||
[
|
||||
"Rootfs OCI",
|
||||
"Sí",
|
||||
"En el backup del CT; también se puede reconstruir a partir de la imagen y el contrato"
|
||||
],
|
||||
[
|
||||
"Disco del contenedor con <code>backup=1</code>",
|
||||
"Sí",
|
||||
"El backup del CT"
|
||||
],
|
||||
[
|
||||
"Directorio del host",
|
||||
"No",
|
||||
"El backup del almacenamiento del host"
|
||||
],
|
||||
[
|
||||
"Contrato de la instancia",
|
||||
"Sí, la copia que guarda el CT",
|
||||
"<code>/.proxmenux/oci-record.json</code> dentro del CT; las copias adicionales del host y del clúster se guardan por separado"
|
||||
],
|
||||
[
|
||||
"Aplicación con varios contenedores",
|
||||
"Cada miembro en su propio backup",
|
||||
"Los backups de todos los miembros, más el contrato de la pila y su puente de red en el host"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user