mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-06-01 04:54:42 +00:00
complete i18n migration to /[locale]/ with EN+ES content
Full rewrite of the docs site under app/[locale]/ with next-intl in localePrefix:"always" mode. Every page now exists at both /en/<path> and /es/<path>; the root / shows a meta-refresh + JS redirect to /<defaultLocale>/ so GitHub Pages serves something on the apex URL. Highlights: - 107 doc pages migrated to file-per-page JSON namespaces under messages/en/ and messages/es/. Spanish content is fully translated (no copy-of-English placeholders). - New documentation for the Active Suppressions section in the Settings tab and the per-event Dismiss dropdown in the Health Monitor modal. - New screenshots: dismiss-duration-dropdown.png and an updated health-suppression-settings.png. - Pagefind integrated for client-side search; index is built on every CI deploy (not committed). - RSS feeds: per-locale at /<locale>/rss.xml plus root /rss.xml for backward compat. - Removed the dead app/[locale]/guides/[slug]/ route — every guide now has its own static page and no markdown source remains. - Fixed orphan link /guides/nvidia -> /guides/nvidia-manual in docs/hardware/nvidia-host. - Removed obsolete components (footer2, calendar, drawer). Verified locally with `npm ci && npm run build`: 2804 files in out/, 231 pages indexed by pagefind, root redirect intact, both locale roots and the new Active Suppressions docs render OK.
This commit is contained in:
@@ -0,0 +1,216 @@
|
||||
{
|
||||
"site": {
|
||||
"name": "ProxMenux",
|
||||
"tagline": "Menú interactivo y panel web para Proxmox VE"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Inicio",
|
||||
"docs": "Docs",
|
||||
"documentation": "Documentación",
|
||||
"guides": "Guías",
|
||||
"changelog": "Cambios",
|
||||
"github": "GitHub",
|
||||
"rss": "RSS",
|
||||
"rssTitle": "Feed RSS",
|
||||
"menuOpen": "Abrir menú"
|
||||
},
|
||||
"footer": {
|
||||
"sponsorHeading": "Patrocinio",
|
||||
"sponsorBody": "Si quieres apoyar al proyecto.",
|
||||
"sponsorAlt": "Apóyame en Ko-fi",
|
||||
"connectHeading": "Conecta",
|
||||
"connectBody": "Únete a las discusiones de la comunidad en GitHub para pedir ayuda, compartir ideas y contribuir al proyecto. ¡Toda idea es bienvenida!",
|
||||
"joinDiscussion": "Únete a la discusión",
|
||||
"copyrightPrefix": "ProxMenux, un proyecto colaborativo y de código abierto de",
|
||||
"copyrightSuffix": "."
|
||||
},
|
||||
"language": {
|
||||
"switcher": "Idioma",
|
||||
"en": "English",
|
||||
"es": "Español"
|
||||
},
|
||||
"resources": {
|
||||
"documentation": {
|
||||
"title": "Documentación",
|
||||
"description": "Descripción del sistema y guías de usuario"
|
||||
},
|
||||
"changelog": {
|
||||
"title": "Cambios",
|
||||
"description": "Información sobre las últimas actualizaciones"
|
||||
},
|
||||
"guides": {
|
||||
"title": "Guías",
|
||||
"description": "Tutoriales y guías paso a paso para tareas comunes"
|
||||
},
|
||||
"github": {
|
||||
"title": "Repositorio GitHub",
|
||||
"description": "Explora el código fuente."
|
||||
}
|
||||
},
|
||||
"docSidebar": {
|
||||
"documentation": "Documentación",
|
||||
"items": {
|
||||
"introduction": "Introducción",
|
||||
"installation": "Instalación",
|
||||
"proxmenuxMonitor": "ProxMenux Monitor",
|
||||
"monitorOverview": "Resumen",
|
||||
"architecture": "Arquitectura",
|
||||
"accessAuth": "Acceso y autenticación",
|
||||
"dashboard": "Panel",
|
||||
"dashboardSystemOverview": "Pestaña Resumen del sistema",
|
||||
"dashboardStorage": "Pestaña Almacenamiento",
|
||||
"dashboardNetwork": "Pestaña Red",
|
||||
"dashboardVmsLxcs": "Pestaña VMs y LXCs",
|
||||
"dashboardHardware": "Pestaña Hardware",
|
||||
"dashboardSystemLogs": "Pestaña Logs del sistema",
|
||||
"dashboardTerminal": "Pestaña Terminal",
|
||||
"dashboardSecurity": "Pestaña Seguridad",
|
||||
"dashboardSettings": "Pestaña Settings",
|
||||
"healthMonitor": "Monitor de salud",
|
||||
"notifications": "Notificaciones",
|
||||
"aiAssistant": "Asistente de IA",
|
||||
"apiReference": "Referencia API",
|
||||
"integrations": "Integraciones",
|
||||
"proxmenuxScripts": "ProxMenux Scripts",
|
||||
"postInstallScript": "Script Post-instalación",
|
||||
"postInstallOverview": "Resumen",
|
||||
"postInstallAutomated": "Automatizado",
|
||||
"postInstallCustomizable": "Personalizable",
|
||||
"postInstallBasicSettings": "Ajustes básicos",
|
||||
"postInstallSystem": "Sistema",
|
||||
"postInstallVirtualization": "Virtualización",
|
||||
"postInstallNetwork": "Red",
|
||||
"postInstallStorage": "Almacenamiento",
|
||||
"postInstallSecurity": "Seguridad",
|
||||
"postInstallCustomization": "Personalización",
|
||||
"postInstallMonitoring": "Monitorización",
|
||||
"postInstallPerformance": "Rendimiento",
|
||||
"postInstallOptional": "Opcional",
|
||||
"postInstallUpdates": "Aplicar actualizaciones disponibles",
|
||||
"postInstallUninstall": "Desinstalar optimizaciones",
|
||||
"gpusCoralTpu": "GPUs y Coral-TPU",
|
||||
"nvidiaHost": "Instalar drivers NVIDIA (host)",
|
||||
"coralHost": "Instalar Coral TPU (host)",
|
||||
"addGpuLxc": "Añadir GPU a LXC",
|
||||
"addCoralLxc": "Añadir Coral TPU a LXC",
|
||||
"addGpuVm": "Añadir GPU a VM (passthrough)",
|
||||
"switchGpuMode": "Cambiar modo GPU (VM ↔ LXC)",
|
||||
"createVm": "Crear VM",
|
||||
"createVmOverview": "Resumen",
|
||||
"createVmSystemNas": "Sistema NAS",
|
||||
"createVmSynology": "VM Synology",
|
||||
"createVmNasOthers": "Otros sistemas NAS",
|
||||
"createVmSystemWindows": "Sistema Windows",
|
||||
"createVmSystemLinux": "Sistema Linux",
|
||||
"diskManager": "Disk Manager",
|
||||
"diskManagerOverview": "Resumen",
|
||||
"diskImportVm": "Importar disco a VM",
|
||||
"diskImportImageVm": "Importar imagen de disco a VM",
|
||||
"diskAddController": "Añadir controller o NVMe a VM",
|
||||
"diskImportLxc": "Importar disco a LXC",
|
||||
"diskFormat": "Formatear / borrar disco físico",
|
||||
"diskSmart": "Salud y test SMART de disco",
|
||||
"storageShareManager": "Almacenamiento y compartición",
|
||||
"storageShareOverview": "Resumen",
|
||||
"hostStorage": "Integración de almacenamiento en host",
|
||||
"hostNfs": "Añadir share NFS como storage Proxmox",
|
||||
"hostSamba": "Añadir share Samba como storage Proxmox",
|
||||
"hostIscsi": "Añadir target iSCSI como storage Proxmox",
|
||||
"hostLocalDisk": "Añadir disco local como storage Proxmox",
|
||||
"hostLocalShared": "Añadir directorio compartido en el host",
|
||||
"lxcMountPoints": "Mount points de LXC (host ↔ CT)",
|
||||
"lxcNetworkSharing": "Compartición de red en LXC",
|
||||
"lxcNfsClient": "Cliente NFS en LXC",
|
||||
"lxcSambaClient": "Cliente Samba en LXC",
|
||||
"lxcNfsServer": "Servidor NFS en LXC",
|
||||
"lxcSambaServer": "Servidor Samba en LXC",
|
||||
"network": "Red",
|
||||
"networkOverview": "Resumen",
|
||||
"networkDiagnostics": "Diagnóstico",
|
||||
"networkMonitoring": "Herramientas de monitorización en vivo",
|
||||
"networkBridge": "Análisis y reparación de bridge",
|
||||
"networkConfig": "Análisis y limpieza de configuración",
|
||||
"networkPersistent": "Nombres persistentes de interfaces",
|
||||
"networkBackup": "Backup y reinicio de interfaces",
|
||||
"security": "Seguridad",
|
||||
"securityOverview": "Resumen",
|
||||
"securityFail2ban": "Fail2Ban",
|
||||
"securityLynis": "Lynis",
|
||||
"utilities": "Utilidades",
|
||||
"utilsOverview": "Resumen",
|
||||
"utilsUupDump": "Creador de ISO UUP Dump",
|
||||
"utilsSystemUtils": "Instalador de utilidades del sistema",
|
||||
"utilsSystemUpdate": "Actualización del sistema Proxmox",
|
||||
"utilsUpgradePve": "Upgrade PVE 8 a PVE 9",
|
||||
"utilsExportVm": "Exportar VM a OVA / OVF",
|
||||
"utilsImportVm": "Importar VM desde OVA / OVF",
|
||||
"settingsProxmenux": "Settings ProxMenux",
|
||||
"settingsOverview": "Resumen",
|
||||
"settingsMonitor": "ProxMenux Monitor",
|
||||
"settingsBeta": "Cambiar canal de release",
|
||||
"settingsVersion": "Mostrar información de versión",
|
||||
"settingsUninstall": "Desinstalar ProxMenux",
|
||||
"commandsReference": "Referencia de comandos",
|
||||
"commandsOverview": "Resumen",
|
||||
"commandsSystem": "Comandos de sistema útiles",
|
||||
"commandsVmCt": "Gestión de VM y CT",
|
||||
"commandsStorage": "Almacenamiento y discos",
|
||||
"commandsNetwork": "Comandos de red",
|
||||
"commandsUpdates": "Actualizaciones y paquetes",
|
||||
"commandsGpu": "GPU Passthrough",
|
||||
"commandsZfs": "Gestión de ZFS",
|
||||
"commandsBackup": "Backup y restauración",
|
||||
"commandsTools": "Herramientas CLI del sistema",
|
||||
"glossary": "Glosario",
|
||||
"about": "Acerca de",
|
||||
"aboutOverview": "Resumen",
|
||||
"aboutFaq": "FAQ",
|
||||
"aboutContributors": "Contribuidores",
|
||||
"aboutContributing": "Contribuir",
|
||||
"aboutCodeOfConduct": "Código de conducta",
|
||||
"externalRepositories": "Repositorios externos"
|
||||
}
|
||||
},
|
||||
"hero": {
|
||||
"title": "ProxMenux",
|
||||
"tagline": "Menú interactivo y panel web para Proxmox VE",
|
||||
"description": "ProxMenux es un menú interactivo y un panel web para Proxmox VE — ejecuta comandos, scripts y asistentes guiados desde un menú de terminal, o monitoriza la salud del host, métricas y notificaciones desde el navegador.",
|
||||
"installButton": "Instalar ahora",
|
||||
"whatIsButton": "¿Qué es ProxMenux?",
|
||||
"logoAlt": "Logo de ProxMenux"
|
||||
},
|
||||
"docNav": {
|
||||
"previous": "Anterior",
|
||||
"next": "Siguiente"
|
||||
},
|
||||
"tocPanel": {
|
||||
"onThisPage": "En esta página"
|
||||
},
|
||||
"supportProject": {
|
||||
"heading": "¡Apoya el proyecto!",
|
||||
"body": "Si <strong>ProxMenux</strong> te resulta útil, dale una ⭐ en GitHub para que otros puedan descubrirlo.",
|
||||
"button": "Dale una estrella en GitHub"
|
||||
},
|
||||
"rssLink": {
|
||||
"heading": "¡Mantente al día!",
|
||||
"body": "Suscríbete a nuestro feed RSS para recibir notificaciones de los cambios.",
|
||||
"copy": "Copiar",
|
||||
"copied": "¡Copiado!",
|
||||
"copyTitle": "Copiar URL del RSS",
|
||||
"openFeed": "Abrir feed RSS",
|
||||
"openTitle": "Abrir feed RSS"
|
||||
},
|
||||
"changelog": {
|
||||
"pageTitle": "Changelog",
|
||||
"meta": {
|
||||
"title": "Changelog de ProxMenux",
|
||||
"titleSuffix": "Notas de release",
|
||||
"latest": "Última",
|
||||
"mostRecent": "Última release",
|
||||
"description": "Notas de release e historial de cambios de ProxMenux — el script basado en menús para gestionar Proxmox VE.",
|
||||
"descriptionTail": "Nuevas funciones, fixes, actualizaciones de seguridad, mejoras de ProxMenux Monitor, compatibilidad con proveedores de IA, hardening de GPU passthrough y más.",
|
||||
"ogDescription": "Notas de release de ProxMenux.",
|
||||
"ogTail": "Suscríbete vía RSS o vuelve a comprobarlo para nuevas versiones."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Código de conducta | ProxMenux Documentation",
|
||||
"description": "Código de conducta y buenas prácticas de ProxMenux para colaboradores, testers y usuarios.",
|
||||
"ogTitle": "Código de conducta | ProxMenux Documentation",
|
||||
"ogDescription": "Expectativas sobre responsabilidad del código, divulgación de problemas de seguridad y alcance de los PRs para el proyecto ProxMenux."
|
||||
},
|
||||
"errors": {
|
||||
"notFound": "Error: archivo CODE_OF_CONDUCT.md no encontrado.",
|
||||
"loadFailed": "Error: no se pudo cargar el contenido del código de conducta."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,293 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Contribuir a ProxMenux | ProxMenux Documentation",
|
||||
"description": "Cómo contribuir a ProxMenux — modelo de ramas (main / develop / feature/*), flujo de pull requests, plantilla de cabecera de script con atribución de autor y enlace opcional de patrocinio, política de diseño UI en dos fases, funciones de mensajes y el camino desde una rama de función hasta un release estable.",
|
||||
"ogTitle": "Contribuir a ProxMenux",
|
||||
"ogDescription": "Modelo de ramas, flujo de trabajo, atribución en la cabecera del script y política de diseño UI en dos fases que los colaboradores deben seguir."
|
||||
},
|
||||
"header": {
|
||||
"title": "Contribuir a ProxMenux",
|
||||
"description": "ProxMenux está abierto a contribuciones de la comunidad — scripts nuevos, arreglos para los existentes, mejoras de diálogos, traducciones, integraciones. Esta página es la puerta formal: cómo está estructurado el repositorio, el modelo de ramas y el flujo de pull requests, la cabecera del script con atribución de autor y enlace opcional de patrocinio, y las convenciones de diseño que toda contribución debe seguir.",
|
||||
"section": "Acerca de"
|
||||
},
|
||||
"twoPagesCallout": {
|
||||
"title": "Dos páginas relacionadas, un proyecto",
|
||||
"body": "No confundas esta página con <contributorsLink>Colaboradores</contributorsLink>: esa celebra a las personas que ya contribuyen (testers, revisores, desarrolladores). Esta página es para <em>ti</em> — el aspirante a colaborador — y explica cómo enviar un PR que vaya a ser mergeado."
|
||||
},
|
||||
"branching": {
|
||||
"heading": "Modelo de ramas",
|
||||
"intro": "ProxMenux usa un modelo de ramas de tres niveles:",
|
||||
"headerBranch": "Rama",
|
||||
"headerPurpose": "Propósito",
|
||||
"rows": [
|
||||
{
|
||||
"branch": "main",
|
||||
"purposeRich": "Código estable, listo para producción. Solo los merges de calidad de release aterrizan aquí. Esto es lo que reciben los usuarios finales cuando instalan ProxMenux normalmente."
|
||||
},
|
||||
{
|
||||
"branch": "develop",
|
||||
"purposeRich": "Rama de desarrollo activo. Todo trabajo nuevo aterriza aquí primero; es el canal \"beta\". Los releases estables se cortan desde aquí hacia <code>main</code> cuando un release está listo."
|
||||
},
|
||||
{
|
||||
"branch": "feature/*",
|
||||
"purposeRich": "Ramas de vida corta por función, arreglo o mejora. Creadas desde <code>develop</code>, mergeadas de vuelta a <code>develop</code> vía un Pull Request tras revisión."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "Qué significa esto para los usuarios",
|
||||
"calloutBody": "Los usuarios finales siguiendo <code>main</code> reciben releases probados. Los usuarios que quieren las últimas funciones pronto — y a quienes no les importan los ocasionales bordes ásperos — pueden seguir <code>develop</code>. Las funciones nuevas siempre pasan por <code>develop</code> primero; nada llega a <code>main</code> sin pasar por ese ciclo."
|
||||
},
|
||||
"workflow": {
|
||||
"heading": "Flujo de pull request",
|
||||
"intro": "De idea a release mergeado en cinco pasos:",
|
||||
"step1Lead": "<strong>Crea una rama de función desde <code>develop</code></strong>:",
|
||||
"step1Code": "git clone https://github.com/MacRimi/ProxMenux.git\ncd ProxMenux\ngit checkout develop\ngit pull origin develop\ngit checkout -b feature/your-feature-name",
|
||||
"step1Trail": "Usa un nombre de rama descriptivo: <code>feature/zfs-arc-tuning</code>, <code>feature/fix-iommu-detection</code>, <code>feature/add-tailscale-script</code>.",
|
||||
"step2Lead": "<strong>Trabaja en tus cambios y sube la rama:</strong>",
|
||||
"step2Code": "# Make your changes, then:\ngit add scripts/...\ngit commit -m \"Add ZFS ARC tuning script\"\ngit push -u origin feature/your-feature-name",
|
||||
"step3": "<strong>Abre un Pull Request contra <code>develop</code></strong> (no contra <code>main</code>). En la página de creación del PR en GitHub, comprueba dos veces que la rama base esté establecida en <code>develop</code>. Incluye en la descripción: qué hace el script, qué cambia y en qué versiones de Proxmox VE lo probaste.",
|
||||
"step4": "<strong>Tras la revisión, los cambios se mergean en <code>develop</code>.</strong> Un mantenedor revisa la calidad del código, las convenciones de cabecera y la política UI en dos fases. Pueden pedir cambios — empuja más commits a la misma rama y el PR se actualiza automáticamente.",
|
||||
"step5": "<strong>Los releases estables se mergean desde <code>develop</code> hacia <code>main</code>.</strong> Cuando los mantenedores cortan un release, se hace fast-forward de <code>develop</code> a <code>main</code> y se etiqueta. Tu contribución pasa a formar parte de la siguiente versión estable."
|
||||
},
|
||||
"scriptHeader": {
|
||||
"heading": "Cabecera del script — metadatos y descripción",
|
||||
"intro": "Cada script de ProxMenux empieza con dos bloques de comentarios adyacentes que juntos forman la cabecera. Son <strong>ambos obligatorios</strong> — juntos permiten a cualquier lector saber quién escribió el script y qué hace, todo sin abrir el código.",
|
||||
"bullets": [
|
||||
"<strong>Bloque superior — metadatos.</strong> Autor, enlaces opcionales a GitHub / Sponsor, mantenedor, copyright, licencia, versión, fecha de última actualización. Aquí es también donde sucede el <em>reconocimiento al colaborador</em>: cuando escribes un script nuevo, tu nombre va aquí, y opcionalmente puedes incluir un enlace a tu página personal (GitHub) y a un perfil de patrocinio (Ko-fi, GitHub Sponsors, Buy Me a Coffee, etc.).",
|
||||
"<strong>Bloque inferior — descripción.</strong> Un párrafo corto en inglés llano explicando qué hace el script. Esto es lo que los usuarios leen <em>antes</em> de abrir el código — debe ser lo bastante autocontenido como para que alguien que solo ve la cabecera entienda el propósito del script. Lista las acciones principales, los recursos afectados, cualquier prerrequisito."
|
||||
],
|
||||
"licenseCalloutTitle": "La línea de licencia está fijada — GPL-3.0",
|
||||
"licenseCalloutBody": "ProxMenux se publica bajo la <strong>GNU General Public License v3.0</strong>. Cada script del proyecto se entrega bajo esa misma licencia; la línea <code>License</code> en la cabecera es siempre la referencia GPL-3.0 mostrada en el ejemplo de abajo — no es una elección por script. Al contribuir un script aceptas publicarlo bajo GPL-3.0, lo que significa que cualquiera puede leerlo, modificarlo y redistribuirlo (incluyendo las modificaciones) mientras lo mantenga bajo la misma licencia. El texto completo vive en <licenseLink>MacRimi/ProxMenux/LICENSE</licenseLink>.",
|
||||
"templateCode": "#!/bin/bash\n\n# ==========================================================\n# ProxMenux - A menu-driven script for Proxmox VE management\n# ==========================================================\n# Author : Your Name\n# GitHub : github.com/yourhandle\n# Sponsor : ko-fi.com/yourhandle\n# Maintainer : MacRimi\n# Copyright : (c) 2026 MacRimi & contributors\n# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)\n# Version : 1.0\n# Last Updated: DD/MM/YYYY\n# ==========================================================\n# Description:\n# Short paragraph explaining what the script does.\n# Mention the main actions (e.g. \"creates a ZFS pool\",\n# \"configures IOMMU and reboots\", \"imports an ISO into a VM\"),\n# the resources it touches, and any prerequisites the user\n# should be aware of before running it.\n# ==========================================================",
|
||||
"optionalNote": "Las líneas <code>GitHub</code> y <code>Sponsor</code> son opcionales — déjalas fuera si no quieres publicarlas. Todo lo demás es obligatorio.",
|
||||
"whyCalloutTitle": "Por qué esto importa",
|
||||
"whyCalloutBody": "La contribución de código abierto es trabajo voluntario. Poner el nombre del colaborador y (cuando se proporciona) el enlace de patrocinio directamente en el código fuente da a las personas que construyen los scripts un reconocimiento visible cada vez que alguien lee el código — tu autoría se preserva, no queda oculta bajo \"el proyecto\". El bloque de descripción importa por una razón distinta: es lo primero que lee un futuro mantenedor o un usuario curioso, y una descripción clara es a menudo la diferencia entre un script en el que la gente confía y uno que evitan."
|
||||
},
|
||||
"structure": {
|
||||
"heading": "Estructura del proyecto",
|
||||
"intro": "Dónde vive cada tipo de script en el repositorio:",
|
||||
"treeCode": "scripts/\n├── menus/ # Top-level menu scripts (entry points)\n├── storage/ # Disk, storage and passthrough scripts\n├── share/ # NFS, Samba, local share scripts\n├── vm/ # VM creation and configuration scripts\n├── gpu_tpu/ # GPU / TPU passthrough scripts\n├── post_install/ # Post-install automation scripts\n├── backup_restore/ # Backup and restore scripts\n├── utilities/ # System utility scripts\n├── global/ # Shared helper libraries (sourced by other scripts)\n├── utils.sh # Shared utility functions and message helpers\n└── help_info_menu.sh # Interactive help and command reference",
|
||||
"outro": "Cada script hace source de <code>utils.sh</code> al arrancar para obtener las funciones de mensajes, el spinner, las variables de color y el sistema de traducción. Las bibliotecas de helpers compartidas (en <code>scripts/global/</code>) las hacen source explícitamente los scripts que las necesitan."
|
||||
},
|
||||
"twoPhase": {
|
||||
"heading": "La política de diseño UI en dos fases",
|
||||
"intro": "Esta es la convención más importante en ProxMenux y la que más se les pide arreglar a los PRs. Cada script se divide en <strong>exactamente dos fases</strong>:",
|
||||
"headerPhase": "Fase",
|
||||
"headerPurpose": "Propósito",
|
||||
"headerScreen": "Estado de la pantalla",
|
||||
"rows": [
|
||||
{
|
||||
"phaseRich": "<strong>Fase 1 — Selección</strong>",
|
||||
"purposeRich": "Recopila cada decisión del usuario. Ejecuta cualquier trabajo preparatorio necesario (sondeos, escaneos, comprobaciones).",
|
||||
"screenRich": "Overlays de <code>dialog</code>. Si un sondeo entre dos menús tarda más de un segundo o dos, muestra un spinner <code>msg_info</code> para que el usuario sepa que el script no se ha colgado, después llama a <code>stop_spinner</code> justo antes del siguiente diálogo."
|
||||
},
|
||||
{
|
||||
"phaseRich": "<strong>Fase 2 — Ejecución</strong>",
|
||||
"purposeRich": "Ejecuta cada operación. Muestra el historial completo de progreso acumulándose en pantalla.",
|
||||
"screenRich": "Mensajes visibles de <code>msg_info</code> / <code>msg_ok</code>; nunca <code>dialog</code>."
|
||||
}
|
||||
],
|
||||
"principle": "El principio: <strong>recopila todo primero, después ejecuta todo</strong>. El usuario ve un menú limpio basado en diálogos (fase 1), después una vista limpia de ejecución estilo log (fase 2). Sin mezclas — sin diálogos apareciendo a mitad de la ejecución, sin ruido de progreso durante la selección.",
|
||||
"phase1Heading": "Fase 1 — patrón típico",
|
||||
"phase1Code": "# Silent preparatory work between dialogs\nmsg_info \"$(translate \"Checking disk assignments...\")\"\nASSIGNED_TO=$(check_assignments \"$DISK\")\nstop_spinner # ← clears line silently, result saved in variable\n\n# Next dialog can now use ASSIGNED_TO\nif [ -n \"$ASSIGNED_TO\" ]; then\n dialog --yesno \"$(translate \"Disk already assigned. Continue?\")\" $UI_YESNO_H $UI_YESNO_W\nfi\n\n# Collect multiple decisions per item with parallel arrays\ndeclare -a DISK_LIST=()\ndeclare -a DISK_FORMAT_TYPES=()\ndeclare -a DISK_MOUNT_POINTS=()\nfor DISK in $SELECTED; do\n msg_info \"$(translate \"Analyzing disk...\")\"\n CURRENT_FS=$(lsblk -no FSTYPE \"$DISK\" | xargs)\n stop_spinner\n\n FORMAT=$(dialog --backtitle \"$BACKTITLE\" \\\n --title \"$(translate \"Select Filesystem\")\" \\\n --menu \"...\" $UI_SHORT_MENU_H $UI_SHORT_MENU_W $UI_SHORT_MENU_LIST_H \\\n \"ext4\" \"...\" \"xfs\" \"...\" \"btrfs\" \"...\" \\\n 2>&1 >/dev/tty)\n [ -z \"$FORMAT\" ] && continue\n\n DISK_LIST+=(\"$DISK\")\n DISK_FORMAT_TYPES+=(\"$FORMAT\")\ndone",
|
||||
"phase1RulesIntro": "<strong>Reglas para la fase 1:</strong>",
|
||||
"phase1Rules": [
|
||||
"Si un spinner de <code>msg_info</code> está actualmente corriendo y necesitas abrir un menú <code>dialog</code> o <code>whiptail</code>, llama primero a <code>stop_spinner</code> — el spinner no puede coexistir con el overlay que dibuja cualquiera de las dos herramientas. Si no hay ningún spinner activo, no hace falta llamarlo.",
|
||||
"Usa <code>show_proxmenux_logo</code> + <code>msg_title</code> + <code>msg_info</code> cuando necesites dar al usuario contexto visual para una operación de larga duración en la fase 1 (p. ej. un sondeo que tarda 5+ segundos). La función incluye un clear de pantalla, así que no llames a <code>clear</code> antes.",
|
||||
"No llames a <code>show_proxmenux_logo</code> entre menús de diálogo cuando no hay nada que mostrar — limpiar la pantalla para un terminal vacío es solo ruido visual.",
|
||||
"Almacena todas las decisiones y resultados de sondeos en variables o arrays paralelos. El recap visible sucede al inicio de la fase 2, no en la fase 1."
|
||||
],
|
||||
"phase2Heading": "Fase 2 — patrón típico",
|
||||
"phase2Code": "# ── PHASE 2 — EXECUTION ─────────────────────────────\nshow_proxmenux_logo\nmsg_title \"$(translate \"My Script Title\")\"\n\n# Recap Phase 1 preparatory results — show what was already done\nmsg_ok \"$(translate \"CT $CTID selected.\")\"\nmsg_ok \"$(translate \"Repositories verified.\")\"\nmsg_ok \"$(translate \"Disks to process: ${#DISK_LIST[@]}\")\"\n\n# Now execute operations\nfor i in \"${!DISK_LIST[@]}\"; do\n DISK=\"${DISK_LIST[$i]}\"\n FORMAT=\"${DISK_FORMAT_TYPES[$i]}\"\n\n msg_info \"$(translate \"Formatting\") $DISK $(translate \"as\") $FORMAT...\"\n mkfs.\"$FORMAT\" \"$DISK\" >/dev/null 2>&1\n msg_ok \"$(translate \"Formatted.\")\"\ndone\n\nmsg_ok \"$(translate \"Completed. ${#DISK_LIST[@]} disk(s) processed.\")\"\nmsg_success \"$(translate \"Press Enter to return to menu...\")\"\nread -r",
|
||||
"phase2Rules": "<strong>Reglas para la fase 2:</strong> siempre empieza con <code>show_proxmenux_logo + msg_title</code>; inmediatamente recapitula los resultados de la fase 1 como líneas de <code>msg_ok</code>; nunca llames a <code>show_proxmenux_logo</code> de nuevo (borraría el progreso acumulado); nunca llames a <code>dialog</code> en la fase 2 — si una decisión en tiempo de ejecución es realmente inevitable, usa <code>whiptail</code> (mira la siguiente sección)."
|
||||
},
|
||||
"dialogVsWhiptail": {
|
||||
"headingRich": "Cuándo usar <code>dialog</code> vs <code>whiptail</code>",
|
||||
"intro": "Ambas herramientas dibujan interfaces de usuario en modo texto, pero se comportan muy distinto en pantalla — y ProxMenux las usa en dos fases distintas por una razón.",
|
||||
"headerTool": "Herramienta",
|
||||
"headerWhen": "Cuándo usarla",
|
||||
"headerEffect": "Efecto en pantalla",
|
||||
"rows": [
|
||||
{
|
||||
"toolRich": "<strong><code>dialog</code></strong>",
|
||||
"whenRich": "<strong>Siempre en la fase 1.</strong> Cada selección interactiva — elegir una VM, un disco, un sistema de archivos, confirmar una acción — usa <code>dialog</code>. Esta es la herramienta UI por defecto de ProxMenux.",
|
||||
"effectRich": "Se apodera del terminal: limpia la pantalla, dibuja su overlay y al cerrarse devuelve el terminal a su estado anterior. Está bien en la fase 1 porque no se está mostrando nada útil aún."
|
||||
},
|
||||
{
|
||||
"toolRich": "<strong><code>whiptail</code></strong>",
|
||||
"whenRich": "<strong>Solo en la fase 2, solo cuando es inevitable.</strong> El caso típico es un preguntar antes de reiniciar al final de la ejecución. No recurras a <code>whiptail</code> para preguntar \"¿continuar?\" a mitad de la ejecución — esa decisión debería haberse tomado en la fase 1.",
|
||||
"effectRich": "Overlay más ligero que <em>no</em> limpia el contexto del terminal. El historial acumulado de <code>msg_ok</code> / <code>msg_info</code> de la fase 2 se queda visible detrás del cuadro de diálogo. Por eso es la elección correcta cuando el progreso ya está en pantalla."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "Por qué importa la división",
|
||||
"calloutBody": "Si llamas a <code>dialog</code> en mitad de la fase 2, cada línea de <code>msg_ok</code> que el usuario ha estado viendo desaparece. Borras el rastro de auditoría. <code>whiptail</code> evita eso. Así que la regla no es arbitraria — se trata de preservar la vista del usuario de lo que el script ha hecho hasta ahora.",
|
||||
"rebootHeading": "Preguntar antes de reiniciar — el whiptail canónico de la fase 2",
|
||||
"rebootIntro": "Cuando un script termina y puede requerirse un reinicio (p. ej. IOMMU habilitado, parámetros del kernel cambiados), el prompt al final de la fase 2 usa <code>whiptail</code>. Incluye siempre una rama \"No\" que avise al usuario de no usar el recurso afectado hasta que reinicie:",
|
||||
"rebootCode": "if [[ \"$HOST_REBOOT_REQUIRED\" == \"yes\" ]]; then\n echo \"\"\n if whiptail --title \"$(translate \"Reboot Required\")\" --yesno \\\n \"\\n$(translate \"A host reboot is required before starting the VM. Reboot now?\")\" \\\n 13 78; then\n msg_warn \"$(translate \"Rebooting the system...\")\"\n reboot\n else\n echo \"\"\n msg_info2 \"$(translate \"Do not start the VM until the system has been rebooted.\")\"\n fi\nfi\n\nmsg_success \"$(translate \"Press Enter to return to menu...\")\"\nread -r"
|
||||
},
|
||||
"messageFunctions": {
|
||||
"heading": "Referencia de funciones de mensajes",
|
||||
"intro": "Todas definidas en <code>utils.sh</code>. Úsalas como el valor por defecto para cualquier salida visible para el usuario — visuales coherentes entre scripts es la idea. Si tu script necesita una función nueva que no encaja en el conjunto existente (un nuevo nivel de severidad, un nuevo helper de layout, etc.), propónla en tu Pull Request — se revisará y se añadirá a <code>utils.sh</code> si es útil de forma amplia.",
|
||||
"headerFunction": "Función",
|
||||
"headerWhen": "Cuándo usar",
|
||||
"headerSpinner": "Spinner",
|
||||
"rows": [
|
||||
{
|
||||
"function": "msg_info \"text\"",
|
||||
"whenRich": "Operación en curso.",
|
||||
"spinner": "Arranca"
|
||||
},
|
||||
{
|
||||
"function": "stop_spinner",
|
||||
"whenRich": "Fin del trabajo preparatorio silencioso en la fase 1 — mata el spinner, limpia la línea.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_ok \"text\"",
|
||||
"whenRich": "Operación con éxito. Úsalo también para \"función habilitada\" incluso cuando se requiere un reinicio.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_warn \"text\"",
|
||||
"whenRich": "Advertencia real o estado degradado.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_error \"text\"",
|
||||
"whenRich": "Error fatal.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_info2 \"text\"",
|
||||
"whenRich": "Aviso no bloqueante (línea de info cian).",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_success \"text\"",
|
||||
"whenRich": "Prompt final \"Press Enter to return\" al final de la fase 2.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_title \"text\"",
|
||||
"whenRich": "Título en negrita con espaciado integrado. Usado al inicio de la fase 2.",
|
||||
"spinner": "—"
|
||||
},
|
||||
{
|
||||
"function": "show_proxmenux_logo",
|
||||
"whenRich": "Limpia la pantalla, muestra el logo. Llamado <em>una vez</em> al inicio de la fase 2 solamente.",
|
||||
"spinner": "—"
|
||||
}
|
||||
]
|
||||
},
|
||||
"dialogConventions": {
|
||||
"heading": "Convenciones de dialog",
|
||||
"bullets": [
|
||||
"Pasa siempre <code>--backtitle \"$BACKTITLE\"</code> a cada llamada de <code>dialog</code> y <code>whiptail</code>. <code>$BACKTITLE</code> siempre es <code>\"ProxMenux\"</code> — establecido una vez en la cabecera del script y nunca sobrescrito. El usuario debe ver siempre el nombre del proyecto como contexto de encuadre, nunca el propio título del script.",
|
||||
"Envuelve siempre los títulos y mensajes con <code>$(translate \"...\")</code>.",
|
||||
"Redirige siempre la salida de <code>dialog</code> con <code>2>&1 >/dev/tty</code> — el stdout capturado se convierte en la selección del usuario, mientras el diálogo en sí se dibuja en el terminal.",
|
||||
"Usa las variables estándar de dimensiones de UI (<code>$UI_MENU_H</code>, <code>$UI_MSG_W</code>, etc.) para tamaños coherentes entre scripts.",
|
||||
"Comprueba siempre selecciones vacías / canceladas y manéjalas con gracia."
|
||||
],
|
||||
"exampleIntro": "Ejemplo completo — construyendo un menú de selección de VM y manejando la cancelación:",
|
||||
"exampleCode": "# 1) Build the list of VMs as alternating \"ID NAME\" pairs.\n# dialog --menu expects this exact shape: tag1 description1 tag2 description2 ...\nVM_LIST=\"\"\nfor vmid in $(qm list | awk 'NR>1 {print $1}'); do\n vm_name=$(qm config \"$vmid\" | awk -F': ' '/^name:/ {print $2}')\n VM_LIST=\"$VM_LIST $vmid \\\"$vm_name\\\"\"\ndone\n\n# 2) Show the dialog. Captured stdout is the user's selection (the VMID).\nVMID=$(eval \"dialog --backtitle \\\"\\$BACKTITLE\\\" \\\n --title \\\"\\$(translate \\\"Select VM\\\")\\\" \\\n --menu \\\"\\$(translate \\\"Choose a VM from the list:\\\")\\\" \\\n \\$UI_MENU_H \\$UI_MENU_W \\$UI_MENU_LIST_H \\\n $VM_LIST \\\n 2>&1 >/dev/tty\")\n\n# 3) Empty result means the user pressed Cancel or Esc — exit silently.\nif [ -z \"$VMID\" ]; then\n exit 0\nfi\n\n# 4) Continue with the rest of Phase 1, knowing VMID is now set.\necho \"User selected VMID=$VMID\""
|
||||
},
|
||||
"translation": {
|
||||
"heading": "Política de traducción",
|
||||
"intro": "Todas las cadenas visibles para el usuario deben envolverse con la función <code>translate</code>. ProxMenux las traduce automáticamente a todos los idiomas soportados — tú escribes en inglés, el usuario lee en su idioma nativo.",
|
||||
"code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...",
|
||||
"bullets": [
|
||||
"Escribe las cadenas en inglés — la traducción la gestiona automáticamente la build.",
|
||||
"Mantén las cadenas concisas. Evita incrustar variables dentro de frases largas siempre que sea posible.",
|
||||
"<strong>No</strong> traduzcas nombres de variables, rutas ni identificadores técnicos."
|
||||
]
|
||||
},
|
||||
"variableStyle": {
|
||||
"heading": "Convenciones de variables y estilo",
|
||||
"bullets": [
|
||||
"Usa <code>UPPER_CASE</code> para variables a nivel de script.",
|
||||
"Usa <code>lower_case</code> para variables locales de función (declaradas con <code>local</code>).",
|
||||
"Entrecomilla todas las expansiones de variable: <code>\"$VAR\"</code> — no <code>$VAR</code>.",
|
||||
"Usa <code>[[ ]]</code> para condicionales, no <code>[ ]</code> (excepto cuando se requiere POSIX).",
|
||||
"<code>show_proxmenux_logo</code> es la forma apropiada de limpiar la pantalla — incluye el clear y muestra el logo del proyecto para que el usuario siempre tenga contexto visual. Llámalo una vez al inicio de la fase 2 (y opcionalmente antes de un bloque largo de spinner en la fase 1)."
|
||||
],
|
||||
"standardNamesIntro": "Nombres de variables estándar en todo el proyecto:",
|
||||
"standardNamesCode": "CTID # container ID\nVMID # virtual machine ID\nDISK # device path (e.g. /dev/sdb)\nPARTITION # partition path (e.g. /dev/sdb1)\nSTORAGE # Proxmox storage name\nMOUNT_POINT # filesystem mount path",
|
||||
"redirectHeading": "Redirigir la salida de herramientas durante la fase 2",
|
||||
"redirectIntro": "La fase 2 muestra un log limpio de líneas <code>msg_info → msg_ok</code> acumulándose en pantalla. Si una herramienta que llamas (apt, mkfs, qm, pct, dd, etc.) escribe su propia salida a stdout/stderr, se desplaza por delante de tus mensajes y rompe el flujo visual — acabas con un terminal caótico donde el usuario no puede distinguir las líneas de progreso del propio script del ruido de la herramienta subyacente.",
|
||||
"withoutRedirectIntro": "<strong>Sin redirección</strong> — lo que ve el usuario si no manejas el ruido:",
|
||||
"withoutRedirectCode": "ℹ Installing kernel package...\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\nThe following NEW packages will be installed:\n proxmox-kernel-6.5\n0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.\nNeed to get 12.5 MB of archives.\nAfter this operation, 47.2 MB of additional disk space will be used.\nGet:1 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 ...\n... [200+ more lines of dpkg output] ...\n✓ Kernel installed.",
|
||||
"withRedirectIntro": "<strong>Con redirección</strong> — cómo se ve la misma operación cuando el ruido se envía a otro sitio:",
|
||||
"withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.",
|
||||
"twoPatternsIntro": "Dos patrones entre los que elegir:",
|
||||
"discardLead": "<strong>Descarta la salida</strong> cuando no la necesites — el más rápido y simple:",
|
||||
"discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1",
|
||||
"logLead": "<strong>Envía la salida a un archivo de log</strong> cuando puedas querer inspeccionarla más tarde (depurar una instalación fallida, comprobar qué hizo realmente dpkg). Este es el patrón preferido para cualquier operación de apt:",
|
||||
"logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1",
|
||||
"referenceOutro": "El script <code>scripts/global/update-pve9_2.sh</code> es una implementación de referencia — cada llamada de <code>apt-get</code> envía la salida a un archivo de log para que el usuario solo vea el flujo limpio <code>msg_info → msg_ok</code>, mientras el log en disco te permite reconstruir exactamente qué hizo apt si algo va mal."
|
||||
},
|
||||
"dosAndDonts": {
|
||||
"heading": "Qué hacer y qué no",
|
||||
"doHeading": "✅ Hacer",
|
||||
"doBullets": [
|
||||
"<code>stop_spinner</code> antes de un <code>dialog</code> en la fase 1 solo cuando un spinner de <code>msg_info</code> esté actualmente corriendo.",
|
||||
"La fase 2 empieza con <code>show_proxmenux_logo + msg_title + msg_ok</code> recap de los resultados de la fase 1.",
|
||||
"Usa <code>msg_ok</code> para funciones habilitadas con éxito — incluso si se requiere un reinicio.",
|
||||
"Usa <code>whiptail</code> (no <code>dialog</code>) para cualquier prompt post-ejecución que deba aparecer en la fase 2.",
|
||||
"Incluye siempre una rama \"No\" en los diálogos de reinicio que avise al usuario de no arrancar el recurso afectado hasta que reinicie.",
|
||||
"Protege la lógica solo-VM comprobando <code>[[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]]</code> — los controladores y NVMe PCIe no se pueden añadir a contenedores LXC.",
|
||||
"Usa <code>ensure_repositories</code> de <code>utils-install-functions.sh</code> en lugar de <code>apt-get update</code> incondicional.",
|
||||
"Usa arrays paralelos en la fase 1 cuando cada item necesita múltiples diálogos."
|
||||
],
|
||||
"dontHeading": "❌ No hacer",
|
||||
"dontBullets": [
|
||||
"Llamar a <code>dialog</code> mientras un spinner está activo.",
|
||||
"Saltarte el recap de la fase 1 al inicio de la fase 2.",
|
||||
"Llamar a <code>show_proxmenux_logo</code> una segunda vez — borra todo lo que la fase 2 ha imprimido.",
|
||||
"Usar <code>dialog</code> en la fase 2 (usa <code>whiptail</code> para el raro caso inevitable).",
|
||||
"Usar <code>clear</code> a secas.",
|
||||
"Envolver <code>msg_title</code> en bloques de <code>echo \"\"</code> en blanco — ya incluye espaciado.",
|
||||
"Usar <code>msg_warn</code> para reportar una función habilitada con éxito — eso es un <code>msg_ok</code>.",
|
||||
"Ejecutar <code>apt-get update</code> incondicional — usa <code>ensure_repositories</code>."
|
||||
]
|
||||
},
|
||||
"submitting": {
|
||||
"heading": "Enviar tu contribución",
|
||||
"steps": [
|
||||
"Haz fork de <code>MacRimi/ProxMenux</code> en GitHub y clona tu fork.",
|
||||
"Crea una rama <code>feature/*</code> desde <code>develop</code> (mira <em>Modelo de ramas</em> arriba).",
|
||||
"Sigue esta guía para cualquier script nuevo o modificado. Escribe la cabecera con tu nombre; añade la línea opcional de patrocinio si quieres.",
|
||||
"Prueba tu script en una instancia real de Proxmox VE — tanto la fase 1 (cada rama de diálogo) como la fase 2 (cada operación tiene éxito y revierte limpiamente en caso de error).",
|
||||
"Abre un Pull Request <strong>contra <code>develop</code></strong> con una descripción clara: qué hace el script, qué cambió, en qué versión de Proxmox VE se probó.",
|
||||
"Asegúrate de que tu contribución respeta el <cocLink>código de conducta</cocLink>."
|
||||
],
|
||||
"securityOutro": "Para incidencias sensibles de seguridad, sigue el flujo de divulgación en <securityLink>SECURITY.md</securityLink> en lugar de abrir una incidencia pública."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"kind": "external",
|
||||
"url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md",
|
||||
"label": "CONTRIBUTING.md (guía completa)",
|
||||
"tail": " — la fuente de verdad para cada convención, incluyendo los patrones avanzados de hardware."
|
||||
},
|
||||
{
|
||||
"kind": "internal",
|
||||
"href": "/docs/about/contributors",
|
||||
"label": "Colaboradores",
|
||||
"tail": " — las personas cuyo trabajo ha dado forma a los releases de ProxMenux. (Página distinta a esta.)"
|
||||
},
|
||||
{
|
||||
"kind": "internal",
|
||||
"href": "/docs/about/code-of-conduct",
|
||||
"label": "Código de conducta",
|
||||
"tail": " — los estándares que todo colaborador se compromete a seguir."
|
||||
},
|
||||
{
|
||||
"kind": "external",
|
||||
"url": "https://github.com/MacRimi/ProxMenux/discussions",
|
||||
"label": "GitHub Discussions",
|
||||
"tail": " — pregunta antes de construir si no estás seguro de si una idea encaja, o para encontrar colaboradores en una función más grande."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Colaboradores | ProxMenux Documentation",
|
||||
"description": "Reconocimiento a las personas que hacen posible ProxMenux — testers, revisores y desarrolladores que dan forma a cada release.",
|
||||
"ogTitle": "Colaboradores | ProxMenux Documentation",
|
||||
"ogDescription": "Conoce a los colaboradores detrás de ProxMenux."
|
||||
},
|
||||
"header": {
|
||||
"title": "Colaboradores",
|
||||
"description": "El proyecto ProxMenux crece y prospera gracias a la contribución de sus colaboradores. Este es el merecido reconocimiento a su trabajo — probando builds antes del release, cazando regresiones, revisando PRs y dando forma a la dirección de las nuevas funciones.",
|
||||
"section": "Acerca de"
|
||||
},
|
||||
"beyond": {
|
||||
"title": "Más allá de esta lista",
|
||||
"body": "Mucha más gente contribuye vía reportes de bugs, ideas de funciones en Discussions, pruebas beta y traducciones. La lista completa de colaboradores de código vive en el <extlink>grafo de colaboradores de GitHub</extlink>. La página de abajo destaca a las personas que han estado más activamente involucradas en probar y revisar releases de ProxMenux."
|
||||
},
|
||||
"testers": {
|
||||
"heading": "Testers y revisores",
|
||||
"intro": "Estas personas fueron de las primeras en contribuir al proyecto, probando, reportando incidencias y proponiendo mejoras que ayudaron a que ProxMenux haya crecido hasta convertirse en lo que es hoy.",
|
||||
"roles": {
|
||||
"testing": "Pruebas",
|
||||
"testingReviewer": "Pruebas y revisor"
|
||||
},
|
||||
"youtube": "YouTube"
|
||||
},
|
||||
"contribute": {
|
||||
"heading": "¿Quieres colaborar?",
|
||||
"intro": "Cualquier contribución es bienvenida — código, pruebas, diseño, documentación o simplemente compartir tus ideas:",
|
||||
"tester": "<strong>Tester</strong> — prueba el <beta>canal beta</beta> y reporta qué funciona y qué no antes de los releases estables.",
|
||||
"developer": "<strong>Desarrollador</strong> — Bash + Next.js (TypeScript) + un poco de Python para el venv de traducción. Los PRs son bienvenidos en <gh>GitHub</gh>.",
|
||||
"designer": "<strong>Diseñador</strong> — mejoras de UI, iconos, capturas para la documentación.",
|
||||
"ideas": "<strong>Ideas</strong> — abre un hilo en <disc>GitHub Discussions</disc> antes de abrir una incidencia de petición de función."
|
||||
},
|
||||
"coc": {
|
||||
"title": "Lee primero el código de conducta",
|
||||
"body": "Antes de enviar código o reportar incidencias, dale una lectura rápida al <coclink>Código de conducta y buenas prácticas</coclink>. Cubre las expectativas sobre responsabilidad del código, divulgación de problemas de seguridad y alcance de los PRs."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "FAQ | ProxMenux Documentation",
|
||||
"description": "Preguntas frecuentes sobre ProxMenux: qué es, instalación, compatibilidad (solo PVE 8+), personalización, actualizaciones, seguridad, uso en producción, seguridad de archivos del sistema, contribuir, desinstalación.",
|
||||
"ogTitle": "FAQ | ProxMenux Documentation",
|
||||
"ogDescription": "Preguntas frecuentes sobre instalación, compatibilidad, seguridad y contribución a ProxMenux."
|
||||
},
|
||||
"header": {
|
||||
"title": "Preguntas frecuentes",
|
||||
"description": "Preguntas comunes sobre ProxMenux: qué es, para quién, cómo instalar / actualizar / desinstalar, compatibilidad, personalización, seguridad y contribuir. Si tu pregunta no está aquí, mira las GitHub Discussions o abre una incidencia.",
|
||||
"section": "Acerca de"
|
||||
},
|
||||
"quickLinks": {
|
||||
"title": "Enlaces rápidos",
|
||||
"installationLabel": "Instalación",
|
||||
"installationSuffix": " — el comando de instalación de una línea + dependencias.",
|
||||
"introductionLabel": "Introducción",
|
||||
"introductionSuffix": " — qué hace ProxMenux, en 5 minutos.",
|
||||
"uninstallLabel": "Desinstalación",
|
||||
"uninstallSuffix": " — eliminación limpia.",
|
||||
"issuesLabel": "GitHub Issues",
|
||||
"discussionsLabel": "Discussions"
|
||||
},
|
||||
"q1": {
|
||||
"question": "¿Qué es ProxMenux y para qué sirve?",
|
||||
"p1Rich": "<strong>ProxMenux</strong> es una herramienta interactiva basada en menús diseñada para hacer <strong>Proxmox VE</strong> accesible a todos los usuarios, independientemente de su experiencia técnica. Simplifica la ejecución de comandos, permitiendo a los usuarios realizar acciones en su sistema sin necesidad de conocimientos avanzados de Linux.",
|
||||
"p2": "Para usuarios menos experimentados, ProxMenux ofrece una forma intuitiva de ejecutar comandos mediante una interfaz de menús estructurada, reduciendo la necesidad de entrada manual por terminal. Para administradores con experiencia, recorta pulsaciones para flujos repetitivos (hardening post-instalación, passthrough de GPU, importación de VMs OVF, rotaciones de snapshots ZFS).",
|
||||
"p3": "Proxmox VE se usa ampliamente para:",
|
||||
"items": [
|
||||
"Virtualización de nivel empresarial",
|
||||
"HomeLab y soluciones de nube personal",
|
||||
"Servidores multimedia, automatización y más"
|
||||
]
|
||||
},
|
||||
"q2": {
|
||||
"question": "¿Cómo instalo ProxMenux?",
|
||||
"p1Rich": "Sigue la <installlink>guía de instalación</installlink>. En corto:",
|
||||
"stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"",
|
||||
"p2": "Una vez instalado, simplemente arráncalo con:",
|
||||
"menuCmd": "menu"
|
||||
},
|
||||
"q3": {
|
||||
"question": "¿ProxMenux es compatible con todas las versiones de Proxmox?",
|
||||
"bodyRich": "<strong>No — ProxMenux requiere Proxmox VE 8 o posterior.</strong> PVE 7 y anteriores no están soportados. Si aún estás en PVE 7, sigue primero el procedimiento oficial de upgrade de Proxmox a 8.x; ProxMenux puede entonces encargarse del salto 8 → 9 por ti vía <upgradelink>Utilidades → Actualizar PVE 8 a PVE 9</upgradelink>."
|
||||
},
|
||||
"q4": {
|
||||
"question": "¿Puedo personalizar ProxMenux?",
|
||||
"p1Rich": "Los scripts del núcleo no se pueden modificar directamente porque están alojados en GitHub y se refrescan con el flujo de auto-actualización. Lo que <em>sí</em> puedes personalizar:",
|
||||
"items": [
|
||||
"El banner de la consola vía la herramienta <strong>FastFetch</strong> en las opciones de post-instalación.",
|
||||
"Qué componentes opcionales se instalan (Monitor, Fail2Ban, Lynis…) — elige durante la instalación o vía el menú correspondiente más tarde."
|
||||
]
|
||||
},
|
||||
"q5": {
|
||||
"question": "¿Cómo actualizo ProxMenux?",
|
||||
"p1Rich": "Cuando hay una nueva versión disponible, ProxMenux la detecta en el siguiente lanzamiento de <code>menu</code> y te pide actualizar. Aceptar reemplaza los archivos de utilidad y las configuraciones en sitio. No hace falta descarga manual.",
|
||||
"p2Rich": "Los usuarios estables reciben releases estables; los usuarios beta reciben releases beta. Cuando se publica una versión estable, ProxMenux notifica a los usuarios beta en el siguiente lanzamiento y ofrece cambiar automáticamente — mira la página del <betalink>programa beta</betalink>."
|
||||
},
|
||||
"q6": {
|
||||
"question": "¿Dónde puedo reportar incidencias?",
|
||||
"p1Rich": "Los reportes de bugs van en <issueslink>GitHub Issues</issueslink>. Incluye pasos de reproducción, mensajes de error y (para incidencias relacionadas con el Monitor) la salida de <code>journalctl -u proxmenux-monitor -n 50</code>.",
|
||||
"p2Rich": "Para problemas de <strong>seguridad</strong>, por favor <strong>no los publiques</strong>. Lee el <coclink>código de conducta y buenas prácticas</coclink> para el procedimiento de divulgación responsable."
|
||||
},
|
||||
"q7": {
|
||||
"question": "¿Puedo contribuir a ProxMenux?",
|
||||
"p1Rich": "<strong>Absolutamente.</strong> ProxMenux es de código abierto y colaborativo. Las contribuciones pueden ser código (bash, Next.js / TypeScript, el venv de Python de traducción), pruebas, documentación, diseño o simplemente ideas.",
|
||||
"item1Rich": "Discute ideas en <discusslink>GitHub Discussions</discusslink> antes de abrir una petición de función.",
|
||||
"item2Rich": "Para PRs, lee primero el <coclink>código de conducta y buenas prácticas</coclink>.",
|
||||
"item3Rich": "Mira la <contriblink>página de colaboradores</contriblink> para los testers y revisores actuales."
|
||||
},
|
||||
"q8": {
|
||||
"question": "¿ProxMenux modifica archivos críticos del sistema?",
|
||||
"p1Rich": "<strong>No.</strong> ProxMenux instala:",
|
||||
"item1Rich": "Dependencias vía apt: <code>dialog</code>, <code>curl</code>, <code>jq</code>, <code>git</code> (y <code>python3</code> + <code>googletrans</code> en la instalación con traducción).",
|
||||
"item2Rich": "El árbol de scripts en <code>/usr/local/share/proxmenux/</code>.",
|
||||
"item3Rich": "El lanzador en <code>/usr/local/bin/menu</code>.",
|
||||
"item4Rich": "Opcional: el servicio systemd del Monitor en <code>proxmenux-monitor.service</code>.",
|
||||
"p2Rich": "ProxMenux <em>no</em> toca la configuración del núcleo de Proxmox a menos que se lo pidas explícitamente vía un menú dedicado (p. ej. el flujo de reparación de red edita <code>/etc/network/interfaces</code> — pero solo después de que confirmes y se haga un backup)."
|
||||
},
|
||||
"q9": {
|
||||
"question": "¿Es seguro usar ProxMenux en producción?",
|
||||
"bodyRich": "<strong>Sí.</strong> Como ProxMenux no modifica archivos del núcleo de Proxmox a menos que se le pida explícitamente, se puede usar en entornos de producción. Como con cualquier automatización, prueba en un entorno controlado primero y ten backups antes de ejecutar flujos destructivos (upgrade PVE 8 → 9, formateo de disco, destrucción de VM…)."
|
||||
},
|
||||
"q10": {
|
||||
"question": "¿Cómo desinstalo ProxMenux?",
|
||||
"p1Rich": "Desde dentro de ProxMenux: <strong>Settings → Desinstalar ProxMenux</strong>. El desinstalador elimina el árbol de scripts, el lanzador y el servicio del Monitor, opcionalmente elimina las dependencias seleccionadas y restaura los backups de <code>/root/.bashrc</code> y <code>/etc/motd</code> tomados en el momento de la instalación.",
|
||||
"p2Rich": "Paso a paso completo: <uninstalllink>Desinstalar ProxMenux</uninstalllink>."
|
||||
},
|
||||
"q11": {
|
||||
"question": "VirusTotal marca la URL de instalación — ¿es seguro?",
|
||||
"p1Rich": "Una detección 1/95 por motores heurísticos (p. ej. <em>Chong Lua Dao</em>) es un falso positivo conocido. El instalador usa el patrón estándar <code>curl | bash</code> y descarga binarios legítimos (como <code>jq</code> desde su release oficial en GitHub), que los escáneres agresivos marcan basándose en el <em>comportamiento</em> y no en código realmente malicioso.",
|
||||
"p2Rich": "ProxMenux es 100% código abierto y el script de instalación es revisable línea por línea: <scriptlink>install_proxmenux.sh</scriptlink>. Más contexto en la <issuelink>Issue #162</issuelink>."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Acerca de | ProxMenux Documentation",
|
||||
"description": "Acerca de ProxMenux: objetivos del proyecto, colaboradores, FAQ y código de conducta. Herramienta de gestión basada en menús, de código abierto, para Proxmox VE 8+, construida y mantenida por MacRimi con un pequeño equipo de testers y colaboradores.",
|
||||
"ogTitle": "Acerca de | ProxMenux Documentation",
|
||||
"ogDescription": "Acerca de ProxMenux — herramienta de gestión basada en menús, de código abierto, para Proxmox VE 8+."
|
||||
},
|
||||
"header": {
|
||||
"title": "Acerca de",
|
||||
"description": "Info del proyecto, FAQ, colaboradores y código de conducta. ProxMenux es una herramienta de gestión basada en menús, de código abierto, para Proxmox VE 8+, construida y mantenida por MacRimi con la ayuda de un pequeño equipo de testers y colaboradores.",
|
||||
"section": "Acerca de"
|
||||
},
|
||||
"callout": {
|
||||
"title": "Código abierto, impulsado por la comunidad",
|
||||
"body": "ProxMenux está bajo licencia GPL-3.0 y se desarrolla abiertamente en GitHub. Cada script es revisable, cada cambio trazable. Las contribuciones — reportes de bugs, ideas, código, pruebas — son bienvenidas."
|
||||
},
|
||||
"section": {
|
||||
"heading": "En esta sección",
|
||||
"options": [
|
||||
{
|
||||
"icon": "HelpCircle",
|
||||
"href": "/docs/about/faq",
|
||||
"title": "FAQ",
|
||||
"description": "Preguntas frecuentes: qué es ProxMenux, instalación, compatibilidad, personalización, actualizaciones, seguridad, uso en producción, desinstalación."
|
||||
},
|
||||
{
|
||||
"icon": "Users",
|
||||
"href": "/docs/about/contributors",
|
||||
"title": "Colaboradores",
|
||||
"description": "Reconocimiento a las personas que hacen posible ProxMenux — testers, revisores y desarrolladores que dan forma a cada release."
|
||||
},
|
||||
{
|
||||
"icon": "ScrollText",
|
||||
"href": "/docs/about/code-of-conduct",
|
||||
"title": "Código de conducta",
|
||||
"description": "Valores del proyecto, expectativas de responsabilidad del código y directrices de contribución. Lectura obligatoria antes de abrir un PR o reporte."
|
||||
}
|
||||
]
|
||||
},
|
||||
"involved": {
|
||||
"heading": "Implicarse",
|
||||
"intro": "Tres lugares para participar en el proyecto:",
|
||||
"cards": [
|
||||
{
|
||||
"href": "https://github.com/MacRimi/ProxMenux/issues/new",
|
||||
"title": "🐛 Reportar un bug",
|
||||
"description": "GitHub Issues — incluye logs y pasos de reproducción."
|
||||
},
|
||||
{
|
||||
"href": "https://github.com/MacRimi/ProxMenux/discussions",
|
||||
"title": "💡 Sugerir una función",
|
||||
"description": "GitHub Discussions — comparte ideas antes de abrir un PR."
|
||||
},
|
||||
{
|
||||
"href": "https://github.com/MacRimi/ProxMenux/pulls",
|
||||
"title": "🔀 Enviar un PR",
|
||||
"description": "GitHub Pull Requests — lee primero el código de conducta."
|
||||
}
|
||||
]
|
||||
},
|
||||
"support": {
|
||||
"heading": "Apoyar el proyecto",
|
||||
"introRich": "Si ProxMenux te ahorra tiempo, la forma más fácil de ayudar a que otros lo descubran es <starlink>darle una ⭐ al repo en GitHub</starlink>. Si quieres ir más allá:",
|
||||
"kofiLabel": "Apoyar en Ko-fi",
|
||||
"kofiOutro": " — invita al mantenedor a un café y mantiene el desarrollo en marcha."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Crear VMs en Proxmox VE — asistentes Synology, Windows, Linux y NAS | ProxMenux",
|
||||
"description": "Crea y configura máquinas virtuales en Proxmox VE con ProxMenux. Asistentes específicos para appliances NAS (Synology DSM, TrueNAS, OpenMediaVault, UnRAID, etc.), Windows, distribuciones Linux y un instalador externo de macOS. Valores por defecto sensatos de hardware, almacenamiento y red.",
|
||||
"ogTitle": "Crear VMs en Proxmox VE — asistentes Synology, Windows, Linux y NAS",
|
||||
"ogDescription": "Asistentes de ProxMenux para crear VMs Synology DSM, TrueNAS, OMV, UnRAID, Windows y Linux en Proxmox VE.",
|
||||
"ogImageAlt": "Menú Crear VM de ProxMenux",
|
||||
"twitterTitle": "Crear VMs en Proxmox VE | ProxMenux",
|
||||
"twitterDescription": "Asistentes para VMs Synology, TrueNAS, OMV, UnRAID, Windows y Linux en Proxmox VE."
|
||||
},
|
||||
"header": {
|
||||
"title": "Crear VM",
|
||||
"description": "ProxMenux agrupa la creación de VMs en un dispatcher interactivo. Eliges la familia del sistema operativo y el asistente correspondiente se encarga de la selección del ISO, CPU, RAM, BIOS, red, almacenamiento y — opcionalmente — passthrough de GPU.",
|
||||
"section": "Máquinas virtuales"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué sirve este menú",
|
||||
"body": "El menú Crear VM es un enrutador, no un único asistente. Pregunta qué familia de sistema operativo quieres instalar y carga el selector de ISO y el configurador correspondientes. Los flujos por defecto usan presets sensatos de ProxMenux; los flujos avanzados exponen cada opción configurable antes de crear la VM."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir el menú",
|
||||
"body": "Desde el menú principal de ProxMenux, selecciona <strong>Crear VM</strong>. Verás esto:",
|
||||
"imageAlt": "Dispatcher de Crear VM con 3 opciones de ProxMenux (NAS / Windows / Linux) seguidas de la sección Community Scripts (macOS / Others)"
|
||||
},
|
||||
"families": {
|
||||
"heading": "Tres familias de SO",
|
||||
"intro": "Las tres entradas de ProxMenux en la parte superior del menú comparten el mismo motor subyacente y el mismo flujo post-ISO — solo enrutan a selectores de ISO distintos y aplican valores por defecto ajustados para cada familia. Elige la que coincida con el guest que quieras instalar.",
|
||||
"routes": [
|
||||
{
|
||||
"key": "nas",
|
||||
"title": "System NAS",
|
||||
"icon": "HardDrive",
|
||||
"href": "/docs/create-vm/system-nas",
|
||||
"accent": "border-emerald-300 bg-emerald-50",
|
||||
"iconBg": "bg-emerald-100 text-emerald-700",
|
||||
"description": "Siete sistemas operativos NAS como VMs específicas. La mayoría usan el flujo auto-ISO; Synology DSM ejecuta el asistente especializado de loader.",
|
||||
"bullets": [
|
||||
"Synology DSM (loaders ARC / RR / TinyCore)",
|
||||
"TrueNAS SCALE y CORE (ZFS)",
|
||||
"OpenMediaVault (basado en Debian)",
|
||||
"XigmaNAS (FreeBSD ZFS)",
|
||||
"Rockstor (openSUSE / Btrfs), ZimaOS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "windows",
|
||||
"title": "System Windows",
|
||||
"icon": "MonitorCog",
|
||||
"href": "/docs/create-vm/system-windows",
|
||||
"accent": "border-blue-300 bg-blue-50",
|
||||
"iconBg": "bg-blue-100 text-blue-700",
|
||||
"description": "Ediciones de Windows 10, 11 y Server con valores por defecto pensados para Windows (q35 + OVMF + TPM 2.0) y los drivers VirtIO pre-montados.",
|
||||
"bullets": [
|
||||
"UUP Dump para ISOs actualizadas",
|
||||
"O ISO local desde /var/lib/vz/template/iso",
|
||||
"TPM 2.0 añadido automáticamente",
|
||||
"ISO de drivers VirtIO adjuntada en ide3",
|
||||
"Canal del guest agent habilitado"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "linux",
|
||||
"title": "System Linux",
|
||||
"icon": "Laptop",
|
||||
"href": "/docs/create-vm/system-linux",
|
||||
"accent": "border-amber-300 bg-amber-50",
|
||||
"iconBg": "bg-amber-100 text-amber-700",
|
||||
"description": "Catálogo curado de ISOs oficiales de Linux descargadas automáticamente desde el upstream, más un selector de ISO local para cualquier otra cosa.",
|
||||
"bullets": [
|
||||
"Ubuntu (Desktop / Server, 20.04–25.10)",
|
||||
"Debian (Desktop / Netinst, 11–13)",
|
||||
"Fedora, Arch, Rocky, Mint, openSUSE",
|
||||
"Alpine, Kali, Manjaro",
|
||||
"Ruta de ISO local para imágenes personalizadas"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"community": {
|
||||
"title": "Community scripts (no documentados aquí)",
|
||||
"intro": "Las dos entradas bajo el separador <em>Community Scripts</em> ejecutan código que <strong>no forma parte de ProxMenux</strong>, así que se dejan intencionadamente fuera de esta documentación:",
|
||||
"macosRich": "<strong>System macOS</strong> — ejecuta el instalador externo <osxLink>OSX-PROXMOX</osxLink>. Clona el repositorio upstream, prepara el host y <strong>reinicia automáticamente al terminar</strong>. Consulta la documentación del propio proyecto.",
|
||||
"othersRich": "<strong>System Others (basados en Linux)</strong> — carga una lista curada de instaladores de la comunidad basados en Linux (SO de servidor doméstico, appliances de router/firewall, etc.). Cada community script se mantiene fuera de ProxMenux."
|
||||
},
|
||||
"afterPick": {
|
||||
"heading": "Qué pasa después de elegir un SO",
|
||||
"intro": "Una vez seleccionado el ISO, el dispatcher sigue el mismo camino independientemente de la familia del SO:",
|
||||
"items": [
|
||||
"<strong>Por defecto vs Avanzado.</strong> Un diálogo de confirmación permite aceptar los presets de ProxMenux o abrir el configurador completo (modelo/núcleos de CPU, RAM, BIOS/UEFI, modelo de NIC, machine type).",
|
||||
"<strong>Plan de almacenamiento.</strong> Combinas uno o varios discos virtuales, discos importados y dispositivos PCI passthrough (controladora entera / NVMe) en la misma VM.",
|
||||
"<strong>Passthrough de GPU opcional.</strong> Si se detecta una GPU compatible en el host, ProxMenux ofrece lanzar el asistente de GPU después de crear la VM — puede requerir reiniciar.",
|
||||
"<strong>Creación de la VM.</strong> La VM se construye, se etiqueta y se le adjunta una descripción HTML con estilo para consulta rápida en la UI de Proxmox."
|
||||
],
|
||||
"tipTitle": "Prefiere Avanzado para VMs que vayas a mantener",
|
||||
"tipBody": "Los presets por defecto funcionan bien para pruebas rápidas. Para una VM que vayas a mantener, la ruta Avanzada te permite elegir desde el principio el BIOS correcto (SeaBIOS vs OVMF/UEFI), el machine type (<code>i440fx</code> vs <code>q35</code>) y la controladora de disco (VirtIO SCSI single vs SATA) — son cambios molestos de hacer después."
|
||||
},
|
||||
"scripts": {
|
||||
"heading": "Scripts implicados",
|
||||
"intro": "El dispatcher hace source de varios scripts de componentes compartidos que no están documentados como páginas individuales. Se listan aquí como referencia. Cada subpágina enlaza al script principal relevante para su flujo.",
|
||||
"headerScript": "Script",
|
||||
"headerRole": "Rol",
|
||||
"rows": [
|
||||
{
|
||||
"path": "menus/create_vm_menu.sh",
|
||||
"role": "Dispatcher de entrada."
|
||||
},
|
||||
{
|
||||
"path": "vm/select_nas_iso.sh",
|
||||
"role": "Selector de ISO / appliance para sistemas NAS (Synology, TrueNAS, OMV, Rockstor, ZimaOS)."
|
||||
},
|
||||
{
|
||||
"path": "vm/select_windows_iso.sh",
|
||||
"role": "Selector de ISO de Windows. Delega en el builder de UUP Dump cuando hace falta."
|
||||
},
|
||||
{
|
||||
"path": "vm/select_linux_iso.sh",
|
||||
"role": "Selector de ISO para el flujo Linux (distribuciones mainstream)."
|
||||
},
|
||||
{
|
||||
"path": "vm/synology.sh",
|
||||
"role": "Flujo Synology DSM: obtiene el loader y la imagen DSM y prepara el perfil de la VM."
|
||||
},
|
||||
{
|
||||
"path": "vm/zimaos.sh",
|
||||
"role": "Flujo ZimaOS: descarga la imagen y la conecta a la definición de la VM."
|
||||
},
|
||||
{
|
||||
"path": "vm/vm_configurator.sh",
|
||||
"role": "Asistente Por defecto vs Avanzado: modelo/núcleos de CPU, RAM, BIOS, NIC, machine type."
|
||||
},
|
||||
{
|
||||
"path": "vm/disk_selector.sh",
|
||||
"role": "Plan de almacenamiento: disco virtual, importación de disco o passthrough de controladora/NVMe."
|
||||
},
|
||||
{
|
||||
"path": "vm/vm_creator.sh",
|
||||
"role": "Creación final de la VM: aplica la configuración, adjunta el almacenamiento, escribe la descripción HTML."
|
||||
},
|
||||
{
|
||||
"path": "vm/guest_agent_config.sh",
|
||||
"role": "Hook opcional para configurar el QEMU guest agent, usado por varios flujos."
|
||||
}
|
||||
]
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager",
|
||||
"label": "Disk Manager",
|
||||
"tail": " — adjunta discos físicos existentes o importa imágenes de disco en VMs."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils/UUp-Dump-ISO-Creator",
|
||||
"label": "UUP Dump ISO Creator",
|
||||
"tail": " — genera ISOs de instalación de Windows listas para usar como medio de arranque."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils/import-vm",
|
||||
"label": "Importar VM desde OVA / OVF",
|
||||
"tail": " — trae VMs pre-construidas desde VMware / VirtualBox / exportaciones de ProxMenux."
|
||||
},
|
||||
{
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"tail": " — pasa una GPU a una VM recién creada."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/vm-ct-commands",
|
||||
"label": "Comandos de gestión de VM y CT",
|
||||
"tail": " — referencia de qm para la parte CLI."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,452 @@
|
||||
{
|
||||
"title": "Script de creación de VM Synology",
|
||||
"intro": {
|
||||
"heading": "Introducción",
|
||||
"intro": "ProxMenux ofrece un script automatizado que crea y configura una máquina virtual (VM) para instalar Synology DSM (DiskStation Manager) en Proxmox VE. Este script simplifica el proceso descargando y añadiendo uno de los loaders disponibles al arranque de la VM, dándote la opción de elegir entre cuatro alternativas distintas:",
|
||||
"loaders": [
|
||||
{
|
||||
"name": "AuxXxilium Arc",
|
||||
"url": "https://github.com/AuxXxilium/arc",
|
||||
"extra": ""
|
||||
},
|
||||
{
|
||||
"name": "RedPill RR",
|
||||
"url": "https://github.com/RROrg/rr",
|
||||
"extra": ""
|
||||
},
|
||||
{
|
||||
"name": "TinyCore RedPill M-shell",
|
||||
"url": "https://github.com/PeterSuh-Q3/tinycore-redpill",
|
||||
"extra": ""
|
||||
}
|
||||
],
|
||||
"customLoader": "Custom Loader – opción para usar un loader personalizado si prefieres modificar o crear tu propia configuración",
|
||||
"simplifiesIntro": "El script simplifica el proceso de creación de la VM ofreciendo las siguientes opciones:",
|
||||
"simplifies": [
|
||||
"Selección de configuración por defecto o avanzada",
|
||||
"Configuración de CPU, RAM, BIOS y machine type",
|
||||
"Elección entre disco virtual o passthrough de disco físico"
|
||||
]
|
||||
},
|
||||
"config": {
|
||||
"heading": "Configuración por defecto y avanzada",
|
||||
"intro": "El script ofrece dos modos de configuración:",
|
||||
"defaultHeading": "Configuración por defecto",
|
||||
"defaultIntro": "Si seleccionas la configuración por defecto, el script aplicará automáticamente los siguientes valores:",
|
||||
"headerParam": "Parámetro",
|
||||
"headerValue": "Valor por defecto",
|
||||
"defaultRows": [
|
||||
{
|
||||
"param": "Machine Type",
|
||||
"value": "q35"
|
||||
},
|
||||
{
|
||||
"param": "BIOS Type",
|
||||
"value": "OVMF (UEFI)"
|
||||
},
|
||||
{
|
||||
"param": "CPU Type",
|
||||
"value": "Host"
|
||||
},
|
||||
{
|
||||
"param": "Core Count",
|
||||
"value": "2"
|
||||
},
|
||||
{
|
||||
"param": "RAM Size",
|
||||
"value": "4096 MB"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"value": "vmbr0"
|
||||
},
|
||||
{
|
||||
"param": "MAC Address",
|
||||
"value": "Generada automáticamente"
|
||||
},
|
||||
{
|
||||
"param": "Start VM on Completion",
|
||||
"value": "No"
|
||||
}
|
||||
],
|
||||
"defaultOutro": "Si quieres personalizar la configuración, selecciona la opción Advanced Settings en el menú.",
|
||||
"advancedHeading": "Configuración avanzada",
|
||||
"advancedIntro": "Si seleccionas la configuración avanzada, el script te permitirá personalizar cada parámetro:",
|
||||
"headerOptions": "Opciones",
|
||||
"advancedRows": [
|
||||
{
|
||||
"param": "Machine Type",
|
||||
"options": "q35 o i440fx"
|
||||
},
|
||||
{
|
||||
"param": "BIOS Type",
|
||||
"options": "OVMF (UEFI) o SeaBIOS (Legacy)"
|
||||
},
|
||||
{
|
||||
"param": "CPU Type",
|
||||
"options": "Host o KVM64"
|
||||
},
|
||||
{
|
||||
"param": "Core Count",
|
||||
"options": "Número de núcleos de CPU"
|
||||
},
|
||||
{
|
||||
"param": "RAM Size",
|
||||
"options": "Cantidad de memoria asignada a la VM"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"options": "Bridge de red para la conexión"
|
||||
},
|
||||
{
|
||||
"param": "MAC Address",
|
||||
"options": "MAC personalizada"
|
||||
},
|
||||
{
|
||||
"param": "VLAN",
|
||||
"options": "Tag VLAN (si se usa)"
|
||||
},
|
||||
{
|
||||
"param": "MTU",
|
||||
"options": "Tamaño de la MTU"
|
||||
}
|
||||
]
|
||||
},
|
||||
"diskSelection": {
|
||||
"heading": "Selección de disco",
|
||||
"intro": "Una vez configurada la máquina, el script te permite elegir entre dos tipos de discos:",
|
||||
"virtualHeading": "Disco virtual",
|
||||
"virtualItems": [
|
||||
"El script lista las opciones de almacenamiento disponibles en Proxmox",
|
||||
"El usuario selecciona el disco y el tamaño en GB",
|
||||
"El disco virtual se asigna automáticamente a la VM. Si se configuran más discos, se añadirán como <strong>SATA</strong> (p. ej., sata0, sata1, etc.), hasta un máximo de 6 discos virtuales."
|
||||
],
|
||||
"physicalHeading": "Passthrough de disco físico",
|
||||
"physicalItems": [
|
||||
"El script detecta todos los discos físicos disponibles",
|
||||
"El usuario selecciona el disco o discos físicos que quiere usar.",
|
||||
"El disco físico se asigna directamente a la VM mediante passthrough. Si se configuran más discos, se añadirán como <strong>SATA</strong> (p. ej., sata0, sata1, etc.), hasta un máximo de 6 discos físicos."
|
||||
]
|
||||
},
|
||||
"loaderInstall": {
|
||||
"heading": "Instalación del loader",
|
||||
"intro1": "El script descarga y extrae automáticamente el loader desde el repositorio del desarrollador. Si la descarga falla, el script mostrará un mensaje de error.",
|
||||
"intro2Rich": "<strong>AuxXxilium Arc</strong>, <strong>RedPill RR</strong> y <strong>TinyCore RedPill M-shell</strong>. Descarga y extrae automáticamente.",
|
||||
"customRich": "Para <strong>Custom Loader</strong>, el script busca archivos en <code>/var/lib/vz/template/iso</code>. Si encuentra varios, te pedirá que selecciones el archivo deseado.",
|
||||
"uploadIntro": "Puedes subir loaders personalizados desde las opciones de almacenamiento local:",
|
||||
"imageAlt": "Añadir Custom Loader",
|
||||
"imageCaption": "Añadir Custom Loader"
|
||||
},
|
||||
"vmCreation": {
|
||||
"heading": "Creación de la VM",
|
||||
"intro": "Una vez descargado el loader, el script crea la VM con los siguientes comandos:",
|
||||
"items": [
|
||||
"<code>qm create</code> – Crea la máquina virtual con los parámetros configurados",
|
||||
"<code>qm importdisk</code> – Importa el disco del loader de arranque a la VM. Para mayor compatibilidad el loader se importa como disco IDE",
|
||||
"<code>qm set</code> – Asigna valores de configuración como CPU, RAM y almacenamiento",
|
||||
"<code>qm set -boot</code> – Configura el orden de arranque"
|
||||
]
|
||||
},
|
||||
"stepGuide": {
|
||||
"heading": "Guía paso a paso de configuración del loader de arranque",
|
||||
"intro": "Aunque todos los loaders comparten similitudes, cada uno tiene su propia estructura y métodos de configuración. Esta sección ofrece una guía básica que cubre los 6 pasos para configurar un loader de Synology DSM. Los pasos exactos pueden variar según el loader y los cambios introducidos por el desarrollador. Por eso, entender estos pasos básicos comunes es clave para construir y configurar correctamente el loader que elijas y conseguir que Synology DSM funcione bien.",
|
||||
"selectorHeading": "Selecciona tu tipo de loader:",
|
||||
"loaderButtons": {
|
||||
"arc": "Arc Loader",
|
||||
"rr": "RR Loader",
|
||||
"tinycore": "TinyCore Loader"
|
||||
}
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"id": "step1",
|
||||
"title": "Arranca la VM y entra en el menú principal",
|
||||
"intro": "Una vez creada la VM, arráncala. La primera vez que la enciendas, accederás al menú principal del loader para seleccionar y configurar el modelo de DSM que quieres construir. Una vez creado el loader, este paso se saltará a menos que fuerces manualmente una reconfiguración desde el boot monitor. Todos los loaders también ofrecen la opción de configurarse vía interfaz web.",
|
||||
"loaders": {
|
||||
"arc": [
|
||||
{
|
||||
"htmlBefore": "<strong>Interfaz web</strong>, Para acceder a la interfaz web, abre un navegador y entra en la IP que aparece en la salida de la consola de la VM. Por ejemplo, en nuestro caso: http://192.169.0.32.",
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_0_1.png",
|
||||
"alt": "Arc Loader Web Interface",
|
||||
"caption": "Interfaz web de Arc Loader"
|
||||
},
|
||||
{
|
||||
"htmlBefore": "<strong>Interfaz por terminal</strong>, Accede directamente desde la salida de la consola de la VM.",
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_1_1.png",
|
||||
"alt": "Arc Loader Terminal Interface",
|
||||
"caption": "Interfaz por terminal de Arc Loader"
|
||||
}
|
||||
],
|
||||
"rr": [
|
||||
{
|
||||
"htmlBefore": "<strong>Interfaz web</strong>, Para acceder a la interfaz web, abre un navegador y entra en la IP que aparece en la salida de la consola de la VM, seguida del puerto <strong>7681</strong>. Por ejemplo, en nuestro caso: <code>http://192.169.0.33:7681</code>.",
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_0_2.png",
|
||||
"alt": "RR Command Example",
|
||||
"caption": "Interfaz web de RR Loader"
|
||||
},
|
||||
{
|
||||
"htmlBefore": "<strong>Interfaz por terminal</strong>, Accede directamente desde la salida de la consola de la VM tecleando <strong>menu.sh</strong> en pantalla",
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_1_1.png",
|
||||
"alt": "RR Loader Interface",
|
||||
"caption": "Interfaz por terminal de RR Loader"
|
||||
}
|
||||
],
|
||||
"tinycore": [
|
||||
{
|
||||
"htmlBefore": "<strong>Interfaz web</strong>, Para acceder a la interfaz web, abre un navegador y entra en la IP que aparece en la salida de la consola de la VM, seguida del puerto <strong>7681</strong>. Por ejemplo, en nuestro caso: <code>http://192.169.0.35:7681</code>.",
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_0_1.png",
|
||||
"alt": "TinyCore Loader Interface",
|
||||
"caption": "Interfaz web de TinyCore Loader"
|
||||
},
|
||||
{
|
||||
"htmlBefore": "<strong>Interfaz por terminal</strong>, Accede directamente desde la salida de la consola de la VM. Vigila la pantalla, porque en algún momento puede pedirte que pulses una tecla para continuar o preguntarte si quieres cambiar el idioma.",
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_1_1.png",
|
||||
"alt": "TinyCore Loader Interface",
|
||||
"caption": "Interfaz por terminal de TinyCore Loader"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "step2",
|
||||
"title": "Selecciona el modelo",
|
||||
"intro": "Después de cargar el menú, selecciona el modelo de Synology DSM que quieres instalar. Según el loader, a veces tendrás que expandir las opciones para ver más modelos.",
|
||||
"outro": "En nuestro ejemplo, elegiremos el modelo SA6400.",
|
||||
"loaders": {
|
||||
"arc": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_2_1.png",
|
||||
"alt": "Arc Model Selection",
|
||||
"caption": "Selección de modelo en Arc"
|
||||
}
|
||||
],
|
||||
"rr": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_2_1.png",
|
||||
"alt": "RR Model Selection",
|
||||
"caption": "Selección de modelo en RR"
|
||||
}
|
||||
],
|
||||
"tinycore": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_2_1.png",
|
||||
"alt": "TinyCore Model Selection",
|
||||
"caption": "Selección de modelo en TinyCore"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "step3",
|
||||
"title": "Selecciona la versión de DSM",
|
||||
"intro": "Después de seleccionar el modelo, tienes que elegir la versión de DSM que quieres instalar.",
|
||||
"loaders": {
|
||||
"arc": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_3_1.png",
|
||||
"alt": "Arc Version Selection - Step 1",
|
||||
"caption": "Selección de versión en Arc - Paso 1"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_3_2.png",
|
||||
"alt": "Arc Version Selection - Step 2",
|
||||
"caption": "Selección de versión en Arc - Paso 2"
|
||||
}
|
||||
],
|
||||
"rr": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_3_1.png",
|
||||
"alt": "RR Version Selection - Step 1",
|
||||
"caption": "Selección de versión en RR - Paso 1"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_3_2.png",
|
||||
"alt": "RR Version Selection - Step 2",
|
||||
"caption": "Selección de versión en RR - Paso 2"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_3_3.png",
|
||||
"alt": "RR Version Selection - Step 3",
|
||||
"caption": "Selección de versión en RR - Paso 3"
|
||||
}
|
||||
],
|
||||
"tinycore": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_3_1.png",
|
||||
"alt": "TinyCore Version Selection - Step 1",
|
||||
"caption": "Selección de versión en TinyCore - Paso 1"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_3_2.png",
|
||||
"alt": "TinyCore Version Selection - Step 2",
|
||||
"caption": "Selección de versión en TinyCore - Paso 2"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "step4",
|
||||
"title": "Selecciona los addons",
|
||||
"intro": "Este paso te permite añadir funciones adicionales o configuraciones personalizadas al loader.",
|
||||
"loaders": {
|
||||
"arc": [
|
||||
{
|
||||
"htmlBefore": "<strong>Arc</strong> te da la opción de configurar automáticamente o ajustar los parámetros manualmente. Si eliges configuración automática, el loader empezará a aplicar los ajustes necesarios y reiniciará automáticamente al completar el proceso.",
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_1.png",
|
||||
"alt": "Arc Auto Configuration",
|
||||
"caption": "Configuración automática de Arc"
|
||||
},
|
||||
{
|
||||
"htmlBefore": "Si optamos por no usar el modo automático, entramos en el menú para configurar las distintas opciones necesarias del loader:",
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_2.png",
|
||||
"alt": "Arc Manual Configuration",
|
||||
"caption": "Configuración manual de Arc"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_3.png",
|
||||
"alt": "Arc SN/Mac Configuration",
|
||||
"caption": "Configuración de SN/MAC en Arc"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_4.png",
|
||||
"alt": "Arc Sata Portmap",
|
||||
"caption": "Arc SATA Portmap (usa la opción recomendada)"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_5.png",
|
||||
"alt": "Arc Addons Selection",
|
||||
"caption": "Selección de addons en Arc"
|
||||
}
|
||||
],
|
||||
"rr": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_4_1.png",
|
||||
"alt": "RR Addon Step 1",
|
||||
"caption": "RR Addon Paso 1"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_4_2.png",
|
||||
"alt": "RR Addon Step 2",
|
||||
"caption": "RR Addon Paso 2 - Pulsa para añadir addons"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_4_3.png",
|
||||
"alt": "RR Addon Step 3",
|
||||
"caption": "RR Addon Paso 3 - Selecciona el que quieras pulsando sobre él. Si quieres añadir más, repite el proceso de las imágenes 2.4.2 y 2.4.3"
|
||||
}
|
||||
],
|
||||
"tinycore": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_4_1.png",
|
||||
"alt": "TinyCore SN Configuration",
|
||||
"caption": "Configuración de SN en TinyCore"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_4_2.png",
|
||||
"alt": "TinyCore Random Option",
|
||||
"caption": "Opción Random de TinyCore - Se recomienda la opción aleatoria"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_4_3.png",
|
||||
"alt": "TinyCore MAC Configuration",
|
||||
"caption": "Configuración de MAC en TinyCore"
|
||||
},
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_4_4.png",
|
||||
"alt": "TinyCore VM MAC",
|
||||
"caption": "MAC de la VM en TinyCore - Elige usar la MAC de tu VM o una aleatoria"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "step5",
|
||||
"title": "Construye el loader",
|
||||
"intro": "Una vez seleccionados el modelo, la versión de DSM y los addons, procede a construir el loader. Este proceso puede tardar unos minutos según el loader y la configuración elegida. Para empezar, selecciona la opción \"Build the Loader\".",
|
||||
"loaders": {
|
||||
"arc": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_5_1.png",
|
||||
"alt": "Arc Build Loader",
|
||||
"caption": "Build Loader en Arc"
|
||||
}
|
||||
],
|
||||
"rr": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_5_1.png",
|
||||
"alt": "RR Build Loader",
|
||||
"caption": "Build Loader en RR"
|
||||
}
|
||||
],
|
||||
"tinycore": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_5_1.png",
|
||||
"alt": "TinyCore Build Loader",
|
||||
"caption": "Build Loader en TinyCore"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "step6",
|
||||
"title": "Arranca el loader",
|
||||
"intro": "Una vez construido el loader, te pedirá arrancar. La VM reiniciará con la configuración que has creado y comenzará la instalación de DSM.",
|
||||
"loaders": {
|
||||
"arc": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_6_1.png",
|
||||
"alt": "Arc Boot Loader",
|
||||
"caption": "Boot Loader en Arc"
|
||||
}
|
||||
],
|
||||
"rr": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_6_1.png",
|
||||
"alt": "RR Boot Loader",
|
||||
"caption": "Boot Loader en RR"
|
||||
}
|
||||
],
|
||||
"tinycore": [
|
||||
{
|
||||
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_6_1.png",
|
||||
"alt": "TinyCore Boot Loader",
|
||||
"caption": "Boot Loader en TinyCore"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"dsmInstall": {
|
||||
"heading": "Iniciar la instalación de DSM",
|
||||
"intro": "Una vez arrancado el loader, puedes encontrar tu dispositivo Synology usando:",
|
||||
"afterCode": "Sigue los pasos en pantalla para completar la instalación de DSM.",
|
||||
"setupAlt": "DSM Setup",
|
||||
"setupCaption": "Pantalla de setup de DSM",
|
||||
"patience": "Ten paciencia – El proceso puede tardar unos minutos en completarse. El porcentaje de progreso se actualizará automáticamente conforme avance la instalación. Se iniciará una cuenta atrás cuando la instalación esté a punto de terminar.",
|
||||
"finishAlt": "Installation Complete",
|
||||
"finishCaption": "Instalación completada"
|
||||
},
|
||||
"tips": {
|
||||
"heading": "Consejos",
|
||||
"introItem": "Ten en cuenta que las opciones disponibles pueden cambiar según la versión del loader y las actualizaciones del desarrollador. Si te encuentras con problemas durante la creación del loader, consulta su documentación:",
|
||||
"docLinks": [
|
||||
{
|
||||
"label": "Documentación de Arc",
|
||||
"url": "https://github.com/AuxXxilium/arc"
|
||||
},
|
||||
{
|
||||
"label": "Documentación de RR",
|
||||
"url": "https://github.com/RROrg/rr"
|
||||
},
|
||||
{
|
||||
"label": "Documentación de TinyCore",
|
||||
"url": "https://github.com/PeterSuh-Q3/tinycore-redpill"
|
||||
}
|
||||
],
|
||||
"olderModels": "Algunos modelos antiguos de DSM pueden tener problemas para reconocer discos o la tarjeta de red. Se recomienda usar modelos más recientes.",
|
||||
"updateLabel": "Actualización:",
|
||||
"updateBody": "Algunos loaders ofrecen la opción de actualizarse directamente desde el menú.",
|
||||
"importantLabel": "Importante:",
|
||||
"importantBody": "ProxMenux no ofrece soporte para los distintos loaders."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,292 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Crear VM: System Linux | ProxMenux Documentation",
|
||||
"description": "Crea máquinas virtuales Linux en Proxmox VE con ProxMenux. Cubre el catálogo curado de ISOs oficiales (Ubuntu, Debian, Fedora, Arch, Rocky, Mint, openSUSE, Alpine, Kali, Manjaro), el plan de almacenamiento unificado, el passthrough de GPU opcional y consejos post-instalación.",
|
||||
"ogTitle": "Crear VM: System Linux | ProxMenux Documentation",
|
||||
"ogDescription": "Crea VMs Linux en Proxmox VE con ProxMenux. Catálogo curado de ISOs, plan de almacenamiento unificado, passthrough de GPU opcional y consejos post-instalación.",
|
||||
"ogImageAlt": "Menú de VM Linux de ProxMenux"
|
||||
},
|
||||
"header": {
|
||||
"title": "Crear VM: System Linux",
|
||||
"description": "Crea una VM Linux en Proxmox VE. ProxMenux trae un catálogo curado de ISOs oficiales de Linux listas para descargar, más un selector de ISO local, y enruta todo a través del asistente de VM compartido, el plan de almacenamiento unificado y el asistente opcional de passthrough de GPU.",
|
||||
"section": "Máquinas virtuales"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace este script",
|
||||
"body": "El selector de Linux ofrece dos fuentes de medios de instalación gestionadas por ProxMenux: una ISO oficial del catálogo curado (descargada automáticamente) o una ISO local que hayas subido tú. Elijas la que elijas, el resto del flujo es el asistente compartido: CPU / RAM / BIOS → plan de almacenamiento → passthrough de GPU opcional → creación de la VM."
|
||||
},
|
||||
"image": {
|
||||
"alt": "Opciones de instalación de Linux en ProxMenux",
|
||||
"caption": "Opciones de instalación de Linux"
|
||||
},
|
||||
"config": {
|
||||
"heading": "Configuración por defecto vs Avanzada",
|
||||
"intro": "Después de seleccionar la ISO, ProxMenux pregunta si usar el perfil de VM por defecto o abrir el asistente avanzado.",
|
||||
"defaultHeading": "Configuración por defecto",
|
||||
"headerParam": "Parámetro",
|
||||
"headerValue": "Valor por defecto",
|
||||
"defaultRows": [
|
||||
{
|
||||
"param": "Machine type",
|
||||
"valueRich": "<code>q35</code>"
|
||||
},
|
||||
{
|
||||
"param": "BIOS",
|
||||
"value": "OVMF (UEFI)"
|
||||
},
|
||||
{
|
||||
"param": "CPU type",
|
||||
"value": "Host"
|
||||
},
|
||||
{
|
||||
"param": "Cores",
|
||||
"value": "2"
|
||||
},
|
||||
{
|
||||
"param": "RAM",
|
||||
"value": "4096 MB"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"valueRich": "<code>vmbr0</code>"
|
||||
},
|
||||
{
|
||||
"param": "MAC address",
|
||||
"value": "Generada automáticamente"
|
||||
},
|
||||
{
|
||||
"param": "Start on completion",
|
||||
"value": "No"
|
||||
}
|
||||
],
|
||||
"advancedHeading": "Configuración avanzada",
|
||||
"advancedIntro": "El asistente avanzado expone cada parámetro de forma individual:",
|
||||
"headerOptions": "Opciones",
|
||||
"advancedRows": [
|
||||
{
|
||||
"param": "Machine type",
|
||||
"optionsRich": "<code>q35</code> o <code>i440fx</code>"
|
||||
},
|
||||
{
|
||||
"param": "BIOS",
|
||||
"options": "OVMF (UEFI) o SeaBIOS (Legacy)"
|
||||
},
|
||||
{
|
||||
"param": "CPU type",
|
||||
"options": "Host o KVM64"
|
||||
},
|
||||
{
|
||||
"param": "Cores",
|
||||
"options": "Número de núcleos de CPU"
|
||||
},
|
||||
{
|
||||
"param": "RAM",
|
||||
"options": "Memoria asignada a la VM"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"options": "Bridge de red"
|
||||
},
|
||||
{
|
||||
"param": "MAC address",
|
||||
"options": "MAC personalizada"
|
||||
},
|
||||
{
|
||||
"param": "VLAN",
|
||||
"options": "Tag VLAN (opcional)"
|
||||
},
|
||||
{
|
||||
"param": "MTU",
|
||||
"options": "Tamaño de la MTU"
|
||||
}
|
||||
]
|
||||
},
|
||||
"storagePlan": {
|
||||
"heading": "Plan de almacenamiento",
|
||||
"body": "Después de CPU / RAM, ProxMenux abre el menú <strong>Storage Plan</strong>, donde puedes combinar discos virtuales, discos importados y dispositivos PCI passthrough en la misma VM, añadiendo items uno a uno y terminando cuando hayas acabado.",
|
||||
"virtualDiskTitle": "a. Añadir disco virtual",
|
||||
"virtualDiskItems": [
|
||||
"Lista los volúmenes de almacenamiento Proxmox disponibles en el host.",
|
||||
"Eliges el almacenamiento destino y el tamaño en GB.",
|
||||
"El disco se adjunta a la VM como SATA (<code>sata0</code>, <code>sata1</code>, … hasta 6)."
|
||||
],
|
||||
"importDiskTitle": "b. Añadir disco importado",
|
||||
"importDiskItems": [
|
||||
"Detecta los discos físicos que es seguro importar (los discos del sistema y protegidos están ocultos).",
|
||||
"Seleccionas uno o varios discos mediante una checklist.",
|
||||
"Los discos importados se adjuntan como SATA mediante <code>qm set</code>."
|
||||
],
|
||||
"pciTitle": "c. Añadir controladora o NVMe (PCI passthrough)",
|
||||
"pciItems": [
|
||||
"Detecta HBAs SATA/SAS y dispositivos NVMe del host y te deja pasar una <em>controladora entera</em> a la VM. IOMMU debe estar habilitado; el script se ofrece a habilitarlo y reinicia si hace falta.",
|
||||
"Un paso de confirmación advierte del riesgo a nivel de controladora (la tarjeta completa, incluidos todos los discos que tenga, deja de estar en el host).",
|
||||
"Los dispositivos PCI seleccionados se adjuntan mediante <code>qm set hostpciN: …</code>."
|
||||
],
|
||||
"resetTitle": "Resetear y terminar",
|
||||
"resetBody": "El menú también ofrece <strong>r</strong> (resetear la selección actual y empezar de nuevo) y <strong>d</strong> (terminar y continuar). No puedes terminar con un plan vacío."
|
||||
},
|
||||
"gpu": {
|
||||
"heading": "Passthrough de GPU opcional",
|
||||
"body": "Después del plan de almacenamiento, si se detecta una GPU compatible en el host ProxMenux ofrece lanzar el asistente de passthrough de GPU. Consulta <gpuLink>Añadir GPU a una VM (Passthrough)</gpuLink> para ver cómo funciona el asistente — puede que sea necesario reiniciar el host."
|
||||
},
|
||||
"autoFeatures": {
|
||||
"heading": "Funciones automáticas de la VM",
|
||||
"efiTitle": "Disco EFI",
|
||||
"efiBody": "Cuando se selecciona OVMF (UEFI), ProxMenux crea un disco EFI de 4 MB en el almacenamiento que elijas para que el firmware tenga dónde guardar sus variables.",
|
||||
"isoTitle": "Montaje de la ISO",
|
||||
"isoBody": "La ISO de instalación se adjunta a <code>ide2</code> como CD-ROM, lista para el primer arranque.",
|
||||
"guestTitle": "QEMU Guest Agent",
|
||||
"guestBody": "El canal del guest agent se habilita en la configuración de la VM. Aún tienes que instalar el agente dentro del guest — mira los consejos más abajo."
|
||||
},
|
||||
"installOptions": {
|
||||
"heading": "Opciones de instalación de Linux",
|
||||
"officialHeading": "ISO oficial (instalación tradicional)",
|
||||
"officialBody": "ProxMenux trae una lista curada de ISOs oficiales de Linux. Elige una y el script la descarga directamente desde el mirror upstream a <code>/var/lib/vz/template/iso</code> y la adjunta a la VM.",
|
||||
"officialImageAlt": "Selección de distribución Linux",
|
||||
"officialImageCaption": "Selección de distribución Linux",
|
||||
"localHeading": "ISO local",
|
||||
"localBody": "Usa cualquier ISO de Linux ya presente en <code>/var/lib/vz/template/iso</code>. El script lista cada <code>*.iso</code> que encuentre y te deja elegir uno.",
|
||||
"localImageAlt": "Menú de selección de ISO local",
|
||||
"localImageCaption": "Menú de selección de ISO local",
|
||||
"distros": [
|
||||
{
|
||||
"name": "Ubuntu",
|
||||
"variants": [
|
||||
"25.10 Desktop",
|
||||
"24.04 Desktop",
|
||||
"22.04 Desktop",
|
||||
"20.04 Desktop",
|
||||
"25.10 Server",
|
||||
"24.04 Server",
|
||||
"22.04 Server",
|
||||
"20.04 Server"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Debian",
|
||||
"variants": [
|
||||
"13 Desktop",
|
||||
"12 Desktop",
|
||||
"11 Desktop",
|
||||
"13 Netinst",
|
||||
"12 Netinst",
|
||||
"11 Netinst"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Fedora",
|
||||
"variants": [
|
||||
"Workstation 42"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Arch Linux",
|
||||
"variants": [
|
||||
"latest"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Rocky Linux",
|
||||
"variants": [
|
||||
"9"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Linux Mint",
|
||||
"variants": [
|
||||
"22.1 Cinnamon"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "openSUSE",
|
||||
"variants": [
|
||||
"Leap 15.6"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Alpine Linux",
|
||||
"variants": [
|
||||
"3.21"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Kali Linux",
|
||||
"variants": [
|
||||
"2026.1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Manjaro",
|
||||
"variants": [
|
||||
"25.0 GNOME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"endToEnd": {
|
||||
"heading": "Qué hace el script de principio a fin",
|
||||
"items": [
|
||||
"Obtiene la ISO de Linux (descarga oficial o archivo local).",
|
||||
"Aplica la configuración por defecto o avanzada de CPU / RAM / BIOS / machine type.",
|
||||
"Abre el plan de almacenamiento y adjunta los discos virtuales, discos importados y dispositivos PCI seleccionados.",
|
||||
"Crea el disco EFI cuando se selecciona UEFI.",
|
||||
"Monta la ISO de Linux en <code>ide2</code>.",
|
||||
"Configura el orden de arranque (primero el disco, luego la ISO).",
|
||||
"Habilita el canal del QEMU Guest Agent.",
|
||||
"Opcionalmente ejecuta el asistente de passthrough de GPU.",
|
||||
"Genera una descripción HTML con estilo adjuntada a la VM.",
|
||||
"Arranca la VM si lo elegiste."
|
||||
]
|
||||
},
|
||||
"postInstall": {
|
||||
"heading": "Consejos post-instalación",
|
||||
"guestAgentHeading": "Instala el QEMU Guest Agent dentro de la VM",
|
||||
"guestAgentBody": "ProxMenux habilita el canal del guest agent en la configuración de la VM, pero el agente como tal tiene que instalarse dentro del guest. Permite el apagado controlado, el freeze del filesystem para snapshots consistentes y un reporte de memoria preciso en la UI de Proxmox.",
|
||||
"debian": "Debian / Ubuntu",
|
||||
"fedora": "Fedora / Rocky / RHEL",
|
||||
"arch": "Arch Linux",
|
||||
"opensuse": "openSUSE",
|
||||
"virtioHeading": "Soporte de VirtIO en Linux",
|
||||
"virtioBody": "Los kernels modernos de Linux (2.6.25+) incluyen los drivers VirtIO de disco y red por defecto, así que puedes cambiar la interfaz del disco a <code>virtio</code> o <code>virtio-scsi</code> en el asistente avanzado y el adaptador de red a <code>virtio</code> sin ningún paso extra de drivers.",
|
||||
"virtioWarnTitle": "Distribuciones muy antiguas",
|
||||
"virtioWarnBody": "Si vas a instalar algo anterior al kernel 2.6.25, puede que los módulos VirtIO no estén disponibles en el momento de la instalación. En ese caso mantén SATA / SCSI o proporciona un disco de drivers.",
|
||||
"trimHeading": "Habilita TRIM / discard en almacenamiento SSD",
|
||||
"trimBody": "Cuando la VM está sobre almacenamiento Proxmox respaldado por SSD y el disco se adjuntó con el flag <code>discard</code>, puedes propagar los comandos trim desde dentro del guest. Dos opciones:",
|
||||
"trimItems": [
|
||||
"Ejecutar <code>fstrim -av</code> periódicamente (o habilitar la unit <code>fstrim.timer</code> en distribuciones systemd).",
|
||||
"O montar los filesystems con la opción <code>discard</code> en <code>/etc/fstab</code>."
|
||||
],
|
||||
"balloonHeading": "Memory ballooning",
|
||||
"balloonBody": "El driver <code>virtio_balloon</code> viene con los kernels modernos de Linux. Proxmox lo usa para reclamar memoria no usada de la VM y mostrar utilización precisa en la UI — sin configuración del lado del guest."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-image-vm",
|
||||
"label": "Importar imagen de disco a VM",
|
||||
"tail": " — adjunta un .qcow2 / .img / .raw de Linux existente a una VM nueva."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils/import-vm",
|
||||
"label": "Importar VM desde OVA / OVF",
|
||||
"tail": " — trae una VM Linux exportada desde VMware / VirtualBox / Proxmox."
|
||||
},
|
||||
{
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"tail": " — para VMs Linux que necesiten aceleración por GPU."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/vm-ct-commands",
|
||||
"label": "Comandos de gestión de VM y CT",
|
||||
"tail": " — referencia CLI de qm."
|
||||
},
|
||||
{
|
||||
"href": "/docs/create-vm",
|
||||
"label": "Resumen de Crear VM",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Crear VM: System NAS | ProxMenux Documentation",
|
||||
"description": "Crea máquinas virtuales NAS en Proxmox VE con ProxMenux. Soporta Synology DSM (loader), TrueNAS SCALE / CORE, OpenMediaVault, XigmaNAS, Rockstor y ZimaOS. Umbrel OS está disponible vía community script.",
|
||||
"ogTitle": "Crear VM: System NAS | ProxMenux Documentation",
|
||||
"ogDescription": "Crea máquinas virtuales NAS en Proxmox VE con ProxMenux. Soporta Synology DSM (loader), TrueNAS SCALE / CORE, OpenMediaVault, XigmaNAS, Rockstor y ZimaOS.",
|
||||
"ogImageAlt": "Menú System NAS de ProxMenux"
|
||||
},
|
||||
"header": {
|
||||
"title": "Crear VM: System NAS",
|
||||
"description": "ProxMenux soporta siete sistemas operativos NAS como VMs específicas, más una ruta opcional para Umbrel OS vía community script. La mayoría de sistemas comparten el mismo flujo auto-ISO; Synology DSM usa un asistente de loader especializado.",
|
||||
"section": "Máquinas virtuales"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cómo funciona el selector de NAS",
|
||||
"body": "El selector de NAS detecta la última release estable de cada appliance (consultando su mirror upstream), descarga la ISO — o construye la VM a partir de una imagen pre-empaquetada — y luego cede el control al asistente genérico de VM de ProxMenux para CPU, RAM, disco y configuración de red."
|
||||
},
|
||||
"image": {
|
||||
"alt": "Selector System NAS de ProxMenux",
|
||||
"caption": "Selector System NAS"
|
||||
},
|
||||
"flowBadges": {
|
||||
"loader": "Flujo con loader",
|
||||
"auto-iso": "Flujo auto-ISO",
|
||||
"dedicated": "Script dedicado"
|
||||
},
|
||||
"labels": {
|
||||
"base": "Base",
|
||||
"fileSystem": "Filesystem",
|
||||
"viewDetails": "Ver detalles"
|
||||
},
|
||||
"supported": {
|
||||
"heading": "Sistemas NAS soportados",
|
||||
"cards": [
|
||||
{
|
||||
"name": "Synology DSM",
|
||||
"tagline": "DiskStation Manager con el loader ARC / RR. Requiere configurar el loader antes del primer arranque.",
|
||||
"icon": "HardDrive",
|
||||
"base": "Linux (custom)",
|
||||
"fileSystem": "Btrfs, ext4",
|
||||
"href": "/docs/create-vm/system-nas/synology",
|
||||
"flow": "loader"
|
||||
},
|
||||
{
|
||||
"name": "TrueNAS SCALE",
|
||||
"tagline": "TrueNAS basado en Debian con apps Docker / Kubernetes y ZFS como filesystem principal.",
|
||||
"icon": "Database",
|
||||
"base": "Debian Linux",
|
||||
"fileSystem": "ZFS",
|
||||
"href": "/docs/create-vm/system-nas/system-nas-others#truenas-scale",
|
||||
"flow": "auto-iso"
|
||||
},
|
||||
{
|
||||
"name": "TrueNAS CORE",
|
||||
"tagline": "TrueNAS basado en FreeBSD. Almacenamiento ZFS de nivel empresarial con jails y plugins.",
|
||||
"icon": "Database",
|
||||
"base": "FreeBSD",
|
||||
"fileSystem": "ZFS",
|
||||
"href": "/docs/create-vm/system-nas/system-nas-others#truenas-core",
|
||||
"flow": "auto-iso"
|
||||
},
|
||||
{
|
||||
"name": "OpenMediaVault",
|
||||
"tagline": "NAS ligero basado en Debian con arquitectura modular de plugins. Va bien con hardware antiguo.",
|
||||
"icon": "Server",
|
||||
"base": "Debian Linux",
|
||||
"fileSystem": "ext4, XFS, Btrfs",
|
||||
"href": "/docs/create-vm/system-nas/system-nas-others#openmediavault",
|
||||
"flow": "auto-iso"
|
||||
},
|
||||
{
|
||||
"name": "XigmaNAS",
|
||||
"tagline": "NAS basado en FreeBSD — el sucesor original de FreeNAS, centrado en ZFS y simplicidad.",
|
||||
"icon": "Database",
|
||||
"base": "FreeBSD",
|
||||
"fileSystem": "ZFS, UFS",
|
||||
"href": "/docs/create-vm/system-nas/system-nas-others#xigmanas",
|
||||
"flow": "auto-iso"
|
||||
},
|
||||
{
|
||||
"name": "Rockstor",
|
||||
"tagline": "NAS basado en openSUSE construido en torno a Btrfs. Los Rock-ons (apps Docker) amplían la funcionalidad.",
|
||||
"icon": "HardDrive",
|
||||
"base": "openSUSE Leap",
|
||||
"fileSystem": "Btrfs",
|
||||
"href": "/docs/create-vm/system-nas/system-nas-others#rockstor",
|
||||
"flow": "auto-iso"
|
||||
},
|
||||
{
|
||||
"name": "ZimaOS",
|
||||
"tagline": "SO NAS ligero centrado en multimedia, apps Docker y domótica. Usa su propio instalador.",
|
||||
"icon": "MonitorIcon",
|
||||
"base": "Debian / CasaOS",
|
||||
"fileSystem": "ext4",
|
||||
"href": "/docs/create-vm/system-nas/system-nas-others#zimaos",
|
||||
"flow": "dedicated"
|
||||
}
|
||||
]
|
||||
},
|
||||
"umbrel": {
|
||||
"title": "Opción de la comunidad: Umbrel OS",
|
||||
"bodyRich": "La 8ª entrada del menú NAS es <strong>Umbrel OS</strong>. Ejecuta un <umbrelLink>instalador de community-scripts</umbrelLink> mantenido fuera de ProxMenux, así que no se documenta aquí. El instalador gestiona el ciclo de vida completo y muestra sus credenciales por defecto al final."
|
||||
},
|
||||
"zfsMem": {
|
||||
"title": "Regla rápida de memoria para ZFS",
|
||||
"bodyRich": "Si eliges un NAS basado en ZFS (TrueNAS, XigmaNAS), asigna al menos <strong>8 GB de RAM</strong> a la VM — ZFS usa la memoria libre como caché ARC y el rendimiento se degrada notablemente por debajo de eso. Rockstor (Btrfs) y OMV (ext4) son mucho menos exigentes con la memoria."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/create-vm/system-nas/synology",
|
||||
"label": "VM Synology",
|
||||
"tail": " — instalador específico para Synology DSM (Xpenology) en Proxmox."
|
||||
},
|
||||
{
|
||||
"href": "/docs/create-vm/system-nas/system-nas-others",
|
||||
"label": "Otros System NAS",
|
||||
"tail": " — TrueNAS, OpenMediaVault, Rockstor, XigmaNAS y similares."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-vm",
|
||||
"label": "Importar disco a VM",
|
||||
"tail": " — pasa discos físicos reales a la VM NAS (recomendado sobre discos virtuales para producción)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/zfs-commands",
|
||||
"label": "Comandos de gestión de ZFS",
|
||||
"tail": " — útiles si tu distribución NAS usa ZFS por debajo."
|
||||
},
|
||||
{
|
||||
"href": "/docs/create-vm",
|
||||
"label": "Resumen de Crear VM",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,400 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Crear VM: Synology DSM | ProxMenux Documentation",
|
||||
"description": "Crea una máquina virtual Synology DSM en Proxmox VE. ProxMenux descarga el loader que elijas (Arc, RR, TinyCore M-shell o uno personalizado), lo importa como disco de arranque de la VM y prepara CPU, RAM y almacenamiento mediante el asistente por defecto o avanzado.",
|
||||
"ogTitle": "Crear VM: Synology DSM | ProxMenux Documentation",
|
||||
"ogDescription": "Crea una máquina virtual Synology DSM en Proxmox VE con ProxMenux."
|
||||
},
|
||||
"header": {
|
||||
"title": "Crear VM: Synology DSM",
|
||||
"description": "Crea una máquina virtual Synology DSM en Proxmox VE. ProxMenux descarga el loader que elijas (Arc, RR, TinyCore M-shell o uno personalizado), lo importa como disco de arranque de la VM y prepara CPU, RAM y almacenamiento mediante el asistente por defecto o avanzado.",
|
||||
"section": "Máquinas virtuales · NAS"
|
||||
},
|
||||
"loaderLabels": {
|
||||
"arc": "Arc Loader",
|
||||
"rr": "RR Loader",
|
||||
"tinycore": "TinyCore Loader"
|
||||
},
|
||||
"whatThisDoes": {
|
||||
"title": "Qué hace esto",
|
||||
"bodyRich": "ProxMenux automatiza la parte de VM de una instalación de Synology DSM: descarga uno de los loaders soportados, lo importa a una VM nueva como disco de arranque IDE y aplica la CPU / RAM / red / almacenamiento que elijas. El resto — construir el loader, elegir el modelo de DSM, instalar DSM — ocurre <strong>dentro de la VM</strong>, guiado por la interfaz web o por terminal del propio loader. Esos pasos los mantiene la comunidad y cambian a menudo, así que esta página te deja una base que funciona."
|
||||
},
|
||||
"supportedLoaders": {
|
||||
"heading": "Loaders soportados",
|
||||
"intro": "El script te permite elegir entre cuatro fuentes de loader:",
|
||||
"loaders": [
|
||||
{
|
||||
"name": "AuxXxilium Arc",
|
||||
"url": "https://github.com/AuxXxilium/arc"
|
||||
},
|
||||
{
|
||||
"name": "RedPill RR",
|
||||
"url": "https://github.com/RROrg/rr"
|
||||
},
|
||||
{
|
||||
"name": "TinyCore RedPill M-shell",
|
||||
"url": "https://github.com/PeterSuh-Q3/tinycore-redpill"
|
||||
}
|
||||
],
|
||||
"customRich": "<strong>Custom Loader</strong> — deja tu propia imagen de loader en <code>/var/lib/vz/template/iso</code> y el script la recogerá."
|
||||
},
|
||||
"config": {
|
||||
"heading": "Configuración por defecto vs Avanzada",
|
||||
"intro": "Cuando ejecutas el script te pregunta si quieres usar el perfil de VM por defecto de ProxMenux o abrir el asistente avanzado. Los valores por defecto están ajustados para DSM y funcionan en la mayoría de instalaciones.",
|
||||
"defaultHeading": "Configuración por defecto",
|
||||
"headerParam": "Parámetro",
|
||||
"headerValue": "Valor por defecto",
|
||||
"defaultRowsRich": [
|
||||
{
|
||||
"param": "Machine type",
|
||||
"valueRich": "<code>q35</code>"
|
||||
},
|
||||
{
|
||||
"param": "BIOS",
|
||||
"valueRich": "OVMF (UEFI)"
|
||||
},
|
||||
{
|
||||
"param": "CPU type",
|
||||
"valueRich": "Host"
|
||||
},
|
||||
{
|
||||
"param": "Cores",
|
||||
"valueRich": "2"
|
||||
},
|
||||
{
|
||||
"param": "RAM",
|
||||
"valueRich": "4096 MB"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"valueRich": "<code>vmbr0</code>"
|
||||
},
|
||||
{
|
||||
"param": "MAC address",
|
||||
"valueRich": "Generada automáticamente"
|
||||
},
|
||||
{
|
||||
"param": "Start on completion",
|
||||
"valueRich": "No"
|
||||
}
|
||||
],
|
||||
"advancedHeading": "Configuración avanzada",
|
||||
"advancedIntro": "El asistente avanzado expone cada parámetro. Puedes cambiar libremente cualquiera de estos:",
|
||||
"headerOptions": "Opciones",
|
||||
"advancedRowsRich": [
|
||||
{
|
||||
"param": "Machine type",
|
||||
"optionsRich": "<code>q35</code> o <code>i440fx</code>"
|
||||
},
|
||||
{
|
||||
"param": "BIOS",
|
||||
"optionsRich": "OVMF (UEFI) o SeaBIOS (Legacy)"
|
||||
},
|
||||
{
|
||||
"param": "CPU type",
|
||||
"optionsRich": "Host o KVM64"
|
||||
},
|
||||
{
|
||||
"param": "Cores",
|
||||
"optionsRich": "Número de núcleos de CPU"
|
||||
},
|
||||
{
|
||||
"param": "RAM",
|
||||
"optionsRich": "Memoria asignada a la VM"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"optionsRich": "Bridge de red"
|
||||
},
|
||||
{
|
||||
"param": "MAC address",
|
||||
"optionsRich": "MAC personalizada"
|
||||
},
|
||||
{
|
||||
"param": "VLAN",
|
||||
"optionsRich": "Tag VLAN (opcional)"
|
||||
},
|
||||
{
|
||||
"param": "MTU",
|
||||
"optionsRich": "Tamaño de la MTU"
|
||||
}
|
||||
]
|
||||
},
|
||||
"storagePlan": {
|
||||
"heading": "Plan de almacenamiento",
|
||||
"introRich": "Después del paso de CPU / RAM, ProxMenux abre el menú <strong>Storage Plan</strong>, donde puedes <strong>combinar</strong> discos virtuales, discos importados y dispositivos PCI passthrough en la misma VM, añadiendo items uno a uno y terminando cuando hayas acabado.",
|
||||
"virtualHeading": "a. Añadir disco virtual",
|
||||
"virtualItemsRich": [
|
||||
"Lista los volúmenes de almacenamiento Proxmox disponibles en el host.",
|
||||
"Eliges el almacenamiento destino y el tamaño en GB.",
|
||||
"El disco se adjunta a la VM como SATA (<code>sata0</code>, <code>sata1</code>, … hasta 6)."
|
||||
],
|
||||
"importHeading": "b. Añadir disco importado",
|
||||
"importItemsRich": [
|
||||
"Detecta los discos físicos que es seguro importar (los discos del sistema y protegidos están ocultos).",
|
||||
"Seleccionas uno o varios discos mediante una checklist.",
|
||||
"Los discos importados se adjuntan como SATA mediante <code>qm set</code>."
|
||||
],
|
||||
"pciHeading": "c. Añadir controladora o NVMe (PCI passthrough)",
|
||||
"pciItemsRich": [
|
||||
"Detecta HBAs SATA/SAS y dispositivos NVMe del host y te deja pasar una <em>controladora entera</em> a la VM. IOMMU debe estar habilitado; el script se ofrece a habilitarlo y reinicia si hace falta.",
|
||||
"Un paso de confirmación advierte del riesgo a nivel de controladora (la tarjeta completa, incluidos todos los discos que tenga, deja de estar en el host).",
|
||||
"Los dispositivos PCI seleccionados se adjuntan mediante <code>qm set hostpciN: …</code>."
|
||||
],
|
||||
"resetCalloutTitle": "Resetear y terminar",
|
||||
"resetCalloutBodyRich": "El menú también ofrece <strong>r</strong> (resetear la selección actual y empezar de nuevo) y <strong>d</strong> (terminar y continuar). No puedes terminar con un plan vacío — Synology necesita al menos un disco para instalar DSM."
|
||||
},
|
||||
"gpu": {
|
||||
"heading": "Passthrough de GPU opcional",
|
||||
"bodyRich": "Después del plan de almacenamiento, si el script detecta una GPU compatible en el host te pregunta si quieres pasarla a esta VM. Consulta <link>Añadir GPU a una VM (Passthrough)</link> para ver cómo funciona el asistente — puede que sea necesario reiniciar el host."
|
||||
},
|
||||
"loaderInstall": {
|
||||
"heading": "Instalación del loader",
|
||||
"intro1Rich": "<strong>Arc</strong>, <strong>RR</strong> y <strong>TinyCore M-shell</strong> se descargan y extraen automáticamente desde sus repositorios upstream de GitHub. Si la descarga falla, el script aborta con un mensaje claro.",
|
||||
"intro2Rich": "Para la opción <strong>Custom Loader</strong>, el script escanea <code>/var/lib/vz/template/iso</code>. Si hay más de un candidato te pedirá que elijas el que quieres.",
|
||||
"uploadIntro": "Puedes subir loaders personalizados desde el almacenamiento local de Proxmox:",
|
||||
"imageAlt": "Añadir custom loader",
|
||||
"imageCaption": "Añadir custom loader"
|
||||
},
|
||||
"vmCreation": {
|
||||
"heading": "Creación de la VM — qué ejecuta el script",
|
||||
"introRich": "Una vez confirmas el loader, ProxMenux ejecuta el equivalente a estos comandos <code>qm</code>:",
|
||||
"itemsRich": [
|
||||
"<code>qm create</code> — crea la VM con la CPU, RAM, BIOS y machine type seleccionados.",
|
||||
"<code>qm importdisk</code> — importa el loader como disco <strong>IDE</strong> (máxima compatibilidad).",
|
||||
"<code>qm set sataN: …</code> — adjunta los discos virtuales y discos importados del plan de almacenamiento, más la interfaz de red.",
|
||||
"<code>qm set hostpciN: …</code> — adjunta cualquier dispositivo controladora / NVMe seleccionado para PCI passthrough.",
|
||||
"<code>qm set --boot</code> — pone el loader como primer dispositivo de arranque."
|
||||
]
|
||||
},
|
||||
"stepByStep": {
|
||||
"heading": "Configuración del loader paso a paso",
|
||||
"intro": "Todos los loaders siguen el mismo patrón general — arrancar la VM, elegir un modelo, elegir una versión de DSM, elegir add-ons, construir, arrancar — pero las pantallas y los menús difieren. La guía siguiente recorre los seis pasos comunes con capturas de cada loader. Las opciones exactas pueden cambiar con nuevas releases del loader.",
|
||||
"warnCalloutTitle": "Los loaders no los mantiene ProxMenux",
|
||||
"warnCalloutBody": "Arc, RR y TinyCore son proyectos de la comunidad con su propia cadencia de release. Si un paso se ve distinto a las capturas de abajo, lo más probable es que el loader se haya actualizado — consulta la documentación del propio loader (enlaces al final de esta página)."
|
||||
},
|
||||
"stepBadge": "Paso",
|
||||
"step1": {
|
||||
"title": "Arranca la VM y entra en el menú principal",
|
||||
"intro": "Una vez creada la VM, arráncala. El primer arranque te lleva a la interfaz de configuración del loader, donde eliges y construyes el modelo de DSM que quieres. Una vez construido el loader, los siguientes arranques se saltan este paso a menos que fuerces una reconfiguración desde el propio boot monitor del loader. Los tres loaders soportan tanto UI por terminal como UI web.",
|
||||
"arc": {
|
||||
"webRich": "<strong>Interfaz web.</strong> Abre un navegador y entra en la IP que aparece en la consola de la VM (en nuestro ejemplo: <code>http://192.168.0.32</code>).",
|
||||
"webAlt": "Interfaz web de Arc loader",
|
||||
"webCaption": "Interfaz web de Arc loader",
|
||||
"termRich": "<strong>Interfaz por terminal.</strong> Úsala directamente desde la salida de la consola de la VM.",
|
||||
"termAlt": "Interfaz por terminal de Arc loader",
|
||||
"termCaption": "Interfaz por terminal de Arc loader"
|
||||
},
|
||||
"rr": {
|
||||
"webRich": "<strong>Interfaz web.</strong> Abre un navegador y entra en la IP que aparece en la consola de la VM seguida del puerto <strong>7681</strong> (ejemplo: <code>http://192.168.0.33:7681</code>).",
|
||||
"webAlt": "Interfaz web de RR loader",
|
||||
"webCaption": "Interfaz web de RR loader",
|
||||
"termRich": "<strong>Interfaz por terminal.</strong> En la consola de la VM teclea <code>menu.sh</code> para abrirla.",
|
||||
"termAlt": "Interfaz por terminal de RR loader",
|
||||
"termCaption": "Interfaz por terminal de RR loader"
|
||||
},
|
||||
"tinycore": {
|
||||
"webRich": "<strong>Interfaz web.</strong> Abre un navegador y entra en la IP que aparece en la consola de la VM seguida del puerto <strong>7681</strong> (ejemplo: <code>http://192.168.0.35:7681</code>).",
|
||||
"webAlt": "Interfaz web de TinyCore loader",
|
||||
"webCaption": "Interfaz web de TinyCore loader",
|
||||
"termRich": "<strong>Interfaz por terminal.</strong> Úsala desde la consola de la VM. Vigílala — en algún momento puede pedirte que pulses una tecla para continuar o que cambies el idioma.",
|
||||
"termAlt": "Interfaz por terminal de TinyCore loader",
|
||||
"termCaption": "Interfaz por terminal de TinyCore loader"
|
||||
}
|
||||
},
|
||||
"step2": {
|
||||
"title": "Selecciona el modelo",
|
||||
"introRich": "Elige el modelo de Synology DSM que quieres instalar. Según el loader puede que necesites expandir las opciones para ver la lista completa. En las capturas de abajo usamos el modelo <strong>SA6400</strong> como ejemplo.",
|
||||
"arc": {
|
||||
"alt": "Selección de modelo en Arc",
|
||||
"caption": "Selección de modelo en Arc"
|
||||
},
|
||||
"rr": {
|
||||
"alt": "Selección de modelo en RR",
|
||||
"caption": "Selección de modelo en RR"
|
||||
},
|
||||
"tinycore": {
|
||||
"alt": "Selección de modelo en TinyCore",
|
||||
"caption": "Selección de modelo en TinyCore"
|
||||
}
|
||||
},
|
||||
"step3": {
|
||||
"title": "Selecciona la versión de DSM",
|
||||
"intro": "Después de elegir el modelo, escoge la versión de DSM que vas a instalar.",
|
||||
"arc": [
|
||||
{
|
||||
"alt": "Versión Arc — paso 1",
|
||||
"caption": "Selección de versión en Arc — paso 1"
|
||||
},
|
||||
{
|
||||
"alt": "Versión Arc — paso 2",
|
||||
"caption": "Selección de versión en Arc — paso 2"
|
||||
}
|
||||
],
|
||||
"rr": [
|
||||
{
|
||||
"alt": "Versión RR — paso 1",
|
||||
"caption": "Selección de versión en RR — paso 1"
|
||||
},
|
||||
{
|
||||
"alt": "Versión RR — paso 2",
|
||||
"caption": "Selección de versión en RR — paso 2"
|
||||
},
|
||||
{
|
||||
"alt": "Versión RR — paso 3",
|
||||
"caption": "Selección de versión en RR — paso 3"
|
||||
}
|
||||
],
|
||||
"tinycore": [
|
||||
{
|
||||
"alt": "Versión TinyCore — paso 1",
|
||||
"caption": "Selección de versión en TinyCore — paso 1"
|
||||
},
|
||||
{
|
||||
"alt": "Versión TinyCore — paso 2",
|
||||
"caption": "Selección de versión en TinyCore — paso 2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"step4": {
|
||||
"title": "Selecciona los addons",
|
||||
"intro": "Este paso te permite añadir funciones adicionales o configuración personalizada al loader.",
|
||||
"arc": {
|
||||
"autoRich": "<strong>Arc</strong> ofrece un modo automático (recomendado) y uno manual. En modo automático el loader aplica valores por defecto sensatos y reinicia por sí solo al terminar.",
|
||||
"autoAlt": "Configuración automática de Arc",
|
||||
"autoCaption": "Configuración automática de Arc",
|
||||
"manualRich": "Si eliges manual, vas paso a paso por las opciones una a una:",
|
||||
"manualAlt": "Configuración manual de Arc",
|
||||
"manualCaption": "Configuración manual de Arc",
|
||||
"snMacAlt": "Arc SN/MAC",
|
||||
"snMacCaption": "Configuración de SN / MAC en Arc",
|
||||
"portmapAlt": "Arc SATA portmap",
|
||||
"portmapCaption": "Arc SATA portmap (usa la opción recomendada)",
|
||||
"addonsAlt": "Addons de Arc",
|
||||
"addonsCaption": "Selección de addons en Arc"
|
||||
},
|
||||
"rr": [
|
||||
{
|
||||
"alt": "RR addon — paso 1",
|
||||
"caption": "RR addon — paso 1"
|
||||
},
|
||||
{
|
||||
"alt": "RR addon — paso 2",
|
||||
"caption": "RR addon — paso 2: pulsa para añadir un addon"
|
||||
},
|
||||
{
|
||||
"alt": "RR addon — paso 3",
|
||||
"caption": "RR addon — paso 3: pulsa el addon que quieras. Repite las dos capturas anteriores para añadir más."
|
||||
}
|
||||
],
|
||||
"tinycore": [
|
||||
{
|
||||
"alt": "Configuración de SN en TinyCore",
|
||||
"caption": "Configuración de SN en TinyCore"
|
||||
},
|
||||
{
|
||||
"alt": "Opción random de TinyCore",
|
||||
"caption": "Opción random de TinyCore (recomendada)"
|
||||
},
|
||||
{
|
||||
"alt": "Configuración de MAC en TinyCore",
|
||||
"caption": "Configuración de MAC en TinyCore"
|
||||
},
|
||||
{
|
||||
"alt": "MAC de la VM en TinyCore",
|
||||
"caption": "TinyCore — elige la MAC de la VM o una aleatoria"
|
||||
}
|
||||
]
|
||||
},
|
||||
"step5": {
|
||||
"title": "Construye el loader",
|
||||
"introRich": "Con el modelo, la versión de DSM y los addons elegidos, selecciona <strong>Build the Loader</strong>. Esto puede tardar unos minutos según el loader y las opciones elegidas.",
|
||||
"arc": {
|
||||
"alt": "Build loader en Arc",
|
||||
"caption": "Arc — build loader"
|
||||
},
|
||||
"rr": {
|
||||
"alt": "Build loader en RR",
|
||||
"caption": "RR — build loader"
|
||||
},
|
||||
"tinycore": {
|
||||
"alt": "Build loader en TinyCore",
|
||||
"caption": "TinyCore — build loader"
|
||||
}
|
||||
},
|
||||
"step6": {
|
||||
"title": "Arranca el loader",
|
||||
"intro": "Una vez construido el loader, la VM reinicia con la configuración que has creado y empieza la instalación de DSM.",
|
||||
"arc": {
|
||||
"alt": "Boot loader en Arc",
|
||||
"caption": "Arc — boot loader"
|
||||
},
|
||||
"rr": {
|
||||
"alt": "Boot loader en RR",
|
||||
"caption": "RR — boot loader"
|
||||
},
|
||||
"tinycore": {
|
||||
"alt": "Boot loader en TinyCore",
|
||||
"caption": "TinyCore — boot loader"
|
||||
}
|
||||
},
|
||||
"dsmInstall": {
|
||||
"heading": "Iniciar la instalación de DSM",
|
||||
"intro": "Una vez arrancado el loader, puedes descubrir tu VM DSM abriendo:",
|
||||
"afterCode": "Sigue los pasos en pantalla para completar la instalación de DSM.",
|
||||
"setupAlt": "Setup de DSM",
|
||||
"setupCaption": "Pantalla de setup de DSM",
|
||||
"patience": "Ten paciencia — el proceso puede tardar varios minutos. El progreso se actualiza solo y aparece una cuenta atrás conforme la instalación se acerca al final.",
|
||||
"finishAlt": "Instalación completada",
|
||||
"finishCaption": "Instalación completada"
|
||||
},
|
||||
"tips": {
|
||||
"heading": "Consejos",
|
||||
"recentTitle": "Usa modelos DSM recientes",
|
||||
"recentBody": "Algunos modelos antiguos de DSM tienen problemas para reconocer discos o la tarjeta de red. Prefiere modelos recientes (p. ej., SA6400) para un primer arranque más fluido.",
|
||||
"updateTitle": "Actualizar el loader",
|
||||
"updateBody": "Algunos loaders ofrecen la opción de actualizarse directamente desde su menú de configuración — no hace falta destruir y recrear la VM.",
|
||||
"warnTitle": "ProxMenux no da soporte a los loaders",
|
||||
"warnBody": "ProxMenux automatiza el lado de la VM. Los problemas de loader (modelo no encontrado, addon que no se instala, DSM que se niega a arrancar) quedan fuera del alcance aquí — usa el issue tracker y la documentación de cada loader.",
|
||||
"docsHeading": "Documentación de los loaders",
|
||||
"docLinks": [
|
||||
{
|
||||
"label": "Documentación de Arc",
|
||||
"url": "https://github.com/AuxXxilium/arc"
|
||||
},
|
||||
{
|
||||
"label": "Documentación de RR",
|
||||
"url": "https://github.com/RROrg/rr"
|
||||
},
|
||||
{
|
||||
"label": "Documentación de TinyCore",
|
||||
"url": "https://github.com/PeterSuh-Q3/tinycore-redpill"
|
||||
}
|
||||
]
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"itemsRich": [
|
||||
{
|
||||
"href": "/docs/create-vm/system-nas",
|
||||
"label": "Resumen de System NAS",
|
||||
"tail": " — comparativa entre Synology y TrueNAS / OMV / Rockstor / XigmaNAS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/create-vm/system-nas/system-nas-others",
|
||||
"label": "Otros System NAS",
|
||||
"tail": " — distribuciones NAS no-Synology."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-vm",
|
||||
"label": "Importar disco a VM",
|
||||
"tail": " — pasa discos reales a la VM Synology (recomendado para el rendimiento de almacenamiento)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/create-vm",
|
||||
"label": "Resumen de Crear VM",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,297 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Crear VM: Otros sistemas NAS | ProxMenux Documentation",
|
||||
"description": "Crea máquinas virtuales de TrueNAS SCALE, TrueNAS CORE, OpenMediaVault, XigmaNAS, Rockstor y ZimaOS en Proxmox VE con ProxMenux. Cubre la configuración por defecto / avanzada, el nuevo plan de almacenamiento, el passthrough de GPU opcional y las specs recomendadas por sistema.",
|
||||
"ogTitle": "Crear VM: Otros sistemas NAS | ProxMenux Documentation",
|
||||
"ogDescription": "Crea VMs de TrueNAS SCALE / CORE, OpenMediaVault, XigmaNAS, Rockstor y ZimaOS en Proxmox VE con ProxMenux.",
|
||||
"ogImageAlt": "Selector NAS de ProxMenux"
|
||||
},
|
||||
"header": {
|
||||
"title": "Crear VM: Otros sistemas NAS",
|
||||
"description": "ProxMenux puede crear una VM lista para instalar TrueNAS SCALE, TrueNAS CORE, OpenMediaVault, XigmaNAS, Rockstor y ZimaOS. Esta página cubre el flujo de creación compartido (configuración por defecto / avanzada, el nuevo plan de almacenamiento, passthrough de GPU opcional) más notas por sistema y specs recomendadas.",
|
||||
"section": "Máquinas virtuales · NAS"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cómo se crean estos sistemas",
|
||||
"bodyRich": "Los seis sistemas comparten el mismo asistente de ProxMenux. El selector de NAS elige el instalador correspondiente (autodetectando la última versión estable para TrueNAS, OMV, XigmaNAS y Rockstor) y luego cede el control al configurador genérico de VM y al plan de almacenamiento. ZimaOS usa su propio script de instalador (<code>vm/zimaos.sh</code>) pero sigue la misma secuencia de CPU / RAM / almacenamiento / GPU opcional."
|
||||
},
|
||||
"config": {
|
||||
"heading": "Configuración por defecto vs Avanzada",
|
||||
"intro": "Cuando se selecciona un NAS, ProxMenux pregunta si usar el perfil de VM por defecto o abrir el asistente avanzado. Los valores por defecto están ajustados para cargas NAS — más RAM que una VM Linux normal porque los sistemas basados en ZFS la necesitan para la caché ARC.",
|
||||
"defaultHeading": "Configuración por defecto",
|
||||
"headerParam": "Parámetro",
|
||||
"headerValue": "Valor por defecto",
|
||||
"defaultRowsRich": [
|
||||
{
|
||||
"param": "Machine type",
|
||||
"valueRich": "<code>q35</code>"
|
||||
},
|
||||
{
|
||||
"param": "BIOS",
|
||||
"valueRich": "OVMF (UEFI)<note> — SeaBIOS para OpenMediaVault</note>"
|
||||
},
|
||||
{
|
||||
"param": "CPU type",
|
||||
"valueRich": "Host"
|
||||
},
|
||||
{
|
||||
"param": "Cores",
|
||||
"valueRich": "2"
|
||||
},
|
||||
{
|
||||
"param": "RAM",
|
||||
"valueRich": "8192 MB<note> — 4096 MB para ZimaOS</note>"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"valueRich": "<code>vmbr0</code>"
|
||||
},
|
||||
{
|
||||
"param": "MAC address",
|
||||
"valueRich": "Generada automáticamente"
|
||||
},
|
||||
{
|
||||
"param": "Start on completion",
|
||||
"valueRich": "No"
|
||||
}
|
||||
],
|
||||
"advancedHeading": "Configuración avanzada",
|
||||
"advancedIntro": "El asistente avanzado expone cada parámetro de forma individual:",
|
||||
"headerOptions": "Opciones",
|
||||
"advancedRowsRich": [
|
||||
{
|
||||
"param": "Machine type",
|
||||
"optionsRich": "<code>q35</code> o <code>i440fx</code>"
|
||||
},
|
||||
{
|
||||
"param": "BIOS",
|
||||
"optionsRich": "OVMF (UEFI) o SeaBIOS (Legacy)"
|
||||
},
|
||||
{
|
||||
"param": "CPU type",
|
||||
"optionsRich": "Host o KVM64"
|
||||
},
|
||||
{
|
||||
"param": "Cores",
|
||||
"optionsRich": "Número de núcleos de CPU"
|
||||
},
|
||||
{
|
||||
"param": "RAM",
|
||||
"optionsRich": "Memoria asignada a la VM"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"optionsRich": "Bridge de red"
|
||||
},
|
||||
{
|
||||
"param": "MAC address",
|
||||
"optionsRich": "MAC personalizada"
|
||||
},
|
||||
{
|
||||
"param": "VLAN",
|
||||
"optionsRich": "Tag VLAN (opcional)"
|
||||
},
|
||||
{
|
||||
"param": "MTU",
|
||||
"optionsRich": "Tamaño de la MTU"
|
||||
}
|
||||
],
|
||||
"zfsCalloutTitle": "ZFS y RAM",
|
||||
"zfsCalloutBody": "TrueNAS SCALE / CORE y XigmaNAS están basados en ZFS. ZFS usa la memoria libre como caché ARC, así que los 8 GB por defecto son un mínimo — súbela a 16 GB o más si tienes pensado guardar algo serio. OMV (ext4/XFS), Rockstor (Btrfs) y ZimaOS son mucho menos exigentes con la memoria."
|
||||
},
|
||||
"storagePlan": {
|
||||
"heading": "Plan de almacenamiento",
|
||||
"intro": "Después de CPU / RAM, ProxMenux abre el menú Storage Plan, donde puedes combinar discos virtuales, discos importados y dispositivos PCI passthrough en la misma VM, añadiendo items uno a uno y terminando cuando hayas acabado.",
|
||||
"virtualHeading": "a. Añadir disco virtual",
|
||||
"virtualItemsRich": [
|
||||
"Lista los volúmenes de almacenamiento Proxmox disponibles en el host.",
|
||||
"Eliges el almacenamiento destino y el tamaño en GB.",
|
||||
"El disco se adjunta a la VM como SATA (<code>sata0</code>, <code>sata1</code>, … hasta 6)."
|
||||
],
|
||||
"importHeading": "b. Añadir disco importado",
|
||||
"importItemsRich": [
|
||||
"Detecta los discos físicos que es seguro importar (los discos del sistema y protegidos están ocultos).",
|
||||
"Seleccionas uno o varios discos mediante una checklist.",
|
||||
"Los discos importados se adjuntan como SATA mediante <code>qm set</code>."
|
||||
],
|
||||
"pciHeading": "c. Añadir controladora o NVMe (PCI passthrough)",
|
||||
"pciItemsRich": [
|
||||
"Detecta HBAs SATA/SAS y dispositivos NVMe del host y te deja pasar una <em>controladora entera</em> a la VM. IOMMU debe estar habilitado; el script se ofrece a habilitarlo y reinicia si hace falta.",
|
||||
"Un paso de confirmación advierte del riesgo a nivel de controladora (la tarjeta completa, incluidos todos los discos que tenga, deja de estar en el host).",
|
||||
"Los dispositivos PCI seleccionados se adjuntan mediante <code>qm set hostpciN: …</code>."
|
||||
],
|
||||
"resetCalloutTitle": "Resetear y terminar",
|
||||
"resetCalloutBodyRich": "El menú también ofrece <strong>r</strong> (resetear la selección actual y empezar de nuevo) y <strong>d</strong> (terminar y continuar). No puedes terminar con un plan vacío."
|
||||
},
|
||||
"gpu": {
|
||||
"heading": "Passthrough de GPU opcional",
|
||||
"bodyRich": "Después del plan de almacenamiento, si se detecta una GPU compatible en el host, ProxMenux ofrece lanzar el asistente de passthrough de GPU. Consulta <link>Añadir GPU a una VM (Passthrough)</link> para ver cómo funciona el asistente — puede que sea necesario reiniciar el host."
|
||||
},
|
||||
"autoFeatures": {
|
||||
"heading": "Funciones automáticas de la VM",
|
||||
"efiTitle": "Disco EFI",
|
||||
"efiBody": "Cuando se selecciona OVMF (UEFI), ProxMenux crea automáticamente un disco EFI de 4 MB en el almacenamiento que elijas, formateado para coincidir con el tipo de almacenamiento (raw para almacenamiento basado en directorio).",
|
||||
"isoTitle": "Montaje de la ISO",
|
||||
"isoBodyRich": "La ISO de instalación se descarga (si hace falta) y se adjunta a <code>ide2</code> como CD-ROM, lista para el primer arranque.",
|
||||
"guestTitle": "QEMU Guest Agent",
|
||||
"guestBody": "El canal del guest agent se habilita en la configuración de la VM. Aún tienes que instalar el agente dentro del guest una vez el SO NAS esté arriba."
|
||||
},
|
||||
"endToEnd": {
|
||||
"heading": "Qué hace el script de principio a fin",
|
||||
"itemsRich": [
|
||||
"Detecta y descarga la última ISO estable (o usa la versión de fallback si el upstream no es accesible).",
|
||||
"Aplica la configuración por defecto o avanzada de CPU / RAM / BIOS / machine type.",
|
||||
"Abre el plan de almacenamiento y adjunta los discos virtuales, discos importados y dispositivos PCI seleccionados.",
|
||||
"Crea un disco EFI si se selecciona UEFI.",
|
||||
"Monta la ISO de instalación en <code>ide2</code>.",
|
||||
"Configura el orden de arranque (primero el disco, luego la ISO).",
|
||||
"Habilita el canal del QEMU Guest Agent.",
|
||||
"Opcionalmente ejecuta el asistente de passthrough de GPU.",
|
||||
"Genera una descripción HTML con estilo adjuntada a la VM.",
|
||||
"Arranca la VM si lo elegiste."
|
||||
]
|
||||
},
|
||||
"perSystem": {
|
||||
"heading": "Notas por sistema",
|
||||
"shellLabel": "Interfaz shell",
|
||||
"webLabel": "Interfaz web"
|
||||
},
|
||||
"systems": {
|
||||
"truenasScale": {
|
||||
"id": "truenas-scale",
|
||||
"title": "TrueNAS SCALE",
|
||||
"icon": "Database",
|
||||
"officialName": "TrueNAS SCALE",
|
||||
"officialUrl": "https://www.truenas.com/truenas-scale/",
|
||||
"description": "TrueNAS basado en Debian con apps Docker / Kubernetes, Linux KVM y ZFS como filesystem principal. El sucesor moderno de FreeNAS para quien quiere ZFS más un ecosistema de contenedores.",
|
||||
"specs": [
|
||||
"Interfaz recomendada: SATA o SCSI (ambas soportan discard/trim)",
|
||||
"RAM mínima: 8 GB (16 GB+ recomendado para cargas reales)",
|
||||
"Núcleos de CPU mínimos: 2 (4+ recomendado)",
|
||||
"Arranque UEFI (OVMF) recomendado",
|
||||
"Adaptador de red VirtIO para mejor throughput"
|
||||
],
|
||||
"shellImg": "/vm/truenas/truenas-scale-shell.png",
|
||||
"webImg": "/vm/truenas/truenas-scale-web.png",
|
||||
"shellAlt": "Interfaz shell de TrueNAS SCALE",
|
||||
"webAlt": "Interfaz web de TrueNAS SCALE"
|
||||
},
|
||||
"truenasCore": {
|
||||
"id": "truenas-core",
|
||||
"title": "TrueNAS CORE",
|
||||
"icon": "Database",
|
||||
"officialName": "TrueNAS CORE",
|
||||
"officialUrl": "https://www.truenas.com/truenas-core/",
|
||||
"description": "TrueNAS basado en FreeBSD (el antiguo FreeNAS). Almacenamiento ZFS maduro con jails y plugins, pero sin Docker / Kubernetes. Se está descontinuando en favor de SCALE pero sigue ampliamente desplegado.",
|
||||
"specs": [
|
||||
"Interfaz recomendada: SATA",
|
||||
"RAM mínima: 8 GB (16 GB+ recomendado)",
|
||||
"Núcleos de CPU mínimos: 2 (4+ recomendado)",
|
||||
"Arranque UEFI (OVMF) recomendado",
|
||||
"Adaptador de red VirtIO para mejor throughput"
|
||||
],
|
||||
"shellImg": "/vm/truenas/truenas-core-shell.png",
|
||||
"webImg": "/vm/truenas/truenas-core-web.png",
|
||||
"shellAlt": "Interfaz shell de TrueNAS CORE",
|
||||
"webAlt": "Interfaz web de TrueNAS CORE"
|
||||
},
|
||||
"openmediavault": {
|
||||
"id": "openmediavault",
|
||||
"title": "OpenMediaVault",
|
||||
"icon": "Server",
|
||||
"officialName": "openmediavault.org",
|
||||
"officialUrl": "https://www.openmediavault.org",
|
||||
"description": "NAS basado en Debian con un sistema modular de plugins. Ligero de recursos y fácil de correr en hardware modesto — la opción natural cuando no necesitas ZFS.",
|
||||
"specs": [
|
||||
"Interfaz recomendada: SATA o VirtIO",
|
||||
"RAM mínima: 2 GB (4 GB+ recomendado)",
|
||||
"Núcleos de CPU mínimos: 1 (2+ recomendado)",
|
||||
"BIOS: ProxMenux por defecto usa SeaBIOS para OMV (cámbialo en Avanzado si hace falta)",
|
||||
"Adaptador de red VirtIO para mejor throughput"
|
||||
],
|
||||
"shellImg": "/vm/openmediavault/openmediavault-shell.png",
|
||||
"webImg": "/vm/openmediavault/openmediavault-web.png",
|
||||
"shellAlt": "Interfaz shell de OpenMediaVault",
|
||||
"webAlt": "Interfaz web de OpenMediaVault"
|
||||
},
|
||||
"xigmanas": {
|
||||
"id": "xigmanas",
|
||||
"title": "XigmaNAS",
|
||||
"icon": "Database",
|
||||
"officialName": "xigmanas.com",
|
||||
"officialUrl": "https://www.xigmanas.com",
|
||||
"description": "NAS basado en FreeBSD — la continuación directa del código original de FreeNAS (0.7). Centrado en ZFS y simplicidad, con menor huella que TrueNAS.",
|
||||
"specs": [
|
||||
"Interfaz recomendada: SATA o SCSI",
|
||||
"RAM mínima: 4 GB (8 GB+ recomendado para ZFS)",
|
||||
"Núcleos de CPU mínimos: 2",
|
||||
"Arranque UEFI (OVMF) recomendado",
|
||||
"Adaptador de red VirtIO para mejor throughput"
|
||||
]
|
||||
},
|
||||
"rockstor": {
|
||||
"id": "rockstor",
|
||||
"title": "Rockstor",
|
||||
"icon": "HardDrive",
|
||||
"officialName": "rockstor.com",
|
||||
"officialUrl": "https://rockstor.com",
|
||||
"description": "NAS basado en openSUSE Leap construido en torno a Btrfs. Snapshots, subvolúmenes y el framework de apps Rock-ons (Docker) para multimedia, compartición de archivos y backup.",
|
||||
"specs": [
|
||||
"Interfaz recomendada: SATA o VirtIO",
|
||||
"RAM mínima: 2 GB (4 GB+ recomendado)",
|
||||
"Núcleos de CPU mínimos: 2",
|
||||
"Arranque UEFI (OVMF) recomendado",
|
||||
"Adaptador de red VirtIO para mejor throughput"
|
||||
],
|
||||
"shellImg": "/vm/rockstor/rockstor-shell.png",
|
||||
"webImg": "/vm/rockstor/rockstor-web.png",
|
||||
"shellAlt": "Interfaz shell de Rockstor",
|
||||
"webAlt": "Interfaz web de Rockstor"
|
||||
},
|
||||
"zimaos": {
|
||||
"id": "zimaos",
|
||||
"title": "ZimaOS",
|
||||
"icon": "MonitorIcon",
|
||||
"officialName": "zimaspace.com",
|
||||
"officialUrl": "https://www.zimaspace.com/zimaos",
|
||||
"description": "SO ligero de NAS / home server construido sobre Debian, con foco en multimedia, apps Docker y domótica. ZimaOS usa un instalador dedicado de ProxMenux (vm/zimaos.sh) que descarga una imagen pre-construida, pero el perfil de la VM sigue el mismo flujo que los otros sistemas NAS.",
|
||||
"specs": [
|
||||
"Interfaz recomendada: SATA o VirtIO",
|
||||
"RAM por defecto: 4 GB (suficiente para multimedia / apps autoalojadas)",
|
||||
"Núcleos de CPU mínimos: 2",
|
||||
"Arranque UEFI (OVMF)",
|
||||
"Adaptador de red VirtIO para mejor throughput"
|
||||
]
|
||||
}
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"itemsRich": [
|
||||
{
|
||||
"href": "/docs/create-vm/system-nas",
|
||||
"label": "Resumen de System NAS",
|
||||
"tail": " — comparativa rápida entre todas las opciones NAS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/create-vm/system-nas/synology",
|
||||
"label": "VM Synology",
|
||||
"tail": " — para el flujo de Synology DSM (Xpenology)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-vm",
|
||||
"label": "Importar disco a VM",
|
||||
"tail": " — recomendado para casos de uso NAS (discos reales > discos virtuales)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/zfs-commands",
|
||||
"label": "Comandos de gestión de ZFS",
|
||||
"tail": " — si eliges TrueNAS u otra distribución respaldada por ZFS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/create-vm",
|
||||
"label": "Resumen de Crear VM",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,259 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Crear VM: System Windows | ProxMenux Documentation",
|
||||
"description": "Crea y configura máquinas virtuales Windows en Proxmox VE con ProxMenux. Incluye rutas de ISO UUP Dump y ISO local, configuración por defecto / avanzada, plan de almacenamiento unificado, passthrough de GPU opcional, configuración de TPM 2.0 e instalación de drivers VirtIO.",
|
||||
"ogTitle": "Crear VM: System Windows | ProxMenux Documentation",
|
||||
"ogDescription": "Crea VMs Windows en Proxmox VE con ProxMenux. UUP Dump o ISO local, plan de almacenamiento unificado, passthrough de GPU opcional, TPM 2.0 y drivers VirtIO.",
|
||||
"ogImageAlt": "Menú de VM Windows de ProxMenux"
|
||||
},
|
||||
"header": {
|
||||
"title": "Crear VM: System Windows",
|
||||
"description": "Crea una VM Windows en Proxmox VE. ProxMenux gestiona la selección de ISO (UUP Dump o local), la configuración de CPU / RAM / machine type, el plan de almacenamiento unificado, el passthrough de GPU opcional, la configuración de TPM 2.0 y la instalación de drivers VirtIO.",
|
||||
"section": "Máquinas virtuales"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace este script",
|
||||
"body": "El flujo de Windows pregunta de dónde viene la ISO (UUP Dump o una copia local ya en <code>/var/lib/vz/template/iso</code>) y luego ejecuta el asistente de VM compartido. Aplica valores por defecto pensados para Windows — <code>q35</code> + OVMF + TPM 2.0 — adjunta la ISO de drivers VirtIO a un segundo slot de CD-ROM y te deja con una VM lista para arrancar el instalador de Windows."
|
||||
},
|
||||
"image": {
|
||||
"alt": "Opciones de instalación de Windows en ProxMenux",
|
||||
"caption": "Opciones de instalación de Windows"
|
||||
},
|
||||
"config": {
|
||||
"heading": "Configuración por defecto vs Avanzada",
|
||||
"intro": "Después de seleccionar la ISO, ProxMenux pregunta si usar el perfil de VM por defecto o abrir el asistente avanzado. El perfil por defecto está ajustado para ediciones modernas de Windows desktop y server.",
|
||||
"defaultHeading": "Configuración por defecto",
|
||||
"headerParam": "Parámetro",
|
||||
"headerValue": "Valor por defecto",
|
||||
"defaultRows": [
|
||||
{
|
||||
"param": "Machine type",
|
||||
"valueRich": "<code>q35</code>"
|
||||
},
|
||||
{
|
||||
"param": "BIOS",
|
||||
"value": "OVMF (UEFI)"
|
||||
},
|
||||
{
|
||||
"param": "CPU type",
|
||||
"value": "Host"
|
||||
},
|
||||
{
|
||||
"param": "Cores",
|
||||
"value": "4"
|
||||
},
|
||||
{
|
||||
"param": "RAM",
|
||||
"value": "8192 MB"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"valueRich": "<code>vmbr0</code>"
|
||||
},
|
||||
{
|
||||
"param": "MAC address",
|
||||
"value": "Generada automáticamente"
|
||||
},
|
||||
{
|
||||
"param": "TPM",
|
||||
"value": "Habilitado (v2.0)"
|
||||
},
|
||||
{
|
||||
"param": "Start on completion",
|
||||
"value": "No"
|
||||
}
|
||||
],
|
||||
"advancedHeading": "Configuración avanzada",
|
||||
"advancedIntro": "El asistente avanzado expone cada parámetro de forma individual:",
|
||||
"headerOptions": "Opciones",
|
||||
"advancedRows": [
|
||||
{
|
||||
"param": "Machine type",
|
||||
"optionsRich": "<code>q35</code> o <code>i440fx</code>"
|
||||
},
|
||||
{
|
||||
"param": "BIOS",
|
||||
"options": "OVMF (UEFI) o SeaBIOS (Legacy)"
|
||||
},
|
||||
{
|
||||
"param": "CPU type",
|
||||
"options": "Host o KVM64"
|
||||
},
|
||||
{
|
||||
"param": "Cores",
|
||||
"options": "Número de núcleos de CPU"
|
||||
},
|
||||
{
|
||||
"param": "RAM",
|
||||
"options": "Memoria asignada a la VM"
|
||||
},
|
||||
{
|
||||
"param": "Bridge",
|
||||
"options": "Bridge de red"
|
||||
},
|
||||
{
|
||||
"param": "MAC address",
|
||||
"options": "MAC personalizada"
|
||||
},
|
||||
{
|
||||
"param": "VLAN",
|
||||
"options": "Tag VLAN (opcional)"
|
||||
},
|
||||
{
|
||||
"param": "MTU",
|
||||
"options": "Tamaño de la MTU"
|
||||
},
|
||||
{
|
||||
"param": "TPM",
|
||||
"options": "Habilitar o deshabilitar TPM 2.0"
|
||||
}
|
||||
],
|
||||
"tpmWarnTitle": "Windows 11 y Windows Server 2022 necesitan TPM",
|
||||
"tpmWarnBody": "Windows 11 y Windows Server 2022 se niegan a instalarse sin un dispositivo TPM 2.0 adjunto a la VM. ProxMenux lo añade por defecto; deshabilítalo en Avanzado solo si sabes que la edición destino no lo requiere."
|
||||
},
|
||||
"storagePlan": {
|
||||
"heading": "Plan de almacenamiento",
|
||||
"body": "Después de CPU / RAM, ProxMenux abre el menú <strong>Storage Plan</strong>, donde puedes combinar discos virtuales, discos importados y dispositivos PCI passthrough en la misma VM, añadiendo items uno a uno y terminando cuando hayas acabado.",
|
||||
"virtualDiskTitle": "a. Añadir disco virtual",
|
||||
"virtualDiskItems": [
|
||||
"Lista los volúmenes de almacenamiento Proxmox disponibles en el host.",
|
||||
"Eliges el almacenamiento destino y el tamaño en GB.",
|
||||
"El disco se adjunta a la VM como SATA (<code>sata0</code>, <code>sata1</code>, … hasta 6)."
|
||||
],
|
||||
"importDiskTitle": "b. Añadir disco importado",
|
||||
"importDiskItems": [
|
||||
"Detecta los discos físicos que es seguro importar (los discos del sistema y protegidos están ocultos).",
|
||||
"Seleccionas uno o varios discos mediante una checklist.",
|
||||
"Los discos importados se adjuntan como SATA mediante <code>qm set</code>."
|
||||
],
|
||||
"pciTitle": "c. Añadir controladora o NVMe (PCI passthrough)",
|
||||
"pciItems": [
|
||||
"Detecta HBAs SATA/SAS y dispositivos NVMe del host y te deja pasar una <em>controladora entera</em> a la VM. IOMMU debe estar habilitado; el script se ofrece a habilitarlo y reinicia si hace falta.",
|
||||
"Un paso de confirmación advierte del riesgo a nivel de controladora (la tarjeta completa, incluidos todos los discos que tenga, deja de estar en el host).",
|
||||
"Los dispositivos PCI seleccionados se adjuntan mediante <code>qm set hostpciN: …</code>."
|
||||
],
|
||||
"resetTitle": "Resetear y terminar",
|
||||
"resetBody": "El menú también ofrece <strong>r</strong> (resetear la selección actual y empezar de nuevo) y <strong>d</strong> (terminar y continuar). No puedes terminar con un plan vacío."
|
||||
},
|
||||
"gpu": {
|
||||
"heading": "Passthrough de GPU opcional",
|
||||
"body": "Después del plan de almacenamiento, si se detecta una GPU compatible en el host ProxMenux ofrece lanzar el asistente de passthrough de GPU. Consulta <gpuLink>Añadir GPU a una VM (Passthrough)</gpuLink> para ver cómo funciona el asistente — puede que sea necesario reiniciar el host."
|
||||
},
|
||||
"autoFeatures": {
|
||||
"heading": "Funciones automáticas de la VM",
|
||||
"efiTitle": "Disco EFI",
|
||||
"efiBody": "Cuando se selecciona OVMF (UEFI), ProxMenux crea un disco EFI de 4 MB en el almacenamiento que elijas y lo adjunta a la VM para que el firmware UEFI tenga dónde guardar sus variables.",
|
||||
"tpmTitle": "TPM 2.0",
|
||||
"tpmBody": "Se añade automáticamente un dispositivo TPM 2.0 virtual para que los instaladores de Windows 11 / Server 2022 pasen el chequeo de compatibilidad de hardware.",
|
||||
"isoTitle": "Montaje de la ISO",
|
||||
"isoBody": "La ISO de instalación se adjunta a <code>ide2</code>. La ISO de drivers VirtIO se descarga (si hace falta) y se adjunta a <code>ide3</code>, lista para el paso <em>Load driver</em>.",
|
||||
"guestTitle": "QEMU Guest Agent",
|
||||
"guestBody": "El canal del guest agent se habilita en la configuración de la VM. El agente como tal se instala dentro de Windows ejecutando <code>virtio-win-guest-tools.exe</code> después del setup."
|
||||
},
|
||||
"installOptions": {
|
||||
"heading": "Opciones de instalación de Windows",
|
||||
"intro": "ProxMenux ofrece dos métodos para obtener el medio de instalación de Windows:",
|
||||
"uupTitle": "UUP Dump ISO Creator",
|
||||
"uupLogoAlt": "Logo de UUP Dump",
|
||||
"uupBody": "El script <strong>UUP Dump ISO Creator</strong> es una utilidad de ProxMenux que construye una ISO de Windows al vuelo desde los servidores de Windows Update de Microsoft. Trae archivos de instalación oficiales y limpios (incluyendo builds Insider Preview).",
|
||||
"uupItems": [
|
||||
"Acceso a las últimas builds de Windows.",
|
||||
"Soporta versiones Insider Preview.",
|
||||
"Archivos de instalación oficiales y limpios de Microsoft.",
|
||||
"Creación y montaje automático de la ISO en la VM.",
|
||||
"Soporta ediciones Home, Pro y Enterprise."
|
||||
],
|
||||
"uupLearnMore": "Más información sobre UUP Dump ISO Creator",
|
||||
"localTitle": "Instalar con ISO local",
|
||||
"localBody": "Usa una ISO de Windows que ya hayas subido al almacenamiento local del host (<code>/var/lib/vz/template/iso</code>). El script lista cada ISO que no sea de VirtIO y te deja elegir una.",
|
||||
"localImageAlt": "Menú de selección de ISO local",
|
||||
"localImageCaption": "Menú de selección de ISO local"
|
||||
},
|
||||
"endToEnd": {
|
||||
"heading": "Qué hace el script de principio a fin",
|
||||
"items": [
|
||||
"Obtiene la ISO de Windows (build de UUP Dump o copia local).",
|
||||
"Aplica la configuración por defecto o avanzada de CPU / RAM / BIOS / machine type.",
|
||||
"Abre el plan de almacenamiento y adjunta los discos virtuales, discos importados y dispositivos PCI seleccionados.",
|
||||
"Crea el disco EFI (instalaciones UEFI) y adjunta el dispositivo TPM 2.0.",
|
||||
"Monta la ISO de Windows en <code>ide2</code>.",
|
||||
"Descarga y monta la ISO de drivers VirtIO en <code>ide3</code>.",
|
||||
"Configura el orden de arranque (primero el disco, luego la ISO).",
|
||||
"Habilita el canal del QEMU Guest Agent.",
|
||||
"Opcionalmente ejecuta el asistente de passthrough de GPU.",
|
||||
"Genera una descripción HTML con estilo adjuntada a la VM.",
|
||||
"Arranca la VM si lo elegiste."
|
||||
]
|
||||
},
|
||||
"virtio": {
|
||||
"heading": "Drivers VirtIO durante la instalación",
|
||||
"body": "Si dejas almacenamiento y red en los valores por defecto (SATA + e1000), Windows instalará sin pasos extra. Eso sí, el plan de almacenamiento de Proxmox siempre adjunta los discos virtuales como SATA, lo cual funciona por defecto. Donde VirtIO se vuelve relevante es si, durante el asistente avanzado, eliges VirtIO o SCSI para los discos o VirtIO para la NIC — en ese caso Windows no verá esos dispositivos hasta que se cargue el driver correspondiente desde la ISO de VirtIO montada en <code>ide3</code>.",
|
||||
"warnTitle": "Sin el driver de red VirtIO no hay internet durante la instalación",
|
||||
"warnBody": "Si elegiste VirtIO (<code>virtio</code>) como interfaz de red y no cargas el driver durante el setup, Windows no tendrá acceso a internet. Eso puede bloquear los pasos de activación y de Windows Update en el primer arranque.",
|
||||
"stepLabel": "Paso",
|
||||
"steps": [
|
||||
{
|
||||
"title": "Accede a la pantalla \"¿Dónde quieres instalar Windows?\"",
|
||||
"body": "Durante el setup de Windows, si no aparece ningún disco, el driver de almacenamiento de la interfaz que elegiste (SCSI o VirtIO) aún no está cargado. Cárgalo manualmente desde la ISO de VirtIO montada.",
|
||||
"img": "/vm/windows/virtio-step-1.png",
|
||||
"caption": "Setup de Windows sin discos visibles"
|
||||
},
|
||||
{
|
||||
"title": "Pulsa \"Load driver\"",
|
||||
"bodyRich": "Pulsa <strong>Load driver</strong> para navegar por la ISO de VirtIO montada y elegir el driver de almacenamiento que corresponda a la interfaz que elegiste.",
|
||||
"img": "/vm/windows/virtio-step-2.png",
|
||||
"caption": "Pulsa Load driver para navegar por la ISO de VirtIO"
|
||||
},
|
||||
{
|
||||
"title": "Navega a la carpeta de drivers correcta",
|
||||
"bodyRich": "En la ISO de VirtIO navega a la carpeta que coincida con la interfaz y la versión de Windows — por ejemplo <code>viostor</code> para VirtIO SCSI, con subcarpetas por edición de Windows (10 / 11 / Server).",
|
||||
"img": "/vm/windows/virtio-step-3.png",
|
||||
"caption": "Navega a la carpeta de drivers adecuada"
|
||||
},
|
||||
{
|
||||
"title": "Selecciona el driver",
|
||||
"bodyRich": "Windows lista los drivers disponibles. Elige el que coincida con tu configuración (normalmente <strong>Red Hat VirtIO SCSI controller</strong>) y pulsa <strong>Siguiente</strong>.",
|
||||
"img": "/vm/windows/virtio-step-4.png",
|
||||
"caption": "Selecciona el driver VirtIO que coincida con tu interfaz de disco"
|
||||
},
|
||||
{
|
||||
"title": "(Opcional) Instala el driver de red",
|
||||
"bodyRich": "Si también elegiste VirtIO como interfaz de red, carga el driver de red desde la carpeta <code>NetKVM</code> de la misma ISO, seleccionando la subcarpeta de tu versión de Windows. Sin este paso Windows se instala sin acceso a internet.",
|
||||
"img": "/vm/windows/virtio-step-5.png",
|
||||
"caption": "Carga el driver de red VirtIO para tener internet durante la instalación"
|
||||
}
|
||||
],
|
||||
"tipTitle": "Post-instalación: ejecuta virtio-win-guest-tools.exe",
|
||||
"tipBody": "Después de instalar Windows, abre la ISO de VirtIO desde el Explorador de archivos y ejecuta <code>virtio-win-guest-tools.exe</code>. Instala el resto de drivers (red, pantalla, entrada, ballooning, QEMU Guest Agent) de una vez."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/utils/UUp-Dump-ISO-Creator",
|
||||
"label": "UUP Dump ISO Creator",
|
||||
"tail": " — genera ISOs de instalación de Windows actualizadas en el host Proxmox."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-image-vm",
|
||||
"label": "Importar imagen de disco a VM",
|
||||
"tail": " — adjunta un .vhdx / .vmdk existente de Windows a una VM nueva."
|
||||
},
|
||||
{
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"tail": " — para VMs Windows con GPU acelerada por hardware."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/vm-ct-commands",
|
||||
"label": "Comandos de gestión de VM y CT",
|
||||
"tail": " — referencia CLI de qm."
|
||||
},
|
||||
{
|
||||
"href": "/docs/create-vm",
|
||||
"label": "Resumen de Crear VM",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir controladora o NVMe a VM | ProxMenux Documentation",
|
||||
"description": "PCI passthrough de una controladora de almacenamiento (HBA SATA / SAS) o un dispositivo NVMe a una VM Proxmox usando ProxMenux. Gestiona la habilitación de IOMMU, la detección de conflictos y el conexionado con qm set --hostpci.",
|
||||
"ogTitle": "Añadir controladora o NVMe a VM | ProxMenux Documentation",
|
||||
"ogDescription": "Pasa un HBA SATA / SAS entero o un dispositivo NVMe a una VM Proxmox. ProxMenux gestiona IOMMU, detección de conflictos y conexionado hostpci."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir controladora o NVMe a VM",
|
||||
"description": "Pasa un host bus adapter (HBA) SATA / SAS entero o un dispositivo NVMe a una VM Proxmox mediante PCI passthrough. ProxMenux comprueba — y, con tu consentimiento, habilita — IOMMU, enumera los dispositivos elegibles para passthrough, filtra los conflictos y conecta la asignación con qm set --hostpci.",
|
||||
"section": "Disk Manager · VM"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace (y qué no hace) esto",
|
||||
"body": "Esto es <strong>passthrough a nivel de dispositivo</strong>: la tarjeta PCIe sale de la vista del kernel del host y se vincula a <code>vfio-pci</code>. La VM ve la propia controladora — no los discos individuales que hay detrás — y carga su propio driver para ese modelo concreto. Cada disco adjunto a esa controladora la sigue automáticamente, con datos SMART nativos, todas las funciones del firmware y sin ninguna capa de Proxmox en medio."
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene dos fases con separación clara entre \"recopilar información, comprobar IOMMU y listar candidatos\" y \"adjuntar realmente el dispositivo PCI\". Hasta la confirmación final no se escribe nada en la configuración de la VM."
|
||||
},
|
||||
"iommu": {
|
||||
"heading": "Grupos IOMMU — por qué la tarjeta entera sale a la vez",
|
||||
"body": "El PCI passthrough se hace por <strong>grupo IOMMU</strong>, que es la unidad más pequeña que el IOMMU de la CPU puede aislar. Todo lo que hay dentro de un grupo se mueve junto. Si tu controladora SATA comparte grupo IOMMU con la controladora USB, pasar la tarjeta SATA a una VM se lleva también los puertos USB — algo a menudo no deseado.",
|
||||
"outro": "ProxMenux muestra el grupo IOMMU junto a cada dispositivo y te avisa cuando un grupo lleva algo más que la controladora que quieres. Aún así puedes continuar si los dispositivos extra del grupo son aceptables (todas controladoras de disco, por ejemplo), o echar atrás si no lo son."
|
||||
},
|
||||
"prereqs": {
|
||||
"heading": "Requisitos previos",
|
||||
"items": [
|
||||
"La <strong>CPU y la placa base soportan</strong> VT-d (Intel) o AMD-Vi, y está habilitado en el firmware (BIOS/UEFI). ProxMenux puede habilitar la parte del kernel por ti, pero no puede tocar el switch del firmware.",
|
||||
"La VM destino está <strong>apagada</strong> antes de adjuntar dispositivos PCI.",
|
||||
"La controladora/NVMe <strong>no es la que contiene el filesystem raíz de Proxmox</strong>. El script oculta cualquier cosa en uso por el host.",
|
||||
"El SO guest tiene drivers para el modelo de la controladora. Linux cubre prácticamente cualquier HBA por defecto; Windows necesita el driver del fabricante instalado <em>antes</em> de arrancar con la controladora adjuntada."
|
||||
],
|
||||
"warnTitle": "La migración en vivo no es posible",
|
||||
"warnBody": "Una VM con PCI passthrough está atada al nodo que físicamente tiene la tarjeta. La migración en vivo entre nodos fallará. Planifica los backups / replicación en consecuencia."
|
||||
},
|
||||
"steps": {
|
||||
"heading": "Paso a paso",
|
||||
"stepLabel": "Paso",
|
||||
"list": [
|
||||
{
|
||||
"title": "Elige la VM destino",
|
||||
"bodyRich": "ProxMenux lee <code>qm list</code> y muestra cada VM. Elige la que recibirá la controladora.",
|
||||
"img": "/disk/nvme-passthrough/vm-selection.png",
|
||||
"alt": "Diálogo de selección de VM",
|
||||
"caption": "Diálogo de selección de VM"
|
||||
},
|
||||
{
|
||||
"title": "Comprobación de IOMMU",
|
||||
"bodyRich": "Si IOMMU no está habilitado en la cmdline del kernel, ProxMenux se ofrece a habilitarlo. Edita <code>/etc/kernel/cmdline</code> (para systemd-boot) o <code>/etc/default/grub</code> (para GRUB) y añade el parámetro correcto para tu CPU:",
|
||||
"items": [
|
||||
"<code>intel_iommu=on</code> para CPUs Intel.",
|
||||
"<code>amd_iommu=on</code> para CPUs AMD."
|
||||
],
|
||||
"outro": "Es necesario reiniciar después de este cambio. El script te pide reiniciar ahora o más tarde; el passthrough no puede continuar hasta que la nueva cmdline del kernel esté activa.",
|
||||
"img": "/disk/nvme-passthrough/iommu-warning.png",
|
||||
"alt": "Diálogo IOMMU Required",
|
||||
"caption": "IOMMU Required — propuesta de habilitar y reiniciar"
|
||||
},
|
||||
{
|
||||
"title": "Enumeración de dispositivos",
|
||||
"body": "ProxMenux lista cada controladora de almacenamiento (HBA SATA / SAS) y cada dispositivo NVMe del bus PCI. Para cada dispositivo muestra:",
|
||||
"items": [
|
||||
"Dirección PCI (<code>00:17.0</code>, <code>01:00.0</code>, …).",
|
||||
"Descripción del fabricante / dispositivo.",
|
||||
"Grupo IOMMU — y un aviso ⚠ si el grupo se comparte con otros dispositivos no relacionados.",
|
||||
"Los discos que hay actualmente detrás de la controladora (para que sepas qué la seguirá a la VM)."
|
||||
],
|
||||
"img": "/disk/nvme-passthrough/device-list.png",
|
||||
"alt": "Enumeración de dispositivos controladora / NVMe",
|
||||
"caption": "Enumeración de dispositivos controladora / NVMe con info de grupo IOMMU"
|
||||
},
|
||||
{
|
||||
"title": "Detección de conflictos",
|
||||
"bodyRich": "El script bloquea los dispositivos claramente inseguros: ya asignados a otra VM (vía <code>hostpci</code> en la config de esa VM), en uso por el host (controladora del disco raíz) o en un grupo IOMMU cuyos otros miembros el script no puede identificar de forma segura. Los dispositivos elegibles quedan disponibles para selección.",
|
||||
"img": "/disk/nvme-passthrough/conflict-warning.png",
|
||||
"alt": "Aviso de detección de conflicto",
|
||||
"caption": "Detección de conflictos — dispositivo bloqueado con motivo"
|
||||
},
|
||||
{
|
||||
"title": "Adjuntar y finalizar",
|
||||
"bodyRich": "Para cada dispositivo seleccionado ProxMenux ejecuta <code>qm set <VMID> --hostpciN <pci-addr>,pcie=1</code>, eligiendo el siguiente slot <code>hostpci</code> libre. Si se habilitó IOMMU durante esta sesión se te recuerda que reinicies antes de arrancar la VM.",
|
||||
"img": "/disk/nvme-passthrough/assignment.png",
|
||||
"alt": "Resumen de asignación",
|
||||
"caption": "Resumen de asignación — slots hostpciN y direcciones PCI adjuntadas"
|
||||
}
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noGroupsTitle": "IOMMU habilitado pero no hay grupos en /sys/kernel/iommu_groups/",
|
||||
"noGroupsBody": "Es necesario reiniciar para que la cmdline del kernel surta efecto. Si los grupos siguen sin aparecer después de reiniciar, lo más probable es que VT-d / AMD-Vi esté deshabilitado en el firmware — revisa el setup de la BIOS/UEFI.",
|
||||
"busyTitle": "La VM no arranca con \"hostpciN: device busy\"",
|
||||
"busyBody": "Otro proceso aún retiene el dispositivo PCI. Causas más comunes: una VM anterior que crasheó sin soltarlo, o el kernel del host lo recuperó en el último arranque. Ejecuta <code>lspci -nnk -s <addr></code> para ver qué driver está vinculado; debería ser <code>vfio-pci</code>. Un reinicio completo del host suele resolverlo.",
|
||||
"noDisksTitle": "El guest ve la controladora pero no los discos",
|
||||
"noDisksBody": "El modelo de la controladora no tiene driver en el guest. Linux casi nunca tiene este problema; Windows sí — instala el driver del fabricante (p. ej. LSI / Broadcom para HBAs SAS antiguos) con la tarjeta desconectada y luego reinicia con la tarjeta adjuntada.",
|
||||
"sharedTitle": "Grupo IOMMU compartido que exporta también un dispositivo no relacionado",
|
||||
"sharedBody": "Opciones: (a) mover la tarjeta a un slot PCIe distinto para cambiar su grupo, (b) habilitar <em>ACS override</em> en el kernel para separar grupos (compromiso de seguridad — investiga antes de aplicarlo), o (c) elegir otra tarjeta en un grupo más limpio."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-vm",
|
||||
"label": "Importar disco a VM",
|
||||
"tail": " — modelo alternativo: adjuntar un disco físico vía Proxmox sin passthrough PCIe completo."
|
||||
},
|
||||
{
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"tail": " — los mismos conceptos de IOMMU / VFIO aplicados a una GPU."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"tail": " — los comandos de verificación de IOMMU también aplican al passthrough de controladora / NVMe."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager",
|
||||
"label": "Resumen de Disk Manager",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Formatear / borrar disco físico | ProxMenux Documentation",
|
||||
"description": "Wipe seguro y formateo de disco físico en Proxmox VE usando ProxMenux. Cuatro modos de operación, filtros estrictos de seguridad (discos del sistema / montados / en uso bloqueados) y doble confirmación incluyendo tecleo de la ruta completa.",
|
||||
"ogTitle": "Formatear / borrar disco físico | ProxMenux Documentation",
|
||||
"ogDescription": "Borra o formatea de forma segura un disco físico en Proxmox. Reglas de visibilidad seguras, 4 modos de operación, doble confirmación."
|
||||
},
|
||||
"header": {
|
||||
"title": "Formatear / borrar disco físico",
|
||||
"description": "Borra o formatea de forma segura un disco físico en el host Proxmox. ProxMenux solo muestra discos completamente libres (sin uso del sistema, sin referencia de guest, sin montajes) y exige una doble confirmación — sí/no más teclear la ruta completa del disco — antes de destruir cualquier dato.",
|
||||
"section": "Disk Manager · Utilidades"
|
||||
},
|
||||
"danger": {
|
||||
"title": "Herramienta destructiva",
|
||||
"body": "Cada operación aquí escribe en el disco. No hay vuelta atrás. ProxMenux aplica filtros y confirmaciones estrictas de seguridad, pero la responsabilidad de elegir el disco correcto es tuya. Lee la ruta del disco en voz alta dos veces antes de teclearla."
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene dos fases con un filtro de seguridad de triple puerta en medio. La lista de discos, el modo de operación y los detalles del filesystem se recopilan todos en la Fase 1; no se escribe nada hasta que la Fase 2 pasa una revalidación final justo antes de ejecutar."
|
||||
},
|
||||
"visibility": {
|
||||
"heading": "Reglas de visibilidad",
|
||||
"intro": "Antes incluso de que aparezca el menú, ProxMenux filtra la lista de discos. Solo se muestran los candidatos demostrablemente seguros:",
|
||||
"items": [
|
||||
"<strong>Mostrados</strong> — discos que <em>no</em> usa el host (root pool, swap, montados, miembros activos de ZFS/LVM/RAID) y que <em>no</em> están referenciados por ninguna config de VM/LXC (en ejecución o parada).",
|
||||
"<strong>Ocultos</strong> — discos del host / sistema.",
|
||||
"<strong>Ocultos</strong> — discos referenciados por una config de VM/LXC."
|
||||
],
|
||||
"safetyTitle": "Seguridad en confirmación y ejecución",
|
||||
"safetyItems": [
|
||||
"Los discos con metadatos obsoletos / activos muestran avisos detallados <em>antes</em> de confirmar.",
|
||||
"Los discos usados por una VM <strong>en ejecución</strong> están <strong>bloqueados de forma estricta</strong> en la confirmación.",
|
||||
"Los discos con particiones montadas están <strong>bloqueados de forma estricta</strong> en ejecución (se vuelve a revalidar justo antes de escribir).",
|
||||
"Siempre se requieren dos confirmaciones: diálogo <em>sí/no</em> + teclear la ruta completa del disco exactamente."
|
||||
]
|
||||
},
|
||||
"modes": {
|
||||
"heading": "Modos de operación",
|
||||
"intro": "Después de elegir un disco eliges uno de cuatro modos. Se diferencian en qué destruyen y qué dejan atrás:",
|
||||
"headerMode": "Modo",
|
||||
"headerPart": "Tabla de particiones",
|
||||
"headerData": "Datos",
|
||||
"headerUseCase": "Caso de uso",
|
||||
"rows": [
|
||||
{
|
||||
"mode": "1. Wipe all",
|
||||
"part": "Destruida",
|
||||
"data": "Firmas borradas",
|
||||
"useCase": "Empezar de cero: todo lo del disco se va, listo para una nueva distribución."
|
||||
},
|
||||
{
|
||||
"mode": "2. Remove FS labels",
|
||||
"part": "Preservada",
|
||||
"data": "Preservados",
|
||||
"useCase": "Limpia firmas obsoletas de ZFS / LVM / RAID para que el disco deje de ser reclamado automáticamente, sin tocar los datos."
|
||||
},
|
||||
{
|
||||
"mode": "3. Zero all data",
|
||||
"part": "Preservada",
|
||||
"data": "Destruidos (zerados)",
|
||||
"useCase": "Sanear antes de entregar el disco, manteniendo la distribución de particiones existente."
|
||||
},
|
||||
{
|
||||
"mode": "4. Full format",
|
||||
"part": "Nuevo GPT",
|
||||
"data": "Destruidos",
|
||||
"useCase": "Disco listo para usar con una única partición nueva y un filesystem fresco."
|
||||
}
|
||||
],
|
||||
"fullFormatOutro": "<strong>Full format</strong> continúa con dos diálogos extra:",
|
||||
"fullFormatItems": [
|
||||
"<strong>Filesystem</strong> — <code>ext4</code>, <code>xfs</code>, <code>exfat</code> (portable) o <code>btrfs</code>. Si faltan herramientas (por ejemplo <code>mkfs.btrfs</code>) aborta con un mensaje claro.",
|
||||
"<strong>Etiqueta</strong> — etiqueta opcional del filesystem para identificación."
|
||||
]
|
||||
},
|
||||
"steps": {
|
||||
"heading": "Paso a paso",
|
||||
"stepLabel": "Paso",
|
||||
"list": [
|
||||
{
|
||||
"title": "Elige un disco libre",
|
||||
"body": "ProxMenux lista cada disco que pasa los filtros de visibilidad de arriba. Los discos con marca ⚠ tienen metadatos obsoletos y se muestran con los detalles para que sepas qué estás a punto de sobrescribir."
|
||||
},
|
||||
{
|
||||
"title": "Elige un modo de operación",
|
||||
"bodyRich": "Elige entre <strong>Wipe all</strong>, <strong>Remove FS labels</strong>, <strong>Zero all data</strong> o <strong>Full format</strong> según la tabla de arriba."
|
||||
},
|
||||
{
|
||||
"title": "(Solo Full format) Elige filesystem y etiqueta",
|
||||
"body": "ext4 / xfs / exfat / btrfs, más una etiqueta opcional."
|
||||
},
|
||||
{
|
||||
"title": "Confirma dos veces",
|
||||
"bodyRich": "ProxMenux muestra un resumen de lo que va a pasar. Aceptas con un diálogo sí/no y <strong>tecleas la ruta completa del disco</strong> exactamente como se muestra (por ejemplo <code>/dev/sdc</code>). Cualquier otra cosa aborta."
|
||||
},
|
||||
{
|
||||
"title": "Revalidación y ejecución",
|
||||
"body": "Justo antes de escribir, el script vuelve a comprobar el estado del disco. Si entretanto se ha montado una partición o se ha arrancado una VM, la ejecución se aborta. Si no, se ejecuta la operación elegida y se imprime un resumen al final."
|
||||
}
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalentes manuales",
|
||||
"body": "Si prefieres ejecutar los comandos equivalentes a mano:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"notListedTitle": "Disco no listado en el menú",
|
||||
"notListedBody": "Se filtró por seguridad. Razones comunes: está montado (aunque sea en <code>/mnt/tmp</code>), es miembro activo de ZFS / LVM / RAID, está referenciado por una config de VM o LXC, o es tu disco raíz de Proxmox. Ejecuta <code>lsblk -f</code> y <code>cat /proc/mdstat</code> en el host para entender por qué.",
|
||||
"busyTitle": "\"Disk may be busy\" / unmount falló",
|
||||
"busyBody": "Algo sigue manteniendo un archivo abierto en una partición de ese disco — lo más habitual es un contenedor o un shell cuyo cwd está dentro de un mountpoint. Identifícalo con <code>lsof | grep /dev/sdX</code> o <code>fuser -vm /dev/sdX1</code>, párelo y vuelve a ejecutar la herramienta."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager/smart-disk-test",
|
||||
"label": "Salud y test SMART de disco",
|
||||
"tail": " — comprobar un disco antes / después del wipe para confirmar que está sano."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-vm",
|
||||
"label": "Importar disco a VM",
|
||||
"tail": " — pasar un disco recién formateado a una VM."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-local-disk",
|
||||
"label": "Añadir disco local como almacenamiento Proxmox",
|
||||
"tail": " — registrar un disco borrado como un pool de almacenamiento Proxmox."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"label": "Comandos de almacenamiento y discos",
|
||||
"tail": " — referencia de lsblk, blkid, parted."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager",
|
||||
"label": "Resumen de Disk Manager",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Importar imagen de disco a VM | ProxMenux Documentation",
|
||||
"description": "Importa un archivo de imagen de disco (.img / .qcow2 / .vmdk / .raw) a una VM Proxmox existente usando ProxMenux. Interfaz por imagen, emulación SSD y flag bootable, con qm importdisk por debajo.",
|
||||
"ogTitle": "Importar imagen de disco a VM | ProxMenux Documentation",
|
||||
"ogDescription": "Importa imágenes de disco .img / .qcow2 / .vmdk / .raw a una VM existente con ProxMenux. Usa qm importdisk por debajo."
|
||||
},
|
||||
"header": {
|
||||
"title": "Importar imagen de disco a VM",
|
||||
"description": "Importa un archivo de imagen de disco (.img, .qcow2, .vmdk o .raw) a una VM Proxmox existente. ProxMenux recopila todas las decisiones por adelantado — VM destino, almacenamiento Proxmox, directorio origen, interfaz, emulación SSD, orden de arranque — y luego ejecuta qm importdisk para cada imagen seleccionada.",
|
||||
"section": "Disk Manager · VM"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "A diferencia de <em>Importar disco a VM</em> (que adjunta un disco físico crudo), este flujo coge un <strong>archivo</strong> alojado en el host — exportado desde otro hipervisor, descargado como cloud image, extraído de un backup — y lo convierte en un disco de VM Proxmox propiamente dicho en el volumen de almacenamiento que elijas. El archivo original se conserva; ProxMenux lo copia, no lo mueve."
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene dos fases. La Fase 1 recopila por adelantado todas las decisiones (VM, almacenamiento, directorio origen, imágenes, opciones por imagen) mediante diálogos. La Fase 2 ejecuta <code>qm importdisk</code> para cada imagen seleccionada. Hasta que empieza la Fase 2 no se copia nada y no se toca la config de la VM."
|
||||
},
|
||||
"prereqs": {
|
||||
"heading": "Requisitos previos",
|
||||
"items": [
|
||||
"Al menos una VM definida en el host. La VM destino debería estar <strong>apagada</strong>.",
|
||||
"Al menos un archivo de imagen de un formato soportado en el directorio origen. Soportados: <code>.img</code>, <code>.qcow2</code>, <code>.vmdk</code>, <code>.raw</code>.",
|
||||
"Suficiente espacio libre en el almacenamiento Proxmox destino para alojar cada disco importado.",
|
||||
"ProxMenux busca imágenes en <code>/var/lib/vz/template/iso</code> por defecto. Cuando pregunte puedes apuntarle a cualquier otro directorio del host."
|
||||
]
|
||||
},
|
||||
"steps": {
|
||||
"heading": "Paso a paso",
|
||||
"stepLabel": "Paso",
|
||||
"list": [
|
||||
{
|
||||
"title": "Elige la VM destino",
|
||||
"bodyRich": "ProxMenux lee <code>qm list</code> y muestra cada VM. Elige la que recibirá el o los discos importados."
|
||||
},
|
||||
{
|
||||
"title": "Elige el almacenamiento Proxmox",
|
||||
"bodyRich": "La lista contiene todos los almacenamientos que tengan habilitado el content type <code>images</code>. Si solo hay un candidato se autoselecciona y se salta el diálogo."
|
||||
},
|
||||
{
|
||||
"title": "Elige el directorio origen",
|
||||
"bodyRich": "Elige el directorio por defecto (<code>/var/lib/vz/template/iso</code>) o teclea una ruta personalizada — normalmente donde descargaste / subiste la imagen. El script rechaza rutas que no existen."
|
||||
},
|
||||
{
|
||||
"title": "Elige una o varias imágenes",
|
||||
"bodyRich": "El directorio se escanea buscando archivos <code>.img</code> / <code>.qcow2</code> / <code>.vmdk</code> / <code>.raw</code>. Puedes seleccionar varias a la vez; cada una pasará por las opciones por imagen en el siguiente paso."
|
||||
},
|
||||
{
|
||||
"title": "Opciones por imagen",
|
||||
"intro": "Para cada imagen seleccionada ProxMenux pregunta:",
|
||||
"items": [
|
||||
"<strong>Interfaz</strong> — <code>scsi</code> (por defecto), <code>virtio</code>, <code>sata</code> o <code>ide</code>. Determina cómo verá el disco el guest.",
|
||||
"<strong>Emulación SSD</strong> — solo se ofrece para interfaces no-VirtIO. Añade <code>ssd=1</code> para que el guest anuncie el disco como solid-state (útil para TRIM / alineación a nivel de SO).",
|
||||
"<strong>Bootable</strong> — si es sí, ProxMenux añade el disco al orden de arranque para que se convierta en el dispositivo de arranque primario de la VM."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Importar y adjuntar",
|
||||
"bodyRich": "ProxMenux ejecuta <code>qm importdisk</code> para cada imagen (convirtiendo el formato al vuelo cuando hace falta), adjunta el disco resultante al siguiente slot libre (<code>scsiN</code>, <code>sataN</code>, …) con las opciones que elegiste y — si marcaste algún disco como bootable — actualiza el orden de arranque. El progreso se muestra en el terminal."
|
||||
}
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "La importación de una sola imagen se traduce a tres comandos <code>qm</code>:",
|
||||
"warnTitle": "Conversión de formato de imagen",
|
||||
"warnBody": "Cuando el almacenamiento destino no puede contener el formato origen de forma nativa (por ejemplo, el almacenamiento LVM no puede contener <code>.qcow2</code>), <code>qm importdisk</code> convierte la imagen de forma transparente. Esto puede tardar varios minutos en imágenes de varios GB; planifícalo y no interrumpas el script."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noImagesTitle": "\"No compatible disk images found\"",
|
||||
"noImagesBody": "El script escaneó el directorio pero no encontró ningún archivo <code>.img</code> / <code>.qcow2</code> / <code>.vmdk</code> / <code>.raw</code>. Comprueba la extensión (las mayúsculas importan), que el archivo esté directamente en el directorio seleccionado (no se buscan subdirectorios) y que los permisos permitan a root leerlo.",
|
||||
"slowTitle": "La importación va lenta",
|
||||
"slowBody": "Las conversiones VMDK → QCOW2 → raw están limitadas por CPU y E/S. La velocidad de importación depende de la velocidad de lectura del origen, la velocidad de escritura del almacenamiento destino y la CPU para descompresión. Prefiere orígenes raw o qcow2 cuando sea posible.",
|
||||
"uefiTitle": "El disco importado arranca en la UEFI shell",
|
||||
"uefiBody": "La imagen se construyó para legacy (SeaBIOS) pero la VM usa OVMF (o al revés). O bien cambia la BIOS de la VM en Proxmox para que coincida con la imagen, o reconstruye la imagen en el modo correcto antes de importar."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-vm",
|
||||
"label": "Importar disco a VM",
|
||||
"tail": " — mismo flujo pero para discos físicos crudos (passthrough)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils/import-vm",
|
||||
"label": "Importar VM desde OVA / OVF",
|
||||
"tail": " — cuando tienes un paquete completo de VM, no solo una imagen de disco."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils/UUp-Dump-ISO-Creator",
|
||||
"label": "UUP Dump ISO Creator",
|
||||
"tail": " — genera una ISO de Windows si necesitas una para una instalación nueva."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"label": "Comandos de almacenamiento y discos",
|
||||
"tail": " — referencia de qm importdisk y qemu-img convert."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager",
|
||||
"label": "Resumen de Disk Manager",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Importar disco a LXC | ProxMenux Documentation",
|
||||
"description": "Adjunta un disco físico a un contenedor LXC existente en Proxmox VE usando ProxMenux. Gestiona la detección / formateo del filesystem, el mount point, la conversión unprivileged → privilegiado y rutas de dispositivo persistentes.",
|
||||
"ogTitle": "Importar disco a LXC | ProxMenux Documentation",
|
||||
"ogDescription": "Adjunta un disco físico a un contenedor LXC existente. Gestiona el filesystem, el mount point y la conversión unprivileged → privilegiado."
|
||||
},
|
||||
"header": {
|
||||
"title": "Importar disco a LXC",
|
||||
"description": "Adjunta un disco físico a un contenedor LXC existente en el host Proxmox. ProxMenux detecta los discos libres, opcionalmente los formatea con un filesystem soportado y conecta la partición a un mount point dentro del contenedor usando rutas de dispositivo persistentes.",
|
||||
"section": "Disk Manager · LXC"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Passthrough en VM vs passthrough en LXC",
|
||||
"body": "El passthrough en LXC <strong>no es un block device crudo</strong>. El contenedor recibe un <em>mount point</em> — es decir, un directorio respaldado por una partición que eliges en el host. A diferencia de una VM, el kernel del guest es el del host, así que el filesystem (ext4 / xfs / btrfs) lo lee y lo gestiona el propio Proxmox y luego lo expone al contenedor."
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene dos fases con separación clara entre \"recopilar información y decisiones\" y \"cambiar realmente la configuración del contenedor\". Hasta la confirmación final no se monta nada en el CT.",
|
||||
"summary": "ProxMenux filtra el disco raíz, los discos montados y los discos ya referenciados por cualquier config de VM/LXC. Los discos con membresía ZFS/LVM/RAID activa están ocultos; las firmas obsoletas muestran una etiqueta ⚠ para que puedas borrarlas antes de formatear."
|
||||
},
|
||||
"prereqs": {
|
||||
"heading": "Requisitos previos",
|
||||
"items": [
|
||||
"Al menos un contenedor LXC definido en el host.",
|
||||
"El contenedor es <strong>privilegiado</strong>, o aceptas la propuesta del script de convertirlo.",
|
||||
"Al menos un disco físico que no esté en uso por el host ni por ningún otro guest."
|
||||
],
|
||||
"warnTitle": "Se requiere contenedor privilegiado",
|
||||
"warnBody": "El passthrough directo de dispositivos a un contenedor LXC solo funciona si el contenedor es <strong>privilegiado</strong>. Si el script detecta <code>unprivileged: 1</code> en la config, se ofrece a convertirlo in situ (edita <code>/etc/pve/lxc/<CTID>.conf</code>). Cancela si no puedes aceptar el compromiso de seguridad de un contenedor privilegiado."
|
||||
},
|
||||
"steps": {
|
||||
"heading": "Paso a paso",
|
||||
"stepLabel": "Paso",
|
||||
"list": [
|
||||
{
|
||||
"title": "Elige el contenedor destino",
|
||||
"img": "/disk/select-container.png",
|
||||
"caption": "Menú de selección de contenedor",
|
||||
"bodyRich": "ProxMenux lista cada contenedor LXC del host (<code>pct list</code>). Elige el que recibirá el disco. Si el contenedor es unprivileged se te ofrece convertirlo ahora."
|
||||
},
|
||||
{
|
||||
"title": "Elige el disco físico",
|
||||
"img": "/disk/disk-selection-ct.png",
|
||||
"caption": "Discos libres detectados en el host (con etiqueta ⚠ para metadatos obsoletos)",
|
||||
"bodyRich": "Solo se muestran los candidatos seguros. A diferencia del flujo de VM, este script adjunta <strong>un disco por ejecución</strong> — ejecútalo otra vez por cada disco extra que quieras añadir."
|
||||
},
|
||||
{
|
||||
"title": "Formatear o reutilizar",
|
||||
"intro": "El script inspecciona el disco:",
|
||||
"items": [
|
||||
"Si ya lleva un filesystem soportado (ext4 / xfs / btrfs) puedes reutilizarlo tal cual (los archivos existentes se preservan).",
|
||||
"Si no tiene un filesystem soportado se te ofrece formatearlo. Elige ext4 / xfs / btrfs."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Elige el mount point",
|
||||
"bodyRich": "Teclea la ruta donde el contenedor debería ver el disco, p. ej. <code>/mnt/data</code> o <code>/mnt/disk_passthrough</code>. Esta es la ruta <em>dentro</em> del contenedor; el host ya ve la partición en <code>/dev/disk/by-id/…</code>."
|
||||
},
|
||||
{
|
||||
"title": "Adjuntar y verificar",
|
||||
"img": "/disk/assignment-ct.png",
|
||||
"caption": "Asignación al CT",
|
||||
"bodyRich": "ProxMenux añade una nueva entrada <code>mpN:</code> a la config del contenedor, saltando los índices ya en uso, y vuelve a leer la config para confirmar. Si el contenedor está en ejecución el mount se aplica en vivo; si no, surte efecto en el siguiente arranque.",
|
||||
"extraImg": "/disk/result-point.png",
|
||||
"extraAlt": "Mount point creado correctamente",
|
||||
"extraCaption": "Mount point creado y verificado"
|
||||
}
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "El script envuelve <code>pct set</code>. Una invocación directa para un solo disco se ve así:"
|
||||
},
|
||||
"important": {
|
||||
"heading": "Consideraciones importantes",
|
||||
"items": [
|
||||
"<strong>Un disco por ejecución</strong>. Vuelve a ejecutar el script por cada disco adicional.",
|
||||
"<strong>No</strong> adjuntes la misma partición a varios contenedores que puedan montarla a la vez — las escrituras concurrentes corrompen el filesystem.",
|
||||
"Los <strong>metadatos antiguos</strong> (firmas RAID / ZFS / LVM) deben limpiarse manualmente antes de que el script te deje formatear, si no <code>mkfs</code> se niega a sobrescribir. Usa la herramienta <wipeLink>Formatear / borrar disco físico</wipeLink> para eso."
|
||||
]
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"unprivTitle": "\"Cannot continue with an unprivileged container\"",
|
||||
"unprivBody": "Rechazaste la oferta de conversión. O bien vuelves a ejecutar y aceptas la conversión, o conviertes el contenedor manualmente editando <code>/etc/pve/lxc/<CTID>.conf</code> y reemplazando <code>unprivileged: 1</code> por <code>unprivileged: 0</code>. También puedes reconstruir el contenedor como privilegiado si prefieres no convertirlo in situ.",
|
||||
"permsTitle": "Los permisos dentro del contenedor están mal",
|
||||
"permsBody": "Los mounts del host hacia un contenedor privilegiado entran como <code>root:root</code>. Si el servicio dentro del CT corre como otro usuario (p. ej. <code>www-data</code> para Nextcloud), haz <code>chown</code>/<code>chmod</code> dentro del contenedor para que coincida con su UID/GID después del primer mount."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-vm",
|
||||
"label": "Importar disco a VM",
|
||||
"tail": " — flujo equivalente para VMs."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-mount-points",
|
||||
"label": "Mount points LXC (Host ↔ CT)",
|
||||
"tail": " — compartir directorios del host con un CT en lugar de adjuntar un disco entero."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/vm-ct-commands",
|
||||
"label": "Comandos de gestión de VM y CT",
|
||||
"tail": " — referencia de pct config / push / pull."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager",
|
||||
"label": "Resumen de Disk Manager",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Importar disco a VM | ProxMenux Documentation",
|
||||
"description": "Adjunta un disco físico a una VM Proxmox existente con ProxMenux. Detección segura de discos (excluye sistema, montados, en uso, ZFS/RAID/LVM), rutas persistentes /dev/disk/by-id e interfaces SATA / SCSI / VirtIO / IDE.",
|
||||
"ogTitle": "Importar disco a VM | ProxMenux Documentation",
|
||||
"ogDescription": "Adjunta un disco físico a una VM Proxmox existente. Usa rutas persistentes /dev/disk/by-id y soporta SATA / SCSI / VirtIO / IDE."
|
||||
},
|
||||
"header": {
|
||||
"title": "Importar disco a VM",
|
||||
"description": "Adjunta un disco físico ya existente en el host Proxmox a una máquina virtual existente. ProxMenux detecta los discos libres, te deja elegir la VM destino y el tipo de bus (SATA / SCSI / VirtIO / IDE), y lo adjunta todo usando rutas persistentes /dev/disk/by-id para que el mapeo sobreviva a reinicios y cambios en el orden de los dispositivos.",
|
||||
"section": "Disk Manager · VM"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Esto es un passthrough de disco crudo: el SO guest ve la unidad como un block device real (con sus datos SMART y geometría nativa). El disco se adjunta por su ruta <code>/dev/disk/by-id/…</code> — no <code>/dev/sdX</code> — para que la asignación no se rompa si las controladoras de disco enumeran los dispositivos en otro orden en el siguiente arranque."
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene dos fases con separación clara entre \"recopilar información y decisiones\" y \"adjuntar realmente discos a la VM\". Hasta la confirmación final, la config de la VM queda intacta.",
|
||||
"summary": "ProxMenux filtra todo lo que no puede pasar de forma segura: el disco raíz, los discos montados en el host, los miembros de un pool ZFS/LVM/RAID activo y los discos ya referenciados por cualquier config de VM/LXC. Los discos con metadatos <em>obsoletos</em> (firmas viejas de ZFS / RAID / LVM que ya no están en uso) se muestran con etiqueta ⚠ pero no se bloquean."
|
||||
},
|
||||
"prereqs": {
|
||||
"heading": "Requisitos previos",
|
||||
"items": [
|
||||
"Al menos una VM definida en el host (el script delega directamente en <code>qm list</code>).",
|
||||
"La <strong>VM destino está apagada</strong>. Si está en ejecución el script aborta con un mensaje — el hot-add de disco en vivo queda fuera del alcance de este flujo.",
|
||||
"Al menos un disco físico en el host que no esté en uso por el host ni por ningún otro guest."
|
||||
]
|
||||
},
|
||||
"steps": {
|
||||
"heading": "Paso a paso",
|
||||
"stepLabel": "Paso",
|
||||
"list": [
|
||||
{
|
||||
"title": "Elige la VM destino",
|
||||
"bodyRich": "ProxMenux lista cada VM del host (vía <code>qm list</code>). Elige la que recibirá el disco. Si la VM está en ejecución el script aborta y te pide que la apagues primero."
|
||||
},
|
||||
{
|
||||
"title": "Elige el o los discos físicos a adjuntar",
|
||||
"img": "/disk/disk-selection.png",
|
||||
"caption": "Discos libres detectados en el host (con etiqueta ⚠ para metadatos obsoletos)",
|
||||
"body": "El script escanea cada disco del host y solo muestra los que es seguro adjuntar. La checklist te permite seleccionar uno o varios a la vez. Los discos con firmas viejas de ZFS / LVM / RAID siguen apareciendo, etiquetados con ⚠ para que sepas que necesitan un wipe antes de que el guest pueda formatearlos."
|
||||
},
|
||||
{
|
||||
"title": "Elige la interfaz de bus",
|
||||
"img": "/disk/disk-assigment.png",
|
||||
"caption": "Selección de la interfaz de bus",
|
||||
"intro": "Elige cómo debería ver el disco el guest:",
|
||||
"items": [
|
||||
"<strong>SCSI</strong> — opción por defecto moderna para Linux y Windows con drivers VirtIO-SCSI instalados.",
|
||||
"<strong>SATA</strong> — amplia compatibilidad, funciona por defecto en prácticamente cualquier guest.",
|
||||
"<strong>VirtIO</strong> — block device paravirtualizado, el más rápido pero requiere drivers en el guest.",
|
||||
"<strong>IDE</strong> — para guests legacy que no tienen ninguno de los drivers anteriores."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Adjuntar y verificar",
|
||||
"bodyRich": "ProxMenux adjunta cada disco seleccionado con su mejor ruta <code>/dev/disk/by-id/</code>, salta los índices de slot que ya están en uso en la config de la VM (<code>scsi0</code>, <code>sata0</code>, …) y vuelve a leer la config para confirmar la asignación. Al final se imprime un resumen."
|
||||
}
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "El script es un wrapper alrededor de <code>qm set</code>. El comando exacto para un solo disco se ve así:",
|
||||
"migrationTitle": "La migración en vivo no es posible",
|
||||
"migrationBody": "Una VM con un disco en passthrough está <strong>atada al host que expone ese disco</strong>. La migración en vivo a otro nodo Proxmox fallará porque el nodo destino no ve la misma ruta <code>/dev/disk/by-id/…</code>. Usa replicación o backup/restore en su lugar, o elige discos virtuales en almacenamiento compartido si necesitas movilidad.",
|
||||
"shareTitle": "No compartas un disco físico entre VMs",
|
||||
"shareBody": "Adjuntar el mismo disco físico a dos VMs a la vez corromperá los datos en la siguiente escritura. ProxMenux detecta esta situación y la bloquea, pero si te saltas el script (un <code>qm set</code> directo), asegúrate de que solo un guest monte el disco."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noDisksTitle": "\"No disks available for this VM\"",
|
||||
"noDisksIntro": "El script encontró discos, pero todos los candidatos se filtraron. Razones comunes:",
|
||||
"noDisksItems": [
|
||||
"Cada disco restante ya está referenciado en la config de la VM destino.",
|
||||
"Cada disco restante está montado en el host o forma parte de un ZFS / LVM / RAID activo.",
|
||||
"El host solo tiene instalado el disco raíz."
|
||||
],
|
||||
"noDisksOutro": "Ejecuta <code>lsblk -f</code> en el host para revisar el estado de cada disco.",
|
||||
"noVisibleTitle": "La VM no ve el disco después de arrancar",
|
||||
"noVisibleBody": "Si elegiste <strong>SCSI</strong> o <strong>VirtIO</strong>, el guest necesita el driver correspondiente. En Linux es nativo del kernel; en Windows necesitas la ISO de VirtIO y una instalación de drivers (consulta la página <winLink>Crear VM: System Windows</winLink>). Cambiar a SATA en la pestaña de hardware de la VM es un workaround rápido para confirmar que el disco está físicamente adjuntado."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-image-vm",
|
||||
"label": "Importar imagen de disco a VM",
|
||||
"tail": " — mismo flujo pero para archivos de imagen (qcow2 / vmdk / raw / img)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager/import-disk-lxc",
|
||||
"label": "Importar disco a LXC",
|
||||
"tail": " — flujo equivalente para contenedores LXC."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager/add-controller-nvme-vm",
|
||||
"label": "Añadir controladora o NVMe a VM",
|
||||
"tail": " — cuando necesitas passthrough PCIe / NVMe completo en lugar de adjuntar discos."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"label": "Comandos de almacenamiento y discos",
|
||||
"tail": " — referencia de shell para qm importdisk y relacionados."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager",
|
||||
"label": "Resumen de Disk Manager",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Disk Manager de Proxmox — adjuntar discos a VMs / LXC, tests SMART, wipe | ProxMenux",
|
||||
"description": "Gestiona discos físicos en un host Proxmox VE con ProxMenux: pasa discos a VMs o contenedores LXC (qm set scsi/sata/virtio, pct mp), importa imágenes de disco qcow2 / vmdk / vdi, pasa HBAs o controladoras NVMe enteras, borra discos de forma segura y ejecuta self-tests SMART.",
|
||||
"ogTitle": "Disk Manager de Proxmox — adjuntar discos a VMs / LXC, tests SMART, wipe",
|
||||
"ogDescription": "Adjuntar discos a VMs / LXC, importar imágenes de disco, PCI passthrough para controladoras, wipe seguro y tests SMART en Proxmox VE.",
|
||||
"twitterTitle": "Disk Manager de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Adjuntar discos a VMs / LXC, importar imágenes, PCI passthrough, wipe seguro y tests SMART."
|
||||
},
|
||||
"header": {
|
||||
"title": "Disk Manager",
|
||||
"description": "El menú Disk Manager agrupa las herramientas de ProxMenux para gestionar discos físicos en un host Proxmox: adjuntar discos a VMs y contenedores LXC, importar imágenes de disco, pasar una controladora entera o un dispositivo NVMe, borrar discos de forma segura y ejecutar tests de salud SMART.",
|
||||
"section": "Disk Manager"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué sirve este menú",
|
||||
"body": "Cada opción aquí opera sobre <strong>discos físicos ya visibles para el host Proxmox</strong>. El menú está dividido en tres grupos — <strong>VM</strong> (adjuntar discos o importar imágenes a una máquina virtual), <strong>LXC</strong> (adjuntar discos a un contenedor) y <strong>Utilidades</strong> (format seguro, salud SMART). Los chequeos de seguridad se aplican en todas partes: los discos del sistema y los discos ya en uso están ocultos o bloqueados."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir el menú",
|
||||
"body": "Desde el menú principal de ProxMenux, selecciona <strong>Disk Manager</strong>. Verás esto:",
|
||||
"imageAlt": "Menú Disk Manager con los bloques VM, LXC y Utilidades"
|
||||
},
|
||||
"groups": {
|
||||
"heading": "Tres grupos de herramientas",
|
||||
"intro": "El menú Disk Manager está organizado en tres grupos — <strong>VM</strong>, <strong>LXC</strong> y <strong>Utilidades</strong>. Pulsa una tarjeta para ir directamente a las herramientas de ese grupo.",
|
||||
"vmTitle": "VM",
|
||||
"vmBody": "Herramientas que operan sobre máquinas virtuales existentes. La VM debe estar apagada; ProxMenux lo valida antes de tocar la configuración.",
|
||||
"vmItems": [
|
||||
"Importar disco a VM",
|
||||
"Importar imagen de disco a VM",
|
||||
"Añadir controladora o NVMe a VM"
|
||||
],
|
||||
"lxcTitle": "LXC",
|
||||
"lxcBody": "Herramientas que operan sobre contenedores existentes. El passthrough directo de dispositivos necesita un contenedor privilegiado; el script se ofrece a convertirlo si hace falta.",
|
||||
"lxcItems": [
|
||||
"Importar disco a LXC"
|
||||
],
|
||||
"utilitiesTitle": "Utilidades",
|
||||
"utilitiesBody": "Herramientas del lado del host que operan sobre los propios discos, independientemente de cualquier VM o contenedor.",
|
||||
"utilitiesItems": [
|
||||
"Formatear / borrar disco físico",
|
||||
"Salud y test SMART de disco"
|
||||
]
|
||||
},
|
||||
"vm": {
|
||||
"heading": "VM",
|
||||
"intro": "Herramientas que operan sobre máquinas virtuales existentes. La VM debe estar apagada; ProxMenux lo valida antes de tocar la configuración.",
|
||||
"options": [
|
||||
{
|
||||
"icon": "HardDrive",
|
||||
"href": "/docs/disk-manager/import-disk-vm",
|
||||
"title": "Importar disco a VM",
|
||||
"description": "Adjunta un disco físico no asignado a una VM existente. Soporta SATA / SCSI / VirtIO / IDE, usa rutas persistentes /dev/disk/by-id."
|
||||
},
|
||||
{
|
||||
"icon": "FileDown",
|
||||
"href": "/docs/disk-manager/import-disk-image-vm",
|
||||
"title": "Importar imagen de disco a VM",
|
||||
"description": "Importa archivos de imagen de disco (.img / .qcow2 / .vmdk / .raw) a una VM existente. Flujo en dos fases, qm importdisk por debajo."
|
||||
},
|
||||
{
|
||||
"icon": "Cpu",
|
||||
"href": "/docs/disk-manager/add-controller-nvme-vm",
|
||||
"title": "Añadir controladora o NVMe a VM",
|
||||
"description": "PCI passthrough de un HBA SATA / SAS entero o un dispositivo NVMe a una VM. Gestiona la habilitación de IOMMU y la detección de conflictos."
|
||||
}
|
||||
]
|
||||
},
|
||||
"lxc": {
|
||||
"heading": "LXC",
|
||||
"intro": "Herramientas que operan sobre contenedores LXC existentes. El passthrough directo de dispositivos requiere un contenedor privilegiado; el script se ofrece a convertir el contenedor si hace falta.",
|
||||
"options": [
|
||||
{
|
||||
"icon": "Boxes",
|
||||
"href": "/docs/disk-manager/import-disk-lxc",
|
||||
"title": "Importar disco a LXC",
|
||||
"description": "Adjunta un disco físico no asignado a un contenedor LXC existente como mount point. Gestiona la detección / formateo de filesystem y la conversión a privilegiado."
|
||||
}
|
||||
]
|
||||
},
|
||||
"utilities": {
|
||||
"heading": "Utilidades",
|
||||
"intro": "Herramientas del lado del host que operan sobre los propios discos, independientemente de cualquier VM o contenedor.",
|
||||
"options": [
|
||||
{
|
||||
"icon": "Eraser",
|
||||
"href": "/docs/disk-manager/format-disk",
|
||||
"title": "Formatear / borrar disco físico (seguro)",
|
||||
"description": "Wipe seguro de disco con controles estrictos: solo se muestran discos completamente libres y siempre se exige doble confirmación."
|
||||
},
|
||||
{
|
||||
"icon": "Activity",
|
||||
"href": "/docs/disk-manager/smart-disk-test",
|
||||
"title": "Salud y test SMART de disco",
|
||||
"description": "Ejecuta chequeos de salud SMART y self-tests cortos / largos en unidades SATA, SAS y NVMe. Exporta JSON para el Monitor."
|
||||
}
|
||||
]
|
||||
},
|
||||
"safety": {
|
||||
"title": "Reglas de seguridad comunes a todas las opciones",
|
||||
"intro": "ProxMenux filtra cualquier cosa que pueda dañar el host:",
|
||||
"items": [
|
||||
"El <strong>disco del sistema</strong> (root pool, swap, miembros activos de ZFS / LVM / RAID) está siempre oculto.",
|
||||
"Los discos <strong>montados</strong> en cualquier punto del host se ocultan o se bloquean en ejecución.",
|
||||
"Los discos <strong>referenciados por una VM o LXC en ejecución</strong> no se pueden reasignar ni borrar.",
|
||||
"Las operaciones que pueden cambiar el estado del host (habilitar IOMMU, wipe) requieren confirmación explícita."
|
||||
]
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share",
|
||||
"label": "Storage & Share Manager",
|
||||
"tail": " — registrar almacenamiento en el propio Proxmox (NFS / Samba / iSCSI / local) y compartir carpetas entre host y CTs."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"label": "Comandos de almacenamiento y discos",
|
||||
"tail": " — referencia de block devices, LVM, pvesm, SMART."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/zfs-commands",
|
||||
"label": "Comandos de gestión de ZFS",
|
||||
"tail": " — para pools y datasets ZFS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"tail": " — los mismos conceptos de IOMMU / VFIO aplicados a GPUs."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Salud y test SMART de disco | ProxMenux Documentation",
|
||||
"description": "Ejecuta chequeos de salud SMART y tests de disco en Proxmox VE con ProxMenux. Soporta SATA / SAS (smartmontools) y NVMe (nvme-cli). Self-tests cortos y largos, exportación JSON para integración con ProxMenux Monitor.",
|
||||
"ogTitle": "Salud y test SMART de disco | ProxMenux Documentation",
|
||||
"ogDescription": "Chequeos de salud SMART y self-tests para unidades SATA / SAS y NVMe en Proxmox. Exportación JSON para el Monitor."
|
||||
},
|
||||
"header": {
|
||||
"title": "Salud y test SMART de disco",
|
||||
"description": "Lee datos SMART y lanza self-tests en los discos físicos adjuntos al host Proxmox. ProxMenux instala automáticamente smartmontools para SATA / SAS y nvme-cli para NVMe, ejecuta la acción dentro del firmware de la unidad (los tests largos sobreviven al cierre del terminal) y exporta los resultados en JSON para el ProxMenux Monitor.",
|
||||
"section": "Disk Manager · Utilidades"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué sirve esto",
|
||||
"body": "SMART (Self-Monitoring, Analysis and Reporting Technology) permite que la propia unidad reporte su salud y ejecute self-tests. Esta herramienta expone esos datos sin que tengas que recordar la invocación correcta de <code>smartctl</code> / <code>nvme</code>, y persiste la salida como JSON para que el Monitor pueda graficar tendencias en el tiempo."
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Todas las acciones aquí son no destructivas — SMART lee los contadores del firmware de la unidad y los self-tests se ponen en cola dentro de la propia unidad. No hace falta separación de fases. El flujo es: chequeo de dependencias → selección de disco → selección de acción → invocación de la herramienta (smartctl o nvme-cli según el bus del disco) → salida impresa más exportación JSON para el Monitor."
|
||||
},
|
||||
"deps": {
|
||||
"heading": "Dependencias",
|
||||
"body": "La herramienta autoinstala lo que necesita en la primera ejecución. Las unidades SATA / SAS dependen de <code>smartmontools</code>; las unidades NVMe dependen de <code>nvme-cli</code>. Ambos:"
|
||||
},
|
||||
"actions": {
|
||||
"heading": "Acciones disponibles",
|
||||
"headerAction": "Acción",
|
||||
"headerWhat": "Qué lee / ejecuta",
|
||||
"headerDur": "Duración",
|
||||
"rows": [
|
||||
{
|
||||
"action": "Estado de salud rápido",
|
||||
"whatRich": "PASSED/FAILED global + atributos clave.<br /><code>smartctl -H</code> + <code>-A</code> (SATA/SAS) o <code>nvme smart-log</code> (NVMe).",
|
||||
"dur": "Instantáneo"
|
||||
},
|
||||
{
|
||||
"action": "Informe completo",
|
||||
"whatRich": "Datos SMART completos, scrollables. <code>smartctl -x</code> para SATA/SAS o <code>nvme smart-log</code> + <code>id-ctrl</code> para NVMe.",
|
||||
"dur": "Instantáneo"
|
||||
},
|
||||
{
|
||||
"action": "Test corto",
|
||||
"what": "Comprobación básica de superficie y eléctrica, encolada dentro del firmware de la unidad.",
|
||||
"dur": "~2 minutos"
|
||||
},
|
||||
{
|
||||
"action": "Test largo",
|
||||
"what": "Escaneo completo de toda la superficie. Se ejecuta en el hardware de la unidad — persiste aunque cierres el terminal.",
|
||||
"dur": "Horas (depende del tamaño del disco)"
|
||||
},
|
||||
{
|
||||
"action": "Comprobar el progreso del test",
|
||||
"what": "Estado del self-test activo o más reciente.",
|
||||
"dur": "Instantáneo"
|
||||
}
|
||||
],
|
||||
"tipTitle": "Los tests largos sobreviven al cierre del terminal",
|
||||
"tipBody": "Un test largo se encola <em>dentro de la unidad</em> — no depende de que el proceso de ProxMenux siga vivo. Puedes cerrar el terminal, reiniciar el host Proxmox (el test continúa donde lo dejó en algunas unidades) o simplemente volver más tarde y usar <strong>Comprobar el progreso del test</strong> para ver el resultado."
|
||||
},
|
||||
"json": {
|
||||
"heading": "Exportación JSON para el Monitor",
|
||||
"intro": "Cada ejecución escribe un archivo JSON con marca de tiempo en <code>/usr/local/share/proxmenux/smart/<disk>/</code>. La estructura es:",
|
||||
"outro": "El ProxMenux Monitor los recoge para renderizar tendencias de salud por disco; los archivos viejos se rotan automáticamente cuando se alcanza el límite de retención."
|
||||
},
|
||||
"steps": {
|
||||
"heading": "Paso a paso",
|
||||
"stepLabel": "Paso",
|
||||
"list": [
|
||||
{
|
||||
"title": "Elige un disco",
|
||||
"body": "ProxMenux lista cada disco físico del host con su modelo y tamaño. A diferencia de la herramienta Format, esta lista no se filtra por seguridad — leer SMART es una operación no destructiva.",
|
||||
"img": "/disk/smart/disk-selection.png",
|
||||
"alt": "Menú de selección de disco SMART",
|
||||
"caption": "Menú de selección de disco SMART"
|
||||
},
|
||||
{
|
||||
"title": "Elige una acción",
|
||||
"body": "Elige entre Estado de salud rápido, Informe completo, Test corto, Test largo o Comprobar progreso. El menú se queda abierto después de cada acción para que puedas encadenar varias consultas sobre el mismo disco.",
|
||||
"img": "/disk/smart/action-menu.png",
|
||||
"alt": "Menú de acciones SMART",
|
||||
"caption": "Menú de acciones SMART (5 acciones + cancelar)"
|
||||
},
|
||||
{
|
||||
"title": "(Solo test largo) Confirma ejecución en background",
|
||||
"body": "ProxMenux te avisa de que el test seguirá corriendo después de cerrar el terminal y muestra dónde caerá el resultado JSON. Acepta para encolarlo.",
|
||||
"img": "/disk/smart/long-test-warning.png",
|
||||
"alt": "Diálogo de confirmación del test largo",
|
||||
"caption": "Confirmación del test largo — corre en background, resultado guardado en JSON"
|
||||
},
|
||||
{
|
||||
"title": "Revisa los resultados",
|
||||
"bodyRich": "El estado y el informe se imprimen en el terminal y se escriben en JSON. Para los tests largos, vuelve más tarde y ejecuta <strong>Comprobar el progreso del test</strong> en el mismo disco para ver el resultado.",
|
||||
"img": "/disk/smart/quick-status.png",
|
||||
"alt": "Salida del estado de salud rápido",
|
||||
"caption": "Salida del estado de salud rápido (SATA — smartctl -H + -A)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalentes manuales",
|
||||
"nvmeWarnTitle": "Los self-tests NVMe dependen del firmware de la unidad",
|
||||
"nvmeWarnBody": "No toda unidad NVMe soporta el comando de self-test corto/largo. Si una unidad rechaza el test, el log SMART y los datos del ID controller (<code>nvme smart-log</code> + <code>id-ctrl</code>) siguen siendo la señal de salud más fiable."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noSmartTitle": "\"Could not read SMART data from /dev/sdX\"",
|
||||
"noSmartBody": "El disco está probablemente detrás de una controladora RAID / SAS que no pasa SMART. Con tarjetas basadas en megaraid, prueba <code>smartctl -d megaraid,N /dev/sdX</code>. Para HBAs en modo IT la invocación directa funciona.",
|
||||
"longTitle": "El test largo no termina nunca",
|
||||
"longBody": "El test se encola en el firmware de la unidad y pausa si el disco tiene carga pesada. Ejecutarlo de noche en un sistema en reposo suele funcionar. También puedes revisar <code>smartctl -c</code> para ver el porcentaje restante; si se queda atascado en un LBA fijo, el disco está fallando en ese sector."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager/format-disk",
|
||||
"label": "Formatear / borrar disco físico",
|
||||
"tail": " — reutilizar un disco después de confirmar que está sano."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"label": "Comandos de almacenamiento y discos → Salud SMART de disco",
|
||||
"tail": " — referencia de smartctl / nvme lista para copiar y pegar."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/zfs-commands",
|
||||
"label": "Comandos de gestión de ZFS",
|
||||
"tail": " — zpool scrub como equivalente a los tests SMART a nivel de capa de almacenamiento."
|
||||
},
|
||||
{
|
||||
"href": "/docs/monitor/dashboard/storage",
|
||||
"label": "ProxMenux Monitor — pestaña Almacenamiento",
|
||||
"tail": " — drill-in de disco que consume el JSON exportado aquí (tabla SMART completa, historial, informe PDF)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"tail": " — Storage Summary con modelo, capacidad y velocidad de link negociada (actual vs máxima en NVMe)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager",
|
||||
"label": "Resumen de Disk Manager",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Repositorios externos | ProxMenux Documentation",
|
||||
"description": "ProxMenux integra repositorios de scripts externos seleccionados (community-scripts, ZimaOS) como alternativas en algunas secciones del menú. Cada script externo se etiqueta claramente con su origen; los reportes de bugs van al mantenedor original.",
|
||||
"ogTitle": "Repositorios externos | ProxMenux Documentation",
|
||||
"ogDescription": "Repositorios de scripts externos integrados en ProxMenux como opciones alternativas en los menús."
|
||||
},
|
||||
"header": {
|
||||
"title": "Repositorios externos",
|
||||
"description": "ProxMenux integra repositorios de scripts externos seleccionados como opciones alternativas en algunas secciones del menú. Estos scripts vienen de fuentes de terceros confiables y se etiquetan claramente con su origen cuando se muestran en el menú.",
|
||||
"section": "Repositorios externos"
|
||||
},
|
||||
"practice": {
|
||||
"title": "Qué significa esto en la práctica",
|
||||
"body": "Cuando una opción del menú está respaldada por un script externo (en lugar del código propio de ProxMenux), el menú dice explícitamente de dónde viene y qué repositorio carga. ProxMenux actúa como lanzador — no modifica los scripts externos. Las incidencias con lo que hace un script externo corresponden al mantenedor de ese repositorio, no a ProxMenux."
|
||||
},
|
||||
"integrated": {
|
||||
"heading": "Actualmente integrados",
|
||||
"usedInLabel": "Usado en:",
|
||||
"items": [
|
||||
{
|
||||
"name": "community-scripts / ProxmoxVE",
|
||||
"url": "https://community-scripts.github.io/ProxmoxVE/",
|
||||
"description": "Sucesor espiritual de los helper scripts de tteck. Gran catálogo de scripts de un tirón para desplegar LXCs (Home Assistant, Plex, Frigate, …), VMs, addons y ajustes de PVE.",
|
||||
"usedIn": "Lanzador de helper scripts, Red (arreglo de offloading de NIC para Intel e1000e)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"attribution": {
|
||||
"heading": "Atribución y reconocimiento",
|
||||
"items": [
|
||||
"El crédito siempre se da a los autores originales en el menú y en la página de documentación que envuelve el script.",
|
||||
"Se muestra un enlace al repositorio fuente — tanto antes de ejecutar el script como en la página de docs correspondiente.",
|
||||
"Se anima a los usuarios a apoyar a los desarrolladores de estos proyectos externos (dar una ⭐, patrocinar, presentar reportes de bugs de calidad)."
|
||||
]
|
||||
},
|
||||
"report": {
|
||||
"title": "Dónde reportar problemas con scripts externos",
|
||||
"body": "Si un script de uno de estos repositorios externos no funciona como se espera, <strong>repórtalo directamente a ese repositorio</strong> — no a ProxMenux. ProxMenux solo descarga y ejecuta el script tal cual; no modifica la fuente. El mantenedor original es la persona indicada para triarlo y arreglarlo. Las incidencias de ProxMenux son para problemas con el propio lanzador o con cómo ProxMenux integra el script externo."
|
||||
},
|
||||
"suggest": {
|
||||
"heading": "Sugerir nuevos repositorios externos",
|
||||
"intro": "¿Has encontrado un script o repositorio que encajaría bien en un menú de ProxMenux? Sugiérelo vía:",
|
||||
"discussionTitle": "💬 Abrir una Discussion",
|
||||
"discussionBody": "Mejor para ideas — recibe input de la comunidad antes de convertirse en una petición de función.",
|
||||
"issueTitle": "🐛 Abrir una Issue",
|
||||
"issueBody": "Para peticiones de función concretas con un alcance claro."
|
||||
},
|
||||
"candidate": {
|
||||
"title": "Qué hace un buen candidato a integración",
|
||||
"items": [
|
||||
"Código abierto con un mantenedor activo.",
|
||||
"Idempotente / seguro de ejecutar más de una vez.",
|
||||
"No modifica silenciosamente la configuración del núcleo de Proxmox.",
|
||||
"Resuelve un problema que ProxMenux no cubre ya (evita duplicación de funciones)."
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,677 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Glosario | ProxMenux Documentation",
|
||||
"description": "Definiciones de los términos técnicos usados a lo largo de la documentación de ProxMenux — conceptos de Proxmox (VM, LXC, qm, pct, pmxcfs), fundamentos de virtualización (KVM, IOMMU, VFIO, OVMF), almacenamiento (ZFS, ARC, LVM, vzdump, PBS), red (bridge, VLAN, nftables) y terminología específica de ProxMenux.",
|
||||
"ogTitle": "Glosario | ProxMenux Documentation",
|
||||
"ogDescription": "Referencia rápida para los términos técnicos usados en la documentación de ProxMenux."
|
||||
},
|
||||
"header": {
|
||||
"title": "Glosario",
|
||||
"description": "Definiciones de los términos técnicos usados a lo largo de la documentación de ProxMenux. Cubre conceptos de Proxmox, fundamentos de virtualización, almacenamiento, red, internals de Linux y terminología específica de ProxMenux.",
|
||||
"section": "Glosario"
|
||||
},
|
||||
"callout": {
|
||||
"title": "Cómo usar esta página",
|
||||
"bodyRich": "Cada entrada tiene un badge de categoría y una definición corta. Los enlaces <em>Ver también</em> saltan a la página de docs donde el término es más relevante. Usa la navegación A–Z de abajo para desplazarte directamente a una letra."
|
||||
},
|
||||
"jumpHeading": "Saltar a la letra",
|
||||
"seeAlsoLabel": "Ver también:",
|
||||
"aliasesLabel": "también:",
|
||||
"missingCallout": {
|
||||
"title": "¿Falta un término?",
|
||||
"leadRich": "Si un término en las docs no está definido aquí, abre una incidencia o PR en <ext>GitHub</ext> — el glosario vive en <code>web/app/docs/glossary/page.tsx</code> como un simple array de datos."
|
||||
},
|
||||
"entries": [
|
||||
{
|
||||
"term": "ACS",
|
||||
"aliases": [
|
||||
"Access Control Services",
|
||||
"ACS override"
|
||||
],
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Extensión de PCIe que evita el tráfico peer-to-peer directo entre dispositivos, asegurando que cada dispositivo está en su propio grupo IOMMU. El parche del kernel <em>ACS override</em> afloja esto para que dispositivos del mismo grupo IOMMU puedan pasarse a VMs distintas — útil pero con compromiso de seguridad.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Añadir controlador o NVMe a una VM",
|
||||
"href": "/docs/disk-manager/add-controller-nvme-vm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "ARC",
|
||||
"aliases": [
|
||||
"Adaptive Replacement Cache"
|
||||
],
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Caché de lectura en memoria de ZFS. Mantiene los bloques de datos usados recientemente y con frecuencia; el tamaño escala con la RAM disponible del host. Los valores por defecto son agresivos — la post-instalación de Proxmox te deja limitarlo.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Post-instalación: Almacenamiento",
|
||||
"href": "/docs/post-install/storage"
|
||||
},
|
||||
{
|
||||
"label": "Comandos ZFS",
|
||||
"href": "/docs/help-info/zfs-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Bind mount",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Función de Linux que expone una parte del sistema de archivos en otra ruta. ProxMenux usa bind mounts para compartir directorios del host con contenedores LXC vía <code>pct set -mpN</code>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Puntos de montaje LXC",
|
||||
"href": "/docs/storage-share/lxc-mount-points"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Bond",
|
||||
"aliases": [
|
||||
"Network bond",
|
||||
"Link aggregation"
|
||||
],
|
||||
"category": "Red",
|
||||
"definitionRich": "Combina múltiples interfaces de red físicas en una interfaz lógica — para redundancia (active-backup), throughput (LACP / 802.3ad) o ambas. Se configura en <code>/etc/network/interfaces</code>."
|
||||
},
|
||||
{
|
||||
"term": "Bridge",
|
||||
"aliases": [
|
||||
"vmbrX",
|
||||
"vmbr0",
|
||||
"Linux bridge"
|
||||
],
|
||||
"category": "Red",
|
||||
"definitionRich": "Un switch virtual de capa 2 en el host. <code>vmbr0</code> es el bridge por defecto de Proxmox que conecta VMs y contenedores a la red física. Múltiples bridges (<code>vmbr1</code>, <code>vmbr2</code>...) aíslan grupos de guests.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Análisis de bridges y reparación guiada",
|
||||
"href": "/docs/network/bridge-analysis"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Ceph",
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Sistema de almacenamiento distribuido fuertemente integrado con Proxmox para clústeres hiperconvergentes. Proporciona almacenamiento de objetos, bloques y archivos respaldado por OSDs (Object Storage Daemons). PVE 9 requiere Ceph 19.x (Squid).",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Actualizar PVE 8 a PVE 9",
|
||||
"href": "/docs/utils/upgrade-pve8-pve9"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "CT",
|
||||
"aliases": [
|
||||
"Container",
|
||||
"LXC container"
|
||||
],
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Abreviatura de \"contenedor\" — terminología de Proxmox para una instancia LXC. Tiene un CTID numérico que mapea a <code>/etc/pve/lxc/<CTID>.conf</code>. Mira también <strong>LXC</strong>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Gestión de VMs y CTs",
|
||||
"href": "/docs/help-info/vm-ct-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "deb822",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Formato moderno para fuentes de repositorios APT, usando archivos <code>.sources</code> con bloques estructurados clave/valor (Types, URIs, Suites, Components, Signed-By). Reemplaza el formato heredado de una línea <code>.list</code>. Estándar desde PVE 9 / Debian Trixie en adelante.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Actualizar PVE 8 a PVE 9",
|
||||
"href": "/docs/utils/upgrade-pve8-pve9"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "dGPU",
|
||||
"aliases": [
|
||||
"Discrete GPU"
|
||||
],
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Una tarjeta gráfica independiente en su propio slot PCIe (p. ej. NVIDIA RTX, AMD Radeon). Contrasta con <strong>iGPU</strong>. Típicamente se usa para passthrough VFIO a una única VM, no para compartir entre LXCs.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Añadir GPU a una VM (passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Dialog",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Herramienta basada en ncurses para dibujar menús, prompts y barras de progreso en un terminal. ProxMenux está construido alrededor de menús dialog."
|
||||
},
|
||||
{
|
||||
"term": "DKMS",
|
||||
"aliases": [
|
||||
"Dynamic Kernel Module Support"
|
||||
],
|
||||
"category": "Linux",
|
||||
"definitionRich": "Framework que reconstruye automáticamente los módulos del kernel fuera del árbol (NVIDIA, ZFS, drivers propios) cuando el kernel se actualiza. Evita que los módulos se queden atrás tras actualizaciones del kernel.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Instalar Coral TPU (host)",
|
||||
"href": "/docs/hardware/install-coral-tpu-host"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Fail2Ban",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Servicio de prevención de intrusiones que vigila los archivos de log en busca de fallos repetidos de autenticación y banea las IPs ofensoras en la capa del firewall. ProxMenux entrega jails preconfigurados para SSH, la UI de Proxmox y el Monitor.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Fail2Ban",
|
||||
"href": "/docs/security/fail2ban"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Fastfetch",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Herramienta de info del sistema en ASCII-art que se ejecuta en el login del shell (el \"banner de resumen del sistema\"). Reemplaza al antiguo <code>neofetch</code>; disponible como opción opt-in en la post-instalación de ProxMenux.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Post-instalación: opcional",
|
||||
"href": "/docs/post-install/optional"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "GRUB",
|
||||
"aliases": [
|
||||
"GRand Unified Bootloader"
|
||||
],
|
||||
"category": "Linux",
|
||||
"definitionRich": "Cargador de arranque para la mayoría de distribuciones Linux. La configuración vive en <code>/etc/default/grub</code> + <code>/boot/grub/</code>. Se modifica para habilitar IOMMU, parámetros del kernel y entradas de arranque EFI. Ejecuta <code>update-grub</code> tras editar.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Comandos de passthrough de GPU",
|
||||
"href": "/docs/help-info/gpu-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "iGPU",
|
||||
"aliases": [
|
||||
"Integrated GPU"
|
||||
],
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Procesador gráfico integrado en el paquete de CPU (Intel UHD / Iris, AMD Radeon Vega en APUs Ryzen). Típicamente compartido entre múltiples contenedores LXC vía <code>/dev/dri</code> en lugar de pasarse a una única VM.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "ifupdown / ifupdown2",
|
||||
"category": "Red",
|
||||
"definitionRich": "El clásico sistema de configuración de red de Debian que lee <code>/etc/network/interfaces</code>. <code>ifupdown2</code> es la versión reescrita que Proxmox usa por defecto — soporta recarga en vivo vía <code>ifreload -a</code>."
|
||||
},
|
||||
{
|
||||
"term": "initramfs",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Sistema de archivos en RAM inicial que el kernel usa al arrancar antes de montar el sistema de archivos raíz real. Contiene drivers necesarios pronto (almacenamiento, cifrado, RAID). Reconstruido con <code>update-initramfs -u -k all</code> tras cambios de VFIO, IOMMU o driver de almacenamiento."
|
||||
},
|
||||
{
|
||||
"term": "IOMMU",
|
||||
"aliases": [
|
||||
"Input/Output Memory Management Unit",
|
||||
"VT-d",
|
||||
"AMD-Vi"
|
||||
],
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Función de hardware (Intel VT-d / AMD-Vi) que permite asignar dispositivos PCIe de forma segura directamente a VMs guest. Requerido para passthrough de GPU y controladores de disco. Debe habilitarse tanto en BIOS / UEFI como en la línea de comandos del kernel (<code>intel_iommu=on</code> o <code>amd_iommu=on</code>).",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Post-instalación: virtualización",
|
||||
"href": "/docs/post-install/virtualization"
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a una VM (passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "IOMMU group",
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "La unidad más pequeña de dispositivos que el IOMMU puede aislar entre sí. Todos los dispositivos de un grupo deben pasarse juntos — normalmente un dispositivo, pero las tarjetas multi-función o los dispositivos que comparten root-port aterrizan en el mismo grupo. Se listan vía <code>find /sys/kernel/iommu_groups/ -type l | sort -V</code>."
|
||||
},
|
||||
{
|
||||
"term": "iSCSI",
|
||||
"aliases": [
|
||||
"Internet SCSI"
|
||||
],
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Protocolo de red que expone almacenamiento de bloques sobre IP — un disco remoto aparece como un dispositivo SCSI local. Se registra como almacenamiento de Proxmox vía <code>pvesm add iscsi</code>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Añadir target iSCSI como almacenamiento de Proxmox",
|
||||
"href": "/docs/storage-share/host-iscsi"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "KVM",
|
||||
"aliases": [
|
||||
"Kernel-based Virtual Machine"
|
||||
],
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Módulo del kernel de Linux que convierte el host en un hipervisor. Combinado con <strong>QEMU</strong> para emulación de dispositivos, es la base que Proxmox usa para ejecutar VMs."
|
||||
},
|
||||
{
|
||||
"term": "LVM",
|
||||
"aliases": [
|
||||
"Logical Volume Manager"
|
||||
],
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Stack de almacenamiento de Linux que abstrae los discos físicos en grupos de volumen (VG) de volúmenes lógicos (LV). Proxmox usa pools LVM-thin para discos de VM por defecto. Herramientas concisas: <code>pvs</code>, <code>vgs</code>, <code>lvs</code>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Comandos de almacenamiento y discos",
|
||||
"href": "/docs/help-info/storage-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "LXC",
|
||||
"aliases": [
|
||||
"Linux Containers"
|
||||
],
|
||||
"category": "Linux",
|
||||
"definitionRich": "Tecnología de virtualización a nivel de SO — múltiples instancias aisladas de espacio de usuario comparten el kernel del host. Más ligera y rápida que las VMs pero menos aislada. Proxmox gestiona los contenedores LXC vía la CLI <code>pct</code>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Gestión de VMs y CTs",
|
||||
"href": "/docs/help-info/vm-ct-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Lynis",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Auditor de seguridad de código abierto (de CISOfy) que escanea el host e imprime una puntuación de hardening más pistas concretas de remediación. ProxMenux instala el último de GitHub upstream en lugar del paquete (más antiguo) de Debian.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Lynis",
|
||||
"href": "/docs/security/lynis"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "MAC address",
|
||||
"aliases": [
|
||||
"Hardware address"
|
||||
],
|
||||
"category": "Red",
|
||||
"definitionRich": "Identificador de 48 bits grabado en el firmware de una NIC. Usado por los <em>nombres de red persistentes</em> de Proxmox para fijar nombres de interfaz (<code>eno1</code>, <code>enp3s0</code>) para que sobrevivan a la reenumeración PCI.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Nombres de interfaz persistentes",
|
||||
"href": "/docs/network/persistent-names"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "MOTD",
|
||||
"aliases": [
|
||||
"Message of the Day"
|
||||
],
|
||||
"category": "Linux",
|
||||
"definitionRich": "Texto mostrado tras el login SSH. Almacenado en <code>/etc/motd</code>. La post-instalación de ProxMenux puede añadir un banner aquí; el desinstalador restaura el backup si lo aplicaste."
|
||||
},
|
||||
{
|
||||
"term": "NFS",
|
||||
"aliases": [
|
||||
"Network File System"
|
||||
],
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Protocolo de compartición de archivos en red nativo de Unix. Se registra como almacenamiento de Proxmox vía <code>pvesm add nfs</code>; también usable como cliente / servidor LXC vía flujos dedicados de ProxMenux.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Almacenamiento y compartición",
|
||||
"href": "/docs/storage-share"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "nftables / iptables",
|
||||
"category": "Red",
|
||||
"definitionRich": "Sistemas de firewall de Linux. <code>nftables</code> es el motor moderno; <code>iptables</code> es el front-end heredado (sigue funcionando como capa de traducción). El <code>pve-firewall</code> de Proxmox emite reglas nftables desde la configuración del firewall del clúster.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Comandos de red",
|
||||
"href": "/docs/help-info/network-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "nouveau",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Driver NVIDIA de código abierto incluido con el kernel de Linux. Debe ponerse en blacklist antes de instalar el driver propietario NVIDIA, si no ambos cargan y la instalación falla.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Guía de instalación de NVIDIA",
|
||||
"href": "/guides/nvidia"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "no-subscription repo",
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Repositorio gratuito de Proxmox para usuarios sin suscripción enterprise. QA menos pulido que el repo enterprise (ligeramente más arriesgado para producción) pero gratis. Se configura automáticamente por la post-instalación de ProxMenux.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Post-instalación: ajustes básicos",
|
||||
"href": "/docs/post-install/basic-settings"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "OVA / OVF",
|
||||
"aliases": [
|
||||
"Open Virtualization Format"
|
||||
],
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Formatos de empaquetado estándar DMTF para VMs portables. <strong>OVA</strong> es un único archivo TAR; <strong>OVF</strong> es un directorio con un descriptor XML + archivos VMDK externos. Importables en VMware, VirtualBox y Proxmox.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Exportar VM a OVA / OVF",
|
||||
"href": "/docs/utils/export-vm"
|
||||
},
|
||||
{
|
||||
"label": "Importar VM desde OVA / OVF",
|
||||
"href": "/docs/utils/import-vm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "OVMF",
|
||||
"aliases": [
|
||||
"UEFI firmware",
|
||||
"Open Virtual Machine Firmware"
|
||||
],
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Implementación de firmware UEFI para VMs. Se establece con <code>qm set <vmid> -bios ovmf</code>. Requerido para Windows 11, Secure Boot y la mayoría de instalaciones modernas de SO. Combínalo con un <code>efidisk0</code> para persistir las variables EFI.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Añadir GPU a una VM (passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "PBS",
|
||||
"aliases": [
|
||||
"Proxmox Backup Server"
|
||||
],
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Producto independiente de Proxmox para backups incrementales, deduplicados y cifrados de VMs / CTs. Recomendado sobre vzdump plano cuando tienes una máquina aparte donde alojarlo."
|
||||
},
|
||||
{
|
||||
"term": "pct",
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Herramienta CLI para gestionar contenedores LXC en Proxmox: <code>pct list / start / stop / shutdown / config / enter / exec / push / pull / destroy</code>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Gestión de VMs y CTs",
|
||||
"href": "/docs/help-info/vm-ct-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "pmxcfs",
|
||||
"aliases": [
|
||||
"Proxmox Cluster Filesystem"
|
||||
],
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Sistema de archivos virtual basado en FUSE montado en <code>/etc/pve/</code>. Replica los cambios de configuración entre todos los nodos del clúster en tiempo real. Editar un archivo bajo <code>/etc/pve/</code> se propaga automáticamente."
|
||||
},
|
||||
{
|
||||
"term": "pveam",
|
||||
"aliases": [
|
||||
"Proxmox VE Appliance Manager"
|
||||
],
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "CLI para gestionar el catálogo local de plantillas de CT. <code>pveam update</code> refresca el índice; <code>pveam available</code> lista plantillas; <code>pveam download <storage> <template></code> descarga una."
|
||||
},
|
||||
{
|
||||
"term": "pveproxy",
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "El servicio HTTPS que sirve la UI web de Proxmox en el puerto 8006 y el terminal web. Se reinicia automáticamente durante los upgrades mayores — por eso ProxMenux se niega a ejecutar el upgrade PVE 8 → 9 desde el terminal web."
|
||||
},
|
||||
{
|
||||
"term": "pvesm",
|
||||
"aliases": [
|
||||
"Proxmox Storage Manager"
|
||||
],
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Herramienta CLI para gestionar el almacenamiento de Proxmox. <code>pvesm status</code> muestra todos los almacenamientos configurados; <code>pvesm add <type></code> registra nuevos (NFS, Samba, iSCSI, dir, ZFS, LVM, …).",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Comandos de almacenamiento y discos",
|
||||
"href": "/docs/help-info/storage-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Privileged container",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Contenedor LXC donde el usuario root dentro del contenedor <em>es</em> root en el host (UIDs no desplazados). Requerido para passthrough de hardware (dispositivos USB, compartición de GPU) y servidor Samba / NFS dentro del CT. Menos seguro que unprivileged — úsalo solo cuando sea necesario."
|
||||
},
|
||||
{
|
||||
"term": "ProxMenux Monitor",
|
||||
"category": "ProxMenux",
|
||||
"definitionRich": "Panel web opcional instalado junto a ProxMenux. Sirve estadísticas del host en tiempo real (CPU / RAM / disco / red), resumen de VMs y LXC, login + 2FA, en el puerto TCP <code>8008</code>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "ProxMenux Monitor",
|
||||
"href": "/docs/settings/proxmenux-monitor"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "qcow2",
|
||||
"aliases": [
|
||||
"QEMU Copy-On-Write v2"
|
||||
],
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Formato de imagen de disco de VM por defecto en el almacenamiento de directorio de Proxmox. Soporta thin provisioning, snapshots y copy-on-write. Convierte con <code>qemu-img convert -O qcow2 ...</code>."
|
||||
},
|
||||
{
|
||||
"term": "qm",
|
||||
"aliases": [
|
||||
"QEMU Manager"
|
||||
],
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Herramienta CLI para gestionar VMs en Proxmox: <code>qm list / start / stop / shutdown / config / set / destroy / importdisk / migrate</code>. Comando hermano de <code>pct</code> para contenedores.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Gestión de VMs y CTs",
|
||||
"href": "/docs/help-info/vm-ct-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Q35",
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Tipo de máquina moderno de QEMU que emula un chipset Intel Q35 con soporte PCIe. Recomendado sobre el antiguo i440FX para VMs que necesitan passthrough PCIe o soporte de SO guest moderno. Se establece con <code>qm set <vmid> -machine q35</code>."
|
||||
},
|
||||
{
|
||||
"term": "QEMU",
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Emulador y virtualizador de máquinas genérico, de código abierto. Combinado con KVM en Proxmox para ejecutar VMs a velocidad casi nativa."
|
||||
},
|
||||
{
|
||||
"term": "rclone",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Herramienta de línea de comandos que habla con ~50 proveedores de almacenamiento en la nube (Google Drive, Dropbox, OneDrive, Mega, S3, …). Usada en la guía de backup en la nube de Proxmox para montar una nube personal como un directorio en el que el host pueda escribir archivos vzdump.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Backup a nube personal",
|
||||
"href": "/guides/backup_cloud"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Samba / SMB / CIFS",
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Familia de protocolos de compartición de archivos de Microsoft. <strong>SMB</strong> es el protocolo; <strong>Samba</strong> es la implementación de código abierto en Linux; <strong>CIFS</strong> es un dialecto SMB más antiguo. Se registra como almacenamiento de Proxmox vía <code>pvesm add cifs</code>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Almacenamiento y compartición",
|
||||
"href": "/docs/storage-share"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "SeaBIOS",
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Implementación de código abierto de BIOS heredado usada por QEMU. Firmware por defecto para nuevas VMs salvo que cambies a OVMF. Apropiado para SO más antiguos e instalaciones simples de Linux que no necesitan UEFI."
|
||||
},
|
||||
{
|
||||
"term": "smartctl / SMART",
|
||||
"aliases": [
|
||||
"Self-Monitoring, Analysis and Reporting Technology"
|
||||
],
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Diagnósticos de disco integrados que reportan salud del drive, conteos de errores y resultados de self-tests. <code>smartctl</code> (de <code>smartmontools</code>) es la CLI; para drives NVMe, el paquete <code>nvme-cli</code> añade comandos específicos de NVMe.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Salud y test SMART de discos",
|
||||
"href": "/docs/disk-manager/smart-disk-test"
|
||||
},
|
||||
{
|
||||
"label": "Comandos de almacenamiento → sección SMART",
|
||||
"href": "/docs/help-info/storage-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "systemd / systemctl / journalctl",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Sistema init moderno usado por Debian / Proxmox. <code>systemctl</code> gestiona servicios (start / stop / enable / status). <code>journalctl</code> lee el log binario escrito por <code>systemd-journald</code>."
|
||||
},
|
||||
{
|
||||
"term": "sysctl",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Gestión de parámetros del kernel. Lee <code>/etc/sysctl.conf</code> + <code>/etc/sysctl.d/*.conf</code> al arrancar. La post-instalación de ProxMenux entrega un perfil curado de tuning de sysctl.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Post-instalación: red",
|
||||
"href": "/docs/post-install/network"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "trixie",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Codename para Debian 13, la base de SO para Proxmox VE 9. Predecesor: <em>bookworm</em> (Debian 12 / PVE 8).",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Actualizar PVE 8 a PVE 9",
|
||||
"href": "/docs/utils/upgrade-pve8-pve9"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "udev",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Gestor de dispositivos de Linux. Reacciona a eventos de hardware y crea / elimina entradas bajo <code>/dev</code>. Reglas propias en <code>/etc/udev/rules.d/</code> mapean persistentemente direcciones MAC a nombres de interfaz, configuran nodos de dispositivo NVIDIA al cargar el driver, etc."
|
||||
},
|
||||
{
|
||||
"term": "UID / GID idmap",
|
||||
"aliases": [
|
||||
"UID shift"
|
||||
],
|
||||
"category": "Linux",
|
||||
"definitionRich": "En contenedores LXC <strong>unprivileged</strong>, los UIDs y GIDs se desplazan en <code>+100000</code> en el host. UID 0 del contenedor = UID 100000 del host, UID 1000 del contenedor = UID 101000 del host, etc. Afecta a la propiedad de archivos en bind mounts.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Puntos de montaje LXC",
|
||||
"href": "/docs/storage-share/lxc-mount-points"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "Unprivileged container",
|
||||
"category": "Linux",
|
||||
"definitionRich": "Contenedor LXC donde root dentro está mapeado a un UID sin privilegios en el host (desplazamiento de UID +100000). Más seguro que privileged pero no puede hacer passthrough de hardware ni ejecutar servicios a nivel de kernel. Por defecto para la mayoría de casos de uso."
|
||||
},
|
||||
{
|
||||
"term": "VFIO",
|
||||
"aliases": [
|
||||
"Virtual Function I/O"
|
||||
],
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Framework del kernel de Linux para drivers de dispositivo seguros en espacio de usuario — usado para asociar dispositivos PCIe a VMs para passthrough directo. Se habilita cargando los módulos del kernel <code>vfio</code>, <code>vfio_iommu_type1</code> y <code>vfio_pci</code>, configurados vía <code>/etc/modprobe.d/vfio.conf</code>.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Post-instalación: virtualización",
|
||||
"href": "/docs/post-install/virtualization"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "VirtIO",
|
||||
"category": "Virtualización",
|
||||
"definitionRich": "Familia de drivers de dispositivo paravirtualizados (red, almacenamiento, balloon, GPU) que corren más rápido que el hardware heredado emulado (p. ej. NICs e1000, discos IDE). El guest necesita el driver VirtIO correspondiente — nativo del kernel en Linux, instalación separada de ISO en Windows."
|
||||
},
|
||||
{
|
||||
"term": "VLAN",
|
||||
"aliases": [
|
||||
"Virtual LAN"
|
||||
],
|
||||
"category": "Red",
|
||||
"definitionRich": "Tags 802.1Q que segmentan una red física en múltiples redes lógicas. Se configura por bridge o por NIC en <code>/etc/network/interfaces</code>."
|
||||
},
|
||||
{
|
||||
"term": "VM",
|
||||
"aliases": [
|
||||
"Virtual Machine"
|
||||
],
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Una emulación completa de máquina gestionada por Proxmox vía QEMU/KVM. Tiene un VMID numérico que mapea a <code>/etc/pve/qemu-server/<VMID>.conf</code>. Más pesada que los contenedores LXC pero totalmente aislada.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Gestión de VMs y CTs",
|
||||
"href": "/docs/help-info/vm-ct-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "vzdump",
|
||||
"category": "Proxmox",
|
||||
"definitionRich": "Herramienta de backup integrada de Proxmox para VMs y CTs. <strong>No incremental</strong> — cada backup es un snapshot completo. Configura modos (snapshot / suspend / stop), compresión (zstd / pigz / lzo), retención y notificación por trabajo.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Comandos de backup y restauración",
|
||||
"href": "/docs/help-info/backup-commands"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"term": "ZFS",
|
||||
"aliases": [
|
||||
"Zettabyte File System"
|
||||
],
|
||||
"category": "Almacenamiento",
|
||||
"definitionRich": "Sistema de archivos combinado con gestor de volúmenes conocido por sus snapshots, replicación send/receive, checksums end-to-end, compresión y auto-reparación. Hambriento de memoria (mira <strong>ARC</strong>) pero extremadamente robusto.",
|
||||
"seeAlso": [
|
||||
{
|
||||
"label": "Comandos de gestión de ZFS",
|
||||
"href": "/docs/help-info/zfs-commands"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir Coral TPU a LXC | ProxMenux Documentation",
|
||||
"description": "Pasa una Google Coral TPU (USB o M.2 / PCIe) a un contenedor LXC de Proxmox. ProxMenux escribe las entradas correctas de dev / cgroup / mount para cada variante, arranca el contenedor e instala el runtime de Edge TPU dentro para que apps como Frigate puedan usar el acelerador."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir Coral TPU a LXC",
|
||||
"description": "Comparte una Google Coral TPU (USB Accelerator o M.2 / Mini-PCIe) con un contenedor LXC de Proxmox. ProxMenux se encarga de la config del LXC y de la instalación del runtime Edge TPU dentro del contenedor. Coral es solo TPU: para compartir GPU / iGPU (Quick Sync, VA-API, NVENC) en el mismo contenedor, ejecuta Añadir GPU a LXC por separado.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Escribe la config de passthrough en <code>/etc/pve/lxc/<ctid>.conf</code> — entradas distintas dependiendo de si el host tiene un <strong>USB Accelerator</strong>, una <strong>Coral M.2 / PCIe</strong>, o ambos. Luego arranca el contenedor e instala el último runtime <code>libedgetpu</code> de Google dentro de él. El passthrough de iGPU / GPU lo gestiona un script aparte (<lxcGpuLink>Añadir GPU a LXC</lxcGpuLink>) — este se centra en la TPU."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "Cuándo usar esto",
|
||||
"body": "Caso de uso típico: ejecutar <frigateLink>Frigate</frigateLink>, Agent DVR, Blue Iris + CodeProject.AI o cualquier otra app de detección de objetos dentro de un LXC y querer que la Coral TPU haga la inferencia ML en lugar de la CPU. Con Coral, la latencia de inferencia baja de ~100 ms a ~5 ms por frame y la carga de CPU se mantiene cerca de cero."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"drivers": "<strong>Drivers de Coral ya instalados en el host</strong>. Este script no los instala; solo configura el passthrough al contenedor. Ejecuta <hostLink>Install Coral TPU on the Host</hostLink> primero si no lo has hecho.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>Un contenedor LXC existente</strong>, idealmente con una distro basada en <strong>Debian / Ubuntu</strong>. La instalación dentro del contenedor usa <code>apt-get</code>; los contenedores Alpine / Arch no están soportados por este script actualmente.",
|
||||
"downtime": "<strong>Asume una breve interrupción</strong> del contenedor. El script lo para para aplicar los cambios de config y lo arranca de nuevo para instalar los drivers dentro. No hace falta reiniciar el host."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "El host debe estar preparado primero",
|
||||
"body": "Si ejecutas este script antes de instalar los drivers de Coral en el host (el módulo de kernel <code>gasket</code>/<code>apex</code> para M.2, el runtime <code>libedgetpu</code> para USB), la config del LXC se escribe igualmente pero el contenedor no encontrará el dispositivo en tiempo de ejecución. El orden importa: <strong>instalación en el host → passthrough al LXC → app dentro del contenedor</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el script",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add Coral TPU to LXC</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add Coral TPU to LXC' dentro de Hardware: GPUs and Coral-TPU"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Una decisión por adelantado (¿qué contenedor?), luego el script gestiona los caminos USB y PCIe de forma independiente según lo que encuentre en el host. Si ambos están presentes, ambos se pasan."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"pick": {
|
||||
"title": "Elige el contenedor LXC",
|
||||
"body": "Un diálogo muestra cada LXC del host (desde <code>pct list</code>). Elige el que debería recibir la Coral. En ejecución o parado, da igual — el script gestiona ambos casos (lo para brevemente para escribir la config y luego lo arranca de nuevo para instalar los drivers)."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Sugerencia de passthrough de GPU (opcional)",
|
||||
"body": "Si el host tiene una GPU (Intel iGPU, AMD, NVIDIA) y el contenedor elegido NO tiene passthrough de GPU configurado, el script muestra un diálogo único sugiriendo que ejecutes <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink> primero. La Coral suele combinarse con decodificación de vídeo por hardware (Quick Sync, VA-API, NVENC) para apps como Frigate. Puedes decir sí (sale, ejecutas el script de GPU y vuelves) o no (continúa con el setup solo de TPU)."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Escribir la config del LXC — ruta USB",
|
||||
"body": "Si hay un USB Accelerator presente, el script hace dos cosas: (1) escribe una regla udev en el host para que el dispositivo tenga un nombre estable <code>/dev/coral</code> independientemente del puerto USB en el que esté, y (2) hace bind-mount del árbol <strong>completo</strong> <code>/dev/bus/usb</code> dentro del contenedor.",
|
||||
"whyTitle": "¿Por qué montar /dev/bus/usb en lugar de /dev/coral?",
|
||||
"whyBody": "La ruta del nodo del dispositivo USB (p. ej. <code>/dev/bus/usb/001/005</code>) cambia cuando reconectas el acelerador a otro puerto. Versiones anteriores del script hacían bind-mount del symlink <code>/dev/coral</code>, que apuntaba a una ruta vieja y se rompía. Montar el árbol USB completo significa que el contenedor ve la ruta actual sea cual sea, así que reconectar simplemente funciona."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Escribir la config del LXC — ruta M.2 / PCIe",
|
||||
"body1": "Si hay una Coral M.2 / PCIe presente en el host y <code>/dev/apex_0</code> existe (el módulo de kernel apex está cargado), el script usa la API moderna <code>dev</code> de Proxmox que gestiona los permisos de cgroup2 automáticamente tanto para contenedores privilegiados como unprivileged:",
|
||||
"body2": "Si el host aún no ha arrancado con el módulo apex cargado (acabas de ejecutar <hostLink>Install Coral on Host</hostLink> y no has reiniciado), <code>/dev/apex_0</code> aún no existe. El script recurre al cgroup2 + bind mount clásico con <code>create=file</code> para que las entradas sean válidas incluso cuando el dispositivo no se ha materializado:",
|
||||
"rebootTitle": "Reinicia el host primero si acabas de instalar los drivers de Coral",
|
||||
"rebootBody": "El fallback de cgroup2 + mount se escribirá, pero el dispositivo solo existe realmente después de un reinicio del host que cargue el módulo <code>apex</code>. Si no has reiniciado, reinicia ahora antes de arrancar el contenedor."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Arrancar el contenedor + instalar el runtime de Coral dentro",
|
||||
"body": "Los cambios de config en LXC de Proxmox surten efecto en el siguiente arranque — así que el script arranca el contenedor, espera hasta 15 segundos a que <code>pct exec</code> responda y luego deja un bash script dentro que:",
|
||||
"items": [
|
||||
"Ejecuta <code>apt-get update</code>.",
|
||||
"Instala los prerequisitos del repositorio Coral: <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
|
||||
"Importa la clave GPG de Coral de Google en <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (ruta moderna, la misma que usa el instalador del host) y añade el repositorio APT <code>coral-edgetpu-stable</code> con <code>signed-by=</code>.",
|
||||
"Instala el último <code>libedgetpu1-std</code> (por defecto). Si tienes una Coral M.2, se te preguntará entre <code>libedgetpu1-std</code> (estándar) y <code>libedgetpu1-max</code> (máximo rendimiento, calienta más)."
|
||||
],
|
||||
"noIgpuTitle": "¿Por qué no hay drivers de iGPU aquí?",
|
||||
"noIgpuBody": "Versiones anteriores de este script también instalaban Intel <code>va-driver-all</code>, <code>intel-opencl-icd</code> y compañía para que el mismo contenedor pudiera hacer decode de vídeo Quick Sync junto a la inferencia de Coral. Esa doble responsabilidad causaba fallos confusos cuando el usuario solo quería Coral. El lado iGPU es ahora trabajo exclusivo de <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink> — ejecútalo primero si también quieres decode de vídeo por hardware en el contenedor.",
|
||||
"debianTitle": "Solo contenedores Debian / Ubuntu",
|
||||
"debianBody": "La instalación dentro del contenedor usa <code>apt-get</code> directamente. Los contenedores Alpine, Arch o basados en RHEL no están soportados actualmente — el paso de instalación fallará y dejará el LXC con la config de passthrough pero sin drivers dentro. Para esas distros, instala el runtime de Coral manualmente siguiendo la <coralLink>guía oficial</coralLink> de Google después del paso de config del LXC."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Resumen",
|
||||
"body": "El script imprime una checklist al final resumiendo qué se habilitó (Coral USB, Coral M.2) con marcas ✓ o ⚠ según si el hardware se detectó realmente. El contenedor sigue en ejecución — puedes saltar directamente a la config de Frigate / CodeProject.AI / tu app."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "Si quieres ver exactamente qué va en la config del LXC, o aplicarlo a mano:",
|
||||
"usbHeading": "Coral USB",
|
||||
"pcieHeading": "Coral M.2 / PCIe",
|
||||
"runtimeHeading": "Dentro del contenedor — runtime de Coral"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación",
|
||||
"body": "Entra en el contenedor y comprueba que la Coral es visible:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"apexTitle": "El contenedor arrancó pero /dev/apex_0 no está dentro",
|
||||
"apexBody": "El módulo apex del host no está cargado. En el host: <code>lsmod | grep apex</code> — si está vacío, ejecuta <code>modprobe apex</code>, o reinicia si acabas de instalar los drivers de Coral. Una vez el host tenga <code>/dev/apex_0</code>, reinicia el contenedor: <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "La Coral USB desaparece al reconectarla en otro puerto",
|
||||
"replugBody": "Justo por eso el script monta <code>/dev/bus/usb</code> en lugar del symlink <code>/dev/coral</code>. Si te pasa esto, comprueba que tu config del LXC tiene <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> y no una referencia directa a <code>/dev/coral</code>. Las configs viejas de versiones anteriores del script pueden necesitar actualizarse — vuelve a ejecutar el script sobre el mismo contenedor y la config se refresca.",
|
||||
"alpineTitle": "La instalación dentro del contenedor falla en un contenedor Alpine",
|
||||
"alpineBody": "El script usa <code>apt-get</code>, que Alpine no tiene. La config de passthrough del LXC sigue siendo válida — solo instala el runtime de Coral manualmente con <code>apk add</code> siguiendo la guía de Google para Alpine, o usa un contenedor basado en Debian si no necesitas la huella más pequeña.",
|
||||
"frigateTitle": "Frigate dice 'Coral EdgeTPU detected but not available'",
|
||||
"frigateBody": "Casi siempre es un problema de permisos dentro del contenedor. Frigate corre como root por defecto; comprueba que el usuario root está en el grupo <code>plugdev</code> dentro del contenedor (para USB), y que el proceso puede leer <code>/dev/apex_0</code> (para M.2). <code>ls -l /dev/apex_0</code> desde dentro del contenedor debería mostrar el grupo <code>apex</code> — si no, añade el alineamiento de GID a <code>/etc/group</code> o cambia el contenedor a modo privilegiado.",
|
||||
"logsTitle": "Revisa los logs del host y del contenedor",
|
||||
"logsBody": "En el host: <code>journalctl -u pvedaemon | grep -i coral</code>. Dentro del contenedor: revisa los logs de la app (Frigate: <code>/config/logs/</code>, CodeProject.AI: su propio directorio de logs). El patrón clásico de error es \"Coral detected, runtime loaded, but inference engine can't claim it\" — eso son permisos 9 de cada 10 veces."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Instalar Coral TPU (Host)",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — prerequisito necesario para tarjetas Coral M.2 / PCIe antes de pasarlas a un CT."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — el mismo patrón para GPUs (a menudo emparejado con una Coral TPU en setups de Frigate)."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir GPU a VM (Passthrough) | ProxMenux Documentation",
|
||||
"description": "Pasa una GPU Intel, AMD o NVIDIA a una VM Proxmox con rendimiento cercano al nativo. ProxMenux gestiona la preparación del host (módulos VFIO, blacklist de drivers, cmdline del kernel), la configuración de la VM (hostpci, función de audio, hermanos del grupo IOMMU), workarounds específicos del fabricante (Code 43 de NVIDIA, reset bug de AMD, dump de ROM) y conflictos de switch-mode con LXCs."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir GPU a VM (Passthrough)",
|
||||
"description": "Dale una de tus GPUs a una máquina virtual con rendimiento cercano al nativo. ProxMenux detecta Intel / AMD / NVIDIA, valida IOMMU, analiza el grupo IOMMU de la GPU para pasar cada dispositivo hermano junto, configura VFIO en el host, escribe las líneas hostpci correctas en la config de la VM y aplica fixes específicos del fabricante cuando hace falta.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Todo lo que la <pveLink>wiki oficial de Proxmox de PCI passthrough</pveLink> te explica paso a paso manualmente — habilitar IOMMU, módulos VFIO, blacklisting de drivers, descubrimiento de vendor ID, setup de <code>hostpci</code>, dump de ROM en AMD, ocultación de KVM en NVIDIA — hecho en una sola ejecución con comprobaciones de cordura en cada paso. El script también es consciente de las <em>otras</em> cosas en tu host: si la misma GPU ya está asignada a un LXC u otra VM, te ofrece migrar limpiamente en lugar de romper silenciosamente el setup existente."
|
||||
},
|
||||
"who": {
|
||||
"heading": "¿Para quién es esto?",
|
||||
"body": "Tienes una GPU física en tu host Proxmox y quieres que una <strong>máquina virtual</strong> (Windows gaming, macOS, un nodo headless de cómputo en GPU, un media server en VM) la use directamente. Pasar una GPU a una VM no es lo mismo que pasarla a un LXC — las VMs necesitan que el kernel trate la GPU como dispositivo VFIO (en esencia \"el host no la tocará\"), lo que significa que el host no puede usar esa GPU para nada más mientras la VM esté en ejecución. Para transcoding / cómputo en <em>LXC</em>, usa <lxcLink>Añadir GPU a LXC</lxcLink> — comparte la GPU y no necesita VFIO."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU soportada</strong> instalada físicamente. El script detecta Intel, AMD y NVIDIA vía <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>Virtualización IOMMU</strong> disponible en BIOS/UEFI (Intel VT-d o AMD-Vi). Si está apagada a nivel de firmware, ninguna config de Linux lo arregla — tienes que habilitarla primero en la BIOS. El script detecta esto y se ofrece a habilitarlo en el lado del SO.",
|
||||
"q35": "La VM destino usa machine type <strong>q35</strong>. El antiguo <code>i440fx</code> no soporta de forma fiable el passthrough PCIe y el script se negará a continuar.",
|
||||
"q35Check": "qm config '<'vmid'>' | grep machine",
|
||||
"moreGpus": "Preferiblemente <strong>más de una GPU</strong> en el host, o acceso por consola en otra salida (IPMI, KVM-over-IP, serie). Una vez pases la única GPU a una VM, la consola del host se queda a oscuras. Con dos GPUs NVIDIA puedes pasar una a una VM y mantener la otra en el host — el script gestiona esto por BDF (ver <em>NVIDIA</em> en las notas del fabricante más abajo).",
|
||||
"nvidiaInstalled": "Si estás en un Proxmox que ya instaló el driver de NVIDIA vía <nvidiaLink>NVIDIA Drivers en el host</nvidiaLink>: la GPU que pases a la VM se desvincula del driver <code>nvidia</code> del host y se vincula a <code>vfio-pci</code>. El módulo <code>nvidia</code> sigue cargado, así que cualquier <strong>otra</strong> GPU NVIDIA que tengas en el host sigue funcionando con <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Passthrough a VM vs compartición con LXC — elige uno por GPU",
|
||||
"body": "Una GPU vinculada a <code>vfio-pci</code> para passthrough a VM no puede usarla simultáneamente el host ni un LXC. Si tienes dos GPUs, puedes dedicar una a cada ruta. Si solo tienes una, elige:",
|
||||
"vmItem": "<strong>Ruta VM (esta página):</strong> acceso completo al hardware, pero exclusivo para la VM dueña de la GPU mientras esté en ejecución.",
|
||||
"lxcItem": "<strong>Ruta LXC (<lxcLink>Añadir GPU a LXC</lxcLink>):</strong> compartida con el host y otros contenedores, ideal para transcoding, sin magia VFIO."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add GPU to VM</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add GPU to VM' dentro de Hardware: GPUs and Coral-TPU"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene tres fases con separación clara entre \"recopilar información y decisiones\" y \"aplicar cambios realmente\". Hasta la confirmación final, no se ha tocado nada en tu host ni en la VM."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"detect": {
|
||||
"title": "Detectar GPUs y comprobar IOMMU",
|
||||
"body": "El script lista cada GPU que encuentra. Si IOMMU no está ya habilitado en la cmdline del kernel en ejecución, recibirás un prompt sí/no para añadir <code>intel_iommu=on</code> (o <code>amd_iommu=on</code>) + <code>iommu=pt</code> al archivo de arranque correcto — <code>/etc/kernel/cmdline</code> en ZFS (systemd-boot) o <code>/etc/default/grub</code> en LVM/ext4. Si aceptas y la cmdline del kernel cambia, el script marca que el prompt de reinicio al final será obligatorio.",
|
||||
"tipTitle": "¿Ya ejecutaste post-instalación?",
|
||||
"tipBody": "Si habilitaste anteriormente <postLink>soporte VFIO IOMMU</postLink> desde los scripts post-instalación, IOMMU ya está activo y este paso pasa silenciosamente. Bien.",
|
||||
"imageAlt": "Lista de GPUs detectadas con fabricante y dirección PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Elegir una GPU y ejecutar las comprobaciones previas",
|
||||
"intro": "Una vez eliges la GPU, el script ejecuta una serie de comprobaciones que pueden bloquear el progreso:",
|
||||
"items": [
|
||||
"<strong>No en SR-IOV.</strong> Si el dispositivo es una Virtual Function o una Physical Function con VFs activas, el passthrough chocaría con el uso de SR-IOV. Bloqueado.",
|
||||
"<strong>Aviso de GPU única.</strong> Si esta es la única GPU del host, recibirás un diálogo de aviso recordándote que después del reinicio la consola se queda a oscuras — asegúrate de tener acceso SSH o por la UI web desde otra máquina.",
|
||||
"<strong>Método de reset AMD.</strong> Las GPUs AMD tienen un largo historial de no resetear limpiamente entre paradas y arranques de VM. El script comprueba <code>/sys/bus/pci/devices/<pci>/reset_method</code>: si la tarjeta es una APU sin FLR <em>bloquea</em> (prácticamente inutilizable); una tarjeta AMD dedicada sin FLR también se bloquea; cualquier cosa con un modo de reset desconocido avisa pero te deja continuar con override explícito.",
|
||||
"<strong>No en D3cold.</strong> Algunas tarjetas AMD reportan estado de energía <code>D3cold</code> en reposo, lo que las hace invisibles durante el arranque de la VM. Bloqueado hasta que despiertes la GPU.",
|
||||
"<strong>Análisis del grupo IOMMU.</strong> Lee <code>/sys/kernel/iommu_groups/</code> para encontrar cada dispositivo no-bridge del grupo de la GPU. <em>Todos ellos</em> se pasarán a la VM juntos — si tu placa base agrupa la GPU con una tarjeta de red, la tarjeta de red va también."
|
||||
],
|
||||
"audioIntro": "<strong>Audio compañero.</strong> Dos rutas, según dónde viva el audio:",
|
||||
"audioDgpu": "<strong>GPU discreta (NVIDIA / AMD):</strong> el audio HDMI está en la misma tarjeta como función <code>.1</code> del slot PCI de la GPU. Incluido automáticamente. Este dispositivo de audio nunca lo usó el host, así que nadie pierde nada.",
|
||||
"audioIgpu": "<strong>iGPU Intel (o cualquier GPU sin hermano <code>.1</code>):</strong> el audio HDMI / analógico vive en el chipset en un slot distinto (<code>00:1f.3</code> normalmente). El script escanea el host, lista cada controlador de audio PCI con su driver actual (<code>snd_hda_intel</code>, etc.) y te pregunta cuál(es) pasar. Por defecto <strong>ninguno</strong> — tienes que aceptarlo explícitamente."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Elegir la VM destino",
|
||||
"body": "Se te muestra la lista de VMs del host y eliges una. El script comprueba que la VM es q35 — los machine types BIOS/i440fx se rechazan porque el passthrough PCIe en ellos no es fiable. Si tienes una VM q35 con la GPU ya asignada (parcial o completamente), la entrada existente se reutiliza en lugar de duplicarse.",
|
||||
"imageAlt": "Lista de VMs con nombre, ID y estado mostrada como selector"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Switch mode — gestionar que la GPU ya esté en otro sitio",
|
||||
"intro": "El script escanea cada config de VM y cada config de LXC en el host buscando la GPU que elegiste. Tres resultados posibles:",
|
||||
"items": [
|
||||
"<strong>La GPU está libre.</strong> Nada que hacer, continúa.",
|
||||
"<strong>La GPU está en otra VM.</strong> Se te ofrece quitarla de esa otra VM antes de asignarla aquí. Si rechazas, el script aborta — dos VMs no pueden compartir una asignación VFIO exclusiva.",
|
||||
"<strong>La GPU está en un LXC (modo compartido).</strong> Se te ofrece quitar la configuración de passthrough del LXC (líneas <code>lxc.cgroup2.devices.allow</code> + <code>lxc.mount.entry</code>). El LXC dejará de ver la GPU, pero la VM la verá — esta es la mecánica de \"switch mode\" que le da a esta entrada de menú su etiqueta secundaria."
|
||||
],
|
||||
"imageAlt": "Diálogo que ofrece quitar la GPU de un LXC antes de asignarla a la VM",
|
||||
"smartTitle": "Los hermanos de audio también se limpian con inteligencia",
|
||||
"smartBody": "Si la VM origen tenía dispositivos de audio extra adjuntos junto a la GPU, el script quita <strong>solo los que ahora son huérfanos</strong> — es decir, entradas de audio cuyo hermano de display también se está quitando. El audio vinculado a otra GPU que se queda en la VM se deja intacto. Esto importa cuando desadjuntas una iGPU Intel (que comparte el audio del chipset) de una VM que también tiene una tarjeta dedicada NVIDIA / AMD aún pasada: el audio HDMI de la dGPU (<code>02:00.1</code>) se queda, el audio del chipset (<code>00:1f.3</code>) se va."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "(Si no hay hermano .1) Elegir qué controladores de audio incluir",
|
||||
"body": "Solo ocurre para iGPUs Intel y setups similares con audio separado. Una checklist muestra cada controlador de audio PCI del host (excluyendo cualquiera ya en el grupo IOMMU de la GPU), etiquetado con su driver actual. Selecciona los que quieras — o ninguno, si la VM no necesita audio del hardware del host.",
|
||||
"imageAlt": "Diálogo checklist con cada controlador de audio PCI del host (BDF + driver) cuando la GPU no tiene audio hermano .1",
|
||||
"warnTitle": "No marques audio del que depende el host",
|
||||
"warnBody": "Si el host usa actualmente un controlador de audio para algo — por ejemplo, el beep del shell de Proxmox o una VM a la que ya lo has pasado — marcarlo aquí significa que el host (y cualquier otra VM que lo comparta) pierde acceso después del reinicio. Ante la duda, déjalo vacío y siempre puedes volver a ejecutar el script más tarde para añadir audio si hace falta."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Revisar el resumen de confirmación",
|
||||
"body": "Un diálogo final muestra exactamente qué está a punto de cambiar en el host y en la VM. Esta es la última salida — si algo se ve mal (un dispositivo extra en el grupo IOMMU que no esperabas, la GPU equivocada, la VM equivocada), cancela aquí y aún no se ha tocado nada.",
|
||||
"imageAlt": "Diálogo de resumen listando los cambios del host (archivos VFIO/blacklist) y los cambios de config de la VM (líneas hostpci) antes de aplicar"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Se aplican los cambios del host",
|
||||
"intro": "La Fase 2 se ejecuta de forma no interactiva. En el lado del host el script puede tocar:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> — añade <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (más <code>vfio_virqfd</code> en kernels < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — para AMD / Intel, define <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code> para que VFIO reclame la GPU pronto en el arranque. Para NVIDIA el archivo solo añade <code>softdep nvidia pre: vfio-pci</code> (más <code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>) — el binding real es por BDF vía la regla udev de abajo. En AMD, también añade líneas <code>softdep</code> forzando que <code>vfio-pci</code> cargue antes de <code>radeon</code> / <code>amdgpu</code>.",
|
||||
"<code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> y <code>kvm.conf</code> — workarounds sensatos que la mayoría de VMs Windows / macOS necesitan (<code>allow_unsafe_interrupts=1</code>, <code>ignore_msrs=1</code>).",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code> — pone en blacklist los drivers open-source compañeros (<code>nouveau</code>, <code>amdgpu</code>, <code>radeon</code>, <code>i915</code>) que si no agarrarían la GPU antes que VFIO. El módulo propietario <code>nvidia</code> <strong>nunca se pone en blacklist</strong> — sigue disponible para cualquier OTRA GPU NVIDIA que mantengas en el host.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>solo NVIDIA</strong>. Estado de binding por BDF. La regla udev aplica <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> en el evento PCI ADD para cada Bus:Device.Function rastreado, así que solo las GPUs que has pasado explícitamente van a VFIO. Esto es lo que hace que NVIDIA multi-GPU funcione — tus otras tarjetas NVIDIA mantienen su driver <code>nvidia</code> y siguen siendo usables en el host.",
|
||||
"<strong>Solo AMD.</strong> Vuelca la ROM de la GPU desde sysfs (<code>/sys/bus/pci/.../rom</code>) o la tabla ACPI VFCT a <code>/usr/share/kvm/vbios_<card>.bin</code>. La VM la referencia vía <code>romfile=</code> para que las tarjetas que mal-reportan su propia VBIOS aún inicialicen correctamente.",
|
||||
"<strong>Solo NVIDIA.</strong> Para y deshabilita los servicios NVIDIA del host que podrían sondear / bloquear la GPU en el arranque (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>). El propio módulo <code>nvidia</code> se deja cargado para que otras GPUs NVIDIA del host sigan funcionando con <code>nvidia-smi</code>.",
|
||||
"<code>update-initramfs -u -k all</code> — solo se ejecuta si algo de lo de arriba ha cambiado realmente."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "La config de la VM se aplica vía qm set",
|
||||
"body": "La config de la VM en <code>/etc/pve/qemu-server/<vmid>.conf</code> se actualiza vía <code>qm set</code> (nunca por <code>sed</code> directo):",
|
||||
"after1": "Se añade un flag <code>x-vga=1</code> para cada fabricante <strong>excepto</strong> iGPU Intel — las GPUs integradas Intel no tienen VRAM dedicada para una consola pre-arranque, así que ese flag causa hangs.",
|
||||
"after2": "Se añaden líneas <code>hostpciN</code> adicionales si el grupo IOMMU de la GPU contiene otros dispositivos que necesitas pasar juntos."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar si se tocó la config del host",
|
||||
"body": "Si la Fase 2 cambió algo a nivel de módulo de kernel / cmdline / blacklist, se te pedirá reiniciar. El reinicio es obligatorio antes de arrancar la VM — si no la GPU sigue retenida por el driver del host y VFIO no puede reclamarla.",
|
||||
"imageAlt": "Pantalla de resumen mostrando qué se cambió, seguida de un prompt de reinicio"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notas específicas del fabricante",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Los drivers de consumo de NVIDIA detectan que están corriendo en una VM y se niegan a inicializar con el infame error <em>\"Code 43\"</em>. El workaround de ProxMenux: ocultar KVM al guest (<code>hidden=1</code>), poner un hypervisor vendor ID falseado <code>NV43FIX</code> en la línea <code>args</code> y pasar <code>kvm=off</code>. Esto ha funcionado de forma fiable en drivers GeForce durante años. En tarjetas datacenter / Tesla / Quadro esto no hace falta — esos drivers están licenciados para virtualización.",
|
||||
"nvidiaMultiHeading": "Soporte NVIDIA multi-GPU",
|
||||
"nvidiaMultiBody": "Los hosts con dos o más GPUs NVIDIA son de primera clase. Puedes pasar una tarjeta a una VM y mantener la(s) otra(s) en el host para <code>nvidia-smi</code>, compartición de GPU con LXC o cualquier carga del lado del host. ProxMenux vincula VFIO <strong>por BDF</strong> (Bus:Device.Function) vía una regla udev en lugar de poner en blacklist globalmente el módulo <code>nvidia</code> — así el destino de cada tarjeta es independiente de las otras, incluso cuando ambas GPUs son del mismo modelo y comparten el mismo ID <code>vendor:device</code>. El driver nvidia del host sigue cargado; solo los BDFs específicos que selecciones se redirigen a <code>vfio-pci</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "El \"AMD reset bug\" significa que algunas tarjetas crashean cuando la VM para y no pueden re-inicializarse sin un reinicio del host. ProxMenux pre-criba para esto leyendo el método de reset PCI, pero no puede arreglarlo después. Si lo encuentras, el fix de la comunidad es el módulo de kernel <vendorResetLink>vendor-reset</vendorResetLink>. El script no lo instala automáticamente — el módulo es una build DKMS que añades tú si ves fallos de reset. También en guests Windows, el servicio <em>RadeonResetBugFix</em> es el workaround común a nivel userspace.",
|
||||
"intelHeading": "iGPU Intel",
|
||||
"intelBody": "El passthrough de iGPU Intel es inestable pero posible en generaciones UHD 630+ con <sriovLink>i915-sriov-dkms</sriovLink> para SR-IOV. Para un caso simple de \"darle la iGPU a una VM\", el script la vincula exactamente como una GPU dedicada, pero se salta <code>x-vga=1</code> (las iGPUs no llevan una VBIOS pre-arranque). Perderás la salida de consola del host — planifícalo en consecuencia."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"code43Title": "Code 43 en Windows (NVIDIA)",
|
||||
"code43Body": "Los args de ocultación de KVM no se aplicaron. Comprueba <code>qm config <vmid> | grep -E \"cpu|args\"</code> — deberías ver <code>hidden=1</code> y <code>hv_vendor_id=NV43FIX</code>. Si faltan, vuelve a ejecutar el script y reselecciona la misma VM.",
|
||||
"amdResetTitle": "La GPU AMD funciona una vez, falla al reiniciar la VM",
|
||||
"amdResetBody": "El AMD reset bug. Soluciones (en orden): (1) reiniciar el host — la GPU será usable de nuevo para un ciclo más de VM; (2) instalar el módulo DKMS <code>vendor-reset</code> y añadir <code>softdep amdgpu pre: vendor-reset</code>; (3) dentro de Windows, instalar el servicio <em>RadeonResetBugFix</em>.",
|
||||
"stuckBootTitle": "VM colgada arrancando / GPU no detectada",
|
||||
"stuckBootBody": "Confirma que VFIO realmente retiene la GPU al arrancar: <code>lspci -nnk -d vendor:device</code> debe mostrar <code>Kernel driver in use: vfio-pci</code>. Si aún muestra el driver del fabricante, el blacklist no surtió efecto — revisa <code>/etc/modprobe.d/blacklist.conf</code> y <code>dmesg | grep vfio</code>, y regenera initramfs: <code>update-initramfs -u -k all</code> y luego reinicia.",
|
||||
"darkTitle": "La consola del host se queda a oscuras tras reiniciar y no puedo entrar por SSH",
|
||||
"darkBody": "Pasaste la GPU primaria sin tener acceso alternativo. Arranca en un recovery shell (ISO de rescate, IPMI), quita las líneas de la config de la VM (<code>/etc/pve/qemu-server/<vmid>.conf</code>) y quita las opciones vfio:",
|
||||
"logTitle": "Revisa el log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/add_gpu_vm.log</code>. Adjúntalo cuando pidas ayuda en GitHub."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Revertir manualmente",
|
||||
"intro": "Hoy no hay un atajo dedicado de \"quitar GPU de la VM\" en ProxMenux. Para desadjuntar limpiamente:"
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — instala los drivers en el host primero si también quieres la GPU usable desde ahí."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — modelo alternativo: comparte la GPU con varios contenedores en lugar de dedicarla a una VM."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — cambia la misma GPU entre modos sin rehacer todo el cableado."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia de lspci, verificación de IOMMU, qm set hostpci."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir GPU a LXC | ProxMenux Documentation",
|
||||
"description": "Comparte una GPU Intel, AMD o NVIDIA con un contenedor LXC para transcoding acelerado por hardware (Plex / Jellyfin / Frigate), cargas OpenCL / CUDA y aceleración de vídeo Mesa. ProxMenux gestiona los nodos de dispositivo, la alineación de GIDs y la instalación de drivers específica por distro dentro del contenedor."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir GPU a LXC",
|
||||
"description": "Comparte una o varias GPUs con un contenedor LXC de Proxmox. El host sigue usando la GPU con normalidad — el contenedor solo recibe acceso a través de los nodos de dispositivo. Funciona con iGPUs Intel (Quick Sync / VA-API), tarjetas AMD (Mesa / ROCm) y NVIDIA (CUDA / NVENC).",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Añade entradas <code>dev<N></code> a la config del LXC (<code>/etc/pve/lxc/<ctid>.conf</code>) para que el contenedor vea <code>/dev/dri/*</code>, <code>/dev/kfd</code> o <code>/dev/nvidia*</code> — lo que aplique a tu GPU. Luego arranca el contenedor, detecta la distro de dentro e instala los drivers de userspace correspondientes (Mesa, intel-media-driver, runtime NVIDIA…) para que apps como Plex, Jellyfin o Frigate usen realmente la GPU para transcoding. Los GIDs (<code>video</code>, <code>render</code>) se alinean entre host y contenedor para que los permisos coincidan."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Compartición LXC vs passthrough a VM",
|
||||
"intro": "Los contenedores LXC comparten el kernel del host, así que pueden <em>compartir</em> la GPU del host sin apropiársela. Esa es una gran diferencia con las VMs: con <vmLink>passthrough a VM</vmLink> la GPU es exclusiva de una VM y el host no puede usarla. Con LXC, varios contenedores más el host pueden usar a la vez la misma GPU.",
|
||||
"headerFeature": "Característica",
|
||||
"headerLxc": "LXC (esta página)",
|
||||
"headerVm": "VM",
|
||||
"rows": [
|
||||
{
|
||||
"feature": "¿El host sigue usando la GPU?",
|
||||
"lxc": "Sí",
|
||||
"vm": "No — exclusiva de la VM"
|
||||
},
|
||||
{
|
||||
"feature": "¿Varios contenedores compartiendo una GPU?",
|
||||
"lxc": "Sí",
|
||||
"vm": "No"
|
||||
},
|
||||
{
|
||||
"feature": "¿Requiere IOMMU / VFIO en el host?",
|
||||
"lxc": "No",
|
||||
"vm": "Sí"
|
||||
},
|
||||
{
|
||||
"feature": "¿Hace falta reiniciar?",
|
||||
"lxc": "Normalmente no (solo reiniciar el CT)",
|
||||
"vm": "Sí, siempre"
|
||||
},
|
||||
{
|
||||
"feature": "¿Soporta correr cualquier SO?",
|
||||
"lxc": "Solo Linux (LXC es solo Linux)",
|
||||
"vm": "Windows, macOS, cualquier Linux"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU en el host</strong> — iGPU Intel, dGPU o APU AMD, o una tarjeta NVIDIA. El script autodetecta los tres vía <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>La GPU NO está vinculada a vfio-pci.</strong> Si la GPU está actualmente asignada a una VM vía passthrough, es invisible para el driver del kernel del host y el LXC no puede usarla. El script detecta esto y se ofrece a ejecutar <switchLink>Switch GPU Mode</switchLink> por ti.",
|
||||
"nvidia": "<strong>Solo para NVIDIA:</strong> el driver NVIDIA del host debe estar ya instalado — ProxMenux necesita hacer coincidir las libs userspace del contenedor con la versión del host. Si aún no lo has hecho, ejecuta <nvidiaLink>Instalar drivers NVIDIA en el host</nvidiaLink> primero.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>Un contenedor LXC existente.</strong> El script opera sobre un contenedor que ya creaste — no crea uno. El contenedor debería idealmente ser <strong>privilegiado</strong> (unprivileged funciona pero necesita mapeo UID/GID que el script no configura)."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Funciona en contenedores privilegiados y unprivileged",
|
||||
"body": "El script escribe entradas <code>dev<N></code> en la config del LXC y, en contenedores unprivileged, alinea los GIDs de <code>video</code> y <code>render</code> entre host y contenedor para que los nodos de la GPU sean accesibles desde dentro sin tener que tocar manualmente <code>lxc.idmap</code>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add GPU to LXC</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add GPU to LXC' dentro de Hardware: GPUs and Coral-TPU"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Dos fases: todas las decisiones por adelantado, luego todos los cambios de una vez. No se toca nada en tu contenedor hasta que confirmas."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"detect": {
|
||||
"title": "Detectar GPUs del host",
|
||||
"body": "El script escanea <code>lspci</code> buscando controladoras VGA / 3D / Display que coincidan con Intel, AMD o NVIDIA. Para NVIDIA también verifica que el módulo de kernel <code>nvidia</code> esté cargado y que <code>nvidia-smi</code> funcione — la versión del driver del host que reporta se usará para elegir el instalador <code>.run</code> correcto para el contenedor.",
|
||||
"tipTitle": "¿NVIDIA no está listo?",
|
||||
"tipBody": "Si NVIDIA se detecta pero el módulo no está cargado, el script no ofrecerá la ruta NVIDIA. Ejecuta <nvidiaLink>Instalar drivers NVIDIA en el host</nvidiaLink> primero (y reinicia), luego vuelve."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Elige un contenedor LXC",
|
||||
"body": "Verás una lista de cada LXC del host con su ID y nombre. Elige el que debería recibir la GPU. El contenedor puede estar en ejecución o parado — el script gestiona ambos casos (lo para brevemente durante la config, lo reinicia y lo deja en su estado original al final).",
|
||||
"imageAlt": "Diálogo listando los contenedores LXC existentes para elegir"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Selecciona la(s) GPU(s) a añadir",
|
||||
"body": "Si hay más de una GPU presente, recibes una checklist. Puedes añadir varias al mismo contenedor (p. ej., una iGPU Intel para Quick Sync + una dGPU AMD para ROCm). Si solo se detecta una GPU, se autoselecciona.",
|
||||
"imageAlt": "Checklist mostrando las GPUs detectadas (Intel / AMD / NVIDIA) con fabricante y dirección PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Comprobaciones previas",
|
||||
"imageAlt": "Diálogo que ofrece ejecutar Switch GPU Mode cuando la GPU seleccionada sigue vinculada a vfio-pci para passthrough a VM",
|
||||
"intro": "Tres comprobaciones, cualquiera de las cuales puede bloquearte o redirigirte:",
|
||||
"items": [
|
||||
"<strong>SR-IOV.</strong> Si la GPU seleccionada es una Virtual Function (VF) o una Physical Function con VFs activas, el passthrough a LXC no aplica — el dispositivo lo gestiona el driver SR-IOV. Bloqueado.",
|
||||
"<strong>Vinculada a vfio-pci.</strong> Si la GPU está actualmente retenida por VFIO para passthrough a VM, el kernel del host no puede crear nodos <code>/dev/dri/*</code> o <code>/dev/nvidia*</code> para ella. El script se ofrece a ejecutar <switchLink>Switch GPU Mode</switchLink> que deshace el binding VFIO; probablemente necesitarás un reinicio antes de volver a ejecutar Añadir GPU a LXC.",
|
||||
"<strong>Ya configurada.</strong> Si el contenedor ya tiene todos los nodos de dispositivo para la GPU seleccionada, el script lo dice y sale limpiamente. Si está parcialmente configurada, continúa solo con las piezas que faltan."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Aplica los cambios de config del LXC",
|
||||
"body1": "El script para el contenedor, edita <code>/etc/pve/lxc/<ctid>.conf</code> y añade entradas <code>dev<N></code> con los GIDs correctos para las GPUs seleccionadas. Usar entradas <code>dev:</code> (en lugar de las viejas líneas <code>lxc.mount.entry</code>) es la forma moderna de Proxmox — los permisos de grupo se aplican en tiempo de parseo de la config en lugar de en tiempo de mount.",
|
||||
"body2": "Ejemplo después de Intel + NVIDIA en el mismo contenedor:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Arranca el contenedor e instala los drivers dentro",
|
||||
"body": "Una vez escrita la config, el script arranca el contenedor, espera hasta ~30 segundos a que <code>pct exec</code> responda y luego detecta la distro del contenedor desde <code>/etc/os-release</code>. En base a eso, instala los paquetes userspace correctos.",
|
||||
"headerDistro": "Distro",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
{
|
||||
"distro": "Alpine",
|
||||
"intel": "apk add mesa-va-gallium intel-media-driver libva-utils",
|
||||
"nvidia": "apk add nvidia-utils"
|
||||
},
|
||||
{
|
||||
"distro": "Arch / Manjaro",
|
||||
"intel": "pacman -Sy intel-media-driver mesa libva-utils",
|
||||
"nvidia": "pacman -Sy nvidia-utils"
|
||||
}
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / otras",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "extraer el <code>.run</code> del host → <code>pct push</code> → ejecutar con <code>--no-kernel-modules --no-dkms</code>",
|
||||
"whyTitle": "Por qué el baile del .run de NVIDIA en Debian",
|
||||
"whyBody": "Debian / Ubuntu no traen paquetes NVIDIA con una versión lo bastante granular como para coincidir con el driver del host byte por byte. Las libs userspace dentro del contenedor <strong>deben coincidir con la versión del módulo de kernel</strong> cargado en el host, o <code>nvidia-smi</code> falla con un version mismatch. ProxMenux lo resuelve usando exactamente el mismo instalador <code>.run</code> que se usó para el host — extraído, tarred, enviado al contenedor con <code>pct push</code> y ejecutado con <code>--no-kernel-modules --no-dkms</code> para que solo se toque el userspace."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Alinear GIDs y restaurar el estado",
|
||||
"body1": "Los archivos de dispositivo en el host pertenecen al grupo <code>video</code> (GID 44) o <code>render</code> (GID 104). La distro del contenedor puede traer números de GID distintos para esos grupos, lo que haría que los nodos de la GPU fueran inalcanzables desde dentro. El script reescribe <code>/etc/group</code> en el contenedor para que <code>video:44</code> y <code>render:104</code> coincidan exactamente.",
|
||||
"body2": "Finalmente, restaura el contenedor a su estado original — si estaba parado cuando empezaste, se vuelve a parar. Si estaba en ejecución, se queda en ejecución."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notas específicas del fabricante",
|
||||
"intelHeading": "iGPU Intel",
|
||||
"intelBody": "La ruta más común — ideal para transcoding por hardware de Plex / Jellyfin / Frigate vía <em>Quick Sync</em>. El contenedor recibe <code>/dev/dri/card0</code> (legacy) y <code>/dev/dri/renderD128</code> (nodo render-only moderno — lo que las apps usan realmente). No hace falta cambios del lado del host; el driver <code>i915</code> del host ya creó los nodos.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Los mismos nodos DRI que Intel para gráficos / VA-API. Si <code>/dev/kfd</code> existe en el host (soporte de cómputo AMD / kernel ROCm), el script también lo añade para que los contenedores puedan hacer cargas OpenCL / ROCm. Los drivers VA de Mesa cubren el lado de decodificación de vídeo.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Añade cada nodo <code>/dev/nvidia*</code> que el host expone. La pieza crítica es <strong>el matching de versión de driver</strong>: la versión del módulo del host y la versión de la lib userspace del contenedor deben ser idénticas, si no <code>nvidia-smi</code> dentro del contenedor falla. ProxMenux captura la versión del host en tiempo de detección y usa el mismo archivo <code>.run</code> para instalar el userspace del contenedor. Para contenedores Debian, la instalación sube la memoria del contenedor a 2 GB temporalmente (el instalador necesita ~1.5 GB libres para extraer) y la restaura después.",
|
||||
"updateTitle": "Después de actualizar el driver NVIDIA del host, vuelve a ejecutar este script",
|
||||
"updateBody": "Cuando actualizas el driver NVIDIA en el host, las libs userspace del contenedor se quedan en la versión vieja y <code>nvidia-smi</code> dentro del contenedor se rompe. El <nvidiaLink>instalador NVIDIA host</nvidiaLink> de ProxMenux detecta los contenedores con passthrough NVIDIA y se ofrece a actualizarlos automáticamente — pero si te saltaste ese prompt, simplemente ejecuta Añadir GPU a LXC otra vez sobre el mismo contenedor y refrescará el userspace."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación",
|
||||
"body": "Después de que el script termine, entra en el contenedor y comprueba que la GPU es visible:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "La versión userspace del contenedor ≠ la versión del módulo del host. Ejecuta Añadir GPU a LXC otra vez sobre ese contenedor — el script extrae el <code>.run</code> actual del host y reinstala el userspace haciéndolo coincidir.",
|
||||
"denyTitle": "Permission denied en /dev/dri/renderD128 dentro del contenedor",
|
||||
"denyBody": "Normalmente uno de: (1) el contenedor es unprivileged sin mapeo UID/GID al grupo <code>render</code> del host; (2) el usuario dentro del contenedor no está en el grupo <code>render</code>. Fix: añade el usuario a <code>render</code> dentro del contenedor (<code>usermod -aG render <user></code>), o pasa a modo privilegiado si la carga es de confianza.",
|
||||
"vainfoTitle": "vainfo dice: VA-API version 1.xx; failed to initialize",
|
||||
"vainfoBody": "El runtime de VA-API está, pero no se instaló ningún driver adecuado. En Intel, instala <code>intel-media-driver</code> (gens nuevas) o <code>i965-va-driver</code> (gens viejas). En AMD, <code>mesa-va-drivers</code>. Vuelve a ejecutar el script en caso de duda.",
|
||||
"logTitle": "Log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/add_gpu_lxc.log</code> en el host. Inclúyelo cuando pidas ayuda en GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — prerequisito necesario para GPUs NVIDIA antes de pasarlas a un contenedor."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — modelo alternativo cuando necesitas la GPU dedicada a una sola VM."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alterna la misma GPU entre compartición LXC y passthrough a VM."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia rápida para comandos shell relacionados."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar Coral TPU en el host | ProxMenux Documentation",
|
||||
"description": "Instala los drivers de Google Coral TPU en un host Proxmox VE. ProxMenux autodetecta si tienes M.2 / Mini-PCIe o el USB Accelerator (o ambos) y ejecuta solo la ruta de instalación que aplica — módulos de kernel gasket/apex vía DKMS para PCIe, runtime libedgetpu1-std para USB."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar Coral TPU en el host",
|
||||
"description": "Prepara el host Proxmox para que más adelante se pueda pasar una Coral TPU a un contenedor LXC. ProxMenux autodetecta si tienes una tarjeta M.2 / Mini-PCIe, un USB Accelerator, o ambos, y ejecuta solo la ruta de instalación que aplica — build del módulo de kernel vía DKMS para PCIe, runtime Edge TPU de Google para USB.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "El instalador de Coral es <strong>unificado y consciente del hardware</strong>: ejecutas una opción del menú y averigua qué tienes realmente. Las tarjetas M.2 / Mini-PCIe necesitan módulos de kernel (<code>gasket</code> + <code>apex</code>) construidos con DKMS para que sobrevivan a las actualizaciones de kernel. Los USB Accelerators solo necesitan el runtime Edge TPU de Google (<code>libedgetpu1-std</code>) desde el propio repositorio APT de Google. ¿Ambos tipos enchufados? Ambas rutas se ejecutan en secuencia."
|
||||
},
|
||||
"which": {
|
||||
"heading": "¿Qué Coral tengo?",
|
||||
"body": "Los dos tipos de dispositivos Coral que puedes enchufar en un host Proxmox se ven muy diferentes y la instalación del lado del host también es muy diferente. El script gestiona ambos, pero conviene saber qué tienes antes de ejecutar nada:",
|
||||
"headerForm": "Factor de forma",
|
||||
"headerDetect": "Detección",
|
||||
"headerInstall": "Tipo de instalación",
|
||||
"headerReboot": "¿Reiniciar?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(TPU dual-edge en una tarjeta M.2)",
|
||||
"pcieDetect": "PCI vendor <code>1ac1</code>",
|
||||
"pcieInstall": "Módulo de kernel (gasket + apex) vía DKMS",
|
||||
"pcieReboot": "Sí",
|
||||
"usbForm": "USB Accelerator",
|
||||
"usbFormSub": "(pequeño dongle de plástico)",
|
||||
"usbDetect": "USB <code>1a6e:089a</code> (sin programar) / <code>18d1:9302</code> (programado)",
|
||||
"usbInstall": "Runtime userspace (<code>libedgetpu1-std</code>) desde el repo APT de Google",
|
||||
"usbReboot": "No"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"coral": "<strong>Una Coral TPU enchufada en el host</strong> (M.2, Mini-PCIe o USB). Sin Coral no hay instalación — el script simplemente te dice que no se detectó nada y sale.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Acceso a internet</strong> en el host — para PCIe la ruta DKMS clona un repo de GitHub, para USB añade un repo APT de Google y descarga el paquete <code>libedgetpu1-std</code>.",
|
||||
"headers": "<strong>Headers del kernel disponibles vía APT</strong>. En Proxmox esto significa que <code>proxmox-headers-$(uname -r)</code> debe ser instalable — solo necesario para la ruta PCIe/M.2, pero el script lo trae automáticamente para que tú no tengas que hacerlo.",
|
||||
"reboot": "<strong>Asume un reinicio</strong> si tienes hardware PCIe. El módulo de kernel se construye y se carga al final, pero un arranque limpio es la forma limpia de confirmar que sale por sí solo."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "Esto solo prepara el host",
|
||||
"body": "Instalar Coral aquí deja el host <em>listo</em> — la TPU es visible para el kernel del host y se puede entregar a un LXC. Para <em>usarla</em> realmente desde un contenedor (Frigate, DeepStack, etc.), el siguiente paso es <lxcLink>Añadir Coral TPU a un LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Install/Update Coral TPU on Host</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Install/Update Coral TPU on Host' dentro de Hardware: GPUs and Coral-TPU"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El hardware se detecta primero, así que el plan de instalación se adapta a tu setup real. No se instala nada hasta que confirmas."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"detect": {
|
||||
"title": "Detección de hardware",
|
||||
"body": "El script lee <code>/sys/bus/pci/devices/*/vendor</code> buscando <code>0x1ac1</code> (Global Unichip Corp., el fabricante del silicio de los chips Coral TPU) y ejecuta <code>lsusb</code> buscando los IDs del USB Accelerator. El dispositivo USB tiene <strong>dos</strong> IDs según si su firmware ya se ha cargado:",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, estado <em>sin programar</em> (antes de que el runtime Edge TPU le hable por primera vez).",
|
||||
"<code>18d1:9302</code> — Google, estado <em>programado</em> (después de que el runtime le cargue firmware)."
|
||||
],
|
||||
"outro": "Si no se encuentra ninguno, recibes un diálogo informativo y el script sale limpiamente — sin cambios parciales en el host."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Prompt previo a la instalación",
|
||||
"body": "Antes de tocar nada, un único diálogo resume lo que se detectó y lo que se instalará. Puedes cancelar aquí sin ningún efecto secundario.",
|
||||
"imageAlt": "Diálogo previo a la instalación mostrando el hardware Coral detectado (cuenta de M.2/PCIe + cuenta de USB) y la lista de pasos que ejecutará el instalador"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Ruta PCIe — módulos de kernel gasket + apex vía DKMS",
|
||||
"body": "Solo se ejecuta si el script encontró una Coral PCIe / M.2. Es la más pesada de las dos rutas porque está compilando un módulo de kernel para tu kernel en ejecución exacto.",
|
||||
"items": [
|
||||
"<strong>Limpieza.</strong> Si una instalación anterior de <code>gasket-dkms</code> dejó dpkg en un estado roto (típico tras una actualización de kernel PVE 9 donde el autoinstall de DKMS falló silenciosamente), force-purge.",
|
||||
"<strong>Instalar dependencias de build:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Clonar el código del driver.</strong> Prefiere el fork de la comunidad <feranickLink>feranick/gasket-driver</feranickLink> (mantenimiento activo, listo para kernel 6.12+). Recurre a <googleLink>google/gasket-driver</googleLink> si feranick no es accesible, aplicando parches específicos del kernel:",
|
||||
"kernelPatches": [
|
||||
"Kernel 6.5+ : <code>no_llseek</code> eliminado en upstream → sustitución por <code>noop_llseek</code>",
|
||||
"Kernel 6.13+ : <code>MODULE_IMPORT_NS(DMA_BUF)</code> requiere literal de string"
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Stage del código en <code>/usr/src/gasket-1.0/</code>,</strong> generar <code>dkms.conf</code>, registrar con <code>dkms add</code>.",
|
||||
"<strong>Build + install:</strong> <code>dkms build</code> y luego <code>dkms install</code>. Si algo falla, las últimas 50 líneas de <code>make.log</code> se imprimen en el terminal para que veas el error real — sin tener que cazar en archivos de log.",
|
||||
"<strong>Crear el grupo <code>apex</code> + reglas udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) para que los nodos <code>/dev/apex_*</code> tengan el grupo correcto en el siguiente arranque.",
|
||||
"<strong>Cargar los módulos:</strong> <code>modprobe gasket</code> + <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "Progreso de build DKMS + salida de carga de módulo para los módulos de kernel gasket/apex"
|
||||
},
|
||||
"usb": {
|
||||
"title": "Ruta USB — runtime Edge TPU de Google",
|
||||
"body": "Solo se ejecuta si se detectó un USB Accelerator. Mucho más simple:",
|
||||
"items": [
|
||||
"<strong>Añadir la clave GPG de Google</strong> a <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Añadir el repositorio APT</strong> a <code>/etc/apt/sources.list.d/coral-edgetpu.list</code> con <code>signed-by=</code> apuntando al keyring (formato moderno, no deprecado).",
|
||||
"<strong>Instalar <code>libedgetpu1-std</code></strong> — el runtime Edge TPU de rendimiento estándar.",
|
||||
"<strong>Recargar udev</strong> para que las reglas que vienen con el paquete apliquen al dispositivo USB sin tener que desenchufar/reenchufar."
|
||||
],
|
||||
"stdTitle": "¿Por qué libedgetpu1-std y no libedgetpu1-max?",
|
||||
"stdBody": "La variante <code>max</code> overclockea la Coral y calienta más. Está bien para uso de desktop con ventilación; no recomendado en builds NUC / Mini-PC pequeños o hosts Proxmox refrigerados pasivamente. Si realmente la quieres, instálala a mano después: <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Prompt de reinicio (solo si se ejecutó PCIe)",
|
||||
"body": "Si la ruta PCIe se ejecutó, el script ofrece un reinicio. Los módulos ya se <code>modprobe</code>'aron así que en teoría puedes saltarte el reinicio — pero un arranque limpio es la forma correcta de verificar que el módulo sale por sí solo y que <code>/dev/apex_0</code> aparece con grupo <code>apex</code>. Para instalaciones solo USB, no se sugiere reinicio (el runtime y las reglas udev están activos inmediatamente).",
|
||||
"imageAlt": "Resumen final + prompt de reinicio después de una instalación PCIe"
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstalar o desinstalar",
|
||||
"intro": "Ejecutar el instalador en un host donde Coral ya está instalada (PCIe vía <code>gasket-dkms</code>, USB vía <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code>, o ambos) ya no cae directamente en otra instalación fresca. En su lugar, ProxMenux detecta el setup existente y muestra un menú de acciones para que decidas qué hacer.",
|
||||
"imageAlt": "Menú de acciones de Coral con dos opciones — Reinstalar / actualizar drivers Coral, o Desinstalar drivers y configuración Coral — mostrado cuando el instalador detecta una instalación previa de Coral en el host",
|
||||
"imageCaption": "El menú de acciones solo aparece cuando al menos un componente de Coral está ya instalado (entrada DKMS de gasket, paquete <code>libedgetpu1-*</code> o nodos de dispositivo <code>/dev/apex_*</code> en vivo).",
|
||||
"reinstallHeading": "Reinstalar / actualizar",
|
||||
"reinstallBody": "Continúa con el flujo normal de instalación — útil después de una actualización de kernel si la rebuild DKMS no ocurrió automáticamente, o para elevar el runtime a un <code>libedgetpu1-*</code> más nuevo del repo apt de Google Coral. Primero se limpia el estado DKMS anterior para que un paquete medio instalado de un intento previo fallido no bloquee el nuevo build.",
|
||||
"uninstallHeading": "Desinstalar — qué se elimina",
|
||||
"uninstallIntro": "Confirma con un diálogo sí/no antes de hacer nada (los contenedores LXC con passthrough de apex perderán acceso a <code>/dev/apex_*</code> después del siguiente reinicio — el aviso lo deja claro). Luego ejecuta un rollback completo e idempotente:",
|
||||
"uninstallItems": [
|
||||
"Descarga los módulos de kernel <code>apex</code> y <code>gasket</code>.",
|
||||
"Quita cada entrada <code>gasket/<version></code> registrada en DKMS para que los módulos no vuelvan en la siguiente instalación de kernel.",
|
||||
"Purga los paquetes apt <code>gasket-dkms</code>, <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code>, luego ejecuta <code>apt-get autoremove --purge</code>.",
|
||||
"Borra la regla udev <code>/etc/udev/rules.d/99-coral-apex.rules</code> que escribió ProxMenux; restaura el grupo de la regla upstream <code>60-gasket-dkms.rules</code> a su default si sigue presente.",
|
||||
"Elimina el grupo de sistema <code>apex</code> <strong>solo si ya no hay usuarios en él</strong> — si mapeaste un usuario custom a <code>apex</code> para un passthrough a LXC, el grupo se deja en su sitio y un aviso imprime los miembros actuales.",
|
||||
"Limpia la entrada del repositorio apt de Google Coral y el keyring (<code>/etc/apt/sources.list.d/coral-edgetpu.list</code> + <code>coral-edgetpu-archive-keyring.gpg</code>).",
|
||||
"Pide reiniciar al final <strong>solo si se instaló la ruta PCIe</strong> — la forma más limpia de descargar los módulos del kernel. Las desinstalaciones solo USB no lo necesitan."
|
||||
],
|
||||
"lxcWarnTitle": "Contenedores LXC con passthrough de apex",
|
||||
"lxcWarnBody": "Desinstalar en el host invalida la ruta de dispositivo mapeada a cualquier contenedor LXC configurado para passthrough de apex. Planifica la operación en una ventana de mantenimiento si Frigate / DeepStack / cargas similares dependen de ello."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notificaciones de actualización",
|
||||
"intro": "ProxMenux ahora rastrea los componentes Coral instalados en su registro de instalaciones gestionadas. Ambas variantes se siguen de forma independiente — un host con dispositivos Coral M.2 y USB recibe dos streams de actualización, cada uno con su propia fuente upstream:",
|
||||
"headerVariant": "Variante",
|
||||
"headerTracked": "Versión rastreada",
|
||||
"headerUpstream": "Fuente upstream",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "Versión Debian de <code>gasket-dkms</code> (o la versión registrada en DKMS si el paquete se quitó a la fuerza)",
|
||||
"pcieUpstream": "Último tag de <code>feranick/gasket-driver</code> en GitHub (caché de 7 días, comparación por número de build)",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "Versión apt de <code>libedgetpu1-std</code> o <code>libedgetpu1-max</code>",
|
||||
"usbUpstream": "Candidato local de <code>apt-cache policy</code> (repo apt de Google Coral)",
|
||||
"outro": "Cuando se detecta una versión más nueva el Monitor dispara una notificación <code>coral_driver_update_available</code> en cada canal habilitado (Telegram, Discord, Gotify, ntfy, email, webhook). La notificación apunta de vuelta a la misma entrada del instalador — elige <strong>Reinstall / update</strong> del menú de acciones de arriba para aplicarla.",
|
||||
"antiTitle": "Anti-cascada por diseño",
|
||||
"antiBody": "Una notificación por variante, solo cuando la versión upstream cambia realmente — nunca en cada escaneo de 24h. Si ignoras una actualización no te vuelve a pingar hasta que llegue una release más nueva.",
|
||||
"rebootTitle": "El reinicio solo hace falta para la ruta PCIe",
|
||||
"rebootBody": "La rebuild DKMS de gasket carga nuevos módulos de kernel — eso necesita un reinicio para estar activo. La actualización del runtime USB es un swap de librería userspace, sin reinicio."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"intro": "Si quieres saber qué pasa bajo el capó, o rehacer un paso individual a mano, los comandos crudos por ruta se ven así.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex vía DKMS)",
|
||||
"usbHeading": "USB (runtime libedgetpu)"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación",
|
||||
"pcieHeading": "PCIe / M.2",
|
||||
"usbHeading": "USB"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"dkmsFailTitle": "La build DKMS falla después de una actualización de kernel",
|
||||
"dkmsFailBody": "Causa más común en PVE 9: el kernel en ejecución subió pero <code>proxmox-headers-$(uname -r)</code> aún no está instalado para él. Comprueba con <code>dpkg -l proxmox-headers-$(uname -r)</code>. Instala los headers que faltan y vuelve a ejecutar el script — el paso <code>cleanup_broken_gasket_dkms</code> de ProxMenux gestiona cualquier estado residual de paquete medio configurado.",
|
||||
"apexMissTitle": "/dev/apex_0 no está después del reinicio",
|
||||
"apexMissBody": "El módulo no está cargado. Prueba <code>modprobe apex</code> a mano. Si eso da error, comprueba <code>dmesg | grep -iE \"apex|gasket\"</code> para el fallo real — culpables comunes son version mismatch del kernel (DKMS se construyó para un kernel distinto del que arrancaste) o una actualización de firmware que deshabilitó el slot PCIe en el que está la Coral.",
|
||||
"lxcMissTitle": "Puedo ver /dev/apex_0 pero el LXC no",
|
||||
"lxcMissBody": "El host está bien. El problema es la config de passthrough — consulta <lxcLink>Añadir Coral TPU a un LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "USB Accelerator detectado pero Frigate / TFLite no llega a él",
|
||||
"usbUnreachBody": "Comprueba que las reglas udev que vienen con <code>libedgetpu1-std</code> surtieron efecto: <code>ls -l /dev/bus/usb/*/*</code>. El dispositivo NO debería ser propiedad de root:root con modo 0600 — si lo es, ejecuta <code>udevadm control --reload-rules && udevadm trigger</code> en el host, desenchufa la Coral USB, espera 3 segundos y vuelve a enchufarla.",
|
||||
"logTitle": "Log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/coral_install.log</code> en el host. Si la build DKMS muere, el script también añade las últimas 50 líneas de <code>/var/lib/dkms/gasket/1.0/build/make.log</code> a ese log — adjúntalo cuando pidas ayuda en GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Añadir Coral TPU a LXC",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — pasar el dispositivo Coral del host a un contenedor (Frigate, CodeProject.AI…)."
|
||||
},
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — la misma idea para GPUs NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — el modal de Coral que muestra driver, módulos, nodos de dispositivo, estado del runtime y temperatura en vivo una vez hecha la instalación en el host."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar drivers NVIDIA en el host | ProxMenux Documentation",
|
||||
"description": "Instala y configura los drivers propietarios NVIDIA en un host Proxmox VE usando ProxMenux. Cubre compatibilidad de kernel, setup VFIO, servicio de persistencia, parche NVENC opcional y propagación automática a LXCs."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar drivers NVIDIA en el host",
|
||||
"description": "Instala el driver propietario NVIDIA en un host Proxmox VE usando ProxMenux. El instalador gestiona la compatibilidad de kernel, el blacklisting de nouveau, la configuración VFIO, el servicio de persistencia y puede propagar el driver a cualquier contenedor LXC que ya tenga passthrough NVIDIA configurado.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "ProxMenux automatiza todo el ciclo de vida del driver NVIDIA en el host: detecta tu GPU, elige una versión de driver compatible con tu kernel en ejecución, pone <code>nouveau</code> en blacklist, descarga y ejecuta el instalador oficial <code>.run</code> de NVIDIA con DKMS, instala el servicio <code>nvidia-persistenced</code> y las reglas udev, y se ofrece a aplicar el parche NVENC opcional. Si ya tienes contenedores LXC con passthrough NVIDIA, puede actualizar las librerías userspace dentro de ellos para que su versión coincida con la del host."
|
||||
},
|
||||
"who": {
|
||||
"heading": "¿Para quién es esto?",
|
||||
"body": "Si tienes una GPU NVIDIA y quieres usarla para transcoding acelerado por hardware en Plex, Jellyfin, Frigate, Immich, Stable Diffusion o cualquier otra app corriendo <strong>dentro de un contenedor LXC</strong>, necesitas instalar el driver en el <em>host</em> Proxmox primero. Esta página cubre esa instalación en el lado del host. Pasar la GPU a una <strong>máquina virtual (VM)</strong> usa un flujo distinto (passthrough VFIO) y se documenta aparte."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU NVIDIA</strong> instalada físicamente en el host. El script la autodetecta; las GPUs AMD e Intel no se gestionan aquí.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "La GPU <strong>no está asignada actualmente a una VM vía passthrough VFIO</strong>. Si lo está, el script se negará a instalar el driver del host para evitar romper la config de passthrough.",
|
||||
"internet": "Acceso a internet en el host. El instalador descarga el driver desde <code>download.nvidia.com</code> y, opcionalmente, clona <code>nvidia-persistenced</code> y <code>nvidia-patch</code> desde GitHub.",
|
||||
"space": "Unos <strong>2 GB de espacio libre</strong> en <code>/opt/nvidia</code> (workdir) más la RAM usada durante la instalación. Se necesita reiniciar al final."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "¿GPU asignada a una VM? Para aquí",
|
||||
"body": "Si la GPU está actualmente vinculada a <code>vfio-pci</code> (es decir, se está pasando a una VM), instalar el driver del host puede romper el passthrough y desestabilizar el sistema. ProxMenux detecta esto y aborta. Quita la GPU de la configuración de passthrough de la VM y reinicia antes de ejecutar este script."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong>. Lo que verás depende de si ya hay un driver presente.",
|
||||
"imageAlt": "Menú Hardware Graphics con la entrada NVIDIA GPU Driver Installer resaltada"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El instalador pasa por tres fases con separación clara entre \"recopilar información y validar\" y \"tocar realmente el host\". Hasta la confirmación final, no se ha cambiado nada."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "Detección de GPU y resumen",
|
||||
"body1": "El script escanea el bus PCI y muestra cada controladora de vídeo NVIDIA que encuentra, el estado actual del driver (o <em>\"No NVIDIA driver installed\"</em>) y cualquier contenedor LXC que ya tenga passthrough NVIDIA configurado (versión del driver dentro de cada uno).",
|
||||
"body2": "Revisa el resumen cuidadosamente. Si la GPU detectada no es la que esperas, o si la versión de un contenedor ya coincide con la del host, puedes cancelar aquí sin efectos secundarios.",
|
||||
"imageAlt": "Resumen previo a la instalación mostrando las GPUs detectadas, el estado actual del driver y los contenedores LXC con passthrough NVIDIA"
|
||||
},
|
||||
"version": {
|
||||
"title": "Elegir la versión del driver",
|
||||
"body1": "ProxMenux obtiene la lista de drivers disponibles de NVIDIA y <strong>filtra las versiones que no son compatibles con tu kernel en ejecución</strong>. La opción <em>Latest available</em> es casi siempre la elección correcta.",
|
||||
"body2": "La matriz de compatibilidad que usa el script:",
|
||||
"headerKernel": "Kernel",
|
||||
"headerPve": "Versión típica de PVE",
|
||||
"headerMin": "Driver NVIDIA mínimo",
|
||||
"rows": [
|
||||
{
|
||||
"kernel": "6.17+",
|
||||
"pve": "Proxmox VE 9.x",
|
||||
"minCode": "580.82.07",
|
||||
"minTail": " o más nuevo"
|
||||
},
|
||||
{
|
||||
"kernel": "6.8 – 6.16",
|
||||
"pve": "Proxmox VE 8.2+",
|
||||
"minCode": "550.x",
|
||||
"minTail": " o más nuevo"
|
||||
},
|
||||
{
|
||||
"kernel": "6.2 – 6.7",
|
||||
"pve": "Proxmox VE 8.0 – 8.1",
|
||||
"minCode": "535.x",
|
||||
"minTail": " o más nuevo"
|
||||
},
|
||||
{
|
||||
"kernel": "5.15+",
|
||||
"pve": "Proxmox VE 7.x (legacy)",
|
||||
"minCode": "470.x",
|
||||
"minTail": " o más nuevo"
|
||||
}
|
||||
],
|
||||
"whyTitle": "Por qué importa el kernel",
|
||||
"whyBody": "El kernel 6.17 introdujo cambios en la API interna que rompen los drivers NVIDIA más viejos. Si instalas un driver por debajo del mínimo de tu kernel, DKMS no podrá construir el módulo y la GPU no estará disponible después de reiniciar. ProxMenux filtra la lista para que no puedas elegir una versión incompatible por accidente.",
|
||||
"imageAlt": "Selector de versión del driver con las versiones compatibles con el kernel, Latest available arriba"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Desinstalación limpia (solo si reinstalas)",
|
||||
"body": "Si ya hay un driver presente y elegiste una versión distinta, ProxMenux para los servicios NVIDIA, descarga los módulos de kernel, quita las entradas DKMS y purga los paquetes <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code> antes de tocar el nuevo instalador. Esto evita el clásico desastre de versiones mezcladas."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Preparar el sistema",
|
||||
"body": "Tras una única confirmación, el script:",
|
||||
"items": [
|
||||
"Instala <code>pve-headers-$(uname -r)</code> (o <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> y <code>dkms</code>.",
|
||||
"Crea <code>/etc/modprobe.d/nouveau-blacklist.conf</code> poniendo <code>nouveau</code> en blacklist e intenta descargarlo inmediatamente.",
|
||||
"Escribe <code>/etc/modules-load.d/nvidia-vfio.conf</code> con <code>vfio</code>, <code>vfio_pci</code>, <code>nvidia</code>, <code>nvidia_uvm</code> y módulos relacionados."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Descargar y ejecutar el instalador NVIDIA",
|
||||
"body": "El instalador descarga el archivo <code>NVIDIA-Linux-x86_64-<version>.run</code> en <code>/opt/nvidia</code>, lo valida (tamaño + firma de ejecutable, no solo HTTP 200), y luego lo ejecuta con DKMS para que el módulo de kernel se reconstruya automáticamente con las actualizaciones de kernel.",
|
||||
"imageAlt": "Progreso de descarga seguido del instalador NVIDIA ejecutando su build DKMS"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Servicio de persistencia y reglas udev",
|
||||
"body": "ProxMenux luego instala <persistLink>nvidia-persistenced</persistLink> y escribe reglas udev en <code>/etc/udev/rules.d/70-nvidia.rules</code> para que los nodos de dispositivo <code>/dev/nvidia*</code> aparezcan de forma fiable en el arranque. Sin esto, el passthrough LXC puede tener carreras al arranque del contenedor y acabar con un contenedor que no ve la GPU."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Opcional: aplicar el parche NVENC",
|
||||
"body": "Las GPUs NVIDIA de consumo (línea GeForce) limitan el número de sesiones simultáneas de codificación NVENC. El <patchLink>keylase/nvidia-patch</patchLink> de la comunidad elimina esa restricción. Si planeas usar la GPU para Plex / Jellyfin / Frigate con muchos streams concurrentes, responde <strong>Sí</strong> cuando se pregunte.",
|
||||
"supportTitle": "Comprueba el soporte del parche para tu driver",
|
||||
"supportBody": "El parche no cubre todas las versiones de driver. Antes de depender de él en producción, verifica que tu versión esté listada en la <patchTableLink>tabla de parches</patchTableLink>. Si aún no está soportada, elige un driver cercano más antiguo que sí lo esté."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Opcional: propagar el driver a los contenedores LXC",
|
||||
"body1": "Si la pantalla de resumen listó contenedores con passthrough NVIDIA, ProxMenux ahora se ofrece a actualizar las librerías userspace dentro de cada uno para que coincidan con el host. El módulo de kernel del host y el userspace del contenedor <strong>deben ser exactamente la misma versión</strong> — si no <code>nvidia-smi</code> dentro del contenedor fallará con un error \"version mismatch\".",
|
||||
"body2": "La actualización es consciente de la distro: <code>apk</code> para Alpine, <code>pacman</code> para Arch y el mismo instalador <code>.run</code> (con <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>) para Debian/Ubuntu y otras distros. Eleva temporalmente la RAM del contenedor a 2 GB si es menor, ejecuta la instalación y luego restaura la RAM original.",
|
||||
"imageAlt": "Prompt listando los LXCs con passthrough NVIDIA y la versión actual del driver, con Sí/No para actualizarlos todos"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar",
|
||||
"body": "Finalmente, el script reconstruye <code>initramfs</code> para todos los kernels y ofrece reiniciar. Reiniciar <strong>es obligatorio</strong>: el blacklist de nouveau y el nuevo módulo de kernel solo surten efecto tras el reinicio."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstalar o desinstalar",
|
||||
"intro": "Cuando el instalador detecta que ya hay un driver NVIDIA cargado (<code>nvidia-smi</code> devuelve una versión), no reinstala silenciosamente encima. En lugar de eso muestra un menú de acciones para que elijas qué hacer.",
|
||||
"imageAlt": "Menú de acciones NVIDIA ofrecido cuando ya hay un driver instalado — dos opciones: Reinstalar / actualizar driver, o Desinstalar el driver NVIDIA completamente",
|
||||
"imageCaption": "El menú de acciones solo aparece cuando hay un driver NVIDIA activo actualmente en el host.",
|
||||
"reinstallHeading": "Reinstalar / actualizar",
|
||||
"reinstallBody": "Continúa con el flujo normal de instalación pero, antes de descargar nada, ejecuta una eliminación limpia del driver actual (apt purge + entradas DKMS quitadas + módulos residuales descargados). Esta es la ruta segura para aplicar una versión más nueva del driver, cambiar de rama cuando el kernel lo exige o recuperarte de un estado medio roto. Los prompts de propagación LXC y parche NVENC se vuelven a ejecutar al final.",
|
||||
"uninstallHeading": "Desinstalar — qué se elimina",
|
||||
"uninstallIntro": "Confirma primero con un diálogo sí/no. Luego ejecuta un rollback completo e idempotente:",
|
||||
"uninstallItems": [
|
||||
"Para y deshabilita <code>nvidia-persistenced</code>, descarga los módulos de kernel (<code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia</code>) — cualquier contenedor LXC con passthrough NVIDIA será cortado limpiamente.",
|
||||
"Ejecuta <code>apt purge</code> sobre cada paquete NVIDIA, quita el árbol fuente DKMS y la caché del instalador .run de <code>/opt/nvidia</code>.",
|
||||
"Revierte el blacklist de nouveau (<code>/etc/modprobe.d/nouveau-blacklist.conf</code>) y la config de modules-load (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) para que nouveau pueda volver si quieres gráficos genéricos otra vez.",
|
||||
"Quita las reglas udev (<code>/etc/udev/rules.d/70-nvidia.rules</code>) y el archivo de estado del parche NVENC (si el parche keylase se aplicó antes).",
|
||||
"Reconstruye <code>initramfs</code> para todos los kernels y pide reiniciar para finalizar (el desblacklisting de nouveau solo surte efecto tras reiniciar)."
|
||||
],
|
||||
"lxcWarnTitle": "Contenedores LXC con passthrough NVIDIA",
|
||||
"lxcWarnBody": "Quitar el driver del host invalida las rutas de dispositivo y las librerías CUDA mapeadas a cualquier LXC con passthrough NVIDIA. Planifica la operación en una ventana de mantenimiento si Frigate / Plex / Jellyfin / Ollama (o cualquier otra cosa) depende de ello."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notificaciones de actualización",
|
||||
"body": "El driver NVIDIA instalado se rastrea en el registro de instalaciones gestionadas de ProxMenux. En el arranque y cada 24h el Monitor comprueba el listado upstream en <code>download.nvidia.com/XFree86/Linux-x86_64/</code> contra la versión que reporta <code>nvidia-smi</code>, y dispara una notificación cuando hay una nueva versión compatible disponible.",
|
||||
"kindsHeading": "Dos tipos de mensaje de actualización",
|
||||
"kindsItems": [
|
||||
"<strong>Parche de la misma rama.</strong> Una release de mantenimiento más nueva en tu rama actual de driver (p. ej. instalado 580.65.06 → disponible 580.105.08). Bug fixes y parches de seguridad sin cambiar de rama.",
|
||||
"<strong>Subida de rama requerida por el kernel.</strong> Si el host está en un kernel que ya no soporta tu rama actual (p. ej. subiste el kernel del host a 6.17 mientras seguías en el driver 570.x), el mensaje lo dice explícitamente y recomienda la rama mínima compatible con el kernel — la misma matriz que usa el instalador para filtrar el menú de versión."
|
||||
],
|
||||
"antiTitle": "Anti-cascada por diseño",
|
||||
"antiBody": "Una notificación por versión upstream distinta, nunca en cada escaneo de 24h. El mensaje de subida de rama en particular solo se dispara cuando realmente necesitas cambiar — hasta entonces el tracker de la misma rama se queda silenciado.",
|
||||
"applyTitle": "Aplicar la actualización",
|
||||
"applyBody": "El Monitor no autoaplica actualizaciones de driver — reinstalar el driver NVIDIA siempre necesita un reinicio. Abre la misma entrada del instalador descrita arriba, elige <strong>Reinstall / update</strong> y la nueva versión se descarga, el módulo DKMS se reconstruye contra el kernel en ejecución y se pide el reinicio al final."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verificar la instalación",
|
||||
"intro": "Una vez el host esté arriba de nuevo, entra por SSH o por la shell de Proxmox y ejecuta:",
|
||||
"after": "Deberías ver tu GPU listada, la versión del driver en el borde superior y ningún proceso aún (nada está usando la GPU en este punto). Luego comprueba el servicio de persistencia:",
|
||||
"imageAlt": "Salida de nvidia-smi en el host mostrando la GPU detectada y la versión del driver instalada"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"smiFailTitle": "`nvidia-smi` dice 'NVIDIA-SMI has failed'",
|
||||
"smiFailBody": "Casi siempre es <strong>nouveau</strong> aún cargado o un <strong>mismatch de headers del kernel</strong>. Tras reiniciar, ejecuta <code>lsmod | grep nouveau</code> — si devuelve algo, el blacklist no surtió efecto (comprueba que <code>/etc/modprobe.d/nouveau-blacklist.conf</code> existe y reconstruye initramfs con <code>update-initramfs -u -k all</code>, luego reinicia). Si nouveau no está, comprueba <code>dmesg | grep -i nvidia</code> — los errores de build DKMS suelen significar que tus headers de kernel no coinciden con el kernel en ejecución; reinstálalos con <code>apt install --reinstall pve-headers-$(uname -r)</code>.",
|
||||
"lxcMissTitle": "El contenedor LXC no ve la GPU tras actualizar el host",
|
||||
"lxcMissBody": "Las librerías userspace del contenedor están atascadas en la versión anterior del driver. O vuelves a ejecutar el instalador NVIDIA y aceptas el prompt de propagación LXC, o instalas la misma versión del driver manualmente dentro del contenedor con <code>--no-kernel-modules</code>.",
|
||||
"logTitle": "Revisa el log de instalación",
|
||||
"logBody": "Cada instalación escribe en <code>/tmp/nvidia_install.log</code>. Si algo falla silenciosamente, ese archivo tiene la salida completa (descargas, build DKMS, instalaciones de servicio). Adjúntalo cuando reportes issues en GitHub."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "¿Buscas los pasos manuales?",
|
||||
"body": "La guía original de la comunidad — instalar todo a mano con <code>wget</code> y <code>./NVIDIA-Linux-...run</code> — sigue disponible como referencia en <guideLink>Guides → NVIDIA</guideLink>. Es útil si quieres entender cada comando que ejecuta el instalador de ProxMenux, o si estás depurando un setup inusual. Para instalaciones del día a día, usa ProxMenux — es la ruta que sigue recibiendo fixes (compatibilidad de kernel, propagación a LXC, comprobaciones de seguridad VFIO)."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — pasar la GPU NVIDIA a una VM (modelo de binding distinto al de LXC)."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — compartir la GPU NVIDIA con uno o más contenedores."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alternar la misma GPU entre modos passthrough (VM) y compartido (LXC)."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — el modal de GPU que dispara este instalador en un click, más monitorización en vivo una vez hecho."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia de lspci / dmesg / IOMMU / nvidia-smi."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Switch GPU Mode (VM ↔ LXC) | ProxMenux Documentation",
|
||||
"description": "Mueve una GPU ya asignada entre modo VM (vfio-pci) y modo LXC (driver nativo) en un host Proxmox. ProxMenux detecta el binding actual, pide políticas de conflicto por workload, gestiona la limpieza de audio huérfano y reconstruye initramfs solo cuando hace falta."
|
||||
},
|
||||
"header": {
|
||||
"title": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"description": "Reasigna una GPU que ya está en uso — cambia de passthrough a VM a compartición con LXC o al revés. ProxMenux gestiona todos los cambios de binding del lado del host (vfio.conf, blacklist de drivers, módulos, initramfs) y ofrece una política limpia para cada VM o LXC que use la GPU actualmente, para que el cambio no deje config rota detrás.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Una GPU en un host Proxmox vive en uno de dos modos: vinculada a <code>vfio-pci</code> (reservada para una VM) o vinculada a su driver nativo <em>(i915 / amdgpu / nvidia)</em> para que el host + los LXCs puedan compartirla. <strong>Switch GPU Mode</strong> alterna entre esos dos sin que tengas que editar <code>vfio.conf</code> a mano, gestionar blacklists o recordar qué líneas de VM / LXC apuntan a la tarjeta. También te avisa limpiamente si un workload aún referencia la GPU para que no acabes con una VM rota en el arranque."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Listo para contenedores LXC",
|
||||
"lxcDesc": "Driver nativo activo",
|
||||
"vmTitle": "Listo para passthrough a VM",
|
||||
"vmDesc": "Driver VFIO-PCI activo"
|
||||
},
|
||||
"when": {
|
||||
"heading": "¿Cuándo debería usar esto?",
|
||||
"intro": "Usa este script cuando una GPU está <strong>ya asignada</strong> y quieres moverla:",
|
||||
"headerSituation": "Situación",
|
||||
"headerUse": "¿Usar esta página?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "La GPU está libre — nunca asignada. Quieres dársela a una VM.",
|
||||
"useRich": "No — usa <vmLink>Añadir GPU a VM</vmLink>"
|
||||
},
|
||||
{
|
||||
"situation": "La GPU está libre — nunca asignada. Quieres dársela a un LXC.",
|
||||
"useRich": "No — usa <lxcLink>Añadir GPU a LXC</lxcLink>"
|
||||
},
|
||||
{
|
||||
"situationRich": "La GPU está en una VM vía <code>vfio-pci</code>, quiero usarla desde un LXC en su lugar.",
|
||||
"useRich": "<strong>Sí — esta página.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "La GPU está compartida con un LXC, quiero dedicarla a una VM.",
|
||||
"useRich": "<strong>Sí — esta página.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Solo quiero desvincular completamente una GPU de todo.",
|
||||
"use": "Sí — elige el destino LXC y luego desadjunta manualmente."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"assigned": "<strong>Una GPU ya asignada</strong> — o bien en una VM vía VFIO o adjuntada al menos a un LXC. Si aún no la has asignado, empieza desde Añadir GPU a VM / LXC en su lugar.",
|
||||
"iommu": "<strong>IOMMU habilitado en el host</strong> — solo estrictamente necesario al cambiar <em>a</em> modo VM, pero vale la pena tenerlo en cualquier caso. El script avisa si falta el parámetro del kernel.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Asume un reinicio.</strong> Cambiar bindings de GPU a nivel de kernel significa que el host regenera initramfs y reinicias para aplicar. El script lo pide al final.",
|
||||
"knowList": "<strong>Saber qué VMs / LXCs están usando la GPU.</strong> El script las encontrará y preguntará qué hacer con cada una, pero es más rápido si ya conoces la lista."
|
||||
},
|
||||
"blocklist": {
|
||||
"title": "No todas las GPUs son seguras para pasar a una VM",
|
||||
"body": "Una pequeña blocklist de IDs de GPU se rechaza para modo VM por inestabilidad conocida de passthrough (p. ej. Intel Arc A770 <code>8086:5a84</code> / <code>8086:5a85</code>). Si la GPU seleccionada coincide, el script explica por qué y sale. Cambiar <em>a</em> modo LXC siempre se permite."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el script",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Switch GPU Mode (VM ↔ LXC)</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Switch GPU Mode (VM ↔ LXC)' dentro de Hardware: GPUs and Coral-TPU"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Dos fases como siempre: todo se recopila y valida primero, no se aplica nada hasta que confirmas al final."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"detect": {
|
||||
"title": "Detectar las GPUs y su binding actual",
|
||||
"body": "El script escanea cada controladora VGA / 3D / Display del host e inspecciona <code>/sys/bus/pci/devices/*/driver</code> para encontrar el driver de kernel actual. Verás cada GPU etiquetada con su nombre, slot PCI y binding de driver actual — así puedes ver de un vistazo en qué modo está.",
|
||||
"imageAlt": "Checklist de GPU mostrando cada GPU detectada con su driver actual (vfio-pci / nvidia / amdgpu / i915) y slot PCI"
|
||||
},
|
||||
"pickGpu": {
|
||||
"title": "Elegir la(s) GPU(s) a cambiar",
|
||||
"body": "Una GPU → autoseleccionada. Varias GPUs → checklist. Puedes marcar varias, pero todas deben estar en el <em>mismo</em> modo actual — si no el script no puede elegir un modo destino para el batch y recibes un aviso de \"modo mixto\" pidiéndote que reduzcas la selección.",
|
||||
"tipTitle": "Cambios en batch",
|
||||
"tipBody": "Útil cuando estás reconstruyendo un host: \"Las tres NVIDIA van a modo VM, luego la iGPU vuelve a LXC.\" Dos ejecuciones, cada una con destino uniforme, mucha menos fricción que una a una."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Revisar la dirección propuesta",
|
||||
"intro": "Según el modo actual, el script propone el opuesto como destino:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> desvincular de <code>vfio-pci</code>, dejar que el driver nativo (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) reclame la tarjeta para que los LXCs puedan compartirla. En NVIDIA, la entrada por BDF se quita de <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> para que el módulo nvidia reclame la GPU tras reiniciar.",
|
||||
"<strong>LXC → VM:</strong> vincular a <code>vfio-pci</code> para que la tarjeta esté libre para passthrough VFIO a una sola VM. En AMD / Intel esto significa poner el driver nativo en blacklist y definir <code>options vfio-pci ids=…</code>. En NVIDIA el módulo <code>nvidia</code> <strong>no</strong> se pone en blacklist — en su lugar una regla udev por BDF aplica <code>driver_override=vfio-pci</code> solo a las GPUs que selecciones, para que otras GPUs NVIDIA del host mantengan su driver <code>nvidia</code>."
|
||||
],
|
||||
"outro": "Confirma la dirección o cancela."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Política de conflicto por workload afectado",
|
||||
"body": "El script escanea cada <code>/etc/pve/lxc/*.conf</code> y <code>/etc/pve/qemu-server/*.conf</code> buscando referencias al slot PCI de la GPU. Por cada workload afectado eliges una política:",
|
||||
"headerPolicy": "Política",
|
||||
"headerEffect": "Efecto",
|
||||
"headerWhen": "Cuándo elegirla",
|
||||
"keepPolicy": "Mantener config, deshabilitar onboot",
|
||||
"keepEffect": "<code>pct set -onboot 0</code> (o <code>qm set</code>). Las líneas de GPU se quedan en la config.",
|
||||
"keepWhen": "Planeas volver a esta VM/LXC una vez la GPU esté de vuelta en su modo original. Default seguro.",
|
||||
"removePolicy": "Quitar GPU de la config",
|
||||
"removeEffect": "Las líneas <code>hostpci</code> / <code>dev</code> del slot de esta GPU se quitan con sed.",
|
||||
"removeWhen": "La VM/LXC seguirá funcionando sin la GPU (transcoding solo por CPU, etc.). Workflow limpio.",
|
||||
"imageAlt": "Diálogo preguntando la política de conflicto por VM / por LXC al cambiar una GPU que está actualmente asignada"
|
||||
},
|
||||
"audio": {
|
||||
"title": "Limpieza de audio huérfano (solo al salir del modo VM)",
|
||||
"body1": "Las dGPUs (NVIDIA / AMD) traen una función de audio HDMI en <code>.1</code> del mismo slot, y a veces se adjuntan controladores de audio extra junto a la GPU. Cuando la GPU deja la VM, esas líneas de audio quedan huérfanas — la VM tiene entradas <code>hostpci</code> apuntando a dispositivos de audio que no van con la GPU.",
|
||||
"body2": "El script las descubre (match BDF preciso, sin falsos positivos por substring) y muestra una checklist para que puedas quitarlas limpiamente. También limpia sus IDs vendor:device de <code>/etc/modprobe.d/vfio.conf</code> — pero solo si ninguna otra VM sigue usando esos IDs de audio."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Aplicar cambios del host + workloads",
|
||||
"body": "Una vez confirmas, el script escribe los cambios del lado del host — <code>vfio.conf</code>, blacklist, módulos y (para NVIDIA) la regla udev por BDF en <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> más el estado BDF en <code>/etc/proxmenux/vfio-bind.bdfs</code>. También aplica la política de conflicto elegida a cada VM/LXC afectada. Si la config del host realmente cambió, ejecuta <code>update-initramfs -u -k all</code> — si no, salta ese paso."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar",
|
||||
"body": "El nuevo binding de GPU solo surte efecto tras reiniciar. El script te lo pide; puedes reiniciar ahora o luego, pero no arranques la VM/LXC destino hasta que el host haya reiniciado — si no la GPU sigue retenida por el driver anterior.",
|
||||
"imageAlt": "Diálogo de resumen listando qué cambió, seguido del prompt de reinicio"
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"intro": "Si quieres entender exactamente qué hace el script (o depurar uno de los pasos a mano), estas son las operaciones crudas para <strong>VM → LXC</strong> en una tarjeta NVIDIA con vendor:device <code>10de:2204</code>:",
|
||||
"lxcToVm": "Y para <strong>LXC → VM</strong>:",
|
||||
"oneVmTitle": "Solo una VM puede usar una GPU vfio-pci dada a la vez",
|
||||
"oneVmBody": "Poner varias entradas <code>hostpci</code> con el mismo slot PCI en dos VMs es config válida pero solo una de las VMs puede arrancar con la GPU — la segunda fallará. El paso de política de conflicto de ProxMenux trata exactamente de evitar esta trampa."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación tras el reinicio"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"stillVfioTitle": "La GPU sigue mostrando vfio-pci tras cambiar a modo LXC",
|
||||
"stillVfioBody": "<code>update-initramfs</code> no se ejecutó (o el reinicio no llegó a pasar realmente). Comprueba <code>lsmod | grep vfio</code> — si vfio-pci está cargado, vuelve a ejecutar <code>update-initramfs -u -k all</code> y reinicia. Para AMD/Intel: verifica que <code>vfio.conf</code> ya no contiene el ID vendor:device de la GPU. Para NVIDIA: verifica que el BDF ya no está en <code>/etc/proxmenux/vfio-bind.bdfs</code> y que <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> no lo lista.",
|
||||
"vmFailTitle": "Una VM no arranca tras cambiar una GPU a modo LXC",
|
||||
"vmFailBody": "La VM aún tiene entradas <code>hostpci</code> apuntando a una GPU que no puede reclamar. Vuelve a ejecutar el script y elige la política <em>Quitar GPU de la config</em>, o limpia la config a mano:",
|
||||
"smiFailTitle": "nvidia-smi falla con 'Driver/library version mismatch' tras volver a LXC",
|
||||
"smiFailBody": "Los módulos NVIDIA del host no se recargaron limpiamente. <code>modprobe -r nvidia</code> y luego <code>modprobe nvidia</code>. Si eso falla, reinicia — un reinicio completo siempre limpia el estado residual del binding vfio.",
|
||||
"logTitle": "Log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/proxmenux_gpu_switch_mode.log</code> en el host. Adjúntalo cuando pidas ayuda en GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — setup inicial del modo VM."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — setup inicial del modo LXC."
|
||||
},
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — necesario para el modo LXC en GPUs NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — la sección Graphics Cards donde cada GPU muestra su modo actual y expone el control inline para cambiarlo."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia rápida de comandos."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comandos de backup de Proxmox — vzdump, qmrestore, pct restore | ProxMenux",
|
||||
"description": "Referencia de comandos de backup y restauración de Proxmox VE: vzdump para VMs y contenedores LXC, qmrestore para VMs, pct restore para contenedores, backups programados en /etc/pve/jobs.cfg, hook scripts y rutas excluidas.",
|
||||
"ogTitle": "Comandos de backup de Proxmox — vzdump, qmrestore, pct restore",
|
||||
"ogDescription": "Referencia de comandos vzdump, qmrestore y pct restore para hacer y restaurar backups de VMs y contenedores LXC de Proxmox.",
|
||||
"twitterTitle": "Comandos de backup de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Comandos vzdump, qmrestore y pct restore para hacer y restaurar backups de VMs y contenedores de Proxmox."
|
||||
},
|
||||
"header": {
|
||||
"title": "Backup y restauración",
|
||||
"description": "Referencia curada de comandos vzdump, qmrestore y pct restore para los flujos de backup de Proxmox. Incluye programación, opciones avanzadas como hook scripts / rutas excluidas / prioridad de E/S, y gestión de ficheros de backup.",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Tres modos de backup",
|
||||
"body": "<strong>snapshot</strong> usa un snapshot en vivo — el guest sigue funcionando, pausa brevemente la E/S. <strong>suspend</strong> congela la VM durante el backup (más seguro que snapshot para FS que no soportan snapshots). <strong>stop</strong> apaga la VM, hace el backup en frío y la vuelve a arrancar. Elige según la tolerancia del guest y la capacidad del almacenamiento."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Backup de VM",
|
||||
"commands": [
|
||||
{
|
||||
"command": "vzdump <vmid>",
|
||||
"description": "Crear un backup de una VM/CT concreta"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --storage <storage>",
|
||||
"description": "Backup de la VM a un almacenamiento concreto"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --mode snapshot",
|
||||
"description": "Crear backup por snapshot (para VMs)"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --mode suspend",
|
||||
"description": "Suspender la VM durante el backup"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --mode stop",
|
||||
"description": "Apagar la VM durante el backup"
|
||||
},
|
||||
{
|
||||
"command": "vzdump --all",
|
||||
"description": "Backup de todas las VMs y contenedores"
|
||||
},
|
||||
{
|
||||
"command": "vzdump --exclude <vmid1>,<vmid2>",
|
||||
"description": "Backup de todas excepto las VMs especificadas"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Opciones de backup",
|
||||
"commands": [
|
||||
{
|
||||
"command": "vzdump <vmid> --compress zstd",
|
||||
"description": "Usar compresión zstd para el backup"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --pigz <threads>",
|
||||
"description": "Usar pigz con varios hilos"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --notes <text>",
|
||||
"description": "Añadir notas al backup"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --mailto <email>",
|
||||
"description": "Enviar email de notificación"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --maxfiles <n>",
|
||||
"description": "Conservar solo n backups por VM"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --stdexcludes 0",
|
||||
"description": "No excluir ficheros temporales"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --quiet 1",
|
||||
"description": "Silenciar mensajes de salida"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Restaurar backups",
|
||||
"commands": [
|
||||
{
|
||||
"command": "qmrestore <backup-file> <vmid>",
|
||||
"description": "Restaurar VM desde backup"
|
||||
},
|
||||
{
|
||||
"command": "qmrestore <backup-file> <vmid> --storage <storage>",
|
||||
"description": "Restaurar a un almacenamiento concreto"
|
||||
},
|
||||
{
|
||||
"command": "qmrestore <backup-file> <vmid> --unique",
|
||||
"description": "Crear una VM con ID único"
|
||||
},
|
||||
{
|
||||
"command": "pct restore <vmid> <backup-file>",
|
||||
"description": "Restaurar contenedor desde backup"
|
||||
},
|
||||
{
|
||||
"command": "pct restore <vmid> <backup-file> --storage <storage>",
|
||||
"description": "Restaurar contenedor a un almacenamiento concreto"
|
||||
},
|
||||
{
|
||||
"command": "pct restore <vmid> <backup-file> --rootfs <storage>",
|
||||
"description": "Restaurar a un rootfs concreto"
|
||||
},
|
||||
{
|
||||
"command": "pct restore <vmid> <backup-file> --unprivileged 1",
|
||||
"description": "Restaurar como CT no privilegiado"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión de backups",
|
||||
"commands": [
|
||||
{
|
||||
"command": "ls -la /var/lib/vz/dump/",
|
||||
"description": "Listar backups en la ubicación por defecto"
|
||||
},
|
||||
{
|
||||
"command": "find /var/lib/vz/dump/ -name \"*.vma*\"",
|
||||
"description": "Buscar backups de VM"
|
||||
},
|
||||
{
|
||||
"command": "find /var/lib/vz/dump/ -name \"*.tar*\"",
|
||||
"description": "Buscar backups de contenedor"
|
||||
},
|
||||
{
|
||||
"command": "pvesm list <storage>",
|
||||
"description": "Listar backups en un almacenamiento concreto"
|
||||
},
|
||||
{
|
||||
"command": "rm /var/lib/vz/dump/<backup-file>",
|
||||
"description": "Borrar un fichero de backup"
|
||||
},
|
||||
{
|
||||
"command": "cat /etc/vzdump.conf",
|
||||
"description": "Mostrar la configuración de backup"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Backups programados",
|
||||
"commands": [
|
||||
{
|
||||
"command": "cat /etc/cron.d/vzdump",
|
||||
"description": "Mostrar la programación de backups"
|
||||
},
|
||||
{
|
||||
"command": "nano /etc/vzdump.conf",
|
||||
"description": "Editar la configuración de backup"
|
||||
},
|
||||
{
|
||||
"command": "systemctl list-timers",
|
||||
"description": "Listar todas las tareas programadas"
|
||||
},
|
||||
{
|
||||
"command": "systemctl status cron",
|
||||
"description": "Comprobar el estado del servicio cron"
|
||||
},
|
||||
{
|
||||
"command": "grep vzdump /var/log/syslog",
|
||||
"description": "Buscar logs de backup en syslog"
|
||||
},
|
||||
{
|
||||
"command": "tail -f /var/log/vzdump.log",
|
||||
"description": "Seguir el log de backup en tiempo real"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Operaciones avanzadas",
|
||||
"commands": [
|
||||
{
|
||||
"command": "qmrestore <backup> <vmid> --force",
|
||||
"description": "Forzar la restauración, sobrescribiendo la VM existente"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --dumpdir <directory>",
|
||||
"description": "Especificar un directorio personalizado para el backup"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --script <script>",
|
||||
"description": "Ejecutar un hook script durante el backup"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --exclude-path <path>",
|
||||
"description": "Excluir rutas concretas del backup"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --ionice <priority>",
|
||||
"description": "Fijar la prioridad de E/S del proceso de backup"
|
||||
},
|
||||
{
|
||||
"command": "vzdump <vmid> --lockwait <minutes>",
|
||||
"description": "Esperar al lock"
|
||||
},
|
||||
{
|
||||
"command": "qm importdisk <vmid> <backup> <storage>",
|
||||
"description": "Importar un disco desde un backup"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"testRestores": {
|
||||
"title": "Prueba tus restauraciones",
|
||||
"bodyRich": "Un backup que nunca has restaurado no es un backup. Periódicamente coge un backup, restáuralo a un VMID de prueba con <code>qmrestore --unique</code>, arranca la VM resultante y confirma que el contenido está intacto. La misma idea para contenedores con <code>pct restore</code>."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/help-info/vm-ct-commands",
|
||||
"label": "Gestión de VM y CT",
|
||||
"tail": " — comandos del ciclo de vida con qm y pct."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"label": "Almacenamiento y discos",
|
||||
"tail": " — gestión de almacenamiento con pvesm."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,162 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comandos de passthrough de GPU en Proxmox — lspci, VFIO, IOMMU, qm set hostpci | ProxMenux",
|
||||
"description": "Referencia para passthrough de GPU en Proxmox VE: identificación de dispositivos con lspci, módulos VFIO, grupos IOMMU (intel_iommu / amd_iommu), actualizaciones de GRUB e initramfs, qm set hostpci0, configuración de passthrough NVIDIA / AMD / Intel.",
|
||||
"ogTitle": "Comandos de passthrough de GPU en Proxmox — lspci, VFIO, IOMMU, qm set hostpci",
|
||||
"ogDescription": "Referencia para inspeccionar y configurar passthrough de GPU en Proxmox VE — dispositivos PCI, módulos VFIO, grupos IOMMU, parámetros de arranque del kernel, qm set hostpci.",
|
||||
"twitterTitle": "Comandos de passthrough de GPU en Proxmox | ProxMenux",
|
||||
"twitterDescription": "Inspeccionar dispositivos PCI, configurar VFIO e IOMMU y asignar GPUs a VMs en Proxmox VE."
|
||||
},
|
||||
"header": {
|
||||
"title": "Passthrough de GPU",
|
||||
"description": "Referencia para inspeccionar y configurar passthrough de GPU / TPU en Proxmox: identificación de dispositivos (lspci), configuración del módulo VFIO, validación de IOMMU, actualizaciones de initramfs / GRUB y configuración de passthrough por VM (qm set hostpci, machine q35, bios ovmf).",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "IOMMU debe estar activado en BIOS / UEFI",
|
||||
"body": "Antes de que ninguno de estos comandos importe, IOMMU tiene que estar activado a nivel de firmware (busca <em>VT-d</em>, <em>AMD-Vi</em> o <em>IOMMU</em> en BIOS / UEFI). Parámetros habituales de GRUB para activarlo del lado de Linux: <code>intel_iommu=on</code> (Intel) o <code>amd_iommu=on</code> (AMD), a menudo combinados con <code>iommu=pt video=efifb:off video=vesa:off</code>."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Identificación de dispositivos",
|
||||
"commands": [
|
||||
{
|
||||
"command": "lspci -nn | grep -i nvidia",
|
||||
"description": "Listar dispositivos PCI NVIDIA"
|
||||
},
|
||||
{
|
||||
"command": "lspci -nn | grep -i vga",
|
||||
"description": "Listar todos los dispositivos compatibles con VGA"
|
||||
},
|
||||
{
|
||||
"command": "lspci -nn | grep -i amd",
|
||||
"description": "Listar dispositivos PCI AMD"
|
||||
},
|
||||
{
|
||||
"command": "lspci -nnk | grep -A3 VGA",
|
||||
"description": "Listar dispositivos VGA con sus drivers del kernel"
|
||||
},
|
||||
{
|
||||
"command": "lspci -v -s <PCI_ID>",
|
||||
"description": "Mostrar información detallada de un dispositivo PCI concreto"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Configuración de VFIO",
|
||||
"commands": [
|
||||
{
|
||||
"command": "dmesg | grep -i vfio",
|
||||
"description": "Comprobar mensajes del módulo VFIO"
|
||||
},
|
||||
{
|
||||
"command": "cat /etc/modprobe.d/vfio.conf",
|
||||
"description": "Revisar la configuración de passthrough VFIO"
|
||||
},
|
||||
{
|
||||
"command": "ls -la /etc/modprobe.d/",
|
||||
"description": "Listar todos los ficheros de configuración de modprobe"
|
||||
},
|
||||
{
|
||||
"command": "cat /etc/modules",
|
||||
"description": "Mostrar los módulos cargados en el arranque"
|
||||
},
|
||||
{
|
||||
"command": "lsmod | grep vfio",
|
||||
"description": "Comprobar si los módulos VFIO están cargados"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Configuración de IOMMU",
|
||||
"commands": [
|
||||
{
|
||||
"command": "cat /etc/default/grub",
|
||||
"description": "Revisar las opciones de GRUB para IOMMU"
|
||||
},
|
||||
{
|
||||
"command": "update-grub",
|
||||
"description": "Aplicar los cambios de GRUB"
|
||||
},
|
||||
{
|
||||
"command": "dmesg | grep -i iommu",
|
||||
"description": "Comprobar mensajes de IOMMU en el log del kernel"
|
||||
},
|
||||
{
|
||||
"command": "dmesg | grep -e DMAR -e IOMMU",
|
||||
"description": "Comprobar mensajes DMAR e IOMMU"
|
||||
},
|
||||
{
|
||||
"command": "find /sys/kernel/iommu_groups/ -type l | sort -V",
|
||||
"description": "Listar grupos IOMMU"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Actualizaciones del sistema",
|
||||
"commands": [
|
||||
{
|
||||
"command": "update-initramfs -u",
|
||||
"description": "Aplicar cambios al initramfs (VFIO)"
|
||||
},
|
||||
{
|
||||
"command": "update-initramfs -u -k all",
|
||||
"description": "Actualizar el initramfs para todos los kernels"
|
||||
},
|
||||
{
|
||||
"command": "cat /proc/cmdline",
|
||||
"description": "Mostrar los parámetros de arranque del kernel actuales"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Configuración de la VM",
|
||||
"commands": [
|
||||
{
|
||||
"command": "qm config <vmid> | grep hostpci",
|
||||
"description": "Mostrar la configuración de passthrough PCI de una VM"
|
||||
},
|
||||
{
|
||||
"command": "qm set <vmid> -hostpci0 <PCI_ID>,pcie=1,x-vga=1",
|
||||
"description": "Añadir passthrough de GPU a una VM"
|
||||
},
|
||||
{
|
||||
"command": "cat /etc/pve/qemu-server/<vmid>.conf",
|
||||
"description": "Ver el fichero de configuración de la VM"
|
||||
},
|
||||
{
|
||||
"command": "qm set <vmid> -machine q35",
|
||||
"description": "Hacer que la VM use el chipset Q35 (recomendado para passthrough)"
|
||||
},
|
||||
{
|
||||
"command": "qm set <vmid> -bios ovmf",
|
||||
"description": "Hacer que la VM use UEFI/OVMF (necesario para passthrough de GPU)"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"afterChangesTip": {
|
||||
"title": "Después de cambiar GRUB o configs de modprobe",
|
||||
"bodyRich": "Ejecuta <code>update-grub</code> + <code>update-initramfs -u</code> y reinicia. Verifica con <code>cat /proc/cmdline</code> (parámetros del kernel), <code>dmesg | grep -i iommu</code> (IOMMU inicializado) y <code>find /sys/kernel/iommu_groups/ -type l | sort -V</code> (grupos presentes)."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"label": "Añadir GPU a VM (passthrough)",
|
||||
"tail": " — flujo interactivo de ProxMenux."
|
||||
},
|
||||
{
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"label": "Añadir GPU a LXC",
|
||||
"tail": " — passthrough a un contenedor en lugar de a una VM."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Referencia de comandos de Proxmox — qm, pct, vzdump, zpool, pveversion | ProxMenux",
|
||||
"description": "Referencia curada de comandos esenciales de Proxmox VE y Linux organizados por tema: inspección del sistema, gestión de VMs y LXC (qm / pct), almacenamiento y discos, red, actualizaciones, passthrough de GPU, ZFS, backup y restauración, y herramientas CLI del día a día.",
|
||||
"ogTitle": "Referencia de comandos de Proxmox — qm, pct, vzdump, zpool",
|
||||
"ogDescription": "Referencia curada de los comandos más útiles de Proxmox VE y Linux, agrupados por tema — sistema, VM/CT, almacenamiento, red, actualizaciones, passthrough de GPU, ZFS, backup y herramientas CLI.",
|
||||
"twitterTitle": "Referencia de comandos de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Referencia curada de los comandos más útiles de Proxmox VE y Linux, agrupados por tema."
|
||||
},
|
||||
"header": {
|
||||
"title": "Ayuda e información",
|
||||
"description": "Compendio curado de comandos útiles de Linux y Proxmox VE organizados por tema. Nueve categorías — cubre desde una comprobación rápida con pveversion hasta un zfs send/receive multilínea — pensado para convivir con las secciones de GPU, disco y compartición de ProxMenux como una referencia única.",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué es esto",
|
||||
"body": "Un catálogo de referencia con los comandos que realmente usas en un host Proxmox, agrupados por tema. Dentro de ProxMenux puedes elegir un número para ejecutar un comando directamente o pegar el tuyo en el prompt; en este sitio cada categoría es una tabla lista para copiar y pegar."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir el menú",
|
||||
"body": "Desde el menú principal de ProxMenux, pulsa <kbd>h</kbd>. Verás esto:",
|
||||
"imageAlt": "Menú Ayuda e información con 9 categorías de comandos"
|
||||
},
|
||||
"categories": {
|
||||
"heading": "Las nueve categorías",
|
||||
"options": [
|
||||
{
|
||||
"icon": "Terminal",
|
||||
"href": "/docs/help-info/system-commands",
|
||||
"title": "Comandos de sistema útiles",
|
||||
"description": "pveversion, uptime, free, journalctl, hostnamectl, información del usuario actual, auditoría de lynis, fastfetch."
|
||||
},
|
||||
{
|
||||
"icon": "Cpu",
|
||||
"href": "/docs/help-info/vm-ct-commands",
|
||||
"title": "Gestión de VM y CT",
|
||||
"description": "qm list / config / start / stop / migrate, pct list / config / enter, snapshots, clonación."
|
||||
},
|
||||
{
|
||||
"icon": "HardDrive",
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"title": "Almacenamiento y discos",
|
||||
"description": "lsblk, blkid, smartctl, información de montajes, pvesm status, comandos LVM."
|
||||
},
|
||||
{
|
||||
"icon": "Network",
|
||||
"href": "/docs/help-info/network-commands",
|
||||
"title": "Comandos de red",
|
||||
"description": "ip / ss / nmcli, inspección de bridges, ping / traceroute, consultas DNS, fail2ban-client."
|
||||
},
|
||||
{
|
||||
"icon": "Package",
|
||||
"href": "/docs/help-info/update-commands",
|
||||
"title": "Actualizaciones y paquetes",
|
||||
"description": "apt update / dist-upgrade, apt-cache policy, consultas dpkg, comprobación de ficheros de repositorio."
|
||||
},
|
||||
{
|
||||
"icon": "Cpu",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"title": "Passthrough de GPU",
|
||||
"description": "comprobaciones con lspci / dmesg, verificación de IOMMU, binding de vfio-pci, uso de GPU desde el host."
|
||||
},
|
||||
{
|
||||
"icon": "Database",
|
||||
"href": "/docs/help-info/zfs-commands",
|
||||
"title": "Gestión de ZFS",
|
||||
"description": "comandos zpool / zfs para estado, datasets, snapshots, send/receive, ajuste de ARC, trimming."
|
||||
},
|
||||
{
|
||||
"icon": "Archive",
|
||||
"href": "/docs/help-info/backup-commands",
|
||||
"title": "Backup y restauración",
|
||||
"description": "vzdump, qmrestore / pct restore, ayudas para Proxmox Backup Server, operaciones de snapshot."
|
||||
},
|
||||
{
|
||||
"icon": "Wrench",
|
||||
"href": "/docs/help-info/tools-commands",
|
||||
"title": "Herramientas CLI del sistema",
|
||||
"description": "tmux, screen, htop / btop, ncdu, jq, dig, lsof, watch — herramientas de administración del día a día."
|
||||
}
|
||||
]
|
||||
},
|
||||
"tip": {
|
||||
"title": "Buscable desde el buscador global",
|
||||
"body": "Todos los comandos de estas páginas están indexados por el buscador de la documentación. Si recuerdas un flag o un fragmento pero no en qué página estaba, abre la barra de búsqueda arriba — caerás directamente en la entrada correcta."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comandos de red de Proxmox — ip, ping, ss, pve-firewall, iptables | ProxMenux",
|
||||
"description": "Referencia de comandos de red del host Proxmox VE: ip / ip link / ip addr, ping, traceroute, mtr, ss, ethtool, dig, nslookup, además de pve-firewall, iptables y nftables para filtrado. Inspección de bridges, bonds y VLANs.",
|
||||
"ogTitle": "Comandos de red de Proxmox — ip, ping, ss, pve-firewall, iptables",
|
||||
"ogDescription": "Referencia de comandos de red para Proxmox VE — inspección de interfaces, pruebas de conectividad, monitorización, firewall (pve-firewall, iptables, nftables) y consultas DNS.",
|
||||
"twitterTitle": "Comandos de red de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Inspección, pruebas, configuración y firewall de red para Proxmox VE."
|
||||
},
|
||||
"header": {
|
||||
"title": "Comandos de red",
|
||||
"description": "Referencia curada para la red del host Proxmox: información de interfaces, pruebas de conectividad, configuración, monitorización de tráfico y gestión del firewall. Combina ip / ss / nmcli / ethtool / tcpdump / pve-firewall.",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Inventario rápido de interfaces",
|
||||
"body": "<code>ip a</code> muestra cada interfaz con sus IPs y MAC. <code>ip r</code> muestra la tabla de rutas. Juntos resuelven en segundos la mayoría de preguntas del tipo \"¿está bien configurada esta interfaz?\"."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Información de red",
|
||||
"commands": [
|
||||
{
|
||||
"command": "ip a",
|
||||
"description": "Mostrar interfaces de red e IPs"
|
||||
},
|
||||
{
|
||||
"command": "ip r",
|
||||
"description": "Mostrar la tabla de rutas"
|
||||
},
|
||||
{
|
||||
"command": "ip -s link",
|
||||
"description": "Mostrar estadísticas de tráfico por interfaz"
|
||||
},
|
||||
{
|
||||
"command": "brctl show",
|
||||
"description": "Mostrar los bridges de red configurados"
|
||||
},
|
||||
{
|
||||
"command": "cat /etc/network/interfaces",
|
||||
"description": "Mostrar la configuración de red en crudo"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pruebas de red",
|
||||
"commands": [
|
||||
{
|
||||
"command": "ping <host>",
|
||||
"description": "Comprobar conectividad con otro host"
|
||||
},
|
||||
{
|
||||
"command": "traceroute <host>",
|
||||
"description": "Trazar la ruta hasta un host"
|
||||
},
|
||||
{
|
||||
"command": "mtr <host>",
|
||||
"description": "Combinar ping y traceroute en tiempo real"
|
||||
},
|
||||
{
|
||||
"command": "dig <domain>",
|
||||
"description": "Consulta DNS de un dominio"
|
||||
},
|
||||
{
|
||||
"command": "nslookup <domain>",
|
||||
"description": "Consulta DNS alternativa"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Configuración de red",
|
||||
"commands": [
|
||||
{
|
||||
"command": "ifreload -a",
|
||||
"description": "Recargar la configuración de red (ifupdown2)"
|
||||
},
|
||||
{
|
||||
"command": "ethtool <iface>",
|
||||
"description": "Mostrar información del dispositivo Ethernet"
|
||||
},
|
||||
{
|
||||
"command": "resolvectl status",
|
||||
"description": "Mostrar el estado de la resolución DNS"
|
||||
},
|
||||
{
|
||||
"command": "nmcli device show",
|
||||
"description": "Mostrar detalles de dispositivos de red (si se usa NetworkManager)"
|
||||
},
|
||||
{
|
||||
"command": "ip link set <iface> up",
|
||||
"description": "Levantar una interfaz de red"
|
||||
},
|
||||
{
|
||||
"command": "ip link set <iface> down",
|
||||
"description": "Bajar una interfaz de red"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Monitorización de red",
|
||||
"commands": [
|
||||
{
|
||||
"command": "ss -tuln",
|
||||
"description": "Mostrar puertos en escucha (TCP/UDP)"
|
||||
},
|
||||
{
|
||||
"command": "netstat -tuln",
|
||||
"description": "Alternativa para mostrar puertos en escucha"
|
||||
},
|
||||
{
|
||||
"command": "lsof -i",
|
||||
"description": "Listar ficheros y conexiones de red abiertas"
|
||||
},
|
||||
{
|
||||
"command": "tcpdump -i <iface>",
|
||||
"description": "Capturar paquetes en una interfaz"
|
||||
},
|
||||
{
|
||||
"command": "iftop -i <iface>",
|
||||
"description": "Monitorizar el uso de ancho de banda en una interfaz"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión del firewall",
|
||||
"commands": [
|
||||
{
|
||||
"command": "iptables -L -n -v",
|
||||
"description": "Mostrar reglas activas del firewall (iptables)"
|
||||
},
|
||||
{
|
||||
"command": "nft list ruleset",
|
||||
"description": "Mostrar reglas de nftables"
|
||||
},
|
||||
{
|
||||
"command": "pve-firewall status",
|
||||
"description": "Comprobar el estado del firewall de Proxmox"
|
||||
},
|
||||
{
|
||||
"command": "pve-firewall compile",
|
||||
"description": "Compilar las reglas del firewall para todos los nodos"
|
||||
},
|
||||
{
|
||||
"command": "pve-firewall reload",
|
||||
"description": "Recargar las reglas del firewall de Proxmox"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"iptablesTip": {
|
||||
"title": "iptables vs nftables",
|
||||
"bodyRich": "Debian / Proxmox modernos usan <strong>nftables</strong> como motor de firewall subyacente. El clásico <code>iptables -L -n -v</code> sigue funcionando como capa de traducción, pero la fuente de verdad es <code>nft list ruleset</code>. Los comandos <code>pve-firewall</code> son el wrapper de Proxmox que emite reglas nftables a partir de la configuración del firewall del clúster."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/network",
|
||||
"label": "Gestión de red",
|
||||
"tail": " — herramientas interactivas de red de ProxMenux (análisis de bridges, nombres persistentes, monitorización)."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/tools-commands",
|
||||
"label": "Herramientas CLI del sistema",
|
||||
"tail": " — más herramientas de monitorización de red."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,232 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comandos de almacenamiento y disco en Proxmox — lsblk, LVM, pvesm, qm importdisk | ProxMenux",
|
||||
"description": "Referencia de comandos de almacenamiento y disco en Proxmox VE: lsblk, blkid, parted, lvdisplay, vgdisplay, pvs, mount, df, du, ncdu, pvesm status, qm importdisk y qemu-img convert para operaciones de disco de VM.",
|
||||
"ogTitle": "Comandos de almacenamiento y disco en Proxmox — lsblk, LVM, pvesm, qm importdisk",
|
||||
"ogDescription": "Referencia de comandos de almacenamiento y disco en Proxmox VE — inspección de discos, LVM, montajes, gestión de almacenamiento de Proxmox, importación de disco de VM y conversión de imágenes.",
|
||||
"twitterTitle": "Comandos de almacenamiento de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Inspección de discos, información de montajes, gestión LVM, almacenamiento de Proxmox y comandos de importación / conversión de discos de VM."
|
||||
},
|
||||
"header": {
|
||||
"title": "Almacenamiento y discos",
|
||||
"description": "Referencia curada para inspección de almacenamiento en hosts Proxmox: dispositivos de bloque, particiones, montajes, volúmenes LVM, configuración de almacenamiento de Proxmox y algunas operaciones de disco de VM (importdisk, qemu-img convert).",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Inventario rápido de discos",
|
||||
"body": "<code>lsblk</code> es la forma más rápida de ver todos los dispositivos de bloque y sus particiones en árbol. Para identificadores persistentes (que sobreviven entre reinicios y cambios de hardware) usa <code>ls -lh /dev/disk/by-id/</code>."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Información de discos",
|
||||
"commands": [
|
||||
{
|
||||
"command": "lsblk",
|
||||
"description": "Listar dispositivos de bloque y particiones"
|
||||
},
|
||||
{
|
||||
"command": "fdisk -l",
|
||||
"description": "Listar discos con información detallada"
|
||||
},
|
||||
{
|
||||
"command": "blkid",
|
||||
"description": "Mostrar UUID y tipo de sistema de ficheros de los dispositivos de bloque"
|
||||
},
|
||||
{
|
||||
"command": "ls -lh /dev/disk/by-id/",
|
||||
"description": "Listar identificadores persistentes de los discos"
|
||||
},
|
||||
{
|
||||
"command": "parted -l",
|
||||
"description": "Diseño detallado de particiones con info GPT"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Uso del almacenamiento",
|
||||
"commands": [
|
||||
{
|
||||
"command": "df -h",
|
||||
"description": "Mostrar uso de disco por punto de montaje"
|
||||
},
|
||||
{
|
||||
"command": "du -sh /path",
|
||||
"description": "Mostrar el tamaño de un directorio"
|
||||
},
|
||||
{
|
||||
"command": "mount | grep ^/dev",
|
||||
"description": "Mostrar dispositivos de almacenamiento montados"
|
||||
},
|
||||
{
|
||||
"command": "cat /proc/mounts",
|
||||
"description": "Mostrar todos los montajes activos según el kernel"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión LVM",
|
||||
"commands": [
|
||||
{
|
||||
"command": "pvdisplay",
|
||||
"description": "Mostrar volúmenes físicos (LVM)"
|
||||
},
|
||||
{
|
||||
"command": "vgdisplay",
|
||||
"description": "Mostrar grupos de volúmenes (LVM)"
|
||||
},
|
||||
{
|
||||
"command": "lvdisplay",
|
||||
"description": "Mostrar volúmenes lógicos (LVM)"
|
||||
},
|
||||
{
|
||||
"command": "pvs",
|
||||
"description": "Salida concisa de los volúmenes físicos"
|
||||
},
|
||||
{
|
||||
"command": "vgs",
|
||||
"description": "Salida concisa de los grupos de volúmenes"
|
||||
},
|
||||
{
|
||||
"command": "lvs",
|
||||
"description": "Salida concisa de los volúmenes lógicos"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Almacenamiento de Proxmox",
|
||||
"commands": [
|
||||
{
|
||||
"command": "cat /etc/pve/storage.cfg",
|
||||
"description": "Mostrar la configuración de almacenamiento de Proxmox"
|
||||
},
|
||||
{
|
||||
"command": "pvesm status",
|
||||
"description": "Mostrar el estado de todos los pools de almacenamiento"
|
||||
},
|
||||
{
|
||||
"command": "pvesm list",
|
||||
"description": "Listar todo el almacenamiento disponible"
|
||||
},
|
||||
{
|
||||
"command": "pvesm list <storage>",
|
||||
"description": "Listar el contenido de un almacenamiento concreto"
|
||||
},
|
||||
{
|
||||
"command": "pvesm scan <storage>",
|
||||
"description": "Escanear el almacenamiento en busca de contenido nuevo"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Acciones sobre discos",
|
||||
"commands": [
|
||||
{
|
||||
"command": "qm importdisk <vmid> <image_path> <storage>",
|
||||
"description": "Adjuntar una imagen de disco a una VM"
|
||||
},
|
||||
{
|
||||
"command": "qm set <vmid> -<bus><index> <disk_path>",
|
||||
"description": "Asignar un disco físico a una VM (modo passthrough)"
|
||||
},
|
||||
{
|
||||
"command": "qemu-img convert -O <format> <input> <output>",
|
||||
"description": "Convertir el formato de una imagen de disco"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Salud SMART del disco",
|
||||
"commands": [
|
||||
{
|
||||
"command": "smartctl --scan",
|
||||
"description": "Listar dispositivos con soporte SMART en el host"
|
||||
},
|
||||
{
|
||||
"command": "smartctl -i /dev/<disk>",
|
||||
"description": "Información básica del dispositivo (modelo, firmware, serie)"
|
||||
},
|
||||
{
|
||||
"command": "smartctl -H /dev/<disk>",
|
||||
"description": "Comprobación rápida de salud — PASSED / FAILED global"
|
||||
},
|
||||
{
|
||||
"command": "smartctl -A /dev/<disk>",
|
||||
"description": "Solo atributos SMART (valores en bruto, umbrales)"
|
||||
},
|
||||
{
|
||||
"command": "smartctl -a /dev/<disk>",
|
||||
"description": "Información SMART completa — info + atributos + log de self-test"
|
||||
},
|
||||
{
|
||||
"command": "smartctl -t short /dev/<disk>",
|
||||
"description": "Lanzar self-test corto (~2 minutos, en segundo plano)"
|
||||
},
|
||||
{
|
||||
"command": "smartctl -t long /dev/<disk>",
|
||||
"description": "Lanzar self-test largo (horas, en segundo plano)"
|
||||
},
|
||||
{
|
||||
"command": "smartctl -l selftest /dev/<disk>",
|
||||
"description": "Ver el log de self-test (resultados de pruebas anteriores)"
|
||||
},
|
||||
{
|
||||
"command": "smartctl -X /dev/<disk>",
|
||||
"description": "Abortar el self-test en curso"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Salud de discos NVMe",
|
||||
"commands": [
|
||||
{
|
||||
"command": "nvme list",
|
||||
"description": "Listar dispositivos NVMe visibles para el kernel"
|
||||
},
|
||||
{
|
||||
"command": "nvme smart-log /dev/<nvme>",
|
||||
"description": "Log SMART específico de NVMe (temperatura, desgaste, errores)"
|
||||
},
|
||||
{
|
||||
"command": "nvme id-ctrl /dev/<nvme>",
|
||||
"description": "Información de la controladora (modelo, firmware, capacidades)"
|
||||
},
|
||||
{
|
||||
"command": "nvme error-log /dev/<nvme>",
|
||||
"description": "Últimas entradas del log de errores NVMe"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"lvmTip": {
|
||||
"title": "LVM: comandos cortos vs largos",
|
||||
"bodyRich": "Existen ambas formas por compatibilidad. <code>pvs</code> / <code>vgs</code> / <code>lvs</code> dan una tabla limpia de una línea por volumen; <code>pvdisplay</code> / <code>vgdisplay</code> / <code>lvdisplay</code> dan un volcado verboso de varias líneas por volumen. Para el día a día prefiere las versiones cortas."
|
||||
},
|
||||
"smartInfo": {
|
||||
"title": "SMART para discos mecánicos vs NVMe",
|
||||
"bodyRich": "<strong>Discos mecánicos / SATA / SAS</strong> usan la familia <code>smartctl</code> de <code>smartmontools</code> (instalada por defecto en Proxmox). Pasa el dispositivo como <code>/dev/sda</code>, <code>/dev/sdb</code>, etc. <strong>Los discos NVMe</strong> tienen su propio protocolo nativo — <code>smartctl</code> funciona contra ellos (pasa la mayoría de datos), pero la herramienta <code>nvme</code> de <code>nvme-cli</code> reporta más campos específicos de NVMe (wear levelling, errores de medio, info de namespace). Instala con <code>apt install nvme-cli</code> si no está."
|
||||
},
|
||||
"selfTestWarn": {
|
||||
"title": "Los self-tests se ejecutan en segundo plano",
|
||||
"bodyRich": "<code>smartctl -t short</code> y <code>-t long</code> retornan inmediatamente — el disco ejecuta el test por su cuenta. Comprueba el progreso con <code>smartctl -a /dev/<disk></code> (busca la línea \"Self-test routine in progress\") o espera a que termine y lee <code>smartctl -l selftest /dev/<disk></code>. Los tests cortos tardan ~2 min; los largos pueden tardar horas en mecánicos grandes. El disco sigue usable durante la prueba, pero el rendimiento de E/S baja."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/help-info/zfs-commands",
|
||||
"label": "Gestión de ZFS",
|
||||
"tail": " — comandos zpool / zfs para almacenamiento sobre ZFS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/disk-manager",
|
||||
"label": "Disk Manager",
|
||||
"tail": " — flujos interactivos de ProxMenux para passthrough de disco, importación, formateo y SMART."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,158 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comandos de sistema de Proxmox VE — pveversion, uptime, journalctl, systemctl | ProxMenux",
|
||||
"description": "Referencia de comandos esenciales de Proxmox VE y Linux: pveversion, pveperf, uptime, journalctl, systemctl, lscpu, lsblk, df, free, last, who. Todos son de solo lectura y seguros de ejecutar en cualquier host.",
|
||||
"ogTitle": "Comandos de sistema de Proxmox VE — pveversion, uptime, journalctl, systemctl",
|
||||
"ogDescription": "Referencia de comandos esenciales de Proxmox VE y Linux — versión, uptime, servicios, logs, información de usuarios, exploración de hardware. Todos de solo lectura.",
|
||||
"twitterTitle": "Comandos de sistema de Proxmox VE | ProxMenux",
|
||||
"twitterDescription": "Comandos esenciales de inspección del sistema para Proxmox VE — versión, estado, servicios, logs, información de usuarios."
|
||||
},
|
||||
"header": {
|
||||
"title": "Comandos de sistema útiles",
|
||||
"description": "Comandos de solo lectura para inspeccionar el host Proxmox: versión, kernel, uptime, memoria, estado de la interfaz web, últimas líneas de log, usuarios conectados y un par de herramientas de auditoría y resumen. Ninguno modifica el sistema.",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué es esto",
|
||||
"body": "La misma lista numerada que ProxMenux muestra cuando eliges <em>Comandos de sistema útiles</em>. Usa el botón Copiar para llevarte cualquier comando, o consúltalo para recordar el flag exacto."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Información del sistema",
|
||||
"commands": [
|
||||
{
|
||||
"command": "pveversion",
|
||||
"description": "Mostrar la versión de Proxmox"
|
||||
},
|
||||
{
|
||||
"command": "pveversion -v",
|
||||
"description": "Información detallada de la versión de Proxmox"
|
||||
},
|
||||
{
|
||||
"command": "hostnamectl",
|
||||
"description": "Nombre del host del sistema e información del kernel"
|
||||
},
|
||||
{
|
||||
"command": "uname -a",
|
||||
"description": "Información de kernel y arquitectura"
|
||||
},
|
||||
{
|
||||
"command": "cat /etc/os-release",
|
||||
"description": "Detalles de la versión del SO"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Estado del sistema",
|
||||
"commands": [
|
||||
{
|
||||
"command": "uptime",
|
||||
"description": "Tiempo de actividad del sistema"
|
||||
},
|
||||
{
|
||||
"command": "uptime -p",
|
||||
"description": "Formato legible del uptime"
|
||||
},
|
||||
{
|
||||
"command": "free -h",
|
||||
"description": "Uso de RAM y swap"
|
||||
},
|
||||
{
|
||||
"command": "who -b",
|
||||
"description": "Hora del último arranque del sistema"
|
||||
},
|
||||
{
|
||||
"command": "last -x | grep shutdown",
|
||||
"description": "Apagados anteriores"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión de servicios",
|
||||
"commands": [
|
||||
{
|
||||
"command": "systemctl status pveproxy",
|
||||
"description": "Comprobar el estado de la interfaz web de Proxmox"
|
||||
},
|
||||
{
|
||||
"command": "systemctl restart pveproxy",
|
||||
"description": "Reiniciar el proxy de la interfaz web"
|
||||
},
|
||||
{
|
||||
"command": "journalctl -xe",
|
||||
"description": "Errores y logs del sistema"
|
||||
},
|
||||
{
|
||||
"command": "dmesg -T | tail -n 50",
|
||||
"description": "Últimas 50 líneas del log del kernel"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Información de usuarios",
|
||||
"commands": [
|
||||
{
|
||||
"command": "whoami",
|
||||
"description": "Usuario actual"
|
||||
},
|
||||
{
|
||||
"command": "id",
|
||||
"description": "UID, GID y grupos del usuario actual"
|
||||
},
|
||||
{
|
||||
"command": "who",
|
||||
"description": "Usuarios conectados"
|
||||
},
|
||||
{
|
||||
"command": "w",
|
||||
"description": "Actividad de usuarios y uptime"
|
||||
},
|
||||
{
|
||||
"command": "uptime && w",
|
||||
"description": "Uptime y quién está conectado"
|
||||
},
|
||||
{
|
||||
"command": "cut -d: -f1,3,4 /etc/passwd",
|
||||
"description": "Todos los usuarios con UID y GID"
|
||||
},
|
||||
{
|
||||
"command": "getent passwd | column -t -s :",
|
||||
"description": "Tabla legible de usuarios (UID, shell, etc.)"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Herramientas de auditoría y resumen",
|
||||
"commands": [
|
||||
{
|
||||
"command": "lynis audit system",
|
||||
"description": "Ejecutar una auditoría de seguridad completa del sistema"
|
||||
},
|
||||
{
|
||||
"command": "fastfetch",
|
||||
"description": "Mostrar un resumen del sistema en formato ASCII"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/help-info/update-commands",
|
||||
"label": "Actualizaciones y paquetes",
|
||||
"tail": " — comandos de apt y de actualización de pve."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/tools-commands",
|
||||
"label": "Herramientas CLI del sistema",
|
||||
"tail": " — htop, btop, ncdu y similares."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,276 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Herramientas CLI de Linux para Proxmox — htop, iftop, journalctl, rsync, tmux | ProxMenux",
|
||||
"description": "Herramientas CLI de Linux para la administración del día a día de Proxmox VE: monitorización (htop, atop, glances, iotop), red (iftop, nmap, mtr, ss), ficheros y texto (find, grep, journalctl), rendimiento (iostat, perf, strace), seguridad (fail2ban, lynis, lsof) y administración remota (ssh, rsync, tmux).",
|
||||
"ogTitle": "Herramientas CLI de Linux para Proxmox — htop, iftop, journalctl, rsync, tmux",
|
||||
"ogDescription": "Herramientas CLI para la administración diaria de Proxmox VE agrupadas por propósito: monitorización, red, ficheros/texto, rendimiento, seguridad y administración remota.",
|
||||
"twitterTitle": "Herramientas CLI de Linux para Proxmox | ProxMenux",
|
||||
"twitterDescription": "Herramientas CLI del día a día para administrar Proxmox VE agrupadas por propósito."
|
||||
},
|
||||
"header": {
|
||||
"title": "Herramientas CLI del sistema",
|
||||
"description": "Herramientas CLI del día a día para administrar el host Proxmox, agrupadas por propósito: monitorización, red, ficheros y texto, análisis de rendimiento, seguridad, administración remota y configuración del sistema.",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "La mayoría se instalan con Post-instalación",
|
||||
"body": "Si ejecutaste el script post-instalación de ProxMenux con las selecciones por defecto, la mayoría de estas herramientas ya están instaladas. Para cualquiera que falte, el <utilsLink>Instalador de utilidades del sistema</utilsLink> de ProxMenux las ofrece como grupos predefinidos (basic, dev, network, analysis, …)."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Monitorización del sistema",
|
||||
"commands": [
|
||||
{
|
||||
"command": "htop",
|
||||
"description": "Visor interactivo de procesos con uso de CPU/memoria"
|
||||
},
|
||||
{
|
||||
"command": "top",
|
||||
"description": "Mostrar procesos de Linux en tiempo real"
|
||||
},
|
||||
{
|
||||
"command": "atop",
|
||||
"description": "Monitor avanzado de sistema y procesos"
|
||||
},
|
||||
{
|
||||
"command": "glances",
|
||||
"description": "Herramienta de monitorización del sistema con interfaz web"
|
||||
},
|
||||
{
|
||||
"command": "nmon",
|
||||
"description": "Herramienta de monitorización de rendimiento"
|
||||
},
|
||||
{
|
||||
"command": "iotop",
|
||||
"description": "Monitorizar el uso de E/S de disco por proceso"
|
||||
},
|
||||
{
|
||||
"command": "vmstat 1",
|
||||
"description": "Reportar estadísticas de memoria virtual cada segundo"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Herramientas de red",
|
||||
"commands": [
|
||||
{
|
||||
"command": "iftop",
|
||||
"description": "Mostrar el uso de ancho de banda en una interfaz"
|
||||
},
|
||||
{
|
||||
"command": "nmap <host>",
|
||||
"description": "Exploración de red y escaneo de seguridad"
|
||||
},
|
||||
{
|
||||
"command": "tcpdump -i <interface>",
|
||||
"description": "Volcar tráfico de red"
|
||||
},
|
||||
{
|
||||
"command": "netstat -tuln",
|
||||
"description": "Mostrar conexiones de red"
|
||||
},
|
||||
{
|
||||
"command": "ss -tuln",
|
||||
"description": "Otra utilidad para investigar sockets"
|
||||
},
|
||||
{
|
||||
"command": "mtr <host>",
|
||||
"description": "Herramienta de diagnóstico que combina ping y traceroute"
|
||||
},
|
||||
{
|
||||
"command": "iperf3 -s",
|
||||
"description": "Ejecutar el servidor iperf para pruebas de ancho de banda"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Herramientas de ficheros y texto",
|
||||
"commands": [
|
||||
{
|
||||
"command": "find / -name <filename>",
|
||||
"description": "Buscar ficheros por nombre"
|
||||
},
|
||||
{
|
||||
"command": "grep -r 'pattern' /path",
|
||||
"description": "Buscar un patrón en ficheros"
|
||||
},
|
||||
{
|
||||
"command": "sed -i 's/old/new/g' file",
|
||||
"description": "Reemplazar texto en ficheros"
|
||||
},
|
||||
{
|
||||
"command": "awk '{print $1}' file",
|
||||
"description": "Herramienta de procesamiento de texto"
|
||||
},
|
||||
{
|
||||
"command": "tail -f /var/log/syslog",
|
||||
"description": "Seguir un fichero de log en tiempo real"
|
||||
},
|
||||
{
|
||||
"command": "less /var/log/messages",
|
||||
"description": "Ver un fichero con paginación"
|
||||
},
|
||||
{
|
||||
"command": "journalctl -f",
|
||||
"description": "Seguir los logs del journal de systemd"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Análisis de rendimiento",
|
||||
"commands": [
|
||||
{
|
||||
"command": "iostat -x 1",
|
||||
"description": "Reportar estadísticas de CPU y E/S"
|
||||
},
|
||||
{
|
||||
"command": "mpstat -P ALL 1",
|
||||
"description": "Reportar uso de CPU"
|
||||
},
|
||||
{
|
||||
"command": "perf top",
|
||||
"description": "Herramienta de profiling del sistema"
|
||||
},
|
||||
{
|
||||
"command": "strace <command>",
|
||||
"description": "Trazar llamadas al sistema y señales"
|
||||
},
|
||||
{
|
||||
"command": "lsof",
|
||||
"description": "Listar ficheros abiertos"
|
||||
},
|
||||
{
|
||||
"command": "pstree",
|
||||
"description": "Mostrar el árbol de procesos"
|
||||
},
|
||||
{
|
||||
"command": "slabtop",
|
||||
"description": "Mostrar información de la caché slab del kernel"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Herramientas de seguridad",
|
||||
"commands": [
|
||||
{
|
||||
"command": "fail2ban-client status",
|
||||
"description": "Mostrar el estado de fail2ban"
|
||||
},
|
||||
{
|
||||
"command": "chage -l <username>",
|
||||
"description": "Mostrar la información de caducidad de la contraseña"
|
||||
},
|
||||
{
|
||||
"command": "lastlog",
|
||||
"description": "Mostrar el último login de todos los usuarios"
|
||||
},
|
||||
{
|
||||
"command": "last",
|
||||
"description": "Mostrar la lista de los últimos usuarios conectados"
|
||||
},
|
||||
{
|
||||
"command": "w",
|
||||
"description": "Mostrar quién está conectado y qué está haciendo"
|
||||
},
|
||||
{
|
||||
"command": "lynis audit system",
|
||||
"description": "Herramienta de auditoría de seguridad"
|
||||
},
|
||||
{
|
||||
"command": "openssl s_client -connect host:port",
|
||||
"description": "Probar conexiones SSL/TLS"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Administración remota",
|
||||
"commands": [
|
||||
{
|
||||
"command": "ssh <user>@<host>",
|
||||
"description": "Conexión por shell seguro"
|
||||
},
|
||||
{
|
||||
"command": "scp <file> <user>@<host>:<path>",
|
||||
"description": "Copiar ficheros de forma segura"
|
||||
},
|
||||
{
|
||||
"command": "rsync -avz <src> <dest>",
|
||||
"description": "Sincronizar ficheros/carpetas"
|
||||
},
|
||||
{
|
||||
"command": "screen",
|
||||
"description": "Multiplexor de terminal"
|
||||
},
|
||||
{
|
||||
"command": "tmux",
|
||||
"description": "Multiplexor de terminal alternativo"
|
||||
},
|
||||
{
|
||||
"command": "ssh-keygen -t rsa -b 4096",
|
||||
"description": "Generar un par de claves SSH"
|
||||
},
|
||||
{
|
||||
"command": "ssh-copy-id <user>@<host>",
|
||||
"description": "Copiar la clave SSH a un servidor"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Configuración del sistema",
|
||||
"commands": [
|
||||
{
|
||||
"command": "systemctl status <service>",
|
||||
"description": "Comprobar el estado de un servicio"
|
||||
},
|
||||
{
|
||||
"command": "journalctl -u <service>",
|
||||
"description": "Ver los logs de un servicio"
|
||||
},
|
||||
{
|
||||
"command": "timedatectl",
|
||||
"description": "Controlar la hora y fecha del sistema"
|
||||
},
|
||||
{
|
||||
"command": "hostnamectl",
|
||||
"description": "Controlar el hostname del sistema"
|
||||
},
|
||||
{
|
||||
"command": "localectl",
|
||||
"description": "Controlar el locale y el teclado del sistema"
|
||||
},
|
||||
{
|
||||
"command": "update-alternatives --config <name>",
|
||||
"description": "Configurar alternativas del sistema"
|
||||
},
|
||||
{
|
||||
"command": "dpkg-reconfigure <package>",
|
||||
"description": "Reconfigurar un paquete instalado"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"tmuxTip": {
|
||||
"title": "Usa tmux / screen para comandos de larga duración",
|
||||
"bodyRich": "Cualquier cosa que tarde más que un café — un backup, una actualización larga, un rsync grande — debería correr dentro de <code>tmux</code> o <code>screen</code>. Las desconexiones SSH no matan la sesión, y puedes reengancharte desde cualquier sitio con <code>tmux attach</code>."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/utils/system-utils",
|
||||
"label": "Instalador de utilidades del sistema",
|
||||
"tail": " — instala cualquiera de estas herramientas que falte."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/system-commands",
|
||||
"label": "Comandos de sistema útiles",
|
||||
"tail": " — comandos de inspección específicos de Proxmox."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comandos de actualización y paquetes en Proxmox — apt, pveupgrade, dpkg | ProxMenux",
|
||||
"description": "Referencia de comandos de actualización y paquetes para Proxmox VE: apt update, apt upgrade, apt dist-upgrade, pveupgrade, dpkg -l, consultas de información de paquetes y configuración de repositorios en /etc/apt/sources.list.d/.",
|
||||
"ogTitle": "Comandos de actualización y paquetes en Proxmox — apt, pveupgrade, dpkg",
|
||||
"ogDescription": "Comandos apt, pveupgrade y dpkg para mantener Proxmox VE al día — actualizaciones del sistema, gestión de paquetes, configuración de repositorios.",
|
||||
"twitterTitle": "Comandos de actualización de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Comandos apt y pveupgrade para gestionar actualizaciones y paquetes en hosts Proxmox VE."
|
||||
},
|
||||
"header": {
|
||||
"title": "Actualizaciones y paquetes",
|
||||
"description": "Referencia curada de comandos apt y de actualización específicos de Proxmox: actualizaciones del sistema, instalación / eliminación / purga de paquetes, consultas (apt-cache policy, dpkg -l) e inspección de la configuración de repositorios.",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Actualiza primero el índice",
|
||||
"body": "<code>apt update</code> refresca el índice de paquetes local desde los repositorios configurados. Sin él, <code>apt install</code> puede traer versiones antiguas o fallar con \"Unable to locate package\"."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Actualizaciones del sistema",
|
||||
"commands": [
|
||||
{
|
||||
"command": "apt update && apt upgrade -y",
|
||||
"description": "Actualizar y mejorar todos los paquetes del sistema"
|
||||
},
|
||||
{
|
||||
"command": "apt dist-upgrade -y",
|
||||
"description": "Actualización completa del sistema, incluidas las dependencias"
|
||||
},
|
||||
{
|
||||
"command": "apt update",
|
||||
"description": "Actualizar solo las listas de paquetes"
|
||||
},
|
||||
{
|
||||
"command": "apt upgrade",
|
||||
"description": "Actualizar solo paquetes (interactivo)"
|
||||
},
|
||||
{
|
||||
"command": "apt full-upgrade",
|
||||
"description": "Actualizar paquetes resolviendo dependencias (interactivo)"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Actualizaciones de Proxmox",
|
||||
"commands": [
|
||||
{
|
||||
"command": "pveupdate",
|
||||
"description": "Actualizar las listas de paquetes de Proxmox"
|
||||
},
|
||||
{
|
||||
"command": "pveupgrade",
|
||||
"description": "Mostrar las actualizaciones disponibles de Proxmox"
|
||||
},
|
||||
{
|
||||
"command": "pve-upgrade",
|
||||
"description": "Realizar la actualización de Proxmox VE"
|
||||
},
|
||||
{
|
||||
"command": "pveceph upgrade",
|
||||
"description": "Actualizar los paquetes de Ceph (si Ceph está instalado)"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión de paquetes",
|
||||
"commands": [
|
||||
{
|
||||
"command": "apt autoremove --purge",
|
||||
"description": "Eliminar paquetes sin uso y su configuración"
|
||||
},
|
||||
{
|
||||
"command": "apt clean",
|
||||
"description": "Vaciar el repositorio local de ficheros de paquetes descargados"
|
||||
},
|
||||
{
|
||||
"command": "apt autoclean",
|
||||
"description": "Vaciar solo los ficheros de paquetes obsoletos"
|
||||
},
|
||||
{
|
||||
"command": "apt install <package>",
|
||||
"description": "Instalar un paquete concreto"
|
||||
},
|
||||
{
|
||||
"command": "apt remove <package>",
|
||||
"description": "Eliminar un paquete"
|
||||
},
|
||||
{
|
||||
"command": "apt purge <package>",
|
||||
"description": "Eliminar un paquete y sus ficheros de configuración"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Información de paquetes",
|
||||
"commands": [
|
||||
{
|
||||
"command": "apt list --installed",
|
||||
"description": "Listar todos los paquetes instalados"
|
||||
},
|
||||
{
|
||||
"command": "apt search <keyword>",
|
||||
"description": "Buscar paquetes por palabra clave"
|
||||
},
|
||||
{
|
||||
"command": "apt show <package>",
|
||||
"description": "Mostrar información detallada de un paquete"
|
||||
},
|
||||
{
|
||||
"command": "dpkg -l",
|
||||
"description": "Listar todos los paquetes instalados (alternativa)"
|
||||
},
|
||||
{
|
||||
"command": "dpkg -l | grep <keyword>",
|
||||
"description": "Buscar paquetes instalados por palabra clave"
|
||||
},
|
||||
{
|
||||
"command": "apt-cache policy <package>",
|
||||
"description": "Mostrar versiones y prioridades de un paquete"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión de repositorios",
|
||||
"commands": [
|
||||
{
|
||||
"command": "cat /etc/apt/sources.list",
|
||||
"description": "Mostrar las fuentes APT principales"
|
||||
},
|
||||
{
|
||||
"command": "ls -la /etc/apt/sources.list.d/",
|
||||
"description": "Listar ficheros de fuentes de repositorios adicionales"
|
||||
},
|
||||
{
|
||||
"command": "cat /etc/apt/sources.list.d/pve-enterprise.list",
|
||||
"description": "Mostrar la configuración del repo Proxmox Enterprise"
|
||||
},
|
||||
{
|
||||
"command": "apt-key list",
|
||||
"description": "Listar las claves de firma de los repositorios"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"backupWarn": {
|
||||
"title": "Haz un backup antes de actualizaciones mayores",
|
||||
"bodyRich": "Para releases puntuales (8.4.1 → 8.4.5) el clásico <code>apt update && apt upgrade</code> es seguro. Para <strong>actualizaciones de versión mayor</strong> (PVE 8 → 9) usa el flujo dedicado de ProxMenux: <upgradeLink>Actualizar PVE 8 a PVE 9</upgradeLink> — añade comprobaciones previas, migración de repositorios y validación post-actualización."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/utils/system-update",
|
||||
"label": "Actualización del sistema Proxmox (interactivo)",
|
||||
"tail": " — wrapper que hace todo esto con un diálogo de confirmación y preguntar antes de reiniciar."
|
||||
},
|
||||
{
|
||||
"href": "/docs/utils/upgrade-pve8-pve9",
|
||||
"label": "Actualizar PVE 8 a PVE 9",
|
||||
"tail": " — para actualizaciones de versión mayor."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comandos qm y pct de Proxmox — gestión de VM y contenedores LXC | ProxMenux",
|
||||
"description": "Referencia de comandos qm y pct de Proxmox VE para VMs y contenedores LXC: list, config, start, stop, shutdown, reboot, destroy, clone, migrate, snapshot, resize, además de pct exec / enter / push / pull para contenedores.",
|
||||
"ogTitle": "Comandos qm y pct de Proxmox — gestión de VM y contenedores LXC",
|
||||
"ogDescription": "Referencia de comandos qm y pct de Proxmox VE — gestiona máquinas virtuales y contenedores LXC desde la CLI: arrancar, parar, configurar, snapshot, migrar, clonar, destruir.",
|
||||
"twitterTitle": "Comandos qm / pct de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Comandos qm / pct curados para gestionar máquinas virtuales y contenedores LXC en Proxmox VE."
|
||||
},
|
||||
"header": {
|
||||
"title": "Gestión de VM y CT",
|
||||
"description": "Referencia curada de los comandos qm (VMs) y pct (contenedores LXC). Listado, ciclo de vida (start / stop / shutdown / destroy), inspección de configuración y operaciones específicas de contenedor como exec, enter, push y pull.",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Localiza primero el VMID o CTID",
|
||||
"body": "Casi todos los comandos necesitan un ID numérico. Usa <code>qm list</code> para VMs y <code>pct list</code> para contenedores. Reemplaza <code><vmid></code> / <code><ctid></code> en los snippets por el ID real antes de ejecutar."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Listado e información",
|
||||
"commands": [
|
||||
{
|
||||
"command": "qm list",
|
||||
"description": "Listar todas las máquinas virtuales"
|
||||
},
|
||||
{
|
||||
"command": "pct list",
|
||||
"description": "Listar todos los contenedores LXC"
|
||||
},
|
||||
{
|
||||
"command": "qm config <vmid>",
|
||||
"description": "Mostrar la configuración de la VM (parseada por qm)"
|
||||
},
|
||||
{
|
||||
"command": "pct config <ctid>",
|
||||
"description": "Mostrar la configuración del contenedor (parseada por pct)"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Ficheros de configuración (en crudo)",
|
||||
"commands": [
|
||||
{
|
||||
"command": "cat /etc/pve/qemu-server/<vmid>.conf",
|
||||
"description": "Ver el fichero de configuración de la VM en crudo"
|
||||
},
|
||||
{
|
||||
"command": "cat /etc/pve/lxc/<ctid>.conf",
|
||||
"description": "Ver el fichero de configuración del CT en crudo"
|
||||
},
|
||||
{
|
||||
"command": "nano /etc/pve/qemu-server/<vmid>.conf",
|
||||
"description": "Editar el fichero de configuración de la VM en crudo (nano)"
|
||||
},
|
||||
{
|
||||
"command": "nano /etc/pve/lxc/<ctid>.conf",
|
||||
"description": "Editar el fichero de configuración del CT en crudo (nano)"
|
||||
},
|
||||
{
|
||||
"command": "vi /etc/pve/qemu-server/<vmid>.conf",
|
||||
"description": "Editar el fichero de configuración de la VM en crudo (vi)"
|
||||
},
|
||||
{
|
||||
"command": "vi /etc/pve/lxc/<ctid>.conf",
|
||||
"description": "Editar el fichero de configuración del CT en crudo (vi)"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión de VM",
|
||||
"commands": [
|
||||
{
|
||||
"command": "qm start <vmid>",
|
||||
"description": "Arrancar una máquina virtual. Usa el <vmid> correcto"
|
||||
},
|
||||
{
|
||||
"command": "qm stop <vmid>",
|
||||
"description": "Forzar la parada de una máquina virtual. Usa el <vmid> correcto"
|
||||
},
|
||||
{
|
||||
"command": "qm shutdown <vmid>",
|
||||
"description": "Apagar una máquina virtual de forma ordenada"
|
||||
},
|
||||
{
|
||||
"command": "qm reset <vmid>",
|
||||
"description": "Resetear una máquina virtual (reinicio en caliente)"
|
||||
},
|
||||
{
|
||||
"command": "qm suspend <vmid>",
|
||||
"description": "Suspender una máquina virtual"
|
||||
},
|
||||
{
|
||||
"command": "qm resume <vmid>",
|
||||
"description": "Reanudar una máquina virtual suspendida"
|
||||
},
|
||||
{
|
||||
"command": "qm destroy <vmid>",
|
||||
"description": "Eliminar una VM (irreversible). Usa el <vmid> correcto"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión de contenedores",
|
||||
"commands": [
|
||||
{
|
||||
"command": "pct start <ctid>",
|
||||
"description": "Arrancar un contenedor. Usa el <ctid> correcto"
|
||||
},
|
||||
{
|
||||
"command": "pct stop <ctid>",
|
||||
"description": "Forzar la parada de un contenedor. Usa el <ctid> correcto"
|
||||
},
|
||||
{
|
||||
"command": "pct shutdown <ctid>",
|
||||
"description": "Apagar un contenedor de forma ordenada"
|
||||
},
|
||||
{
|
||||
"command": "pct restart <ctid>",
|
||||
"description": "Reiniciar un contenedor"
|
||||
},
|
||||
{
|
||||
"command": "pct destroy <ctid>",
|
||||
"description": "Eliminar un CT (irreversible). Usa el <ctid> correcto"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Operaciones de contenedor",
|
||||
"commands": [
|
||||
{
|
||||
"command": "pct exec <ctid> -- getent passwd | column -t -s :",
|
||||
"description": "Mostrar los usuarios del CT en formato tabla"
|
||||
},
|
||||
{
|
||||
"command": "pct exec <ctid> -- ps aux --sort=-%mem | head",
|
||||
"description": "Top de procesos por memoria en el CT"
|
||||
},
|
||||
{
|
||||
"command": "pct enter <ctid>",
|
||||
"description": "Entrar en la shell del contenedor"
|
||||
},
|
||||
{
|
||||
"command": "pct push <ctid> <source> <dest>",
|
||||
"description": "Copiar un fichero del host al contenedor"
|
||||
},
|
||||
{
|
||||
"command": "pct pull <ctid> <source> <dest>",
|
||||
"description": "Copiar un fichero del contenedor al host"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"destroyWarn": {
|
||||
"title": "Destroy es irreversible",
|
||||
"bodyRich": "<code>qm destroy</code> y <code>pct destroy</code> eliminan la VM / CT y todos sus discos. No hay confirmación por defecto. Haz un backup primero si hay alguna posibilidad de que quieras recuperar los datos — ver <backupLink>Backup y restauración</backupLink>."
|
||||
},
|
||||
"qmConfigTip": {
|
||||
"title": "qm config vs editar el fichero .conf directamente",
|
||||
"bodyRich": "<code>qm config <vmid></code> y <code>pct config <ctid></code> leen el fichero a través del parser de Proxmox — la salida está normalizada, sin comentarios, y los cambios pendientes se muestran aparte. Editar <code>/etc/pve/qemu-server/<vmid>.conf</code> o <code>/etc/pve/lxc/<ctid>.conf</code> directamente salta el parser. Útil para arreglar una config corrupta o aplicar un ajuste que <code>qm set</code> no acepte, pero detén antes el guest para evitar races. El sistema de ficheros del clúster (<code>pmxcfs</code>) se encarga de propagar el cambio a los demás nodos."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/help-info/backup-commands",
|
||||
"label": "Backup y restauración",
|
||||
"tail": " — vzdump y qmrestore / pct restore."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"label": "Almacenamiento y discos",
|
||||
"tail": " — qm importdisk y gestión de discos."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,227 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Comandos ZFS en Proxmox — zpool, zfs snapshot, send/receive, scrub | ProxMenux",
|
||||
"description": "Referencia de comandos de gestión ZFS en Proxmox VE: zpool create / status / history, zfs list / get / set, snapshots, clone, zfs send y receive, scrub, clear, replace, zpool iostat, resumen de ARC.",
|
||||
"ogTitle": "Comandos ZFS en Proxmox — zpool, zfs snapshot, send/receive, scrub",
|
||||
"ogDescription": "Referencia de comandos zpool y zfs en Proxmox VE — pools, datasets, snapshots, replicación, mantenimiento.",
|
||||
"twitterTitle": "Comandos ZFS en Proxmox | ProxMenux",
|
||||
"twitterDescription": "Comandos zpool y zfs para Proxmox VE: pools, datasets, snapshots, replicación, mantenimiento."
|
||||
},
|
||||
"header": {
|
||||
"title": "Gestión de ZFS",
|
||||
"description": "Referencia curada de comandos zpool y zfs: inspección de pools, CRUD de datasets, snapshots, clone y send/receive (incremental y recursivo), scrub / clear / replace para mantenimiento, además de estadísticas de E/S y resumen de ARC.",
|
||||
"section": "Ayuda e información"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Dos familias de comandos",
|
||||
"body": "<code>zpool *</code> gestiona los pools de almacenamiento (capa física — discos, vdevs, redundancia). <code>zfs *</code> gestiona los datasets y snapshots que viven dentro de esos pools (capa lógica — sistemas de ficheros, volúmenes, snapshots, propiedades)."
|
||||
},
|
||||
"commandGroups": [
|
||||
{
|
||||
"title": "Información de pool",
|
||||
"commands": [
|
||||
{
|
||||
"command": "zpool list",
|
||||
"description": "Listar todos los pools ZFS"
|
||||
},
|
||||
{
|
||||
"command": "zpool status",
|
||||
"description": "Mostrar el estado y la salud detallada de los pools"
|
||||
},
|
||||
{
|
||||
"command": "zpool status -v",
|
||||
"description": "Mostrar el estado del pool en modo verboso con errores"
|
||||
},
|
||||
{
|
||||
"command": "zpool history",
|
||||
"description": "Mostrar el historial de comandos de todos los pools"
|
||||
},
|
||||
{
|
||||
"command": "zpool history <pool>",
|
||||
"description": "Mostrar el historial de comandos de un pool concreto"
|
||||
},
|
||||
{
|
||||
"command": "zpool get all <pool>",
|
||||
"description": "Mostrar todas las propiedades de un pool"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión de datasets",
|
||||
"commands": [
|
||||
{
|
||||
"command": "zfs list",
|
||||
"description": "Listar todos los datasets ZFS"
|
||||
},
|
||||
{
|
||||
"command": "zfs list -r <pool>",
|
||||
"description": "Listar todos los datasets de un pool recursivamente"
|
||||
},
|
||||
{
|
||||
"command": "zfs create <pool>/<dataset>",
|
||||
"description": "Crear un nuevo dataset"
|
||||
},
|
||||
{
|
||||
"command": "zfs destroy <pool>/<dataset>",
|
||||
"description": "Destruir un dataset"
|
||||
},
|
||||
{
|
||||
"command": "zfs rename <pool>/<dataset> <pool>/<new-name>",
|
||||
"description": "Renombrar un dataset"
|
||||
},
|
||||
{
|
||||
"command": "zfs get all <pool>/<dataset>",
|
||||
"description": "Mostrar todas las propiedades de un dataset"
|
||||
},
|
||||
{
|
||||
"command": "zfs set compression=on <pool>/<dataset>",
|
||||
"description": "Activar la compresión en un dataset"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Gestión de snapshots",
|
||||
"commands": [
|
||||
{
|
||||
"command": "zfs list -t snapshot",
|
||||
"description": "Listar todos los snapshots"
|
||||
},
|
||||
{
|
||||
"command": "zfs list -t snapshot -r <pool>",
|
||||
"description": "Listar todos los snapshots de un pool"
|
||||
},
|
||||
{
|
||||
"command": "zfs snapshot <pool>/<dataset>@<snapshot-name>",
|
||||
"description": "Crear un snapshot"
|
||||
},
|
||||
{
|
||||
"command": "zfs destroy <pool>/<dataset>@<snapshot-name>",
|
||||
"description": "Borrar un snapshot"
|
||||
},
|
||||
{
|
||||
"command": "zfs rollback <pool>/<dataset>@<snapshot-name>",
|
||||
"description": "Hacer rollback a un snapshot"
|
||||
},
|
||||
{
|
||||
"command": "zfs hold <tag> <pool>/<dataset>@<snapshot-name>",
|
||||
"description": "Poner un hold en un snapshot"
|
||||
},
|
||||
{
|
||||
"command": "zfs release <tag> <pool>/<dataset>@<snapshot-name>",
|
||||
"description": "Liberar un hold en un snapshot"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Clone y send/receive",
|
||||
"commands": [
|
||||
{
|
||||
"command": "zfs clone <pool>/<dataset>@<snapshot> <pool>/<clone-name>",
|
||||
"description": "Crear un clone a partir de un snapshot"
|
||||
},
|
||||
{
|
||||
"command": "zfs send <pool>/<dataset>@<snapshot> > backup.zfs",
|
||||
"description": "Enviar un snapshot a un fichero"
|
||||
},
|
||||
{
|
||||
"command": "zfs receive <pool>/<dataset> < backup.zfs",
|
||||
"description": "Recibir un snapshot desde un fichero"
|
||||
},
|
||||
{
|
||||
"command": "zfs send -i <pool>/<dataset>@<snap1> <pool>/<dataset>@<snap2> > incr.zfs",
|
||||
"description": "Enviar un snapshot incremental"
|
||||
},
|
||||
{
|
||||
"command": "zfs send -R <pool>/<dataset>@<snapshot> > full-recursive.zfs",
|
||||
"description": "Enviar un snapshot recursivo"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Mantenimiento y reparación",
|
||||
"commands": [
|
||||
{
|
||||
"command": "zpool scrub <pool>",
|
||||
"description": "Iniciar un scrub sobre un pool"
|
||||
},
|
||||
{
|
||||
"command": "zpool scrub -s <pool>",
|
||||
"description": "Parar un scrub en curso"
|
||||
},
|
||||
{
|
||||
"command": "zpool clear <pool>",
|
||||
"description": "Limpiar los contadores de error de un pool"
|
||||
},
|
||||
{
|
||||
"command": "zpool clear <pool> <device>",
|
||||
"description": "Limpiar errores en un dispositivo concreto"
|
||||
},
|
||||
{
|
||||
"command": "zpool replace <pool> <old-device> <new-device>",
|
||||
"description": "Reemplazar un dispositivo fallido"
|
||||
},
|
||||
{
|
||||
"command": "zpool offline <pool> <device>",
|
||||
"description": "Poner un dispositivo offline"
|
||||
},
|
||||
{
|
||||
"command": "zpool online <pool> <device>",
|
||||
"description": "Poner un dispositivo online"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Rendimiento y monitorización",
|
||||
"commands": [
|
||||
{
|
||||
"command": "zpool iostat",
|
||||
"description": "Mostrar estadísticas de E/S de los pools"
|
||||
},
|
||||
{
|
||||
"command": "zpool iostat -v",
|
||||
"description": "Mostrar estadísticas de E/S detalladas"
|
||||
},
|
||||
{
|
||||
"command": "zpool iostat 5",
|
||||
"description": "Mostrar estadísticas de E/S cada 5 segundos"
|
||||
},
|
||||
{
|
||||
"command": "arc_summary",
|
||||
"description": "Mostrar estadísticas de ARC (si está instalado)"
|
||||
},
|
||||
{
|
||||
"command": "zfs get compressratio <pool>/<dataset>",
|
||||
"description": "Mostrar la ratio de compresión"
|
||||
},
|
||||
{
|
||||
"command": "zfs get used,available,referenced <pool>/<dataset>",
|
||||
"description": "Mostrar el uso de espacio"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"bestPractices": {
|
||||
"title": "Buenas prácticas operativas",
|
||||
"bodyRich": "Ejecuta <code>zpool scrub</code> semanal o mensualmente para detectar corrupción silenciosa. Mantén al menos un 10-15% del pool libre — el rendimiento de ZFS cae con fuerza por encima del 80% lleno. Reemplaza siempre los dispositivos fallidos con <code>zpool replace</code> (in-place) en lugar de detach + add (que pierde la redundancia temporalmente)."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"label": "Almacenamiento y discos",
|
||||
"tail": " — comandos genéricos de dispositivos de bloque y LVM."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info/backup-commands",
|
||||
"label": "Backup y restauración",
|
||||
"tail": " — vzdump, qmrestore."
|
||||
},
|
||||
{
|
||||
"href": "/docs/help-info",
|
||||
"label": "Resumen de Ayuda e información",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar ProxMenux | ProxMenux Documentation",
|
||||
"description": "Instalador de una línea para ProxMenux en hosts Proxmox VE 8+. Elige entre el sabor con traducción (multi-idioma) o normal (ligero, solo inglés). Canal beta también disponible para acceso temprano a nuevas funciones.",
|
||||
"ogTitle": "Instalar ProxMenux | ProxMenux Documentation",
|
||||
"ogDescription": "Instala ProxMenux en Proxmox VE 8+ con un comando. Canales estable y beta disponibles."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar ProxMenux",
|
||||
"description": "Instalador de una línea que corre en cualquier host Proxmox VE 8+. Instala automáticamente las dependencias que necesita, descarga los scripts, configura el lanzador del menú y (en la primera ejecución) te pide elegir un idioma. Dos canales de instalación: estable (por defecto) y beta.",
|
||||
"section": "Instalación"
|
||||
},
|
||||
"stable": {
|
||||
"heading": "Instalación",
|
||||
"intro": "Ejecuta esto en el terminal de tu host Proxmox:",
|
||||
"code": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\""
|
||||
},
|
||||
"during": {
|
||||
"heading": "Durante la instalación",
|
||||
"intro": "ProxMenux instala y configura automáticamente las dependencias que necesita:",
|
||||
"tablePackage": "Paquete",
|
||||
"tablePurpose": "Propósito",
|
||||
"rows": [
|
||||
{
|
||||
"package": "dialog",
|
||||
"purpose": "Menús interactivos de terminal"
|
||||
},
|
||||
{
|
||||
"package": "curl",
|
||||
"purpose": "Descargas y comprobaciones de conectividad"
|
||||
},
|
||||
{
|
||||
"package": "jq",
|
||||
"purpose": "Procesamiento de JSON"
|
||||
},
|
||||
{
|
||||
"package": "git",
|
||||
"purpose": "Clonado y actualizaciones de repositorios"
|
||||
}
|
||||
],
|
||||
"outro": "El instalador también baja el árbol de scripts en <code>/usr/local/share/proxmenux/</code> y crea el lanzador en <code>/usr/local/bin/menu</code>. El panel web <strong>ProxMenux Monitor</strong> se registra como <code>proxmenux-monitor.service</code>.",
|
||||
"imageAlt": "Instalación de ProxMenux en progreso"
|
||||
},
|
||||
"first": {
|
||||
"heading": "Primer lanzamiento",
|
||||
"intro": "Una vez instalado, ejecuta:",
|
||||
"code": "menu",
|
||||
"outro": "ProxMenux arranca y aterrizas en el menú principal. Desde aquí puedes ejecutar cualquiera de los flujos documentados en este sitio — <postlink>Post-instalación</postlink> es una buena primera parada en un host Proxmox recién hecho."
|
||||
},
|
||||
"beta": {
|
||||
"heading": "Canal beta",
|
||||
"calloutTitle": "¿Qué es el programa beta?",
|
||||
"calloutBody": "¿Quieres probar las últimas funciones antes del release oficial y ayudar a dar forma a la versión final? El programa beta de ProxMenux da acceso temprano a la nueva funcionalidad — incluyendo los builds más nuevos de ProxMenux Monitor — directamente desde la rama <code>develop</code>. Los builds beta pueden contener bugs o funciones incompletas. Tu feedback ayuda a arreglarlos antes del release estable.",
|
||||
"intro": "Instala la versión beta en lugar de la estable con:",
|
||||
"code": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/develop/install_proxmenux_beta.sh)\"",
|
||||
"outro": "La beta es opt-in — tienes que ejecutar explícitamente el instalador beta. Cuando se publica una release estable, ProxMenux te notifica en el siguiente lanzamiento de <code>menu</code> y ofrece cambiar automáticamente. Para salir antes, usa la opción <betalink>Desactivar programa beta</betalink> en Settings."
|
||||
},
|
||||
"updating": {
|
||||
"heading": "Actualizar",
|
||||
"body": "ProxMenux se autoactualiza. Cuando hay una nueva versión disponible, te lo pide en el siguiente lanzamiento de <code>menu</code> y aceptar reemplaza los archivos de utilidad y las configuraciones en sitio. No hace falta descarga manual. Los usuarios estables reciben releases estables; los usuarios beta reciben releases beta (y el prompt de auto-cambio de arriba cuando una estable se publica)."
|
||||
},
|
||||
"uninstall": {
|
||||
"heading": "Desinstalar",
|
||||
"body": "Desde dentro de ProxMenux: <strong>Settings → Desinstalar ProxMenux</strong>. Elimina el árbol de scripts, el lanzador y el servicio del Monitor, opcionalmente elimina las dependencias seleccionadas, restaura los backups de <code>/root/.bashrc</code> y <code>/etc/motd</code> tomados en el momento de la instalación. Paso a paso completo: <uninstalllink>Desinstalar ProxMenux</uninstalllink>."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"virustotalTitle": "VirusTotal marca la URL de instalación",
|
||||
"virustotalBody": "Una detección 1/95 por motores heurísticos (p. ej. <em>Chong Lua Dao</em>) es un falso positivo conocido. El instalador usa el patrón estándar <code>curl | bash</code> y descarga binarios legítimos (como <code>jq</code> desde su release oficial en GitHub), que los escáneres agresivos marcan basándose en el <em>comportamiento</em> y no en código realmente malicioso. El instalador es 100% código abierto y revisable. Más contexto en la <issuelink>Issue #162</issuelink>.",
|
||||
"aptTitle": "La instalación falla con errores de apt",
|
||||
"aptBody": "Normalmente un repo de Proxmox faltante o mal configurado. El instalador trae las dependencias vía apt; si la configuración del repo está rota (común en instalaciones de Proxmox 8 a pelo que no se han actualizado aún), apt falla. Ejecuta <code>apt-get update</code> manualmente primero y resuelve cualquier error, después vuelve a ejecutar el instalador.",
|
||||
"menuTitle": "`menu: command not found` tras la instalación",
|
||||
"menuBody": "El lanzador vive en <code>/usr/local/bin/menu</code>. Comprueba que esté ahí: <code>ls -lh /usr/local/bin/menu</code>. Si falta, la instalación terminó antes — vuelve a ejecutar el instalador. Si está pero no se encuentra, tu PATH no incluye <code>/usr/local/bin</code>; o arreglas el PATH o invocas el lanzador directamente: <code>/usr/local/bin/menu</code>.",
|
||||
"stuckTitle": "La instalación se queda colgada o no avanza",
|
||||
"stuckBody": "Si una instalación, reinstalación o actualización se queda congelada por un problema de conexión, cancela el proceso con <strong>Ctrl + C</strong> y vuelve a lanzar el instalador a mano.",
|
||||
"otherTitle": "Otros problemas",
|
||||
"otherBody": "Mira las <issueslink>GitHub Issues</issueslink> en busca de problemas conocidos o abre una nueva con la salida de log relevante. Usuarios beta: incluye <code>journalctl -u proxmenux-monitor -n 50</code> si está relacionado con el Monitor."
|
||||
},
|
||||
"next": {
|
||||
"heading": "Por dónde seguir",
|
||||
"postInstall": "<postlink>Script de post-instalación</postlink> — ajustes y hardening para un host Proxmox recién hecho.",
|
||||
"introduction": "<introlink>Introducción</introlink> — el tour completo de funciones.",
|
||||
"monitor": "<monitorlink>ProxMenux Monitor</monitorlink> — panel web para el host (instalado automáticamente junto al menú)."
|
||||
},
|
||||
"requirements": {
|
||||
"heading": "Requisitos y buenas prácticas",
|
||||
"reqTitle": "Requisitos",
|
||||
"reqBody": "Proxmox VE <strong>8.x o posterior</strong>. PVE 7 y anteriores no están soportados. Acceso a internet desde el host (el instalador descarga scripts, dependencias y — en la instalación con traducción — paquetes de Python desde PyPI). Ejecuta como <strong>root</strong> en el host Proxmox.",
|
||||
"inspectTitle": "Revisa siempre los scripts que ejecutas desde internet",
|
||||
"inspectReview": "<sourcelink>Revisa la fuente del instalador</sourcelink> antes de ejecutarlo.",
|
||||
"inspectCoc": "Todos los enlaces ejecutables siguen el <coclink>código de conducta de ProxMenux</coclink>."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,206 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux — Herramienta basada en menús para gestionar Proxmox VE | Código abierto",
|
||||
"description": "Herramienta de código abierto basada en menús para la gestión de Proxmox VE. ProxMenux son dos piezas que comparten un mismo proyecto: una CLI/TUI para ajustes post-instalación, creación de VMs y LXC, passthrough de GPU y Coral TPU, flujos de disco, almacenamiento y red; y un panel web autoalojado con monitor de salud proactivo, notificaciones a Telegram / Discord / Email, reescritura con IA y una API REST.",
|
||||
"ogTitle": "ProxMenux — Herramienta basada en menús para gestionar Proxmox VE",
|
||||
"ogDescription": "CLI/TUI de código abierto más panel web para Proxmox VE. Post-instalación, VMs, GPUs, discos, red, almacenamiento, seguridad — y un Monitor independiente con chequeos de salud, notificaciones, reescritura con IA y API REST.",
|
||||
"twitterTitle": "ProxMenux — Herramienta basada en menús para gestionar Proxmox VE",
|
||||
"twitterDescription": "CLI/TUI de código abierto + panel web para Proxmox VE. Monitor de salud, notificaciones, reescritura con IA, API REST."
|
||||
},
|
||||
"header": {
|
||||
"title": "Introducción",
|
||||
"description": "ProxMenux es una herramienta de código abierto basada en menús para Proxmox VE. Dos piezas comparten el mismo proyecto: una CLI/TUI que envuelve los flujos más comunes del host, VMs, contenedores, almacenamiento, red y seguridad; y un panel web autoalojado con monitor de salud proactivo, notificaciones, un gancho de reescritura con IA y una API REST.",
|
||||
"section": "Introducción"
|
||||
},
|
||||
"hero": {
|
||||
"tagline": "<strong>Un único menú, todos los flujos.</strong> Todo lo que normalmente requiere abrir una pestaña en el wiki, dos hilos del foro y copiar y pegar una secuencia de comandos — expuesto como una opción numerada que ejecutas en segundos.",
|
||||
"audience": "Pensado para usuarios <em>noveles</em> de Proxmox (valores por defecto seguros y bien definidos) y para administradores <em>experimentados</em> (menos pulsaciones para tareas que han hecho cien veces). Gratis y de código abierto con una comunidad activa en <github>GitHub</github>."
|
||||
},
|
||||
"twoProducts": {
|
||||
"heading": "Dos productos, un solo proyecto",
|
||||
"intro": "ProxMenux se distribuye como dos piezas independientes que comparten el mismo árbol de código. El instalador despliega ambas — conviven en el host y no dependen entre sí:",
|
||||
"scripts": {
|
||||
"title": "ProxMenux Scripts",
|
||||
"body": "La CLI/TUI original que se lanza con <code>menu</code>. Nueve áreas funcionales que cubren optimizaciones post-instalación, creación de VMs y LXC, passthrough de GPU y Coral TPU, discos, almacenamiento, red, seguridad, utilidades, además de una referencia curada de comandos. Funciona en cualquier terminal — local, SSH o web."
|
||||
},
|
||||
"monitor": {
|
||||
"title": "ProxMenux Monitor",
|
||||
"body": "Panel web autoalojado (AppImage). Métricas del host en tiempo real, un monitor de salud proactivo, notificaciones, un gancho opcional de reescritura con IA (seis proveedores), un terminal web integrado y una API REST. Actívalo desde el menú de Scripts (Settings → ProxMenux Monitor)."
|
||||
},
|
||||
"calloutTitle": "Sobre qué actúa ProxMenux",
|
||||
"calloutIntro": "Tres capas, todas accesibles desde el mismo proyecto:",
|
||||
"layers": [
|
||||
"<strong>El host Proxmox</strong> — repositorios, paquetes, red, ZFS, Ceph, kernel, observabilidad.",
|
||||
"<strong>Máquinas virtuales (VMs)</strong> — creación, passthrough de GPU, importación / exportación OVA / OVF, passthrough de disco.",
|
||||
"<strong>Contenedores LXC</strong> — creación, puntos de montaje, passthrough de GPU / TPU, clientes y servidores NFS / Samba."
|
||||
]
|
||||
},
|
||||
"scriptsSection": {
|
||||
"heading": "ProxMenux Scripts — qué incluye",
|
||||
"intro": "Nueve áreas funcionales, cada una con su propio menú dentro de <code>menu</code> y una página de detalle en la documentación. Pulsa cualquier tarjeta para ir directamente al resumen de esa sección.",
|
||||
"items": [
|
||||
{
|
||||
"title": "Post-instalación",
|
||||
"description": "Optimizaciones para una configuración de Proxmox recién instalada: repositorios, kernel, sincronización horaria, seguridad básica, rendimiento, con opciones reversibles.",
|
||||
"icon": "Server",
|
||||
"href": "/docs/post-install"
|
||||
},
|
||||
{
|
||||
"title": "GPUs y Coral TPU",
|
||||
"description": "Passthrough de NVIDIA, iGPU Intel, AMD y Coral TPU a VMs y contenedores LXC, con cambio de modo entre VM y LXC.",
|
||||
"icon": "Cpu",
|
||||
"href": "/docs/hardware/nvidia-host"
|
||||
},
|
||||
{
|
||||
"title": "Crear VM",
|
||||
"description": "Asistentes para sistemas NAS, Windows y Linux — con valores por defecto de hardware, almacenamiento y red.",
|
||||
"icon": "Server",
|
||||
"href": "/docs/create-vm"
|
||||
},
|
||||
{
|
||||
"title": "Disk Manager",
|
||||
"description": "Importar discos físicos a VMs y LXC, formatear y borrar, tests SMART, importación de imágenes qcow2 / vmdk / vdi — todo desde un menú.",
|
||||
"icon": "HardDrive",
|
||||
"href": "/docs/disk-manager"
|
||||
},
|
||||
{
|
||||
"title": "Almacenamiento y compartición",
|
||||
"description": "Registrar almacenamiento NFS, Samba (CIFS), iSCSI y local en Proxmox; compartir carpetas entre el host y contenedores LXC mediante bind mounts o protocolos de red.",
|
||||
"icon": "Boxes",
|
||||
"href": "/docs/storage-share"
|
||||
},
|
||||
{
|
||||
"title": "Red",
|
||||
"description": "Diagnósticos de solo lectura, flujos de análisis-y-sugerencia y reparaciones guiadas de /etc/network/interfaces. Copias de seguridad obligatorias antes de cualquier cambio.",
|
||||
"icon": "Network",
|
||||
"href": "/docs/network"
|
||||
},
|
||||
{
|
||||
"title": "Seguridad",
|
||||
"description": "Fail2Ban (prevención de intrusiones para SSH y las interfaces web) y Lynis (auditoría de hardening) — instalación y gestión con valores por defecto sensatos.",
|
||||
"icon": "Shield",
|
||||
"href": "/docs/security"
|
||||
},
|
||||
{
|
||||
"title": "Utilidades",
|
||||
"description": "Crear ISOs de Windows desde UUP Dump, instalar herramientas CLI, ejecutar una actualización segura del sistema, hacer el salto PVE 8 → 9, exportar e importar VMs OVA / OVF.",
|
||||
"icon": "Wrench",
|
||||
"href": "/docs/utils"
|
||||
},
|
||||
{
|
||||
"title": "Referencia de comandos",
|
||||
"description": "Catálogo curado de comandos de Linux y Proxmox organizados por tema — sistema, VM/CT (qm, pct), almacenamiento, red, ZFS, passthrough de GPU, backup, herramientas CLI del día a día.",
|
||||
"icon": "BookOpen",
|
||||
"href": "/docs/help-info"
|
||||
}
|
||||
]
|
||||
},
|
||||
"monitorSection": {
|
||||
"heading": "ProxMenux Monitor — qué incluye",
|
||||
"intro": "El producto del panel web. Autoalojado en el host Proxmox en el puerto TCP 8008. Pulsa cualquier tarjeta para ir directamente a su página, o lee primero el <link>resumen del Monitor</link>.",
|
||||
"items": [
|
||||
{
|
||||
"title": "Monitor de salud",
|
||||
"description": "Diez categorías escaneadas cada 5 minutos (CPU, memoria, almacenamiento, discos/SMART, red, VMs, servicios, logs, actualizaciones, seguridad) con niveles de severidad y supresión por categoría.",
|
||||
"icon": "Activity",
|
||||
"href": "/docs/monitor/health-monitor"
|
||||
},
|
||||
{
|
||||
"title": "Notificaciones",
|
||||
"description": "Telegram, Discord, Email, Gotify y Apprise (multicanal) — con deduplicación, cooldown, agregación de ráfagas, horas silenciosas y un historial completo.",
|
||||
"icon": "Bell",
|
||||
"href": "/docs/monitor/notifications"
|
||||
},
|
||||
{
|
||||
"title": "Asistente de IA",
|
||||
"description": "Reescritura opcional de notificaciones en lenguaje natural. Seis proveedores: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter, Ollama local. Doce idiomas.",
|
||||
"icon": "Sparkles",
|
||||
"href": "/docs/monitor/ai-assistant"
|
||||
},
|
||||
{
|
||||
"title": "Terminal web",
|
||||
"description": "Shell interactiva en el navegador sobre el host Proxmox, más un terminal independiente de ProxMenux Scripts que ejecuta el menú a través de la interfaz web.",
|
||||
"icon": "Terminal",
|
||||
"href": "/docs/monitor/dashboard/terminal"
|
||||
},
|
||||
{
|
||||
"title": "API REST",
|
||||
"description": "Endpoints HTTP para sistema, salud, almacenamiento / SMART, red, VMs, notificaciones y seguridad — útil para Homepage, Home Assistant, Prometheus o scripts propios.",
|
||||
"icon": "Code2",
|
||||
"href": "/docs/monitor/api"
|
||||
},
|
||||
{
|
||||
"title": "Integraciones",
|
||||
"description": "Webhook nativo de Proxmox VE, scrape de Prometheus, probe de Uptime Kuma, widgets para Homepage / Home Assistant / Glance, flujos n8n / Zapier, Tailscale Secure Gateway.",
|
||||
"icon": "Plug",
|
||||
"href": "/docs/monitor/integrations"
|
||||
}
|
||||
]
|
||||
},
|
||||
"installPaths": {
|
||||
"heading": "Rutas de instalación",
|
||||
"intro": "El instalador despliega Scripts y Monitor en un solo paso. Scripts tiene dos variantes — con traducción o ligera — y el Monitor se instala como AppImage independiente que se activa después desde el menú:",
|
||||
"headerPath": "Ruta de instalación",
|
||||
"headerBundles": "Qué incluye",
|
||||
"headerWhen": "Cuándo elegirla",
|
||||
"rows": [
|
||||
{
|
||||
"pathRich": "<strong>Scripts: con traducción</strong>",
|
||||
"bundles": "CLI/TUI + entorno virtual de Python + googletrans (inglés, español, francés, alemán, italiano, portugués)",
|
||||
"when": "Menús multi-idioma, usuarios no anglófonos"
|
||||
},
|
||||
{
|
||||
"pathRich": "<strong>Scripts: normal (ligera)</strong>",
|
||||
"bundles": "CLI/TUI solo en inglés, huella menor, sin entorno virtual de Python",
|
||||
"when": "La mayoría de usuarios — la documentación de Proxmox está en inglés de todos modos"
|
||||
},
|
||||
{
|
||||
"pathRich": "<strong>Monitor</strong>",
|
||||
"bundles": "AppImage autocontenido en el puerto TCP 8008. Instalación independiente — se puede activar desde el menú de Scripts o ejecutar el AppImage directamente.",
|
||||
"when": "Cuando un panel web del host resulta útil — móvil, tablet, pestaña del navegador"
|
||||
}
|
||||
],
|
||||
"outro": "Los comandos de instalación detallados y los requisitos están en la <link>página de instalación</link>."
|
||||
},
|
||||
"warnSource": {
|
||||
"title": "Revisa siempre los scripts que ejecutas desde internet",
|
||||
"body": "ProxMenux es de código abierto y cada script se puede revisar en GitHub. Antes de ejecutar el comando de instalación, mira el código fuente. Haz lo mismo con cualquier otra herramienta de automatización.",
|
||||
"sourceLabel": "Ver el código fuente de ProxMenux",
|
||||
"cocLabel": "Código de conducta"
|
||||
},
|
||||
"next": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"lead": "<strong>¿Nuevo en ProxMenux?</strong> ",
|
||||
"linkHref": "/docs/installation",
|
||||
"linkLabel": "Instálalo con un solo comando",
|
||||
"tailRich": " y ejecuta <code>menu</code>."
|
||||
},
|
||||
{
|
||||
"lead": "<strong>¿Acabas de instalar Proxmox?</strong> Empieza por el ",
|
||||
"linkHref": "/docs/post-install",
|
||||
"linkLabel": "script Post-Install",
|
||||
"tail": "."
|
||||
},
|
||||
{
|
||||
"lead": "<strong>¿Quieres un panel web?</strong> ",
|
||||
"linkHref": "/docs/monitor",
|
||||
"linkLabel": "ProxMenux Monitor",
|
||||
"tail": " cubre lo que muestra, cómo está construido y cómo asegurarlo."
|
||||
},
|
||||
{
|
||||
"lead": "<strong>¿Buscas un comando concreto?</strong> ",
|
||||
"linkHref": "/docs/help-info",
|
||||
"linkLabel": "Referencia de comandos",
|
||||
"tail": " es un catálogo curado organizado por tema, con botones de copia."
|
||||
},
|
||||
{
|
||||
"lead": "<strong>¿Quieres guías más largas paso a paso?</strong> La ",
|
||||
"linkHref": "/guides",
|
||||
"linkLabel": "sección de Guías",
|
||||
"tail": " cubre Coral TPU, passthrough de NVIDIA, Kodi en LXC y más."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,396 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Autenticación del panel de Proxmox — 2FA, API Tokens, perfil de usuario, reverse proxy | ProxMenux Monitor",
|
||||
"description": "Acceder y asegurar ProxMenux Monitor: flujo de proteger-tu-panel en el primer arranque, autenticación con contraseña con nombre visible + avatar, página de perfil, alta de TOTP 2FA, API tokens de larga duración para scripts, configuración HTTPS, snippets de reverse proxy para Nginx, Caddy y Traefik, el log de auditoría y el jail Fail2Ban opcional.",
|
||||
"ogTitle": "Autenticación del panel de Proxmox — 2FA, API Tokens, reverse proxy",
|
||||
"ogDescription": "Asegura ProxMenux Monitor con contraseña + TOTP 2FA, API tokens de larga duración, HTTPS, snippets de reverse proxy y un jail Fail2Ban opcional.",
|
||||
"twitterTitle": "Autenticación del panel de Proxmox | ProxMenux Monitor",
|
||||
"twitterDescription": "Contraseña + TOTP 2FA, API tokens, HTTPS, snippets de Nginx/Caddy/Traefik y log de auditoría."
|
||||
},
|
||||
"header": {
|
||||
"title": "Acceso y autenticación",
|
||||
"description": "Cómo llegar al panel, el flujo de seguridad de primer arranque y cada capa que puede situarse entre un atacante y el host: contraseña + TOTP, sesiones JWT, API tokens de larga duración, HTTPS, reverse proxies, Secure Gateway y el jail Fail2Ban opcional.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "La autenticación es opt-in",
|
||||
"body": "En el primer arranque el panel muestra un único diálogo — <em>\"¿Proteger tu panel?\"</em> — con dos botones: <strong>Sí, configurar contraseña</strong> y <strong>No, continuar sin protección</strong>. Decir que no deja todos los endpoints de la API abiertos en el puerto TCP 8008 — aceptable en una LAN de laboratorio aislada, peligroso en cualquier otro escenario. La autenticación de dos factores (2FA) <strong>no</strong> forma parte de esta elección inicial; se configura más tarde desde <strong>la pestaña Security</strong> una vez que hay una contraseña."
|
||||
},
|
||||
"reaching": {
|
||||
"heading": "Cómo llegar al panel",
|
||||
"intro": "ProxMenux Monitor escucha en <code>0.0.0.0:8008</code>. Hay tres formas habituales de llegar a él:",
|
||||
"outro": "El acceso directo coincide con lo que la unidad systemd trae por defecto. Las secciones de reverse proxy y Secure Gateway a continuación cubren las otras dos. El Monitor respeta <code>X-Forwarded-For</code>, <code>X-Forwarded-Proto</code> y <code>X-Forwarded-Host</code> para que las URLs y CORS funcionen detrás de cualquiera de ellos sin configuración manual."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Flujo de primer arranque",
|
||||
"intro": "La primera vez que abres el panel, el frontend llama a <code>GET /api/auth/status</code>. Si la configuración de auth nunca se ha escrito (<code>configured: false</code>), aparece un único diálogo titulado <em>\"¿Proteger tu panel?\"</em> con dos opciones:",
|
||||
"imageAlt": "Diálogo de primer arranque '¿Proteger tu panel?' con dos botones: Sí configurar contraseña, No continuar sin protección",
|
||||
"imageCaption": "El selector de autenticación del primer arranque. Dos botones — protección con contraseña o saltar. Se vuelve a mostrar tras una instalación recién hecha o tras \"Desactivar autenticación\" desde Settings.",
|
||||
"headerButton": "Botón",
|
||||
"headerWhat": "Qué pasa",
|
||||
"headerApi": "Llamada a la API",
|
||||
"rows": [
|
||||
{
|
||||
"button": "Sí, configurar contraseña",
|
||||
"what": "Abre un formulario con el usuario + contraseña obligatorios y un <em>nombre visible</em> + <em>imagen de avatar</em> opcionales. Los guarda en <code>auth.json</code> con <code>enabled: true</code>. Devuelve un JWT así que quedas logueado inmediatamente. El formulario se documenta en detalle más abajo.",
|
||||
"api": "POST /api/auth/setup"
|
||||
},
|
||||
{
|
||||
"button": "No, continuar sin protección",
|
||||
"what": "Marca <code>declined: true</code> en <code>auth.json</code>. Todos los endpoints de la API son accesibles públicamente hasta que cambies de idea desde Settings.",
|
||||
"api": "POST /api/auth/skip"
|
||||
}
|
||||
],
|
||||
"twofaCalloutTitle": "El 2FA se configura después, no aquí",
|
||||
"twofaCalloutBody": "El diálogo de primer arranque solo cubre la decisión de la contraseña. La <strong>autenticación de dos factores (TOTP)</strong> se configura después desde <strong>la pestaña Security</strong> una vez logueado con una contraseña. El walkthrough completo de TOTP está más abajo en esta página.",
|
||||
"createTitle": "Crear el primer usuario",
|
||||
"createIntro": "Pulsar <em>Sí, configurar contraseña</em> abre un único formulario que crea la cuenta y, opcionalmente, siembra el perfil del usuario de una sola vez para que el avatar aparezca en la cabecera nada más guardar. Los campos son:",
|
||||
"headerField": "Campo",
|
||||
"headerRequired": "Requerido",
|
||||
"headerNotes": "Notas",
|
||||
"fieldRows": [
|
||||
{
|
||||
"field": "Username",
|
||||
"required": "Sí",
|
||||
"notes": "El identificador de login. No se puede cambiar después desde la UI; editarlo requiere tocar <code>auth.json</code> directamente."
|
||||
},
|
||||
{
|
||||
"field": "Contraseña",
|
||||
"required": "Sí",
|
||||
"notes": "Mínimo 10 caracteres, con al menos 3 de las 4 categorías (minúscula, mayúscula, dígito, símbolo). Una lista corta de contraseñas obvias (<code>password</code>, <code>12345678</code>, <code>proxmenux</code>…) se rechaza directamente. Las mismas reglas se aplican en el lado del servidor, así que una llamada curl no puede saltarse la comprobación del frontend."
|
||||
},
|
||||
{
|
||||
"field": "Nombre visible",
|
||||
"required": "No",
|
||||
"notes": "Etiqueta amistosa que se muestra en el dropdown de la cabecera y en la página de perfil. Cae al username cuando está vacío. Se puede cambiar después desde <strong>Avatar → Ver perfil</strong>."
|
||||
},
|
||||
{
|
||||
"field": "Imagen de avatar",
|
||||
"required": "No",
|
||||
"notes": "PNG, JPEG, WebP o GIF de hasta 2 MB. Renderizado como un círculo en la cabecera y en la página de perfil. Cuando está vacío, la cabecera muestra la primera letra del nombre visible (o del username) sobre un círculo coloreado. Se puede subir, reemplazar o eliminar después desde la página de perfil."
|
||||
}
|
||||
],
|
||||
"createImageAlt": "Formulario de creación de usuario con campos obligatorios Username + Contraseña y la sección opcional Nombre visible + subida de Avatar",
|
||||
"createImageCaption": "El formulario de creación de usuario del primer arranque. El nombre visible y el avatar son opcionales — dejarlos vacíos crea la cuenta y cae a un círculo con una sola letra en la cabecera.",
|
||||
"saveCalloutTitle": "Un único guardado, tres llamadas a la API por dentro",
|
||||
"saveCalloutBody": "El formulario envía primero <code>POST /api/auth/setup</code> (username + contraseña). Si tiene éxito usa el JWT recién emitido para hacer a continuación <code>PUT /api/auth/profile</code> (nombre visible) y <code>POST /api/auth/profile/avatar</code> (bytes del avatar) si esos campos se rellenaron. Los fallos en las llamadas de perfil no son fatales — la cuenta ya está creada y puedes terminar el perfil después desde la página dedicada.",
|
||||
"avatarTitle": "Menú del avatar y página de perfil",
|
||||
"avatarBody1": "Una vez configurada la autenticación, aparece un círculo de avatar en la parte superior derecha de cada página del panel junto al toggle de tema. Pulsarlo abre un pequeño dropdown con accesos directos a la página de perfil y a la pestaña Security, además de una acción <strong>Sign out</strong> — cerrar la sesión se puede hacer desde aquí o desde la pestaña Security, lo que esté más cerca de donde te encuentres.",
|
||||
"avatarBody2": "La página de perfil en sí es una pequeña tarjeta con una vista previa del avatar, el username (solo lectura) y el nombre visible con un botón de edición en línea. Las subidas, reemplazos y eliminaciones de avatar son atómicas — el avatar de la cabecera se refresca automáticamente cuando cualquiera tiene éxito, así que no hay necesidad de recargar la página. El mismo conjunto de endpoints documentado en la siguiente sección lo usan tanto el formulario de creación de usuario como la página de perfil.",
|
||||
"profileImageAlt": "Página de perfil con círculo de vista previa del avatar, botones Subir / Reemplazar / Eliminar, username de solo lectura y campo de nombre visible editable",
|
||||
"profileImageCaption": "La página de perfil dedicada. El username es solo lectura; el nombre visible y el avatar se pueden editar desde aquí sin tocar la pestaña Security.",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerEpWhat": "Qué hace",
|
||||
"endpointRows": [
|
||||
{
|
||||
"endpoint": "GET /api/auth/profile",
|
||||
"what": "Devuelve el username actual, el nombre visible y si hay un avatar configurado (<code>has_avatar</code>, <code>avatar_mtime</code>)."
|
||||
},
|
||||
{
|
||||
"endpoint": "PUT /api/auth/profile",
|
||||
"what": "Actualiza el nombre visible. Body: <code>'{' \"display_name\": \"...\" '}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "GET /api/auth/profile/avatar",
|
||||
"what": "Devuelve los bytes del avatar (PNG / JPEG / WebP / GIF) con el content type adecuado. Requiere la cabecera Bearer — el frontend lo descarga como blob y lo convierte en una URL de objeto local para renderizar."
|
||||
},
|
||||
{
|
||||
"endpoint": "POST /api/auth/profile/avatar",
|
||||
"what": "Sube un avatar nuevo (máx 2 MB). El content type debe coincidir con el archivo. El avatar antiguo se reemplaza atómicamente."
|
||||
},
|
||||
{
|
||||
"endpoint": "DELETE /api/auth/profile/avatar",
|
||||
"what": "Elimina el avatar. La cabecera cae al placeholder de inicial-sobre-círculo-coloreado."
|
||||
}
|
||||
],
|
||||
"reversibleTitle": "Continuar sin protección es reversible — pero solo desde el host",
|
||||
"reversibleBody": "Una vez que pulsas <em>No, continuar sin protección</em>, el diálogo de bienvenida ya no vuelve a aparecer. Puedes reactivar la autenticación desde <strong>la pestaña Security</strong> dentro del panel, o editando <code>/root/.config/proxmenux-monitor/auth.json</code> y quitando el flag <code>declined</code>, luego reiniciando el servicio."
|
||||
},
|
||||
"password": {
|
||||
"heading": "Autenticación con contraseña",
|
||||
"intro": "Tras Setup, cada llamada a la API (excepto los pocos endpoints públicos listados abajo) requiere un JWT en <code>Authorization: Bearer <token></code>:",
|
||||
"items": [
|
||||
"<strong>Token de sesión (login):</strong> expiración de 24 horas. Emitido por <code>POST /api/auth/login</code>.",
|
||||
"<strong>API token (integraciones):</strong> expiración de 365 días. Emitido por <code>POST /api/auth/generate-api-token</code>. Documentado por separado en la siguiente sección."
|
||||
],
|
||||
"loginImageAlt": "Pantalla de login mostrada tras configurar la autenticación — campos de usuario y contraseña",
|
||||
"loginImageCaption": "Una vez configurada la autenticación, cada visita al panel empieza aquí. Con 2FA activado, la pantalla pide el código de 6 dígitos en un segundo paso tras aceptar la contraseña.",
|
||||
"loginFlowTitle": "Flujo de login",
|
||||
"twofaIntro": "Con 2FA activado, la misma llamada devuelve primero <code>requires_totp: true</code>. Reemite con el código de 6 dígitos:",
|
||||
"publicTitle": "Endpoints públicos (sin token)",
|
||||
"publicIntro": "Estos son los únicos endpoints que funcionan sin autenticación, incluso cuando auth está activado:",
|
||||
"publicItems": [
|
||||
"<code>/api/auth/login</code>, <code>/api/auth/status</code>, <code>/api/auth/setup</code> — el propio flujo de auth, por necesidad.",
|
||||
"<code>/api/system-info</code> — snapshot ligero del sistema (hostname, uptime, <code>health.status</code>). El endpoint adecuado para probes externos (Uptime Kuma, health checks de balanceador, páginas de estado)."
|
||||
],
|
||||
"cryptoTitle": "Criptografía y almacenamiento",
|
||||
"cryptoIntro": "ProxMenux Monitor es código abierto — nada de esto es secreto. Documentar el stack aquí de forma explícita es una decisión deliberada: los operadores que guardan credenciales en su host merecen saber cómo se protegen esas credenciales antes de decidir confiar en ellas. Los algoritmos de abajo son los mismos que usa el código en <code>scripts/auth_manager.py</code>; esta sección es un contrato, no una promesa de marketing.",
|
||||
"headerAsset": "Activo",
|
||||
"headerAlgo": "Algoritmo",
|
||||
"headerWhere": "Dónde vive",
|
||||
"cryptoRows": [
|
||||
{
|
||||
"asset": "Contraseña",
|
||||
"algorithm": "PBKDF2-HMAC-SHA256 con un salt aleatorio por contraseña y un alto número de iteraciones (línea base OWASP 2023+). Guardada como <code>pbkdf2_sha256$<iters>$<salt>$<hash></code>.",
|
||||
"where": "<code>auth.json</code> → <code>password_hash</code>"
|
||||
},
|
||||
{
|
||||
"asset": "JWT de sesión / API",
|
||||
"algorithm": "HS256 firmado con un secret por instalación generado en el primer arranque (<code>secrets.token_urlsafe</code>, ≥48 bytes). Los tokens llevan claims <code>iss=proxmenux-monitor</code> + <code>aud=api</code>; la firma se valida contra el secret actual en cada petición.",
|
||||
"where": "Secret: <code>auth.json</code> → <code>jwt_secret</code>. El JWT en sí: solo en el cliente."
|
||||
},
|
||||
{
|
||||
"asset": "Metadatos de API token",
|
||||
"algorithm": "SHA-256 del JWT guardado junto con una huella <code>signed_with</code> del <code>jwt_secret</code> usado para emitirlo — usado para mostrar el token en la UI y para detectar tokens cuyo secret de firma se ha rotado.",
|
||||
"where": "<code>auth.json</code> → <code>api_tokens[]</code>"
|
||||
},
|
||||
{
|
||||
"asset": "Secret TOTP de 2FA",
|
||||
"algorithm": "TOTP estándar (RFC 6238) codificado en base32. Los códigos de backup se pregeneran, son de un solo uso, hasheados con el mismo esquema PBKDF2 que la contraseña.",
|
||||
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
|
||||
},
|
||||
{
|
||||
"asset": "Revocaciones",
|
||||
"algorithm": "Cuando un token o sesión se revoca, su SHA-256 se añade a una deny-list comprobada en cada verificación (en memoria caché ~30 s para evitar lecturas de disco en la ruta caliente).",
|
||||
"where": "<code>auth.json</code> → <code>revoked_tokens[]</code>"
|
||||
}
|
||||
],
|
||||
"authJsonTitle": "auth.json — qué contiene y cómo se protege",
|
||||
"authJsonBody": "Todo lo que ProxMenux Monitor necesita para autenticarte vive en un único archivo: <code>/root/.config/proxmenux-monitor/auth.json</code>, modo <code>0600</code>, propietario <code>root</code>. El archivo guarda <em>hashes</em> (PBKDF2) y <em>material de firma</em> (<code>jwt_secret</code>, <code>totp_secret</code>) — nunca una contraseña en texto plano. Trátalo como cualquier otro secreto de solo-root: si haces backup o replicas el host, cifra el destino y nunca lo subas a control de versiones.",
|
||||
"rotateTitle": "Rotar jwt_secret invalida todos los JWTs existentes",
|
||||
"rotateBody": "Si <code>auth.json</code> se regenera (borrado manual, reinstalación, restauración desde un backup con un secret distinto) el <code>jwt_secret</code> cambia y cada JWT previamente emitido — tanto sesiones interactivas como API tokens de larga duración — falla la verificación con \"Invalid or expired token\". La UI marca los API tokens afectados con un badge <strong>Invalid — regenerate</strong> para que el operador sepa que tiene que revocarlos y volver a emitirlos; Home Assistant / scripts / cualquier cliente externo necesita un token fresco después de eso.",
|
||||
"recoverTitle": "Recuperar una contraseña perdida",
|
||||
"recoverIntro": "No hay un flujo online de \"olvidé mi contraseña\" — por diseño, ya que el panel corre en el propio host del operador y el camino de recuperación es acceso shell a ese host. ProxMenux trae un reset guiado dentro del menú de configuración para que no tengas que editar a mano <code>auth.json</code>:",
|
||||
"survivesTitle": "Qué sobrevive al reset",
|
||||
"survivesBody": "Solo el login interactivo se borra. El <code>jwt_secret</code> y los <code>api_tokens</code> registrados se preservan — así que Home Assistant y cualquier otro script que use un API token de larga duración siguen funcionando sin reconfiguración. Si quieres una pizarra totalmente limpia (también rotar el secret JWT), borra <code>auth.json</code> manualmente y reinicia el servicio. El siguiente arranque genera un secret fresco y todos los tokens viejos se vuelven inválidos.",
|
||||
"physicalTitle": "Prerrequisito de acceso físico",
|
||||
"physicalBody": "Esta ruta de reset necesita <strong>shell root en el host</strong>. Esa es el ancla de confianza de todo el esquema de autenticación: cualquiera que pueda ejecutar <code>menu</code> como root ya puede hacer cualquier cosa en la máquina, así que darle reset de contraseña no es un aumento de privilegios. El corolario: si dejas que un usuario no confiable llegue a la shell de Proxmox, el login del Monitor no protegerá nada que ese usuario no pueda ya destruir por otros medios."
|
||||
},
|
||||
"twofa": {
|
||||
"heading": "Autenticación de dos factores (TOTP)",
|
||||
"intro": "El 2FA añade un segundo factor encima de tu contraseña: un código de 6 dígitos que rota cada 30 segundos, generado en un móvil o gestor de contraseñas que controlas. Aunque alguien obtenga la contraseña, sigue sin poder entrar sin el código de tu dispositivo. ProxMenux Monitor implementa el protocolo estándar <strong>TOTP</strong> (RFC 6238), así que cualquier app autenticadora funciona.",
|
||||
"pickTitle": "Elige una app autenticadora",
|
||||
"pickIntro": "Si ya usas una para Google / GitHub / tu banco, esa funcionará — salta al walkthrough de setup. Si no, aquí tienes un repaso de opciones habituales. Todas son gratis; las diferencias son sobre todo en qué plataformas corren y cómo (o si) hacen backup de tus secrets.",
|
||||
"headerApp": "App",
|
||||
"headerPlatforms": "Plataformas",
|
||||
"headerAppNotes": "Notas",
|
||||
"apps": [
|
||||
{
|
||||
"name": "Google Authenticator",
|
||||
"href": "https://safety.google/authentication/",
|
||||
"platforms": "iOS, Android",
|
||||
"notes": "El predeterminado para muchos usuarios. Backup opcional a la cuenta de Google."
|
||||
},
|
||||
{
|
||||
"name": "Microsoft Authenticator",
|
||||
"href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app",
|
||||
"platforms": "iOS, Android",
|
||||
"notes": "Backup a la cuenta Microsoft. También maneja notificaciones push de MS si las usas en el trabajo."
|
||||
},
|
||||
{
|
||||
"name": "Authy",
|
||||
"href": "https://authy.com/",
|
||||
"platforms": "iOS, Android, escritorio",
|
||||
"notes": "Sync cifrado multi-dispositivo (la app de escritorio se está retirando — comprueba el estado más reciente)."
|
||||
},
|
||||
{
|
||||
"name": "Apple Passwords",
|
||||
"href": "https://support.apple.com/guide/passwords/welcome/mac",
|
||||
"platforms": "iOS, iPadOS, macOS, visionOS, Windows (vía iCloud)",
|
||||
"notes": "Integrada en los SO de Apple; app Passwords independiente desde iOS 18 / macOS Sequoia. Guarda el TOTP junto a la contraseña y sincroniza entre dispositivos vía iCloud Keychain."
|
||||
},
|
||||
{
|
||||
"name": "Bitwarden",
|
||||
"href": "https://bitwarden.com/",
|
||||
"platforms": "iOS, Android, escritorio, navegador",
|
||||
"notes": "Código abierto. El TOTP vive junto a la contraseña que protege (cómodo si también usas BW para contraseñas; rompe el \"dispositivo separado\" si no)."
|
||||
},
|
||||
{
|
||||
"name": "1Password",
|
||||
"href": "https://1password.com/",
|
||||
"platforms": "iOS, Android, escritorio, navegador",
|
||||
"notes": "Misma idea que Bitwarden — TOTP integrado con la bóveda de contraseñas. Por suscripción."
|
||||
},
|
||||
{
|
||||
"name": "Aegis Authenticator",
|
||||
"href": "https://getaegis.app/",
|
||||
"platforms": "Android",
|
||||
"notes": "Código abierto. Archivo de backup cifrado en dispositivo que tú controlas. Sin nube, sin cuenta requerida."
|
||||
},
|
||||
{
|
||||
"name": "Raivo OTP",
|
||||
"href": "https://raivo-otp.com/",
|
||||
"platforms": "iOS, macOS",
|
||||
"notes": "Código abierto. Sync opcional a iCloud. La contraparte del ecosistema Apple a Aegis."
|
||||
},
|
||||
{
|
||||
"name": "Ente Auth",
|
||||
"href": "https://ente.io/auth/",
|
||||
"platforms": "iOS, Android, escritorio, web",
|
||||
"notes": "Código abierto. Sync en la nube cifrado de extremo a extremo entre dispositivos."
|
||||
},
|
||||
{
|
||||
"name": "2FAS",
|
||||
"href": "https://2fas.com/",
|
||||
"platforms": "iOS, Android, extensión de navegador",
|
||||
"notes": "Código abierto. Backup en la nube cifrado opcional; la extensión de navegador puede autocompletar códigos."
|
||||
},
|
||||
{
|
||||
"name": "FreeOTP+",
|
||||
"href": "https://github.com/helloworld1/FreeOTPPlus",
|
||||
"platforms": "Android, iOS",
|
||||
"notes": "Código abierto (impulsado por Red Hat). Mínimo — sin nube, sin cuenta."
|
||||
}
|
||||
],
|
||||
"backupTitle": "Para qué importa realmente el \"backup\"",
|
||||
"backupBody": "Si pierdes el dispositivo que tiene el autenticador, las únicas formas de volver a entrar son (1) un código de backup guardado cuando activaste el 2FA, o (2) un backup de la bóveda del autenticador. Las apps con sync en la nube (Google Auth, Microsoft Auth, Authy, Apple Passwords, Ente, 2FAS, Bitwarden, 1Password) pueden restaurar en un dispositivo nuevo. Las apps sin nube (Aegis, Raivo, FreeOTP+) necesitan un archivo de exportación cifrado que hayas copiado a un sitio seguro. Cualquier enfoque funciona — el caso malo es \"sin backup en absoluto\".",
|
||||
"setupTitle": "Configuración paso a paso desde el panel",
|
||||
"setupImageAlt": "Pantalla de configuración de 2FA con código QR y códigos de backup",
|
||||
"setupImageCaption": "El diálogo de configuración de 2FA — código QR, secret en Base32 (para entrada manual) y los diez códigos de backup de un solo uso. Los códigos solo se muestran aquí; si cierras el diálogo sin copiarlos, se pierden.",
|
||||
"setupSteps": [
|
||||
"<strong>Instala la app autenticadora en tu móvil</strong> (o abre tu gestor de contraseñas). Una de las apps de la tabla de arriba. Solo necesitas hacerlo una vez — la misma app guardará códigos para cada servicio que protejas.",
|
||||
"<strong>Loguéate en el panel</strong> con tu usuario y contraseña.",
|
||||
"<strong>Abre la pestaña Security</strong> en la barra lateral del panel, luego pulsa <strong>Enable 2FA</strong>. Se abre un diálogo con un código QR, una cadena larga en formato Base32 y diez códigos cortos etiquetados como \"códigos de backup\".",
|
||||
"<strong>Añade la entrada a la app autenticadora:</strong>",
|
||||
"<strong>Guarda los códigos de backup.</strong> Copia los diez códigos a un sitio seguro — un gestor de contraseñas, una nota cifrada, una copia impresa en un cajón. Trátalos como llaves de repuesto: cada uno funciona exactamente una vez y te deja entrar si tu móvil se pierde o rompe.",
|
||||
"<strong>Confirma escribiendo el código actual de 6 dígitos</strong> de la app en el campo \"Código de verificación\" del diálogo de setup y envía. Los códigos se refrescan cada 30 segundos, así que si caduca mientras escribes, simplemente introduce el siguiente.",
|
||||
"<strong>Hecho.</strong> El 2FA está ahora activo. La próxima vez que te logues, el panel pide primero la contraseña; una vez aceptada pide el código actual de 6 dígitos."
|
||||
],
|
||||
"setupStep4Sub": [
|
||||
"<em>Camino fácil:</em> en la app, pulsa <em>Añadir cuenta</em> → <em>Escanear código QR</em>, apunta la cámara al QR en la pantalla. La app nombra la entrada automáticamente (algo como <code>ProxMenux Monitor (tu-usuario)</code>) y empieza a mostrar un código de 6 dígitos que se refresca cada 30 segundos.",
|
||||
"<em>Plan B manual</em> (cuando escanear no es posible — p. ej. configurando en el mismo móvil con el que abriste el panel): pulsa <em>Añadir cuenta</em> → <em>Introducir clave de setup</em>. Escribe cualquier nombre (p. ej. <em>Proxmox Monitor</em>), pega la cadena Base32 del diálogo, deja <em>Tipo</em> como <em>Basado en tiempo</em>, guarda."
|
||||
],
|
||||
"testTitle": "Prueba antes de hacer logout",
|
||||
"testBody": "Una vez que pulses Guardar, haz logout y vuelve a entrar <em>inmediatamente</em>, mientras el diálogo de setup esté todavía fresco en tu memoria. Si el código se rechaza (la causa más común es el desfase de reloj entre servidor y móvil), aún puedes arreglarlo desde la sesión abierta. Hacer logout sin probar primero significa un viaje de ida sin retorno — en ese punto solo un código de backup o editar <code>auth.json</code> en el host te deja volver a entrar.",
|
||||
"lostTitle": "Autenticador perdido",
|
||||
"lostIntro": "Tres salidas de emergencia, en orden de cuán disruptivas son:",
|
||||
"lostItems": [
|
||||
"<strong>Usa un código de backup.</strong> En la pantalla de login, en el campo TOTP, escribe uno de los diez códigos que guardaste durante el setup. Cada uno funciona una vez y luego se consume; los códigos restantes siguen funcionando. Una vez dentro, regenera el 2FA desde Settings para conseguir diez nuevos.",
|
||||
"<strong>Restaura el autenticador desde la nube / backup.</strong> Si tu app tiene sync en la nube (Google, Microsoft, Authy, Apple Passwords vía iCloud Keychain, Ente, 2FAS) instálala en un dispositivo nuevo, loguéate y las entradas reaparecen. Si tu app usa un archivo de exportación cifrado (Aegis, Raivo, FreeOTP+), instala la app en el dispositivo nuevo e importa el archivo.",
|
||||
"<strong>Desactiva el 2FA desde la shell del host.</strong> Cuando las opciones anteriores no están disponibles, edita <code>/root/.config/proxmenux-monitor/auth.json</code> en el host Proxmox (necesitas SSH root o acceso por consola), pon <code>totp_enabled</code> a <code>false</code>, guarda y reinicia el servicio:"
|
||||
],
|
||||
"lostShellOutro": "Puedes loguearte con usuario + contraseña solo, luego reactivar el 2FA desde Settings.",
|
||||
"disableTitle": "Desactivar el 2FA",
|
||||
"disableBody": "Desde el panel, abre la pestaña <strong>Security</strong> y pulsa <strong>Disable 2FA</strong>. El endpoint <code>POST /api/auth/totp/disable</code> requiere la contraseña actual como confirmación, luego elimina el secret TOTP y limpia los códigos de backup. Recuerda también quitar la entrada en la app autenticadora — la app no sabe que el lado del servidor ha desaparecido, así que la entrada muerta se quedaría ahí para siempre si no.",
|
||||
"rejectedTitle": "El código de 6 dígitos se rechaza siempre",
|
||||
"rejectedIntro": "El TOTP está basado en tiempo — el reloj del servidor y el del móvil deben coincidir dentro de unos ~30 s. Dos comprobaciones:",
|
||||
"rejectedItems": [
|
||||
"<strong>Móvil:</strong> Ajustes → Fecha y hora → sync automático / de red ACTIVADO.",
|
||||
"<strong>Host Proxmox:</strong> <code>timedatectl status</code> — \"System clock synchronized: yes\" debería aparecer. Si no, <code>timedatectl set-ntp true</code> y espera un minuto."
|
||||
],
|
||||
"rejectedOutro": "Una vez que ambos relojes coinciden, el código se acepta dentro de la siguiente ventana de 30 segundos."
|
||||
},
|
||||
"apiTokens": {
|
||||
"heading": "API tokens (larga duración)",
|
||||
"intro": "Las sesiones de navegador caducan tras 24 horas. Para integraciones desatendidas (widgets de Homepage, sensores de Home Assistant, scrapers de Grafana, probes de Uptime Kuma…) generas un <strong>API token</strong> aparte que vive 365 días. El token es un JWT firmado con el mismo secret que el token de sesión, pero su claim <code>token_name</code> facilita rastrearlo y revocarlo individualmente.",
|
||||
"imageAlt": "Panel de API tokens mostrando la lista de tokens con nombre, prefijo, fecha de creación y caducidad",
|
||||
"imageCaption": "La lista de API tokens bajo Settings — nombre, prefijo (se muestran los últimos 4 caracteres para identificación), fechas de creación y caducidad, acción de revocar.",
|
||||
"generateTitle": "Generar un token",
|
||||
"generateIntro": "Desde el panel:",
|
||||
"generateSteps": [
|
||||
"Navega a la sección <strong>pestaña Security → API Access Tokens</strong>.",
|
||||
"Escribe un nombre descriptivo (<em>p. ej. \"Home Assistant\"</em>).",
|
||||
"Vuelve a introducir tu contraseña. Si el 2FA está activado, también el código actual de 6 dígitos.",
|
||||
"Pulsa <strong>Generate Token</strong>. El token aparece <strong>una vez</strong> — cópialo inmediatamente."
|
||||
],
|
||||
"generateCli": "Desde la línea de comandos:",
|
||||
"useTitle": "Usar un token",
|
||||
"revokeTitle": "Revocar un token",
|
||||
"revokeBody": "Desde el panel de arriba: cada fila tiene una acción <strong>Revoke</strong> que añade el hash del token a <code>revoked_tokens</code> en <code>auth.json</code>. Los tokens revocados fallan la validación inmediatamente en la siguiente petición.",
|
||||
"cheatTitle": "Chuleta de seguridad de tokens",
|
||||
"cheatItems": [
|
||||
"Guarda los tokens en el almacén de secrets nativo de tu integración — Homepage <code>secrets.yaml</code>, Home Assistant <code>!secret</code>, variables de entorno, etc. Nunca los subas a git.",
|
||||
"Un token por integración, nombrado por el consumidor. Revoca individualmente al retirar una integración.",
|
||||
"Rota cada 6-12 meses. La expiración es un límite duro, no una recomendación."
|
||||
],
|
||||
"outro": "Las mejores prácticas completas de almacenamiento y recetas de integración viven en <apiLink>API Reference → Token Management</apiLink> e <intLink>Integrations</intLink>."
|
||||
},
|
||||
"https": {
|
||||
"heading": "HTTPS",
|
||||
"intro": "Dos rutas hacia TLS:",
|
||||
"items": [
|
||||
"<strong>Reverse proxy (recomendado).</strong> Termina TLS en Nginx / Caddy / Traefik y reenvía HTTP en el puerto 8008 al proceso Flask. Snippets más abajo.",
|
||||
"<strong>HTTPS directo en el AppImage.</strong> Configura un certificado vía <code>POST /api/ssl/configure</code> (UI: <strong>Settings → SSL</strong>). Cuando SSL está configurado el proceso cambia del servidor dev de Flask a <code>gevent.pywsgi</code> con el handler gevent-websocket para que el terminal WebSocket también funcione sobre WSS. Los archivos del cert viven donde tú los pongas; las rutas se guardan en la configuración SSL."
|
||||
],
|
||||
"calloutTitle": "Limitaciones del HTTPS directo",
|
||||
"calloutBody": "La ruta gevent empaquetada es adecuada para certificados autofirmados o solo-LAN. Para Let's Encrypt / ACME y renovación automática, pon un reverse proxy real delante — Caddy autorrenueva y Traefik / Nginx tienen patrones bien conocidos. El Monitor no implementa ACME por sí mismo."
|
||||
},
|
||||
"gateway": {
|
||||
"heading": "Secure Gateway (Tailscale)",
|
||||
"intro": "Los reverse proxies son la respuesta clásica a \"llegar al panel desde fuera\" pero requieren un dominio público, certificado y un puerto abierto en el borde. <strong>Secure Gateway</strong> es la alternativa cero-puertos que viene dentro del propio Monitor — una app desplegable preconstruida que levanta un LXC Alpine ejecutando <a>Tailscale</a> como subnet router. Una vez unido a tu tailnet, cada dispositivo en él puede llegar al Monitor en la propia IP LAN del host — desde un portátil de vacaciones, un móvil con 5G u otro nodo — sin exponer TCP 8008 a internet.",
|
||||
"calloutTitle": "Por qué esto es cómodo",
|
||||
"calloutBody": "La URL se mantiene igual que en la LAN — <code>http://<ip-lan-proxmox>:8008</code> funciona donde Tailscale funcione. Sin certificados, sin DNS, sin port forwarding. El propio Monitor ve la petición viniendo de una IP de tailnet (típicamente <code>100.x.y.z</code>), así que el log de auth y el hook de Fail2Ban siguen funcionando como en la LAN.",
|
||||
"deployBody": "El flujo de despliegue es una sola pantalla — elige el storage LXC del host, pega un auth-key de Tailscale (generado en <a>login.tailscale.com/admin/settings/keys</a>), elige qué subnets anunciar, pulsa Deploy. El LXC tarda ~30 segundos en arrancar y se registra en el tailnet automáticamente.",
|
||||
"outro": "El despliegue paso a paso, la configuración de subnet-routes, las ACLs de Tailscale y el modo Exit Node se documentan por separado en <link>Dashboard → Security → Secure Gateway</link> — ahí vive el wizard de despliegue en la UI del panel. Esta página solo cubre el patrón de acceso."
|
||||
},
|
||||
"proxy": {
|
||||
"heading": "Snippets de reverse proxy",
|
||||
"intro": "La distribución más simple es un <strong>nombre de host dedicado</strong> para el Monitor (p. ej. <code>monitor.example.com</code>) apuntando al puerto 8008 del host Proxmox. Los snippets de abajo usan ese patrón. Los montajes en sub-path (<code>example.com/proxmenux-monitor/</code>) son posibles pero requieren reescritura extra y no son el valor por defecto — mira el callout al final.",
|
||||
"nginxTitle": "Nginx",
|
||||
"caddyTitle": "Caddy",
|
||||
"traefikTitle": "Traefik (labels — Docker / Kubernetes)",
|
||||
"subPathTitle": "Avanzado: montajes en sub-path bajo un dominio existente",
|
||||
"subPathBody": "Si no quieres un nombre de host dedicado, puedes montar el Monitor bajo un path de un dominio existente — por ejemplo <code>example.com/proxmenux-monitor/</code>. El build de Next.js usa rutas relativas para los assets así que los archivos estáticos resuelven, pero el proxy debe <strong>quitar el prefijo</strong> antes de reenviar para que el Monitor reciba URLs <code>/api/*</code> sin más. En Nginx eso es un <code>location /proxmenux-monitor/ } proxy_pass http://127.0.0.1:8008/; {</code> (la barra final en <code>proxy_pass</code> hace el strip). En Caddy, usa <code>handle_path /proxmenux-monitor/*</code>. Un nombre de host dedicado es más simple."
|
||||
},
|
||||
"audit": {
|
||||
"heading": "Log de auditoría",
|
||||
"intro": "Cada evento de autenticación (éxito y fallo) se añade a <code>/var/log/proxmenux-auth.log</code> en formato de una sola línea, estilo syslog:",
|
||||
"outro": "Sigue la cola con el método habitual: <code>tail -F /var/log/proxmenux-auth.log</code>. El archivo se rota con <code>logrotate</code> si se añade un drop-in de configuración; el Monitor no lo rota por sí mismo."
|
||||
},
|
||||
"fail2ban": {
|
||||
"heading": "Opcional: jail Fail2Ban",
|
||||
"calloutTitle": "Fail2Ban no viene incluido con el Monitor",
|
||||
"calloutBody": "Fail2Ban <strong>no</strong> lo instala ProxMenux Monitor por sí mismo. Instálalo vía <link>Seguridad → Fail2Ban</link> en el menú de ProxMenux (o con el paquete estándar de Debian). Sin él, el Monitor sigue escribiendo el log de auditoría de arriba — simplemente no banea automáticamente a los repetidores.",
|
||||
"intro": "Cuando Fail2Ban está instalado, la integración de ProxMenux trae un jail <code>[proxmenux]</code> que:",
|
||||
"items": [
|
||||
"Lee <code>/var/log/proxmenux-auth.log</code>.",
|
||||
"Hace match con el patrón <code>authentication failure; rhost=<ip></code> con un filtro dedicado.",
|
||||
"Banea la IP infractora a nivel del firewall del kernel por defecto.",
|
||||
"Se consulta desde el hook <code>before_request</code> de Flask cada 30 s — así que incluso cuando el firewall no puede bloquear (porque la conexión viene del reverse proxy), la aplicación devuelve HTTP 403 a las IPs baneadas según lo que Fail2Ban sabe."
|
||||
],
|
||||
"outro": "La configuración, el ajuste del tiempo de ban y los procedimientos de desbaneo están en <link>Seguridad → Fail2Ban</link>."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noScreenTitle": "La pantalla de primer arranque nunca aparece",
|
||||
"noScreenBody": "O bien auth ya está configurado (<code>configured: true</code>) o bien alguien ya eligió Skip. Para empezar desde cero:",
|
||||
"noScreenOutro": "Esto borra el estado de auth — también cualquier secret TOTP y API tokens. Haz backup de <code>auth.json</code> primero si tienes tokens que quieres conservar.",
|
||||
"tokenTitle": "HTTP 401 en cada petición desde un API token que funcionaba",
|
||||
"tokenBody": "El token caducó (límite de 365 días) o entró en la lista <code>revoked_tokens</code>. Genera uno nuevo en Settings y actualiza la integración. Para comprobar:",
|
||||
"tokenOutro": "Los tokens caducados o revocados devuelven <code>'{'\"error\":\"Invalid or expired token\"'}'</code>.",
|
||||
"no2faTitle": "No puedo loguearme tras activar el 2FA, sin autenticador a mano",
|
||||
"no2faBody": "Usa un código de backup en el campo TOTP. Si ya no quedan, edita <code>/root/.config/proxmenux-monitor/auth.json</code> desde una shell del host, pon <code>totp_enabled</code> a <code>false</code>, reinicia el servicio.",
|
||||
"wsTitle": "El reverse proxy funciona pero la pestaña del terminal se desconecta cada minuto",
|
||||
"wsBody": "Timeout de idle de WebSocket en el proxy. Sube el read timeout (Nginx: <code>proxy_read_timeout 86400s</code>; Traefik: <code>idleTimeout</code> en el entry-point o middleware) y confirma que <code>proxy_set_header Upgrade $http_upgrade</code> y <code>Connection \"upgrade\"</code> están presentes."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "API Reference → Token Management",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — ciclo de vida completo de API tokens (generar / listar / revocar), mejores prácticas de seguridad, patrones de almacenamiento de secrets."
|
||||
},
|
||||
{
|
||||
"label": "Integrations",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma, cURL genérico."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard → Security → Secure Gateway",
|
||||
"href": "/docs/monitor/dashboard/security",
|
||||
"tail": " — despliega el LXC gateway Tailscale paso a paso (subnet routes, ACLs, modo Exit Node)."
|
||||
},
|
||||
{
|
||||
"label": "Seguridad → Fail2Ban",
|
||||
"href": "/docs/security/fail2ban",
|
||||
"tail": " — cómo instalar y configurar el jail opcional."
|
||||
},
|
||||
{
|
||||
"label": "Settings → ProxMenux Monitor",
|
||||
"href": "/docs/settings/proxmenux-monitor",
|
||||
"tail": " — arranca / para el servicio systemd desde la TUI de ProxMenux."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,342 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Asistente de IA de Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor",
|
||||
"description": "El Asistente de IA opcional de ProxMenux Monitor reescribe los cuerpos de las notificaciones de Proxmox VE en lenguaje natural. Seis proveedores soportados: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter y Ollama local. Doce idiomas, tres niveles de detalle por canal, modo de prompt personalizado con una biblioteca comunitaria y una capa de enriquecimiento de contexto que añade uptime, recurrencia y datos SMART a los eventos de disco.",
|
||||
"ogTitle": "Asistente de IA de Proxmox — OpenAI, Claude, Gemini, Groq, Ollama",
|
||||
"ogDescription": "Reescribe las notificaciones de Proxmox VE en lenguaje natural con OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter u Ollama local.",
|
||||
"twitterTitle": "Asistente de IA de Proxmox | ProxMenux Monitor",
|
||||
"twitterDescription": "Reescribe las notificaciones de Proxmox VE en lenguaje natural con OpenAI, Anthropic, Gemini, Groq, OpenRouter u Ollama local."
|
||||
},
|
||||
"header": {
|
||||
"title": "Asistente de IA",
|
||||
"description": "El reescritor opt-in que pasa cada notificación saliente por un LLM antes del fan-out — convirtiendo templates estructuradas en mensajes en lenguaje natural, con niveles de detalle por canal, doce idiomas, un modo de prompt personalizado con una biblioteca comunitaria pública y una capa de enriquecimiento de contexto que añade uptime, recurrencia, datos SMART y coincidencias con errores conocidos al prompt.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Desactivado por defecto, un solo interruptor para activarlo",
|
||||
"body": "La reescritura con IA es opt-in. Hasta que pulses el toggle maestro dentro de <em>Settings → Notifications → Advanced: AI Enhancement</em>, cada evento se despacha con el cuerpo templated original. Cuando el toggle está activado y una llamada al proveedor falla o caduca, el dispatcher cae silenciosamente al cuerpo templated — tus notificaciones nunca se bloquean por el LLM."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Cómo funciona",
|
||||
"intro": "Cada evento que despacha el Monitor pasa por la misma pipeline. El reescritor de IA es una etapa opcional que se sitúa entre el cuerpo templated y el envío del canal. De principio a fin, un solo evento camina por cuatro pasos:",
|
||||
"steps": [
|
||||
"<strong>Evento + template.</strong> Un evento llega desde uno de los seis colectores y se renderiza en un cuerpo estructurado de texto plano por <code>notification_templates.py</code>. Este es el cuerpo que el canal enviaría si la reescritura con IA estuviese desactivada.",
|
||||
"<strong>Enriquecimiento de contexto.</strong> El dispatcher inspecciona el evento y añade condicionalmente las señales extra relevantes — uptime del sistema (solo para fallos críticos del sistema), frecuencia del evento, datos SMART (solo para eventos de disco), coincidencias con la base de datos de errores conocidos y líneas de log del journal.",
|
||||
"<strong>Constructor de prompt.</strong> El system prompt se ensambla a partir del template más los ajustes por canal: idioma destino, nivel de detalle, reglas de emoji de <em>Rich messages</em> y el addon de AI Suggestions si está activado. En modo de prompt personalizado, tu prompt reemplaza el system prompt por completo. El user message se construye a partir del cuerpo templated más los bloques de contexto enriquecidos.",
|
||||
"<strong>Llamada al proveedor.</strong> El proveedor configurado (Groq, OpenAI, Anthropic, Gemini, Ollama u OpenRouter) devuelve un título y cuerpo reescritos. El dispatcher parsea la respuesta, reemplaza el título y cuerpo originales para ese canal y lo entrega al adaptador del canal para su entrega."
|
||||
],
|
||||
"notesIntro": "Tres detalles que merece la pena retener antes de leer el resto de la página:",
|
||||
"notes": [
|
||||
"<strong>La IA no produce eventos.</strong> Cada evento nace de una señal real (escaneo del Monitor de salud, línea del journal, webhook de PVE, etc.) y se renderiza en un cuerpo templated antes de que la IA siquiera lo vea. La IA es una traductora y reformateadora, no una observadora.",
|
||||
"<strong>La IA corre por canal.</strong> Telegram y Discord pueden usar una reescritura breve mientras que Email obtiene un reporte detallado — mismo evento, distinta forma, todo de una sola llamada al proveedor por canal.",
|
||||
"<strong>El fallo es silencioso.</strong> Si el proveedor da un 5xx, caduca, devuelve salida malformada o rechaza la petición, el dispatcher loguea el error y cae al cuerpo templated original para ese canal. Nunca pierdes una notificación porque el LLM haya tenido un mal día."
|
||||
]
|
||||
},
|
||||
"enabling": {
|
||||
"heading": "Activar el panel",
|
||||
"intro": "La configuración de IA vive al final del panel de Notifications dentro de la pestaña Settings, como un bloque colapsable <em>Advanced: AI Enhancement</em>. Pulsa la cabecera para expandirlo:",
|
||||
"collapsedAlt": "Cabecera colapsada de Advanced AI Enhancement con indicador de chevron",
|
||||
"collapsedCaption": "Colapsado por defecto — un clic expande el panel.",
|
||||
"panelAlt": "Panel expandido de AI Enhancement mostrando el toggle maestro AI-Enhanced Messages, Provider Google Gemini, API Key enmascarada, Model gemini-2.5-flash, Prompt Mode Default, Language English, Detail Level por canal para Telegram Discord Gotify Email, toggle AI Suggestions y botón Test Connection",
|
||||
"panelCaption": "El panel completo de AI Enhancement — cada control documentado en esta página corresponde a uno de los campos de arriba.",
|
||||
"outro": "De arriba abajo, el panel expone: el toggle maestro <em>AI-Enhanced Messages</em>, el selector de proveedor con un modal de información a su lado, el input de API key (o URL de Ollama para modo local), el dropdown de modelo (cargado desde el proveedor tras introducir la key), el modo de prompt (<em>Default</em> / <em>Custom</em>), el idioma de salida, el nivel de detalle por canal, el opt-in de <em>AI Suggestions</em> y un botón <em>Test Connection</em> que envía un mensaje de prueba al proveedor para validar las credenciales."
|
||||
},
|
||||
"context": {
|
||||
"heading": "Qué contexto recibe la IA",
|
||||
"intro": "Antes de construir el prompt, el dispatcher recorre una rutina de enriquecimiento de contexto que decide qué señales extra son relevantes para el evento en cuestión. El objetivo es dar al LLM información suficiente para producir un mensaje útil, sin inundarlo (ni tu cartera) con ruido que no aplica. Cinco bloques de contexto pueden añadirse al user message:",
|
||||
"headerBlock": "Bloque",
|
||||
"headerWhen": "Cuándo se inyecta",
|
||||
"headerWhat": "Qué transporta",
|
||||
"rows": [
|
||||
{
|
||||
"block": "Uptime del sistema",
|
||||
"when": "Solo para fallos críticos a nivel de sistema: <code>crash</code>, <code>panic</code>, <code>oom</code>, <code>kernel</code>, <code>split_brain</code>, <code>quorum_lost</code>, <code>node_offline</code>, <code>node_fail</code>, <code>system_fail</code>, <code>boot_fail</code>. Se omite para errores de disco, advertencias y operaciones rutinarias para mantener el prompt ajustado.",
|
||||
"what": "Una línea tipo <code>System uptime: 14 days (stable system)</code>. Permite al LLM distinguir problemas de arranque de fallos de larga duración."
|
||||
},
|
||||
{
|
||||
"block": "Frecuencia del evento",
|
||||
"when": "Siempre, cuando el Monitor ha visto la misma fingerprint antes.",
|
||||
"what": "Contador de ocurrencias, timestamp first-seen, etiqueta opcional de patrón (recurrente / one-off / spike). El LLM lo usa para formular \"problema recurrente\" vs \"primera vez visto\"."
|
||||
},
|
||||
{
|
||||
"block": "Datos SMART",
|
||||
"when": "Solo para eventos relacionados con disco (el tipo de evento contiene <code>disk</code>, <code>smart</code>, <code>storage</code>, <code>io_error</code>, o el cuerpo menciona <code>/dev/sd</code>, <code>ata</code>, <code>i/o error</code>).",
|
||||
"what": "Salida de <code>smartctl</code> para el dispositivo afectado — salud global (PASSED / FAILED) más los atributos relevantes para el modo de fallo."
|
||||
},
|
||||
{
|
||||
"block": "DB de errores conocidos",
|
||||
"when": "Cuando el cuerpo o el contexto del journal coincide con un patrón de error específico de Proxmox que viene con el Monitor.",
|
||||
"what": "Un bloque <code>KNOWN PROXMOX ERROR DETECTED</code> con la causa detectada y una solución concreta. El prompt instruye al LLM a traducir esto literalmente — sin parafrasear la solución recomendada."
|
||||
},
|
||||
{
|
||||
"block": "Logs del journal",
|
||||
"when": "Siempre que el colector que originó el evento capturó líneas del journal (sobre todo el journal watcher y el task watcher).",
|
||||
"what": "Extractos crudos de <code>journalctl</code>. El prompt le dice al LLM que extraiga IDs, timestamps y pistas de root-cause, y que ignore entradas no relacionadas."
|
||||
}
|
||||
],
|
||||
"afterBlocks": "Una vez unidos estos bloques, el user message enviado al LLM tiene esta forma:",
|
||||
"calloutTitle": "Sin telemetría más allá del propio evento",
|
||||
"calloutBody": "El Monitor solo envía lo que tiene a mano para el evento actual — sin telemetría a nivel de sistema, sin series históricas de métricas, sin volcados de inventario. Los cinco bloques de arriba son el techo de lo que sale del host en una sola reescritura con IA."
|
||||
},
|
||||
"tokens": {
|
||||
"heading": "Tokens — qué son y cómo se consumen",
|
||||
"intro1": "Cada proveedor comercial cobra por <em>token</em>, así que merece la pena entender qué es un token antes de elegir un plan. Un token son aproximadamente cuatro caracteres de texto en inglés o unas tres cuartas partes de una palabra. La frase <em>\"Backup completed on storage local-bak\"</em> son unos ocho tokens. Un extracto corto de journal de diez líneas puede ser 200-400 tokens según la densidad técnica.",
|
||||
"intro2": "Se facturan dos cosas en cada llamada:",
|
||||
"items": [
|
||||
"<strong>Tokens de entrada</strong> — el system prompt más el user message (severidad, título, cuerpo, contexto enriquecido). Para ProxMenux el system prompt solo es del orden de 1.5-2 KB (≈ 400-500 tokens) y el user message varía de 50 tokens (un backup-complete limpio) a ~1500 tokens (un error de disco con 30 líneas de contexto del journal).",
|
||||
"<strong>Tokens de salida</strong> — lo que el modelo escribe de vuelta. El Monitor lo limita con <code>max_tokens</code> (mira la tabla de abajo). El límite es un <em>tope</em>, no un cargo: si el modelo produce 250 tokens con un tope de 1500, pagas 250."
|
||||
],
|
||||
"capsIntro": "Estos son los topes reales que aplica el dispatcher, tomados directamente de <code>AI_DETAIL_TOKENS</code> en <code>notification_templates.py</code>:",
|
||||
"headerLevel": "Nivel de detalle",
|
||||
"headerCap": "Tope de salida (tokens)",
|
||||
"headerConsumption": "Consumo real típico",
|
||||
"capRows": [
|
||||
{
|
||||
"level": "brief",
|
||||
"cap": "500",
|
||||
"consumption": "50-200 tokens de salida para eventos cortos."
|
||||
},
|
||||
{
|
||||
"level": "standard",
|
||||
"cap": "1500",
|
||||
"consumption": "200-700 tokens de salida para eventos típicos con contexto ligero."
|
||||
},
|
||||
{
|
||||
"level": "detailed",
|
||||
"cap": "3000",
|
||||
"consumption": "500-2000 tokens de salida para reportes completos de email con logs y tablas SMART."
|
||||
}
|
||||
],
|
||||
"customNote": "El modo de prompt personalizado usa un tope fijo de 500 tokens de salida independientemente del nivel de detalle — el prompt personalizado está bajo tu control y el tope protege contra respuestas descontroladas.",
|
||||
"sizingTitle": "Dimensionamiento práctico",
|
||||
"sizingBody": "Un homelab con 50-100 eventos al día en <code>standard</code> consume típicamente unos pocos miles de tokens al día. Con los niveles gratuitos que ofrecen Groq y Gemini, eso encaja sin tocar un plan de pago. Con OpenAI o Anthropic, facturados por token, el coste se queda en el rango de céntimos al mes para ese volumen. Si tu volumen de eventos es mucho mayor, la sección <link>Nivel de detalle por canal</link> explica cómo mantener los canales de chat en <code>brief</code> dejando que Email lleve el reporte completo."
|
||||
},
|
||||
"providers": {
|
||||
"heading": "Proveedores de IA",
|
||||
"intro": "Seis proveedores están cableados al Monitor. El dropdown de proveedor en la UI los muestra todos; un botón de información al lado abre un modal con una descripción de una línea para cada uno. Abajo está la referencia completa, con la URL para conseguir una API key, la descripción mostrada en la UI y las notas relevantes del codebase.",
|
||||
"imageAlt": "Modal de AI Providers Information listando los seis proveedores soportados — Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter — cada uno con su icono y descripción de una línea, y una nota especial de OpenAI-Compatible APIs para OpenAI",
|
||||
"imageCaption": "El modal in-app — seis tarjetas, una por proveedor, con las mismas descripciones documentadas abajo.",
|
||||
"groq": {
|
||||
"heading": "Groq",
|
||||
"tagline": "Muy rápido, nivel gratuito generoso (30 req/min). Ideal para empezar.",
|
||||
"items": [
|
||||
"API key: <a>console.groq.com/keys</a>",
|
||||
"Modelos verificados: <code>llama-3.3-70b-versatile</code>, <code>llama-3.1-70b-versatile</code>, <code>llama-3.1-8b-instant</code>, <code>llama3-70b-8192</code>, <code>llama3-8b-8192</code>, <code>mixtral-8x7b-32768</code>, <code>gemma2-9b-it</code>.",
|
||||
"Recomendado: <strong><code>llama-3.3-70b-versatile</code></strong> — mejor calidad a la velocidad de inferencia completa de Groq."
|
||||
]
|
||||
},
|
||||
"openai": {
|
||||
"heading": "OpenAI",
|
||||
"tagline": "Estándar de la industria. Muy preciso y ampliamente usado.",
|
||||
"items": [
|
||||
"API key: <a>platform.openai.com/api-keys</a>",
|
||||
"Modelos verificados: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-chat-latest</code>, <code>gpt-5.4-nano</code>, <code>gpt-5.4-mini</code>.",
|
||||
"Recomendado: <strong><code>gpt-4.1-nano</code></strong> — el miembro más barato de la familia chat, calidad suficiente para traducción y reformateo. Los modelos de razonamiento (serie o, gpt-5 non-chat) están soportados por el plumbing del proveedor pero se mantienen fuera de la lista verificada: mayor latencia sin ganancia medible de calidad en esta carga de trabajo."
|
||||
],
|
||||
"baseUrlTitle": "Base URL compatible con OpenAI",
|
||||
"baseUrlBody": "El proveedor OpenAI también acepta una <em>Base URL</em> personalizada, que te permite apuntar el Monitor a cualquier endpoint compatible con OpenAI. Confirmado que funciona con <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong>, <strong>Fireworks AI</strong> y cualquier otro servicio que hable el dialecto OpenAI <code>/v1/chat/completions</code>. Configura la URL en la pestaña OpenAI junto al campo de API key."
|
||||
},
|
||||
"anthropic": {
|
||||
"heading": "Anthropic (Claude)",
|
||||
"tagline": "Excelente para escritura y traducción. Rápido y económico.",
|
||||
"items": [
|
||||
"API key: <a>console.anthropic.com/settings/keys</a>",
|
||||
"Modelos verificados: <code>claude-3-5-haiku-latest</code>, <code>claude-3-5-sonnet-latest</code>, <code>claude-3-opus-latest</code>.",
|
||||
"Recomendado: <strong><code>claude-3-5-haiku-latest</code></strong> — el modelo más pequeño y rápido de Claude, con calidad lingüística fuerte para la carga de traducción."
|
||||
]
|
||||
},
|
||||
"gemini": {
|
||||
"heading": "Google Gemini",
|
||||
"tagline": "Nivel gratuito disponible, gran ratio calidad/precio.",
|
||||
"items": [
|
||||
"API key: <a>aistudio.google.com/app/apikey</a>",
|
||||
"Modelos verificados: <code>gemini-2.5-flash-lite</code>, <code>gemini-2.5-flash</code>, <code>gemini-3-flash-preview</code>.",
|
||||
"Recomendado: <strong><code>gemini-2.5-flash-lite</code></strong> — flash y flash-lite pasan el verificador consistentemente. Las variantes pro rechazan el ajuste <code>thinkingBudget=0</code> que usa el Monitor y son excesivas para esta carga."
|
||||
]
|
||||
},
|
||||
"openrouter": {
|
||||
"heading": "OpenRouter",
|
||||
"tagline": "Agregador con acceso a más de 100 modelos usando una única API key. Máxima flexibilidad.",
|
||||
"items": [
|
||||
"API key: <a>openrouter.ai/keys</a>",
|
||||
"Modelos verificados: <code>meta-llama/llama-3.3-70b-instruct</code>, <code>meta-llama/llama-3.1-70b-instruct</code>, <code>meta-llama/llama-3.1-8b-instruct</code>, <code>anthropic/claude-3.5-haiku</code>, <code>anthropic/claude-3.5-sonnet</code>, <code>google/gemini-flash-1.5</code>, <code>openai/gpt-4o-mini</code>, <code>mistralai/mistral-7b-instruct</code>, <code>mistralai/mixtral-8x7b-instruct</code>.",
|
||||
"Recomendado: <strong><code>meta-llama/llama-3.3-70b-instruct</code></strong> — mismo modelo que la entrada de Groq pero enrutado por OpenRouter, lo que significa una sola key para todos los modelos listados."
|
||||
]
|
||||
},
|
||||
"ollama": {
|
||||
"heading": "Ollama (Local)",
|
||||
"tagline": "Usa los modelos disponibles en tu servidor Ollama. 100% local, sin costes, privacidad total.",
|
||||
"items": [
|
||||
"Sin API key. Configura el campo <em>Ollama URL</em> a tu servidor (por defecto <code>http://localhost:11434</code> o el host que ejecute tu instancia de Ollama).",
|
||||
"Modelos: <strong>no filtrados.</strong> El Monitor lee los modelos que hayas descargado en el lado de Ollama vía <code>ollama pull <model></code>. El dropdown se llena desde <code>GET /api/tags</code> en tu servidor Ollama.",
|
||||
"Instalación: <a>ollama.com/download</a> — corre en Linux, macOS, Windows. Para mejores resultados elige un modelo que entre en RAM con una ventana de contexto suficientemente grande para los bloques de journal que inyecta el dispatcher."
|
||||
]
|
||||
}
|
||||
},
|
||||
"models": {
|
||||
"heading": "Por qué estos modelos en concreto",
|
||||
"intro": "El dropdown de modelos para cada proveedor comercial se llena desde una lista curada que viene con el Monitor (<code>verified_ai_models.json</code>). Los modelos en esta lista se han probado de principio a fin con el formato de la API chat / completions que usa el Monitor, con la forma exacta <code>system_prompt + user_message + max_tokens</code> que envía el AI Enhancer. La lista se refresca antes de cada release de ProxMenux con una herramienta verificadora privada que prueba cada modelo candidato y poda los que se comportan mal.",
|
||||
"consequencesIntro": "Dos consecuencias que merece la pena conocer:",
|
||||
"consequences": [
|
||||
"<strong>El modelo recomendado</strong> para cada proveedor es el que tiene el mejor equilibrio de calidad, latencia y coste específicamente para traducción de notificaciones — no el modelo más capaz que vende el proveedor. Las reescrituras de notificaciones no necesitan razonamiento de modelo frontera; necesitan rapidez y bajo coste.",
|
||||
"<strong>Aun así puedes elegir otro modelo verificado</strong> del dropdown — a veces tienes una cuota de nivel gratuito que quieres gastar en un modelo concreto, o tienes una preferencia fuerte. Elige cualquiera de las entradas listadas; todas han pasado el verificador."
|
||||
],
|
||||
"ollamaTitle": "Ollama es la excepción",
|
||||
"ollamaBody": "Los modelos de Ollama son locales y el Monitor no los filtra — el dropdown refleja lo que hayas descargado. Elige un modelo del rango 7B-13B con al menos una ventana de contexto de 8K para que la reescritura con IA se comporte razonablemente con los bloques de contexto de journal."
|
||||
},
|
||||
"defaultPrompt": {
|
||||
"heading": "Prompt por defecto",
|
||||
"intro": "Con el modo de prompt en <em>Default</em>, el Monitor usa el system prompt de abajo. El prompt se plantilla en tiempo de ejecución: <code>'{'language'}'</code>, <code>'{'detail_level'}'</code>, <code>'{'emoji_instructions'}'</code> y <code>'{'suggestions_addon'}'</code> se reemplazan antes de la llamada. Las variantes para canales rich vs plain y el addon AI Suggestions se muestran inmediatamente después.",
|
||||
"showFullSummary": "Mostrar system prompt completo por defecto",
|
||||
"passagesIntro": "Dos pasajes del prompt de arriba son placeholders que se intercambian según el toggle <em>Rich messages</em> por canal:",
|
||||
"passages": [
|
||||
"<strong>Rich activado</strong> → se inyecta un bloque de emojis listando los iconos que el LLM puede usar, más una regla de hostname (el LLM debe mantener literalmente el prefijo de hostname del título) y un puñado de ejemplos formateados (inicio de backup, backup completo, actualizaciones, arranque de VM, salud degradada). Esto es lo que produce los mensajes con prefijo de emoji en Telegram y Discord.",
|
||||
"<strong>Rich desactivado</strong> → un bloque de una línea le dice al LLM que use solo ASCII plano — sin emojis, sin símbolos Unicode. Usado para email y cualquier canal donde el ruido de formato perjudique las reglas de inbox o la legibilidad."
|
||||
],
|
||||
"suggestionsPlaceholder": "Y el placeholder <code>'{'suggestions_addon'}'</code> está vacío salvo que actives AI Suggestions (siguiente sección), en cuyo caso se inyecta este bloque:",
|
||||
"showAddonSummary": "Mostrar addon de AI Suggestions"
|
||||
},
|
||||
"customPrompt": {
|
||||
"heading": "Modo de prompt personalizado",
|
||||
"intro": "Cambiar el modo de prompt a <em>Custom</em> intercambia el system prompt por defecto entero por uno que escribes tú. El prompt personalizado se guarda en la configuración SQLite del Monitor y se envía literalmente en cada llamada de reescritura con IA. Es la salida de emergencia correcta cuando quieres una voz, estructura o foco completamente distintos a los que ofrece el prompt empaquetado.",
|
||||
"imageAlt": "Modo Custom Prompt mostrando un textarea con reglas de traducción y botones Export Import más un enlace a Community prompts",
|
||||
"imageCaption": "Custom Prompt — textarea grande con el prompt del usuario, más <em>Export</em>, <em>Import</em> y un enlace a la galería comunitaria en GitHub.",
|
||||
"changesTitle": "Qué cambia cuando Custom está activado",
|
||||
"changes": [
|
||||
"<strong>El prompt por defecto se reemplaza por completo.</strong> Los mappings de Proxmox, las reglas de manejo de contexto y las instrucciones de emoji desaparecen todas. Si quieres conservar cualquiera de ellas, pégalas en tu prompt — el <code>EXAMPLE_CUSTOM_PROMPT</code> empaquetado mostrado abajo es un punto de partida.",
|
||||
"<strong>El selector de Language se ignora.</strong> El prompt por defecto tiene un placeholder <code>'{'language'}'</code>; el prompt personalizado no. Si quieres salida en un idioma específico, declárala dentro de tu prompt (\"Translate to Spanish\", \"Output everything in French\").",
|
||||
"<strong>El nivel de detalle sigue aplicando</strong> en el sentido de que está disponible como ajuste por canal, pero el tope de tokens de salida pasa a ser fijo de 500 en modo custom (vs la rampa 500 / 1500 / 3000 del prompt por defecto). Si tu prompt personalizado pide un reporte largo, sube el tope editando el prompt o divide la petición.",
|
||||
"<strong>Los marcadores de Output Format siguen siendo obligatorios.</strong> El Monitor parsea la respuesta buscando <code>[TITLE]</code> y <code>[BODY]</code> en sus propias líneas. Un prompt personalizado que no emita esos marcadores romperá el parser y caerá al cuerpo templated original.",
|
||||
"<strong>Las reglas de emoji de Rich messages no se autoinyectan.</strong> Si quieres emojis, dile al prompt que los use. Si quieres texto plano, dile que no. El toggle solo gatea los bloques empaquetados del prompt por defecto, no tu cadena personalizada."
|
||||
],
|
||||
"starterTitle": "Prompt inicial",
|
||||
"starterIntro": "El textarea de <em>Custom Prompt</em> viene precargado con un ejemplo mínimo que puedes adaptar:",
|
||||
"showStarterSummary": "Mostrar prompt personalizado inicial",
|
||||
"shareTitle": "Compartir prompts con la comunidad",
|
||||
"shareIntro": "El botón <em>Export</em> escribe tu prompt personalizado actual en un archivo (<code>.txt</code> / <code>.md</code>) que puedes guardar como backup o pasar a otra persona. <em>Import</em> lo trae de vuelta. El tercer botón al lado enlaza con una galería comunitaria pública en GitHub:",
|
||||
"shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Comparte prompts personalizados para notificaciones de IA",
|
||||
"shareOutro": "Navega la discusión para ver qué han construido otros operadores — alertas escuetas tipo pager, reportes técnicos verbosos, variantes específicas por idioma. Si tuneas el tuyo y te gusta el resultado, publícalo allí: incluso una descripción de un párrafo de para qué optimiza tu prompt ayuda a la gente a elegir un buen punto de partida. El feedback sobre lo que funciona y lo que no es igualmente bienvenido."
|
||||
},
|
||||
"suggestions": {
|
||||
"heading": "AI Suggestions (BETA)",
|
||||
"intro": "AI Suggestions es un addon opt-in que deja al LLM añadir <strong>un</strong> consejo corto y accionable al final del cuerpo. Solo se activa cuando el modo de prompt es <em>Default</em>, el toggle maestro de IA está activado y el switch <em>AI Suggestions</em> está pulsado — e incluso entonces, el prompt instruye al modelo a saltarse el consejo cuando la causa o solución no esté clara.",
|
||||
"formatIntro": "Cuando se añade un consejo, sigue este formato exacto:",
|
||||
"rulesIntro": "Las reglas integradas en el addon (visibles en el bloque colapsable bajo la sección Default prompt de arriba):",
|
||||
"rules": [
|
||||
"El consejo se incluye <em>solo</em> si el contexto del journal o la base de datos de errores conocidos apunta claramente a una solución específica.",
|
||||
"El consejo está limitado a 100 caracteres.",
|
||||
"Debe ser específico (comando o ruta concretos) — los consejos genéricos los rechaza el propio prompt.",
|
||||
"Si un error conocido proporciona una solución, el LLM debe usar esa solución, no inventar una nueva.",
|
||||
"Si nada en la entrada le da al LLM suficiente certeza para sugerir un arreglo concreto, el consejo se omite — sin adivinar."
|
||||
],
|
||||
"betaTitle": "Por qué BETA",
|
||||
"betaBody": "La calidad del consejo depende de dos cosas fuera de ProxMenux: el modelo elegido y lo rico que era el contexto del journal para el evento. Con un modelo fuerte (Claude 3.5 Haiku, GPT-4.1 Mini, Llama 3.3 70B) y un error de disco que viene con smartctl + líneas de journal, el consejo es consistentemente útil. Con un modelo Ollama local pequeño y un evento de una línea, el consejo puede quedar pobre o saltarse por completo. Desactiva el toggle si encuentras los consejos ruidosos y reactívalo cuando lo quieras de vuelta."
|
||||
},
|
||||
"detailLevel": {
|
||||
"heading": "Nivel de detalle por canal",
|
||||
"intro": "Cada uno de los cuatro canales (Telegram, Discord, Gotify, Email) tiene su propio dropdown de nivel de detalle. Hay tres valores disponibles, mapeados a topes específicos de tokens de salida y a instrucciones específicas en el prompt por defecto:",
|
||||
"headerLevel": "Nivel",
|
||||
"headerLabel": "Etiqueta UI",
|
||||
"headerCap": "Tope de salida",
|
||||
"headerProduce": "Qué le pide el prompt al LLM que produzca",
|
||||
"rows": [
|
||||
{
|
||||
"level": "brief",
|
||||
"label": "2-3 líneas, solo esencial",
|
||||
"cap": "500 tokens",
|
||||
"produce": "\"Qué pasó + dónde\". Nada más."
|
||||
},
|
||||
{
|
||||
"level": "standard",
|
||||
"label": "Conciso con contexto básico",
|
||||
"cap": "1500 tokens",
|
||||
"produce": "3-6 líneas: qué, dónde, causa, dispositivos afectados."
|
||||
},
|
||||
{
|
||||
"level": "detailed",
|
||||
"label": "Detalles técnicos completos",
|
||||
"cap": "3000 tokens",
|
||||
"produce": "Reporte completo: qué, dónde, causa, afectados, logs, datos SMART, historial."
|
||||
}
|
||||
],
|
||||
"defaultsIntro": "Valores por defecto que el Monitor aplica en la primera instalación:",
|
||||
"defaults": [
|
||||
"<strong>Telegram, Discord, Gotify</strong> — <code>standard</code>.",
|
||||
"<strong>Email</strong> — <code>detailed</code>. Email es el canal donde típicamente quieres la foto completa para archivo."
|
||||
],
|
||||
"emailTitle": "El nivel de detalle de Email añade el original",
|
||||
"emailBody": "Cuando Email está en <code>detailed</code> y el cuerpo templated original tiene contenido sustancial (más de 50 caracteres), el dispatcher añade el mensaje original al final de la reescritura con IA, separado por un divisor de 40 guiones y una etiqueta <code>Original message:</code>. Esto significa que un email detallado siempre lleva tanto la versión amigable de IA como el template crudo amigable de máquina — útil cuando quieres hacer grep de una alerta antigua más tarde."
|
||||
},
|
||||
"language": {
|
||||
"heading": "Idioma",
|
||||
"intro": "Doce idiomas están cableados. El dropdown configura <code>ai_language</code> en la config y el valor se interpola en el system prompt en el sitio donde el prompt dice <em>\"translate alerts into '{'language'}'\"</em>. La lista completa:",
|
||||
"list": "Inglés (<code>en</code>), Español (<code>es</code>), Francés (<code>fr</code>), Alemán (<code>de</code>), Portugués (<code>pt</code>), Italiano (<code>it</code>), Ruso (<code>ru</code>), Sueco (<code>sv</code>), Noruego (<code>no</code>), Japonés (<code>ja</code>), Chino (<code>zh</code>), Neerlandés (<code>nl</code>).",
|
||||
"rulesIntro": "Dos reglas importantes sacadas directamente del prompt:",
|
||||
"rules": [
|
||||
"<strong>Traducir</strong>: etiquetas, descripciones, palabras de estado, unidades (p. ej. GB → Go en francés).",
|
||||
"<strong>No traducir</strong>: hostnames, IPs, paths, IDs de VM/CT, nombres de dispositivo como <code>/dev/sdX</code>, identificadores técnicos. Se mantienen literales independientemente del idioma."
|
||||
],
|
||||
"customNote": "El modo de prompt personalizado <strong>no usa</strong> el selector de Language. Si cambias a Custom y quieres un idioma de salida específico, decláralo dentro de tu prompt."
|
||||
},
|
||||
"templates": {
|
||||
"heading": "Una nota sobre templates",
|
||||
"body1": "El cuerpo que recibe la IA no es data cruda de evento — es una template prerrenderizada. Cada tipo de evento (<code>backup_complete</code>, <code>vm_start</code>, <code>auth_fail</code>, <code>health_degraded</code>, etc.) tiene una template en <code>notification_templates.py</code> que sabe cómo formatear ese evento específico en un cuerpo estructurado de texto plano. La IA reescribe ese cuerpo, no reemplaza el paso de templating.",
|
||||
"body2": "Dos implicaciones prácticas: la IA nunca ve un hostname o VMID que tenga que inventar — esos campos los pone la template antes de la reescritura. Y si la IA está desactivada, el cuerpo templated es lo que se despacha directamente. La página de <link>Notifications</link> documenta la pipeline de despacho completa y es la referencia cruzada correcta para todo lo que le pasa a un evento antes de llegar a esta capa."
|
||||
},
|
||||
"privacy": {
|
||||
"heading": "Privacidad y flujo de datos",
|
||||
"intro": "Con la reescritura con IA activada, el Monitor envía el cuerpo de notificación renderizado más los bloques de contexto enriquecidos al proveedor configurado. Eso puede incluir hostnames, IPs, usernames, paths de dispositivo, líneas de log del journal y atributos SMART del dispositivo afectado. Si eso sale del host depende del proveedor que hayas elegido:",
|
||||
"headerProvider": "Proveedor",
|
||||
"headerDestination": "Destino de los datos",
|
||||
"rows": [
|
||||
{
|
||||
"provider": "Ollama",
|
||||
"destination": "Se queda en el host Ollama. Si Ollama corre en el mismo nodo Proxmox, nada sale de la red en absoluto."
|
||||
},
|
||||
{
|
||||
"provider": "OpenAI",
|
||||
"destination": "<code>api.openai.com</code> (o tu endpoint Base URL personalizado). Sujeto a la política de manejo de datos de OpenAI en el momento de la llamada."
|
||||
},
|
||||
{
|
||||
"provider": "Anthropic",
|
||||
"destination": "<code>api.anthropic.com</code>."
|
||||
},
|
||||
{
|
||||
"provider": "Google Gemini",
|
||||
"destination": "<code>generativelanguage.googleapis.com</code>."
|
||||
},
|
||||
{
|
||||
"provider": "Groq",
|
||||
"destination": "<code>api.groq.com</code>."
|
||||
},
|
||||
{
|
||||
"provider": "OpenRouter",
|
||||
"destination": "<code>openrouter.ai</code>, que reenvía al proveedor de modelo subyacente elegido en el campo <code>model</code>. Dos saltos en lugar de uno."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "Si el contenido del evento no puede salir de la red",
|
||||
"calloutBody": "Usa Ollama, o desactiva el reescritor de IA. No hay terreno intermedio — el dispatcher no intenta redactar hostnames o IPs antes de enviar; el prompt se construye a partir del payload real del evento tal como lo ve el Monitor."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — la pipeline de despacho, canales, toggles por evento y la integración del webhook de PVE que rodea esta capa."
|
||||
},
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — el mayor productor individual de eventos que la IA acaba reescribiendo, con sus propias duraciones de supresión por categoría."
|
||||
},
|
||||
{
|
||||
"label": "Arquitectura",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — dónde encaja el AI Enhancer en el proceso más amplio del Monitor (es un módulo, no un servicio separado)."
|
||||
}
|
||||
],
|
||||
"communityLabel": "Prompts comunitarios en GitHub",
|
||||
"communityTail": " — navega, comparte, pregunta."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,681 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "API de Proxmox Monitor — Referencia de integración | ProxMenux",
|
||||
"description": "Endpoints HTTP expuestos por ProxMenux Monitor para integraciones: Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios. Exportación de datos en solo lectura más las operaciones de escritura seguras que necesitan las automatizaciones — control de VMs, disparo de backup, despacho de notificaciones, acknowledgement de alertas.",
|
||||
"ogTitle": "API de Proxmox Monitor — Referencia de integración",
|
||||
"ogDescription": "Endpoints expuestos por ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios.",
|
||||
"twitterTitle": "API de Proxmox Monitor | ProxMenux",
|
||||
"twitterDescription": "Endpoints para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios."
|
||||
},
|
||||
"header": {
|
||||
"title": "API Reference",
|
||||
"description": "Los endpoints HTTP que usan los integradores para leer estado y disparar acciones seguras en ProxMenux Monitor — sensores de Home Assistant, tarjetas de Homepage, paneles de Grafana, scrapes de Prometheus, flujos de n8n y scripts propios. Cada categoría, más una lista completa de métricas Prometheus, con ejemplos en curl.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué es esta página",
|
||||
"body": "Esta página lista los endpoints que esperamos que usen las integraciones externas — exportación de datos en solo lectura para cada parte del Monitor, más el pequeño conjunto de operaciones de escritura que las automatizaciones necesitan legítimamente (disparar un backup, enviar una notificación personalizada, dar acknowledgement a una alerta). Toda la API corre desde el mismo proceso Flask que sirve la UI del panel en TCP <strong>8008</strong>; la dirección de bind y TLS se configuran en <link>Access & Authentication</link>."
|
||||
},
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerMethod": "Método",
|
||||
"headerUse": "Uso",
|
||||
"auth": {
|
||||
"heading": "Autenticación",
|
||||
"intro": "Cada endpoint marcado como \"authenticated\" espera un token bearer JWT en la cabecera de la petición:",
|
||||
"tokensIntro": "Dos formas de obtener el token:",
|
||||
"items": [
|
||||
"<strong>API tokens (recomendado para integraciones).</strong> Tokens de larga duración emitidos desde <strong>Settings → Security → API Tokens</strong> en el panel. Cada token tiene un nombre, se puede revocar individualmente y es lo que deberías pasar a Home Assistant / Homepage / Grafana / n8n.",
|
||||
"<strong>Flujo de login (JWT de corta duración).</strong> <code>POST /api/auth/login</code> con un username, password y token TOTP si el 2FA está activado. El JWT devuelto es de corta duración y el panel lo refresca automáticamente; útil para scripts ad-hoc que se autentican como un usuario humano."
|
||||
],
|
||||
"flowLink": "El flujo de auth, la política de contraseñas, la configuración de 2FA, el log de auditoría y la configuración TLS viven todos en <link>Access & Authentication</link>.",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/auth/login",
|
||||
"method": "POST",
|
||||
"use": "Body: <code>'{'\"username\",\"password\",\"totp_token?\"'}'</code>. Devuelve un JWT de corta duración."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/auth/api-tokens",
|
||||
"method": "GET",
|
||||
"use": "Lista los API tokens (solo metadatos — nombres, prefijos, fechas; nunca el secret real)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/auth/api-tokens",
|
||||
"method": "POST",
|
||||
"use": "Emite un nuevo API token de larga duración. Body: <code>'{'\"name\":\"'<'label'>'\"'}'</code>. El valor del token se devuelve una vez y no se puede recuperar de nuevo."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/auth/api-tokens/<id>",
|
||||
"method": "DELETE",
|
||||
"use": "Revoca un API token específico por su ID."
|
||||
}
|
||||
]
|
||||
},
|
||||
"conventions": {
|
||||
"heading": "Convenciones",
|
||||
"items": [
|
||||
"Todas las peticiones y respuestas son JSON salvo que se indique explícitamente (la descarga de logs es texto plano, <code>/api/prometheus</code> es text/plain en formato OpenMetrics, el log de tareas es texto plano).",
|
||||
"Los endpoints que modifican estado con éxito devuelven <code>'{'\"success\": true, ...'}'</code>. Las respuestas de error usan un estado HTTP no-2xx con <code>'{'\"success\": false, \"error\": \"'<'motivo'>'\"'}'</code>.",
|
||||
"Los endpoints de listado aceptan <code>limit</code>, <code>offset</code>, <code>since</code> opcionales y filtros específicos por categoría vía query string.",
|
||||
"Los campos de tiempo se devuelven como segundos epoch Unix o ISO-8601 con zona horaria explícita, nunca como cadenas de locale."
|
||||
]
|
||||
},
|
||||
"system": {
|
||||
"heading": "Sistema y hardware",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/system",
|
||||
"method": "GET",
|
||||
"use": "CPU, memoria, swap, uptime, load — snapshot actual."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/info",
|
||||
"method": "GET",
|
||||
"use": "Información estática del host: hostname, kernel, versión de PVE, modelo de CPU, distro."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/system-info",
|
||||
"method": "GET",
|
||||
"use": "Snapshot extendido del sistema usado por la cabecera del panel (métricas globales + boot time)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/hardware",
|
||||
"method": "GET",
|
||||
"use": "Inventario hardware detallado — dispositivos PCI, GPUs, mapa de sensores."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/hardware/live",
|
||||
"method": "GET",
|
||||
"use": "Valores en vivo para sensores que cambian de segundo en segundo."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/temperature/history",
|
||||
"method": "GET",
|
||||
"use": "Serie temporal de temperaturas CPU / package."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/gpu/<slot>/realtime",
|
||||
"method": "GET",
|
||||
"use": "Métricas en vivo de GPU NVIDIA / Intel / AMD por slot PCI."
|
||||
}
|
||||
]
|
||||
},
|
||||
"health": {
|
||||
"heading": "Monitor de salud",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Probe pequeño de salud — devuelve JSON con <code>status</code>, <code>timestamp</code>, <code>version</code>. Adecuado para keyword checks de Uptime Kuma; el receptor debe enviar la cabecera bearer."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
"method": "GET",
|
||||
"use": "Veredicto global de salud — severidad única + cadena de resumen."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/details",
|
||||
"method": "GET",
|
||||
"use": "Las diez categorías con estados por categoría y el payload estructurado que produjo cada uno."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/full",
|
||||
"method": "GET",
|
||||
"use": "Snapshot completo — categorías + errores activos + lista de dismissed + ajustes de supresión personalizados. Alimenta el modal en un round-trip; usa una caché de fondo de 6 min para respuesta instantánea."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/active-errors",
|
||||
"method": "GET",
|
||||
"use": "Lista activa, filtrable por <code>?category=<name></code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/dismissed",
|
||||
"method": "GET",
|
||||
"use": "Lista de dismissed con las horas de supresión restantes."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/settings",
|
||||
"method": "GET",
|
||||
"use": "Valores de Suppression Duration por categoría configurados actualmente."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/remote-storages",
|
||||
"method": "GET",
|
||||
"use": "Inventario de almacenamientos remotos definidos por Proxmox, con estado online."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/interfaces",
|
||||
"method": "GET",
|
||||
"use": "Inventario de interfaces de red con tipo (bridge / bond / physical), IP y velocidad de enlace."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/acknowledge",
|
||||
"method": "POST",
|
||||
"use": "Body: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Descarta una alerta con la Suppression Duration configurada de la categoría."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/cleanup-orphans",
|
||||
"method": "POST",
|
||||
"use": "Limpieza manual de errores cuyo dispositivo o VM subyacente ha desaparecido. Idempotente."
|
||||
}
|
||||
],
|
||||
"outro": "Las formas de respuesta y la semántica de las categorías viven en <link>Monitor de salud</link>."
|
||||
},
|
||||
"storage": {
|
||||
"heading": "Almacenamiento",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/storage",
|
||||
"method": "GET",
|
||||
"use": "Todos los discos visibles al host (block devices, pools ZFS, LVM)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/summary",
|
||||
"method": "GET",
|
||||
"use": "Resumen compacto usado por las tarjetas del panel."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/proxmox-storage",
|
||||
"method": "GET",
|
||||
"use": "Almacenamientos definidos por Proxmox desde <code>/etc/pve/storage.cfg</code> con estado online y espacio libre."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/observations",
|
||||
"method": "GET",
|
||||
"use": "Historial permanente de observaciones de disco — advertencias SMART, errores I/O, eventos de pool ZFS, conservados a través de auto-resoluciones de errores."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>",
|
||||
"method": "GET",
|
||||
"use": "Atributos SMART actuales para un disco."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/latest",
|
||||
"method": "GET",
|
||||
"use": "Self-test SMART más reciente para el disco."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/history",
|
||||
"method": "GET",
|
||||
"use": "Lista de reportes SMART almacenados para el disco."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/history/<file>",
|
||||
"method": "GET",
|
||||
"use": "Lee un reporte SMART almacenado específico."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/<disk>/test",
|
||||
"method": "POST",
|
||||
"use": "Dispara un self-test SMART. Body: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/schedules",
|
||||
"method": "GET",
|
||||
"use": "Lista los tests SMART programados actualmente."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/storage/smart/tools",
|
||||
"method": "GET",
|
||||
"use": "Detecta si <code>smartctl</code> y compañía están instalados."
|
||||
}
|
||||
]
|
||||
},
|
||||
"network": {
|
||||
"heading": "Red",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/network",
|
||||
"method": "GET",
|
||||
"use": "Todas las interfaces con estado de enlace y direcciones."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/network/summary",
|
||||
"method": "GET",
|
||||
"use": "Vista compacta usada por el panel."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/network/<iface>/metrics",
|
||||
"method": "GET",
|
||||
"use": "RX / TX por interfaz, contadores de errores, serie temporal RRD."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/network/latency/current",
|
||||
"method": "GET",
|
||||
"use": "Último probe de latencia al gateway."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/network/latency/history",
|
||||
"method": "GET",
|
||||
"use": "Serie temporal de latencia al gateway."
|
||||
}
|
||||
]
|
||||
},
|
||||
"vms": {
|
||||
"heading": "VMs y contenedores",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/vms",
|
||||
"method": "GET",
|
||||
"use": "Lista de todas las VMs y CTs con estado, vmid, nombre."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>",
|
||||
"method": "GET",
|
||||
"use": "Detalle completo de un guest (config, red, discos)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/metrics",
|
||||
"method": "GET",
|
||||
"use": "Serie temporal de CPU / memoria / I/O de disco para un guest (RRD)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"method": "GET",
|
||||
"use": "Logs de tareas recientes acotados a ese guest."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
"method": "GET",
|
||||
"use": "Lista los backups actualmente conservados para este guest."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/control",
|
||||
"method": "POST",
|
||||
"use": "Body: <code>'{'\"action\":\"start|stop|reboot|shutdown\"'}'</code>. Power-cycle de un guest."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/backup",
|
||||
"method": "POST",
|
||||
"use": "Dispara <code>vzdump</code> para ese guest. El body elige storage y modo (<code>snapshot</code> / <code>suspend</code> / <code>stop</code>)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/vms/<vmid>/config",
|
||||
"method": "PUT",
|
||||
"use": "Actualiza el campo descripción (notes) de una VM / CT. Otras claves de config no son modificables desde este endpoint."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/node/metrics",
|
||||
"method": "GET",
|
||||
"use": "Métricas agregadas a nivel de nodo (RRD)."
|
||||
}
|
||||
]
|
||||
},
|
||||
"backups": {
|
||||
"heading": "Backups",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/backups",
|
||||
"method": "GET",
|
||||
"use": "Lista de backups a nivel de cluster."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/backup-storages",
|
||||
"method": "GET",
|
||||
"use": "Almacenamientos marcados como destinos de backup, con espacio libre."
|
||||
}
|
||||
]
|
||||
},
|
||||
"logs": {
|
||||
"heading": "Logs, tareas, eventos",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/logs",
|
||||
"method": "GET",
|
||||
"use": "Entradas del journal filtradas. Query: <code>?level=&service=&limit=</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/logs/download",
|
||||
"method": "GET",
|
||||
"use": "Volcado en texto plano del rango filtrado."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/events",
|
||||
"method": "GET",
|
||||
"use": "Stream interno de eventos — el mismo que alimenta las notificaciones."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/task-log/<upid>",
|
||||
"method": "GET",
|
||||
"use": "Log completo en texto plano para una tarea Proxmox por UPID."
|
||||
}
|
||||
]
|
||||
},
|
||||
"notifications": {
|
||||
"heading": "Notifications e IA",
|
||||
"intro": "La pipeline de despacho, los walk-throughs de canales y la configuración del reescritor de IA viven en <notifLink>Notifications</notifLink> y <aiLink>Asistente de IA</aiLink>.",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/notifications",
|
||||
"method": "GET",
|
||||
"use": "Notificaciones recientes mostradas en el panel."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/download",
|
||||
"method": "GET",
|
||||
"use": "Exporta notificaciones como texto."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/status",
|
||||
"method": "GET",
|
||||
"use": "Estado del dispatcher — si el hilo de fondo está corriendo, profundidad de cola, último envío."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/settings",
|
||||
"method": "GET",
|
||||
"use": "Lee la configuración completa de notificaciones (canales, toggles por evento, reescritor de IA, Display Name)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/history",
|
||||
"method": "GET",
|
||||
"use": "Historial de despacho. Query: <code>?limit=&offset=&severity=&channel=</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/history",
|
||||
"method": "DELETE",
|
||||
"use": "Borra la tabla de historial de despacho."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/test",
|
||||
"method": "POST",
|
||||
"use": "Envía una notificación de prueba a un canal. Body: <code>'{'\"channel\":\"telegram\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/send",
|
||||
"method": "POST",
|
||||
"use": "Emite un evento personalizado. Body: <code>'{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/test-ai",
|
||||
"method": "POST",
|
||||
"use": "Prueba la conexión del proveedor de IA. Body: <code>'{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/provider-models",
|
||||
"method": "POST",
|
||||
"use": "Lista modelos disponibles para el proveedor de IA seleccionado."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/setup-webhook",
|
||||
"method": "POST",
|
||||
"use": "Registra el Monitor como destino webhook en <code>/etc/pve/notifications.cfg</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
|
||||
"method": "POST",
|
||||
"use": "Elimina el destino del Monitor de la config de notificaciones de PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/read-cfg",
|
||||
"method": "GET",
|
||||
"use": "Lee el <code>notifications.cfg</code> actual de PVE como lo ve PVE."
|
||||
}
|
||||
]
|
||||
},
|
||||
"security": {
|
||||
"heading": "Seguridad (lectura)",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/security/firewall/status",
|
||||
"method": "GET",
|
||||
"use": "Estado del firewall de PVE y reglas activas."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/fail2ban/details",
|
||||
"method": "GET",
|
||||
"use": "Estado del jail Fail2Ban — solo útil cuando el jail opcional está instalado."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/fail2ban/activity",
|
||||
"method": "GET",
|
||||
"use": "Eventos recientes de Fail2Ban (bans, unbans, arranques de jail)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/lynis/status",
|
||||
"method": "GET",
|
||||
"use": "Estado de última ejecución de Lynis (si está instalado, timestamp de último scan)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/lynis/report",
|
||||
"method": "GET",
|
||||
"use": "Último reporte de auditoría Lynis (warnings, sugerencias, hardening index)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/security/tools",
|
||||
"method": "GET",
|
||||
"use": "Detecta qué herramientas opcionales de seguridad (Fail2Ban, Lynis) están instaladas."
|
||||
}
|
||||
]
|
||||
},
|
||||
"proxmenuxIntegration": {
|
||||
"heading": "Integración ProxMenux",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/proxmenux/update-status",
|
||||
"method": "GET",
|
||||
"use": "Si ProxMenux Monitor tiene actualización disponible, versión actual y última."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/proxmenux/installed-tools",
|
||||
"method": "GET",
|
||||
"use": "Lista de cada optimización post-instalación de ProxMenux registrada actualmente en el host (desde <code>/usr/local/share/proxmenux/installed_tools.json</code>)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/proxmenux/tool-source/<key>",
|
||||
"method": "GET",
|
||||
"use": "Código fuente de una función post-instalación específica — el bash exacto que se aplicó."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prometheus": {
|
||||
"heading": "Métricas Prometheus",
|
||||
"intro": "ProxMenux Monitor expone un endpoint de scrape formato Prometheus en <code>GET /api/prometheus</code> (autenticado) devolviendo texto formato OpenMetrics. Cada métrica está etiquetada con <code>node=\"<hostname>\"</code> y lleva un timestamp explícito para que ingese limpio en Prometheus, VictoriaMetrics, Mimir o cualquier TSDB compatible.",
|
||||
"exportedTitle": "Métricas exportadas",
|
||||
"headerGroup": "Grupo",
|
||||
"headerMetric": "Métrica",
|
||||
"headerDesc": "Descripción",
|
||||
"groups": [
|
||||
{
|
||||
"group": "Sistema",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_cpu_usage",
|
||||
"desc": "Porcentaje de uso de CPU (gauge)."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_memory_total_bytes",
|
||||
"desc": "Memoria física total en bytes."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_memory_used_bytes",
|
||||
"desc": "Memoria usada en bytes."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_memory_usage_percent",
|
||||
"desc": "Porcentaje de uso de memoria."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_load_average",
|
||||
"desc": "Load average del sistema. Etiqueta <code>period=\"1m\" | \"5m\" | \"15m\"</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Uptime",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_uptime_seconds",
|
||||
"desc": "Segundos desde el último boot."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Hardware",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_cpu_temperature_celsius",
|
||||
"desc": "Temperatura del package de CPU."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_disk_temperature_celsius",
|
||||
"desc": "Temperatura por disco. Etiqueta <code>device</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_fan_speed_rpm",
|
||||
"desc": "Velocidades de ventilador. Etiqueta <code>fan</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Espacio en disco",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_disk_total_bytes",
|
||||
"desc": "Espacio total de disco por mount. Etiqueta <code>mountpoint</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_disk_used_bytes",
|
||||
"desc": "Espacio usado de disco por mount."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_disk_usage_percent",
|
||||
"desc": "Porcentaje de uso de disco por mount."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Red",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_network_bytes_sent_total",
|
||||
"desc": "Total de bytes enviados (counter)."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_network_bytes_received_total",
|
||||
"desc": "Total de bytes recibidos (counter)."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_interface_bytes_sent_total",
|
||||
"desc": "Bytes enviados por interfaz. Etiqueta <code>interface</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_interface_bytes_received_total",
|
||||
"desc": "Bytes recibidos por interfaz."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "VMs / CTs",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_vms_total",
|
||||
"desc": "Número total de VMs y LXCs."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vms_running",
|
||||
"desc": "Número de guests en ejecución."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vms_stopped",
|
||||
"desc": "Número de guests parados."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vm_status",
|
||||
"desc": "Estado por VM/CT (1 = running, 0 = stopped). Etiquetas <code>vmid</code>, <code>name</code>, <code>type</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vm_cpu_usage",
|
||||
"desc": "Uso de CPU por VM/CT. Mismas etiquetas."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_vm_memory_used_bytes / _max_bytes",
|
||||
"desc": "Memoria usada por VM/CT y máximo configurado."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "GPU",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_gpu_temperature_celsius",
|
||||
"desc": "Temperatura de GPU. Etiquetas <code>slot</code>, <code>vendor</code>."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_utilization_percent",
|
||||
"desc": "Porcentaje de utilización de GPU."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_memory_total_bytes",
|
||||
"desc": "Total de memoria de GPU."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_power_draw_watts",
|
||||
"desc": "Consumo de potencia de GPU en vatios."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_clock_speed_mhz",
|
||||
"desc": "Velocidad de reloj del core de GPU."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_gpu_memory_clock_mhz",
|
||||
"desc": "Velocidad de reloj de memoria de GPU."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "UPS",
|
||||
"metrics": [
|
||||
{
|
||||
"metric": "proxmox_ups_battery_charge_percent",
|
||||
"desc": "Porcentaje de carga de batería."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_ups_load_percent",
|
||||
"desc": "Carga actual de la UPS."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_ups_runtime_seconds",
|
||||
"desc": "Autonomía estimada en batería."
|
||||
},
|
||||
{
|
||||
"metric": "proxmox_ups_input_voltage_volts",
|
||||
"desc": "Voltaje de entrada."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"scrapeTitle": "Configuración de scrape de Prometheus",
|
||||
"scrapeIntro": "El endpoint requiere autenticación. Pasa el API token como cabecera bearer en tu configuración de scrape de Prometheus:",
|
||||
"perHostTitle": "Scrape por host",
|
||||
"perHostBody": "Cada instancia de ProxMenux Monitor exporta métricas para el host en el que corre. En un cluster, apunta Prometheus a cada nodo — la etiqueta <code>node</code> en cada serie te permite distinguirlos en consultas Grafana (<code>proxmox_vms_running'{'node=\"pve01\"'}'</code>)."
|
||||
},
|
||||
"puttingItTogether": {
|
||||
"heading": "Juntándolo todo",
|
||||
"body": "Para guías de principio a fin que conectan estos endpoints con sensores de Home Assistant, tarjetas de Homepage, paneles de Grafana, flujos de n8n y otras herramientas, mira la página dedicada <link>Integrations</link> — recorre la configuración típica de cada plataforma con ejemplos copia-pega. Esta página se mantiene centrada en el catálogo en sí."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Access & Authentication",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — emisión de tokens, log de auditoría, jail Fail2Ban opcional, configuración TLS."
|
||||
},
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tailRich": " — qué transporta cada tipo de evento en <code>data</code> cuando llamas a <code>/api/notifications/send</code>."
|
||||
},
|
||||
{
|
||||
"label": "Asistente de IA",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tailRich": " — cómo están cableados <code>/api/notifications/test-ai</code> y <code>/api/notifications/provider-models</code>."
|
||||
},
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tailRich": " — la forma de respuesta de <code>/api/health/*</code> y la semántica de las diez categorías."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,303 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Arquitectura de ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux",
|
||||
"description": "Cómo está construido ProxMenux Monitor: estructura del AppImage, blueprints de Flask, hilos de fondo, fuentes de datos (psutil, pvesh, smartctl, journalctl), persistencia en SQLite, terminal WebSocket, proveedores de IA, canales de notificación, reverse proxy e integración opcional con Fail2Ban.",
|
||||
"ogTitle": "Arquitectura de ProxMenux Monitor",
|
||||
"ogDescription": "Dentro de ProxMenux Monitor — estructura del AppImage, blueprints de Flask, hilos de fondo, SQLite, WebSocket, proveedores de IA, canales de notificación.",
|
||||
"twitterTitle": "Arquitectura de ProxMenux Monitor",
|
||||
"twitterDescription": "AppImage, Flask, SQLite, WebSocket, proveedores de IA y canales de notificación — por dentro del Monitor."
|
||||
},
|
||||
"header": {
|
||||
"title": "Arquitectura",
|
||||
"description": "Cómo se empaqueta ProxMenux Monitor, qué corre dentro del AppImage y cómo fluyen las peticiones desde el navegador a través del backend Flask hasta las herramientas del host y el almacén SQLite.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Un proceso, muchas responsabilidades",
|
||||
"body": "Un único proceso Python escucha en el puerto TCP 8008. Sirve el build estático de Next.js, expone la API REST, gestiona el terminal WebSocket, ejecuta el Monitor de salud periódico y despacha notificaciones. No hay un servidor web aparte, ni un broker de mensajes, ni una base de datos externa."
|
||||
},
|
||||
"requestFlow": {
|
||||
"heading": "Flujo de petición",
|
||||
"intro": "Del navegador al kernel, cada vista del panel sigue el mismo camino:",
|
||||
"diagramCaption": "Cada petición se autentica por JWT (cuando la autenticación está activada), se enruta a un blueprint y se responde con datos recogidos bajo demanda desde las herramientas del host. Si Fail2Ban está instalado y el jail proxmenux está activo, el middleware también comprueba la petición contra la lista de IPs baneadas del jail. El reverse proxy opcional es transparente para Flask — reenvía las cabeceras X-Forwarded-* y la app recupera la IP real del cliente a partir de ellas. El estado que necesita sobrevivir a una petición vive en SQLite.",
|
||||
"diagramArrowLabel": "HTTP / WS",
|
||||
"nodes": {
|
||||
"clientLabel": "Cliente",
|
||||
"clientDetail": "Navegador o PWA\n+ proxy opcional\nNginx / Caddy /\nTraefik",
|
||||
"flaskLabel": "Flask :8008",
|
||||
"flaskDetail": "Blueprints\nMiddleware JWT\nHook Fail2Ban\n(si está instalado)",
|
||||
"hostLabel": "Herramientas del host",
|
||||
"hostDetail": "psutil\npvesh\nsmartctl\njournalctl",
|
||||
"stateLabel": "Estado local",
|
||||
"stateDetail": "DB SQLite\n+ auth.json"
|
||||
},
|
||||
"threadsIntro": "El mismo proceso también ejecuta cuatro <strong>hilos de fondo</strong> arrancados al boot — no sirven HTTP, empujan estado a SQLite o a la cola de notificaciones mientras el host está activo:",
|
||||
"headerThread": "Hilo",
|
||||
"headerCadence": "Cadencia",
|
||||
"headerJob": "Tarea",
|
||||
"rows": [
|
||||
{
|
||||
"thread": "_temperature_collector_loop",
|
||||
"cadence": "60 s",
|
||||
"job": "Registra la temperatura de la CPU y una muestra de latencia de red en la DB de historial para que las gráficas del panel tengan datos incluso cuando ningún cliente está conectado."
|
||||
},
|
||||
{
|
||||
"thread": "_health_collector_loop",
|
||||
"cadence": "5 min",
|
||||
"job": "Ejecuta el ciclo completo del Monitor de salud (10 categorías), persiste errores activos, dismissals y observaciones de disco, y alimenta nuevos eventos al motor de notificaciones."
|
||||
},
|
||||
{
|
||||
"thread": "_vital_signs_sampler",
|
||||
"cadence": "~1 s",
|
||||
"job": "Muestreador de alta frecuencia de CPU + temperatura usado por los widgets en vivo del panel Overview."
|
||||
},
|
||||
{
|
||||
"thread": "notification_manager.start()",
|
||||
"cadence": "dirigido por eventos",
|
||||
"job": "Lanza los watchers de journal / task / hook (<code>JournalWatcher</code>, <code>TaskWatcher</code>, <code>ProxmoxHookWatcher</code>) y despacha a los canales configurados con reescritura opcional con IA."
|
||||
}
|
||||
]
|
||||
},
|
||||
"systemd": {
|
||||
"heading": "Unidad systemd",
|
||||
"intro": "El instalador deja una unidad en <code>/etc/systemd/system/proxmenux-monitor.service</code>. Contenido por defecto:",
|
||||
"items": [
|
||||
"<strong><code>User=root</code></strong> — obligatorio: SMART, <code>pvesh</code>, scopes de journal, comandos ZFS y el terminal web requieren todos root.",
|
||||
"<strong><code>Restart=on-failure</code></strong> con back-off de 10 segundos — las salidas con código distinto de cero relanzan automáticamente.",
|
||||
"<strong><code>After=network.target</code></strong> — espera a que el stack de red del host esté online."
|
||||
],
|
||||
"inspectTitle": "Inspeccionar la unidad en vivo"
|
||||
},
|
||||
"appimage": {
|
||||
"heading": "Qué contiene el AppImage",
|
||||
"intro": "El AppImage es un sistema de archivos automontable. <code>AppRun</code> en la raíz prepara el entorno y ejecuta <code>flask_server.py</code>:",
|
||||
"consequencesIntro": "Dos consecuencias de esta estructura:",
|
||||
"consequences": [
|
||||
"<strong>Sin polución del Python del host.</strong> El intérprete y los paquetes empaquetados están aislados dentro del AppImage — actualizar el Python del sistema host no afecta al Monitor y viceversa.",
|
||||
"<strong>Las herramientas de hardware también vienen incluidas.</strong> <code>ipmitool</code>, <code>lm-sensors</code> y <code>upsc</code> viajan dentro del AppImage para que el panel pueda leer sensores fuera de banda y el estado de la UPS sin forzar al usuario a instalar paquetes Debian."
|
||||
]
|
||||
},
|
||||
"flask": {
|
||||
"heading": "Estructura de la app Flask",
|
||||
"intro": "<code>flask_server.py</code> crea una única instancia <code>Flask(__name__)</code>, habilita CORS y registra seis blueprints más un inicializador de WebSocket:",
|
||||
"headerBlueprint": "Blueprint / módulo",
|
||||
"headerPrefix": "Prefijo de rutas",
|
||||
"headerOwns": "Responsable de",
|
||||
"rows": [
|
||||
{
|
||||
"blueprint": "flask_server.py",
|
||||
"prefix": [
|
||||
"/api/system",
|
||||
"/api/storage",
|
||||
"/api/network",
|
||||
"/api/vms",
|
||||
"/api/hardware",
|
||||
"/api/logs",
|
||||
"/api/prometheus"
|
||||
],
|
||||
"owns": "Endpoints de datos principales + servir el panel estático + comprobación opcional de Fail2Ban a nivel de aplicación (activa solo cuando Fail2Ban está instalado en el host con el jail <code>proxmenux</code>)."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_auth_routes.py",
|
||||
"prefix": [
|
||||
"/api/auth/*"
|
||||
],
|
||||
"owns": "Login, emisión de JWT, configuración / verificación de TOTP, cambio de contraseña, generación de API tokens."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_health_routes.py",
|
||||
"prefix": [
|
||||
"/api/health/*"
|
||||
],
|
||||
"owns": "Probe de salud público, estado detallado, errores activos / dismissed, ajustes de supresión."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_terminal_routes.py",
|
||||
"prefix": [
|
||||
"/api/terminal/* + WS"
|
||||
],
|
||||
"owns": "Asignación de PTY por sesión y pipe WebSocket hacia <code>xterm.js</code> en el navegador."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_notification_routes.py",
|
||||
"prefix": [
|
||||
"/api/notifications/*"
|
||||
],
|
||||
"owns": "CRUD de canales, envío de prueba, configuración del proveedor de IA, historial, envíos manuales."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_security_routes.py",
|
||||
"prefix": [
|
||||
"/api/security/*"
|
||||
],
|
||||
"owns": "Fallos de autenticación y, cuando Fail2Ban está instalado, estado del jail, eventos de ban y desbaneo manual."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_proxmenux_routes.py",
|
||||
"prefix": [
|
||||
"/api/proxmenux/*"
|
||||
],
|
||||
"owns": "Lee qué optimizaciones post-instalación de ProxMenux están instaladas en el host."
|
||||
},
|
||||
{
|
||||
"blueprint": "flask_oci_routes.py",
|
||||
"prefix": [
|
||||
"/api/oci/*"
|
||||
],
|
||||
"owns": "Ayudantes de despliegue de apps OCI / container (Proxmox VE 9.1+)."
|
||||
}
|
||||
],
|
||||
"endpointsLink": "La lista completa de endpoints con la forma de petición / respuesta está en <link>API Reference</link>."
|
||||
},
|
||||
"dataSources": {
|
||||
"heading": "Fuentes de datos",
|
||||
"intro": "Nada se recoge a través de un agente propio — el Monitor lee los mismos archivos y ejecuta los mismos comandos que un administrador humano:",
|
||||
"headerSource": "Fuente",
|
||||
"headerUsedFor": "Usado para",
|
||||
"rows": [
|
||||
{
|
||||
"source": "psutil",
|
||||
"usedFor": "Carga de CPU, memoria, swap, uso de puntos de montaje, contadores de NIC, lista de procesos."
|
||||
},
|
||||
{
|
||||
"source": "pvesh / qm / pct",
|
||||
"usedFor": "Información del nodo Proxmox, inventario y configuración de VMs y CTs, pools de almacenamiento, historial de tareas."
|
||||
},
|
||||
{
|
||||
"source": "smartctl",
|
||||
"usedFor": "Atributos SATA / NVMe, salud SMART, desgaste / vida útil, modelo y número de serie."
|
||||
},
|
||||
{
|
||||
"source": "zpool / zfs",
|
||||
"usedFor": "Estado del pool (ONLINE / DEGRADED / FAULTED / UNAVAIL), progreso de scrub, uso de datasets."
|
||||
},
|
||||
{
|
||||
"source": "journalctl",
|
||||
"usedFor": "Logs del sistema, OOM kills, errores ATA / NVMe / dm, eventos de seguridad, unidades de servicio propias."
|
||||
},
|
||||
{
|
||||
"source": "ip / iproute2",
|
||||
"usedFor": "Interfaces, direcciones, bridges, bonds, dispositivos gestionados por OVS."
|
||||
},
|
||||
{
|
||||
"source": "nvidia-smi · intel_gpu_top",
|
||||
"usedFor": "Utilización de GPU, VRAM, temperatura, carga de encoder / decoder."
|
||||
},
|
||||
{
|
||||
"source": "lspci · lscpu · dmidecode",
|
||||
"usedFor": "Topología PCIe, modelo y topología de CPU, información de placa y BIOS."
|
||||
},
|
||||
{
|
||||
"source": "ipmitool · sensors",
|
||||
"usedFor": "Sensores fuera de banda, velocidades de ventilador, temperaturas de placa (cuando son compatibles)."
|
||||
},
|
||||
{
|
||||
"source": "upsc (NUT)",
|
||||
"usedFor": "Estado de batería de UPS, carga, autonomía — cuando hay un servidor NUT configurado en el host."
|
||||
}
|
||||
],
|
||||
"cacheTitle": "La salida se cachea — no toda petición llega al host",
|
||||
"cacheBody": "Las fuentes costosas (<code>smartctl -a</code>, <code>pvesh get</code>) se envuelven en cachés temporizadas dentro del proceso Flask para que una pestaña ocupada del panel no martillee el disco o la API del cluster. Los TTLs de la caché están ajustados por fuente (unos pocos segundos para métricas en vivo, varios minutos para SMART)."
|
||||
},
|
||||
"persistence": {
|
||||
"heading": "Persistencia",
|
||||
"intro": "Dos ubicaciones del sistema de archivos separan el estado por sensibilidad:",
|
||||
"headerPath": "Ruta",
|
||||
"headerOwner": "Propietario",
|
||||
"headerContents": "Contenido",
|
||||
"rows": [
|
||||
{
|
||||
"path": "/usr/local/share/proxmenux/health_monitor.db",
|
||||
"owner": "root:root",
|
||||
"contents": "DB SQLite. Tablas: <code>errors</code>, <code>events</code>, <code>disk_registry</code>, <code>disk_observations</code>, <code>user_settings</code>, <code>notification_history</code>, <code>excluded_storages</code>, <code>excluded_interfaces</code>. Modo journal WAL."
|
||||
},
|
||||
{
|
||||
"path": "/usr/local/share/proxmenux/.notification_key",
|
||||
"owner": "root <code>0600</code>",
|
||||
"contents": "Clave XOR de 32 bytes usada para cifrar ajustes sensibles de notificaciones antes de guardarlos en la DB (tokens de Telegram, API keys de IA, etc.)."
|
||||
},
|
||||
{
|
||||
"path": "/root/.config/proxmenux-monitor/auth.json",
|
||||
"owner": "root:root",
|
||||
"contents": "Estado de autenticación: flag de activación, nombre de usuario, hash SHA-256 de la contraseña, secret TOTP, códigos de backup, lista de API tokens emitidos, lista de hashes de tokens revocados."
|
||||
},
|
||||
{
|
||||
"path": "/var/log/proxmenux-auth.log",
|
||||
"owner": "root:root",
|
||||
"contents": "Log de eventos de autenticación en texto plano. Siempre se escribe. Si Fail2Ban está instalado con el jail <code>[proxmenux]</code>, el jail lee este archivo para banear intentos de fuerza bruta; si no, el archivo simplemente acumula las entradas del log."
|
||||
}
|
||||
],
|
||||
"backupTitle": "Haz backup de auth.json antes de reinstalar",
|
||||
"backupBody": "Reinstalar el AppImage reemplaza el binario pero deja <code>/root/.config/proxmenux-monitor/auth.json</code> y <code>/usr/local/share/proxmenux/health_monitor.db</code> intactos. Si restauras desde un backup del host, mantén ambos archivos juntos — los API tokens guardados en <code>auth.json</code> se validan contra <code>JWT_SECRET</code>; si la DB y auth.json se desincronizan, los errores dismissed y los tokens guardados pueden comportarse mal."
|
||||
},
|
||||
"health": {
|
||||
"heading": "Ciclo del Monitor de salud",
|
||||
"intro": "Cada 5 minutos <code>health_monitor.py</code> ejecuta un ciclo determinista a través de las diez categorías mostradas en el panel:",
|
||||
"items": [
|
||||
"Servicios críticos de PVE (<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>).",
|
||||
"Pools de almacenamiento Proxmox (<code>pvesh get /storage</code> + disponibilidad por almacenamiento).",
|
||||
"Discos y sistemas de archivos: SMART, errores de I/O en dmesg, salud de pool ZFS, capacidad de puntos de montaje.",
|
||||
"VMs y CTs: arranques fallidos, guests caídos, errores QMP, fallos de apagado.",
|
||||
"Red: estado de bridge / bond, estado de enlace, latencia al gateway.",
|
||||
"Actualizaciones: actualizaciones de paquetes pendientes y parches de seguridad.",
|
||||
"Logs: detección de patrones persistentes / spike / cascada en el journal del sistema.",
|
||||
"Memoria: actividad del OOM killer, presión alta sostenida.",
|
||||
"Temperatura: sensores CPU / chasis contra umbrales del fabricante.",
|
||||
"Seguridad: fallos de autenticación, eventos de ban, estado del jail fail2ban."
|
||||
],
|
||||
"afterIntro": "Cada hallazgo se normaliza a un <code>error_key</code> + categoría + severidad estable. La capa de persistencia deduplica contra la tabla <code>errors</code> existente — los eventos repetidos actualizan <code>last_seen</code> y el contador de ocurrencias sin spamear notificaciones.",
|
||||
"cycleEnd": "El ciclo también auto-resuelve errores obsoletos usando el ajuste de <em>Suppression Duration</em> por categoría, limpia errores de recursos que ya no existen (VMs eliminadas / discos retirados / almacenamientos desmontados) y poda el log <code>events</code> con más de 30 días. El catálogo completo de categorías y la vista del panel que las expone está documentado en <link>Dashboard → Monitor de salud</link>."
|
||||
},
|
||||
"notifications": {
|
||||
"heading": "Motor de notificaciones",
|
||||
"intro": "<code>notification_manager.py</code> es el orquestador. Carga los canales configurados, posee la cola de entrega y expone tanto una API Python (para rutas Flask y el ciclo del Monitor de salud) como un punto de entrada CLI (para los scripts <code>.sh</code> de hooks que vienen con ProxMenux).",
|
||||
"items": [
|
||||
"<strong>Los watchers</strong> empujan eventos: <code>JournalWatcher</code> sigue el journal del sistema, <code>TaskWatcher</code> hace polling de la lista de tareas Proxmox, <code>ProxmoxHookWatcher</code> reacciona a hooks de backup / replicación / snapshot y <code>PollingCollector</code> gestiona fuentes de datos lentas.",
|
||||
"<strong>Las templates</strong> convierten un evento en un par (título, cuerpo). La misma template puede pasar por el proveedor de IA configurado (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) para producir una reescritura en lenguaje natural; ambas versiones se guardan en <code>notification_history</code>.",
|
||||
"<strong>Los canales</strong> entregan los mensajes: Telegram, Discord, Email, Gotify y Apprise (multicanal). Cada uno está implementado en <code>notification_channels.py</code> detrás de la misma interfaz <code>create_channel()</code> / <code>send()</code>, así que añadir un canal nuevo es una sola clase.",
|
||||
"<strong>Cifrado.</strong> Los ajustes sensibles (<code>telegram.token</code>, <code>discord.webhook_url</code>, <code>ai_api_key_*</code>, <code>email.password</code>) se cifran con XOR usando la clave en <code>.notification_key</code> antes de escribirse en la DB. El texto plano nunca toca disco."
|
||||
],
|
||||
"linksFooter": "Los toggles por evento, los overrides por canal y la configuración de IA se exponen en <notifLink>Settings → Notifications</notifLink> y <aiLink>Settings → AI Assistant</aiLink>."
|
||||
},
|
||||
"websocket": {
|
||||
"heading": "Terminal WebSocket",
|
||||
"intro": "La pestaña <em>Terminal</em> del panel es un cliente fino <code>xterm.js</code> cableado a un PTY del lado servidor a través de un WebSocket. Dos modos de transporte:",
|
||||
"items": [
|
||||
"<strong>Modo HTTP (por defecto):</strong> el servidor de desarrollo de Flask con <code>flask-sock</code> gestiona las peticiones de upgrade. Suficiente para LAN / acceso directo.",
|
||||
"<strong>Modo HTTPS / WSS:</strong> cuando hay un certificado SSL configurado, el proceso cambia a <code>gevent.pywsgi.WSGIServer</code> con <code>geventwebsocket.handler.WebSocketHandler</code>, para que los WebSockets funcionen sobre TLS sin polyfills."
|
||||
],
|
||||
"outro": "El PTY es un hijo del proceso Flask, así que hereda <code>User=root</code> de la unidad. Cada petición de terminal pasa por auth JWT; el usuario debe estar ya logueado en el panel antes de que se asigne un PTY.",
|
||||
"proxyNote": "Si accedes al Monitor a través de un reverse proxy, asegúrate de habilitar el reenvío de WebSocket (cabeceras <code>Upgrade</code> y <code>Connection</code>). Sin eso, el terminal no funcionará."
|
||||
},
|
||||
"proxy": {
|
||||
"heading": "Reverse proxy y Fail2Ban",
|
||||
"intro": "Dos salvaguardas se aseguran de que la seguridad funcione igual tanto si el panel se accede directamente como a través de un reverse proxy:",
|
||||
"items": [
|
||||
"<strong>Recuperación de la IP real del cliente.</strong> Un hook <code>before_request</code> lee <code>X-Forwarded-For</code> y <code>X-Real-IP</code> en ese orden, cayendo a <code>request.remote_addr</code>. La dirección recuperada es la que ven el log de autenticación y el rate limiting. Esto está siempre activo.",
|
||||
"<strong>Comprobación de Fail2Ban a nivel de aplicación (opcional).</strong> Cuando el panel está detrás de un proxy, el firewall del kernel no puede bloquear la IP real del atacante — la conexión siempre viene del proxy. Para tapar ese hueco, el mismo hook de arriba consulta el jail <code>proxmenux</code> de Fail2Ban cada 30 segundos, cachea el conjunto de IPs baneadas y corta las peticiones desde esas IPs con HTTP 403 dentro de Flask."
|
||||
],
|
||||
"calloutTitle": "Fail2Ban no viene incluido",
|
||||
"calloutBody": "Fail2Ban <strong>no</strong> lo instala ProxMenux Monitor por sí mismo. La comprobación a nivel de aplicación es un no-op hasta que instales Fail2Ban en el host (p. ej. vía <link>Seguridad → Fail2Ban</link> en el menú de ProxMenux). Cuando el binario <code>fail2ban-client</code> o el jail <code>proxmenux</code> está ausente, la llamada falla silenciosamente y las peticiones no se filtran — la autenticación sigue aplicándose, pero no hay baneo a nivel de IP.",
|
||||
"outro": "Los snippets de reverse proxy (Nginx / Caddy / Traefik) y el walkthrough del jail Fail2Ban están en <accessLink>Access & Authentication</accessLink> y <fail2banLink>Seguridad → Fail2Ban</fail2banLink>."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Access & Authentication",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — configuración de primer arranque, contraseña + TOTP 2FA, snippets de reverse proxy, jail Fail2Ban."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — cada endpoint, gestión de tokens, mejores prácticas de seguridad."
|
||||
},
|
||||
{
|
||||
"label": "Settings → ProxMenux Monitor",
|
||||
"href": "/docs/settings/proxmenux-monitor",
|
||||
"tail": " — el toggle del servicio dentro del menú y el flujo de verificación del estado dentro de la TUI de ProxMenux."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Hardware | ProxMenux Documentation",
|
||||
"description": "La pestaña Hardware inventaría la máquina física: CPU y placa base, módulos de memoria, sensores térmicos, GPUs (con monitorización en tiempo real por slot e instalador de drivers en un clic), aceleradoras Coral TPU, resumen de almacenamiento con comprobaciones de velocidad de enlace, listas completas de dispositivos PCI y USB, consumo de energía, PSUs, ventiladores y estado del UPS."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Hardware",
|
||||
"description": "La máquina física en una sola pantalla — identidad de CPU y placa base, cada módulo de memoria, sensores térmicos en todos los subsistemas, GPUs con utilización en vivo e instalador de drivers integrado, Coral TPUs, cada dispositivo PCI y USB con su kernel driver, el inventario completo de discos con las velocidades de enlace negociadas, además de energía, refrigeración y el UPS.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Construido a partir de herramientas estándar",
|
||||
"body": "La mayor parte de esta pestaña se parsea de <code>lscpu</code>, <code>dmidecode</code>, <code>lspci</code>, <code>lsusb</code>, <code>lsblk</code>, <code>smartctl</code>, <code>nvme</code>, <code>sensors</code>, <code>nvidia-smi</code>, <code>intel_gpu_top</code>, <code>amdgpu_top</code>, <code>ipmitool</code> y <code>upsc</code>. Las secciones solo se renderizan cuando la herramienta correspondiente devuelve datos, así que un host sin UPS no mostrará la tarjeta UPS y un host sin IPMI no mostrará cifras de energía out-of-band."
|
||||
},
|
||||
"thresholds": {
|
||||
"title": "Colores de estado y umbrales aplicados aquí",
|
||||
"intro": "Cada chip de temperatura y lectura de esta pestaña sigue la misma clasificación — <green/> <strong>verde</strong> por debajo de Warning, <amber/> <strong>ámbar</strong> entre Warning y Critical, <red/> <strong>rojo</strong> en Critical y por encima. Valores por defecto recomendados que vienen con ProxMenux:",
|
||||
"items": [
|
||||
"<strong>Temperatura de CPU</strong> — Warning 80 °C, Critical 90 °C.",
|
||||
"<strong>Temperatura de disco</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (warning / critical)."
|
||||
],
|
||||
"outro": "Cada valor es configurable por host — <link>Settings → Health Monitor Thresholds</link> es la fuente única de verdad y explica cómo ajustarlos."
|
||||
},
|
||||
"sections": {
|
||||
"heading": "Secciones",
|
||||
"intro": "La pestaña renderiza de arriba abajo en este orden. Algunas secciones solo aparecen cuando el host tiene el hardware o la herramienta correspondiente instalada — se marcan <em>(condicional)</em> abajo.",
|
||||
"systemInfoTitle": "System Information",
|
||||
"systemInfoIntro": "Dos bloques uno al lado del otro, siempre presentes:",
|
||||
"systemInfoItems": [
|
||||
"<strong>CPU</strong> — nombre del modelo, microarquitectura, sockets / cores / threads, frecuencia base / boost, flags de virtualización (VT-x / AMD-V), topología de caché.",
|
||||
"<strong>Placa base</strong> — vendor, modelo, versión de BIOS, fecha de BIOS, UUID SMBIOS. Útil para emparejar con páginas de descarga del fabricante al buscar actualizaciones de firmware."
|
||||
],
|
||||
"memoryTitle": "Memory Modules",
|
||||
"memoryBody": "Una fila por slot poblado desde <code>dmidecode</code>: etiqueta del slot, tamaño del módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidad (configurada y nominal), fabricante, part number y serial. Los slots vacíos se listan atenuados para que veas de un vistazo el margen de ampliación.",
|
||||
"thermalTitle": "Thermal Monitoring",
|
||||
"thermalIntro": "Cinco sub-bloques, cada uno alimentado por <code>lm-sensors</code> + scrapers específicos por herramienta. Un bloque se oculta cuando no hay sensores reportados en esa categoría.",
|
||||
"thermalItems": [
|
||||
"<strong>CPU</strong> — temperaturas de package y por core.",
|
||||
"<strong>GPU</strong> — sensores de GPU discreta vía <code>nvidia-smi</code> / <code>amdgpu_top</code> / iGPU Intel. Incluye hot-spot y memory-junction cuando el driver los expone.",
|
||||
"<strong>NVME</strong> — temperaturas composite + por sensor de <code>nvme</code>.",
|
||||
"<strong>PCI</strong> — sensores que aparecen como dispositivos conectados a PCI (HBAs, tarjetas de red con sensores internos).",
|
||||
"<strong>OTHER</strong> — chipset, VRM, sensores ambiente que no encajan en otro sitio."
|
||||
]
|
||||
},
|
||||
"graphics": {
|
||||
"heading": "Graphics Cards",
|
||||
"intro": "Cada controlador de vídeo detectado renderiza como su propia tarjeta con vendor, modelo, tipo (<em>Integrada</em> / <em>PCI</em> / BMC), slot PCI (BDF), kernel driver y lista de módulos. La tarjeta también expone un control inline <strong>Switch Mode</strong> que alterna la GPU entre compartición LXC (driver nativo) y passthrough a VM (<code>vfio-pci</code>) — mira <link>Switch GPU Mode (VM ↔ LXC)</link> para entender qué pasa en el host cuando lo pulsas.",
|
||||
"vfioImageAlt": "Sección Graphics Cards mostrando una GPU integrada Matrox G200EH atada a mgag200 (Ready for LXC) y una NVIDIA Quadro P400 atada a vfio-pci (Ready for VM passthrough)",
|
||||
"vfioImageCaption": "Dos GPUs detectadas: el chip BMC Matrox está en el driver nativo y listo para LXC; la NVIDIA Quadro P400 está atada a <code>vfio-pci</code>, lista para passthrough a VM.",
|
||||
"lxcImageAlt": "Sección Graphics Cards mostrando una iGPU Intel UHD Graphics en i915 y una NVIDIA Quadro P1000 en el driver nvidia, ambas etiquetadas Ready for LXC containers",
|
||||
"lxcImageCaption": "Mismo nodo después de devolver la tarjeta NVIDIA al driver nativo — ambas GPUs ahora Ready for LXC containers.",
|
||||
"realtimeTitle": "Modal de monitorización en tiempo real",
|
||||
"realtimeBody": "Pulsar una tarjeta de GPU abre una modal de monitorización por slot que sondea la herramienta del vendor adecuada cada tres segundos. La modal expone vendor, tipo, slot PCI, driver, módulo(s) del kernel, utilización en vivo de motores (Render/3D, Video, Blitter, VideoEnhance), clocks de gráficos y memoria, temperatura, consumo de potencia (cuando se reporta), uso de VRAM y una tabla Active Processes con carga de motor por proceso. Los datos se sirven desde <code>/api/gpu/<slot>/realtime</code>.",
|
||||
"toolsIntro": "La herramienta de vendor usada por GPU:",
|
||||
"headerVendor": "Vendor",
|
||||
"headerTool": "Herramienta",
|
||||
"headerProject": "Proyecto",
|
||||
"tools": [
|
||||
{
|
||||
"vendor": "NVIDIA",
|
||||
"tool": "nvidia-smi",
|
||||
"projectLabel": "developer.nvidia.com",
|
||||
"projectHref": "https://developer.nvidia.com/nvidia-system-management-interface"
|
||||
},
|
||||
{
|
||||
"vendor": "Intel iGPU",
|
||||
"tool": "intel_gpu_top (igt-gpu-tools)",
|
||||
"projectLabel": "gitlab.freedesktop.org",
|
||||
"projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools"
|
||||
},
|
||||
{
|
||||
"vendor": "AMD",
|
||||
"tool": "amdgpu_top",
|
||||
"projectLabel": "github.com/Umio-Yasuno/amdgpu_top",
|
||||
"projectHref": "https://github.com/Umio-Yasuno/amdgpu_top"
|
||||
},
|
||||
{
|
||||
"vendor": "Matrox / ASPEED (BMC)",
|
||||
"tool": "— (solo display)",
|
||||
"projectLabel": "Detectado y etiquetado como BMC; sin bloque realtime."
|
||||
}
|
||||
],
|
||||
"nvidiaImageAlt": "Modal de monitorización de GPU para una NVIDIA Quadro P1000: vendor NVIDIA, driver nvidia cargado, clock gráfico 1.26 GHz, clock de memoria 2.50 GHz, temperatura 50 °C, todas las barras de utilización de motor al 0 %, sin procesos activos, memoria total 4096 MiB",
|
||||
"nvidiaImageCaption": "NVIDIA Quadro P1000 con el driver propietario cargado — clocks, temperatura, barras de motores y procesos activos todos visibles.",
|
||||
"intelImageAlt": "Modal de monitorización de GPU para una iGPU Intel UHD Graphics en driver i915, mostrando 11.31 W de consumo, 1 % de carga en motor de video y un proceso ffmpeg consumiendo 8 MB",
|
||||
"intelImageCaption": "iGPU Intel con <code>i915</code> activo. La tabla Active Processes recoge un job ffmpeg usando el motor de video.",
|
||||
"amdImageAlt": "Modal de monitorización de GPU para una GPU integrada AMD Lucienne en driver amdgpu, con barras de utilización de motor al 0 % y amdgpu_top listado como proceso activo",
|
||||
"amdImageCaption": "iGPU AMD monitorizada a través de <code>amdgpu_top</code> — la propia herramienta aparece como proceso activo porque es el backend de polling en vivo.",
|
||||
"installTitle": "Instalar el driver NVIDIA desde la modal",
|
||||
"installBody": "Cuando una GPU NVIDIA está atada a <code>nouveau</code>/<code>nvidiafb</code> (sin driver propietario instalado), el bloque realtime no puede leer clocks, potencia ni carga por proceso. La modal entonces reemplaza las métricas con un botón <strong>Install NVIDIA Drivers</strong> que conecta directamente con el mismo script documentado en <link>Install NVIDIA Drivers (Host)</link>.",
|
||||
"noDriverAlt": "Modal de monitorización de GPU para una NVIDIA Quadro P620 con módulos de kernel nvidiafb y nouveau cargados, un callout Extended Monitoring Not Available y un botón azul Install NVIDIA Drivers",
|
||||
"noDriverCaption": "Sin driver propietario instalado todavía — la modal muestra un instalador de un solo clic.",
|
||||
"promptAlt": "Diálogo de confirmación NVIDIA GPU Driver Installation listando las GPUs detectadas, contenedores LXC con passthrough NVIDIA y un par Yes/Cancel",
|
||||
"promptCaption": "Resumen pre-instalación: GPUs detectadas, contenedores LXC que ya tienen passthrough NVIDIA y qué hará el script. No se toca nada hasta que confirmas.",
|
||||
"successAlt": "Salida de terminal mostrando el driver NVIDIA 580.105.08 instalado correctamente y nvidia-smi reportando una Quadro P620",
|
||||
"successCaption": "Instalación correcta — el <code>.run</code> de NVIDIA construido vía DKMS, el servicio de persistencia en su sitio y <code>nvidia-smi</code> reportando la GPU.",
|
||||
"warningTitle": "Elige una versión de driver que tu GPU soporte de verdad",
|
||||
"warningBody": "Las ramas más nuevas de driver NVIDIA dejan de dar soporte a familias de GPU antiguas (p. ej. Maxwell / Kepler). Si la instalación termina pero <code>nvidia-smi</code> reporta <em>\"No devices were found\"</em> o DKMS da error, lo más probable es que la rama elegida no cubra tu GPU — vuelve a lanzar el instalador y elige una rama más antigua (legacy 470.x para tarjetas de era Kepler, etc.). NVIDIA publica la compatibilidad por GPU en la <a>página oficial de búsqueda de drivers</a>.",
|
||||
"whereGoIntro": "Por dónde seguir desde aquí:",
|
||||
"whereGoItems": [
|
||||
"<link1>Install NVIDIA Drivers (Host)</link1> — recorrido completo del instalador, matriz de compatibilidad de kernel, parche opcional NVENC y propagación a LXC.",
|
||||
"<link2>Switch GPU Mode (VM ↔ LXC)</link2> — qué hace realmente el control inline <em>Switch Mode</em>.",
|
||||
"<link3>Add GPU to VM (Passthrough)</link3> y <link4>Add GPU to LXC</link4> — asignación por primera vez de una GPU sin atar."
|
||||
]
|
||||
},
|
||||
"coral": {
|
||||
"heading": "Coral TPU / Aceleradoras de IA",
|
||||
"subHeading": "(condicional)",
|
||||
"intro": "Se renderiza cuando el host tiene dispositivos Google Coral u otras aceleradoras de IA conectadas. Cada dispositivo abre una modal con su tipo de conexión (M.2 / mini-PCIe / USB), ancho de enlace PCIe, vendor / product ID, kernel driver (<code>apex</code> para PCIe, <code>libedgetpu</code> para USB), módulos del kernel (<code>gasket</code> + <code>apex</code>), nodos de dispositivo (<code>/dev/apex_*</code>), estado del runtime Edge TPU, temperatura en vivo y los umbrales de aviso de hardware del firmware.",
|
||||
"imageAlt": "Modal de detalle Coral Edge TPU: conexión PCIe / M.2, enlace PCIe 5.0 GT/s x1, vendor 1ac1:089a, kernel driver apex, módulos gasket y apex cargados, /dev/apex_0 presente, Edge TPU Runtime no instalado, temperatura 53.5 °C con umbrales de aviso de hardware",
|
||||
"imageCaption": "Coral M.2 con los módulos de kernel del host cargados, el nodo de dispositivo arriba y los avisos de temperatura del firmware expuestos. La línea del runtime se pone verde una vez instalado el runtime Edge TPU correspondiente.",
|
||||
"pathsIntro": "Existen dos rutas de instalación dependiendo del form factor:",
|
||||
"pathsItems": [
|
||||
"<strong>M.2 / Mini-PCIe</strong> — el host necesita los módulos de kernel <code>gasket</code> + <code>apex</code> construidos vía DKMS para que el nodo de dispositivo <code>/dev/apex_0</code> aparezca en el arranque.",
|
||||
"<strong>USB Accelerator</strong> — el host solo necesita el runtime de espacio de usuario Edge TPU (<code>libedgetpu1-std</code>) desde el repositorio APT de Google."
|
||||
],
|
||||
"outro": "Ambas las gestiona una única entrada de ProxMenux — <installLink>Install Coral TPU on the Host</installLink> — que auto-detecta lo que tienes. El contexto y el runtime oficial viven en <a>coral.ai/docs</a>. Una vez listo el lado del host, entrega el dispositivo a un contenedor con <lxcLink>Add Coral TPU to LXC</lxcLink>."
|
||||
},
|
||||
"storage": {
|
||||
"heading": "Storage Summary",
|
||||
"intro": "Cada dispositivo de bloque que conoce el kernel, agrupado por tipo. Para cada disco obtienes el nombre del kernel (<code>sda</code>, <code>nvme0n1</code>, <code>zram0</code> …), la etiqueta de tipo (<em>SSD</em>, <em>HDD</em>, <em>NVMe SSD</em>), la cadena del modelo y la información del enlace negociado. Pulsa cualquier disco para abrir una modal de info de hardware con modelo, serial, capacidad, interfaz y velocidad de enlace actual vs máxima.",
|
||||
"imageAlt": "Tarjeta Storage Summary listando once dispositivos de bloque (SSDs SATA, HDDs SATA, SSDs NVMe y zram) con cadenas de modelo y velocidades de enlace negociadas; los dos discos NVMe muestran 3.0 x4 con la velocidad actual resaltada",
|
||||
"imageCaption": "Once dispositivos en este nodo. Los enlaces SATA se imprimen como <em>SATA <version>, <Gb/s> (current: ...)</em>; los discos NVMe se imprimen como <em><PCIe gen> x<width></em>.",
|
||||
"nvmeBody": "Para los discos NVMe la línea por tarjeta muestra tanto el enlace negociado como el máximo que soporta el dispositivo. Cuando ambos no coinciden (p. ej. un SSD Gen3 x4 corriendo a <strong>3.0 x1</strong> porque está sentado en un slot del chipset cableado a un solo lane), la velocidad actual se renderiza en ámbar para que el downgrade sea visible de un vistazo — útil al diagnosticar discos inesperadamente lentos o después de que una actualización de BIOS reorganice los lanes.",
|
||||
"nvmeModalAlt": "Modal de detalle de disco NVMe para nvme0n1: tipo NVMe SSD, 953.9 GB de capacidad, velocidad actual de enlace 3.0 x1 resaltada en ámbar, velocidad máxima 3.0 x4, modelo WDC CL SN720, número de serie, interfaz PCIe/NVMe",
|
||||
"nvmeModalCaption": "Modal NVMe mostrando el downgrade de lanes — el disco soporta x4 pero el slot está cableado x1.",
|
||||
"outro": "Los datos SMART, los self-tests, el historial y el informe PDF de disco viven una pestaña a la derecha, en <storageLink>Panel: pestaña Almacenamiento</storageLink>. Los mismos datos alimentan el script en <smartLink>SMART Disk Health & Test</smartLink> — lanzar un test long desde el script escribe el JSON que el Monitor muestra en <em>Storage → History</em>."
|
||||
},
|
||||
"pci": {
|
||||
"heading": "PCI Devices",
|
||||
"intro": "Cada dispositivo direccionable por PCI, identificado por su <strong>BDF PCI</strong> (Bus:Device.Function — p. ej. <code>03:00.0</code>) y su clase de dispositivo (<em>Storage Controller</em>, <em>USB Controller</em>, <em>Graphics Card</em>, <em>Network Controller</em>, <em>Audio Controller</em> …). Cada tarjeta muestra el fabricante, el nombre del dispositivo y el <strong>kernel driver actualmente atado</strong> — que es el campo que realmente quieres al diagnosticar passthrough, grupos IOMMU o una tarjeta que el host no esté manejando correctamente.",
|
||||
"imageAlt": "Sección PCI Devices listando quince dispositivos agrupados por clase: storage controllers en ahci/nvme, USB controllers, tarjetas gráficas (una en vfio-pci, otra en el driver nativo), network controllers en igb / tg3, un audio controller junto a una GPU pasada por passthrough",
|
||||
"imageCaption": "Quince dispositivos en este nodo. Fíjate en la GPU y su función de audio compañera, ambas atadas a <code>vfio-pci</code> — esa es una tarjeta preparada para passthrough a VM.",
|
||||
"bdfTitle": "Leer el BDF",
|
||||
"bdfBody": "<code>03:00.0</code> significa bus PCI <code>03</code>, dispositivo <code>00</code>, función <code>0</code>. Los dispositivos multifunción como las GPUs discretas suelen reclamar <code>.0</code> para la GPU y <code>.1</code> para la función de audio HDMI — ambos hay que pasarlos por passthrough juntos, por eso <link>Switch GPU Mode</link> también gestiona la limpieza de la función de audio huérfana al salir del modo VM."
|
||||
},
|
||||
"usb": {
|
||||
"heading": "USB Devices",
|
||||
"intro": "Cada dispositivo USB que enumera el host, con cadenas de fabricante / producto, versión USB, la dirección <code>bus:device</code>, el par <code>vendor:product</code> y el kernel driver. El renderer también clasifica roles comunes — <em>Communications</em> (sticks Z-Wave / Zigbee), <em>UPS</em>, almacenamiento, HID — para que veas de un vistazo cuál de tus sticks es cuál sin cruzar IDs.",
|
||||
"imageAlt": "Tarjeta USB Devices listando tres dispositivos: un Z-Stick Z-Wave Aeotec, un coordinador Zigbee ConBee II y un UPS Ellipse ECO, cada uno con versión USB, dirección, vendor:product ID y driver atado",
|
||||
"imageCaption": "Tres dispositivos USB — dos radios de domótica en <code>usbfs</code> y un UPS en <code>usbfs</code> (NUT le habla a través de libusb)."
|
||||
},
|
||||
"power": {
|
||||
"heading": "Power Consumption",
|
||||
"subHeading": "(condicional)",
|
||||
"intro": "Se renderiza solo cuando el host expone telemetría de energía. Se exponen dos fuentes independientes cuando están disponibles:",
|
||||
"items": [
|
||||
"<strong>Consumo total ACPI / IPMI</strong> — watios de todo el sistema desde un sensor a nivel de placa o el BMC. Típico en placas de servidor.",
|
||||
"<strong>Consumo de package CPU</strong> — leído de los contadores Intel RAPL (o equivalente AMD). Útil para separar el consumo de CPU del resto del sistema en placas consumer que no exponen una cifra total."
|
||||
],
|
||||
"supplyImageAlt": "Sección Power Consumption mostrando 198 W de consumo total vía interfaz ACPI, más una tarjeta Power Supplies con dos PSUs ambas reportando OK (salida de 185 W y 5 W)",
|
||||
"supplyImageCaption": "Placa de servidor con un único sensor de energía ACPI y PSUs duales reportadas a través de IPMI — la segunda PSU es la redundante, en idle a 5 W.",
|
||||
"cpuImageAlt": "Sección Power Consumption en una placa consumer mostrando solo CPU Power 8.7 W vía Intel RAPL",
|
||||
"cpuImageCaption": "Placa consumer sin sensor de todo el sistema — la sección cae a RAPL solo-CPU."
|
||||
},
|
||||
"psu": {
|
||||
"heading": "Power Supplies",
|
||||
"subHeading": "(condicional)",
|
||||
"body": "Máquinas con placa de servidor / PSU dual vía IPMI: presencia (PSU 1 / PSU 2 / …), voltaje de entrada, watios de salida, flag OK / failed. Lo primero que compruebas tras un parpadeo de luz en un nodo con PSUs redundantes."
|
||||
},
|
||||
"fans": {
|
||||
"heading": "System Fans",
|
||||
"subHeading": "(condicional)",
|
||||
"body": "RPM por ventilador con un pequeño sparkline (cuando se soporta). En placas sin reporte por ventilador la sección cae a una única lectura del ventilador de chasis."
|
||||
},
|
||||
"ups": {
|
||||
"heading": "UPS Status",
|
||||
"subHeading": "(condicional)",
|
||||
"body": "Se renderiza cuando hay un servidor NUT (Network UPS Tools) configurado y accesible. Muestra: estado (online / on battery / charging / low battery), porcentaje de carga de batería, estimación de runtime, porcentaje de carga, voltaje de entrada, modelo y firmware. Los mismos datos alimentan la categoría <em>Security & Certificates</em> del Monitor de salud — un UPS que pasa a batería sale inmediatamente."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Cómo se recopilan los datos",
|
||||
"headerSection": "Sección de la pestaña",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Inventario estático (PCI, CPU, BIOS)",
|
||||
"endpoint": "/api/hardware",
|
||||
"source": "<code>lspci -vmm</code>, <code>/proc/cpuinfo</code>, <code>dmidecode</code>; cacheado durante toda la vida del proceso."
|
||||
},
|
||||
{
|
||||
"section": "Valores de sensores en vivo",
|
||||
"endpoint": "/api/hardware/live",
|
||||
"source": "<code>sensors</code> (lm-sensors), temperaturas de package, RPM de ventiladores. Refrescado en cada petición."
|
||||
},
|
||||
{
|
||||
"section": "Historial de temperatura de CPU",
|
||||
"endpoint": "/api/temperature/history",
|
||||
"source": "Serie temporal muestreada por el Monitor de salud cada 5 min y persistida a SQLite."
|
||||
},
|
||||
{
|
||||
"section": "Métricas en vivo de GPU",
|
||||
"endpoint": "/api/gpu/<slot>/realtime",
|
||||
"source": "NVIDIA: <code>nvidia-smi --query-gpu=...</code>. Intel: <code>intel_gpu_top</code>. AMD: sysfs <code>/sys/class/drm/cardN</code>."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Cross-check del inventario contra la vista del SO",
|
||||
"codeComment2": "# Confirmar la tarjeta GPU que ve el panel"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Install NVIDIA Drivers (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — lo que ejecuta el botón de instalación de la modal de GPU."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — lo que el conmutador de modo inline en cada tarjeta de GPU le hace al host."
|
||||
},
|
||||
{
|
||||
"label": "Install Coral TPU on the Host",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — la instalación del módulo de kernel / runtime de Coral."
|
||||
},
|
||||
{
|
||||
"label": "SMART Disk Health & Test",
|
||||
"href": "/docs/disk-manager/smart-disk-test",
|
||||
"tail": " — el script detrás de los datos SMART que muestra la vista en detalle de disco de la pestaña Almacenamiento."
|
||||
},
|
||||
{
|
||||
"label": "Panel: pestaña Almacenamiento",
|
||||
"href": "/docs/monitor/dashboard/storage",
|
||||
"tail": " — tabla completa de atributos SMART, historial de self-tests e informe PDF."
|
||||
},
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — la categoría CPU y Temperatura que consume los mismos sensores."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — los endpoints de hardware y GPU."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — el resto de pestañas."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel | ProxMenux Documentation",
|
||||
"description": "El panel es la UI principal de ProxMenux Monitor: nueve pestañas (Resumen del sistema, Almacenamiento, Red, VMs y LXCs, Hardware, Logs del sistema, Terminal, Seguridad, Settings) más la cabecera global con la información de estado del Monitor de salud."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel",
|
||||
"description": "El panel es la vista del día a día de ProxMenux Monitor — nueve pestañas, cada una centrada en una parte del host, más una cabecera global con la información de estado del Monitor de salud, la identidad del nodo y el control de refresco rápido.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"oneHeader": {
|
||||
"title": "Una cabecera, nueve pestañas",
|
||||
"body": "La cabecera (logo, nombre del nodo, información de estado, uptime, refresco, conmutador de tema) permanece visible en todo momento. La pestaña activa que hay debajo cambia el área de contenido entera. El color de la información de estado refleja la peor categoría del <link>Monitor de salud</link> — es el mismo dato visto desde el panel."
|
||||
},
|
||||
"tabs": {
|
||||
"heading": "Las nueve pestañas",
|
||||
"intro": "Cada pestaña tiene su propia página dedicada. Las páginas se añaden de forma incremental a medida que se completa la documentación; abajo está la lista completa con lo que cubre cada una.",
|
||||
"headerTab": "Pestaña",
|
||||
"headerOwns": "De qué se encarga",
|
||||
"rows": [
|
||||
{
|
||||
"name": "Resumen del sistema",
|
||||
"linksTo": "/docs/monitor/dashboard/system-overview",
|
||||
"owns": "Widgets de CPU / memoria / temperatura, contador de VMs y LXCs activos, gráficas de métricas históricas, resúmenes de almacenamiento y red. Pestaña por defecto al entrar."
|
||||
},
|
||||
{
|
||||
"name": "Almacenamiento",
|
||||
"owns": "Pools de Proxmox, discos físicos, datos SMART, estado de ZFS, desgaste y vida útil, historial de observaciones."
|
||||
},
|
||||
{
|
||||
"name": "Red",
|
||||
"owns": "Cada interfaz (física / bond / bridge / OVS), IP/MAC, gráficas RX/TX, RRD histórica por interfaz."
|
||||
},
|
||||
{
|
||||
"name": "VMs y LXCs",
|
||||
"owns": "Inventario de guests, vista en detalle de config / métricas / logs, acciones start / stop / reboot / shutdown."
|
||||
},
|
||||
{
|
||||
"name": "Hardware",
|
||||
"owns": "Modelo y topología de CPU, distribución de memoria, topología PCIe, GPUs con monitorización en tiempo real por slot."
|
||||
},
|
||||
{
|
||||
"name": "Logs del sistema",
|
||||
"owns": "<code>journalctl</code> en vivo con filtros, historial de tareas de Proxmox, log de notificaciones, paquetes de logs descargables."
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"owns": "Shell en el navegador al host o a cualquier VM/CT, sobre <code>xterm.js</code> y WebSockets."
|
||||
},
|
||||
{
|
||||
"name": "Seguridad",
|
||||
"owns": "Configuración de autenticación, contraseña / 2FA / tokens API, log de auditoría, panel opcional de Fail2Ban, despliegue de Secure Gateway."
|
||||
},
|
||||
{
|
||||
"name": "Settings",
|
||||
"owns": "Canales de notificación, proveedor de IA, duraciones de supresión, branding, flags avanzados."
|
||||
}
|
||||
]
|
||||
},
|
||||
"headerAnatomy": {
|
||||
"heading": "Anatomía de la cabecera",
|
||||
"items": [
|
||||
"<strong>Logo de ProxMenux.</strong> El logo cambia a la variante \"actualización disponible\" cuando se detecta una nueva release del Monitor.",
|
||||
"<strong>Identidad del nodo</strong> — el nombre del nodo Proxmox resuelto desde <code>pvesh get /nodes</code>, con fallback a <code>hostname</code>.",
|
||||
"<strong>Información del estado de salud</strong> — Healthy (verde), Warning (amarillo), Critical (rojo). Pulsa encima para abrir la modal del Monitor de salud. Aparece una insignia azul extra de <em>info</em> cuando hay items descartados que siguen dentro de su ventana de supresión.",
|
||||
"<strong>Uptime</strong> — tiempo desde el último arranque del host, formateado de forma legible.",
|
||||
"<strong>Botón de refresco</strong> — relanza todas las llamadas API en vivo sin recargar la página entera.",
|
||||
"<strong>Conmutador de tema</strong> — claro / oscuro / sistema. Persiste en <code>localStorage</code>."
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Pestaña Resumen del sistema",
|
||||
"href": "/docs/monitor/dashboard/system-overview",
|
||||
"tail": " — la pestaña por defecto, documentada al completo."
|
||||
},
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — la modal detrás de la información de estado, vista en profundidad de las diez categorías."
|
||||
},
|
||||
{
|
||||
"label": "Arquitectura",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — cómo habla el panel con el backend Flask."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Red | ProxMenux Documentation",
|
||||
"description": "La pestaña Red inventaría cada interfaz del host: NICs físicas, bridges, bonds, VLANs y las interfaces virtuales de VM/LXC. La vista en detalle por interfaz muestra IP / MAC / estado / miembros del bond / tráfico desde el arranque y una gráfica RRD histórica."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Red",
|
||||
"description": "Cada interfaz que reporta el kernel — NICs físicas, bridges, bonds, VLANs y puertos virtuales de VM/LXC — agrupadas en tres tarjetas. Cada fila es pulsable y abre una vista en detalle con direccionamiento, contadores de tráfico y datos RRD históricos.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "En vivo + histórico, ambos incluidos",
|
||||
"body": "El estado en vivo viene de <code>psutil.net_if_stats()</code> y <code>ip</code>; el ancho de banda histórico del almacén RRD de Proxmox vía <code>/api/network/<interface>/metrics</code>. La página refresca cada ~5 segundos los contadores en vivo y obtiene datos RRD frescos bajo demanda para la gráfica."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Fila superior: cuatro tarjetas de estadísticas",
|
||||
"headerCard": "Tarjeta",
|
||||
"headerWhat": "Qué muestra",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Network Traffic",
|
||||
"what": "Tasa agregada RX / TX a lo largo de todas las interfaces, formateada en la unidad correcta (bps / Kbps / Mbps / Gbps)."
|
||||
},
|
||||
{
|
||||
"card": "Active Interfaces",
|
||||
"what": "Dos contadores: <em>Physical X / Y</em> y <em>Bridges X / Y</em> (activas sobre total). El primer contador que miras cuando algo deja de funcionar."
|
||||
},
|
||||
{
|
||||
"card": "Network Status",
|
||||
"what": "Veredicto rápido — Healthy / Warning / Critical en función del estado del enlace, alcanzabilidad del gateway e integridad del bridge. Refleja la categoría <em>Network Interfaces</em> del Monitor de salud."
|
||||
},
|
||||
{
|
||||
"card": "Network Latency",
|
||||
"what": "Round-trip time al gateway con un sparkline. Pulsar la tarjeta abre la <strong>modal Network Latency</strong> documentada más abajo — vista histórica + test de ping bajo demanda contra gateway / Cloudflare / Google con un informe PDF descargable."
|
||||
}
|
||||
]
|
||||
},
|
||||
"groups": {
|
||||
"heading": "Tres grupos de interfaces",
|
||||
"intro": "Bajo la fila superior, tres tarjetas dividen el inventario por rol. Cada tarjeta tiene su propia insignia de recuento de activas en la cabecera. El <strong>tipo</strong> de interfaz se identifica de un vistazo mediante una insignia coloreada en cada fila:",
|
||||
"badges": [
|
||||
"Azul <strong>Physical</strong> — NIC real.",
|
||||
"Verde <strong>Bridge</strong> — bridge Linux o bridge OVS (<code>vmbr*</code>).",
|
||||
"Morado <strong>Bond</strong> — agregador bond / LACP / active-backup.",
|
||||
"Cian <strong>VLAN</strong> — sub-interfaz VLAN (<code>vmbr0.10</code>, <code>eno1.42</code>, …)."
|
||||
],
|
||||
"clickable": "<strong>Cada fila es pulsable</strong> — física, virtual, bridge o bond — y abre la vista en detalle por interfaz descrita más abajo (info básica, IPs, contadores de tráfico, gráfica RX/TX histórica del almacén RRD de Proxmox).",
|
||||
"physicalTitle": "Physical Interfaces",
|
||||
"physicalBody": "Cada NIC que el kernel ve como un dispositivo real — <code>eno1</code>, <code>enp4s0</code>, <code>eth0</code>, <code>wlp3s0</code>, etc. Una fila por dispositivo con la insignia azul <strong>Physical</strong> y el estado del enlace. Los <em>miembros del bond</em> (NICs esclavizadas a un bond) también se muestran aquí, con una pista que apunta al bond padre.",
|
||||
"bridgeTitle": "Bridge Interfaces",
|
||||
"bridgeBody": "Bridges Linux (<code>vmbr0</code>, <code>vmbr1</code>, …) y los bridges OVS que gestiona Proxmox. Cada fila muestra la insignia verde <strong>Bridge</strong>, la interfaz física subyacente (cuando es un bridge de un solo puerto) y el estado del bridge. Los bonds visibles en esta capa reciben la insignia morada <strong>Bond</strong>; las sub-interfaces VLAN reciben la insignia cian <strong>VLAN</strong>.",
|
||||
"vmTitle": "VM / LXC Interfaces",
|
||||
"vmBody": "Las interfaces <code>tap*</code> y <code>veth*</code> creadas cuando arrancan los guests — una por NIC virtual. La cabecera de la tarjeta muestra <em>X / Y Active</em>; las filas enlazan con el VM/CT al que pertenecen, así que puedes saltar directamente al guest en la pestaña VMs y LXCs. Las entradas inactivas quedan por un instante después de que un guest se pare; envejecen y se eliminan en el siguiente ciclo de refresco."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Vista en detalle por interfaz",
|
||||
"intro": "Pulsar cualquier fila abre una modal con cinco bloques:",
|
||||
"headerBlock": "Bloque",
|
||||
"headerContents": "Contenido",
|
||||
"rows": [
|
||||
{
|
||||
"block": "Basic Information",
|
||||
"contents": "Nombre de la interfaz, tipo (física / bridge / bond / VLAN / vm), dirección MAC, estado (up / down), MTU y la interfaz física subyacente para los tipos no físicos."
|
||||
},
|
||||
{
|
||||
"block": "Bond Members",
|
||||
"contents": "Solo para bonds. Lista cada NIC esclavizada con el flag active / failed, el modo del bond (active-backup / 802.3ad / balance-alb / …) y la interfaz primaria cuando está configurada."
|
||||
},
|
||||
{
|
||||
"block": "IP Addresses",
|
||||
"contents": "Cada dirección IPv4 / IPv6 con su longitud de prefijo. Las direcciones link-local autoconfiguradas se listan pero salen atenuadas."
|
||||
},
|
||||
{
|
||||
"block": "Gráfica histórica",
|
||||
"contents": "Ancho de banda RX / TX sobre el timeframe seleccionado (1 hora / 24 horas / 7 días / 30 días / 1 año), traído de <code>/api/network/<interface>/metrics</code> (RRD de Proxmox)."
|
||||
},
|
||||
{
|
||||
"block": "Tráfico desde el último arranque",
|
||||
"contents": "Bytes y paquetes totales RX / TX desde el último arranque del host, más contadores de errores y descartes."
|
||||
}
|
||||
],
|
||||
"inactiveTitle": "Las interfaces inactivas siguen abriendo la vista en detalle",
|
||||
"inactiveBody": "Para una interfaz <em>down</em>, la modal renderiza un pequeño banner \"Interface Inactive\" y omite los contadores en vivo. La configuración (direcciones, miembros del bond) y los datos históricos siguen mostrándose — útil al diagnosticar por qué falló algo y cuándo."
|
||||
},
|
||||
"latency": {
|
||||
"heading": "Modal Network Latency",
|
||||
"intro": "Pulsar la tarjeta <em>Network Latency</em> de la fila superior abre una modal dedicada. Tiene dos modos (histórico y test bajo demanda), tres opciones de destino y un informe PDF descargable.",
|
||||
"targetsTitle": "Destinos",
|
||||
"targetsIntro": "Un desplegable de destino en lo alto de la modal selecciona contra qué se hace ping:",
|
||||
"targets": [
|
||||
"<strong>Gateway</strong> — tu router de la LAN. Solo testea el tramo de red local; útil cuando sospechas de un problema de switch / cableado y quieres descartar la WAN.",
|
||||
"<strong>Cloudflare (1.1.1.1)</strong> — resolutor DNS público, red anycast. Testea el tramo WAN.",
|
||||
"<strong>Google (8.8.8.8)</strong> — destino público alternativo, útil como verificación sanity o cuando Cloudflare está degradado regionalmente."
|
||||
],
|
||||
"mode1Title": "Modo 1 — Vista histórica",
|
||||
"mode1Alt": "Modal Network Latency en modo histórico — destino Gateway con un timeframe de 1 hora y las muestras pasadas ploteadas",
|
||||
"mode1Caption": "Vista histórica — destino Gateway sobre la última hora, alimentada desde la base de datos de historial de latencia que el hilo recolector de temperatura/latencia escribe cada 60 segundos.",
|
||||
"mode1Body1": "El modo por defecto al abrir la modal. Un segundo desplegable elige el timeframe (<em>1 Hour / 24 Hours / 7 Days / 30 Days / 1 Year</em>); la resolución de los datos baja con la ventana para que la gráfica se mantenga legible. Las estadísticas titulares — Current / Min / Avg / Max — se renderizan encima de la gráfica, con una pastilla de estado (Excellent / Good / Fair / Poor) que refleja el valor actual frente a los umbrales de abajo.",
|
||||
"mode1Body2": "Fuente: las mismas muestras de latencia que usa el Monitor de salud para detectar ralentizaciones persistentes de red — muestreadas cada 60 segundos contra el gateway por el hilo en background <code>_temperature_collector_loop</code>, escritas a un historial SQLite local.",
|
||||
"mode2Title": "Modo 2 — Test en tiempo real",
|
||||
"mode2Alt": "Modal Network Latency ejecutando un test de ping en tiempo real contra Cloudflare — barra de progreso al 50%, muestras en vivo acumulándose en la gráfica",
|
||||
"mode2Caption": "Test en tiempo real contra Cloudflare — ejecución de 2 minutos con una lectura cada 5 segundos, muestras ploteadas según llegan. Pulsa <em>Stop</em> para terminar antes; <em>Test Again</em> añade más muestras al mismo dataset.",
|
||||
"mode2Intro": "Cambiar el destino a Cloudflare o Google arranca un test de ping bajo demanda. Comportamiento:",
|
||||
"mode2Items": [
|
||||
"<strong>Duración</strong> — 2 minutos por ejecución, con barra de progreso y un contador de segundos restantes.",
|
||||
"<strong>Cadencia</strong> — una lectura cada 5 segundos (24 lecturas por ejecución).",
|
||||
"<strong>Método</strong> — ICMP Echo Request (<code>ping</code>), 3 pings consecutivos por muestra, latencia promediada.",
|
||||
"<strong>Stop</strong> — termina el test inmediatamente; los datos parciales se preservan.",
|
||||
"<strong>Test Again</strong> — añade nuevas muestras al dataset existente en lugar de empezar de cero, así puedes construir un registro más largo a lo largo de varias ejecuciones.",
|
||||
"<strong>Pastilla de estado en vivo</strong> — se reevalúa tras cada muestra con los mismos umbrales Excellent / Good / Fair / Poor."
|
||||
],
|
||||
"thresholdsTitle": "Umbrales de rendimiento",
|
||||
"headerStatus": "Estado",
|
||||
"headerRange": "Rango",
|
||||
"headerImpact": "Impacto práctico",
|
||||
"thresholdRows": [
|
||||
{
|
||||
"status": "Excellent",
|
||||
"range": "< 50 ms",
|
||||
"impact": "Óptimo para apps en tiempo real, gaming y videollamadas."
|
||||
},
|
||||
{
|
||||
"status": "Good",
|
||||
"range": "50 – 100 ms",
|
||||
"impact": "Aceptable para la mayoría de aplicaciones con impacto mínimo."
|
||||
},
|
||||
{
|
||||
"status": "Fair",
|
||||
"range": "100 – 200 ms",
|
||||
"impact": "Retardo perceptible. Puede afectar a VoIP y apps interactivas."
|
||||
},
|
||||
{
|
||||
"status": "Poor",
|
||||
"range": "> 200 ms",
|
||||
"impact": "Latencia significativa. Se recomienda investigar."
|
||||
}
|
||||
],
|
||||
"reportTitle": "Network Latency Report (PDF)",
|
||||
"reportIntro": "Ambos modos tienen un botón <strong>Report</strong> junto al selector de destino. Pulsarlo genera un PDF con todo lo que enviarías a tu ISP si quisieras argumentar un mal servicio.",
|
||||
"reportPreviewAlt": "Primera página del PDF Network Latency Report — Executive Summary con el gauge, estadísticas de latencia, la gráfica de latencia y la guía de umbrales",
|
||||
"reportPreviewCaption": "Primera página del Network Latency Report — Executive Summary con el dial del gauge y las estadísticas titulares, la gráfica de latencia por segundo y la guía de umbrales. De la página 2 en adelante está la tabla por muestra y la metodología.",
|
||||
"downloadLabel": "Descargar informe de ejemplo Network Latency (PDF)",
|
||||
"sectionsIntro": "El informe tiene seis secciones:",
|
||||
"sections": [
|
||||
"<strong>Executive Summary</strong> — dial del gauge (0–300+ ms con zonas verde / amarilla / roja), el veredicto de estado (EXCELLENT / GOOD / FAIR / POOR), el destino / modo / recuento de muestras y un resumen de una línea sobre packet loss.",
|
||||
"<strong>Latency Statistics</strong> — Current / Min / Avg / Max como cuatro tiles grandes, más Sample Count, Packet Loss (avg) y Test Period.",
|
||||
"<strong>Latency Graph</strong> — gráfica de área de cada muestra a lo largo de la ventana del test con una rejilla en el eje y de min/avg/max.",
|
||||
"<strong>Performance Thresholds</strong> — la misma escala de cuatro niveles documentada arriba, con un punto coloreado por nivel.",
|
||||
"<strong>Detailed Test Results</strong> — tabla numerada con timestamp, latencia, packet loss y estado para cada muestra. Útil para detectar micro-ráfagas que esconden los promedios titulares.",
|
||||
"<strong>Methodology</strong> — método del test (ICMP Echo Request), muestras por test (3 pings consecutivos), nombre del destino, IP del destino y un párrafo final \"Performance Assessment\" derivado del veredicto."
|
||||
],
|
||||
"useCaseTitle": "Caso de uso: reclamaciones a tu ISP",
|
||||
"useCaseBody": "Ejecuta el test en tiempo real contra Cloudflare durante 2 minutos en un momento de lentitud percibida, después pulsa <em>Test Again</em> unas cuantas veces para extender el dataset y finalmente <em>Report</em>. El PDF lleva la tabla completa por muestra más el bloque de metodología — los ISPs suelen aceptar esto como evidencia, sobre todo si está correlacionado con timestamps de una reclamación aparte."
|
||||
},
|
||||
"excluding": {
|
||||
"heading": "Excluir interfaces ruidosas",
|
||||
"body1": "Igual que los almacenamientos, las interfaces individuales se pueden excluir de la monitorización de salud — útil para bridges deshabilitados a propósito, interfaces de test o NICs físicamente retiradas pero que siguen en la configuración. El flag se guarda en la tabla <code>excluded_interfaces</code> y lo respeta el ciclo del Monitor de salud: sin warnings, sin notificaciones, sin contribución a la pastilla de estado de la cabecera.",
|
||||
"body2": "Desde el menú contextual de la fila, elige <em>Exclude from monitoring</em>. La interfaz sigue visible en el panel con una insignia morada <strong>excluded</strong>, y puedes reactivar la monitorización desde el mismo menú."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Cómo se recopilan los datos",
|
||||
"headerSection": "Sección de la pestaña",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Inventario de interfaces",
|
||||
"endpoint": "/api/network",
|
||||
"source": "<code>ip -j addr</code> + <code>ip -j link</code> + introspección de bond / bridge."
|
||||
},
|
||||
{
|
||||
"section": "Tarjetas resumen",
|
||||
"endpoint": "/api/network/summary",
|
||||
"source": "Agregación sobre el inventario más recuentos up/down por interfaz."
|
||||
},
|
||||
{
|
||||
"section": "Serie temporal RX/TX por interfaz",
|
||||
"endpoint": "/api/network/<iface>/metrics",
|
||||
"source": "<code>/proc/net/dev</code> muestreado por el Monitor de salud con cálculo de byte-rate."
|
||||
},
|
||||
{
|
||||
"section": "Latencia: actual",
|
||||
"endpoint": "/api/network/latency/current",
|
||||
"source": "Una ráfaga corta de <code>ping</code> contra el gateway / destino configurado."
|
||||
},
|
||||
{
|
||||
"section": "Latencia: histórica",
|
||||
"endpoint": "/api/network/latency/history",
|
||||
"source": "Muestras persistidas — cada 5 min por el ciclo del Monitor de salud."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Cross-check del estado de interfaz que ve el panel",
|
||||
"codeComment2": "# Verificar una sonda de latencia actual de extremo a extremo"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — la categoría Red y los umbrales del historial de latencia."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — los endpoints de red y latencia."
|
||||
},
|
||||
{
|
||||
"label": "Integraciones",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — el scrape de Prometheus expone las mismas métricas de red."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — el resto de pestañas."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Red",
|
||||
"href": "/docs/network",
|
||||
"tail": " — la cara de las acciones: análisis de bridges, nombres persistentes de interfaz, backup y reinicio, iperf3."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Seguridad | ProxMenux Documentation",
|
||||
"description": "La pestaña Seguridad agrupa cada control relacionado con protección en dos columnas: ProxMenux Monitor (Autenticación, SSL/HTTPS, tokens API, Secure Gateway) y Proxmox VE (Firewall, Fail2Ban, auditoría Lynis). Asistente paso a paso de Secure Gateway, recorrido de auditoría Lynis, instalación de Fail2Ban y ajuste de reglas."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Seguridad",
|
||||
"description": "Cada control de seguridad del panel, agrupado en dos bloques claramente etiquetados: configuración del propio Monitor (auth, SSL, tokens, Secure Gateway) y configuración del host Proxmox al que vigila (firewall, Fail2Ban, Lynis).",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Dos ámbitos, una pestaña",
|
||||
"body": "La pestaña Seguridad está dividida en dos secciones claramente separadas: <strong>ProxMenux Monitor</strong> (settings para el propio panel) y <strong>Proxmox VE</strong> (settings para el host de debajo). Las tarjetas se renderizan de forma condicional — Fail2Ban y Lynis solo aparecen una vez instalados."
|
||||
},
|
||||
"monitor": {
|
||||
"heading": "ProxMenux Monitor",
|
||||
"intro": "Cuatro tarjetas controlan cómo se alcanza y autentica el propio panel."
|
||||
},
|
||||
"auth": {
|
||||
"heading": "Autenticación",
|
||||
"imageAlt": "Tarjeta Authentication mostrando estado Enabled, Logout, Change Password, info de Two-Factor Authentication, botones Enable Two-Factor Authentication y Disable Authentication",
|
||||
"imageCaption": "Tarjeta Authentication con auth activa — insignia de estado, Change Password, Enable 2FA y la acción (destructiva) Disable Authentication.",
|
||||
"intro": "La tarjeta te permite gestionar el login del propio panel. El flujo completo de primer arranque, política de contraseñas, pantallas de alta de TOTP y recuperación de authenticator perdido están documentados en <link>Acceso y autenticación</link> — esta tarjeta es la superficie del día a día para esos settings:",
|
||||
"items": [
|
||||
"<strong>Authentication Status</strong> — insignia mostrando <em>Enabled</em> / <em>Disabled</em> / <em>Declined</em>.",
|
||||
"<strong>Change Password</strong> — contraseña actual + nueva contraseña + confirmación.",
|
||||
"<strong>Enable / Disable Two-Factor Authentication</strong> — abre el diálogo de alta con QR al activar, pide la contraseña actual al desactivar.",
|
||||
"<strong>Disable Authentication</strong> — acción destructiva que vuelve a mostrar el diálogo de primer arranque <em>Protect your dashboard?</em> en la siguiente visita."
|
||||
]
|
||||
},
|
||||
"ssl": {
|
||||
"heading": "SSL / HTTPS",
|
||||
"imageAlt": "Tarjeta SSL / HTTPS mostrando estado HTTP No SSL, certificado del host Proxmox detectado con Subject, Issuer, Expires, botón Use Proxmox Certificate y opción Use Custom Certificate",
|
||||
"imageCaption": "Tarjeta SSL / HTTPS con HTTPS apagado. El Monitor detecta el certificado ya instalado en el host Proxmox y lo ofrece como opción de un solo clic, con un fallback a <em>Use Custom Certificate</em> si tienes tus propios archivos en otro sitio.",
|
||||
"intro": "Sirve el panel sobre HTTPS sin ningún reverse proxy por delante. La tarjeta auto-detecta el certificado que usa el propio Proxmox (bajo <code>/etc/pve/local/</code>) y muestra el subject, issuer y expiración para que lo puedas verificar antes de activar. Dos rutas para activar HTTPS:",
|
||||
"items": [
|
||||
"<strong>Use Proxmox Certificate</strong> — un clic. El Monitor reutiliza el certificado instalado en el host. Buena opción para usuarios que ya tienen su PVE corriendo en el mismo nombre DNS que el panel.",
|
||||
"<strong>Use Custom Certificate</strong> — pega rutas absolutas a tus propios archivos <code>.pem</code> de certificado y <code>.key</code> de clave privada. Las rutas se validan antes de reiniciar el servicio; si la carga falla, el panel cae a HTTP automáticamente (sin estado roto)."
|
||||
],
|
||||
"enabledAlt": "Tarjeta SSL/HTTPS con estado HTTPS Enabled, Active Certificate mostrando rutas pve-ssl.pem y pve-ssl.key, y un botón Disable HTTPS",
|
||||
"enabledCaption": "HTTPS activo — la tarjeta expone el certificado actualmente en uso, las rutas de archivos y una acción <em>Disable HTTPS</em> que vuelve a HTTP en el mismo puerto.",
|
||||
"acmeTitle": "ACME / Let's Encrypt vía Proxmox",
|
||||
"acmeBody": "Si tu nodo Proxmox ya tiene Let's Encrypt configurado en <em>Datacenter → Certificates → ACME</em>, ese es el certificado que el host sirve a los navegadores — y eso es lo que el panel reutiliza al pulsar <em>Use Proxmox Certificate</em>. No necesitas fontanería ACME separada para el Monitor.",
|
||||
"walkthroughLink": "Para un recorrido paso a paso — incluyendo cómo el Monitor auto-detecta el certificado subido por ACME, qué se escribe a disco y cómo caer a un par <code>.pem</code> / <code>.key</code> custom — mira <link>HTTPS para ProxMenux Monitor</link>."
|
||||
},
|
||||
"apiTokens": {
|
||||
"heading": "Tokens de acceso API",
|
||||
"emptyAlt": "Tarjeta API Access Tokens en estado vacío con caja info About API Tokens y botón Generate New API Token",
|
||||
"emptyCaption": "Tarjeta API Access Tokens en una instalación recién hecha — la caja <em>About API Tokens</em> resume lifetime, uso y cómo embeber el token en cabeceras <code>Authorization: Bearer</code>.",
|
||||
"intro": "Tokens de vida larga (1 año) para integraciones desatendidas — widgets Homepage, sensores REST de Home Assistant, scrapers de Grafana, flujos n8n, scripts propios. La tarjeta te lleva por tres estados: vacío → formulario → generado.",
|
||||
"generateBody": "<strong>Generar un token.</strong> Pulsa <em>Generate New API Token</em>. El formulario pide un <em>Token Name</em> descriptivo (ayuda a identificarlo después en la lista activa) y tu <em>contraseña</em> como confirmación de segundo factor. Si 2FA está activo, el formulario pide adicionalmente el código TOTP actual.",
|
||||
"generateAlt": "Formulario API Access Tokens generate con input Token Name, input Password, botones Generate Token y Cancel",
|
||||
"generateCaption": "El formulario Generate API Token — rellena un nombre y confirma con tu contraseña (y TOTP si 2FA está activo).",
|
||||
"saveBody": "<strong>Guarda el token inmediatamente.</strong> La cadena completa del token se muestra <strong>solo una vez</strong> tras generarlo. La tarjeta lo destaca con un aviso ámbar y un botón de copia. No hay forma de recuperarlo después — solo verás el prefix en la lista Active Tokens.",
|
||||
"generatedAlt": "Token API generado correctamente con token enmascarado, botón de copia, instrucciones para cabecera Authorization Bearer y lista Active Tokens con prefix",
|
||||
"generatedCaption": "Token generado — el valor se muestra una vez con un botón de copia y el snippet exacto <code>Authorization: Bearer</code>. Debajo, la lista Active Tokens mantiene nombre + prefix + fecha de creación para que puedas revocar tokens individuales después.",
|
||||
"outro": "La tarjeta muestra cada token activo con un botón <em>Revoke</em> por fila. Revocar invalida el token inmediatamente; cualquier integración que lo use deja de funcionar desde ese momento. Los cookbooks para Homepage, Home Assistant, n8n y Prometheus están en <link>Integraciones</link>."
|
||||
},
|
||||
"gateway": {
|
||||
"heading": "Secure Gateway",
|
||||
"cardAlt": "Tarjeta Secure Gateway con botón Deploy Secure Gateway antes de que se haya desplegado ningún gateway",
|
||||
"cardCaption": "Tarjeta Secure Gateway en setup recién hecho — un botón arranca el asistente.",
|
||||
"intro": "Alcanza el panel, la UI web de Proxmox y cualquier guest desde cualquier sitio en tu tailnet de <a>Tailscale</a>, sin exponer ningún puerto a la internet pública. El Monitor despliega un contenedor LXC Alpine en el host corriendo <code>tailscaled</code> como subnet router; una vez aprobado en la consola de admin de Tailscale, tus dispositivos remotos alcanzan la IP de LAN del host desde cualquier sitio.",
|
||||
"wizardTitle": "Asistente paso a paso",
|
||||
"wizardIntro": "Antes de pulsar <em>Deploy Secure Gateway</em>, genera una auth key en tu consola de admin de Tailscale — el asistente la pedirá en el paso 2.",
|
||||
"step0Title": "0. Generar la auth key de Tailscale",
|
||||
"step0Body": "Entra en <a>login.tailscale.com/admin/settings/keys</a> y pulsa <em>Generate auth key…</em>. Elige una key <em>pre-autenticada</em> (para que el gateway no necesite un login interactivo de Tailscale) y copia el valor — se muestra solo una vez.",
|
||||
"step0Alt": "Consola de admin de Tailscale, página Settings Keys con el botón Generate auth key resaltado",
|
||||
"step0Caption": "Consola de admin de Tailscale — <em>Settings → Keys → Generate auth key…</em>. Usa una cuenta gratuita de Tailscale si aún no tienes (link dentro del asistente).",
|
||||
"step1Title": "1. Abrir el asistente",
|
||||
"step1Body": "De vuelta en la pestaña Seguridad, pulsa <em>Deploy Secure Gateway</em>. El primer paso es una intro con lo que vas a obtener y lo que necesitas.",
|
||||
"step1Alt": "Paso intro del asistente Secure Gateway Setup explicando qué provee el gateway: acceso VPN, sin port forwarding, cifrado de extremo a extremo",
|
||||
"step1Caption": "Paso 1 — resumen de lo que provee el Secure Gateway y recordatorio de que necesitarás una cuenta gratuita de Tailscale.",
|
||||
"step2Title": "2. Tailscale Authentication",
|
||||
"step2Body": "Pega la auth key del paso 0 y elige un hostname (así es como aparecerá el gateway en la consola de admin de Tailscale — típicamente <code>proxmox-gateway</code> o el nombre de tu nodo).",
|
||||
"step2Alt": "Paso del asistente Secure Gateway pidiendo Tailscale Auth Key y Device Hostname con link para generar la key",
|
||||
"step2Caption": "Paso 2 — pega la pre-auth key y elige el hostname del dispositivo. El link debajo del campo abre la página de Tailscale del paso 0 si te lo saltaste.",
|
||||
"step3Title": "3. Access Scope",
|
||||
"step3Intro": "Elige a qué puede llegar tu tailnet a través del gateway:",
|
||||
"step3Items": [
|
||||
"<strong>Proxmox Only</strong> — solo la UI de Proxmox y el Monitor. La menor superficie de ataque.",
|
||||
"<strong>Full Local Network</strong> — la subred LAN entera (auto-detectada desde la interfaz primaria del host). Te permite alcanzar NAS, impresoras, VMs y cualquier otro dispositivo de la LAN.",
|
||||
"<strong>Custom Subnets</strong> — lista CIDRs específicos. Para setups multi-VLAN donde quieres exponer algunos segmentos pero no otros."
|
||||
],
|
||||
"step3Alt": "Paso Access Scope del asistente Secure Gateway con tres opciones: Proxmox Only, Full Local Network, Custom Subnets",
|
||||
"step3Caption": "Paso 3 — elige el access scope. <em>Full Local Network</em> se autorrellena con la subred LAN detectada.",
|
||||
"step4Title": "4. Advanced Options (opcional)",
|
||||
"step4Intro": "Dos toggles opcionales. Ambos <strong>off por defecto</strong>:",
|
||||
"step4Items": [
|
||||
"<strong>Exit Node</strong> — cuando se activa y se selecciona desde un dispositivo remoto, todo el tráfico de internet de ese dispositivo sale por la WAN del host Proxmox. Útil para escenarios de viaje donde quieres que el tráfico de tu móvil parezca de casa.",
|
||||
"<strong>Accept Routes</strong> — deja que este gateway alcance redes anunciadas por <em>otros</em> subnet routers del tailnet (para setups multi-sitio)."
|
||||
],
|
||||
"step4Alt": "Paso Advanced Options del asistente Secure Gateway con checkboxes Exit Node y Accept Routes",
|
||||
"step4Caption": "Paso 4 — Exit Node y Accept Routes. Salta ambos si lo único que quieres es acceso al panel desde tu móvil o portátil.",
|
||||
"step5Title": "5. Review & Deploy",
|
||||
"step5Body": "Resumen final antes de que arranque el deploy. El asistente te recuerda que aún queda un paso manual en el admin de Tailscale tras desplegar: <strong>aprobar la subnet route</strong>.",
|
||||
"step5Alt": "Paso Review and Deploy del asistente Secure Gateway con Configuration Summary mostrando hostname, access mode, networks, exit node, accept routes y un botón Deploy Gateway",
|
||||
"step5Caption": "Paso 5 — revisa la configuración y despliega. El aviso azul al pie señala la aprobación de ruta pendiente.",
|
||||
"approvalTitle": "Un último paso manual en el admin de Tailscale",
|
||||
"approvalBody": "Tras desplegar, vuelve a <a>login.tailscale.com/admin/machines</a> y aprueba la subnet route que el gateway está anunciando. Hasta que lo hagas, los dispositivos remotos de tu tailnet no podrán alcanzar realmente IPs de LAN a través del gateway. Tailscale marca las rutas pendientes con un aviso amarillo en la fila del dispositivo — pulsa <em>Edit route settings</em> y marca la casilla de la ruta."
|
||||
},
|
||||
"pve": {
|
||||
"heading": "Proxmox VE",
|
||||
"intro": "Las protecciones del propio host — firewall, prevención de intrusiones y auditoría de seguridad. Los dos últimos solo se renderizan cuando sus herramientas respectivas están instaladas."
|
||||
},
|
||||
"firewall": {
|
||||
"heading": "Proxmox Firewall",
|
||||
"imageAlt": "Tarjeta Proxmox Firewall mostrando estado de Cluster Firewall y Host Firewall, Quick Access Rules para ProxMenux Monitor y Proxmox Web UI, contadores Rules Overview y una lista de Firewall Rules con botón Add Rule",
|
||||
"imageCaption": "Tarjeta Proxmox Firewall — toggles enable / disable a nivel cluster y host, puertos comunes como <em>Quick Access Rules</em>, totales en <em>Rules Overview</em> y la lista completa de reglas con <em>+ Add Rule</em>.",
|
||||
"intro": "La tarjeta expone el firewall integrado de Proxmox VE (que es independiente de cualquier <code>iptables</code> / <code>nftables</code> a nivel host que puedas correr en paralelo). Tres bloques:",
|
||||
"items": [
|
||||
"<strong>Cluster Firewall + Host Firewall</strong> — toggles globales. El cluster firewall debe estar activo para que cualquier regla a nivel host surta efecto; la tarjeta señala esta dependencia inline.",
|
||||
"<strong>Quick Access Rules</strong> — filas predefinidas para puertos que importan al propio ProxMenux: <code>8008/TCP</code> (Monitor), <code>8006/TCP</code> (UI web de Proxmox). Cada fila muestra el estado actual allow / deny / unprotected. La UI web de Proxmox se permite vía el macro de firewall <em>integrado</em> de Proxmox y no se puede eliminar por accidente.",
|
||||
"<strong>Rules Overview</strong> — contadores de reglas totales, reglas accept, reglas drop / reject y puertos distintos protegidos. Los números se leen de <code>/etc/pve/firewall/cluster.fw</code> y <code>/etc/pve/nodes/<node>/host.fw</code>.",
|
||||
"<strong>Firewall Rules</strong> — lista completa con action / protocolo / puerto / source / level. <em>+ Add Rule</em> abre un editor inline; el icono de papelera en cada fila elimina la regla. Las ediciones escriben a los mismos archivos que usa Proxmox, así que los cambios también aparecen en la UI de Proxmox (Datacenter / Node → Firewall)."
|
||||
]
|
||||
},
|
||||
"fail2ban": {
|
||||
"heading": "Fail2Ban",
|
||||
"subHeading": "(condicional)",
|
||||
"whatIs": "<strong>Qué es.</strong> Fail2Ban es un daemon open-source de prevención de intrusiones que vigila archivos de log buscando intentos repetidos fallidos de login y banea la IP ofensora a nivel de firewall. Es la respuesta de facto a los escáneres de fuerza bruta que pegan SSH y formularios de login web 24/7. ProxMenux lo conecta a tres jails por defecto: SSH, el login de la UI web de Proxmox (puerto 8006) y el login del ProxMenux Monitor (puerto 8008).",
|
||||
"notBundled": "Fail2Ban <strong>no viene de fábrica</strong>. La tarjeta detecta si está instalado y se adapta: cuando falta ofrece una instalación de un clic; una vez instalado muestra estado en vivo de jails, IPs baneadas y te deja ajustar retries / ban time por jail.",
|
||||
"notInstalledAlt": "Tarjeta Fail2Ban mostrando estado Not Installed con explicación de lo que configuraría: SSH, UI web de Proxmox y protección de ProxMenux Monitor con backend nftables, más un botón Install and Configure Fail2Ban",
|
||||
"notInstalledCaption": "Tarjeta Fail2Ban antes de instalar — la caja azul previsualiza lo que configuraría la instalación.",
|
||||
"clickBody": "Pulsa <em>Install and Configure Fail2Ban</em> y obtienes una modal de confirmación listando cada cambio que hará el script en el host:",
|
||||
"confirmAlt": "Modal de confirmación Install Fail2Ban listando protección SSH modo agresivo, protección de interfaz web Proxmox puerto 8006, protección ProxMenux Monitor puerto 8008, backend nftables auto-detectado, ajuste del log level de journald y hardening de SSH MaxAuthTries",
|
||||
"confirmCaption": "Confirmación de instalación — lista explícita de jails, ajustes al log level de journald (para que el jail de auth pueda leer eventos SSH) y un efecto colateral de hardening SSH (<code>MaxAuthTries=3</code>).",
|
||||
"confirmIntro": "La confirmación dispara un panel de instalación en streaming (apt + config de jails + tests). La misma fontanería que el instalador CLI de ProxMenux.",
|
||||
"progressAlt": "Panel Fail2Ban Installation mostrando log de instalación en vivo: instalación del paquete, journald MaxLevelStore ajustado para logging de auth, jails configurados, backend nftables detectado, hardening MaxAuthTries, test de comunicación fail2ban-client, mensaje de finalización",
|
||||
"progressCaption": "Instalación en curso — cada paso se loguea en el panel. Connection-closed al final marca el fin de la sesión de streaming.",
|
||||
"afterInstall": "Tras instalar la tarjeta pasa a la vista de estado en vivo: jails configurados, contador de IPs baneadas, eventos recientes de ban. Las pestañas grandes separan <em>Jails & Banned IPs</em> de <em>Recent Activity</em> (las últimas N entradas del log de Fail2Ban).",
|
||||
"activeAlt": "Tarjeta Fail2Ban tras instalar con estado Active, tres jails configurados (proxmenux, proxmox, sshd), contador Banned IPs, Total Bans, Failed Attempts, y filas por jail con retries, ban time, window e icono de rueda dentada",
|
||||
"activeCaption": "Fail2Ban activo — los tres jails por defecto (<code>proxmenux</code>, <code>proxmox</code>, <code>sshd</code>) con sus settings de retries / ban time / window.",
|
||||
"tuneBody": "<strong>Ajustar reglas del jail.</strong> Pulsa el icono de rueda dentada en cualquier fila de jail para ajustar <em>Max Retries</em>, <em>Ban Time</em> (usa ban permanente si quieres que los ofensores queden bloqueados hasta que tú los desbanees manualmente) y <em>Find Time</em> (la ventana deslizante para contar retries). Los valores comunes están documentados dentro del formulario.",
|
||||
"configAlt": "Formulario Configure jail sshd con Max Retries, Ban Time en segundos con opción Permanent Ban, Find Time, recordatorio de valores comunes y botón Save Configuration",
|
||||
"configCaption": "Editando el jail sshd — elige un <em>Max Retries</em> más estricto para SSH si solo te logueas desde tu propia subred, o extiende el <em>Ban Time</em> para el panel de cara al público.",
|
||||
"outro": "El recorrido completo <em>Qué instala / cómo se configura / cómo desinstalar</em> — incluyendo la ruta de instalación manual, el efecto colateral de SSH MaxAuthTries y la relación con el journal <code>proxmenux-auth.log</code> — está en <link>ProxMenux → Seguridad → Fail2Ban</link>.",
|
||||
"calloutTitle": "Sin Fail2Ban, la protección contra fuerza bruta es best-effort",
|
||||
"calloutBody": "ProxMenux Monitor tiene su propio hook de ban a <em>nivel de aplicación</em> en el pipeline de peticiones de Flask — pero solo surte efecto si Fail2Ban está instalado y escribe a la tabla de bans. Sin Fail2Ban, el Monitor loguea los logins fallidos a <code>proxmenux-auth.log</code> para inspección futura pero no bloquea IPs activamente."
|
||||
},
|
||||
"lynis": {
|
||||
"heading": "Lynis Security Audit",
|
||||
"subHeading": "(condicional)",
|
||||
"whatIs": "<strong>Qué es.</strong> Lynis es una herramienta open-source de auditoría de seguridad que ejecuta ~280 tests en el host (permisos de archivos, hardening del kernel, config SSH, vulnerabilidades de paquetes, política de cripto, tareas programadas, banner grabbing, etc.) y produce una puntuación de hardening 0–100, una lista de warnings y una lista de sugerencias. Es la baseline de facto para \"¿este servidor está en buena forma?\" en servidores basados en Debian.",
|
||||
"whyUseful": "<strong>Por qué es útil.</strong> Conocer la postura de seguridad de tu servidor es difícil de hacer leyendo archivos de config uno a uno. Lynis captura las cosas que rutinariamente se pasan por alto: flags de hardening del kernel ausentes, cifrados SSH débiles activos, journal no persistente, <code>NOPASSWD</code> en sudoers para cuentas por defecto, y muchas más. Volver a ejecutarlo tras aplicar los ajustes post-instalación de ProxMenux te da un número objetivo de la mejora.",
|
||||
"notInstalledAlt": "Tarjeta Lynis Security Audit con estado Not Installed y botón Install Lynis, listando features: scoring de hardening, detección de vulnerabilidades, comprobación de compliance y fuente GitHub",
|
||||
"notInstalledCaption": "Tarjeta Lynis antes de instalar — la caja azul resume lo que hace la herramienta.",
|
||||
"notBundled": "Lynis tampoco <strong>viene de fábrica</strong>. ProxMenux instala la última release directamente desde la fuente oficial en GitHub (no el paquete Debian, que va varias versiones menores por detrás).",
|
||||
"confirmAlt": "Modal de confirmación Install Lynis listando lo que hace Lynis: scoring de hardening, detección de vulnerabilidades, análisis de configuración, comprobación de compliance, fuente desde el repositorio oficial de GitHub",
|
||||
"confirmCaption": "Confirmación de instalación — explícita sobre la fuente GitHub.",
|
||||
"progressAlt": "Panel en streaming Lynis Installation: instalando la última herramienta de scan, versión 3.1.6 confirmada, mensaje de instalación completada",
|
||||
"progressCaption": "Instalación en curso — el mismo patrón de panel en streaming que Fail2Ban.",
|
||||
"afterInstall": "Tras instalar la tarjeta muestra la versión y un historial de auditorías vacío. Pulsa <em>Run Security Audit</em> para arrancar el primer scan.",
|
||||
"installedAlt": "Tarjeta Lynis Security Audit tras instalar con insignia versión 3.1.6 Installed, timestamp Last Scan, Hardening Index 0, Warnings 0, Suggestions 0, fila de audit report vacía y botón Run Security Audit",
|
||||
"installedCaption": "Lynis instalado, sin auditoría todavía. La tarjeta prerrellena los tiles de métricas con ceros.",
|
||||
"runningAlt": "Tarjeta Lynis Security Audit mientras la auditoría está corriendo mostrando mensaje Security audit in progress, duración estimada de 2-5 minutos y un botón Running Audit deshabilitado",
|
||||
"runningCaption": "Auditoría en curso — el botón de acción muestra un spinner y la tarjeta avisa explícitamente de que el scan puede llevar 2–5 minutos.",
|
||||
"finishedBody": "Cuando termina, la tarjeta pasa a la vista de resultados: hardening index, warnings, suggestions y una lista <em>Audit Reports</em> con cada scan histórico.",
|
||||
"resultsAlt": "Tarjeta Lynis Security Audit con resultados: Hardening Index 71 con desglose Lynis 66 PVE 71, 3 warnings, 40 suggestions, barra de progreso Security Hardening Score Proxmox Adjusted 71 de 100 en el rango Good, lista de audit reports con descarga PDF y botón Run Security Audit",
|
||||
"resultsCaption": "Resultados de auditoría — Hardening Index <strong>71/100 (Good)</strong> en una ejecución de ejemplo. La tarjeta también muestra la \"puntuación raw de Lynis\" (66) frente a la puntuación ajustada para Proxmox (71) que devuelve 11 puntos por hallazgos que el corpus de tests de Lynis marca pero que son comportamiento esperado en Proxmox VE.",
|
||||
"scoreTitle": "Puntuación raw de Lynis vs puntuación ajustada para Proxmox",
|
||||
"scoreIntro": "Lynis trae reglas ajustadas para Debian de propósito general. Proxmox diverge legítimamente de algunas (servicios corriendo como root por razones de cluster, tuning custom de <code>journald</code>, etc.). La tarjeta muestra ambos números para que puedas:",
|
||||
"scoreItems": [
|
||||
"Trackear tu <em>puntuación raw de Lynis</em> igual que lo harían auditores externos.",
|
||||
"Trackear la puntuación <em>ajustada para Proxmox</em> — una baseline más justa si estás comparando nodos dentro del mismo cluster."
|
||||
],
|
||||
"reportBody": "<strong>El informe completo.</strong> Cada fila de auditoría en la lista tiene un botón <em>PDF</em> que descarga un informe de varias páginas con el resumen ejecutivo, info del sistema, postura de seguridad, cada warning con explicación, cada sugerencia rankeada por impacto y el inventario de paquetes. Es el artefacto que adjuntarías a una revisión de seguridad.",
|
||||
"reportAlt": "Primera página de ejemplo del PDF Lynis Security Audit Report mostrando resumen ejecutivo con hardening 71 de 100, contadores de warnings y suggestions, bloque de System Information con hostname, kernel, versión de Lynis, fecha del informe, resumen de postura de seguridad",
|
||||
"reportCaption": "Primera página de un informe descargado — resumen ejecutivo, System Information y resumen de postura de seguridad. El informe completo continúa con warnings detallados, sugerencias y la lista de paquetes instalados. Hay un <a>PDF de ejemplo</a> adjunto como referencia.",
|
||||
"runPeriodically": "Ejecuta la auditoría periódicamente (tras grandes upgrades de Proxmox, tras aplicar ajustes post-instalación, antes de abrir una ruta de acceso remoto) y guarda los informes — la tendencia importa más que cualquier número aislado.",
|
||||
"outro": "El recorrido completo <em>Qué instala / cómo se configura / cómo desinstalar</em> y un análisis escrito del informe de ejemplo están en <link>ProxMenux → Seguridad → Lynis</link>."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Cómo se recopilan los datos",
|
||||
"headerCard": "Tarjeta",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Autenticación, 2FA, cambio de contraseña",
|
||||
"endpoint": "/api/auth/*",
|
||||
"source": "SQLite local + JWT emitido por el Monitor."
|
||||
},
|
||||
{
|
||||
"card": "SSL / HTTPS",
|
||||
"endpoint": "/api/auth/ssl/*",
|
||||
"source": "<code>openssl x509</code> sobre <code>/etc/pve/local/pve-ssl.pem</code> + <code>/etc/proxmenux/ssl_config.json</code>."
|
||||
},
|
||||
{
|
||||
"card": "Listar / generar / revocar tokens API",
|
||||
"endpoint": "/api/auth/api-tokens",
|
||||
"source": "Filas de token guardadas localmente; nada sale del host."
|
||||
},
|
||||
{
|
||||
"card": "Secure Gateway (deploy + estado)",
|
||||
"endpoint": "/api/oci/*",
|
||||
"source": "Provisiona LXC Alpine + <code>tailscaled</code> vía <code>pct create</code> / <code>pct exec</code>."
|
||||
},
|
||||
{
|
||||
"card": "Estado y reglas de firewall",
|
||||
"endpoint": "/api/security/firewall/*",
|
||||
"source": "<code>pve-firewall</code> + <code>/etc/pve/firewall/<cluster|host>.fw</code>."
|
||||
},
|
||||
{
|
||||
"card": "Fail2Ban (solo cuando está instalado)",
|
||||
"endpoint": "/api/security/fail2ban/*",
|
||||
"source": "<code>fail2ban-client status</code>, <code>/var/log/fail2ban.log</code>, <code>/etc/fail2ban/jail.local</code>."
|
||||
},
|
||||
{
|
||||
"card": "Auditoría Lynis (solo cuando está instalada)",
|
||||
"endpoint": "/api/security/lynis/*",
|
||||
"source": "Ejecuta <code>lynis audit system</code> en background; informe parseado desde <code>/var/log/lynis-report.dat</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Acceso y autenticación",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — flujo completo de primer arranque, selector de app 2FA, recuperación de authenticator perdido, snippets de reverse proxy."
|
||||
},
|
||||
{
|
||||
"label": "Integraciones",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — cookbooks para usar tokens API con Homepage, Home Assistant, Prometheus, n8n y el Secure Gateway de extremo a extremo."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tailRich": " — cada endpoint <code>/api/auth</code>, <code>/api/security</code> y <code>/api/oci</code> con método, body y ejemplos curl."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Seguridad → Fail2Ban",
|
||||
"href": "/docs/security/fail2ban",
|
||||
"tail": " — recorrido de instalación, jails configurados, ruta de instalación manual."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Seguridad → Lynis",
|
||||
"href": "/docs/security/lynis",
|
||||
"tail": " — informe de ejemplo, interpretación del score, cuándo volver a ejecutarlo."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,327 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Settings | ProxMenux Documentation",
|
||||
"description": "La pestaña Settings agrupa las preferencias del panel (unidades de red, duraciones de supresión, exclusiones de almacenamiento / interfaz), el panel embebido de notificaciones + IA y un inventario transparente de cada optimización post-instalación de ProxMenux actualmente activa en el host con acceso al código fuente."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Settings",
|
||||
"description": "Preferencias del panel, exclusiones de monitorización, el panel embebido de configuración de notificaciones + IA y un inventario en vivo de las optimizaciones post-instalación de ProxMenux actualmente activas en el host.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Dónde vive realmente cada setting",
|
||||
"body": "La pestaña Settings es una superficie única para varias preocupaciones distintas: cómo renderiza el panel, qué vigila el Monitor de salud, cómo salen las alertas y qué ha cambiado ya ProxMenux en el host. Las tarjetas que tienen su propia página de documentación profunda enlazan en lugar de duplicar el contenido aquí — Settings es el punto de entrada, no el manual."
|
||||
},
|
||||
"networkUnits": {
|
||||
"heading": "Network Units",
|
||||
"imageAlt": "Tarjeta Network Units con desplegable Network Unit Display puesto en Bytes",
|
||||
"imageCaption": "Elige entre bits por segundo y bytes por segundo para cada rate de red mostrado en el panel.",
|
||||
"body": "Elige cómo se muestra el throughput de red a lo largo del panel: <strong>bits por segundo</strong> (Mbps / Gbps) o <strong>bytes por segundo</strong> (MB/s / GB/s). Bits es el valor por defecto porque es como los fabricantes de NICs e ISPs etiquetan sus productos; bytes es lo que reportan la mayoría de herramientas de transferencia de archivos. El setting afecta cada gráfica, insignia y tooltip que muestra rate de red — aplicado inmediatamente, sin recargar."
|
||||
},
|
||||
"health": {
|
||||
"heading": "Monitor de salud",
|
||||
"intro": "La tarjeta expone el setting <strong>Suppression Duration</strong> por categoría — una vez se descarta una alerta, cuánto tiene que pasar antes de que se permita al escáner volver a dispararla. Cada una de las diez categorías del Monitor de salud (CPU, Memoria, Almacenamiento, Discos, Red, VMs, Servicios PVE, Logs, Updates, Seguridad) tiene su propio desplegable con estos valores:",
|
||||
"items": [
|
||||
"<strong>24 h</strong> — por defecto para la mayoría de categorías transitorias.",
|
||||
"<strong>72 h</strong> — para eventos sobre los que quieres unos días de silencio.",
|
||||
"<strong>168 h</strong> (1 semana) y <strong>720 h</strong> (1 mes) — chequeos periódicos.",
|
||||
"<strong>8760 h</strong> (1 año) — efectivamente \"silencio en el futuro previsible\".",
|
||||
"<strong>-1</strong> — silencio permanente hasta que lo reactives manualmente.",
|
||||
"<strong>Custom hours</strong> — cualquier entero si necesitas un valor intermedio."
|
||||
],
|
||||
"imageAlt": "Card Settings → Monitor de salud con los desplegables de supresión por categoría y la sección Active Suppressions",
|
||||
"imageCaption": "Card Monitor de salud — los desplegables por categoría fijan los valores por defecto para nuevos dismisses; la sección Active Suppressions debajo lista cada alerta actualmente silenciada y permite revertirlas.",
|
||||
"editTitle": "Modo Edit",
|
||||
"editBody": "La tarjeta es de solo-lectura por defecto. Pulsa <strong>Edit</strong> en la esquina superior derecha de la card para activar los desplegables y los botones Re-enable. <strong>Save</strong> confirma todos los cambios pendientes (cambios de Suppression Duration y re-enables encolados) en un solo lote; <strong>Cancel</strong> los descarta todos. El botón Save solo se activa cuando hay al menos un cambio pendiente.",
|
||||
"activeTitle": "Active Suppressions",
|
||||
"activeIntro": "Debajo de los desplegables de Suppression Duration, la sección <strong>Active Suppressions</strong> lista cada alerta actualmente silenciada — tanto los dismisses time-limited (24 h, 7 días, ventanas custom) como los <em>Permanent</em>. Cada fila muestra:",
|
||||
"activeItems": [
|
||||
"Un badge coloreado — <strong>Permanent</strong> (ámbar) o una cuenta atrás como <strong>24h remaining</strong> / <strong>7d remaining</strong> (azul).",
|
||||
"El identificador de la alerta, normalizado para legibilidad (p. ej. <code>pve_storage_full_PBS-Cloud</code> → <em>PVE Storage Full: PBS-Cloud</em>).",
|
||||
"Categoría, severidad y el timestamp en que se descartó la alerta.",
|
||||
"Un botón <strong>Re-enable</strong> (activo solo en modo Edit) que encola la alerta para ser un-acknowledged al siguiente Save."
|
||||
],
|
||||
"activeReenableTitle": "Flujo de Re-enable",
|
||||
"activeReenableBody": "Pulsar <strong>Re-enable</strong> en modo Edit marca la fila en verde y tacha su identificador — está encolada pero todavía no aplicada. Volver a hacer clic en la misma fila la <strong>Undo</strong> (la saca de la cola). Cuando pulsas <strong>Save</strong>, cada re-enable encolado dispara <code>POST /api/health/un-acknowledge</code> en paralelo y las filas afectadas desaparecen de la lista. Si la condición subyacente sigue presente y la categoría soporta re-fire, la alerta reaparece en la lista Active del Monitor de salud en el siguiente ciclo de escaneo.",
|
||||
"activePermanentNote": "Los dismisses permanentes (alertas descartadas con <em>Permanently</em> desde el modal del Monitor, o aquellas cuya categoría tenga el default puesto a <code>-1</code>) <strong>solo se pueden revertir desde aquí</strong>. El modal del dashboard no expone un botón un-dismiss para ellas — el panel Active Suppressions es el único log de auditoría + UI de revert.",
|
||||
"activeAutoRefreshTitle": "Auto-refresh",
|
||||
"activeAutoRefreshBody": "La lista se refresca automáticamente cuando descartas o un-dismiss una alerta desde el modal del Monitor de salud (vía un evento in-browser), cuando la pestaña recupera el foco y al cambio de visibilidad. No necesitas recargar la página tras descartar una alerta desde el dashboard.",
|
||||
"calloutTitle": "La semántica completa vive en la página del Monitor de salud",
|
||||
"calloutBody": "Las reglas de escalada (cuándo un re-fire pasa a critical), el comportamiento de auto-resolve para eventos cuyo dispositivo subyacente desaparece y la diferencia entre dismissed y resolved — todo documentado bajo <link>Monitor de salud → Descartar alertas y la Suppression Duration</link>. Esta tarjeta solo expone los desplegables por categoría y el panel Active Suppressions."
|
||||
},
|
||||
"thresholds": {
|
||||
"heading": "Health Monitor Thresholds",
|
||||
"intro": "Donde la tarjeta anterior decide <em>cuánto tiempo quedarse callado tras un dismiss</em>, esta decide <strong>a qué valor se dispara una alerta en primer lugar</strong>. Cada chequeo que ejecuta el Monitor de salud está parametrizado por un par de números — un umbral <strong>Warning</strong> y un umbral <strong>Critical</strong> — y ambos se exponen aquí para que el operador los ajuste.",
|
||||
"whatForTitle": "Para qué sirve",
|
||||
"whatForIntro": "Los valores por defecto que vienen con ProxMenux son sensatos para el host Proxmox medio, pero cada entorno tiene su propio sobre operativo:",
|
||||
"whatForItems": [
|
||||
"Un homelab pequeño con un SSD único puede querer avisar antes en capacidad (75 / 90 %) para dejar margen a snapshots.",
|
||||
"Un host de datacenter con nodos Ceph redundantes puede ser más relajado en avisos de memoria (un working set al 90 % es normal bajo ARC de ZFS).",
|
||||
"Un mini-PC con refrigeración pasiva necesita umbrales de temperatura más bajos que un servidor con refrigeración forzada por aire — misma clase de drive, sobre físico distinto.",
|
||||
"Un host muy virtualizado que clava CPU durante builds no debería avisar en cada pico del 80 %, pero sí debe seguir alertando sobre presión sostenida."
|
||||
],
|
||||
"whatForOutro": "Editar un umbral surte efecto <strong>en el siguiente scan</strong> — el Monitor de salud relee los valores desde <code>/usr/local/share/proxmenux/health_thresholds.json</code> en cada ciclo, sin reinicio de servicio. Los mismos números también alimentan los rangos de color de los widgets del panel (la línea de temperatura en la modal de temperatura de disco, las barras de las tarjetas de almacenamiento) para que la clasificación visual coincida con lo que dispara la alerta.",
|
||||
"coloursTitle": "Colores de estado: cómo renderizan Warning y Critical en el panel",
|
||||
"coloursIntro": "Cada umbral de abajo produce la misma clasificación de tres estados a lo largo del panel — los mismos colores para barras de almacenamiento, anillos de CPU/memoria, chips de temperatura y el punto de la modal de disco. Leer un color en cualquier sitio del Monitor mapea a un rango definido relativo al par configurado:",
|
||||
"headerColour": "Color",
|
||||
"headerRange": "Rango",
|
||||
"headerMeaning": "Significado",
|
||||
"colourRows": [
|
||||
{
|
||||
"colour": "Verde",
|
||||
"range": "valor < Warning",
|
||||
"meaning": "Rango operativo normal. No se dispara alerta."
|
||||
},
|
||||
{
|
||||
"colour": "Ámbar",
|
||||
"range": "Warning ≤ valor < Critical",
|
||||
"meaning": "Estado warning. El Monitor de salud dispara un evento de severidad WARNING; las notificaciones respetan los filtros del canal y las Quiet Hours."
|
||||
},
|
||||
{
|
||||
"colour": "Rojo",
|
||||
"range": "valor ≥ Critical",
|
||||
"meaning": "Estado critical. El Monitor de salud dispara un evento CRITICAL; CRITICAL salta las Quiet Hours y siempre alcanza al canal."
|
||||
}
|
||||
],
|
||||
"sectionsTitle": "Secciones y valores por defecto recomendados",
|
||||
"sectionsIntro": "Estos son los valores con los que viene ProxMenux — la baseline recomendada. Es lo que ves en un host recién montado hasta que sobreescribes algo. Las secciones están ordenadas de arriba abajo de <em>cómputo</em> → <em>calor</em> → <em>capacidad de almacenamiento</em>, así que leer hacia abajo va de lo concreto (carga actual) al estado acumulado (espacio libre).",
|
||||
"headerSection": "Sección",
|
||||
"headerWarning": "Warning",
|
||||
"headerCritical": "Critical",
|
||||
"headerGates": "Qué controla",
|
||||
"thresholdRows": [
|
||||
{
|
||||
"section": "Uso de CPU",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Alerta de carga sostenida cuando la CPU promedia por encima del umbral durante la ventana de scan."
|
||||
},
|
||||
{
|
||||
"section": "Memoria",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Presión de RAM en el host."
|
||||
},
|
||||
{
|
||||
"section": "Swap (solo critical)",
|
||||
"warning": "—",
|
||||
"critical": "5 %",
|
||||
"gates": "Swap realmente en uso. El número es intencionadamente bajo: un host Proxmox sano apenas debería tocar swap, así que incluso un 5 % es una señal significativa de presión de RAM."
|
||||
},
|
||||
{
|
||||
"section": "Temperatura de CPU",
|
||||
"warning": "80 °C",
|
||||
"critical": "90 °C",
|
||||
"gates": "Lectura de temperatura de package / core de CPU desde <code>lm-sensors</code>."
|
||||
},
|
||||
{
|
||||
"section": "Temp de disco — HDD",
|
||||
"warning": "60 °C",
|
||||
"critical": "65 °C",
|
||||
"gates": "Drives spinning estándar. El sobre del fabricante topa alrededor de 60–65 °C, así que Critical se fija justo en el límite duro."
|
||||
},
|
||||
{
|
||||
"section": "Temp de disco — SSD",
|
||||
"warning": "70 °C",
|
||||
"critical": "75 °C",
|
||||
"gates": "SSDs SATA 2.5'' / M.2 — corren más frescos que NVMe pero más calientes que HDDs."
|
||||
},
|
||||
{
|
||||
"section": "Temp de disco — NVMe",
|
||||
"warning": "80 °C",
|
||||
"critical": "85 °C",
|
||||
"gates": "Los drives NVMe corren más calientes por diseño; los controladores auto-throttlean por encima de ~85 °C, así que Warning captura la escalada antes de que entre el throttling."
|
||||
},
|
||||
{
|
||||
"section": "Temp de disco — SAS",
|
||||
"warning": "55 °C",
|
||||
"critical": "65 °C",
|
||||
"gates": "Los drives SAS enterprise comparten el mismo límite de fabricante de ~65 °C que los HDDs, pero se despliegan normalmente en chasis rack con refrigeración activa. Una lectura a 55 °C ya señala un problema de refrigeración (ventilador fallando, problema de HVAC) <em>antes</em> de que el propio drive esté en riesgo — de ahí un Warning más bajo que HDD, no porque SAS sea menos tolerante al calor."
|
||||
},
|
||||
{
|
||||
"section": "Espacio de disco — host",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Capacidad de <code>/</code> y cada mountpoint del host (<code>/var/lib/vz</code>, <code>/mnt/*</code>…)."
|
||||
},
|
||||
{
|
||||
"section": "Espacio de disco — rootfs LXC",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Disco raíz por contenedor, evaluado contra el tamaño del rootfs según PVE."
|
||||
},
|
||||
{
|
||||
"section": "Mount points LXC",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Capacidad de mountpoints dentro de CTs en ejecución (mp0, mp1, NFS, bind mounts). Excluye rootfs."
|
||||
},
|
||||
{
|
||||
"section": "Almacenamiento PVE",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Almacenamientos PVE estilo bloque (LVM, LVM-thin, ZFS-pool, RBD/Ceph, PBS)."
|
||||
},
|
||||
{
|
||||
"section": "Pool ZFS",
|
||||
"warning": "85 %",
|
||||
"critical": "95 %",
|
||||
"gates": "Pools ZFS a nivel host — independiente del registro PVE."
|
||||
}
|
||||
],
|
||||
"defaultsTitle": "Valores por defecto, overrides y reset",
|
||||
"defaultsBody": "El backend expone una vista fundida: cada sección parte de los valores por defecto de ProxMenux (los que ves cuando el host está recién hecho) y sobreescribes solo los knobs que te importan. La tarjeta muestra el valor <em>efectivo</em> — la sobreescritura si pones una, en otro caso el valor por defecto. Un botón <strong>Reset</strong> limpia cada override y vuelve a los valores por defecto en todas las secciones de una vez.",
|
||||
"validationTitle": "Validación",
|
||||
"validationBody": "Guardar rechaza valores que no tienen sentido (porcentajes fuera de 0–100, critical por debajo de warning, temperaturas negativas). El frontend muestra el error inline; el backend valida otra vez antes de persistir, así que no se puede engañar a la API con un PUT hecho a mano para que acepte un umbral roto."
|
||||
},
|
||||
"lxcDetection": {
|
||||
"heading": "LXC Update Detection",
|
||||
"imageAlt": "Tarjeta LXC Update Detection con un único switch — cuando está activo, el Monitor escanea periódicamente contenedores LXC Debian/Ubuntu/Alpine en ejecución buscando paquetes con update pendiente.",
|
||||
"imageCaption": "El toggle para el scan periódico <code>apt list --upgradable</code> / <code>apk list -u</code> a lo largo de cada CT en ejecución. Por defecto ON. El toggle de notificación correspondiente en Notifications → Services solo aparece mientras la detección está activa.",
|
||||
"intro": "Un toggle dedicado para el scan de actualizaciones LXC, situado entre Health Monitor Thresholds y la tarjeta Notifications. Cuando está ON, ProxMenux recorre cada CT en ejecución del host y consulta al gestor de paquetes dentro del contenedor por updates pendientes; los resultados aterrizan en los contadores de insignias de la pestaña Hardware y alimentan la notificación <code>lxc_updates_available</code>. Cuando está OFF, el scan se detiene por completo (sin llamadas <code>pct exec</code>) y cualquier entrada LXC existente en <code>managed_installs.json</code> se purga inmediatamente, así el panel y el endpoint <code>/api/managed-installs</code> dejan de reportar estado de update LXC sin esperar al siguiente ciclo de 24h.",
|
||||
"whatRunsTitle": "Qué ejecuta realmente el scan",
|
||||
"whatRunsIntro": "Para cada CT en estado <code>running</code> con un gestor de paquetes soportado:",
|
||||
"whatRunsItems": [
|
||||
"<strong>Gate de frescura de caché.</strong> Si la caché de metadatos apt/apk dentro del contenedor es más vieja que <strong>24 horas</strong>, primero corre un refresh best-effort (<code>apt-get update -qq</code> en Debian/Ubuntu, <code>apk update</code> en Alpine) con un timeout de 60 s. Cualquier fallo (sin red, repo roto, timeout) se traga en silencio — el listado de abajo sigue corriendo contra la caché que exista, así que un problema transitorio de repo nunca puede empeorar la detección.",
|
||||
"<strong>Listing.</strong> Después ProxMenux ejecuta <code>apt list --upgradable</code> / <code>apk list -u</code> y parsea la salida en un recuento estructurado más una muestra de los nombres de paquetes top.",
|
||||
"<strong>Dedup por CT.</strong> Una fingerprint construida a partir del recuento, security-count y los nombres top ordenados se almacena para que un conjunto estable de updates pendientes no re-notifique diariamente, mientras que un conjunto significativamente distinto sí lo haga."
|
||||
],
|
||||
"selfUpdateTitle": "Los CTs que se auto-actualizan fuera de apt pueden legítimamente reportar 0",
|
||||
"selfUpdateBody": "La detección solo ve lo que el gestor de paquetes dentro del contenedor conoce. Un CT cuyo software clave se actualiza fuera de apt (el cron <code>plexupdate</code> de Plex, contenedores Docker actualizados vía <code>docker pull</code>, el actualizador integrado de Frigate, etc.) seguirá reportando updates apt bajos o cero aunque el appliance se mantenga al día activamente — eso es correcto, no es un bug. El sistema base a nivel apt del mismo CT puede aún tener sus propios updates pendientes, que sí saca a la luz el scan.",
|
||||
"refreshTitle": "Por qué el auto-refresh de 24 h",
|
||||
"refreshBody": "Los CTs appliance de larga vida con frecuencia acaban con cachés apt meses desactualizadas porque nadie ejecuta rutinariamente <code>apt update</code> dentro de ellos. Sin el refresh, <code>apt list --upgradable</code> reporta 0 updates desde una snapshot congelada y el operador nunca ve el backlog. El umbral coincide con el resto del ciclo de chequeo — si el CT se refrescó en las últimas 24 h, ProxMenux confía en esa señal y se salta el refresh.",
|
||||
"toggleTitle": "Toggle de notificación condicional",
|
||||
"toggleBody": "El toggle de notificación por canal <code>lxc_updates_available</code> en <strong>Notifications → Services</strong> solo se renderiza mientras la detección está activa. Cuando pones la detección en OFF, esa fila desaparece de la lista de categorías de cada canal — pero su preferencia almacenada se preserva en la DB, así que reactivar la detección trae el toggle de vuelta al valor que tenía antes.",
|
||||
"purgeTitle": "Qué se purga al desactivar la detección",
|
||||
"purgeBody": "Apagar el switch elimina inmediatamente cada entrada <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Las insignias de la pestaña Hardware caen a cero en el siguiente refresco del panel. Volver a activarlo repuebla el registro en el siguiente ciclo de detección (o antes si disparas un refresh manual desde la API)."
|
||||
},
|
||||
"storageExclusions": {
|
||||
"heading": "Remote Storage Exclusions",
|
||||
"imageAlt": "Tarjeta Remote Storage Exclusions listando almacenamientos PBS-Cloud, PBS y PBS2 con toggles Health y Alerts por fila",
|
||||
"imageCaption": "Toggles <em>Health</em> y <em>Alerts</em> por almacenamiento. Los almacenamientos con ambos toggles en off dejan de contar contra el Monitor de salud y dejan de generar notificaciones — pero siguen renderizándose en la pestaña Almacenamiento marcados como excluidos.",
|
||||
"intro": "Marca los almacenamientos gestionados por Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / etc.) como excluidos de monitorización. Dos toggles independientes por almacenamiento:",
|
||||
"items": [
|
||||
"<strong>Health</strong> — cuando está off, el almacenamiento deja de contribuir a la categoría Almacenamiento del Monitor de salud. Útil para volúmenes de archivo que están intencionadamente offline la mayor parte del tiempo o destinos de backup remotos que solo se encienden a horario.",
|
||||
"<strong>Alerts</strong> — cuando está off, las alertas sobre este almacenamiento dejan de salir a través de los canales configurados, aunque los chequeos Health sigan activos. Útil cuando quieres la vista del panel pero no las notificaciones."
|
||||
],
|
||||
"outro": "Los almacenamientos excluidos siguen renderizándose en la <link>pestaña Almacenamiento</link> con una insignia morada <em>excluded</em> para que la entrada no desaparezca silenciosamente de tu inventario. El estado se persiste en la tabla SQLite <code>excluded_storages</code>."
|
||||
},
|
||||
"interfaceExclusions": {
|
||||
"heading": "Network Interface Exclusions",
|
||||
"imageAlt": "Tarjeta Network Interface Exclusions listando vmbr0, vmbr1, vmbr2, bond0 y eno1 con toggles Health y Alerts por interfaz",
|
||||
"imageCaption": "La misma forma que Storage Exclusions — toggles <em>Health</em> y <em>Alerts</em> por interfaz. Cada fila muestra la interfaz, insignia de tipo (bridge / bond / física), la IP y la velocidad del enlace.",
|
||||
"intro": "La misma forma que Storage Exclusions pero para interfaces de red. Por interfaz: excluir de los chequeos Health y/o excluir de las notificaciones. Casos de uso típicos:",
|
||||
"items": [
|
||||
"Un bridge spare intencionadamente down.",
|
||||
"Una NIC que se retiró físicamente pero sigue referenciada en <code>/etc/network/interfaces</code>.",
|
||||
"Una sub-interfaz VLAN usada solo durante ventanas de mantenimiento.",
|
||||
"Un bridge de gestión que está up pero no lleva tráfico — flappeando ruidosamente en cada ciclo."
|
||||
],
|
||||
"outro": "El estado se persiste en la tabla SQLite <code>excluded_interfaces</code>. La misma insignia morada <em>excluded</em> en la <link>pestaña Red</link> para que las interfaces excluidas sigan visibles."
|
||||
},
|
||||
"notifications": {
|
||||
"heading": "Notificaciones e IA",
|
||||
"body1": "Esta sección de la pestaña Settings es donde se activan las notificaciones de ProxMenux Monitor y el reescritor con IA. Pulsar <em>Enable Notifications</em> arranca el hilo de envío en background, registra un target de webhook de Proxmox VE en el host para que los eventos emitidos por PVE fluyan al mismo pipeline y despliega el formulario de canales para que puedas conectar Telegram, Discord, Email, Gotify y el resto. El reescritor con IA vive dentro del mismo panel como una sección avanzada colapsable.",
|
||||
"body2": "Ambas superficies tienen muchas piezas en movimiento — canales, toggles por evento, mensajes Rich, el Display Name, el pipeline de envío (dedup, cooldown, agregación, quiet hours), la integración del webhook PVE, proveedores de IA, modos de prompt — y viven en sus propias páginas dedicadas en lugar de repetirse aquí:",
|
||||
"items": [
|
||||
"<notifLink>Notificaciones</notifLink> — recorridos por canal (Telegram, Discord, Gotify, Email + app passwords de Gmail / Microsoft, ntfy, Slack, Teams, webhook genérico), categorías por evento, mensajes Rich, Display Name, pipeline de envío, integración del webhook PVE, historial y API.",
|
||||
"<aiLink>Asistente de IA</aiLink> — proveedores (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), selección de modelo, modos de prompt (default / custom), idioma de salida, niveles de detalle por canal y sugerencias de IA."
|
||||
]
|
||||
},
|
||||
"optimizations": {
|
||||
"heading": "ProxMenux Optimizations",
|
||||
"intro": "Un inventario en vivo y transparente de cada optimización post-instalación de ProxMenux actualmente activa en el host. Cada vez que aplicas una opción post-instalación desde el lado Scripts — ya sea vía el <autoLink>Automated post-install</autoLink> o vía el <customLink>Customizable post-install</customLink> a la carta — el script correspondiente se registra a sí mismo en <code>/usr/local/share/proxmenux/installed_tools.json</code>. El Monitor lee ese archivo y renderiza esta tarjeta para que veas, de un vistazo, qué se ha cambiado en tu servidor.",
|
||||
"imageAlt": "Tarjeta ProxMenux Optimizations con rejilla de herramientas instaladas, cada fila mostrando un punto verde, nombre de la herramienta y versión. Ejemplos incluyen APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged con insignia Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal, VFIO IOMMU Passthrough — 14 activas en total",
|
||||
"imageCaption": "La tarjeta lista cada optimización activa con su nombre, versión, un punto coloreado y un contador naranja <em>14 active</em> arriba a la derecha. Las herramientas cuyo source es alcanzable son pulsables.",
|
||||
"dotsTitle": "Qué significan los puntos",
|
||||
"dotsItems": [
|
||||
"<green/> <strong>Punto verde</strong> — optimización actual, registrada por la versión activa de ProxMenux. El código fuente es alcanzable: pulsa la fila para abrirlo.",
|
||||
"<amber/> <strong>Punto ámbar + insignia <em>legacy</em></strong> — aplicada por una versión más vieja de ProxMenux cuyo script ha sido renombrado o reemplazado desde entonces. Sigue activa en el host; el source abre en modo \"legacy\" (con un acento ámbar) para que puedas auditar qué se ejecutó realmente."
|
||||
],
|
||||
"clickTitle": "Acceso al código fuente",
|
||||
"clickBody": "Pulsar una herramienta abre una modal con la función bash exacta que aplicó el cambio, más la ruta del archivo de script en el que vive (<code>auto_post_install.sh</code> para el bundle Automated, <code>customizable_post_install.sh</code> para el lado à la carte). Los comentarios y constructos de shell tienen syntax highlighting; un botón Copy pone el source en tu portapapeles. Esta es la superficie \"muestra tu trabajo\" — verifica lo que ProxMenux le hizo a tu host antes de cualquier cambio manual que añadas encima.",
|
||||
"detailAlt": "Modal de código fuente de herramienta para APT IPv4 Force mostrando la función bash force_apt_ipv4 desde customizable_post_install.sh versión 1.0 con código resaltado que configura /etc/apt/apt.conf.d/99-force-ipv4 con Acquire ForceIPv4 true, registra la herramienta y emite un mensaje translate APT IPv4 configuration completed",
|
||||
"detailCaption": "Modal de source para <em>APT IPv4 Force</em> — función <code>force_apt_ipv4()</code> exacta de <code>customizable_post_install.sh v1.0</code>, con syntax highlighting y un Copy de un clic.",
|
||||
"whyTitle": "Por qué importa esto",
|
||||
"whyBody": "ProxMenux cambia cosas en tu host: parámetros de kernel, configuración de repositorios, bits de red, rotación de logs, passthrough de GPU, etc. Saber exactamente qué está activo es esencial antes de empezar a añadir customización manual encima — y aún más si un admin distinto opera el host del que lo montó. Esta tarjeta es el registro auditable de cada optimización actualmente en efecto, con el código exacto que la produjo.",
|
||||
"updatesTitle": "Banner Updates available",
|
||||
"updatesBody": "Cuando una optimización post-instalación tiene en disco una versión más nueva que la actualmente registrada en el host, la tarjeta muestra un banner \"Updates available\" arriba con el recuento y un botón <strong>Apply</strong>. Pulsar <strong>Apply</strong> abre un selector por optimización (el mismo disponible desde la entrada <em>Apply available updates</em> del menú Post-Install). Elige qué optimizaciones aplicar; ProxMenux relanza la función correspondiente y refresca la versión en el registro. Cuando todo está al día, el banner desaparece.",
|
||||
"updatesAlt": "Tarjeta ProxMenux Optimizations con un banner Updates available arriba — recuento de updates pendientes más un botón Apply que abre el selector por optimización",
|
||||
"updatesCaption": "El banner solo se renderiza cuando al menos una optimización tiene una versión más nueva en disco. Mira <link>Apply Available Updates</link> para el flujo completo de update y el equivalente Path-A en el menú de la shell.",
|
||||
"revertTitle": "Revertir una optimización",
|
||||
"revertBody": "La tarjeta es de solo lectura — para deshacer una optimización, ejecuta la opción correspondiente <link>Uninstall Optimizations</link> del menú ProxMenux Scripts. El paso de desinstalación elimina la entrada de <code>installed_tools.json</code>, así que desaparece de esta tarjeta en el siguiente refresco."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Cómo se recopilan los datos",
|
||||
"headerCard": "Tarjeta",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Network Units",
|
||||
"endpoint": "/api/settings",
|
||||
"source": "Persistido en la tabla SQLite de settings del panel."
|
||||
},
|
||||
{
|
||||
"card": "Duraciones del Monitor de salud",
|
||||
"endpoint": "/api/health/settings",
|
||||
"source": "Duraciones de supresión por categoría en la DB de Health."
|
||||
},
|
||||
{
|
||||
"card": "Exclusiones de almacenamiento / interfaz",
|
||||
"endpoint": "/api/storage/exclusions, /api/network/exclusions",
|
||||
"source": "Tablas SQLite <code>excluded_storages</code> y <code>excluded_interfaces</code>."
|
||||
},
|
||||
{
|
||||
"card": "Panel Notificaciones e IA",
|
||||
"endpoint": "/api/notifications/*",
|
||||
"source": "Mira las páginas dedicadas <notifLink>Notificaciones</notifLink> / <aiLink>Asistente de IA</aiLink>."
|
||||
},
|
||||
{
|
||||
"card": "Lista ProxMenux Optimizations",
|
||||
"endpoint": "/api/proxmenux/installed-tools",
|
||||
"source": "Lee <code>/usr/local/share/proxmenux/installed_tools.json</code>, escrito por llamadas <code>register_tool</code> dentro de los scripts post-instalación."
|
||||
},
|
||||
{
|
||||
"card": "Modal de código fuente de optimización",
|
||||
"endpoint": "/api/proxmenux/tool-source",
|
||||
"source": "Extrae la función bash correspondiente de <code>auto_post_install.sh</code> o <code>customizable_post_install.sh</code> en el host."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Notificaciones",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — canales, toggles por evento, overrides de canal, historial, test-send."
|
||||
},
|
||||
{
|
||||
"label": "Asistente de IA",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — proveedores, modelos, modos de prompt, idiomas, niveles de detalle por canal."
|
||||
},
|
||||
{
|
||||
"label": "Monitor de salud → Descartar alertas y la Suppression Duration",
|
||||
"href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration",
|
||||
"tail": " — la semántica detrás de los desplegables por categoría de arriba."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Scripts → Automated post-install",
|
||||
"href": "/docs/post-install/automated",
|
||||
"tailRich": " y <customLink>Customizable post-install</customLink> — los scripts reales que se registran en la lista de optimizaciones de arriba."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — cómo revertir una optimización registrada arriba."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — volver al resumen de la pestaña."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,268 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Almacenamiento | ProxMenux Documentation",
|
||||
"description": "La pestaña Almacenamiento consolida cuatro vistas: almacenamientos gestionados por Proxmox con su estado, pools ZFS, discos físicos internos con datos SMART y unidades externas (USB). La vista en detalle de cada disco expone atributos SMART, desgaste y vida útil y el historial permanente de observaciones."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Almacenamiento",
|
||||
"description": "El estado de almacenamiento del host en una pantalla — pools de Proxmox (NFS / CIFS / LVM / ZFS / dir), salud de pools ZFS, discos internos SATA / NVMe con SMART y unidades USB externas. Pulsa cualquier disco para abrir una vista en detalle con la tabla completa de atributos SMART y el historial de observaciones por disco.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Respaldado por tres fuentes",
|
||||
"body": "Los almacenamientos Proxmox vienen de <code>pvesm status</code>; el estado ZFS de <code>zpool status</code>; los discos físicos de <code>lsblk</code> + <code>smartctl</code> (y <code>nvme</code> para campos específicos de NVMe). La pestaña refresca cada ~60 segundos; la vista en detalle por disco dispara una lectura SMART fresca bajo demanda."
|
||||
},
|
||||
"thresholds": {
|
||||
"title": "Colores de estado y umbrales aplicados aquí",
|
||||
"intro": "Cada barra, chip y punto de esta pestaña sigue la misma clasificación de tres estados — <green/> <strong>verde</strong> por debajo de Warning, <amber/> <strong>ámbar</strong> entre Warning y Critical, <red/> <strong>rojo</strong> en Critical y por encima. Valores por defecto recomendados que vienen con ProxMenux:",
|
||||
"items": [
|
||||
"<strong>Capacidad</strong> (discos del host, almacenamientos PVE, pools ZFS, mounts de LXC) — Warning 85 %, Critical 95 %.",
|
||||
"<strong>Temperatura de disco</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (warning / critical)."
|
||||
],
|
||||
"outro": "Cada valor es configurable por host — <link>Settings → Health Monitor Thresholds</link> es la fuente única de verdad y explica cómo ajustarlos."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Fila superior: almacenamiento de un vistazo",
|
||||
"intro": "Al abrir la pestaña Almacenamiento aterrizas en un resumen de cuatro tarjetas del estado de almacenamiento del host — capacidad total, qué se está usando localmente, qué se está usando en almacenamientos remotos y el inventario de discos físicos. Cada tarjeta es una respuesta de una línea a una pregunta común; las tarjetas debajo de la fila son donde profundizas en el detalle.",
|
||||
"imageAlt": "Pestaña Almacenamiento — fila superior de cuatro tarjetas de estadísticas: Total Storage, Local Used, Remote Used, Physical Disks",
|
||||
"imageCaption": "Fila superior de la pestaña Almacenamiento — capacidad total y recuento de discos, bytes usados separados en almacenamientos locales vs remotos y un desglose por tipo de discos físicos con su resumen de salud.",
|
||||
"headerCard": "Tarjeta",
|
||||
"headerWhat": "Qué muestra",
|
||||
"totalLabel": "Total Storage",
|
||||
"totalWhat": "Capacidad bruta combinada de todos los discos físicos. La línea al pie muestra el recuento de discos físicos descubiertos.",
|
||||
"localLabel": "Local Used",
|
||||
"localWhat": "Bytes usados en almacenamientos locales (LVM / LVM-thin / ZFS / dir en los discos del propio host). Muestra los bytes usados de forma prominente, con una línea al pie <em>X.XX % de Y TB</em> para que veas el porcentaje de llenado al mismo tiempo.",
|
||||
"remoteLabel": "Remote Used",
|
||||
"remoteWhat": "La misma forma que Local Used pero para almacenamientos remotos (NFS / CIFS / PBS / Ceph / iSCSI). Se cuentan por separado porque las caídas remotas no afectan a los datos locales y normalmente los dimensionas y monitorizas de forma diferente.",
|
||||
"disksLabel": "Physical Disks",
|
||||
"disksIntro": "Dos líneas de desglose para el inventario:",
|
||||
"disksItems": [
|
||||
"<strong>Por tipo</strong> — recuentos de NVMe (morado), SSD (azul) y HDD (azul) descubiertos. Los hosts con discos mixtos reciben los tres; un host todo-NVMe muestra solo el recuento NVMe.",
|
||||
"<strong>Por salud</strong> — recuentos de discos <em>normal</em> (verde), <em>warning</em> (amarillo) y <em>critical</em> (rojo). El estado sano normalmente muestra solo \"X normal\"; warnings y critical aparecen solo cuando algo escala."
|
||||
]
|
||||
},
|
||||
"pveStorage": {
|
||||
"heading": "Tarjeta Proxmox Storage",
|
||||
"intro": "Una fila por almacenamiento configurado en <code>/etc/pve/storage.cfg</code>. Cada fila muestra la insignia de tipo (<code>nfs</code> / <code>cifs</code> / <code>zfspool</code> / <code>lvm</code> / <code>lvmthin</code> / <code>dir</code> / <code>pbs</code>), el nombre del almacenamiento, una insignia active / error / not-monitored, el porcentaje de uso y una barra de progreso coloreada:",
|
||||
"items": [
|
||||
"<strong>< 75 %</strong> — barra de progreso azul, valor en azul.",
|
||||
"<strong>75 – 90 %</strong> — barra de progreso amarilla, valor en amarillo (el Monitor de salud avisa en este punto).",
|
||||
"<strong>> 90 %</strong> — barra de progreso roja, valor en rojo (el Monitor de salud escala).",
|
||||
"<strong>error</strong> — fila entera con borde rojo, se usa cuando el almacenamiento está configurado pero inalcanzable (servidor NFS caído, credenciales CIFS caducadas).",
|
||||
"<strong>excluded</strong> — borde morado + la insignia \"not monitored\". Almacenamientos excluidos explícitamente por el usuario de los chequeos de salud (cómodo para volúmenes manuales / de archivo que están intencionadamente offline)."
|
||||
],
|
||||
"calloutTitle": "Excluir un almacenamiento ruidoso",
|
||||
"calloutBody": "Desde la fila del almacenamiento, el menú por almacenamiento te permite marcarlo como <em>excluded from monitoring</em>. El flag se guarda en la tabla <code>excluded_storages</code> y lo respetan tanto la vista del panel como el ciclo del Monitor de salud — no se disparan notificaciones para almacenamientos excluidos, y no empujan la pastilla de la cabecera."
|
||||
},
|
||||
"zfs": {
|
||||
"heading": "Tarjeta ZFS Pools",
|
||||
"intro": "Se renderiza solo cuando ZFS está instalado y existe al menos un pool. Una fila por pool con una insignia de salud, size / allocated / free y un icono que refleja el estado de salud:",
|
||||
"items": [
|
||||
"<strong>ONLINE</strong> — verde. Todo sano.",
|
||||
"<strong>DEGRADED</strong> — amarillo. El pool sigue sirviendo datos pero al menos un dispositivo no está disponible; arranca la ventana de reemplazo.",
|
||||
"<strong>FAULTED</strong> / <strong>UNAVAIL</strong> / <strong>SUSPENDED</strong> — rojo. El pool no sirve datos; se requiere intervención inmediata."
|
||||
],
|
||||
"outro": "Tanto el estado ZFS como el estado SMART por disco alimentan la categoría <em>Disks & I/O</em> del <link>Monitor de salud</link>."
|
||||
},
|
||||
"physical": {
|
||||
"heading": "Physical Disks & SMART Status",
|
||||
"intro": "Discos internos (SATA / NVMe). Cada fila condensa los campos más útiles de un vistazo:",
|
||||
"items": [
|
||||
"<strong>Ruta del dispositivo</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
|
||||
"<strong>Insignia de tipo</strong> — SATA / NVMe (y el icono correspondiente).",
|
||||
"<strong>Insignia System</strong> — etiqueta naranja que marca los discos desde los que se está ejecutando el SO del host. El panel lo deriva de los mountpoints de <code>/</code> y <code>/boot</code>: cualquier disco físico que los aloje recibe la etiqueta <em>System</em> para que no lo borres o reasignes por accidente. Los discos sin la etiqueta son unidades puras de datos.",
|
||||
"<strong>Modelo</strong> — vendor + cadena del modelo de <code>smartctl -i</code>.",
|
||||
"<strong>Capacidad</strong> — formateada de forma legible.",
|
||||
"<strong>Temperatura</strong> — °C actuales, coloreada por el umbral de tipo de disco (NVMe corre más caliente que SATA).",
|
||||
"<strong>Estado SMART</strong> — passed / failed / unknown.",
|
||||
"<strong>Insignia de observaciones</strong> — cuando el historial permanente <code>disk_observations</code> tiene entradas no descartadas para este disco, aparece una insignia azul con el recuento (p. ej. <em>3 obs.</em>). Pulsa el disco para entrar y revisarlas.",
|
||||
"<strong>Insignia de salud</strong> — Healthy / Warning / Critical, derivada del chequeo SMART + observaciones recientes."
|
||||
],
|
||||
"clickHint": "La fila entera es pulsable y abre la vista en detalle por disco descrita abajo.",
|
||||
"warningTitle": "No toques los discos con etiqueta System a la ligera",
|
||||
"warningBody": "Los discos con la insignia naranja <strong>System</strong> alojan el SO en ejecución. El panel expone la etiqueta como guardarraíl — las acciones destructivas lanzadas desde <link>ProxMenux → Disk Manager → Format / Wipe</link> se niegan explícitamente a actuar sobre ellos. Si de verdad necesitas reasignar el disco de arranque, hazlo desde un entorno de rescate, no desde dentro de Proxmox."
|
||||
},
|
||||
"external": {
|
||||
"heading": "External Storage (USB)",
|
||||
"body": "Una tarjeta separada para unidades conectadas por USB, solo se renderiza cuando hay al menos una presente. Los mismos campos que los discos internos más una etiqueta naranja <strong>USB</strong>. Las unidades USB suelen aparecer y desaparecer (backups en frío, jobs ocasionales de descarga), así que el Monitor de salud es conservador con ellas — las observaciones se retienen, pero los errores de E/S en una unidad USB desconectada no escalan."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Modal de vista en detalle de disco",
|
||||
"intro": "Pulsar cualquier fila de disco abre una modal con cuatro pestañas: <strong>Overview</strong> · <strong>SMART</strong> · <strong>History</strong> · <strong>Schedule</strong>. La cabecera siempre muestra la ruta del dispositivo, el modelo + capacidad y la insignia naranja <em>System</em> si aplica.",
|
||||
"overviewTitle": "Pestaña 1 — Overview",
|
||||
"overviewImageAlt": "Modal de vista en detalle de disco — pestaña Overview con estado de salud, anillo Wear & Lifetime y atributos SMART rápidos",
|
||||
"overviewImageCaption": "Pestaña Overview — identidad, insignia de salud, anillo de vida restante con el desgaste actual y los datos escritos, además de un bloque rápido con los atributos SMART más vigilados.",
|
||||
"overviewIntro": "La pestaña por defecto al entrar — todo lo que necesitas para responder \"¿este disco está bien?\" sin lanzar un test. Tres bloques:",
|
||||
"overviewItems": [
|
||||
"<strong>Identity</strong> — modelo, serial, capacidad, insignia Health (Healthy / Warning / Critical).",
|
||||
"<strong>Wear & Lifetime</strong> — anillo grande de vida restante (97 %, 50 %, …) con el atributo de origen explícito (<em>Media Wearout Indicator</em>, <em>Percentage Used</em>, …), una barra de desgaste (% de consumo actual), una proyección <em>Est. Life</em> en años y los Data Written totales. Los discos NVMe también muestran <em>Available Spare</em>.",
|
||||
"<strong>SMART Attributes</strong> — seis campos titulares en una rejilla de 2 columnas: Temperature, Power On Hours (con duración humanizada como <em>3y 116d</em>), Rotation Rate (o <em>SSD</em>), Power Cycles, SMART Status, Reallocated Sectors, Pending Sectors, CRC Errors. La tabla de atributos completa vive en la pestaña SMART."
|
||||
],
|
||||
"smartTitle": "Pestaña 2 — SMART",
|
||||
"smartImageAlt": "Modal de vista en detalle de disco — pestaña SMART con botones Run SMART Test (Short / Extended), resultado del último test y la tabla completa de atributos SMART",
|
||||
"smartImageCaption": "Pestaña SMART — lanza un test Short o Extended, mira el resultado del último test, scrollea la tabla completa de atributos SMART y genera el informe PDF completo de salud.",
|
||||
"smartIntro": "Donde viven las acciones. Tres secciones:",
|
||||
"smartItems": [
|
||||
"<strong>Run SMART Test</strong> — dos botones. <em>Short Test (~2 min)</em> corre síncrono y muestra el resultado inline. <em>Extended Test (background)</em> puede tardar horas en discos grandes, corre en el servidor y dispara una notificación cuando termina.",
|
||||
"<strong>Last Test</strong> — tipo, insignia de estado (<em>passed</em> / <em>failed</em>) y timestamp de la ejecución más reciente.",
|
||||
"<strong>SMART Attributes</strong> — la tabla completa de atributos (ID / nombre / valor / worst / estado con iconos OK / warning / critical). Para SATA / SAS, la lista numerada clásica. Para NVMe, los campos estructurados de <code>nvme smart-log</code> (temperatura, available spare, percentage used, data units written / read, host reads / writes, controller busy time, power cycles, unsafe shutdowns, media errors, error-log entries, warning / critical composite temperature time)."
|
||||
],
|
||||
"pdfTitle": "View Full SMART Report (PDF)",
|
||||
"pdfIntro": "Al pie de la pestaña SMART, el botón <strong>View Full SMART Report</strong> genera un PDF imprimible y listo para archivo — el mismo informe estructurado que enviarías a un fabricante para un RMA.",
|
||||
"pdfPreviewAlt": "Primera página del PDF SMART Health Report generado — Executive Summary con el anillo PASSED + bloque Disk Information",
|
||||
"pdfPreviewCaption": "Primera página del SMART Health Report — Executive Summary con el anillo PASSED y el bloque Disk Information completo. El PDF completo de abajo lleva el anillo de desgaste SSD, cada atributo SMART y el historial de tests.",
|
||||
"pdfDownloadLabel": "Descargar informe SMART de ejemplo (PDF)",
|
||||
"pdfSectionsIntro": "El informe tiene cinco secciones de alto nivel:",
|
||||
"pdfSections": [
|
||||
"<strong>Executive Summary</strong> — gran veredicto PASSED / FAILED, párrafo de evaluación de salud del disco en lenguaje claro (\"tu disco está sano / muestra signos de desgaste / está fallando\") y cuatro estadísticas rápidas (timestamp del informe, tipo del último test, resultado del test, atributos comprobados).",
|
||||
"<strong>Disk Information</strong> — modelo, serial, capacidad, tipo (HDD / SSD / NVMe), familia, form factor, interfaz (SATA 3.3 · 6.0 Gb/s, …), soporte de TRIM, temperatura actual con el umbral óptimo, tiempo de power-on, ciclos de encendido, estado SMART, además de los contadores titulares (pending sectors, CRC errors, reallocated sectors).",
|
||||
"<strong>SSD Wear & Lifetime</strong> (solo SSD / NVMe) — anillo de vida restante, atributo de origen, nivel actual de desgaste, datos escritos, horas de power-on.",
|
||||
"<strong>SMART Attributes (full)</strong> — cada atributo que reporta el drive, con ID, nombre, valor, worst, threshold, valor raw y una pastilla de estado. Los más relevantes para el usuario (Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, …) incluyen una explicación de una línea en lenguaje claro bajo la fila.",
|
||||
"<strong>Last Self-Test Result + Full Self-Test History</strong> — el último test (tipo, resultado, mensaje de finalización, en qué marca de power-on-hours) más una tabla numerada de cada test retenido.",
|
||||
"<strong>Recommendations</strong> — items de acción basados en el veredicto: <em>Disk is Healthy / Schedule periodic tests / Backup strategy</em> para discos sanos, lenguaje en escalada con guía de reemplazo cuando los atributos se salen de rango."
|
||||
],
|
||||
"pdfOutro": "El PDF se produce en el servidor y se descarga con un patrón de nombre estable (<code>SMART-<short-id>.pdf</code>) para que múltiples snapshots a lo largo del tiempo puedan convivir en tu archivo. Útil cuando estás rastreando degradación a lo largo de meses o enviando evidencia al soporte del fabricante.",
|
||||
"historyTitle": "Pestaña 3 — History",
|
||||
"historyImageAlt": "Modal de vista en detalle de disco — pestaña History listando tests SMART pasados con acciones de descarga y borrado",
|
||||
"historyImageCaption": "Pestaña History — cada test SMART retenido para este disco. Por fila: tipo, timestamp, etiqueta \"X days ago\", marca latest, descargar (salida raw de <code>smartctl</code>) y acciones de borrado.",
|
||||
"historyIntro": "El pool retenido de tests SMART para este disco — tanto las ejecuciones short como extended que se completaron. Cada entrada es la salida raw de <code>smartctl</code> capturada en tiempo de ejecución, más los campos estructurados que el Monitor parseó para el panel. Acciones por fila:",
|
||||
"historyItems": [
|
||||
"<strong>Download</strong> — guarda la salida raw de <code>smartctl -a</code> como un archivo de texto. Idéntico a lo que parsea el informe PDF, útil cuando necesitas la línea exacta que pide un fabricante.",
|
||||
"<strong>Delete</strong> — elimina el test del historial. El límite de retención fijado en la pestaña Schedule (<em>Last 5 / 10 / 20</em>) borra el más viejo primero automáticamente; esta acción es la sobreescritura manual."
|
||||
],
|
||||
"scheduleTitle": "Pestaña 4 — Schedule",
|
||||
"scheduleImageAlt": "Modal de vista en detalle de disco — pestaña Schedule con el toggle Automatic SMART Tests, la lista de schedules configurados y el botón Add Schedule",
|
||||
"scheduleImageCaption": "Pestaña Schedule — elige tipo de test, frecuencia y retención; el Monitor lo conecta a <code>cron</code> para que los tests corran sin atención.",
|
||||
"scheduleIntro": "Tests SMART automáticos guiados por cron, sin shell. La página tiene tres áreas:",
|
||||
"scheduleItems": [
|
||||
"<strong>Toggle Automatic SMART Tests</strong> — interruptor global on/off para cada schedule de este disco. Útil cuando quieres pausar todo durante mantenimiento sin perder las definiciones de schedule.",
|
||||
"<strong>Configured Schedules</strong> — una fila por schedule existente con la insignia de tipo de test (<em>short</em> / <em>long</em>), la expresión cron en forma humana (<em>\"Day 1 of month at 03:00\"</em>, <em>\"Every Sunday at 02:00\"</em>), los discos que cubre y el ajuste de retención.",
|
||||
"<strong>Add Schedule / Edit Schedule</strong> — formulario con: Test Type (<em>Short ~2 min</em> / <em>Long 1-4 h</em>), Frequency (<em>Daily / Weekly / Monthly</em>), Day of Month / Day of Week, Time, Keep Results (<em>Last 5 / 10 / 20</em>)."
|
||||
],
|
||||
"scheduleOutro": "El schedule se materializa como una entrada cron en el host que llama de vuelta al Monitor; los resultados se guardan en el mismo historial SMART mostrado en la pestaña 3, y el ajuste de retención auto-poda el test más viejo cuando termina uno nuevo.",
|
||||
"tempTitle": "Modal de historial de temperatura",
|
||||
"tempIntro": "Cada disco que expone un sensor de temperatura tiene sus lecturas muestreadas de forma continua por el Monitor y persistidas a una serie temporal local. El valor actual aparece como uno de los seis atributos SMART titulares en la pestaña Overview; pulsar ese bloque abre una modal dedicada de historial de temperatura con la imagen completa.",
|
||||
"tempImageAlt": "Modal de historial de temperatura de disco — cabecera con la ruta y modelo del disco, un selector de timeframe (1 Hour / 24 Hours / 7 Days / 30 Days), una fila de cuatro tarjetas de estadísticas (Current / Min / Avg / Max) y una gráfica de línea de la temperatura sobre el rango seleccionado coloreada por los umbrales por tipo de disco",
|
||||
"tempImageCaption": "Detalle de temperatura — se abre desde la pestaña Overview en cualquier disco cuyo sensor devuelva una lectura no-cero. La gráfica se colorea contra el umbral de tipo de disco (HDD / SSD / NVMe / SAS).",
|
||||
"tempShowsTitle": "Lo que muestra la modal",
|
||||
"tempShowsItems": [
|
||||
"<strong>Selector de timeframe</strong> con cuatro rangos: <em>1 Hour</em>, <em>24 Hours</em> (por defecto), <em>7 Days</em>, <em>30 Days</em>. Cada uno consulta al mismo backend con un downsampling distinto para que la gráfica siga legible en cada horizonte.",
|
||||
"<strong>Cuatro tarjetas de estadísticas</strong> en lo alto de la modal: <em>Current</em>, <em>Min</em>, <em>Avg</em>, <em>Max</em> para el rango seleccionado. La tarjeta <em>Current</em> se colorea con los mismos umbrales de estado que usan la pestaña Almacenamiento y las notificaciones, para que veas de un vistazo si el disco está en territorio normal / warm / hot.",
|
||||
"<strong>Gráfica de línea</strong> de la temperatura a lo largo del tiempo, con la línea y el área sombreada coloreadas por tipo de disco:"
|
||||
],
|
||||
"tempDiskTypes": [
|
||||
"HDD — umbrales típicamente más frescos.",
|
||||
"SSD — umbrales moderados.",
|
||||
"NVMe — umbrales más altos (NVMe corre más caliente por diseño).",
|
||||
"SAS — mismos valores por defecto que HDD."
|
||||
],
|
||||
"tempConfigurable": "Los cuatro son configurables desde <em>Settings → Health Monitor Thresholds</em>.",
|
||||
"tempWhyTitle": "Por qué importa aquí un historial",
|
||||
"tempWhyItems": [
|
||||
"<strong>Detección de drift.</strong> Los discos que se calientan progresivamente a lo largo de semanas (ventilador fallando, acumulación de polvo, disco vecino muriéndose y empujando aire caliente) son invisibles para una lectura única de \"temperatura actual\". Las vistas de 7 días y 30 días sacan el drift a la superficie.",
|
||||
"<strong>Correlación de picos.</strong> Cuando una ventana de backup o un rebuild empujaron el disco brevemente por encima de su umbral, los rangos de 1 hora y 24 horas muestran si fue puntual o un patrón recurrente.",
|
||||
"<strong>Ajuste de umbrales.</strong> Antes de subir o bajar un umbral en <em>Settings → Health Monitor Thresholds</em>, la gráfica de 30 días muestra el rango operativo real del disco para que el nuevo valor encaje con lo que el hardware realmente hace en vez de un cálculo a ojo."
|
||||
],
|
||||
"obsTitle": "Historial de observaciones (a lo largo de pestañas)",
|
||||
"obsIntro": "Los discos modernos fallan de forma gradual. Un disco puede reportar SMART <strong>PASSED</strong> y aún así loguear errores ocasionales de lectura en dmesg, perder enlaces SATA o exponer pending sectors que van y vienen. La UI estándar de Proxmox te muestra el veredicto SMART actual — no mantiene un historial de esas <em>señales</em>. ProxMenux sí, y las expone directamente dentro de la modal de disco.",
|
||||
"obsImageAlt": "Pestaña Overview de la modal Disk Details mostrando un disco sano con estado SMART Passed, 0 errores reallocated/pending/CRC y una sección Observations listando un evento I/O Error registrado con el mensaje raw del kernel, una traducción humana del código de error ATA, timestamps de primera y última ocurrencia y un contador de ocurrencias",
|
||||
"obsImageCaption": "Un disco que <strong>SMART dice que está bien</strong> puede aún así tener un historial de observaciones. La tarjeta es la capa de señales histórica bajo el veredicto SMART.",
|
||||
"obsWhatTitle": "Qué es una observación",
|
||||
"obsWhatIntro": "Cualquier cosa que ProxMenux capture en el log del kernel, dmesg o salida SMART que parezca un evento a nivel de disco — y que por sí sola sería demasiado granular para una notificación — se registra como una <strong>observación</strong>. Cada fila muestra:",
|
||||
"obsWhatItems": [
|
||||
"<strong>Insignia de tipo</strong> (I/O Error, SMART Error, Filesystem Error, ZFS Pool Error, Connection Error).",
|
||||
"<strong>Mensaje raw del kernel</strong> tal cual apareció en dmesg — útil al copiar y pegar en un buscador o en un ticket de soporte.",
|
||||
"<strong>Una frase humana</strong> bajo el mensaje raw para códigos ATA conocidos (<code>IDNF</code> → \"Sector address not found — posible bad sector o problema de cable\", <code>UNC</code> → \"Uncorrectable read error — bad sector\", y el resto de códigos estándar).",
|
||||
"<strong>Timestamps de primera y última ocurrencia</strong>, más un <strong>contador de ocurrencias</strong> deduplicado por signature de error."
|
||||
],
|
||||
"obsWhyTitle": "Por qué ProxMenux las registra y las muestra",
|
||||
"obsWhyItems": [
|
||||
"<strong>El fallo de disco rara vez es un evento único.</strong> Normalmente empieza con errores esporádicos de bus ATA, algún sector UNC o un par de errores medium semanas antes de que SMART pase a <em>FAILED</em>. Sin persistencia esos avisos tempranos desaparecen de dmesg en el siguiente arranque.",
|
||||
"<strong>SMART puede mentir.</strong> Un drive puede mostrar todos los atributos en verde y aún así estar a punto de irse — la capa de observaciones captura los síntomas que SMART no expone (en especial ICRC, IDNF, link resets a velocidades SATA más bajas).",
|
||||
"<strong>Separa \"está pasando ahora\" de \"pasó recientemente\".</strong> El Monitor de salud auto-resuelve errores transitorios en cuanto dejan de dispararse, lo cual es genial para mantener limpia la lista de alertas activas — pero aún quieres ver, días después, que este disco tuvo tres errores de E/S esa noche. La tabla de observaciones es la respuesta.",
|
||||
"<strong>Alimenta el modelo de notificación por niveles.</strong> El detector disk_io lee la tasa de observaciones de esta tabla para decidir silent / WARNING / CRITICAL (la ventana deslizante de 24h introducida en 1.2.1.2). El historial es lo que hace posible esa clasificación."
|
||||
],
|
||||
"obsDedupTitle": "Cómo funcionan dedup y re-notificación",
|
||||
"obsDedupBody1": "Las observaciones se deduplican por su <strong>signature</strong> — una huella estable del tipo de error, dispositivo y campos clave de la línea del kernel. El mismo evento repitiéndose sube el <code>occurrence_count</code> de la fila existente en lugar de crear una nueva. Una <strong>signature diferente</strong> en el mismo disco crea una nueva observación y se trata como un evento nuevo para efectos de notificación.",
|
||||
"obsDedupBody2": "Las notificaciones siguen una regla anti-cascada: la primera ocurrencia de una combinación (disco, signature, severidad) dada avisa al operador, y entonces ProxMenux espera 24 horas antes de volver a pingar sobre la misma combinación — aunque el contador siga subiendo. Una severidad escalando (WARNING → CRITICAL) rompe el cooldown para que se le cuente al operador cuando las cosas empeoran, no solo cuando ocurren.",
|
||||
"obsDismissTitle": "Descartar vs resolver",
|
||||
"obsDismissBody1": "Cada fila tiene una acción <strong>dismiss</strong>. Descartar una observación le dice a ProxMenux \"ya lo he visto, deja de notificarme\". <strong>No</strong> congela el contador de ocurrencias — si la misma falla sigue pasando, el contador sigue subiendo en background, listo para alertar de nuevo si alguna vez escala a un nivel de severidad o signature diferente. Una observación descartada sigue visible en la tarjeta con un estilo atenuado, para que un operador futuro pueda seguir viendo \"este disco tuvo historial aquí\".",
|
||||
"obsDismissBody2": "Resolver del lado de error activo (Monitor de salud) es independiente del dismiss de observaciones — la observación persiste más allá del auto-resolve del error activo. Ese es justo el punto: sobrevive, para que un warning transitorio de la semana pasada siga visible hoy en la tarjeta del disco. Mira <link>Monitor de salud</link> para el lado de error activo de la misma imagen."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Cómo se recopilan los datos",
|
||||
"headerSection": "Sección de la pestaña",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Tarjetas resumen superiores",
|
||||
"endpoint": "/api/storage/summary",
|
||||
"source": "Agregado desde <code>lsblk</code>, <code>zpool list</code>, <code>vgs</code> / <code>lvs</code>."
|
||||
},
|
||||
{
|
||||
"section": "Inventario por disco",
|
||||
"endpoint": "/api/storage",
|
||||
"source": "<code>lsblk -O</code> + <code>smartctl -i</code> por dispositivo, con caché estable de identidad de disco (limpiado en eventos de hot-plug)."
|
||||
},
|
||||
{
|
||||
"section": "Almacenamientos Proxmox",
|
||||
"endpoint": "/api/proxmox-storage",
|
||||
"source": "<code>pvesh get /nodes/<node>/storage</code> con el estado active/online de cada uno."
|
||||
},
|
||||
{
|
||||
"section": "Valores SMART actuales",
|
||||
"endpoint": "/api/storage/smart/<disk>",
|
||||
"source": "<code>smartctl -A <dev></code> — refrescado bajo demanda, no cacheado."
|
||||
},
|
||||
{
|
||||
"section": "Historial de self-tests SMART",
|
||||
"endpoint": "/api/storage/smart/<disk>/history",
|
||||
"source": "Almacenado bajo <code>/var/lib/proxmenux-monitor/smart/<disk>/</code> como snapshots JSON."
|
||||
},
|
||||
{
|
||||
"section": "Observaciones permanentes",
|
||||
"endpoint": "/api/storage/observations",
|
||||
"source": "Tabla SQLite alimentada por el Monitor de salud cada ciclo (se mantiene tras auto-resolve)."
|
||||
}
|
||||
],
|
||||
"outro": "Verificar la cadena de recolección en el host:",
|
||||
"codeComment1": "# Traer la snapshot actual desde un script",
|
||||
"codeComment2": "# Cross-check de lo que ve el panel contra la vista raw del SO"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — la categoría discos y E/S y el modelo de supresión."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — los endpoints de storage y SMART."
|
||||
},
|
||||
{
|
||||
"label": "Notificaciones",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tailRich": " — qué disparan aguas abajo <code>disk_io_error</code>, <code>storage_unavailable</code> y <code>smart_test_failed</code>."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — el resto de pestañas."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Disk Manager",
|
||||
"href": "/docs/disk-manager",
|
||||
"tail": " — la cara de las acciones: format / wipe / SMART tests / importar discos a VMs y CTs desde la TUI."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → SMART Disk Health & Test",
|
||||
"href": "/docs/disk-manager/smart-disk-test",
|
||||
"tail": " — la contraparte CLI de esta pestaña: programar tests SMART, exportar el JSON que renderiza el panel y la referencia más profunda de tipos de test / interpretación."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Logs del sistema | ProxMenux Documentation",
|
||||
"description": "La pestaña Logs del sistema reúne tres fuentes en una sola pantalla: journalctl en vivo con filtros y descarga, historial de tareas de Proxmox (UPIDs) y log de notificaciones — todo buscable, filtrable por severidad / rango temporal y descargable como paquetes de texto."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Logs del sistema",
|
||||
"description": "Tres sub-pestañas bajo un mismo techo: el journal del sistema (journalctl con filtros), el historial de tareas de Proxmox y el log de notificaciones. Las tres son buscables, filtrables y descargables como paquetes de texto.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"readOnly": {
|
||||
"title": "Solo lectura por diseño",
|
||||
"body": "Nada en esta pestaña modifica los archivos de log. Los filtros viven en la URL / estado, las descargas son paquetes generados en el servidor. El panel nunca borra entradas de log — para mantenimiento usa el propio <code>journalctl --vacuum-time=<N></code> o <code>logrotate</code> del host."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Fila superior: cuatro contadores",
|
||||
"items": [
|
||||
"<strong>Total Entries</strong> — número de registros dentro de la ventana de filtro activa.",
|
||||
"<strong>Errors</strong> — recuento de severidad ≤ 3 (<code>err</code> / <code>crit</code> / <code>alert</code> / <code>emerg</code>).",
|
||||
"<strong>Warnings</strong> — recuento de severidad 4 (<code>warning</code>).",
|
||||
"<strong>Backups</strong> — recuento de entradas de tareas vzdump / PBS en la misma ventana."
|
||||
]
|
||||
},
|
||||
"subtabs": {
|
||||
"heading": "Tres sub-pestañas",
|
||||
"logsTitle": "Logs",
|
||||
"logsIntro": "El journal del sistema, servido por <code>journalctl</code> en el backend. Filtros disponibles en la barra de herramientas:",
|
||||
"logsFilters": [
|
||||
"<strong>Severidad</strong> — emerg / alert / crit / err / warning / notice / info / debug, o cualquier combinación.",
|
||||
"<strong>Rango temporal</strong> — últimos 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / personalizado.",
|
||||
"<strong>Búsqueda de texto libre</strong> — substring o regex (<code>journalctl --grep</code>).",
|
||||
"<strong>Filtro por unidad</strong> — restringir a una unidad systemd concreta (<code>pveproxy.service</code>, <code>nginx.service</code>, …)."
|
||||
],
|
||||
"logsRowsAfter": "Cada fila muestra timestamp, insignia de severidad, unidad de origen y el mensaje. Los mensajes largos se colapsan con un conmutador \"mostrar más\". La acción <strong>Download</strong> empaqueta el filtro actual en un único archivo <code>.txt</code> vía <code>GET /api/logs/download</code> — útil cuando quieres compartir un trozo del journal con alguien.",
|
||||
"logDetailsModalTitle": "Modal Log Details",
|
||||
"logDetailsBody": "Pulsar cualquier fila abre una modal <strong>Log Details</strong> con cada campo estructurado que journald capturó para esa entrada — la misma vista que construirías a mano ejecutando <code>journalctl --output=verbose</code> en el host.",
|
||||
"logDetailsImageAlt": "Modal Log Details — una entrada del journal desplegada con Level, Service, Timestamp, Source, Systemd Unit, Process ID, Hostname y el mensaje completo",
|
||||
"logDetailsImageCaption": "Modal Log Details — cada campo estructurado que journald lleva para esta entrada, con el mensaje íntegro sin truncar al final. Útil para logs de cron y de servicios donde importa la línea de comandos ejecutada.",
|
||||
"fieldsIntro": "Campos mostrados:",
|
||||
"fields": [
|
||||
"<strong>Level</strong> — insignia de severidad coloreada (INFO / WARNING / ERROR / CRITICAL).",
|
||||
"<strong>Service</strong> — nombre corto de la unidad / proceso que emitió la entrada.",
|
||||
"<strong>Timestamp</strong> — fecha y hora completas de la línea de log.",
|
||||
"<strong>Source</strong> — origen de la entrada (journal, kernel, audit, …).",
|
||||
"<strong>Systemd Unit</strong> — la unidad <code>.service</code> / <code>.timer</code> / <code>.socket</code> real si la entrada estaba asociada a una.",
|
||||
"<strong>Process ID</strong> — PID del proceso emisor.",
|
||||
"<strong>Hostname</strong> — útil cuando los journals se reenvían entre nodos de cluster.",
|
||||
"<strong>Message</strong> — el mensaje completo sin truncar en un bloque monoespaciado, listo para copiar."
|
||||
],
|
||||
"maxLevelStoreTitle": "MaxLevelStore de journald",
|
||||
"maxLevelStoreBody": "En una instalación recién hecha de Proxmox, journald usa por defecto <code>MaxLevelStore=warning</code>, lo que descarta en silencio los mensajes de nivel info. El Monitor lo detecta en el arranque y añade un drop-in (<code>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</code>) que sube el umbral a <code>info</code> para que la pestaña Logs tenga algo que mostrar en todas las severidades.",
|
||||
"backupsTitle": "Backups",
|
||||
"backupsBody": "Historial de tareas de Proxmox filtrado a las entradas relacionadas con backup. Una fila por tarea (<code>vzdump</code>, transferencias PBS, Garbage Collect, Verify) con el estado (OK / WARNINGS / ERROR), el guest implicado, el almacenamiento de origen, la duración y el UPID. Pulsa una fila para cargar el log completo de la tarea vía <code>GET /api/task-log/<upid></code> — los mismos datos que Proxmox expone a través de <em>Datacenter → Tasks</em>, acotado a backups.",
|
||||
"notificationsTitle": "Notifications",
|
||||
"notificationsBody1": "Cada notificación enviada por el Monitor — Telegram, Discord, Email, Gotify, ntfy, Slack, Teams, webhook. Cada fila: timestamp, canal, tipo de evento, severidad, el título renderizado, el cuerpo renderizado y (si IA está activa) un conmutador para ver la reescritura con IA junto al original.",
|
||||
"notificationsBody2": "Usa esta pestaña para verificar que un canal está entregando de verdad y para comparar lo que produjo la reescritura con IA frente a la plantilla base. La configuración de canales vive en la página detallada de <link>Notificaciones</link>."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Cómo se recopilan los datos",
|
||||
"headerSubtab": "Sub-pestaña",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"subtab": "Logs (filtro en vivo)",
|
||||
"endpoint": "/api/logs",
|
||||
"source": "<code>journalctl --output json --since <range></code> con filtros de severidad / unidad / búsqueda aplicados en el servidor."
|
||||
},
|
||||
{
|
||||
"subtab": "Download",
|
||||
"endpoint": "/api/logs/download",
|
||||
"source": "La misma consulta, devuelta como texto plano para grep / less."
|
||||
},
|
||||
{
|
||||
"subtab": "Backups",
|
||||
"endpoint": "/api/backups",
|
||||
"source": "Historial de tareas PVE filtrado por <code>vzdump</code>, transferencias PBS, Garbage Collect, Verify."
|
||||
},
|
||||
{
|
||||
"subtab": "Vista en detalle de una tarea de backup",
|
||||
"endpoint": "/api/task-log/<upid>",
|
||||
"source": "Log completo de la tarea en texto plano leído de <code>/var/log/pve/tasks/<index>/<upid></code>."
|
||||
},
|
||||
{
|
||||
"subtab": "Historial de notificaciones",
|
||||
"endpoint": "/api/notifications/history",
|
||||
"source": "Tabla SQLite <code>notification_history</code> alimentada por el loop de envío."
|
||||
}
|
||||
],
|
||||
"apiIntro": "Tanto el filtro en vivo como las descargas también son accesibles vía API:",
|
||||
"codeComment1": "# Última hora de errores y peores, con una keyword",
|
||||
"codeComment2": "# Descargar el journal completo de las últimas 6 horas como texto plano",
|
||||
"codeComment3": "# Consultar la salida completa de una tarea concreta por UPID"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — la categoría Logs del sistema que vigila patrones persistentes / picos / cascadas."
|
||||
},
|
||||
{
|
||||
"label": "Notificaciones",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — el watcher del journal lee la misma fuente y convierte coincidencias en notificaciones."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — los endpoints logs y task-log con sus parámetros de consulta."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — el resto de pestañas."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Resumen del sistema | ProxMenux Documentation",
|
||||
"description": "La pestaña por defecto al abrir ProxMenux Monitor: cuatro tarjetas de métricas (CPU, memoria, VMs y LXCs activos, temperatura) con actualizaciones en vivo y sparkline, la gráfica de métricas históricas y los paneles condensados de Almacenamiento y Red con acceso directo a sus pestañas dedicadas."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Resumen del sistema",
|
||||
"description": "La primera pestaña que abre el panel. Cuatro tarjetas de métricas en vivo arriba, la gráfica de métricas históricas en el medio y paneles condensados de almacenamiento / red abajo — todo derivado de las mismas APIs que alimentan las pestañas dedicadas.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"readOnly": {
|
||||
"title": "Un vistazo de solo lectura",
|
||||
"body": "Nada en esta pestaña es una superficie de control — todos los paneles son informativos. Las acciones viven en las pestañas dedicadas a las que enlazan: entra en Almacenamiento para gestionar discos, en VMs y LXCs para arrancar / parar guests, en la pestaña Seguridad para configurar autenticación, y así sucesivamente."
|
||||
},
|
||||
"captureAlt": "Pestaña Resumen del sistema — cuatro tarjetas de métricas (CPU, Memoria, VMs activos, Temperatura), gráfica de métricas del nodo y tarjetas resumen de Almacenamiento / Red",
|
||||
"captureCaption": "La pestaña Resumen del sistema — la que abre el panel. Las cuatro tarjetas están en vivo, la gráfica de debajo es histórica y las dos tarjetas de abajo resumen Almacenamiento y Red.",
|
||||
"topRow": {
|
||||
"heading": "Fila superior: tarjetas de métricas en vivo",
|
||||
"intro": "Cuatro tarjetas en una rejilla 2×2 en móvil, una sola fila en escritorio. Cada una se actualiza desde <code>/api/system</code> cada pocos segundos.",
|
||||
"headerCard": "Tarjeta",
|
||||
"headerWhat": "Qué muestra",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"card": "CPU Usage",
|
||||
"what": "Porcentaje actual con barra de progreso. Se actualiza cada ~1 s vía el sampler de signos vitales.",
|
||||
"source": "psutil.cpu_percent()"
|
||||
},
|
||||
{
|
||||
"card": "Memory Usage",
|
||||
"what": "GB usados, porcentaje, GB totales. La barra de progreso sigue al porcentaje.",
|
||||
"source": "psutil.virtual_memory()"
|
||||
},
|
||||
{
|
||||
"card": "Active VM & LXC",
|
||||
"what": "Recuento de guests actualmente en ejecución, con una insignia de desglose Running / Stopped y una línea al pie con los totales de VMs y LXCs.",
|
||||
"source": "/api/vms (consolidado)"
|
||||
},
|
||||
{
|
||||
"card": "Temperature",
|
||||
"what": "Temperatura de CPU en °C con insignia de estado (cool / warm / hot) y un sparkline de 5 minutos detrás. Muestra <em>N/A</em> cuando no se detecta sensor. Pulsa para abrir la modal de detalle de temperatura.",
|
||||
"source": "sensors / coretemp"
|
||||
}
|
||||
],
|
||||
"thresholdsTitle": "Colores de estado y umbrales aplicados aquí",
|
||||
"thresholdsIntro": "Cada anillo, barra y sparkline en las cuatro tarjetas de métricas sigue la misma clasificación — <green/> <strong>verde</strong> por debajo de Warning, <amber/> <strong>ámbar</strong> entre Warning y Critical, <red/> <strong>rojo</strong> en Critical y por encima. Valores por defecto recomendados que vienen con ProxMenux:",
|
||||
"thresholdsItems": [
|
||||
"<strong>Uso de CPU</strong> — Warning 85 %, Critical 95 %.",
|
||||
"<strong>Memoria</strong> — Warning 85 %, Critical 95 % (el swap también dispara Critical al 5 % usado — un host Proxmox sano apenas debería tocar swap).",
|
||||
"<strong>Temperatura de CPU</strong> — Warning 80 °C, Critical 90 °C."
|
||||
],
|
||||
"thresholdsOutro": "Cada valor es configurable por host — <link>Settings → Health Monitor Thresholds</link> es la fuente única de verdad y explica cómo ajustarlos.",
|
||||
"sparklineTitle": "El sparkline es significativo",
|
||||
"sparklineBody": "La tarjeta de temperatura dibuja una traza de 5 minutos bajo el valor, con la línea y el degradado siguiendo el mismo par Warning/Critical documentado arriba. Es la forma más rápida de ver si el host está en escalada térmica sin abrir la modal de detalle."
|
||||
},
|
||||
"middle": {
|
||||
"heading": "Medio: gráficas de métricas del nodo",
|
||||
"body1": "Bajo la fila superior se encuentra el componente <code>NodeMetricsCharts</code> — gráficas históricas de CPU, memoria y E/S de disco tomadas del propio almacén RRD de Proxmox vía <code>/api/node/metrics</code>. Un selector de timeframe alterna entre <em>1 hora / 24 horas / 7 días / 30 días / 1 año</em>; la resolución de los datos baja a medida que crece la ventana para que la gráfica se mantenga fluida.",
|
||||
"body2": "Son las mismas gráficas que la UI web de Proxmox renderiza para un nodo, simplemente consolidadas en el tema oscuro del Monitor y alineadas con el resto de paneles."
|
||||
},
|
||||
"bottom": {
|
||||
"heading": "Fila inferior: resúmenes de Almacenamiento y Red",
|
||||
"storageTitle": "Tarjeta Storage Overview",
|
||||
"storageIntro": "Una vista condensada del estado de almacenamiento del host, dividida en tres bloques:",
|
||||
"storageItems": [
|
||||
"<strong>Total Node Capacity</strong> — suma de todos los almacenamientos de VM/LXC más el almacenamiento local de sistema, con una barra de progreso en degradado del reparto total usado / libre.",
|
||||
"<strong>Total Capacity / Physical Disks</strong> — titular de capacidad bruta y el recuento de discos físicos descubiertos.",
|
||||
"<strong>VM/LXC Storage</strong> — usado / libre / porcentaje para los almacenamientos donde viven los guests, más un contador cuando hay más de uno configurado.",
|
||||
"<strong>Local Storage (System)</strong> — el propio mount raíz / sistema del host, separado del pool de guests."
|
||||
],
|
||||
"storageDrillIn": "La vista en detalle vive en la <link>pestaña Almacenamiento</link> — SMART por disco, detalles de pool ZFS, historial de observaciones, etc.",
|
||||
"networkTitle": "Tarjeta Network Overview",
|
||||
"networkBody1": "La línea superior muestra el recuento de interfaces activas (físicas + bridges combinados). Debajo, dos filas de insignias coloreadas para las interfaces en <code>up</code> — NICs físicas en azul, bridges en un color secundario. Un selector de timeframe arriba a la derecha (1 hora / 24 horas / 7 días / 30 días / 1 año) controla una pequeña gráfica de tráfico RX / TX.",
|
||||
"networkBody2": "La vista en detalle por interfaz (IP/MAC, gráfica RRD, miembros del bridge, modo del bond, etc.) vive en la <link>pestaña Red</link>."
|
||||
},
|
||||
"refresh": {
|
||||
"heading": "Modelo de refresco",
|
||||
"intro": "Cada panel gestiona su propio estado de carga (<code>loadingStates.cpu</code>, <code>loadingStates.storage</code>, …) para que una fuente lenta no bloquee al resto. Mientras un panel está obteniendo datos, muestra un skeleton con animación pulse; los fetchs fallidos degradan con elegancia — por ejemplo, un sensor de temperatura ausente renderiza la tarjeta como <em>N/A</em> en vez de un error.",
|
||||
"items": [
|
||||
"<strong>Tarjetas de métricas superiores</strong> — refresco cada ~5 s. Los paneles de CPU y temperatura también reciben un push de 1 s del sampler de signos vitales.",
|
||||
"<strong>Gráfica de métricas del nodo</strong> — refresco cada 30 s, o al cambiar de timeframe.",
|
||||
"<strong>Tarjeta de almacenamiento</strong> — refresco cada 60 s. Los datos SMART se cachean más tiempo (la pestaña Almacenamiento dispara una lectura fresca bajo demanda).",
|
||||
"<strong>Tarjeta de red</strong> — refresco cada 5 s en el timeframe activo.",
|
||||
"<strong>Refresco manual</strong> — el botón Refresh en la cabecera fuerza a todos los paneles a recargar inmediatamente."
|
||||
]
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Cómo se recopilan los datos",
|
||||
"headerCard": "Tarjeta",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Pastilla de estado de la cabecera",
|
||||
"endpoint": "/api/health",
|
||||
"source": "El estado global cacheado que produce el Monitor de salud en cada ciclo."
|
||||
},
|
||||
{
|
||||
"card": "CPU / RAM / Swap / Uptime",
|
||||
"endpoint": "/api/system",
|
||||
"source": "<code>/proc/stat</code>, <code>/proc/meminfo</code>, <code>/proc/uptime</code> con muestreo de CPU en ventana corta."
|
||||
},
|
||||
{
|
||||
"card": "Info del host (kernel, BIOS, distro)",
|
||||
"endpoint": "/api/info",
|
||||
"source": "<code>uname -a</code>, <code>dmidecode</code>, versión de PVE. Cacheado por proceso."
|
||||
},
|
||||
{
|
||||
"card": "Tarjetas de almacenamiento / red / VMs",
|
||||
"endpoint": "/api/storage/summary, /api/network/summary, /api/vms",
|
||||
"source": "Mira las pestañas dedicadas para cada una. Las tarjetas de la cabecera muestran una vista compactada de los mismos endpoints."
|
||||
},
|
||||
{
|
||||
"card": "Cadencia de refresco",
|
||||
"endpoint": "—",
|
||||
"source": "CPU / red 5 s; almacenamiento / VMs 30 s; info estática cada 5 min. El botón Refresh de la cabecera fuerza una recarga inmediata en todos los paneles."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Llamada única que alimenta la pastilla de la cabecera",
|
||||
"codeComment2": "# pública, sin token",
|
||||
"codeComment3": "# Snapshot autenticada que usan las tarjetas"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — la modal detrás de la pastilla de estado de la cabecera (diez categorías, descartes, supresión)."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — los endpoints system, info y health."
|
||||
},
|
||||
{
|
||||
"label": "Notificaciones",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — cómo los mismos estados se convierten en mensajes de Telegram / Discord / Email."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — las otras ocho pestañas de un vistazo."
|
||||
},
|
||||
{
|
||||
"label": "Arquitectura",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — los hilos en background y las APIs que alimentan esta vista."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Terminal | ProxMenux Documentation",
|
||||
"description": "Shell en el navegador al host Proxmox: hasta 4 terminales a la vez con vista en rejilla, ayudas de teclado para móvil (ESC, TAB, flechas, combinaciones con Ctrl), una chuleta de comandos integrada con cheat.sh, protegida con JWT."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Terminal",
|
||||
"description": "Una sesión real de shell en el navegador, sobre el host Proxmox. Hasta cuatro terminales a la vez, ayudas de teclado para móvil, una chuleta de comandos integrada — todo en el mismo tema que el resto del panel.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Un PTY real en el navegador",
|
||||
"body": "El terminal asigna una PTY del lado del servidor a través de <code>flask_terminal_routes</code>, la canaliza por un WebSocket hacia <code>xterm.js</code> en el navegador y se ejecuta como <code>root</code> (el usuario de la unidad systemd). Cualquier cosa que puedas hacer en <code>ssh root@<host></code> funciona aquí — incluidos <code>vim</code>, <code>tmux</code>, herramientas ncurses y las CLIs de Proxmox (<code>qm</code>, <code>pct</code>, <code>pvesh</code>, <code>pvecm</code>)."
|
||||
},
|
||||
"singleAlt": "Pestaña Terminal de ProxMenux Monitor — una única sesión de terminal mostrando el resumen del sistema de Fastfetch al hacer login",
|
||||
"singleCaption": "Un terminal del host abierto — la barra de arriba muestra el recuento (<em>1 / 4 terminals</em>), <em>+ New</em>, <em>Search</em>, <em>Clear</em> y <em>Close</em>. Las ayudas de teclado para móvil aparecen bajo el terminal en dispositivos táctiles.",
|
||||
"target": {
|
||||
"heading": "Destino de la conexión",
|
||||
"body1": "La pestaña Terminal abre una shell en el <strong>propio host Proxmox</strong> — el mismo login que obtendrías por SSH. Cada pestaña abre un terminal del host completamente nuevo.",
|
||||
"body2": "Para llegar a un <strong>contenedor LXC</strong> desde el navegador, usa el botón <em>Console</em> dedicado en cada tarjeta de CT en ejecución de la <link>pestaña VMs y LXCs</link>. Abre una modal que ejecuta <code>pct enter <vmid></code> y reutiliza la misma barra para móvil descrita abajo."
|
||||
},
|
||||
"fourTerminals": {
|
||||
"heading": "Hasta cuatro terminales a la vez",
|
||||
"intro": "La pestaña te permite abrir hasta cuatro terminales del host simultáneamente. Cada uno obtiene su propia PTY y su propio WebSocket — son sesiones totalmente independientes. Dos layouts se alternan con los iconos junto al botón \"New\":",
|
||||
"items": [
|
||||
"<strong>Vista en pestañas</strong> — un terminal visible a la vez, los demás como pestañas nombradas arriba (<em>Terminal 1</em>, <em>Terminal 2</em>…). Ideal para trabajar en una tarea con el resto en background.",
|
||||
"<strong>Vista en rejilla</strong> — todos los terminales abiertos visibles a la vez en una rejilla 2×2. Útil para vigilar <code>htop</code> en un panel, <code>iftop</code> en otro y editar en un tercero sin saltar entre ellos."
|
||||
],
|
||||
"outro": "La barra muestra el recuento actual (<em>1/4 terminals</em>, <em>4/4 terminals</em>). Las nuevas pestañas se abren con <strong>+ New</strong> y las individuales se cierran desde la pequeña <code>×</code> en la cabecera de la pestaña. El botón rojo grande <strong>Close</strong> de arriba derriba todos los terminales a la vez."
|
||||
},
|
||||
"gridAlt": "Pestaña Terminal de ProxMenux Monitor — vista en rejilla con cuatro terminales del host ejecutando ls, configuración de red, iftop y el menú principal de ProxMenux uno al lado del otro",
|
||||
"gridCaption": "Vista en rejilla (4 / 4 terminals) — cuatro PTYs del host independientes corriendo en paralelo: listado de directorio, <code>/etc/network/interfaces</code> en un lado, <code>iftop</code> en otro y el menú principal de ProxMenux en el cuarto. Alterna entre rejilla y pestañas con el conmutador de layout en la barra.",
|
||||
"keyboard": {
|
||||
"heading": "Ayudas de teclado para móvil",
|
||||
"intro": "Los teclados de móvil y tablet normalmente no exponen ESC, TAB, las flechas ni combinaciones con modificadores. Sin ellos, navegar por <code>vim</code>, <code>nano</code>, <code>htop</code> o cualquier menú TUI es imposible. La pestaña Terminal lo resuelve renderizando una fila de botones táctiles bajo el terminal siempre que el dispositivo sea suficientemente pequeño o tenga capacidad táctil:",
|
||||
"headerButton": "Botón",
|
||||
"headerSends": "Envía",
|
||||
"headerUse": "Uso típico",
|
||||
"rows": [
|
||||
{
|
||||
"button": "ESC",
|
||||
"sends": "\\x1b",
|
||||
"use": "Salir del modo insertar en <code>vim</code>, cancelar un diálogo TUI, abandonar una búsqueda."
|
||||
},
|
||||
{
|
||||
"button": "TAB",
|
||||
"sends": "\\t",
|
||||
"use": "Autocompletado de rutas, navegación de campos en dialog/whiptail."
|
||||
},
|
||||
{
|
||||
"button": "↑ ↓ ← →",
|
||||
"sends": "\\x1bO[ABCD]",
|
||||
"use": "Historial de la shell, movimiento del cursor, navegación de menús."
|
||||
},
|
||||
{
|
||||
"button": "↵ Enter",
|
||||
"sends": "\\r",
|
||||
"use": "Confirmar. Algunos teclados en pantalla cambian Enter por Go/Done — este botón es inequívoco."
|
||||
},
|
||||
{
|
||||
"button": "Ctrl ▾",
|
||||
"sends": "Desplegable",
|
||||
"useRich": true
|
||||
}
|
||||
],
|
||||
"ctrlIntro": "Tres secuencias de control:",
|
||||
"ctrlItems": [
|
||||
"<code>Ctrl+C</code> — cancelar / interrumpir el comando en ejecución (<code>\\x03</code>).",
|
||||
"<code>Ctrl+X</code> — salir de <code>nano</code> (<code>\\x18</code>).",
|
||||
"<code>Ctrl+R</code> — búsqueda inversa en el historial de bash (<code>\\x12</code>)."
|
||||
],
|
||||
"modalTitle": "Misma barra en la modal de consola LXC",
|
||||
"modalBody": "La consola del contenedor que lanzas desde <link>VMs y LXCs → Console</link> renderiza las mismas ayudas de teclado bajo la modal. La modal además auto-tipea <code>pct enter <vmid></code> al conectar, para que aterrices directamente dentro del contenedor."
|
||||
},
|
||||
"lxcAlt": "Modal de consola LXC de ProxMenux Monitor — Terminal: ubuntu (ID: 103) con la misma barra para móvil (ESC, TAB, flechas, Enter, Ctrl) bajo el terminal",
|
||||
"lxcCaption": "La modal de consola LXC — abierta desde <em>VMs y LXCs → Console</em>. La cabecera muestra el contenedor de destino (<em>Terminal: ubuntu (ID: 103)</em>) y la misma barra táctil aparece bajo el terminal.",
|
||||
"search": {
|
||||
"heading": "Search Commands — chuleta integrada",
|
||||
"intro": "El botón azul <strong>Search</strong> de la barra abre una modal con búsqueda difusa de comandos. Escribe unas letras de cualquier comando de Linux o Proxmox (<code>ls</code>, <code>tar</code>, <code>qm</code>, <code>pct</code>, <code>zpool</code>, <code>systemctl</code>…) y la modal lista ejemplos de uso con <em>Send to active terminal</em> de un solo toque. Elimina el viaje de ida y vuelta \"espera, ¿qué flag era esa?\" a otra pestaña del navegador.",
|
||||
"modalAlt": "Modal Search Commands de ProxMenux Monitor — búsqueda difusa de comandos de Linux y Proxmox con cheat.sh, mostrando varios ejemplos de uso de ls",
|
||||
"modalCaption": "La modal Search Commands consultando <code>ls</code> — cada resultado muestra el comando, su descripción y una pequeña flecha \"send\" que lo canaliza al terminal activo. La esquina inferior derecha indica la fuente de los datos (<em>Powered by cheat.sh</em>).",
|
||||
"aboutLabel": "Sobre cheat.sh:",
|
||||
"aboutBody": "es una chuleta unificada de código abierto y curada por la comunidad que agrega ejemplos cortos y prácticos de uso para cientos de comandos de Linux, herramientas de sysadmin y lenguajes de programación. Diseñada originalmente para consultarse desde un terminal con <code>curl cheat.sh/<command></code>, también es accesible desde cualquier navegador. ProxMenux Monitor pasa las consultas por un proxy en el servidor para que la modal siga funcionando bajo el mismo origen que el panel.",
|
||||
"headerSource": "Fuente",
|
||||
"headerWhen": "Cuándo se usa",
|
||||
"headerWhat": "Lo que ves",
|
||||
"onlineLabel": "(online)",
|
||||
"onlineWhen": "Cuando el host tiene acceso a internet y el proxy de cheat.sh responde.",
|
||||
"onlineWhat": "Varios ejemplos del mundo real por comando, tipeados con su descripción encima. El punto de estado en la cabecera de la modal es <green>verde</green>.",
|
||||
"fallbackLabel": "Fallback local",
|
||||
"fallbackWhen": "Cuando cheat.sh no está disponible (host offline, firewall restrictivo, caída de cheat.sh).",
|
||||
"fallbackWhat": "Una lista empaquetada de comandos comunes de Linux + Proxmox. Catálogo más pequeño pero siempre disponible. El punto de estado es <red>rojo</red>.",
|
||||
"sendingNote": "<strong>Cómo funciona el envío</strong>: pulsar la pequeña flecha \"send\" junto a un resultado reenvía el texto del comando al terminal que esté activo en ese momento (la pestaña enfocada, o la última en la que pulsaste en la vista en rejilla). La modal se cierra automáticamente para que puedas darle a Enter inmediatamente."
|
||||
},
|
||||
"auth": {
|
||||
"heading": "Autenticación",
|
||||
"items": [
|
||||
"El upgrade WebSocket lleva el JWT en la cabecera <code>Authorization</code>. Si la autenticación está activa y el token falta o ha caducado, la conexión se rechaza con HTTP 401 antes de asignar una PTY.",
|
||||
"Si el Monitor está detrás de un reverse proxy, el proxy debe reenviar los upgrades WebSocket. Mira la página <link>Acceso y autenticación</link> para snippets de Nginx / Caddy / Traefik."
|
||||
]
|
||||
},
|
||||
"clipboard": {
|
||||
"heading": "Portapapeles, scrollback y resize",
|
||||
"items": [
|
||||
"<strong>Copiar / pegar</strong> — usa el portapapeles nativo del navegador. Selecciona texto con el ratón / trackpad y usa el atajo del SO (<code>Cmd+C</code> en macOS, <code>Ctrl+Shift+C</code> en Linux/Windows). Los escritorios Linux también soportan pegar con el botón central del ratón.",
|
||||
"<strong>Scrollback</strong> — rueda / scroll con dos dedos. xterm.js mantiene las últimas varios miles de líneas en memoria.",
|
||||
"<strong>Resize</strong> — el terminal renegocia el tamaño de ventana de la PTY cuando redimensionas el panel del dashboard, así <code>htop</code> y <code>vim</code> renderizan bien.",
|
||||
"<strong>Reconexión al recuperar foco de la pestaña</strong> — si cambias de app en móvil o tablet (comportamiento habitual en iPad), el WebSocket normalmente caería. La pestaña Terminal detecta el cambio de visibilidad y reconecta automáticamente al volver, con un timeout de 15 segundos para rutas VPN lentas."
|
||||
]
|
||||
},
|
||||
"disconnect": {
|
||||
"heading": "Causas de desconexión",
|
||||
"intro": "Las razones más comunes por las que termina una sesión y qué hacer con cada una:",
|
||||
"headerCause": "Causa",
|
||||
"headerFix": "Solución",
|
||||
"rows": [
|
||||
{
|
||||
"cause": "JWT de sesión caducado (ventana de 24 h).",
|
||||
"fix": "Refresca la página y vuelve a hacer login. El terminal no está pensado para sesiones desatendidas, así que el tiempo de vida del JWT coincide con el del login normal del panel."
|
||||
},
|
||||
{
|
||||
"cause": "Timeout de idle del reverse proxy.",
|
||||
"fix": "Sube <code>proxy_read_timeout</code> en Nginx o el equivalente en Caddy / Traefik (snippets en Acceso y autenticación)."
|
||||
},
|
||||
{
|
||||
"cause": "Móvil o tablet en sleep.",
|
||||
"fix": "Cuando el dispositivo despierta, la pestaña auto-reconecta (timeout de 15 s para rutas VPN). Si no lo hace, recarga la pestaña."
|
||||
},
|
||||
{
|
||||
"cause": "Reinicio del servicio en el host.",
|
||||
"fix": "Cualquier reinicio de <code>proxmenux-monitor.service</code> tira todas las PTY. Abre nuevos terminales una vez el panel termine de recargar."
|
||||
}
|
||||
]
|
||||
},
|
||||
"warning": {
|
||||
"title": "El terminal es una shell de root sobre el host",
|
||||
"body": "El terminal hereda la identidad de la unidad systemd (<code>root</code>) y por tanto tiene privilegios totales sobre el host Proxmox. Configura un usuario, contraseña y 2FA en <authLink>Acceso y autenticación</authLink> antes de exponer el panel más allá de tu red local: cualquiera que llegue al puerto 8008 sin autenticación aterrizaría directamente en una shell de root — sin prompts adicionales, sin credenciales SSH. Para acceso desde fuera de la LAN, enruta el panel a través de <gatewayLink>Secure Gateway</gatewayLink> (Tailscale) o un reverse proxy con HTTPS, en lugar de abrir el puerto a la internet pública."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Acceso y autenticación",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — snippets de reverse proxy incluyendo las líneas de upgrade WebSocket que requiere el terminal."
|
||||
},
|
||||
{
|
||||
"label": "Arquitectura",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tail": " — el transporte WebSocket (HTTP vía flask-sock vs HTTPS / WSS vía gevent)."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — los endpoints WebSocket /ws/terminal y /ws/script/<sid> junto al resto de la API."
|
||||
},
|
||||
{
|
||||
"label": "Integraciones → Secure Gateway",
|
||||
"href": "/docs/monitor/integrations",
|
||||
"tail": " — cuando quieres acceso al terminal desde fuera de la LAN sin exponer el puerto 8008."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — el resto de pestañas."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña VMs y LXCs | ProxMenux Documentation",
|
||||
"description": "La pestaña VMs y LXCs inventaría cada guest del host con uso de CPU / memoria / disco en vivo. La vista en detalle por guest muestra configuración, recursos, backups, logs completos del guest, notas y controles Start / Shutdown / Reboot / Stop."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña VMs y LXCs",
|
||||
"description": "El inventario completo de guests del nodo. Cuatro métricas titulares arriba, una lista ordenable con cada VM y LXC abajo y una vista en detalle por guest con config, recursos, backups, logs y los cuatro controles de ciclo de vida (Start / Shutdown / Reboot / Stop).",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "La superficie de control para guests",
|
||||
"body": "El resto de pestañas son de solo lectura; esta es desde la que actúas. Todo lo que cambia el estado de un guest pasa por <code>POST /api/vms/<vmid>/control</code> con una confirmación explícita y la respuesta se refleja de vuelta en la fila del guest. No hay force-shutdown sin pasar por el botón Stop dedicado."
|
||||
},
|
||||
"topRow": {
|
||||
"heading": "Fila superior: cuatro tarjetas de estadísticas",
|
||||
"intro": "Al abrir la pestaña VMs y LXCs aterrizas en un resumen de cuatro tarjetas del estado de los guests — totales, utilización de CPU, compromiso de memoria vs capacidad del host y asignación de disco.",
|
||||
"imageAlt": "Pestaña VMs y LXCs — fila superior de cuatro tarjetas de estadísticas: Total VMs & LXCs, Total CPU, Total Memory, Total Disk",
|
||||
"imageCaption": "Fila superior de la pestaña VMs y LXCs — totales + insignias Running / Stopped, utilización actual de CPU, memoria desglosada en used / running-allocated / total-allocated (con una insignia Within Limits) y espacio de disco asignado.",
|
||||
"headerCard": "Tarjeta",
|
||||
"headerWhat": "Qué muestra",
|
||||
"totalLabel": "Total VMs & LXCs",
|
||||
"totalWhat": "Recuento total con dos insignias — <em>X Running</em> (verde) y <em>Y Stopped</em> (rojo, solo cuando > 0). El número que miras cuando algo no volvió tras un reinicio.",
|
||||
"cpuLabel": "Total CPU",
|
||||
"cpuWhat": "Utilización agregada de CPU en vivo a lo largo de todos los guests como porcentaje de la CPU física del host, con una línea al pie <em>\"Allocated CPU usage\"</em>.",
|
||||
"memoryLabel": "Total Memory",
|
||||
"memoryIntro": "Tres lecturas apiladas verticalmente:",
|
||||
"memoryItems": [
|
||||
"<strong>Currently used</strong> — valor grande (p. ej. <em>15.4 GB</em>) más <em>X.X % de Y GB</em> contra la RAM total del host. Una barra de progreso azul sigue al porcentaje.",
|
||||
"<strong>Running allocated</strong> + <strong>Total allocated</strong> — suma de <code>maxmem</code> a lo largo de los guests que están <em>actualmente up</em> junto a la misma suma a lo largo de <em>todos</em> los guests incluyendo los parados. El primero importa hoy; el segundo importa cuando arrancas todo a la vez.",
|
||||
"<strong>Insignia Within Limits</strong> (verde) — pasa a <em>Over-committed</em> si el total asignado excede la RAM del host. Un over-commit sano de memoria está bien en hosts con KSM, pero la insignia es el aviso temprano cuando ya no es cómodo."
|
||||
],
|
||||
"diskLabel": "Total Disk",
|
||||
"diskWhat": "Suma del espacio de disco asignado a lo largo de todos los guests, en la unidad adecuada (GB / TB), con la línea al pie <em>\"Allocated disk space\"</em>."
|
||||
},
|
||||
"inventory": {
|
||||
"heading": "Lista Virtual Machines & Containers",
|
||||
"intro": "Una fila por guest. La lista se nutre de una única fuente, <code>/api/vms</code>, que consolida <code>qm list</code> + <code>pct list</code> + <code>pvesh /cluster/resources</code> en el host.",
|
||||
"imageAlt": "Lista Virtual Machines & Containers — una fila por guest con estado, insignia de tipo, nombre, ID y porcentajes inline de CPU / memoria / disco",
|
||||
"imageCaption": "El layout optimizado para móvil del inventario — los mismos datos que muestra la vista de escritorio, reapilados en una sola columna con los porcentajes e indicadores de estado compactos.",
|
||||
"rowsIntro": "Cada fila muestra:",
|
||||
"rows": [
|
||||
"<strong>Icono de estado</strong> — play verde (running) o cuadrado rojo (stopped). Para guests parados, el resto de la fila se atenúa para que veas al instante qué está offline.",
|
||||
"<strong>Insignia de tipo</strong> — <em>LXC</em> (cian) para contenedores, <em>VM</em> (morado) para máquinas virtuales.",
|
||||
"<strong>Nombre</strong> — hostname / nombre de display del guest.",
|
||||
"<strong>VMID</strong> — el ID numérico de Proxmox bajo el nombre.",
|
||||
"<strong>Métricas inline</strong> — tres porcentajes con su icono (CPU %, Memory %, Disk %). Cada icono se pone naranja cuando la métrica cruza un umbral de atención (p. ej. memoria por encima del 90 %), así un vistazo rápido te dice qué guest está bajo presión sin abrirlo."
|
||||
],
|
||||
"clickHint": "Pulsar cualquier fila — running o stopped — abre la modal de vista en detalle descrita abajo.",
|
||||
"mobileTitle": "La lista está construida mobile-first",
|
||||
"mobileBody": "En móviles y ventanas estrechas el inventario reflowea a una única columna con insignia de tipo, nombre, ID y los tres porcentajes de métricas, uno por línea — exactamente la captura de arriba. En viewports más anchos los mismos datos se reparten horizontalmente con más espacio para los porcentajes. De cualquier modo, cada fila es el mismo target completo: pulsa para entrar."
|
||||
},
|
||||
"drillIn": {
|
||||
"heading": "Modal de vista en detalle por guest",
|
||||
"intro": "La modal abre con una cabecera que muestra el nombre del guest, VMID, insignia de tipo (LXC / VM), insignia de estado (RUNNING / STOPPED / …) y el uptime actual. Bajo la cabecera hay <strong>dos pestañas</strong> — <em>Status</em> y <em>Backups</em> — y una barra de acciones fija al pie de la modal con los cuatro controles de ciclo de vida (Start / Shutdown / Reboot / Force Stop) y, en contenedores LXC en ejecución, un botón Console.",
|
||||
"statusTitle": "Pestaña 1 — Status",
|
||||
"statusImageAlt": "Modal de vista en detalle por guest — pestaña Status con tarjetas en vivo de CPU / Memoria / Disco, totales de E/S de disco y red, el logo de distro del SO y el bloque Resources / IP Addresses",
|
||||
"statusImageCaption": "Pestaña Status — CPU / Memoria / Disco en vivo con barras de progreso arriba, totales de E/S acumulados (lectura/escritura de disco, descarga/subida de red) abajo, después el bloque estático Resources con expansiones de Notes y + Info y la lista de pastillas IP Addresses.",
|
||||
"statusIntro": "La pestaña por defecto — la vista \"¿este guest se está portando?\". Tres bloques:",
|
||||
"liveTitle": "1. Fila de métricas en vivo",
|
||||
"liveItems": [
|
||||
"<strong>CPU Usage (X cores)</strong> — porcentaje actual con barra de progreso. La cabecera muestra el recuento de cores configurado para que sepas qué significaría un 100 %.",
|
||||
"<strong>Memory</strong> — <em>used / max</em> en GB con barra de progreso.",
|
||||
"<strong>Disk</strong> — <em>used / max</em> a lo largo de la imagen de disco primaria del guest, misma forma."
|
||||
],
|
||||
"ioTitle": "2. Totales de E/S + logo del SO",
|
||||
"ioItems": [
|
||||
"<strong>Disk I/O</strong> — totales acumulados de lectura (↓) y escritura (↑) desde el arranque. Útil para detectar un guest que se ha vuelto de repente intensivo en E/S comparado con su baseline.",
|
||||
"<strong>Network I/O</strong> — descarga (↓) y subida (↑) acumuladas. Misma idea en el lado de red.",
|
||||
"<strong>Logo de distro del SO</strong> — el icono de Debian / Ubuntu / Alpine / Windows / etc. detectado del tipo de SO del guest. Una pista visual rápida cuando scrolleas varias modales abiertas."
|
||||
],
|
||||
"resourcesTitle": "3. Bloque Resources",
|
||||
"resourcesIntro": "La configuración del guest tal como la ve Proxmox — CPU Cores, Memory (<code>maxmem</code> configurado), Swap. Dos botones colapsables en la cabecera del bloque:",
|
||||
"resourcesItems": [
|
||||
"<strong>Notes</strong> — el campo de descripción del guest. Editable: escribir aquí y guardar llama <code>PUT /api/vms/<vmid>/config</code> y escribe de vuelta en <code>/etc/pve/qemu-server/<vmid>.conf</code> o <code>/etc/pve/lxc/<vmid>.conf</code>.",
|
||||
"<strong>+ Info</strong> — campos extra que son demasiado verbosos para la vista por defecto: bios mode, machine type, agent state, entradas de hostpci passthrough, mount points (CT), boot order."
|
||||
],
|
||||
"ipsTitle": "4. IP Addresses",
|
||||
"ipsBody": "Lista de pastillas con cada dirección IPv4 / IPv6 que el guest expone actualmente — pastilla verde por dirección. Vacía cuando el guest está parado o cuando el QEMU agent no está instalado en una VM (los LXCs siempre reportan direcciones directamente).",
|
||||
"mountsTitle": "Pestaña 2 — Mounts (solo LXC)",
|
||||
"mountsImageAlt": "Modal de vista en detalle LXC — pestaña Mounts listando cada mount point que está usando el contenedor: volúmenes PVE, host binds, binds desde almacenamiento PVE y montajes ad-hoc NFS/CIFS que el operador montó desde dentro del CT. Cada tarjeta lleva una insignia de tipo, barra de capacidad, bytes used/total, opciones de montaje y un punto de estado por color (verde sano, ámbar readonly/divergente, rojo stale)",
|
||||
"mountsImageCaption": "Pestaña Mounts — solo se renderiza para contenedores LXC, y solo cuando hay al menos un mount point o un montaje remoto ad-hoc presente. Un CT sin mounts no recibe pestaña.",
|
||||
"mountsIntro": "La propia UI de Proxmox muestra las entradas de mount-point definidas en la config del contenedor (<code>mpX</code>) pero se queda ahí — cualquier cosa que montes desde dentro del CT después (<code>mount.cifs</code>, NFS vía <code>autofs</code>, …) es invisible. Esta pestaña funde <strong>ambas vistas</strong>: los mounts configurados <strong>y</strong> los mounts en runtime que ProxMenux sonda desde dentro del contenedor, con un estado de salud por mount y una barra de capacidad cuando el backend la puede resolver.",
|
||||
"mountTypesTitle": "Tipos de mount detectados",
|
||||
"mountTypesItems": [
|
||||
"<strong>PVE volume</strong> — respaldado por un almacenamiento gestionado por Proxmox (un subvol ZFS, una entrada de directorio, un Ceph RBD, …). La capacidad viene de las stats del almacenamiento PVE para que la barra coincida con lo que el propio Proxmox muestra.",
|
||||
"<strong>Bind from PVE storage</strong> — entrada <code>mpX</code> apuntando a una ruta en un almacenamiento conocido por PVE.",
|
||||
"<strong>Bind from host</strong> — entrada <code>mpX</code> apuntando a una ruta arbitraria del host (<code>/mnt/something</code>). La capacidad es el <code>df</code> de esa ruta del host.",
|
||||
"<strong>Ad-hoc inside CT</strong> — mount que <em>solo</em> existe en el namespace de mounts del contenedor (p. ej. un share NFS que el CT monta por su cuenta). La capacidad se lee vía <code>pct exec <vmid> df</code>, que es la única forma de verla — <code>/proc/<pid>/root</code> desde el host no expone las stats reales del mount remoto."
|
||||
],
|
||||
"mountStateTitle": "Punto de estado por tarjeta y avisos",
|
||||
"mountStateItems": [
|
||||
"<green/> <strong>Verde</strong> — mount sano y alcanzable.",
|
||||
"<amber/> <strong>Ámbar</strong> — divergente (configurado pero no montado en realidad), read-only o <em>zombie bind</em> (el origen en el host fue retirado pero el CT sigue viendo el bind como montado — típico cuando se desconectó una unidad USB o hubo un <code>umount</code> manual en el host).",
|
||||
"<red/> <strong>Rojo</strong> — stale: la sonda de runtime no pudo alcanzar el mount (común con exports NFS cuyo servidor está caído)."
|
||||
],
|
||||
"mountsCalloutTitle": "Lo que esto te da sobre la UI nativa",
|
||||
"mountsCalloutBody": "Una vista veraz y consciente de la capacidad de cada sitio donde el contenedor lee o escribe. Shares NFS o CIFS montados desde dentro del CT — invisibles para la UI web de Proxmox — aparecen aquí con el mismo aspecto y la misma sonda de salud que cualquier mount point configurado. Mounts remotos stale y zombie binds salen marcados antes de que muerdan durante un backup.",
|
||||
"backupsTitle": "Pestaña 3 — Backups",
|
||||
"backupsImageAlt": "Modal de vista en detalle por guest — pestaña Backups con la lista de backups disponibles, etiqueta de destino, tamaños y el botón Create Backup",
|
||||
"backupsImageCaption": "Pestaña Backups — cada backup almacenado en los almacenamientos Proxmox configurados para este guest, ordenados de más nuevo a más viejo. La cabecera de la pestaña lleva la insignia de recuento.",
|
||||
"backupsIntro": "Lista cada backup almacenado en los almacenamientos Proxmox configurados para este guest, ordenados de más nuevo a más viejo. El título de la pestaña lleva una insignia de recuento para que veas de un vistazo si el guest está backupeado. Por fila:",
|
||||
"backupsItems": [
|
||||
"<strong>Timestamp</strong> — fecha y hora de la ejecución.",
|
||||
"<strong>Etiqueta de destino</strong> — el almacenamiento donde vive (PBS-Cloud, PBS-Local, NFS-Backup, …) coloreada por estado.",
|
||||
"<strong>Size</strong> — tamaño final en disco del backup."
|
||||
],
|
||||
"backupsOutro": "El botón <strong>+ Create Backup</strong> arriba a la derecha arranca una nueva ejecución en el almacenamiento marcado como \"Backup target\" en la config de almacenamiento de Proxmox. El restore vive en la UI web de Proxmox — el Monitor expone la vista \"¿este guest tiene backup reciente?\", no el flujo de recuperación.",
|
||||
"updatesTitle": "Insignia de updates (solo LXC)",
|
||||
"updatesImageAlt": "Modal de vista en detalle LXC — insignia violeta pulsable 'updates available' en la cabecera de un contenedor que tiene updates pendientes de apt o apk. Pulsarla expande un panel listando cada paquete actualizable con sus versiones actual y objetivo, más un contador security-only cuando el repo subyacente marca alguno como security",
|
||||
"updatesImageCaption": "La insignia solo aparece en contenedores LXC en ejecución que tengan al menos un paquete actualizable. Pulsa para abrir la lista de paquetes dentro de la modal — no hay pestaña separada en la barra de navegación.",
|
||||
"updatesIntro": "ProxMenux sondea cada contenedor en ejecución del host una vez al día y cuenta los paquetes actualizables. Soportado actualmente en esta fase: <strong>Debian / Ubuntu</strong> vía <code>apt list --upgradable</code> y <strong>Alpine</strong> vía <code>apk list -u</code>. Los contenedores corriendo otras distribuciones (CentOS, Arch, …) se omiten por ahora — no muestran insignia en lugar de un cero engañoso.",
|
||||
"updatesPanelTitle": "Lo que muestra el panel",
|
||||
"updatesPanelItems": [
|
||||
"<strong>Recuento total de actualizables</strong> arriba, más un contador <strong>security</strong> separado cuando el repositorio subyacente marca alguno de los paquetes como security (suite \"-security\" de Debian/Ubuntu). Alpine no expone una suite security separada vía metadatos de apk, así que security siempre es 0 en contenedores Alpine.",
|
||||
"<strong>Lista por paquete</strong> con nombre, versión actual y versión objetivo. Úsala para decidir si lanzar la actualización ahora o esperar a una ventana de mantenimiento."
|
||||
],
|
||||
"updatesScopeTitle": "Qué rastrea el sistema vs qué cuenta el script",
|
||||
"updatesScopeBody": "Este detector de actualizaciones sigue lo que ya hay instalado dentro del contenedor — <strong>no</strong> instala nada nuevo y <strong>no</strong> sabe de aplicaciones desplegadas fuera de apt / apk (un contenedor Docker corriendo dentro del LXC, un Vaultwarden instalado desde fuente, un binario soltado en <code>/usr/local/bin</code>). Es una vista de <em>gestor de paquetes</em>, no una vista de <em>aplicación</em>. Las fases futuras de este trabajo integrarán metadatos de aplicación de community-scripts para que el seguimiento upstream por app (Vaultwarden, Jellyfin, …) sea posible.",
|
||||
"updatesToggleTitle": "Detección vs notificación — semántica del toggle",
|
||||
"updatesToggleCalloutTitle": "La detección siempre está activa; el toggle solo controla la notificación",
|
||||
"updatesToggleCalloutBody": "La detección de actualizaciones de paquetes en contenedores en ejecución corre incondicionalmente — la insignia aparece en esta modal siempre que haya updates pendientes, independientemente de cualquier otro ajuste. El toggle de notificación <code>lxc_updates_available</code> en <strong>Settings → Notifications</strong> solo controla si se entrega a tus canales un mensaje agrupado \"N CT(s) have pending updates\". Esto mantiene la semántica del toggle consistente con los otros streams de update (driver NVIDIA, driver Coral, optimizaciones ProxMenux): apagar las notificaciones nunca oculta la información en el panel.",
|
||||
"updatesApplyTitle": "Aplicar las actualizaciones",
|
||||
"updatesApplyBody": "Abre la shell del contenedor desde la barra de acciones del pie, o usa <code>pct exec <vmid> -- apt full-upgrade -y</code> / <code>pct exec <vmid> -- apk upgrade -y</code> desde el host. El panel reescanea en su ciclo de 24h (o tras el siguiente refresco manual) y la insignia se actualiza.",
|
||||
"firewallTitle": "Pestaña 5 — Firewall",
|
||||
"firewallIntro": "Lee el log de firewall de Proxmox por guest directamente del host (sin servicio extra, sin polling). La pestaña siempre está presente en la barra de navegación; el panel decide qué renderizar dependiendo de si el firewall está activo para ese guest y si alguna regla está logueando realmente:",
|
||||
"firewallItems": [
|
||||
"<strong>Firewall disabled</strong> — un aviso ámbar explica exactamente dónde activarlo en la UI de Proxmox (<em><Container|VM> → Firewall → Options</em>) y te recuerda que al menos una regla necesita <code>log: info</code> (o superior) antes de que aparezcan paquetes.",
|
||||
"<strong>Firewall enabled, no events yet</strong> — pista de estado vacío con el mismo requisito de logging, útil cuando acabas de activar el firewall.",
|
||||
"<strong>Events present</strong> — un panel monoespaciado scrolleable con las entradas raw coloreadas por acción: <green>ACCEPT</green> (verde), <orange>REJECT</orange> (naranja), <red>DROP</red> (rojo). Una insignia de recuento en la cabecera muestra cuántas entradas hay cargadas en este momento."
|
||||
],
|
||||
"firewallRefresh": "Un botón <em>Refresh</em> arriba a la derecha del panel trae las últimas entradas bajo demanda — no hay auto-refresh dentro de la modal, así que la lista es una snapshot del momento en que abriste la pestaña o pulsaste refresh. Los datos vienen del archivo de log por guest que Proxmox escribe bajo <code>/var/log/pve-firewall.log</code> filtrado por VMID, expuesto vía <code>GET /api/vms/<vmid>/firewall/log</code>.",
|
||||
"firewallCalloutTitle": "¿Por qué tenerlo aquí cuando la UI de Proxmox ya lo muestra?",
|
||||
"firewallCalloutBody": "Dos razones: elimina el viaje de ida y vuelta a la UI web de Proxmox cuando ya estás inspeccionando un guest desde el panel, y mantiene la misma vista acotada por VMID que usa el resto de la modal — arrancar el guest, comprobar sus mounts, mirar los hits recientes del firewall y pararlo otra vez sin salir del panel. El Monitor nunca edita reglas de firewall; la edición de reglas se queda en la interfaz nativa de Proxmox donde corresponde.",
|
||||
"actionBarTitle": "Barra de acciones del pie",
|
||||
"actionBarIntro": "Siempre visible al pie de la modal independientemente de qué pestaña esté activa:",
|
||||
"consoleItem": "<strong>Console</strong> (solo LXC, running) — abre una modal que ejecuta <code>pct enter <vmid></code> y te deja dentro del contenedor. La misma fontanería xterm.js + WebSocket que la <link>pestaña Terminal</link> independiente, incluyendo la <strong>barra para móvil</strong> con ESC, TAB, flechas, Enter y las combinaciones Ctrl (Ctrl+C / Ctrl+X / Ctrl+R) bajo el terminal — haciendo la modal usable desde el teclado de un móvil o tablet. Las VMs no exponen un botón Console aquí; usa la consola web de Proxmox (noVNC) para acceso al guest.",
|
||||
"lifecycleIntro": "Debajo, cuatro botones de ciclo de vida en una rejilla 2×2. Cada uno dispara <code>POST /api/vms/<vmid>/control</code> con la <code>action</code> correspondiente; el estado de enabled depende de si el guest está actualmente en ejecución:",
|
||||
"headerButton": "Botón",
|
||||
"headerEnabled": "Habilitado cuando",
|
||||
"headerAction": "Acción enviada al host",
|
||||
"lifecycleRows": [
|
||||
{
|
||||
"button": "Start",
|
||||
"color": "green",
|
||||
"enabled": "El guest está parado.",
|
||||
"action": "qm start / pct start"
|
||||
},
|
||||
{
|
||||
"button": "Shutdown",
|
||||
"color": "blue",
|
||||
"enabled": "El guest está en ejecución.",
|
||||
"action": "qm shutdown / pct shutdown — graceful, ACPI"
|
||||
},
|
||||
{
|
||||
"button": "Reboot",
|
||||
"color": "blue",
|
||||
"enabled": "El guest está en ejecución.",
|
||||
"action": "qm reboot / pct reboot — reinicio graceful"
|
||||
},
|
||||
{
|
||||
"button": "Force Stop",
|
||||
"color": "red",
|
||||
"enabled": "El guest está en ejecución.",
|
||||
"action": "qm stop / pct stop — apagado en duro"
|
||||
}
|
||||
],
|
||||
"forceStopTitle": "Force Stop es el kill switch, no la opción educada",
|
||||
"forceStopBody": "<strong>Force Stop</strong> salta la secuencia de apagado del guest — equivalente a tirar del cable de la luz. Usa <strong>Shutdown</strong> cuando el guest responde; recurre a Force Stop solo cuando Shutdown se cuelga y aceptas el riesgo de pérdida de datos de un apagado no coordinado. El botón es rojo y está etiquetado a propósito para que no lo pulses por reflejo."
|
||||
},
|
||||
"dataCollected": {
|
||||
"heading": "Cómo se recopilan los datos",
|
||||
"headerSection": "Sección de la pestaña",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Lista de inventario",
|
||||
"endpoint": "/api/vms",
|
||||
"source": "<code>pvesh get /cluster/resources --type vm</code> para VMs y CTs."
|
||||
},
|
||||
{
|
||||
"section": "Panel de detalle (config, red, discos)",
|
||||
"endpoint": "/api/vms/<vmid>",
|
||||
"source": "<code>qm config <id></code> para VMs / <code>pct config <id></code> para CTs."
|
||||
},
|
||||
{
|
||||
"section": "Gráfica de métricas por guest",
|
||||
"endpoint": "/api/vms/<vmid>/metrics",
|
||||
"source": "Datos RRD de PVE (<code>pvesh get /nodes/<node>/qemu/<id>/rrddata</code>) condensados a una forma amigable para gráficas."
|
||||
},
|
||||
{
|
||||
"section": "Logs recientes de tareas (modal)",
|
||||
"endpoint": "/api/vms/<vmid>/logs",
|
||||
"source": "Tareas para ese <code>vmid</code> desde <code>/var/log/pve/tasks/index</code>."
|
||||
},
|
||||
{
|
||||
"section": "Backups disponibles para el guest",
|
||||
"endpoint": "/api/vms/<vmid>/backups",
|
||||
"source": "<code>pvesm list <storage></code> filtrado por VMID."
|
||||
},
|
||||
{
|
||||
"section": "Log de firewall por guest (pestaña Firewall)",
|
||||
"endpoint": "/api/vms/<vmid>/firewall/log",
|
||||
"source": "<code>/var/log/pve-firewall.log</code> filtrado por VMID."
|
||||
},
|
||||
{
|
||||
"section": "Botones de power (Start / Stop / Reboot / Shutdown)",
|
||||
"endpoint": "/api/vms/<vmid>/control",
|
||||
"source": "<code>qm start|stop|reboot|shutdown</code> o equivalentes <code>pct</code>."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Cross-check de lo que ve el panel contra PVE",
|
||||
"codeComment2": "# Inspeccionar la config de un guest concreto tal como la ve la modal",
|
||||
"codeComment3": "# VM",
|
||||
"codeComment4": "# CT"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tailRich": " — la categoría VMs y Contenedores (boot fallido, timeouts QMP, fallos de shutdown de CT)."
|
||||
},
|
||||
{
|
||||
"label": "Notificaciones",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tailRich": " — qué disparan aguas abajo los eventos <code>vm_*</code>, <code>ct_*</code>, <code>migration_*</code> y <code>backup_*</code>."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de la API",
|
||||
"href": "/docs/monitor/api",
|
||||
"tailRich": " — los endpoints de VM y backup."
|
||||
},
|
||||
{
|
||||
"label": "Índice del panel",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tailRich": " — el resto de pestañas."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux → Create VM",
|
||||
"href": "/docs/create-vm",
|
||||
"tailRich": " — la cara de provisión: plantillas de System NAS (Synology y otros), VMs Linux / Windows, valores por defecto pensados para Proxmox."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,369 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Monitor de salud de Proxmox — CPU, memoria, almacenamiento, SMART, ZFS, logs | ProxMenux",
|
||||
"description": "Monitorización proactiva de salud de Proxmox VE: diez categorías escaneadas cada cinco minutos (CPU y temperatura, memoria y swap, almacenamiento, discos/SMART, red, VMs, servicios, logs, actualizaciones, seguridad), cuatro niveles de severidad, duraciones de supresión por categoría, limpieza automática de errores resueltos, un historial permanente de observaciones de disco y el camino desde un evento crudo a una notificación a Telegram, Discord, Gotify o email.",
|
||||
"ogTitle": "Monitor de salud de Proxmox — CPU, memoria, almacenamiento, SMART, ZFS, logs",
|
||||
"ogDescription": "Monitorización proactiva de salud de Proxmox VE a través de diez categorías con niveles de severidad, duraciones de supresión y notificaciones dirigidas por eventos.",
|
||||
"twitterTitle": "Monitor de salud de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Monitorización proactiva de salud de Proxmox VE a través de diez categorías con niveles de severidad y notificaciones."
|
||||
},
|
||||
"header": {
|
||||
"title": "Monitor de salud",
|
||||
"description": "El auto-chequeo continuo que escanea diez categorías de estado del host en un ciclo de cinco minutos, muestrea signos vitales continuamente entre ciclos, deduplica hallazgos en un stream de eventos estructurado, y alimenta el panel, el motor de notificaciones y el reescritor opcional de IA desde una única fuente de verdad.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Un escáner, tres consumidores",
|
||||
"body": "Un hilo de fondo ejecuta el ciclo completo de salud cada 5 minutos, persiste cada hallazgo en SQLite bajo un <code>error_key</code> estable, y deja que <strong>(1)</strong> el panel renderice el estado actual, <strong>(2)</strong> el motor de notificaciones reparta los eventos nuevos a los canales configurados y <strong>(3)</strong> el asistente opcional de IA reescriba las alertas en lenguaje natural. Configuras el escáner una vez; todo lo de aguas abajo se mantiene en sync."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Cómo funciona",
|
||||
"intro": "El Monitor de salud corre en dos carriles paralelos dentro del proceso del Monitor. Un <strong>muestreador de signos vitales</strong> ligero lee CPU, memoria y temperatura cada pocos segundos para que las condiciones de umbral sostenido se detecten rápido; en paralelo, el <strong>ciclo completo de salud</strong> corre cada cinco minutos y ejercita cada categoría de principio a fin. Ambos carriles convergen en las mismas tablas SQLite — y desde ahí, tres consumidores leen el estado independientemente.",
|
||||
"scannerTitle": "Del muestreo al hallazgo guardado",
|
||||
"scannerCaption": "El escáner. Los signos vitales se muestrean rápido para que la presión sostenida de CPU / memoria se detecte antes del siguiente ciclo de 5 min. El ciclo completo lee esos buffers y ejecuta los chequeos más pesados (SMART, estado de pool ZFS, escaneo de journal, salud de servicio, etc.) antes de escribir los hallazgos estructurados a SQLite.",
|
||||
"scannerArrowLabel": "paso",
|
||||
"scannerNodes": {
|
||||
"samplerLabel": "Muestreador de signos vitales",
|
||||
"samplerDetail": "Uso de CPU 30 s\nMemoria 30 s\nTemperatura 15 s\n→ buffers de historial",
|
||||
"cycleLabel": "Ciclo completo de salud",
|
||||
"cycleDetail": "Cada 5 min\nLee buffers\n+ probes en vivo\n(SMART, ZFS,\nservicios, journal…)",
|
||||
"checksLabel": "Chequeos por categoría",
|
||||
"checksDetail": "Diez categorías\n(CPU, memoria,\nalmacenamiento, discos,\nred, VMs,\nservicios, logs,\nactualizaciones, seguridad)",
|
||||
"sqliteLabel": "SQLite",
|
||||
"sqliteDetail": "tabla errors\n(activos +\ndismissed)\n+ disk_observations\n(historial\npermanente por disco)"
|
||||
},
|
||||
"notifTitle": "Del hallazgo guardado al usuario",
|
||||
"notifCaption": "El camino de la notificación. La misma tabla errors también dirige la vista del panel (listas Active / Dismissed renderizadas en vivo) y la consume la rutina de limpieza al final de cada ciclo para auto-resolver entradas obsoletas — ambas corren desde los mismos datos sin pasar por el dispatcher.",
|
||||
"notifArrowLabel": "evento",
|
||||
"notifNodes": {
|
||||
"errorsLabel": "tabla errors",
|
||||
"errorsDetail": "Filas activas +\ndismissed\nclaveadas por\nerror_key",
|
||||
"dispatcherLabel": "Dispatcher de notificaciones",
|
||||
"dispatcherDetail": "Eventos nuevos +\nescalados encolados\nA través de toggles\n+ cooldown",
|
||||
"templatesLabel": "Templates + reescritura con IA",
|
||||
"templatesDetail": "Template\npor evento\n→ reescritura\nopcional con IA\nen lenguaje natural",
|
||||
"channelsLabel": "Canales",
|
||||
"channelsDetail": "Telegram\nDiscord\nGotify\nEmail (SMTP)"
|
||||
}
|
||||
},
|
||||
"categories": {
|
||||
"heading": "Las diez categorías",
|
||||
"imageAlt": "Vista del Monitor de salud mostrando las diez categorías con sus estados actuales (CPU, Memoria, Almacenamiento, Discos, Red, VMs, Servicios, Logs, Actualizaciones, Seguridad)",
|
||||
"imageCaption": "Vista del Monitor de salud — las diez categorías con su estado actual. Las categorías en un host sano todas muestran OK; warnings y eventos críticos aparecen inline con las filas que los produjeron.",
|
||||
"intro": "Cada ciclo ejercita diez checkers independientes. Cada uno produce uno de cuatro estados (<strong>OK</strong>, <strong>INFO</strong>, <strong>WARNING</strong>, <strong>CRITICAL</strong>) más un payload estructurado — nombres de dispositivo, líneas de log de muestra, umbrales exactos — que aparecen en el panel y viajan hasta el cuerpo de la notificación.",
|
||||
"headerCategory": "Categoría",
|
||||
"headerChecks": "Sub-chequeos",
|
||||
"headerEvents": "Eventos típicos",
|
||||
"rows": [
|
||||
{
|
||||
"category": "CPU y Temperatura",
|
||||
"checks": "Uso de CPU con histéresis, temperatura de sensor",
|
||||
"events": "Carga sostenida alta; temperatura de CPU cruzando los umbrales warning / critical del fabricante."
|
||||
},
|
||||
{
|
||||
"category": "Memoria y Swap",
|
||||
"checks": "Uso de RAM, uso de swap",
|
||||
"events": "Presión de memoria sostenida; actividad del OOM-killer; swap agotado."
|
||||
},
|
||||
{
|
||||
"category": "Almacenamiento",
|
||||
"checks": "Almacenamientos Proxmox, sistema de archivos raíz",
|
||||
"events": "Almacenamiento offline (servidor NFS inalcanzable, credenciales CIFS caducadas); montaje raíz > 90 %; pool LVM thin cerca de lleno."
|
||||
},
|
||||
{
|
||||
"category": "Discos y SMART",
|
||||
"checks": "SMART, errores I/O en dmesg, pools ZFS, LVM, errores de filesystem",
|
||||
"events": "SMART health failed; sectores reasignados / pendientes; errores I/O ATA; pool ZFS DEGRADED / FAULTED; remontaje de ext4 en solo lectura."
|
||||
},
|
||||
{
|
||||
"category": "Red",
|
||||
"checks": "Conectividad, estado de enlace, latencia al gateway",
|
||||
"events": "Bridge o bond down; gateway inalcanzable; picos persistentes de latencia."
|
||||
},
|
||||
{
|
||||
"category": "VMs y Contenedores",
|
||||
"checks": "Comunicación QMP, arranque de VM, arranque de contenedor",
|
||||
"events": "Boot de VM fallido; fallo de shutdown de CT; timeout de socket QMP; configuración / disco faltante tras un clone."
|
||||
},
|
||||
{
|
||||
"category": "Servicios PVE",
|
||||
"checks": "<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>, modo cluster",
|
||||
"events": "Servicio caído; cluster quorum perdido; <code>pmxcfs</code> bloqueado."
|
||||
},
|
||||
{
|
||||
"category": "Logs del sistema",
|
||||
"checks": "Errores persistentes, picos de errores, cascadas de errores, mensajes críticos del kernel",
|
||||
"events": "Errores idénticos repetidos; ráfaga súbita de warnings (patrón cascada); <code>BUG:</code> / <code>OOPS:</code> / <code>oom-killer</code> en dmesg."
|
||||
},
|
||||
{
|
||||
"category": "Actualizaciones del sistema",
|
||||
"checks": "Actualizaciones pendientes, actualizaciones de seguridad, kernel / versión de PVE, antigüedad del sistema",
|
||||
"events": "Actualizaciones de seguridad disponibles; kernel pinneado varias versiones menores por detrás; uptime del host > 90 días."
|
||||
},
|
||||
{
|
||||
"category": "Seguridad y Certificados",
|
||||
"checks": "Intentos de login, certificados caducando, estado del jail Fail2Ban opcional",
|
||||
"events": "Fallos repetidos de autenticación SSH / web; certificado PVE a < 30 días de caducar; bans activos de Fail2Ban."
|
||||
}
|
||||
]
|
||||
},
|
||||
"severity": {
|
||||
"heading": "Modelo de severidad",
|
||||
"headerStatus": "Estado",
|
||||
"headerColour": "Color",
|
||||
"headerMeaning": "Significado",
|
||||
"headerNotification": "Notificación",
|
||||
"rows": [
|
||||
{
|
||||
"status": "OK",
|
||||
"colour": "Verde",
|
||||
"meaning": "Sano. Sin hallazgos en esta categoría.",
|
||||
"notification": "Silencioso."
|
||||
},
|
||||
{
|
||||
"status": "INFO",
|
||||
"colour": "Azul",
|
||||
"meaning": "Condición transitoria o ya resuelta que merece la pena mencionar una vez. También se usa para categorías que tienen <em>solo</em> items dismissed restantes.",
|
||||
"notification": "Opcional. Cada tipo de evento se puede activar o desactivar por canal."
|
||||
},
|
||||
{
|
||||
"status": "WARNING",
|
||||
"colour": "Amarillo",
|
||||
"meaning": "Se necesita atención pero el host sigue funcional. La causa no es trivial — lee los detalles.",
|
||||
"notification": "Se envía cuando el toggle por evento está activado para el canal."
|
||||
},
|
||||
{
|
||||
"status": "CRITICAL",
|
||||
"colour": "Rojo",
|
||||
"meaning": "Funcionalidad rota o posible pérdida de datos. Acción requerida.",
|
||||
"notification": "Se envía cuando el toggle por evento está activado para el canal. La temperatura de CPU CRITICAL se trata como alerta de seguridad que re-dispara incluso si se hizo dismiss previamente."
|
||||
}
|
||||
],
|
||||
"infoNote": "Una categoría que está <strong>OK</strong> pero tiene eventos dismissed todavía dentro de su ventana de supresión se renderiza como <strong>INFO</strong> — para recordarte que algo está siendo silenciado en vez de que nunca hubo nada mal.",
|
||||
"unknownTitle": "UNKNOWN, cuando un chequeo no puede completar",
|
||||
"unknownBody": "Un chequeo que falla en producir un veredicto durante tres ciclos seguidos (un probe que caduca, un sensor que ha desaparecido, una herramienta que sale con error) se registra internamente como <code>UNKNOWN</code>. El panel lo muestra como un estado amarillo — la vista global capa el <code>UNKNOWN</code> a <strong>WARNING</strong> para que nunca escale un host sano a CRITICAL por sí solo."
|
||||
},
|
||||
"dashboardView": {
|
||||
"heading": "La vista del panel",
|
||||
"intro": "El Monitor de salud vive dentro de la pestaña <strong>Overview</strong>. La pildora de estado de la cabecera (Healthy / Warning / Critical) abre un modal que divide los hallazgos en dos listas:",
|
||||
"items": [
|
||||
"<strong>Active</strong> — cada categoría con un hallazgo sin resolver. Cada fila expande para mostrar los chequeos individuales que produjeron el estado, la cadena <code>reason</code> cruda, el dispositivo o VM ID involucrado, y (para categorías que enlazan a una pestaña) un click-through a Almacenamiento / Red / VMs / Logs / Hardware para investigar.",
|
||||
"<strong>Dismissed</strong> — items previamente reconocidos por el usuario que aún están dentro de su ventana de supresión. Cada fila muestra cuánto queda de la supresión y la duración configurada. Cuando la ventana caduca, el item desaparece de esta lista; si la condición subyacente sigue presente y la categoría soporta re-firing, reaparece en <em>Active</em>."
|
||||
],
|
||||
"pillTitle": "La pildora refleja la peor categoría",
|
||||
"pillBody": "El color de la cabecera del panel es la severidad más alta entre las diez categorías: cualquier CRITICAL → rojo, si no cualquier WARNING → amarillo, si no cualquier INFO → azul, si no verde. La misma lógica dirige el punto del favicon y el badge del PWA."
|
||||
},
|
||||
"dismiss": {
|
||||
"heading": "Hacer dismiss de alertas y la Suppression Duration",
|
||||
"intro": "Algunos eventos son ruidosos por naturaleza — un <em>System Updates: actualizaciones pendientes disponibles</em> permanece cierto hasta que parches el host, y no quieres una notificación cada cinco minutos durante una semana. El Monitor de salud resuelve esto con dos mecanismos acoplados:",
|
||||
"step1": "<strong>Acción Dismiss por evento</strong> en el modal. El botón Dismiss abre un dropdown con tres opciones — <strong>24 horas</strong>, <strong>7 días</strong> o <strong>Permanently</strong> — que te permite elegir cuánto tiempo se silencia esta alerta concreta independientemente del valor por defecto de la categoría. Elegir una llama a <code>POST /api/health/acknowledge</code> con el <code>error_key</code> y el <code>suppression_hours</code> escogido (<code>-1</code> para permanente). El evento se mueve a la lista Dismissed con un <code>acknowledged_at</code> con timestamp.",
|
||||
"dropdownImageAlt": "Dropdown de Dismiss sobre una alerta del Monitor de salud — 24 horas, 7 días o Permanently",
|
||||
"dropdownImageCaption": "Dropdown Dismiss por evento. La ventana elegida aplica solo a esta alerta; si no eliges ninguna por evento se usa el valor por defecto de la categoría. Los dismisses permanentes se marcan con un badge ámbar distinto <em>Permanent</em> en la lista Dismissed y no se re-disparan.",
|
||||
"step2": "<strong>Ajuste de Suppression Duration por categoría</strong>. Desde la card Settings → Health Monitor (o <code>POST /api/health/settings</code>), cada una de las diez categorías tiene su propia ventana por defecto, aplicada cuando se hace un Dismiss sin elegir ventana por evento:",
|
||||
"imageAlt": "Card Settings → Health Monitor con los dropdowns de supresión por categoría y la sección Active Suppressions",
|
||||
"imageCaption": "Card Health Monitor — un dropdown por categoría fija los valores por defecto para nuevos dismisses; la sección Active Suppressions debajo lista todas las alertas actualmente silenciadas (ver más abajo).",
|
||||
"outro": "Mientras un evento está suprimido, el escáner sigue corriendo y actualiza el timestamp <code>last_seen</code> de la fila, pero no se despacha ninguna notificación nueva y el panel se mantiene calmado. Cuando la ventana caduca, el siguiente ciclo reevalúa la condición y o bien re-dispara fresco o, si la condición se ha aclarado por sí sola, retira la fila de las listas.",
|
||||
"activeSuppressionsTitle": "Revisar y revertir dismisses — el panel Active Suppressions",
|
||||
"activeSuppressionsBody": "Cada alerta actualmente silenciada (time-limited y permanente) aparece en <strong>Settings → Health Monitor → Active Suppressions</strong>. Cada fila muestra el identificador de la alerta, categoría, severidad, cuándo se descartó y cuánto tiempo le queda, más un botón <strong>Re-enable</strong> que limpia el reconocimiento para que la alerta pueda volver a disparar en el próximo escaneo. Los dismisses permanentes solo se pueden revertir desde aquí; los time-limited también se pueden revivir a la fuerza sin esperar a la cuenta atrás. La acción Re-enable está protegida por el modo <em>Edit</em> del Health Monitor arriba de la card — pulsa Edit, haz clic en Re-enable en cada fila que quieras revivir (las filas en cola muestran un borde verde y el identificador tachado) y luego pulsa Save para confirmar. Cancel descarta la cola.",
|
||||
"autoTitle": "Auto-supresión cuando cambias la Duration",
|
||||
"autoBody": "Poner una Suppression Duration de categoría a cualquier cosa distinta del valor por defecto de 24 h tiene un segundo efecto más allá de los dismissals iniciados por el usuario: <strong>los futuros hallazgos en esa categoría entran en la tabla ya reconocidos</strong> con esa duración. Esto es por diseño — si le has dicho al Monitor que quieres los eventos de disco silenciados durante una semana, los hallazgos de disco nuevos honran esa intención sin que tengas que hacer dismiss de cada uno a mano. Aparecen directamente en la lista Dismissed con el tiempo restante configurado. Las categorías dejadas en 24 h no se ven afectadas y se comportan de la forma clásica (los hallazgos nuevos aterrizan en Active hasta que actúes).",
|
||||
"tempTitle": "La temperatura de CPU CRITICAL es el override de seguridad",
|
||||
"tempBody": "Un hallazgo específico saltea la supresión por completo: <strong>temperatura de CPU CRITICAL</strong>. Si el sensor cruza el umbral crítico, la alerta re-dispara independientemente de cualquier dismissal previo — una CPU achicharrada es una CPU achicharrada. Este es el único override integrado del modelo de dismiss.",
|
||||
"nonDismissableTitle": "Hallazgos a los que no se les puede hacer dismiss",
|
||||
"nonDismissableBody": "Un puñado de hallazgos están marcados como no-descartables a propósito — señalan una condición donde silenciar la alerta podría costar datos, hardware o conectividad. El botón Dismiss está oculto para estas filas; la alerta se aclara solo cuando la condición subyacente se recupera y la limpieza auto-resolve la coge. Otros hallazgos (eventos I/O transitorios en un disco sano, estados recuperados) también están marcados no-descartables pero por la razón opuesta: no hay nada que silenciar porque la fila ya es informativa y se auto-aclara.",
|
||||
"headerFinding": "Hallazgo",
|
||||
"headerWhy": "Por qué no se puede hacer dismiss",
|
||||
"rows": [
|
||||
{
|
||||
"finding": "Advertencia / crítico de temperatura de CPU",
|
||||
"why": "Riesgo hardware — sobre-temperatura sostenida daña el silicio. Silenciar dejaría a una CPU achicharrándose pasar desapercibida."
|
||||
},
|
||||
{
|
||||
"finding": "Espacio crítico de filesystem (montaje raíz)",
|
||||
"why": "Riesgo de pérdida de datos — un raíz lleno impide escrituras y corrompe estado. La alerta debe permanecer visible hasta que liberes espacio."
|
||||
},
|
||||
{
|
||||
"finding": "Pool ZFS DEGRADED / FAULTED",
|
||||
"why": "Riesgo de integridad de datos — el fallo del pool amenaza cada dataset en él. Silenciar mientras el pool está enfermo nunca es la respuesta correcta."
|
||||
},
|
||||
{
|
||||
"finding": "Errores I/O de disco con SMART FAILED",
|
||||
"why": "Fallo de unidad confirmado por SMART — enmascarar oculta hardware real muriendo. La alerta se queda hasta que el dispositivo sea reemplazado (o eliminado del host)."
|
||||
},
|
||||
{
|
||||
"finding": "Interfaz de red DOWN",
|
||||
"why": "Pérdida de conectividad — bridges, bonds e interfaces físicas con tráfico activo deben permanecer visibles. Silenciarlos enmascararía una pérdida de acceso remoto."
|
||||
},
|
||||
{
|
||||
"finding": "Eventos I/O en discos sanos (INFO)",
|
||||
"why": "Eventos ATA / dmesg transitorios en un disco cuyo SMART dice OK — marcado INFO y auto-aclarándose. Nada que descartar porque el siguiente ciclo ya los retira."
|
||||
}
|
||||
],
|
||||
"principle": "Todo lo demás se puede descartar. El principio es: alertas que indican \"daño real en progreso\" o que ya se han auto-resuelto se mantienen fuera del camino de dismiss; las alertas sobre condiciones sostenidas que puede que quieras reconocer y revisar más tarde (uso alto de CPU, actualizaciones pendientes, certificado cerca de caducar, warnings de log, hipos de arranque de VM, etc.) todas exponen el botón Dismiss."
|
||||
},
|
||||
"autoresolve": {
|
||||
"heading": "Auto-resolución y limpieza",
|
||||
"intro": "Muchas alertas deberían aclararse solas cuando la condición desaparece — una VM que estaba fallando al arrancar y ahora está corriendo, un disco que ya no está en el sistema, una temperatura que ha bajado a la normalidad. Una rutina de limpieza corre al final de cada ciclo de cinco minutos y aplica estas reglas:",
|
||||
"headerTrigger": "Disparador",
|
||||
"headerAction": "Acción",
|
||||
"rows": [
|
||||
{
|
||||
"trigger": "Uso de CPU de vuelta al rango normal tras un warning relacionado con CPU.",
|
||||
"action": "Marcado como resuelto. Sale de la lista Active."
|
||||
},
|
||||
{
|
||||
"trigger": "Presión de memoria de vuelta por debajo del umbral de warning tras un warning OOM / memoria.",
|
||||
"action": "Marcado como resuelto."
|
||||
},
|
||||
{
|
||||
"trigger": "VM / CT referenciada por el error ya no existe (<code>qm status</code> / <code>pct status</code> distinto de cero).",
|
||||
"action": "Marcado como resuelto por recurso eliminado."
|
||||
},
|
||||
{
|
||||
"trigger": "Disco referenciado por el error ya no presente en <code>/dev/</code>.",
|
||||
"action": "Marcado como resuelto por dispositivo eliminado. El historial permanente de observaciones se preserva (mira la siguiente sección)."
|
||||
},
|
||||
{
|
||||
"trigger": "Hallazgos provenientes del journal (categoría <code>logs</code>, entradas SMART, errores ATA / I/O) cuando su ventana de supresión caduca.",
|
||||
"action": "Retirados limpiamente. Cada scan inspecciona entradas frescas del journal desde ese punto en adelante; la misma línea histórica en el journal no se re-emite."
|
||||
},
|
||||
{
|
||||
"trigger": "Errores resueltos con más de siete días.",
|
||||
"action": "Borrados de la base de datos para mantener la tabla pequeña. El historial de notificaciones es independiente y se conserva más tiempo."
|
||||
}
|
||||
],
|
||||
"permanentTitle": "La supresión permanente no es lo mismo que resuelto",
|
||||
"permanentBody": "Poner una Suppression Duration de categoría a <code>-1</code> (<em>permanente</em>) silencia alertas futuras para items que descartas en esa categoría — pero no salta el chequeo de auto-resolve de arriba. Si la condición subyacente desaparece (recurso borrado, umbral ya no rebasado), el item igualmente se limpia automáticamente."
|
||||
},
|
||||
"observations": {
|
||||
"heading": "Observaciones de disco — el historial permanente",
|
||||
"intro": "Los eventos de disco son especiales. Un warning SMART en <code>/dev/sdh</code> a las 02:14 AM es algo que quieres recordar incluso después de que la tormenta I/O se calmase y el error se auto-resolviese — el disco tiene ahora un track record. Para ese propósito, el Monitor de salud guarda una tabla <strong>permanente</strong> aparte: <code>disk_observations</code>.",
|
||||
"headerProperty": "Propiedad",
|
||||
"headerErrors": "tabla <code>errors</code> (Active)",
|
||||
"headerObs": "tabla <code>disk_observations</code>",
|
||||
"rows": [
|
||||
{
|
||||
"property": "Propósito",
|
||||
"errors": "Dirige la vista <em>actual</em> de salud + despacho de notificaciones.",
|
||||
"obs": "Audit trail permanente por disco."
|
||||
},
|
||||
{
|
||||
"property": "Auto-resolve",
|
||||
"errors": "Sí — las filas se aclaran cuando la condición desaparece.",
|
||||
"obs": "No — las entradas persisten para siempre salvo que el usuario las descarte explícitamente."
|
||||
},
|
||||
{
|
||||
"property": "Clave de dedup",
|
||||
"errors": "<code>error_key</code> (p. ej. <code>smart_sdh</code>).",
|
||||
"obs": "<code>(disk_registry_id, error_type, error_signature)</code> con firmas estables despojadas de datos volátiles."
|
||||
},
|
||||
{
|
||||
"property": "Dónde se muestra",
|
||||
"errors": "Modal del Monitor de salud (listas Active / Dismissed).",
|
||||
"obs": "Tarjeta de detalle de disco en la pestaña <strong>Almacenamiento</strong>, con un badge \"X obs.\" por disco."
|
||||
},
|
||||
{
|
||||
"property": "Qué registra",
|
||||
"errors": "Lo que esté fallando actualmente.",
|
||||
"obs": "Warnings SMART (problemas de sector / temperatura / CRC / self-tests fallidos), errores I/O (ATA / NVMe / dm), errores de filesystem, eventos de pool ZFS."
|
||||
}
|
||||
],
|
||||
"outro": "Consecuencia práctica: una alerta puede aclararse del panel mientras el mismo incidente sigue registrado en el historial del disco. Cuando entras a un disco bajo Almacenamiento, la tarjeta muestra el conteo de observaciones pendientes y una lista con timestamps, severidad y el mensaje crudo original — útil cuando estás decidiendo si una unidad necesita reemplazo.",
|
||||
"renameTitle": "Los renombres entre dispositivos se fusionan automáticamente",
|
||||
"renameBody": "Los discos a veces aparecen bajo nombres transitorios (<code>ata8</code>, <code>nvme0n1p3</code>) antes de conseguir un nombre estable de block-device. La capa de observaciones consolida entradas por número de serie cuando se conoce: si un evento se registró primero como <code>ata8</code> y el mismo disco se identifica más tarde como <code>sdh</code>, las observaciones históricas se reasocian a <code>sdh</code> en el siguiente ciclo para que el historial no se fragmente."
|
||||
},
|
||||
"notification": {
|
||||
"heading": "De un hallazgo a una notificación",
|
||||
"intro": "Cada error activo es también un candidato para el motor de notificaciones. El flujo:",
|
||||
"items": [
|
||||
"El escáner registra el hallazgo con categoría + severidad + detalles estructurados.",
|
||||
"Si el tipo de evento está <strong>activado</strong> en los ajustes globales de notificación, y el canal no ha silenciado esta categoría, se encola un evento.",
|
||||
"El motor de templates renderiza un par (título, cuerpo) desde los detalles estructurados. Si el reescritor de IA está activado, el mismo par también pasa por el proveedor configurado para una versión en lenguaje natural.",
|
||||
"La implementación del canal lo envía: mensaje de Telegram, embed de Discord, push de Gotify o email. El resultado del despacho se guarda en <code>notification_history</code>.",
|
||||
"Si un dismiss llega más tarde, la ventana de supresión entra en juego y cualquier re-firing posterior del mismo <code>error_key</code> se queda en la cola hasta que la ventana cierre."
|
||||
],
|
||||
"outro": "La configuración de canales (token de bot de Telegram, URLs de webhook, keys de proveedor de IA, toggles por evento, overrides por canal) está documentada en <notifLink>Notifications</notifLink> y <aiLink>Asistente de IA</aiLink>."
|
||||
},
|
||||
"rest": {
|
||||
"heading": "Endpoints REST",
|
||||
"intro": "Todo lo que hace el modal se puede llamar desde la API — útil para scripts, paneles propios o tu propia integración de chat-bot.",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerMethod": "Método",
|
||||
"headerUse": "Uso",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/health",
|
||||
"method": "GET",
|
||||
"use": "Probe pequeño de salud — devuelve JSON con <code>status</code>, <code>timestamp</code> y <code>version</code>. Adecuado para keyword checks de Uptime Kuma; el receptor debe enviar la cabecera bearer."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/status",
|
||||
"method": "GET",
|
||||
"use": "Veredicto global de salud — severidad única + cadena de resumen. Autenticado."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/details",
|
||||
"method": "GET",
|
||||
"use": "Las diez categorías con sus estados por categoría y el payload estructurado que produjo cada uno."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/full",
|
||||
"method": "GET",
|
||||
"use": "Snapshot completo — categorías + errores activos + lista de dismissed + ajustes de supresión personalizados. Alimenta el modal en un round-trip y usa una caché de fondo de 6 min para respuesta instantánea."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/active-errors",
|
||||
"method": "GET",
|
||||
"use": "Solo la lista Active. Filtrable por <code>?category=<name></code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/dismissed",
|
||||
"method": "GET",
|
||||
"use": "Solo la lista Dismissed, con las horas de supresión restantes."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/acknowledge",
|
||||
"method": "POST",
|
||||
"use": "Body: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Descarta una alerta con la ventana configurada de la categoría."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/settings",
|
||||
"method": "GET / POST",
|
||||
"use": "Lee o escribe los valores de Suppression Duration por categoría."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/health/cleanup-orphans",
|
||||
"method": "POST",
|
||||
"use": "Limpieza manual de errores cuyo dispositivo / VM subyacente ha desaparecido. Idempotente."
|
||||
}
|
||||
],
|
||||
"codeComment1": "# Snapshot del estado actual de salud para un script",
|
||||
"codeComment2": "# Descarta un error específico",
|
||||
"codeComment3": "# Pon la supresión de la categoría discos a una semana"
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Dashboard",
|
||||
"href": "/docs/monitor/dashboard",
|
||||
"tail": " — desde donde se abre el modal del Monitor de salud en la UI."
|
||||
},
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — canales, toggles por evento, el hook de reescritura con IA, historial."
|
||||
},
|
||||
{
|
||||
"label": "Asistente de IA",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — configuración del proveedor (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), modo de prompt, nivel de detalle por canal, idioma."
|
||||
},
|
||||
{
|
||||
"label": "Arquitectura",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tailRich": " — el esquema SQLite (<code>errors</code>, <code>disk_observations</code>, <code>events</code>) y la cadencia del hilo de fondo."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel web autoalojado para Proxmox VE | ProxMenux",
|
||||
"description": "ProxMenux Monitor es un panel web autoalojado para Proxmox VE: métricas del host en tiempo real, almacenamiento y datos SMART, red, VMs y contenedores, hardware, logs, terminal web integrado, un Health Monitor proactivo, notificaciones a Telegram / Discord / Email, asistente IA opcional, una API REST e integraciones con herramientas como Homepage y Home Assistant.",
|
||||
"ogTitle": "ProxMenux Monitor — Panel web autoalojado para Proxmox VE",
|
||||
"ogDescription": "Panel de Proxmox VE en tiempo real: métricas del host, SMART de almacenamiento, red, VMs y contenedores, hardware, logs, terminal web, Health Monitor, notificaciones, asistente IA, API REST.",
|
||||
"twitterTitle": "ProxMenux Monitor | ProxMenux",
|
||||
"twitterDescription": "Panel autoalojado de Proxmox VE con Health Monitor, notificaciones, asistente IA y API REST."
|
||||
},
|
||||
"header": {
|
||||
"title": "ProxMenux Monitor",
|
||||
"description": "Un panel web autoalojado para Proxmox VE distribuido como AppImage. Se ejecuta en el host como un único servicio systemd, escucha en el puerto TCP 8008 y sirve tanto la API como la interfaz desde un único proceso.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"atGlance": {
|
||||
"title": "De un vistazo",
|
||||
"body": "Un único AppImage en el host de Proxmox → backend Flask (puerto 8008) que recoge datos en vivo mediante <code>psutil</code>, <code>pvesh</code>, <code>smartctl</code>, <code>journalctl</code> → panel Next.js servido desde el mismo proceso. Autenticación opcional (contraseña + 2FA), asistente IA opcional, notificaciones opcionales, API REST para integraciones."
|
||||
},
|
||||
"hero": {
|
||||
"alt": "Panel de ProxMenux Monitor — pantalla principal con widgets de CPU, memoria, temperatura y uptime",
|
||||
"caption": "Pantalla principal por defecto — métricas del host y estado de salud de un vistazo."
|
||||
},
|
||||
"coverage": {
|
||||
"heading": "Lo que cubre el panel",
|
||||
"intro": "Ocho secciones principales, cada una respaldada por sus propios endpoints de API:",
|
||||
"tableSection": "Sección",
|
||||
"tableWhat": "Qué muestra",
|
||||
"sections": [
|
||||
{
|
||||
"name": "Health Monitor",
|
||||
"description": "Alertas activas y descartadas para CPU, memoria, almacenamiento, discos, red, servicios, logs, VMs, actualizaciones y seguridad. Alimenta el motor de notificaciones."
|
||||
},
|
||||
{
|
||||
"name": "Almacenamiento",
|
||||
"description": "Pools de almacenamiento de Proxmox, discos físicos (SATA / NVMe / USB), atributos SMART, estado de pools ZFS, desgaste y vida útil, actividad de I/O."
|
||||
},
|
||||
{
|
||||
"name": "Red",
|
||||
"description": "Todas las interfaces (físicas, bonds, bridges, OVS), IP/MAC/estado, gráficos RX/TX en tiempo real, datos RRD históricos por interfaz."
|
||||
},
|
||||
{
|
||||
"name": "VMs y contenedores",
|
||||
"description": "Inventario de todas las VMs y LXCs con estado, recursos y uptime. El detalle muestra config, métricas históricas, logs completos del guest y acciones de start/stop/reboot/shutdown."
|
||||
},
|
||||
{
|
||||
"name": "Hardware",
|
||||
"description": "Modelo y topología de CPU, esquema de memoria, dispositivos PCIe, lista de GPUs con driver y monitorización en tiempo real por slot (NVIDIA / iGPU Intel)."
|
||||
},
|
||||
{
|
||||
"name": "Logs y eventos",
|
||||
"description": "<code>journalctl</code> en vivo con filtros de severidad / rango temporal / palabra clave, historial de tareas de Proxmox, log de notificaciones, paquetes de logs descargables."
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"description": "Shell en el navegador hacia el host o cualquier VM/CT, mediante <code>xterm.js</code> sobre WebSockets. Autenticado y auditado igual que el resto de la API."
|
||||
},
|
||||
{
|
||||
"name": "Seguridad",
|
||||
"description": "Fallos de autenticación, estado de jails de Fail2Ban, eventos de bloqueo recientes, integración con el jail <code>[proxmenux]</code> del host."
|
||||
}
|
||||
],
|
||||
"footer": "Cada sección tiene su propia página de documentación bajo <link>Dashboard</link> en la barra lateral."
|
||||
},
|
||||
"howItRuns": {
|
||||
"heading": "Cómo se ejecuta",
|
||||
"intro": "ProxMenux Monitor se distribuye como un AppImage autocontenido. Una única unidad systemd (<code>proxmenux-monitor.service</code>) arranca un proceso Flask que:",
|
||||
"bullets": [
|
||||
"Escucha en <strong>TCP 8008</strong> en el host (HTTP).",
|
||||
"Sirve el panel Next.js como activos estáticos bajo <code>/</code> y la API bajo <code>/api/*</code> desde el mismo proceso.",
|
||||
"Obtiene datos en vivo con herramientas estándar del host: <code>psutil</code>, <code>pvesh</code>, <code>smartctl</code>, <code>journalctl</code>, <code>zpool</code>, <code>ip</code>, <code>nvidia-smi</code>, etc.",
|
||||
"Persiste su propio estado en una base de datos SQLite local (<code>/usr/local/share/proxmenux/health_monitor.db</code>): alertas descartadas, observaciones de discos, configuración de notificaciones, configuración de IA. El estado de autenticación vive aparte en <code>/root/.config/proxmenux-monitor/auth.json</code>."
|
||||
],
|
||||
"footer": "El flujo completo de petición, la disposición de archivos y la integración systemd se describen en <link>Architecture</link>."
|
||||
},
|
||||
"noAgent": {
|
||||
"title": "Sin agente en los guests",
|
||||
"body": "El Monitor lee todo desde el host. Las VMs y CTs no necesitan ningún agente instalado — los datos del guest provienen de la API de Proxmox y de la visibilidad a nivel de kernel del propio host sobre los guests en ejecución."
|
||||
},
|
||||
"access": {
|
||||
"heading": "Acceder al panel",
|
||||
"intro": "Se soportan dos patrones de acceso y la aplicación detecta cuál está en uso:",
|
||||
"codeComment1": "# 1) Acceso directo al host",
|
||||
"codeComment2": "# 2) Mediante proxy inverso (Nginx / Caddy / Traefik)",
|
||||
"afterCode": "Cuando hay un proxy inverso por delante, el Monitor respeta <code>X-Forwarded-For</code>, <code>X-Forwarded-Proto</code> y <code>X-Forwarded-Host</code> para que las URLs y CORS funcionen correctamente sin configuración manual.",
|
||||
"footer": "La configuración inicial, contraseña + TOTP 2FA y snippets de proxy inverso se cubren en <link>Access & Authentication</link>."
|
||||
},
|
||||
"mobile": {
|
||||
"heading": "Uso móvil e instalación en la pantalla de inicio",
|
||||
"intro": "El panel es responsive y se distribuye como Progressive Web App. El <code>public/manifest.json</code> empaquetado declara <code>display: standalone</code> con nombre, icono y color de tema de la app, por lo que añadir la URL a la pantalla de inicio produce un lanzador autónomo real — sin barra de direcciones, splash personalizada, tema oscuro acorde al panel.",
|
||||
"phoneAlt": "ProxMenux Monitor en un móvil — vista principal del panel",
|
||||
"phoneCaption": "Panel principal en un móvil — el layout se adapta a pantallas pequeñas.",
|
||||
"addHeading": "Añadir a la pantalla de inicio",
|
||||
"iosLabel": "iOS Safari:",
|
||||
"iosBody": "botón de compartir → <em>Añadir a pantalla de inicio</em>. El icono viene de <code>/apple-touch-icon.png</code> incluido en el AppImage.",
|
||||
"androidLabel": "Android Chrome / Edge:",
|
||||
"androidBody": "menú de tres puntos → <em>Instalar app</em> (o <em>Añadir a pantalla de inicio</em> en versiones antiguas).",
|
||||
"afterInstall": "Una vez instalado, abrir el icono lanza el panel en modo standalone con su propia entrada en el conmutador de tareas.",
|
||||
"onlineOnlyTitle": "Solo online",
|
||||
"onlineOnlyBody": "La PWA es instalable pero <strong>no</strong> funciona sin conexión — no hay service worker. El lanzador se comporta como una app nativa, pero el dispositivo necesita poder llegar al host en TCP 8008 (LAN, VPN o HTTPS tras proxy inverso) para que el panel cargue."
|
||||
},
|
||||
"health": {
|
||||
"heading": "El Health Monitor y las notificaciones",
|
||||
"alt": "Pantalla del Health Monitor mostrando las 10 categorías rastreadas (CPU, memoria, almacenamiento, discos, red, servicios, logs, VMs, actualizaciones, seguridad) con su estado actual",
|
||||
"caption": "Vista del Health Monitor — las 10 categorías rastreadas, con su estado actual. Las alertas activas y descartadas aparecen aquí cuando el sistema genera alguna.",
|
||||
"body1": "Dentro del panel, el <strong>Health Monitor</strong> se ejecuta continuamente en segundo plano y produce un flujo estructurado de eventos: alta temperatura de CPU, avisos SMART de discos, degradación de pools ZFS, OOM kills, fallos de VM/CT, incidentes de seguridad, etc. Cada evento tiene una categoría, una severidad (INFO / WARNING / CRITICAL) y un <code>error_key</code> estable para que los duplicados se colapsen en vez de inundar la pantalla.",
|
||||
"feedsIntro": "Los eventos alimentan tres cosas al mismo tiempo:",
|
||||
"feedsHealth": "La <strong>vista del Health Monitor</strong> en el panel (listas de activas + descartadas).",
|
||||
"feedsChannels": "El <strong>motor de notificaciones</strong> — Telegram, Discord, Email, Gotify y Apprise (multicanal). Cada canal se configura independientemente y se pueden silenciar categorías por evento.",
|
||||
"feedsAI": "El <strong>asistente IA</strong> opcional — cuando está activado, el proveedor configurado (OpenAI, Anthropic, Gemini, Groq, Ollama u OpenRouter) explica los eventos entrantes en lenguaje claro y propone próximos pasos si está activado en los ajustes de la IA.",
|
||||
"suppressionTitle": "Supresión en vez de silenciar todo",
|
||||
"suppressionBody": "Cada categoría tiene su propia <em>duración de supresión</em>: una vez que descartas una alerta, la misma alerta se silencia durante esa ventana (24 horas por defecto, configurable por categoría hasta permanente). Las escalaciones reales — p. ej. la temperatura de CPU cruzando el umbral crítico — siempre se vuelven a disparar independientemente de la supresión."
|
||||
},
|
||||
"api": {
|
||||
"heading": "API REST e integraciones",
|
||||
"intro": "Todo lo que muestra la interfaz está disponible como JSON sobre HTTP/HTTPS. Los mismos endpoints alimentan widgets de Homepage, sensores de Home Assistant, dashboards de Grafana (vía el exporter Prometheus en <code>/api/prometheus</code>), pruebas de Uptime Kuma y cualquier script personalizado que hable <code>curl</code>.",
|
||||
"tokens": "Los tokens API de larga duración (365 días) se generan desde <strong>Settings → API Access Tokens</strong> o vía <code>POST /api/auth/generate-api-token</code>.",
|
||||
"bearer": "Los tokens viajan como <code>Authorization: Bearer …</code>. Los endpoints públicos (<code>/api/health</code>, <code>/api/auth/*</code>) funcionan sin token para que las pruebas externas de uptime puedan llegar al host sin entregar credenciales.",
|
||||
"catalog": "El catálogo completo de endpoints, la guía de rotación de tokens y las buenas prácticas de seguridad viven en <linkApi>API Reference</linkApi>; los ejemplos listos para Homepage, Home Assistant, Grafana, Uptime Kuma y un patrón genérico de cURL están en <linkIntegrations>Integrations</linkIntegrations>."
|
||||
},
|
||||
"serviceControl": {
|
||||
"heading": "Control del servicio",
|
||||
"intro": "Día a día, el Monitor se gestiona exactamente como cualquier otro servicio systemd. También está expuesto como dos entradas dentro del TUI de ProxMenux bajo <em>Settings</em>:",
|
||||
"codeComment": "# Control manual",
|
||||
"footer": "Mira <link>Settings → ProxMenux Monitor</link> para el conmutador del menú y el flujo de verificación de estado."
|
||||
},
|
||||
"nextSteps": {
|
||||
"heading": "A dónde ir ahora",
|
||||
"items": [
|
||||
{
|
||||
"label": "Architecture",
|
||||
"description": "— backend Flask, unidad systemd, esquema SQLite, proveedores IA, canales de notificación."
|
||||
},
|
||||
{
|
||||
"label": "Access & Authentication",
|
||||
"description": "— primer arranque, configuración de contraseña, TOTP 2FA, configuración de proxy inverso, integración con Fail2Ban."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard",
|
||||
"description": "— cada sección de la interfaz, una página por cada una."
|
||||
},
|
||||
{
|
||||
"label": "API Reference",
|
||||
"description": "— cada endpoint, forma de petición / respuesta y gestión de tokens."
|
||||
},
|
||||
{
|
||||
"label": "Integrations",
|
||||
"description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma, patrón genérico de cURL."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Integraciones de Proxmox — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor",
|
||||
"description": "Guías copia-pega para conectar ProxMenux Monitor con los paneles de tu homelab: Homepage, Home Assistant, Grafana vía Prometheus, Uptime Kuma. Cada guía con la configuración exacta que esperan los paneles, los endpoints de la API usados y el patrón de cabecera de auth.",
|
||||
"ogTitle": "Integraciones de Proxmox — Homepage, Home Assistant, Grafana, Prometheus",
|
||||
"ogDescription": "Conjunto de guías para conectar ProxMenux Monitor con Homepage, Home Assistant, Grafana, Prometheus y Uptime Kuma.",
|
||||
"twitterTitle": "Integraciones de Proxmox | ProxMenux Monitor",
|
||||
"twitterDescription": "Guías para Homepage, Home Assistant, Grafana, Prometheus y Uptime Kuma."
|
||||
},
|
||||
"header": {
|
||||
"title": "Integraciones",
|
||||
"description": "Guías copia-pega para conectar ProxMenux Monitor en los paneles y herramientas que tu homelab ya usa — Homepage, Home Assistant, Grafana vía Prometheus, Uptime Kuma. Cada guía muestra la configuración exacta que espera la herramienta receptora, el endpoint del Monitor con el que habla y el patrón de cabecera de auth que lo une todo.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué puedes construir desde esta página",
|
||||
"body": "Cada guía de abajo está lista para copiar a tu herramienta elegida. Los endpoints de la API usados aquí están documentados en la <link>API Reference</link> — esta página es el compañero \"cómo usarlos realmente en Homepage / Home Assistant / Grafana\". Las capturas muestran la salida real que verás una vez la guía esté en su sitio."
|
||||
},
|
||||
"auth": {
|
||||
"heading": "Autenticación: lo único que cada guía necesita",
|
||||
"intro": "La mayoría de los endpoints usados por estas integraciones están autenticados. Tienes dos formas de satisfacer ese requisito.",
|
||||
"optAtitle": "Opción A — API token (recomendado para integraciones)",
|
||||
"optAbody1": "Abre el panel y ve a <strong>Settings → Security → API Tokens</strong>. Pulsa <em>Generate token</em>, dale un nombre (p. ej. <em>homepage</em>, <em>home-assistant</em>, <em>prometheus</em>), y copia el token — se muestra <em>una vez</em>. De larga duración (un año de expiración por defecto), revocable individualmente, y lo que deberías usar para cualquier cliente no-navegador.",
|
||||
"optAbody2": "A partir de ahí cada petición es simplemente:",
|
||||
"optBtitle": "Opción B — flujo de login (usuario + contraseña)",
|
||||
"optBbody": "Útil para scripts que se autentican como un usuario humano. El token devuelto es de corta duración; la mayoría de integraciones deberían preferir la Opción A.",
|
||||
"outro": "El campo TOTP solo es requerido cuando el 2FA está activado en la cuenta. La rotación de tokens, la revocación, la política de contraseñas y el log de auditoría viven en <link>Access & Authentication</link>.",
|
||||
"httpsTitle": "Usando HTTPS en lugar de HTTP",
|
||||
"httpsIntro": "Cada guía de abajo usa <code>http://</code> en las URLs para mantener los ejemplos cortos. Si has activado TLS en el Monitor (<strong>Settings → Security → SSL/HTTPS</strong>), cambia <code>http://</code> por <code>https://</code> en cada URL — ese es el único cambio. Dos notas específicas para ciertas herramientas:",
|
||||
"httpsItems": [
|
||||
"<strong>Certificados autofirmados.</strong> La integración <code>rest:</code> de Home Assistant verifica TLS por defecto. Si el Monitor está usando su propio cert autofirmado, añade <code>verify_ssl: false</code> a cada bloque REST (junto a <code>scan_interval:</code>), o importa la CA del Monitor al trust store de HA. Lo mismo para cualquier herramienta que rechace certs no confiables.",
|
||||
"<strong>Prometheus</strong> ya tiene <code>scheme: https</code> listo en la configuración de scrape de abajo; descomenta / déjalo como <code>https</code> si TLS está activado en el Monitor."
|
||||
]
|
||||
},
|
||||
"homepage": {
|
||||
"heading": "Homepage",
|
||||
"headingHref": "https://gethomepage.dev",
|
||||
"intro": "Homepage es un panel de aplicaciones totalmente estático y personalizable. ProxMenux Monitor se enchufa vía el widget <code>customapi</code> integrado — pega una entrada de servicio en <code>services.yaml</code>, reinicia Homepage y la tarjeta aparece con números en vivo.",
|
||||
"iconCalloutTitle": "El logo oficial de ProxMenux está en dashboardicons.com",
|
||||
"iconCalloutBody": "Las guías de abajo usan <code>icon: proxmenux.png</code>. Homepage resuelve automáticamente los nombres de archivo simples contra <a1>dashboardicons.com</a1> — una librería de iconos curada para paneles autoalojados. La entrada de ProxMenux vive en <a2>dashboardicons.com/icons/external/proxmenux</a2> y Homepage la descarga en el primer render. La misma búsqueda funciona para miles de otras herramientas (Telegram, Discord, Grafana, Tailscale, etc.) — basta con escribir <code>icon: <nombre>.png</code> en cualquier entrada de servicio.",
|
||||
"imageAlt": "Panel Homepage mostrando tres tarjetas de ProxMenux Monitor (EDGE, VOID, DREAM) con uptime, CPU, RAM y temperatura para cada host Proxmox",
|
||||
"imageCaption": "Tres instancias de ProxMenux Monitor renderizadas como tarjetas Homepage — uptime, CPU, RAM y temperatura de CPU leídas en vivo desde <code>/api/system</code> en cada host cada 10 s.",
|
||||
"basicTitle": "Widget básico — sin autenticación",
|
||||
"basicIntro": "Usa esto cuando ProxMenux Monitor esté en una red de confianza y aún no hayas activado la autenticación en el lado del Monitor. La entrada más simple posible en <code>services.yaml</code>:",
|
||||
"authedTitle": "Widget autenticado",
|
||||
"authedIntro": "Genera un API token en <strong>Settings → Security → API Tokens</strong> en el Monitor, cópialo y pégalo en la cabecera <code>Authorization</code> de abajo — reemplaza el token de ejemplo mostrado tras <code>Bearer</code> con el que acabas de copiar:",
|
||||
"authedOutro": "Reinicia Homepage y la tarjeta se enciende con valores en vivo. Reutiliza el mismo token en todos los widgets Homepage que apunten al mismo host de ProxMenux Monitor.",
|
||||
"multiTitle": "Setup multi-widget — sistema, almacenamiento, red",
|
||||
"multiIntro": "Para una vista más rica, renderiza tres tarjetas separadas respaldadas por distintos endpoints — una para métricas del sistema, una para almacenamiento, una para red. Usa el mismo token en cada tarjeta; es la misma instancia del Monitor.",
|
||||
"multiCalloutTitle": "Múltiples hosts Proxmox",
|
||||
"multiCalloutBody": "Repite el bloque de entrada por host para obtener el layout multi-tarjeta de la captura de arriba — cada entrada apunta a la URL <code>http://<host>:8008</code> de su propia instancia de ProxMenux Monitor. El token puede ser distinto por host (una entrada secret por host) o compartido, según cómo los generes."
|
||||
},
|
||||
"homeAssistant": {
|
||||
"heading": "Home Assistant",
|
||||
"headingHref": "https://www.home-assistant.io",
|
||||
"intro": "No hay una integración HACS nativa para ProxMenux Monitor (todavía) — pero no la necesitas. La integración <code>rest</code> integrada en Home Assistant puede consumir cada endpoint documentado en la <link>API Reference</link> y convertir las respuestas en sensores, atributos y triggers. El build de referencia completo de abajo expone ~25 sensores cubriendo recursos del sistema, el Monitor de salud, VMs / CTs, almacenamiento, red, latencia al gateway y estado de actualización de ProxMenux — pega el YAML en <code>configuration.yaml</code>, reinicia y tienes una capa completa de observabilidad de Proxmox dentro de HA.",
|
||||
"imageAlt": "Panel Home Assistant mostrando entidades de ProxMenux Monitor — badge de estado de salud, gauges de CPU / RAM / Temp, contador de VMs, uso de almacenamiento y contador de errores activos",
|
||||
"imageCaption": "ProxMenux Monitor como integración de primera clase en Home Assistant — sensores construidos desde la guía YAML de abajo.",
|
||||
"step1Title": "1 · Guarda el API token",
|
||||
"step1Body": "Mete el token en el <code>secrets.yaml</code> de Home Assistant para que nunca se filtre en un volcado de config. El prefijo bearer entero va en una línea — eso permite al YAML referenciarlo directamente como valor de cabecera. El nombre y ubicación del archivo depende de tu instalación de HA (típicamente <code>/config/secrets.yaml</code> para HA OS / Container).",
|
||||
"step2Title": "2 · Añade la configuración REST",
|
||||
"step2Body": "Seis bloques REST cubren toda la superficie — uno por área principal del Monitor. Cada bloque tiene un <code>scan_interval</code> sensato ajustado a cuán a menudo cambian los datos subyacentes (recursos del sistema cada 30 s, salud cada 60 s, inventarios que cambian despacio cada 5-10 min). Pega en <code>configuration.yaml</code>:",
|
||||
"step3Title": "3 · Añade sensores binarios y helpers de template",
|
||||
"step3Body": "Dos sensores binarios y un par de sensores template redondean la integración — hacen que las automatizaciones y las tarjetas condicionales de Lovelace queden mucho más limpias que encadenar Jinja en cada sitio.",
|
||||
"step4Title": "4 · Recarga y verifica",
|
||||
"step4Body": "Desde la UI de HA: <em>Developer Tools → YAML → Check Configuration</em> primero para validar la sintaxis, luego recarga <em>All YAML configuration</em> (o reinicia completo). Después de que vuelva, filtra <em>Settings → Devices & Services → Entities</em> por <em>proxmenux</em> — deberías ver las ~25 entidades llenándose dentro de un intervalo de scan.",
|
||||
"replaceTitle": "¿Reemplazando una versión anterior de esta guía?",
|
||||
"replaceBody": "Si probaste una versión previa de estos bloques YAML, el registro de entidades de Home Assistant puede haber cacheado los IDs de entidad viejos y entidades obsoletas seguirán apareciendo (con warnings <em>Entidad no encontrada</em> en tus tarjetas Lovelace). Estado limpio en dos pasos: borra los bloques <code>rest:</code> y <code>template:</code> previos de <code>configuration.yaml</code>, recarga, y luego bajo <em>Settings → Devices & Services → Entities</em> filtra por <em>proxmenux</em> y quita cualquier entrada marcada como \"Restored\" o mostrada como indisponible. Luego pega el YAML actual y recarga de nuevo — las entidades nuevas se registran limpiamente.",
|
||||
"step5Title": "5 · Panel Lovelace",
|
||||
"step5Body": "El YAML de abajo es una única tarjeta <strong>vertical-stack</strong> que combina todas las sub-tarjetas en un bloque — cabecera con logo, KPIs rápidos, detalle del sistema, VMs, almacenamiento, red y una tarjeta condicional de problemas de salud. Para usarla: abre tu panel, pulsa el lápiz (editar), pulsa <em>Add card</em>, baja al final y elige <em>Manual</em>, luego pega:",
|
||||
"viewTipTitle": "¿Lo quieres como vista completa de panel en lugar de una sola tarjeta?",
|
||||
"viewTipBody": "Abre el menú de 3 puntos del panel → <em>Raw configuration editor</em> y añade una vista nueva con esta cabecera (encima de la lista <code>cards:</code> del YAML de arriba):",
|
||||
"viewTipOutro": "Eso te da una pestaña/vista dedicada en tu panel con su propio icono y título, en vez de una tarjeta larga en una vista existente.",
|
||||
"altViewTitle": "Alternativa — una vista de panel dedicada",
|
||||
"altViewIntro": "Si prefieres tener una página dedicada completa (su propia pestaña en la barra lateral del panel) en vez de una tarjeta dentro de una vista existente, Home Assistant te deja crear una vista nueva directamente con YAML. Pasos:",
|
||||
"altViewSteps": [
|
||||
"Abre el panel donde quieres la nueva pestaña.",
|
||||
"Pulsa el lápiz (editar panel) arriba a la derecha.",
|
||||
"Pulsa la pestaña <em>+</em> al final de las pestañas existentes para crear una vista nueva.",
|
||||
"En el diálogo que se abre, cambia a la pestaña <em>Code editor</em> (arriba a la derecha del diálogo — alterna entre editor visual y YAML).",
|
||||
"Pega el YAML de abajo.",
|
||||
"Guarda. La nueva pestaña <em>ProxMenux Monitor</em> aparece en la barra lateral con todas las tarjetas renderizadas."
|
||||
],
|
||||
"twoEditorsTitle": "Dos editores YAML en HA — elige el correcto",
|
||||
"twoEditorsIntro": "Home Assistant tiene dos editores YAML que parecen similares pero esperan formatos distintos:",
|
||||
"twoEditorsItems": [
|
||||
"<strong>Editor de una sola vista</strong> (esta guía) — abierto desde la pestaña <em>+</em> o desde <em>Edit view → Code editor</em>. Espera el cuerpo de una vista directamente: <code>title:</code>, <code>path:</code>, <code>cards:</code> al top level, sin guion inicial.",
|
||||
"<strong>Editor Raw del panel entero</strong> — abierto desde el menú de 3 puntos del panel. Espera la lista <code>views:</code> entera, con cada vista como item de lista (<code>-</code> inicial)."
|
||||
],
|
||||
"twoEditorsOutro": "Pegar YAML de cuerpo de vista en el editor de panel entero (o viceversa) te deja con una <em>Vista sin nombre</em> y <code>cards: []</code>. El YAML de abajo es para el editor de una sola vista — pega exactamente como se muestra.",
|
||||
"viewImageAlt": "Vista dedicada de Home Assistant renderizando ProxMenux Monitor — cabecera picture-entity, KPIs glance y tarjetas de entidad Sistema / VMs / Almacenamiento / Red distribuidas automáticamente por HA en múltiples columnas",
|
||||
"viewImageCaption": "La vista dedicada <em>ProxMenux Monitor</em> como la renderiza Home Assistant en una pantalla ancha — el layout por defecto de HA divide las tarjetas en múltiples columnas automáticamente.",
|
||||
"twoColTipTitle": "¿Quieres un layout fijo de dos columnas en lugar del auto layout?",
|
||||
"twoColTipBody": "Reemplaza cualquier par de tarjetas (p. ej. <em>Sistema</em> + <em>VMs</em>, o <em>Almacenamiento</em> + <em>Red</em>) con un único <code>horizontal-stack</code> envolviendo ambas, para que siempre se rendericen lado a lado independientemente del ancho de pantalla:",
|
||||
"twoColTipOutro": "En móvil la fila se mantiene comprimida; el auto layout de HA (sin horizontal-stack) refluye mejor a anchos estrechos.",
|
||||
"step6Title": "6 · Automatizaciones",
|
||||
"step6Body": "Tres automatizaciones que cubren los escenarios reactivos más comunes — reemplaza <code>notify.mobile_app_<tu_movil></code> por el servicio notify que uses:",
|
||||
"logoTitle": "Sobre el logo de ProxMenux",
|
||||
"logoBody": "La tarjeta picture-entity en la parte superior del YAML Lovelace descarga el logo oficial de ProxMenux desde <a1>dashboardicons.com</a1> — una librería de iconos gratuita curada para paneles autoalojados. La entrada de ProxMenux vive en <a2>dashboardicons.com/icons/external/proxmenux</a2>. Home Assistant descarga el SVG sobre HTTPS en el primer render y lo cachea.",
|
||||
"logoBrokenTitle": "Si la tarjeta del logo muestra una imagen rota",
|
||||
"logoBrokenIntro": "Algunas instalaciones de HA (redes con firewall, bloqueadores de contenido, hosts sin internet pública) no pueden alcanzar jsdelivr.net en el momento del render. El arreglo es una copia local:",
|
||||
"logoBrokenSteps": [
|
||||
"Descarga el SVG desde <a>cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg</a>.",
|
||||
"Guárdalo en <code>/config/www/icons/proxmenux.svg</code> en tu host HA.",
|
||||
"En el YAML Lovelace, reemplaza la URL <code>image:</code> por <code>/local/icons/proxmenux.svg</code>. Guarda y recarga — la imagen se renderiza desde el archivo local, sin internet necesaria."
|
||||
],
|
||||
"scanTipTitle": "Regla práctica para scan_interval",
|
||||
"scanTipBody": "<code>/api/system</code> es barato de llamar — 30 s está bien. <code>/api/health/full</code> usa una caché interna de 6 min, así que hacer polling más a menudo de ~60 s no te aporta nada. <code>/api/storage/summary</code> cambia despacio — cada 5 min sobra. <code>/api/proxmenux/update-status</code> solo importa una vez por hora. Ajusta a tu presupuesto de hardware si tienes muchos sensores en muchos hosts."
|
||||
},
|
||||
"grafana": {
|
||||
"heading": "Prometheus + Grafana",
|
||||
"promHref": "https://prometheus.io",
|
||||
"grafanaHref": "https://grafana.com",
|
||||
"intro": "ProxMenux Monitor expone un endpoint de scrape formato Prometheus en <code>GET /api/prometheus</code> (autenticado) devolviendo texto OpenMetrics. Cabléalo a Prometheus, luego construye un panel Grafana encima — los mismos datos que muestra la UI del panel, en el formato que tu TSDB espera.",
|
||||
"imageAlt": "Panel Grafana renderizando métricas de ProxMenux Monitor — gauge de uso de CPU, timeseries de uso de memoria, contador de VMs en ejecución, throughput de red",
|
||||
"imageCaption": "Un panel Grafana básico construido desde el scrape Prometheus de ProxMenux — CPU, memoria, VMs en ejecución, throughput de red. El catálogo completo de métricas vive en la <link>API Reference → Métricas Prometheus</link>.",
|
||||
"step1Title": "1 · Añade el job de scrape a Prometheus",
|
||||
"step1Body": "Pasa el API token vía el bloque nativo <code>authorization</code> de Prometheus (más limpio que cabeceras personalizadas y funciona con secret stores):",
|
||||
"step1After": "Recarga Prometheus (<code>kill -HUP</code> o <code>systemctl reload prometheus</code>, o <code>docker compose restart prometheus</code> si lo corres como contenedor) y comprueba <em>Status → Targets</em> — el job proxmenux debería ponerse verde dentro de un intervalo de scrape. Cada métrica lleva una etiqueta <code>node=\"<hostname>\"</code> para que puedas distinguir hosts en las queries.",
|
||||
"tokenTipTitle": "Token vía archivo o env, no inline",
|
||||
"tokenTipBody": "Para despliegues en producción evita poner el token inline. Prometheus soporta <code>credentials_file: /etc/prometheus/secrets/proxmenux.token</code> como alternativa — guarda el token en un archivo 0600 y deja que Prometheus lo lea.",
|
||||
"step2Title": "2 · Verifica el scrape con un par de queries",
|
||||
"step2Body": "Antes de configurar Grafana, confirma que Prometheus realmente tiene los datos. Abre la propia UI de Prometheus en <code>http://<host-prometheus>:9090</code>, pulsa <em>Query</em> y ejecuta cualquiera de estas — deberías obtener números en vivo de tu host Proxmox:",
|
||||
"headerQuery": "Query",
|
||||
"headerConfirms": "Qué confirma",
|
||||
"verifyRows": [
|
||||
{
|
||||
"query": "up{job=\"proxmenux\"}",
|
||||
"confirms": "Devuelve <code>1</code> si Prometheus está haciendo scrape del Monitor con éxito, <code>0</code> si no. La comprobación de cordura más rápida."
|
||||
},
|
||||
{
|
||||
"query": "proxmox_cpu_usage",
|
||||
"confirms": "Porcentaje de uso de CPU actual del host Proxmox. Debería cambiar si refrescas la query con unos segundos de diferencia."
|
||||
},
|
||||
{
|
||||
"query": "proxmox_vms_running",
|
||||
"confirms": "Número de guests en ejecución. Compara con lo que ves en la UI de Proxmox."
|
||||
},
|
||||
{
|
||||
"query": "proxmox_uptime_seconds / 86400",
|
||||
"confirms": "Uptime del host en días. Debería coincidir con el valor que verías en <code>uptime</code> en la shell de Proxmox."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "El 401 que puedes ver al pulsar la URL del endpoint es normal",
|
||||
"calloutBody": "En la página <em>Status → Targets</em>, pulsar el enlace del endpoint (<code>/api/prometheus</code>) hace que tu navegador lo descargue directamente — sin la cabecera bearer que Prometheus usa para sus propios scrapes. Así que verás <code>'{'\"error\":\"Authentication required\"'}'</code>. Eso confirma que la API está correctamente protegida; el propio Prometheus se autentica correctamente porque tiene el token de la configuración de scrape. Confía en el verde <em>State: UP</em>, no en el click-through.",
|
||||
"step3Title": "3 · Añade Prometheus como fuente de datos en Grafana",
|
||||
"step3Body": "En Grafana: <em>Connections → Data sources → Add new → Prometheus</em>. Configura la URL a tu instancia de Prometheus (p. ej. <code>http://prometheus.lan:9090</code>), guarda y prueba. No se necesita auth extra en esta capa — Prometheus ya se ha autenticado a ProxMenux.",
|
||||
"step4Title": "4 · Construye paneles con estas queries PromQL",
|
||||
"step4Body": "Un set inicial que mapea directamente a lo que los usuarios típicamente vigilan en un host Proxmox:",
|
||||
"headerPanel": "Idea de panel",
|
||||
"headerPromql": "Query PromQL",
|
||||
"panelRows": [
|
||||
{
|
||||
"panel": "Gauge de uso de CPU por host",
|
||||
"promql": "proxmox_cpu_usage"
|
||||
},
|
||||
{
|
||||
"panel": "Gauge de uso de memoria por host",
|
||||
"promql": "proxmox_memory_usage_percent"
|
||||
},
|
||||
{
|
||||
"panel": "Memoria usada vs total (timeseries)",
|
||||
"promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024"
|
||||
},
|
||||
{
|
||||
"panel": "VMs / CTs en ejecución por host",
|
||||
"promql": "proxmox_vms_running"
|
||||
},
|
||||
{
|
||||
"panel": "Temperatura de CPU",
|
||||
"promql": "proxmox_cpu_temperature_celsius"
|
||||
},
|
||||
{
|
||||
"panel": "Throughput de red RX (bytes/s)",
|
||||
"promql": "rate(proxmox_interface_bytes_received_total[5m])"
|
||||
},
|
||||
{
|
||||
"panel": "Throughput de red TX (bytes/s)",
|
||||
"promql": "rate(proxmox_interface_bytes_sent_total[5m])"
|
||||
},
|
||||
{
|
||||
"panel": "Load average (1m)",
|
||||
"promql": "proxmox_load_average{period=\"1m\"}"
|
||||
},
|
||||
{
|
||||
"panel": "% espacio en disco usado por mountpoint",
|
||||
"promql": "proxmox_disk_usage_percent"
|
||||
},
|
||||
{
|
||||
"panel": "Carga de batería de UPS",
|
||||
"promql": "proxmox_ups_battery_charge_percent"
|
||||
},
|
||||
{
|
||||
"panel": "Temperatura de GPU por slot",
|
||||
"promql": "proxmox_gpu_temperature_celsius"
|
||||
}
|
||||
],
|
||||
"outro": "Añade cada query como un panel Grafana, configura la visualización adecuada (<em>Stat</em> para gauges, <em>Time series</em> para tendencias) y agrupa paneles en filas por categoría. Usa la etiqueta <code>node</code> como variable de panel (<em>Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)</em>) para filtrar todos los paneles por host."
|
||||
},
|
||||
"uptimeKuma": {
|
||||
"heading": "Uptime Kuma y otros status checkers",
|
||||
"href": "https://github.com/louislam/uptime-kuma",
|
||||
"intro": "Para probes externos, usa <code>GET /api/system-info</code> — es el único endpoint que funciona sin token, devolviendo un payload JSON pequeño con hostname, uptime y el estado global de salud (mapeado a <code>healthy</code> / <code>warning</code> / <code>critical</code>). Eso es exactamente lo que necesita un monitor basado en keyword.",
|
||||
"kumaTitle": "Uptime Kuma — HTTP keyword monitor",
|
||||
"kumaSteps": [
|
||||
"En Uptime Kuma, pulsa <em>+ Add New Monitor</em>.",
|
||||
"Monitor Type: <em>HTTP(s) - Keyword</em>.",
|
||||
"Friendly Name: <em>ProxMenux Monitor — pve01</em>.",
|
||||
"URL: <code>http://pve01.lan:8008/api/system-info</code>.",
|
||||
"Keyword: <code>healthy</code> (el valor de <code>health.status</code> cuando el host está OK).",
|
||||
"Heartbeat Interval: 60 segundos basta.",
|
||||
"Guarda. Sin cabeceras necesarias — el endpoint es público."
|
||||
],
|
||||
"healthchecksTitle": "healthchecks.io / pings tipo cron",
|
||||
"healthchecksBody": "Mismo endpoint, misma forma — apunta tu ping tipo cron a <code>/api/system-info</code> y comprueba <code>.health.status == \"healthy\"</code>. La mayoría de estos servicios aceptan un estado HTTP 2xx como señal de \"up\" también, en cuyo caso incluso un curl sin parsing basta.",
|
||||
"richTitle": "¿Quieres datos de salud más ricos?",
|
||||
"richBody": "Para el estado completo (las diez categorías del Monitor de salud + errores activos + lista dismissed), usa <code>GET /api/health/full</code> en su lugar — ese requiere un API token pero te da todo lo que el modal del panel renderiza en una sola respuesta."
|
||||
},
|
||||
"workflows": {
|
||||
"heading": "n8n, Zapier y scripts propios",
|
||||
"intro": "Para herramientas de workflow y scripts ad-hoc que necesitan <em>levantar</em> notificaciones a través del Monitor (un fallo de CI, un sensor de smart-home, un cron job que tardó demasiado), la guía es un POST a <code>/api/notifications/send</code>. El evento fluye por la misma pipeline de despacho que cualquier cosa emitida internamente — dedup, cooldown, reescritura con IA opcional, fan-out a los canales configurados.",
|
||||
"n8nBody": "En n8n, el equivalente es un nodo <em>HTTP Request</em> con método POST, la URL de arriba, una cabecera <em>Authorization</em> configurada a <code>Bearer '{''{'$credentials.proxmenux.token'}''}'</code> (usando credentials de n8n) y un body JSON coincidiendo con el payload de curl. Cabléa cualquier nodo precedente como el trigger (cron, webhook, condición).",
|
||||
"severityBody": "Los valores de severidad son <code>INFO</code>, <code>WARNING</code> o <code>CRITICAL</code> (en mayúsculas). El payload <code>data</code> es JSON libre — el reescritor de IA, cuando está activado, sacará cualquier cosa útil de ahí para el cuerpo renderizado. La semántica completa de tipos de evento vive en <link>Notifications → Catálogo de eventos</link>."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Webhook nativo de Proxmox VE (entrante)",
|
||||
"intro1": "Proxmox VE 8.1+ tiene su propio sistema de notificaciones. ProxMenux Monitor se registra como destino webhook para que todo lo que PVE emite por sí mismo (fencing HA, replicación, vzdump desde la GUI, renovación de certificado) aterrice en la misma pipeline de despacho que los propios eventos del Monitor. Esto ocurre automáticamente cuando pulsas <em>Enable Notifications</em> en la pestaña Settings — sin trabajo de integración requerido por parte del usuario.",
|
||||
"intro2": "La mecánica, la plantilla de body que PVE envía, las entradas escritas en <code>/etc/pve/notifications.cfg</code> y el comportamiento en clusters están documentados en <link>Notifications → Integración del webhook de PVE</link>."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "API Reference",
|
||||
"href": "/docs/monitor/api",
|
||||
"tail": " — cada endpoint con método, path y el catálogo completo de métricas Prometheus."
|
||||
},
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
"tail": " — fuentes de eventos, canales, la pipeline de despacho, la integración del webhook de PVE en detalle."
|
||||
},
|
||||
{
|
||||
"label": "Asistente de IA",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — el reescritor opcional que convierte cuerpos templated en lenguaje natural antes de llegar a Telegram / Discord / email / Gotify."
|
||||
},
|
||||
{
|
||||
"label": "Access & Authentication",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tail": " — emitir y revocar los API tokens que consumen estas guías, log de auditoría, configuración TLS."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,483 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Notificaciones de Proxmox — Telegram, Discord, Email, Gotify, Apprise | ProxMenux Monitor",
|
||||
"description": "Envía notificaciones de Proxmox VE a Telegram, Discord, Email, Gotify y ~80 servicios extra vía Apprise. ProxMenux Monitor convierte eventos del Monitor de salud, el journal watcher y el webhook de Proxmox VE en mensajes ricos con deduplicación, cooldown, agregación de ráfagas, una reescritura con IA opcional y un historial completo.",
|
||||
"ogTitle": "Notificaciones de Proxmox — Telegram, Discord, Email, Gotify, Apprise",
|
||||
"ogDescription": "Envía alertas de Proxmox VE a Telegram, Discord, Email, Gotify y ~80 servicios extra vía Apprise — con deduplicación, cooldown, agregación de ráfagas y una reescritura con IA opcional.",
|
||||
"twitterTitle": "Notificaciones de Proxmox | ProxMenux Monitor",
|
||||
"twitterDescription": "Envía alertas de Proxmox VE a Telegram, Discord, Email, Gotify y ~80 servicios extra vía Apprise."
|
||||
},
|
||||
"header": {
|
||||
"title": "Notifications",
|
||||
"description": "El motor de fan-out que toma eventos de cada colector dentro del Monitor y los entrega a Telegram, Discord, Email, Gotify y ~80 servicios extra vía Apprise — con deduplicación, cooldown, agregación de ráfagas, toggles por evento y por canal, un reescritor de IA opcional y un historial consultable.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"intro": {
|
||||
"title": "De dónde vienen los mensajes",
|
||||
"body": "Las notificaciones no son un escáner aparte. Son el lado de salida de cada colector que ya está corriendo dentro del Monitor — el <link>Monitor de salud</link>, el journal watcher, el task watcher de Proxmox, el hook del webhook de PVE, el polling collector y los eventos in-process emitidos por scripts de ProxMenux. Cada evento corre por la misma pipeline de despacho antes de llegar a un móvil o a un buzón de correo."
|
||||
},
|
||||
"howItWorks": {
|
||||
"heading": "Cómo funciona",
|
||||
"intro": "Cada notificación sigue el mismo camino por el proceso del Monitor. Los eventos los producen un puñado de colectores independientes, se normalizan en un payload estructurado, pasan por una pipeline de despacho que decide si enviar y en qué forma, opcionalmente se reescriben por un LLM, y finalmente se reparten a los canales que el usuario haya configurado.",
|
||||
"arrowLabel": "evento",
|
||||
"caption": "Flujo de alto nivel. Cada intento real de despacho — exitoso, agregado o fallido — se registra en la tabla de historial SQLite para inspección retrospectiva. Los eventos suprimidos por la etapa de cooldown no se loguean.",
|
||||
"nodes": {
|
||||
"sourcesLabel": "Fuentes",
|
||||
"sourcesDetail": "Monitor de salud\nJournal watcher\nTask watcher\nPVE webhook hook\nPolling collector\nEmisores in-process",
|
||||
"dispatchLabel": "Pipeline de despacho",
|
||||
"dispatchDetail": "Toggle por evento\nDedup fingerprint\nCooldown\nAgregación de ráfaga",
|
||||
"aiLabel": "Reescritura IA (opc.)",
|
||||
"aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(off por defecto)",
|
||||
"channelsLabel": "Canales",
|
||||
"channelsDetail": "Telegram\nDiscord\nEmail (SMTP)\nGotify\nApprise (~80 servicios)"
|
||||
}
|
||||
},
|
||||
"enabling": {
|
||||
"heading": "Activar el panel",
|
||||
"intro": "En una instalación recién hecha la tarjeta Notifications en la pestaña Settings muestra un badge <em>Disabled</em> y un único botón <em>Enable Notifications</em>. Nada se despacha y ninguna config de PVE se toca hasta que lo pulsas.",
|
||||
"disabledAlt": "Tarjeta Notifications en una instalación recién hecha mostrando badge Disabled y un único botón Enable Notifications",
|
||||
"disabledCaption": "El primer estado — un clic para activar.",
|
||||
"stepsIntro": "Pulsar el botón hace tres cosas en secuencia:",
|
||||
"steps": [
|
||||
"Cambia el panel a su estado <em>Active</em> y despliega el formulario de canal debajo.",
|
||||
"Registra un destino webhook de Proxmox VE en <code>/etc/pve/notifications.cfg</code> apuntando a <code>POST http://127.0.0.1:8008/api/notifications/webhook</code>. Desde este momento, todo lo que Proxmox VE emite por sí mismo (HA, replicación, vzdump desde la GUI) fluye a la misma pipeline que los eventos propios del Monitor. Mira <pvelink>Integración del webhook de PVE</pvelink> más abajo para la mecánica completa.",
|
||||
"Arranca el hilo de fondo de despacho. El hilo hace polling de la cola de eventos y camina cada evento por la pipeline diagramada arriba."
|
||||
],
|
||||
"activeAlt": "Tarjeta Notifications tras activar — badge Active, pestañas de canal (Telegram, Gotify, Discord, Email), campo Display Name y sección colapsable Advanced AI Enhancement",
|
||||
"activeCaption": "Estado Active — pestañas de canal arriba (Telegram / Gotify / Discord / Email), el campo Display Name, la lista de categorías por canal y la sección colapsable <em>Advanced: AI Enhancement</em>."
|
||||
},
|
||||
"sources": {
|
||||
"heading": "Fuentes de eventos",
|
||||
"intro": "Seis colectores independientes alimentan el motor de notificaciones. Corren como hilos de fondo dentro del proceso del Monitor y emiten un <code>NotificationEvent</code> estructurado cada vez que algo pasa.",
|
||||
"headerCollector": "Colector",
|
||||
"headerWatches": "Vigila",
|
||||
"headerEvents": "Eventos típicos",
|
||||
"rows": [
|
||||
{
|
||||
"collector": "Monitor de salud",
|
||||
"watches": "Diez categorías, cada 5 minutos",
|
||||
"events": "<code>new_error</code>, <code>error_resolved</code>, <code>error_escalated</code>, <code>health_degraded</code>, <code>health_persistent</code>."
|
||||
},
|
||||
{
|
||||
"collector": "Journal watcher",
|
||||
"watches": "<code>journalctl --follow</code> con pattern matching para fallos de autenticación SSH / web, bans de Fail2Ban (cuando el jail opcional está instalado), errores I/O del kernel, OOM, eventos de smartd.",
|
||||
"events": "<code>auth_fail</code>, <code>ip_block</code>, <code>oom_kill</code>, <code>disk_io_error</code>, <code>service_fail</code>."
|
||||
},
|
||||
{
|
||||
"collector": "Task watcher",
|
||||
"watches": "Hace polling de <code>/var/log/pve/tasks/index</code> para nuevos UPIDs de tareas y sigue sus logs por archivo.",
|
||||
"events": "<code>backup_start</code>, <code>backup_complete</code>, <code>backup_warning</code>, <code>backup_fail</code>, <code>migration_*</code>, <code>snapshot_complete</code>."
|
||||
},
|
||||
{
|
||||
"collector": "Hook de webhook Proxmox",
|
||||
"watches": "Escucha en <code>POST /api/notifications/webhook</code>. Proxmox VE 8.1+ empuja sus propias notificaciones aquí una vez configurada la integración (mira <pvelink>abajo</pvelink>).",
|
||||
"events": "Cualquier cosa que PVE emita — incluyendo eventos que el Monitor de otro modo perdería (HA, replicación, vzdump desde la GUI)."
|
||||
},
|
||||
{
|
||||
"collector": "Polling collector",
|
||||
"watches": "Comparaciones periódicas (nodos del cluster online, caducidad de certificado, estado de passthrough de GPU, disponibilidad de actualización PVE / ProxMenux).",
|
||||
"events": "<code>node_disconnect</code>, <code>node_reconnect</code>, <code>pve_update</code>, <code>proxmenux_update</code>, <code>gpu_mode_switch</code>, <code>pci_passthrough_conflict</code>."
|
||||
},
|
||||
{
|
||||
"collector": "Emisores in-process",
|
||||
"watches": "Llamadas directas desde scripts de ProxMenux y desde el propio Monitor (<code>notification_manager.emit_event(...)</code>).",
|
||||
"events": "<code>system_startup</code>, <code>system_shutdown</code>, <code>system_reboot</code>, <code>ai_model_migrated</code>, eventos de prueba personalizados."
|
||||
}
|
||||
],
|
||||
"after1": "Cada evento lleva un <code>event_type</code> estable (el catálogo está abajo), una <code>severity</code> (<code>INFO</code>, <code>WARNING</code>, <code>CRITICAL</code>), una <code>category</code> (usada para enriquecimiento de emoji y filtros por grupo) y un payload <code>data</code> con lo que la template necesite (<code>vmid</code>, <code>device</code>, <code>source_ip</code>, <code>reason</code>…).",
|
||||
"after2": "Cada <code>event_type</code> tiene una template coincidente en <code>notification_templates.py</code> que renderiza el evento estructurado en un cuerpo de texto plano antes de que cualquier otra cosa pase. Ese cuerpo templated es lo que viaja por la pipeline de despacho, y lo que la capa opcional de IA reescribe si está activada. Mira la <ailink>página del Asistente de IA</ailink> para cómo la capa de reescritura interactúa con este cuerpo templated."
|
||||
},
|
||||
"channels": {
|
||||
"heading": "Walkthroughs de canales",
|
||||
"intro": "Cinco canales están actualmente soportados: Telegram, Discord, Gotify, Email (SMTP) y Apprise. Los primeros cuatro son nativos — cada uno tiene su propia pestaña dentro del panel Notifications con un enlace <em>+ setup guide</em> que abre un modal in-app. Apprise es un hub genérico que añade ~80 servicios adicionales (ntfy, Matrix, Pushover, Slack, Teams, Pushbullet, AWS SNS, Mattermost…) a través de un único campo de URL. Están todos documentados paso a paso abajo.",
|
||||
"credsTitle": "Dónde viven las credenciales",
|
||||
"credsBody": "Los tokens, URLs de webhook y contraseñas SMTP se guardan localmente en la base de datos SQLite del Monitor bajo <code>/usr/local/share/proxmenux/</code>. Nunca salen del host excepto para llegar a sus respectivos servicios. Un backup de ese directorio basta para recuperar los canales configurados."
|
||||
},
|
||||
"telegram": {
|
||||
"heading": "Telegram",
|
||||
"intro": "Se requieren dos piezas de información: un <strong>Bot Token</strong> (uno por bot, reutilizable entre chats) y un <strong>Chat ID</strong> (donde el bot debe publicar — tu chat privado, un grupo o un tema dentro de un supergrupo). La guía in-app de abajo contiene el paso a paso completo; el resto de esta sección lo repite como texto más las dos formas que puede tomar el Chat ID.",
|
||||
"guideAlt": "Modal Telegram Bot Setup Guide con cuatro secciones numeradas: Crear un Bot con BotFather, Obtener el Bot Token, Obtener tu Chat ID y Para Grupos o Canales",
|
||||
"guideCaption": "El enlace <em>+ setup guide</em> dentro de la pestaña Telegram abre este modal — los cuatro pasos numerados van de sin bot a un canal funcionando en unos dos minutos.",
|
||||
"step1Title": "1 · Crea un bot con BotFather",
|
||||
"step1Items": [
|
||||
"Abre Telegram y empieza un chat con <a>@BotFather</a> (el que tiene el tick azul de verificación — las copias son comunes).",
|
||||
"Envía <code>/newbot</code>.",
|
||||
"Elige un nombre visible (p. ej. <em>ProxMenux Lab</em>). Se puede cambiar después.",
|
||||
"Elige un username terminado en <code>bot</code> (p. ej. <em>proxmenux_lab_bot</em>). Debe ser único en Telegram.",
|
||||
"BotFather responde con un token de la forma <code>123456789:ABCdef…</code> — ese es el Bot Token. Trátalo como una contraseña."
|
||||
],
|
||||
"step2Title": "2 · Obtén el Chat ID",
|
||||
"step2Intro": "El Chat ID identifica <em>dónde</em> publica el bot. Toma una de dos formas según el destino.",
|
||||
"privateLabel": "Chat privado (recibes las alertas en tu propia cuenta):",
|
||||
"privateItems": [
|
||||
"Empieza un chat con tu nuevo bot y envía cualquier mensaje (p. ej. <code>/start</code>).",
|
||||
"Abre un chat con <a1>@userinfobot</a1> (o <a2>@myidbot</a2>) y envía <code>/start</code>. Te responde con tu ID numérico de usuario — ese es el Chat ID. Es un número positivo."
|
||||
],
|
||||
"privateAlt": "Formulario de canal Telegram rellenado con Bot Token (enmascarado), Chat ID positivo para un chat privado y un campo opcional Topic ID vacío",
|
||||
"privateCaption": "Chat privado con el bot — el Chat ID es un número positivo (tu ID de usuario personal).",
|
||||
"groupLabel": "Grupo o supergrupo con temas:",
|
||||
"groupItems": [
|
||||
"Añade el bot al grupo como miembro (y hazlo admin si el grupo lo requiere para publicar).",
|
||||
"Envía cualquier mensaje en el grupo.",
|
||||
"Abre <code>https://api.telegram.org/bot<TU_TOKEN>/getUpdates</code> en un navegador. Busca <code>chat.id</code> en la respuesta JSON — para grupos es un número negativo, para supergrupos empieza con <code>-100</code>.",
|
||||
"Para supergrupos con <em>Topics</em> activado, anota también el <code>message_thread_id</code> del tema al que quieres apuntar — eso va en el campo opcional <em>Topic ID</em>."
|
||||
],
|
||||
"groupAlt": "Formulario de canal Telegram con Bot Token (enmascarado), Chat ID negativo prefijado con -100 indicando un supergrupo, y Topic ID 3 configurado para entregar a un tema específico",
|
||||
"groupCaption": "Supergrupo — el Chat ID empieza con <code>-100…</code> y el <em>Topic ID</em> opcional apunta a un hilo específico.",
|
||||
"step3Title": "3 · Guarda y prueba",
|
||||
"step3Body": "Pega el Bot Token y el Chat ID en la pestaña Telegram, guarda y pulsa <em>Send Test</em> al final del panel. Un mensaje de prueba debería llegar en un segundo; si no llega, la sección History registra el fallo con el motivo exacto (token inválido, bot no en el grupo, bloqueado por el usuario, etc.)."
|
||||
},
|
||||
"discord": {
|
||||
"heading": "Discord",
|
||||
"intro": "Los canales de Discord aceptan mensajes entrantes a través de una <em>Webhook URL</em> ligada a un único canal. El Monitor necesita esa URL y nada más.",
|
||||
"items": [
|
||||
"En Discord, abre el servidor donde quieres que aterricen las notificaciones y ve a <em>Server Settings → Integrations → Webhooks</em>.",
|
||||
"Pulsa <em>New Webhook</em>. Dale un nombre (p. ej. <em>ProxMenux</em>) y elige el canal donde debe publicar. Un avatar es opcional.",
|
||||
"Pulsa <em>Copy Webhook URL</em> — tiene aspecto de <code>https://discord.com/api/webhooks/<id>/<token></code>.",
|
||||
"Pégalo en el campo Webhook URL de la pestaña Discord en el panel Notifications y guarda."
|
||||
],
|
||||
"imageAlt": "Formulario de canal Discord con campo Webhook URL empezando por https://discord.com/api/webhooks/",
|
||||
"imageCaption": "Discord — pega la Webhook URL de <em>Server Settings → Integrations → Webhooks</em>."
|
||||
},
|
||||
"gotify": {
|
||||
"heading": "Gotify",
|
||||
"intro": "Gotify es un servidor push autoalojado. Necesitas su URL base y un <em>Application Token</em> generado desde la UI de admin de Gotify.",
|
||||
"items": [
|
||||
"Si aún no tienes una instancia de Gotify, instala una — mira la <a>guía oficial de instalación</a>.",
|
||||
"Abre la UI web de Gotify, loguéate como admin, ve a <em>Apps</em> → <em>Create Application</em>. Dale un nombre (p. ej. <em>ProxMenux</em>). Gotify genera un token — cópialo.",
|
||||
"En la pestaña Gotify del panel Notifications, configura <em>Server URL</em> a la URL base de tu instancia (p. ej. <code>https://gotify.example.com</code>) y pega el App Token.",
|
||||
"Guarda y pulsa <em>Send Test</em>."
|
||||
],
|
||||
"imageAlt": "Formulario de canal Gotify con campo Server URL configurado a https://gotify.example.com y un campo App Token con placeholder A_valid_gotify_token",
|
||||
"imageCaption": "Gotify — URL del servidor de tu instancia autoalojada más el App Token de la UI de admin de Gotify."
|
||||
},
|
||||
"email": {
|
||||
"heading": "Email (SMTP)",
|
||||
"intro": "Email es el canal más flexible — y el que tiene más campos. Necesitas un servidor SMTP, un puerto, un modo TLS, opcionalmente un usuario y contraseña, una dirección de remitente y al menos un destinatario.",
|
||||
"imageAlt": "Formulario de canal Email con SMTP Host, Port, dropdown TLS Mode, Username, Password, From Address, To Addresses separadas por coma y campos Subject Prefix",
|
||||
"imageCaption": "Email — host / puerto / modo TLS de SMTP, usuario + contraseña opcionales, dirección de remitente, destinatarios separados por coma y un prefijo de asunto para hacer las alertas fáciles de filtrar en el lado del inbox.",
|
||||
"appNote": "Si usas una cuenta personal de Gmail o Microsoft 365, el campo password no puede ser tu contraseña normal de cuenta — ambos proveedores requieren una <strong>app password</strong> generada específicamente para clientes de terceros. Los dos flujos están abajo.",
|
||||
"gmailTitle": "App password de Gmail",
|
||||
"gmailIntro": "Las app passwords de Gmail requieren que la <strong>verificación en 2 pasos</strong> esté activa en la cuenta de Google. Si no lo está, la página <em>App passwords</em> no existirá.",
|
||||
"gmailItems": [
|
||||
"Abre <a>myaccount.google.com/security</a> y activa <em>Verificación en 2 pasos</em> si no está activada.",
|
||||
"Ve a <a>myaccount.google.com/apppasswords</a>.",
|
||||
"Escribe un nombre (p. ej. <em>ProxMenux</em>) y pulsa <em>Create</em>. Google muestra una contraseña de 16 caracteres — cópiala.",
|
||||
"Rellena la pestaña Email con: <em>Host</em> <code>smtp.gmail.com</code>, <em>Port</em> <code>587</code>, <em>TLS Mode</em> <code>STARTTLS</code>, <em>Username</em> tu dirección de Gmail, <em>Password</em> la app password de 16 caracteres."
|
||||
],
|
||||
"outlookTitle": "App password de Microsoft / Outlook",
|
||||
"outlookIntro": "Microsoft ahora requiere <strong>verificación en dos pasos</strong> en la cuenta personal antes de que se pueda crear una app password. Los tenants empresariales donde el admin ha deshabilitado SMTP basic auth necesitan un camino distinto (OAuth2) que el Monitor no soporta actualmente — apunta esos a un relay SMTP que controles en su lugar.",
|
||||
"outlookItems": [
|
||||
"Abre <a>account.microsoft.com/security</a> y activa la verificación en dos pasos.",
|
||||
"Abre <em>Advanced security options</em>, baja a <em>App passwords</em> y pulsa <em>Create a new app password</em>.",
|
||||
"Microsoft muestra una contraseña aleatoria larga — cópiala.",
|
||||
"Rellena la pestaña Email con: <em>Host</em> <code>smtp-mail.outlook.com</code>, <em>Port</em> <code>587</code>, <em>TLS Mode</em> <code>STARTTLS</code>, <em>Username</em> tu dirección de Outlook / Microsoft 365, <em>Password</em> la app password generada."
|
||||
],
|
||||
"relayTitle": "Relay SMTP autoalojado",
|
||||
"relayBody": "Si corres tu propio relay SMTP (Postfix, msmtp, etc.) en la LAN, apunta el Monitor a él y saltea el baile de app-password por completo. El relay maneja la auth upstream y el Monitor envía en cleartext sobre una red de confianza."
|
||||
},
|
||||
"apprise": {
|
||||
"heading": "Apprise (hub genérico para ~80 servicios)",
|
||||
"intro": "Apprise es una librería de notificaciones de código abierto que habla el protocolo de unos 80 servicios distintos a través de un único formato de URL. Añadirlo como un canal más dentro del Monitor significa que puedes entregar alertas a servicios que no tienen una pestaña dedicada — ntfy, Matrix, Pushover, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API y muchos otros — sin que ProxMenux tenga que implementar cada integración por separado.",
|
||||
"listIntro": "La lista completa de servicios soportados y el formato exacto de URL para cada uno vive en la wiki oficial de Apprise:",
|
||||
"listItems": [
|
||||
"<a>github.com/caronc/apprise/wiki</a> — índice completo de servicios soportados.",
|
||||
"<a>URL basics</a> — cómo se estructuran las URLs de Apprise."
|
||||
],
|
||||
"stepsTitle": "Pasos",
|
||||
"steps": [
|
||||
"Elige el servicio destino en la <a>wiki de Apprise</a> y copia la plantilla de URL para él. Cada página de servicio muestra el esquema exacto a usar (<code>ntfy://</code>, <code>matrix://</code>, <code>pover://</code>, <code>slack://</code>…) más cualquier token, canal u hostname requerido.",
|
||||
"Rellena los placeholders con tus propias credenciales. Por ejemplo, un topic de ntfy.sh tiene aspecto de <code>ntfy://ntfy.sh/mi-topic</code>; una URL de Pushover tiene aspecto de <code>pover://user@token</code>; una URL de Matrix tiene aspecto de <code>matrix://user:pass@host:port/#room</code>.",
|
||||
"Pega la URL final en el campo <em>Apprise URL</em> en la pestaña Apprise del panel Notifications y guarda.",
|
||||
"Pulsa <em>Send Test</em> para verificar que la URL es alcanzable y las credenciales se aceptan."
|
||||
],
|
||||
"deliveredTitle": "Qué se entrega",
|
||||
"deliveredBody": "Apprise recibe el mismo payload que los otros canales — título, cuerpo y una severidad (info / success / warning / failure). La severidad se mapea a lo que el servicio destino exponga (icono, prioridad, color). El formato de mensajes ricos y la capa de reescritura con IA corren todos antes de que se invoque la URL, exactamente como para Telegram o Email.",
|
||||
"fanoutTitle": "Una URL por canal Apprise",
|
||||
"fanoutBody": "El Monitor expone un único slot de URL por canal Apprise. Si necesitas hacer fan-out a varios servicios Apprise a la vez (p. ej. ntfy.sh más una sala de Matrix), el enfoque más limpio es alojar un pequeño <a>servidor Apprise API</a> con una config etiquetada y apuntar el Monitor a su endpoint — el servidor luego difunde a cada URL detrás de esa etiqueta."
|
||||
},
|
||||
"rich": {
|
||||
"heading": "Mensajes ricos, categorías y filtrado por canal",
|
||||
"intro": "Bajo el formulario del canal cada canal expone los mismos tres controles: un toggle <em>Rich messages</em> arriba (destacado con la flecha en la captura), once <em>Notification Categories</em> colapsables con toggles por evento y un botón <em>Send Test</em> abajo.",
|
||||
"imageAlt": "Panel Notification Categories con toggle maestro Rich messages destacado arriba, secciones colapsables para VM/CT, Backups, Resources, Storage, Network, Security, Cluster, Services, Health Monitor, Updates cada una con toggle y contador de eventos, y un botón Send Test",
|
||||
"imageCaption": "Flecha de arriba — el toggle <em>Rich messages</em> por canal. Abajo — las once categorías colapsables con toggles por evento. <em>Send Test</em> está al final del canal.",
|
||||
"richTitle": "Mensajes ricos",
|
||||
"richIntro": "Con <em>Rich messages</em> activado, la cabecera de cada evento se prefija con un emoji de categoría y el cuerpo se renderiza usando el formato nativo del canal (HTML de Telegram, embed de Discord con color de severidad). Con él desactivado, el Monitor envía una versión de texto plano con la misma información menos las pistas visuales. Mismo contenido, distinta presentación:",
|
||||
"plainHeader": "Plano — Rich messages off",
|
||||
"richHeader": "Rico — Rich messages on",
|
||||
"richOutro": "El toggle es por canal: deja Email plano para legibilidad de reglas de inbox dejando que Telegram y Discord rendericen la versión rica. Los canales que no soportan formato inline (email texto plano, Gotify) ignoran el formato y caen a texto de todas formas.",
|
||||
"togglesTitle": "Categorías por evento",
|
||||
"togglesIntro": "Unos setenta tipos de evento están agrupados en once categorías de UI. Cada evento tiene un toggle maestro y un override por canal — dos capas que deciden si un evento dado llega a un canal dado:",
|
||||
"togglesItems": [
|
||||
"<strong>Toggle maestro por evento.</strong> Si <code>vm_start</code> está off en todas partes, ningún canal ve nunca un <code>vm_start</code>. Los toggles persisten como <code>event_toggles[event_type] = true | false</code>.",
|
||||
"<strong>Overrides por canal.</strong> Un tipo de evento también se puede silenciar para un canal específico (<em>\"enviar <code>backup_complete</code> a Discord pero no a Telegram\"</em>). Estos viven en <code>channel_overrides[channel_name][event_type]</code> y solo aplican si el evento pasó el toggle maestro."
|
||||
],
|
||||
"togglesOutro": "Cada cabecera de categoría en la captura también muestra el conteo de eventos <em>actualmente activados</em> / <em>total</em> para ese grupo, y un toggle a nivel de categoría que pone cada evento dentro a on o off en un clic — el atajo para silenciar un grupo entero (p. ej. todos los backups <code>info</code>, todos los eventos relacionados con actualizaciones) sin expandir la sección."
|
||||
},
|
||||
"quiet": {
|
||||
"heading": "Quiet Hours",
|
||||
"intro": "Quiet Hours es una ventana temporal por canal durante la cual el dispatcher solo deja pasar eventos <strong>CRITICAL</strong>. Todo lo demás — INFO, WARNING, eventos de acción — se retiene, se persiste a disco y se entrega como un único resumen agrupado en el momento en que la ventana cierra. El canal sigue recibiendo las cosas urgentes en tiempo real; el ruido espera hasta que probablemente lo quieras.",
|
||||
"imageAlt": "Ajustes de canal mostrando ambos knobs lado a lado: tarjeta Quiet Hours con toggle activado, Start 22:00 y End 07:00 más una preview en vivo de la siguiente transición, y justo debajo la tarjeta Daily digest con su propio toggle, un selector de hora de entrega configurado a 09:00 y la nota de que CRITICAL y WARNING nunca se retrasan",
|
||||
"imageCaption": "Ambos knobs viven lado a lado dentro de la tarjeta de ajustes de cada canal — Quiet Hours arriba, Daily digest debajo. Independientes por canal.",
|
||||
"purposeTitle": "Para qué sirve",
|
||||
"purposeItems": [
|
||||
"<strong>No me despiertes a las 03:00 por un aviso de actualización.</strong> Backups, actualizaciones de apps, optimizaciones post-instalación y otros eventos de nivel INFO dejan de avisar a tu móvil por la noche.",
|
||||
"<strong>Pero aun así despiértame por un fuego.</strong> Fallos de disco, OOM kills, shutdowns del host, bans de fail2ban — cualquier cosa clasificada como CRITICAL — saltea la ventana y llega inmediatamente.",
|
||||
"<strong>Tampoco pierdas nada.</strong> Los eventos suprimidos durante la ventana no se descartan silenciosamente — se sientan en un buffer SQLite hasta que vuelves al reloj."
|
||||
],
|
||||
"howTitle": "Cómo funciona",
|
||||
"howItems": [
|
||||
"<strong>Toggle por canal.</strong> Cada canal tiene su propia configuración de Quiet Hours — Telegram puede estar silencioso 22:00-07:00 mientras email sigue recibiendo todo 24/7.",
|
||||
"<strong>Hora de inicio y fin</strong> en tu zona horaria local, intervalo semi-abierto (inicio inclusivo, fin exclusivo). La ventana puede cruzar medianoche (p. ej. 22:00-07:00 significa esta noche hasta mañana por la mañana).",
|
||||
"<strong>Línea de preview en vivo</strong> justo debajo de los inputs muestra si la ventana está actualmente activa y cuándo ocurre la siguiente transición. Ahorra abrir un reloj.",
|
||||
"<strong>Durante la ventana:</strong> los eventos CRITICAL siguen disparando por la pipeline de despacho normal. Los eventos INFO y WARNING se enrutan a un buffer persistente (tabla <code>quiet_pending</code> en la DB SQLite del Monitor).",
|
||||
"<strong>Cuando la ventana cierra:</strong> se envía una única notificación agrupada con todo lo que se acumuló — una línea por evento bufferizado, en orden cronológico. El buffer se limpia solo después de que el canal confirme la entrega, para que un fallo transitorio de Telegram / SMTP no pierda el contexto de la noche.",
|
||||
"<strong>A través de reinicios.</strong> Si el Monitor reinicia a mitad de ventana, el buffer está intacto en disco. Si el reinicio ocurre justo después de que la ventana cierre, el siguiente ciclo de despacho detecta las filas pendientes y las descarga con un único resumen \"recovery\" — no se pierden notificaciones por un deploy o un reboot."
|
||||
],
|
||||
"criticalTitle": "Qué cuenta como CRITICAL",
|
||||
"criticalBody": "La severidad se fija en la creación del evento, no en el momento del despacho. Los fallos de disco, OOM kills, split-brain de cluster, shutdowns del host y el nivel \"duro\" de errores I/O de disco se envían como CRITICAL por diseño. Todo lo demás (backups OK, actualizaciones disponibles, logs INFO, hits de rate-limit) cae por defecto a INFO o WARNING y por tanto es silenciable. Puedes verificar la severidad por defecto de un evento dado en el <link>Catálogo de eventos</link> más abajo en esta página."
|
||||
},
|
||||
"digest": {
|
||||
"heading": "Resumen diario de eventos INFO",
|
||||
"intro1": "El Daily Digest es el knob opuesto: un ajuste <strong>opt-in</strong> que dice \"no me envíes cada backup exitoso o aviso de actualización según ocurre — recoléctalos y envíame un resumen al día a las 09:00 (o la hora que elija)\". Mismo objetivo que Quiet Hours (menos ruido) pero un mecanismo distinto (resumen basado en tiempo en vez de una ventana diaria).",
|
||||
"intro2": "Vive en la misma tarjeta de ajustes de canal que Quiet Hours (mira la figura bajo <link>Quiet Hours</link>), justo debajo. Cada uno se activa independientemente.",
|
||||
"purposeTitle": "Para qué sirve",
|
||||
"purposeItems": [
|
||||
"<strong>El recap matutino de \"todo lo que pasó\".</strong> Si chequeas el host una vez al día con un café, un digest a las 09:00 lleva la misma información que 20 pings individuales a lo largo del día anterior, sin que leas 20 burbujas de Telegram.",
|
||||
"<strong>Separa ruido de señal.</strong> Los eventos INFO responden a \"qué pasó\"; CRITICAL y WARNING responden a \"qué necesito hacer ahora mismo\". El digest maneja el primero; todo lo demás mantiene su entrega en vivo."
|
||||
],
|
||||
"howTitle": "Cómo funciona",
|
||||
"howItems": [
|
||||
"<strong>Opt-in por canal.</strong> Off por defecto — Telegram no batcheaiza silenciosamente tus alertas. Lo activas en los canales donde quieres un digest, dejando otros en entrega en vivo.",
|
||||
"<strong>Hora de entrega</strong> en tu zona horaria local. Por defecto 09:00 pero puedes elegir cualquier hora; el dispatcher dispara el digest dentro de ~60 s de ese minuto.",
|
||||
"<strong>Qué entra en el digest:</strong> cualquier evento que el canal habría recibido en vivo cuya severidad es <strong>INFO</strong>. Ejemplos — <em>vzdump complete</em>, <em>Tailscale update available</em>, <em>ProxMenux optimisation update available</em>, <em>APT security updates pending</em>, <em>rate-limit hit</em>.",
|
||||
"<strong>Qué nunca se retrasa:</strong>",
|
||||
"<strong>Persistencia.</strong> Los eventos pendientes se sientan en una tabla SQLite (<code>digest_pending</code>) hasta la hora configurada. El Monitor puede reiniciar libremente sin perder lo que el digest eventualmente contendrá.",
|
||||
"<strong>Los días vacíos son silenciosos.</strong> Si nada de nivel INFO pasó, no se envía digest — el canal se mantiene quieto en vez de recibir un mensaje \"no hay eventos para reportar\"."
|
||||
],
|
||||
"neverDelayedSub": [
|
||||
"Los eventos <strong>CRITICAL</strong> siempre pasan inmediatamente.",
|
||||
"Los eventos <strong>WARNING</strong> siempre pasan inmediatamente.",
|
||||
"Eventos de acción en vivo (VM/CT start / stop / shutdown / restart, vm_fail / ct_fail, backup start / fail, replication start / fail, host shutdown / reboot) saltean el digest incluso con severidad INFO — has hecho opt-in a verlos en vivo, el digest derrotaría ese opt-in."
|
||||
],
|
||||
"comboTitle": "Combinar Quiet Hours y Daily Digest",
|
||||
"comboBody": "Los dos funcionan juntos. Un canal puede tener <em>ambos</em> activos — Quiet Hours de 22:00 a 07:00 más un Daily Digest a las 09:00. Los eventos INFO durante la ventana quiet van al buffer quiet y llegan a las 07:00 como el resumen de cierre de ventana; los eventos INFO durante el día van al buffer digest y llegan a las 09:00 a la mañana siguiente. CRITICAL y WARNING siempre atraviesan ambos. Elige Quiet Hours cuando el objetivo es una <em>ventana de silencio</em>, el Daily Digest cuando el objetivo es un <em>resumen a hora fija</em>; muchos setups quieren ambos."
|
||||
},
|
||||
"displayName": {
|
||||
"heading": "Display Name",
|
||||
"intro": "Cada notificación lleva un <em>Display Name</em> — la etiqueta que identifica qué host produjo la alerta. Es el valor que ves al final del ejemplo de mensajes ricos arriba (<code>🏠 home-lab</code>) y dentro del prefijo de asunto del email.",
|
||||
"imageAlt": "Campo Display Name con el valor amd mostrado como ejemplo, etiqueta Name shown in notifications - edit to customize or leave empty to use the system hostname",
|
||||
"imageCaption": "El campo Display Name — déjalo vacío para usar el hostname del sistema, o sobreescríbelo con lo que quieras.",
|
||||
"outro": "Si el campo está vacío, el Monitor cae al hostname del sistema. El override es sobre todo útil cuando corres varios hosts ProxMenux que envían al mismo chat de Telegram o buzón — una etiqueta más amigable (<em>home-lab</em>, <em>office-pve</em>) es más fácil de leer que <code>pve01.lan</code> o <code>pmx-prod-01</code>."
|
||||
},
|
||||
"dispatch": {
|
||||
"heading": "Pipeline de despacho",
|
||||
"intro": "Entre que un evento se levanta y un mensaje sale del host, corren tres etapas en este orden:",
|
||||
"headerStage": "Etapa",
|
||||
"headerWhat": "Qué hace",
|
||||
"headerTunable": "¿Ajustable?",
|
||||
"rows": [
|
||||
{
|
||||
"stage": "1. Deduplicación por huella",
|
||||
"what": "Cada evento genera una huella (<code>event_type + campos clave de data</code>). Las huellas idénticas dentro de una ventana corta se consideran duplicados del primero.",
|
||||
"tunable": "No — lógica interna del dispatcher."
|
||||
},
|
||||
{
|
||||
"stage": "2. Cooldown",
|
||||
"what": "Cuando una huella ya se ha enviado, esa misma huella se silencia durante el cooldown propio de cada severidad. El estado se guarda en la tabla SQLite <code>notification_last_sent</code> para que sobreviva a reinicios. Valores por defecto: <code>CRITICAL</code> 60 s, <code>WARNING</code> 300 s, <code>INFO</code> 900 s, con posibilidad de override por categoría (por ejemplo <code>resources</code> 900 s, <code>updates</code> 86 400 s).",
|
||||
"tunable": "No — valores por defecto integrados en el dispatcher."
|
||||
},
|
||||
{
|
||||
"stage": "3. Agregación de ráfagas",
|
||||
"what": "Cuando llegan N eventos del mismo tipo dentro de una ventana corta (por ejemplo un aluvión de intentos de fuerza bruta SSH), se agrupan en un único mensaje <code>burst_*</code> con un contador y una muestra.",
|
||||
"tunable": "No — ventana y umbral están fijados por tipo de evento."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "El despacho ocurre en un hilo de fondo",
|
||||
"calloutBody": "El bucle de despacho corre en su propio hilo. La petición HTTP que emite un evento devuelve en cuanto el evento se encola — no espera al RTT de Telegram, SMTP o el webhook. Cada resultado de envío se registra en la tabla de historial para revisarlo después."
|
||||
},
|
||||
"aiRewrite": {
|
||||
"heading": "Reescritura con IA opcional",
|
||||
"body1": "Cualquier evento se puede pasar por un LLM que reescribe su cuerpo en lenguaje natural y (opcionalmente) en el idioma del usuario destino antes del fan-out. El reescritor de IA está off por defecto. Cuando se activa corre en el hilo de despacho; si la llamada al proveedor falla o caduca, se usa el cuerpo templated original en su lugar.",
|
||||
"body2": "Se soportan seis proveedores (OpenAI, Anthropic, Google Gemini, Groq, OpenRouter y Ollama local), con nivel de detalle por canal (<code>brief</code>, <code>standard</code>, <code>detailed</code>), idioma de salida, modo de prompt (<code>default</code> o <code>custom</code>) y un prompt personalizado opcional. El walkthrough de configuración completo, capturas y ejemplos de prompt viven en la página dedicada <link>Asistente de IA</link>.",
|
||||
"privacyTitle": "Nota de privacidad",
|
||||
"privacyBody": "La reescritura con IA envía el cuerpo del evento — que puede incluir hostnames, direcciones IP, usernames, mensajes de error y líneas de journal — al proveedor configurado. Ollama mantiene todo en el host; los otros cinco proveedores transmiten datos a sus respectivos endpoints. Desactiva el reescritor, o usa Ollama, si el host corre en un entorno donde el contenido de los eventos no puede salir de la red."
|
||||
},
|
||||
"pveWebhook": {
|
||||
"heading": "Integración del webhook de PVE",
|
||||
"intro1": "Proxmox VE 8.1+ tiene su propio sistema de notificaciones con <em>endpoints</em> integrados (sendmail, gotify, SMTP, webhook). Cuando activas Notifications en el Monitor, se registra como uno de esos endpoints — un destino <code>webhook</code> que apunta de vuelta a la propia API del Monitor. Desde ese momento, todo lo que Proxmox mismo emite (fencing HA, replicación, vzdump desde la GUI, renovación de certificado, etc.) fluye por la misma pipeline de despacho que los eventos propios del Monitor.",
|
||||
"intro2": "El destino es visible desde la GUI de Proxmox en <em>Datacenter → Notifications → Notification Targets</em>:",
|
||||
"imageAlt": "Diálogo Proxmox VE Edit Webhook mostrando el destino proxmenux-webhook autocreado con método POST, URL http://127.0.0.1:8008/api/notifications/webhook y una plantilla JSON usando escape title, escape message, escape severity, escape timestamp y campos json",
|
||||
"imageCaption": "El destino webhook del lado PVE como Proxmox lo ve (la GUI está en el locale configurado del host — español en este ejemplo). Los mismos campos aplican en cualquier idioma.",
|
||||
"registeredIntro": "Qué se registra:",
|
||||
"registeredItems": [
|
||||
"<strong>Método y URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code>. Solo loopback — PVE habla con el proceso del Monitor corriendo en el mismo host.",
|
||||
"<strong>Plantilla de body.</strong> Un body JSON usando los helpers Handlebars nativos de PVE — guardado base64-encoded en el archivo de config por PVE, pero se expande a:",
|
||||
"<strong>Matcher.</strong> Un bloque compañero <code>matcher: proxmenux-matcher</code> con <code>mode all</code> para que cada notificación de PVE llegue al destino.",
|
||||
"<strong>Bloque priv compañero.</strong> Una entrada vacía <code>webhook: proxmenux-webhook</code> se añade a <code>/etc/pve/priv/notifications.cfg</code>. PVE se niega a instanciar cualquier endpoint webhook sin un bloque privado coincidente, incluso cuando no se necesitan secrets — así que el Monitor escribe un stub solo de cabecera ahí. No se configuran tokens, cabeceras ni HMAC en el lado PVE."
|
||||
],
|
||||
"securityTitle": "Cómo se asegura el receptor",
|
||||
"securityIntro": "El receptor webhook en <code>POST /api/notifications/webhook</code> aplica distintas capas de seguridad según de dónde venga la petición:",
|
||||
"securityItems": [
|
||||
"<strong>Loopback (<code>127.0.0.1</code> / <code>::1</code>).</strong> Solo rate-limit. El endpoint confía en la interfaz loopback — solo procesos corriendo en el host pueden alcanzarlo, y PVE mismo no puede enviar cabeceras de auth personalizadas en el body que genera. Este es el camino que viaja cada notificación emitida por PVE.",
|
||||
"<strong>Llamadores remotos.</strong> Cinco capas se apilan encima del rate-limiting: un shared secret en la cabecera <code>X-Webhook-Secret</code>, un timestamp de frescura en <code>X-ProxMenux-Timestamp</code> (rechazado si se desvía más allá de la ventana configurada), una búsqueda de caché de replay y una allowlist de IP opcional. El shared secret vive en la tabla de ajustes SQLite del Monitor — no en <code>/etc/pve/priv/notifications.cfg</code> — y se genera en el primer setup. Este camino existe para integraciones personalizadas que hacen POST desde fuera del host; el destino configurado por PVE nunca lo ejercita."
|
||||
],
|
||||
"practiceTitle": "En la práctica",
|
||||
"practiceBody": "El setup de PVE escribe el destino como <code>http://127.0.0.1:8008</code>, así que las notificaciones emitidas por PVE siempre pasan por el camino loopback con seguridad solo rate-limit. El camino de llamador remoto con shared secret es opt-in para integraciones personalizadas — apunta un servicio externo a <code>https://<host-monitor>:<port>/api/notifications/webhook</code> y suministra la cabecera <code>X-Webhook-Secret</code> para usarlo.",
|
||||
"actionsIntro": "El Monitor gestiona este destino a través de tres acciones en la pestaña Settings:",
|
||||
"actionsItems": [
|
||||
"<strong>Setup</strong> — corre automáticamente cuando activas Notifications. Crea la entrada en <code>/etc/pve/notifications.cfg</code> tras hacer backup del archivo actual.",
|
||||
"<strong>Cleanup</strong> — elimina la entrada. El backup previo del archivo se conserva.",
|
||||
"<strong>Read config</strong> — muestra los destinos y matchers actuales como PVE los ve. Así es como confirmas que la entrada del Monitor es la que dispara cuando PVE tiene múltiples rutas de notificación configuradas."
|
||||
],
|
||||
"clusterTitle": "Nodos de cluster",
|
||||
"clusterBody": "<code>/etc/pve/</code> se replica entre miembros del cluster, así que el destino webhook es visible en cada nodo. Cada nodo, sin embargo, hace POST a su <em>propio</em> <code>127.0.0.1:8008</code> — lo que significa que el Monitor corriendo en ese nodo recibe los eventos que PVE generó localmente. Ejecuta el Monitor en cada nodo que quieras ver en el historial de Notifications."
|
||||
},
|
||||
"catalogue": {
|
||||
"heading": "Catálogo de eventos",
|
||||
"intro": "Unos setenta tipos de evento están agrupados en once categorías de UI. El panel Notifications renderiza una sección colapsable por grupo con un toggle por cada evento dentro. Cada evento está on por defecto salvo que se marque explícitamente lo contrario.",
|
||||
"headerGroup": "Grupo",
|
||||
"headerEvents": "Eventos",
|
||||
"rows": [
|
||||
{
|
||||
"group": "VM / CT",
|
||||
"events": "<code>vm_start</code>, <code>vm_start_warning</code>, <code>vm_stop</code>, <code>vm_shutdown</code>, <code>vm_fail</code>, <code>vm_restart</code>, más los equivalentes <code>ct_*</code>, <code>migration_start</code>, <code>migration_complete</code>, <code>migration_warning</code>, <code>migration_fail</code>, <code>replication_complete</code>, <code>replication_fail</code>."
|
||||
},
|
||||
{
|
||||
"group": "Backups",
|
||||
"events": "<code>backup_start</code>, <code>backup_complete</code>, <code>backup_warning</code>, <code>backup_fail</code>, <code>snapshot_complete</code>, <code>snapshot_fail</code>."
|
||||
},
|
||||
{
|
||||
"group": "Recursos",
|
||||
"events": "<code>cpu_high</code>, <code>ram_high</code>, <code>temp_high</code>, <code>load_high</code>."
|
||||
},
|
||||
{
|
||||
"group": "Almacenamiento",
|
||||
"events": "<code>disk_space_low</code>, <code>disk_io_error</code>, <code>storage_unavailable</code>, <code>smart_test_complete</code>, <code>smart_test_failed</code>."
|
||||
},
|
||||
{
|
||||
"group": "Red",
|
||||
"events": "<code>network_down</code>, <code>network_latency</code>."
|
||||
},
|
||||
{
|
||||
"group": "Seguridad",
|
||||
"events": "<code>auth_fail</code>, <code>ip_block</code>, <code>firewall_issue</code>, <code>user_permission_change</code>."
|
||||
},
|
||||
{
|
||||
"group": "Cluster",
|
||||
"events": "<code>split_brain</code>, <code>node_disconnect</code>, <code>node_reconnect</code>."
|
||||
},
|
||||
{
|
||||
"group": "Servicios",
|
||||
"events": "<code>system_startup</code>, <code>system_shutdown</code>, <code>system_reboot</code>, <code>system_problem</code>, <code>service_fail</code>, <code>oom_kill</code>, <code>system_mail</code>."
|
||||
},
|
||||
{
|
||||
"group": "Monitor de salud",
|
||||
"events": "<code>new_error</code>, <code>error_resolved</code>, <code>error_escalated</code>, <code>health_degraded</code>, <code>health_persistent</code>, <code>health_issue_new</code>, <code>health_issue_resolved</code>."
|
||||
},
|
||||
{
|
||||
"group": "Actualizaciones",
|
||||
"events": "<code>update_summary</code>, <code>update_available</code>, <code>pve_update</code>, <code>update_complete</code>, <code>proxmenux_update</code>."
|
||||
},
|
||||
{
|
||||
"group": "Hardware / GPU",
|
||||
"events": "<code>gpu_mode_switch</code>, <code>gpu_passthrough_blocked</code>, <code>pci_passthrough_conflict</code>, <code>ai_model_migrated</code>."
|
||||
}
|
||||
],
|
||||
"burstNote": "Un puñado de tipos de agregación <code>burst_*</code> (<code>burst_auth_fail</code>, <code>burst_ip_block</code>, <code>burst_disk_io</code>, etc.) existen solo en el dispatcher — reemplazan ráfagas de eventos individuales con un único mensaje de resumen y no se exponen como toggles en la UI. Heredan el estado on/off de su tipo de evento padre."
|
||||
},
|
||||
"history": {
|
||||
"heading": "Historial",
|
||||
"body1": "Cada <em>intento</em> de despacho que el dispatcher realmente ejecuta se registra en la tabla SQLite <code>notification_history</code>. Cada fila guarda el timestamp (<code>sent_at</code>), canal, tipo de evento, severidad, título, cuerpo de mensaje renderizado, un flag <code>success</code> y — cuando el envío falló — el error devuelto por el proveedor en <code>error_message</code>. Los eventos agregados en ráfaga aparecen como una única fila con el tipo de evento <code>burst_*</code>. Los eventos suprimidos por la etapa de cooldown no se loguean: nunca se convierten en un intento de despacho.",
|
||||
"body2": "La pestaña History dentro de Settings → Notifications muestra las últimas 20 entradas y tiene un único botón <em>Clear</em> que borra la tabla.",
|
||||
"body3": "Los mismos datos se exponen en <code>GET /api/notifications/history</code> con parámetros opcionales <code>limit</code>, <code>offset</code>, <code>severity</code> y <code>channel</code>, y se pueden borrar con <code>DELETE /api/notifications/history</code>."
|
||||
},
|
||||
"api": {
|
||||
"heading": "Endpoints de API",
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerMethod": "Método",
|
||||
"headerUse": "Uso",
|
||||
"rows": [
|
||||
{
|
||||
"endpoint": "/api/notifications/settings",
|
||||
"method": "GET / POST",
|
||||
"use": "Lee o escribe la configuración completa (canales, toggles por evento, reescritor de IA, Display Name)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/test",
|
||||
"method": "POST",
|
||||
"use": "Envía una notificación de prueba a un canal: <code>'{'\"channel\":\"telegram\"'}'</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/test-ai",
|
||||
"method": "POST",
|
||||
"use": "Renderiza y reescribe un evento de muestra sin despacharlo."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/provider-models",
|
||||
"method": "POST",
|
||||
"use": "Lista modelos disponibles para el proveedor de IA seleccionado."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/send",
|
||||
"method": "POST",
|
||||
"use": "Emite un evento desde fuera (integraciones personalizadas)."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/history",
|
||||
"method": "GET / DELETE",
|
||||
"use": "Lee el historial con filtros; bórralo."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/webhook",
|
||||
"method": "POST",
|
||||
"use": "Recibe las notificaciones propias de Proxmox VE. Los llamadores loopback están solo rate-limited; los llamadores remotos deben pasar adicionalmente la cabecera <code>X-Webhook-Secret</code>, comprobación de frescura <code>X-ProxMenux-Timestamp</code>, caché de replay y allowlist de IP opcional."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/setup-webhook",
|
||||
"method": "POST",
|
||||
"use": "Registra el Monitor como destino en <code>/etc/pve/notifications.cfg</code>."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
|
||||
"method": "POST",
|
||||
"use": "Elimina el destino del Monitor de la config de notificaciones de PVE."
|
||||
},
|
||||
{
|
||||
"endpoint": "/api/notifications/proxmox/read-cfg",
|
||||
"method": "GET",
|
||||
"use": "Muestra la config actual de notificaciones de PVE como PVE la ve."
|
||||
}
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Asistente de IA",
|
||||
"href": "/docs/monitor/ai-assistant",
|
||||
"tail": " — proveedores, modelos, modos de prompt, idiomas, niveles de detalle por canal."
|
||||
},
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
"href": "/docs/monitor/health-monitor",
|
||||
"tail": " — el mayor productor individual de eventos, con sus propias duraciones de supresión por categoría."
|
||||
},
|
||||
{
|
||||
"label": "Arquitectura",
|
||||
"href": "/docs/monitor/architecture",
|
||||
"tailRich": " — dónde encajan las tablas SQLite (<code>notification_last_sent</code>, <code>notification_history</code>) y el hilo de despacho en el proceso más amplio del Monitor."
|
||||
},
|
||||
{
|
||||
"label": "Access & Authentication",
|
||||
"href": "/docs/monitor/access-auth",
|
||||
"tailRich": " — cómo se emiten API tokens para scripts que llaman a <code>/api/notifications/send</code>."
|
||||
},
|
||||
{
|
||||
"label": "Dashboard → Logs del sistema",
|
||||
"href": "/docs/monitor/dashboard/system-logs",
|
||||
"tail": " — la vista en vivo del mismo journal que alimenta el journal watcher."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Backup y reinicio de interfaces | ProxMenux Documentation",
|
||||
"description": "Snapshot manual, navegación y restauración de backups de /etc/network/interfaces almacenados en /var/backups/proxmenux/. Incluye un reinicio del servicio de red con confirmación y una vista rápida de la configuración en vivo.",
|
||||
"ogTitle": "Backup y reinicio de interfaces | ProxMenux Documentation",
|
||||
"ogDescription": "Snapshot y restauración de la configuración de red de Proxmox; reinicia el servicio de red con confirmación."
|
||||
},
|
||||
"header": {
|
||||
"title": "Backup y reinicio de interfaces",
|
||||
"description": "Cuatro utilidades que giran en torno a /etc/network/interfaces: hacer un snapshot manual, ver la config en vivo, restaurar un backup previo con previsualización opcional y reiniciar el servicio de red con consentimiento explícito. Mismo directorio de backups que usan los flujos de reparación guiada.",
|
||||
"section": "Red"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Gestiona el mismo directorio de backups que usan los flujos de reparación guiada (<code>/var/backups/proxmenux/</code>). Te permite hacer un snapshot extra antes de cualquier cambio manual, navegar todos los backups existentes y hacer rollback a cualquiera de ellos — siempre con un nuevo backup previo a la restauración tomado automáticamente como segunda red de seguridad."
|
||||
},
|
||||
"shared": {
|
||||
"heading": "El directorio de backups compartido",
|
||||
"intro": "Cada backup tomado en cualquier sitio del menú Red aterriza en el mismo lugar:",
|
||||
"outro": "Los nombres llevan timestamp, se ordenan por fecha y nunca se sobrescriben. El directorio se crea la primera vez que se usa."
|
||||
},
|
||||
"show": {
|
||||
"heading": "Mostrar el fichero de config de red",
|
||||
"body": "Imprime <code>/etc/network/interfaces</code> tal cual en el terminal. Solo lectura. Útil como comprobación antes de hacer un backup o después de una restauración — no hay una herramienta separada de \"diff con el backup anterior\", así que mirar el fichero en vivo es la forma más fácil de confirmar lo que tienes."
|
||||
},
|
||||
"create": {
|
||||
"heading": "Crear backup de red",
|
||||
"body": "Copia el <code>/etc/network/interfaces</code> actual al directorio de backups con un timestamp nuevo. Ya está — sin análisis, sin prompts, solo un snapshot.",
|
||||
"whenTitle": "Cuándo hacer un backup manual",
|
||||
"whenBody": "Antes de editar <code>/etc/network/interfaces</code> a mano, antes de instalar un paquete que pueda tocar la stack de red (p. ej. NetworkManager, Open vSwitch) o antes de cualquier cambio de hardware. Las reparaciones guiadas ya hacen snapshot automáticamente — esta opción es para los momentos <em>manuales</em>."
|
||||
},
|
||||
"restore": {
|
||||
"heading": "Restaurar backup de red",
|
||||
"intro": "Lista todos los backups en <code>/var/backups/proxmenux/</code> ordenados de más nuevo a más antiguo y guía una restauración protegida:",
|
||||
"steps": [
|
||||
{
|
||||
"title": "1. Elige un backup",
|
||||
"body": "Un menú lista cada backup por su timestamp. Si no hay backups, el flujo sale con un mensaje claro.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "2. Previsualización opcional",
|
||||
"body": "Ofrece abrir el backup seleccionado en una vista con scroll antes de confirmar. Sí por defecto — no te lo saltes en un host remoto.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "3. Backup previo a la restauración",
|
||||
"body": "Antes de sobrescribir <code>/etc/network/interfaces</code>, hace <strong>otro</strong> backup del estado actual. Restaurar un backup es en sí una acción destructiva, así que el nuevo snapshot previo te permite volver atrás si el backup elegido resulta ser el equivocado.",
|
||||
"tone": "amber"
|
||||
},
|
||||
{
|
||||
"title": "4. Aplica la restauración",
|
||||
"body": "Copia el backup elegido sobre <code>/etc/network/interfaces</code>. El cambio de fichero está en disco; el estado en vivo del kernel sigue reflejando la config anterior.",
|
||||
"tone": "amber"
|
||||
},
|
||||
{
|
||||
"title": "5. Reinicio opcional",
|
||||
"body": "Pregunta si ejecutar <code>systemctl restart networking</code> ahora. Rechaza para diferir el cambio al siguiente reinicio.",
|
||||
"tone": "emerald"
|
||||
}
|
||||
],
|
||||
"autoBackupTitle": "Una restauración hace su propio backup automáticamente",
|
||||
"autoBackupBody": "Seleccionar <em>Restaurar backup de red</em> siempre crea un snapshot fresco de la config <em>actual</em> antes de sobrescribirla. Si restauras al backup equivocado, el fichero más reciente en <code>/var/backups/proxmenux/</code> es el estado del que venías."
|
||||
},
|
||||
"restart": {
|
||||
"heading": "Reiniciar el servicio de red",
|
||||
"body": "Ejecuta <code>systemctl restart networking</code> tras una confirmación sí/no. Reporta el resultado con <code>msg_ok</code> / <code>msg_error</code>. La mayoría de flujos de este menú ofrecen su propio prompt de reinicio al final; esta opción es para reiniciar tras una edición manual o tras haber rechazado antes el reinicio dentro del flujo.",
|
||||
"warnTitle": "Desconexión breve garantizada; desconexión permanente posible",
|
||||
"warnBody": "Reiniciar <code>networking</code> baja y vuelve a aplicar cada interfaz declarada en <code>/etc/network/interfaces</code>. Las sesiones SSH alojadas en esas interfaces se caen. Si la nueva config es inválida, la red no vuelve. Ejecuta esto solo cuando:",
|
||||
"warnItems": [
|
||||
"Tienes acceso a consola / IPMI / iKVM listo, <em>o</em>",
|
||||
"Estás físicamente al lado de la máquina, <em>o</em>",
|
||||
"Acabas de hacer rollback con éxito a una config buena conocida y quieres aplicarla."
|
||||
]
|
||||
},
|
||||
"manualRollback": {
|
||||
"heading": "Rollback manual desde una consola",
|
||||
"intro": "Si no puedes llegar al menú (sin SSH, dialog que se cae, …) pero sí a una consola, el rollback son dos comandos:",
|
||||
"outro": "Es la <em>misma</em> operación que hace el menú, solo que tecleada a mano. Si <code>networking</code> sigue sin arrancar, mira <code>journalctl -u networking -b</code> para ver el error de sintaxis / driver subyacente."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noneTitle": "\"No backups found\" al restaurar",
|
||||
"noneBody": "El directorio <code>/var/backups/proxmenux/</code> no existe o no contiene ficheros <code>interfaces_backup_*</code>. Ejecuta <em>Crear backup de red</em> al menos una vez, o ejecuta cualquier reparación guiada (que crea uno automáticamente). Confirma con <code>ls /var/backups/proxmenux/</code>.",
|
||||
"unreachTitle": "El reinicio de networking funciona pero el host sigue inalcanzable",
|
||||
"unreachBody": "O la nueva config está mal, o has reiniciado a una configuración que no enlaza tu IP de gestión. Haz rollback desde la consola (ver arriba). Tras el rollback, usa el <bridgeLink>análisis de bridges</bridgeLink> y el <configLink>análisis de configuración</configLink> para entender qué estaba mal antes de volver a aplicar.",
|
||||
"emptyTitle": "La previsualización de restauración muestra un fichero vacío",
|
||||
"emptyBody": "El fichero de backup está vacío (0 bytes). Esto pasa si una copia falló silenciosamente en una ejecución anterior. Elige un backup más antiguo, o vuelve a ejecutar <em>Crear backup de red</em> ahora mismo si la config en vivo está sana."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Análisis de bridges y reparación guiada",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tail": " — la razón más habitual por la que un backup acaba aquí."
|
||||
},
|
||||
{
|
||||
"label": "Análisis de config y limpieza guiada",
|
||||
"href": "/docs/network/config-analysis",
|
||||
"tailRich": " — también escribe en <code>/var/backups/proxmenux/</code> automáticamente."
|
||||
},
|
||||
{
|
||||
"label": "Diagnóstico",
|
||||
"href": "/docs/network/diagnostics",
|
||||
"tail": " — verifica el estado en vivo tras una restauración."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Análisis de bridges y reparación guiada | ProxMenux Documentation",
|
||||
"description": "Detecta bridges vmbrX con puertos físicos ausentes o inválidos (típico tras una re-enumeración PCI), los reporta con comandos de shell propuestos y ofrece una reparación guiada de 5 pasos con backup obligatorio.",
|
||||
"ogTitle": "Análisis de bridges y reparación guiada | ProxMenux Documentation",
|
||||
"ogDescription": "Auditar y reparar los puertos de bridge de Proxmox tras cambios de hardware, con flujo guiado y rollback seguro."
|
||||
},
|
||||
"header": {
|
||||
"title": "Análisis de bridges y reparación guiada",
|
||||
"description": "Audita cada bridge vmbrX declarado en /etc/network/interfaces, verifica que sus puertos físicos existen realmente y ofrece una reparación paso a paso cuando no es así. El análisis es de solo lectura; la reparación está protegida, previsualizada y con backup.",
|
||||
"section": "Red"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Lee cada bridge en <code>/etc/network/interfaces</code>, mira su línea <code>bridge-ports</code> y comprueba si cada puerto declarado (p. ej. <code>enp3s0</code>) existe realmente en el host. Si falta un puerto, propone un sustituto y — con consentimiento explícito — aplica el cambio con un flujo <strong>backup, previsualización, aplicar, verificar</strong>."
|
||||
},
|
||||
"when": {
|
||||
"heading": "Cuándo lo necesitas",
|
||||
"intro": "Linux asigna nombres de interfaz predecibles a partir de la topología PCI y el orden de slot. Varios eventos los barajan y dejan <code>/etc/network/interfaces</code> referenciando nombres que ya no existen:",
|
||||
"items": [
|
||||
"Añadir o quitar una tarjeta PCIe (una NIC, una GPU, un HBA, un soporte NVMe).",
|
||||
"Mover una tarjeta existente a otro slot PCIe.",
|
||||
"Actualizaciones de BIOS / UEFI que re-enumeran los dispositivos PCI.",
|
||||
"Migrar el disco de arranque a otro hardware."
|
||||
],
|
||||
"outro": "Tras el siguiente arranque, el bridge intenta engancharse a un puerto que ya no existe, no levanta y el host pierde la red. <link>Nombres persistentes de interfaz</link> evita que esto vuelva a pasar — pero si ya estás bloqueado, esta página es el camino de recuperación."
|
||||
},
|
||||
"bigPicture": {
|
||||
"heading": "Vista general",
|
||||
"diagram1": {
|
||||
"arrowLabel": "paso 1",
|
||||
"nodes": {
|
||||
"sourceLabel": "/etc/network/interfaces",
|
||||
"sourceDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports enp3s0",
|
||||
"bridgeLabel": "Analizar (solo lectura)",
|
||||
"bridgeDetail": "ip link show enp3s0\n→ no existe",
|
||||
"targetLabel": "Informe + sugerencia",
|
||||
"targetDetail": "❌ enp3s0: NOT FOUND\nReemplazar por: eno1\n(aún sin cambios)"
|
||||
}
|
||||
},
|
||||
"diagram2": {
|
||||
"arrowLabel": "aplicar con backup",
|
||||
"nodes": {
|
||||
"sourceLabel": "Reparación guiada",
|
||||
"sourceDetail": "1. Backup\n2. Mostrar actual\n3. Previsualizar cambios\n4. Aplicar\n5. Verificar",
|
||||
"targetLabel": "/etc/network/interfaces (nuevo)",
|
||||
"targetDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports eno1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"step1": {
|
||||
"heading": "Paso 1: análisis (solo lectura)",
|
||||
"intro": "Seleccionar <strong>Analizar configuración de bridges</strong> aborta inmediatamente si el host no usa la stack clásica de Debian/Proxmox. Si no, recorre cada bridge y reporta:",
|
||||
"items": [
|
||||
"Nombre del bridge, estado actual (UP / DOWN), IP asignada.",
|
||||
"Cada puerto declarado y si existe actualmente (<code>ip link show <port></code>).",
|
||||
"Para cada puerto inválido: un reemplazo propuesto (la primera interfaz física disponible) más el comando <code>sed</code> exacto para aplicarlo a mano.",
|
||||
"Bridges sin <code>bridge-ports</code> en absoluto y entradas <code>auto</code> huérfanas (sin bloque <code>iface</code> correspondiente)."
|
||||
],
|
||||
"readonlyTitle": "Garantía de solo lectura",
|
||||
"readonlyBody": "Hasta este punto el script no ha ejecutado un solo comando modificador. Puedes dejar el análisis abierto, copiar los comandos <code>sed</code> sugeridos y aplicarlos a mano si lo prefieres — o aceptar el siguiente prompt para entrar en la reparación guiada."
|
||||
},
|
||||
"step2": {
|
||||
"heading": "Paso 2: reparación guiada (5 pasos)",
|
||||
"intro": "Solo se entra si aceptas el prompt al final del análisis. Cada paso muestra qué va a pasar y pide confirmación antes de continuar.",
|
||||
"steps": [
|
||||
{
|
||||
"title": "1. Backup de seguridad",
|
||||
"body": "Copia <code>/etc/network/interfaces</code> a <code>/var/backups/proxmenux/interfaces_backup_<TIMESTAMP></code>. La ruta exacta del backup se muestra antes de la copia y de nuevo después, con el comando de rollback.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "2. Revisar la configuración actual",
|
||||
"body": "Abre el <code>/etc/network/interfaces</code> en vivo en un diálogo con scroll para que veas exactamente qué se va a cambiar.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "3. Previsualizar los cambios propuestos",
|
||||
"body": "Lista exactamente qué bridges se van a tocar y qué sustituciones de puerto se van a hacer. Si el análisis decide que en realidad no hay que arreglar nada (race condition: el puerto volvió), el flujo sale limpio con <em>\"No changes needed.\"</em>",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "4. Aplicar los cambios",
|
||||
"body": "Para cada bridge afectado, ejecuta <code>sed -i \"/iface $bridge/,/bridge-ports/ s/bridge-ports.*/bridge-ports $new_ports/\"</code> contra <code>/etc/network/interfaces</code>. Si un bridge no tenía un reemplazo válido disponible, la sustitución se omite y se reporta en el paso 5.",
|
||||
"tone": "amber"
|
||||
},
|
||||
{
|
||||
"title": "5. Verificación",
|
||||
"body": "Vuelve a leer el fichero y confirma que el nuevo puerto de cada bridge existe. Imprime el comando de rollback (<code>cp <backup> /etc/network/interfaces</code>). Por último ofrece un prompt <strong>Reiniciar networking</strong> — acéptalo solo si tienes consola de fallback.",
|
||||
"tone": "emerald"
|
||||
}
|
||||
],
|
||||
"restartTitle": "Reiniciar networking ≠ un undo gratis",
|
||||
"restartBody": "La reparación se escribe en disco independientemente de si reinicias el servicio. <code>systemctl restart networking</code> aplica el cambio <em>ahora</em>, lo que puede cortar tu sesión SSH si el nuevo puerto es incorrecto. Si rechazas el reinicio, el cambio sigue surtiendo efecto en el siguiente reinicio — confirma antes la nueva config o haz rollback con el comando impreso."
|
||||
},
|
||||
"edits": {
|
||||
"heading": "Qué se edita (exactamente)",
|
||||
"body": "Solo la línea <code>bridge-ports</code> de cada bridge afectado. Las demás directivas (<code>address</code>, <code>netmask</code>, <code>gateway</code>, <code>bridge-stp</code>, …) se dejan intactas. El script nunca crea bloques <code>iface</code> nuevos y nunca elimina los existentes en este flujo — ese es el trabajo de <link>Análisis de config y limpieza</link>."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"unsupportedTitle": "El análisis aborta con \"Unsupported Network Stack\"",
|
||||
"unsupportedBody": "El host usa netplan, systemd-networkd o NetworkManager. La herramienta solo soporta <code>/etc/network/interfaces</code>. Cambia el host a la stack clásica primero, o edita la configuración con las herramientas nativas del gestor (p. ej. <code>netplan apply</code>).",
|
||||
"noSuggestTitle": "No se imprime sugerencia para un puerto inválido",
|
||||
"noSuggestBody": "El host no tiene ninguna interfaz física libre (todas están ya en otro bridge o no existen). El análisis cae a sugerir <code>bridge-ports none</code> para que el bridge al menos pueda levantar sin puerto. Añade una NIC o migra puertos entre bridges manualmente antes de volver a ejecutar.",
|
||||
"stillDownTitle": "La reparación termina pero el bridge sigue DOWN",
|
||||
"stillDownBody": "<code>sed</code> actualizó el fichero pero se rechazó <code>systemctl restart networking</code>. Ejecútalo manualmente cuando la nueva config esté verificada, o reinicia. Si se aceptó el reinicio y el bridge sigue DOWN, ejecuta <code>ip link show</code> para confirmar que el nuevo puerto existe, y luego mira <code>journalctl -u networking</code> para ver el error real (cable desenchufado, link no negociado, puerto ya miembro de otro bridge).",
|
||||
"lostSshTitle": "He perdido el acceso SSH justo después de reiniciar networking",
|
||||
"lostSshIntro": "Usa consola / IPMI / iKVM para llegar al host. Restaura el backup:",
|
||||
"lostSshOutro": "Después vuelve a ejecutar el análisis desde la consola para averiguar por qué no funcionó la sugerencia (típicamente: el puerto de reemplazo no está realmente enchufado)."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Nombres persistentes de interfaz",
|
||||
"href": "/docs/network/persistent-names",
|
||||
"tail": " — fija los nombres a direcciones MAC para que esto deje de pasar."
|
||||
},
|
||||
{
|
||||
"label": "Análisis de config y limpieza guiada",
|
||||
"href": "/docs/network/config-analysis",
|
||||
"tailRich": " — para bloques <code>iface</code> huérfanos (la otra mitad del mismo problema)."
|
||||
},
|
||||
{
|
||||
"label": "Backup y reinicio de interfaces",
|
||||
"href": "/docs/network/backup-restore",
|
||||
"tail": " — snapshots manuales y el navegador de restauración."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Análisis de config y limpieza guiada | ProxMenux Documentation",
|
||||
"description": "Detecta bloques iface en /etc/network/interfaces que referencian NICs físicas que ya no están en el host. Los reporta y ofrece una eliminación guiada de 5 pasos con backup obligatorio y previsualización por bloque.",
|
||||
"ogTitle": "Análisis de config y limpieza guiada | ProxMenux Documentation",
|
||||
"ogDescription": "Encuentra y elimina bloques de interfaz huérfanos dejados por cambios de hardware, con previsualización completa y rollback."
|
||||
},
|
||||
"header": {
|
||||
"title": "Análisis de config y limpieza guiada",
|
||||
"description": "Recorre cada bloque iface en /etc/network/interfaces y verifica que la NIC física subyacente sigue existiendo. Reporta los bloques huérfanos dejados por cambios de hardware y ofrece una eliminación guiada con backup, previsualización y confirmación por bloque.",
|
||||
"section": "Red"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Identifica declaraciones <code>iface</code> cuya NIC asociada ya no está en el host (típico tras reemplazar o quitar una tarjeta de red). Luego ofrece una limpieza guiada que elimina <em>solo</em> los bloques huérfanos, con un backup, una previsualización por sección y una confirmación final explícita."
|
||||
},
|
||||
"differs": {
|
||||
"heading": "En qué se diferencia del análisis de bridges",
|
||||
"headerAspect": "Aspecto",
|
||||
"headerBridge": "Análisis de bridges",
|
||||
"headerConfig": "Análisis de config",
|
||||
"rows": [
|
||||
{
|
||||
"aspect": "Mira",
|
||||
"bridge": "Bridges (<code>vmbrX</code>) y su línea <code>bridge-ports</code>",
|
||||
"config": "Cada bloque <code>iface</code> (excluidos loopback, bridges, bonds)"
|
||||
},
|
||||
{
|
||||
"aspect": "Detecta",
|
||||
"bridge": "Bridges que referencian un puerto inexistente",
|
||||
"config": "Bloques de interfaz independientes para NICs que no existen"
|
||||
},
|
||||
{
|
||||
"aspect": "Acción de reparación",
|
||||
"bridge": "Sustituye el nombre del puerto en <code>bridge-ports</code>",
|
||||
"config": "Elimina el bloque <code>iface</code> entero"
|
||||
},
|
||||
{
|
||||
"aspect": "Excluye",
|
||||
"bridge": "Nada — se analizan todos los bridges",
|
||||
"config": "Bridges (<code>vmbrX</code>) y bonds (<code>bondX</code>) se mantienen siempre, porque son virtuales y \"no existir\" sería normal durante el arranque"
|
||||
}
|
||||
],
|
||||
"outro": "En la práctica, lo habitual es ejecutar ambos, en este orden: <strong>análisis de config</strong> primero para eliminar huérfanos, y luego <link>análisis de bridges</link> para reapuntar cualquier bridge que dependiese de la interfaz ya eliminada."
|
||||
},
|
||||
"step1": {
|
||||
"heading": "Paso 1: análisis (solo lectura)",
|
||||
"intro": "Aborta inmediatamente si el host no usa la stack clásica. Si no, lista cada interfaz configurada que no sea loopback y reporta su estado:",
|
||||
"virtTitle": "Las interfaces virtuales están protegidas",
|
||||
"virtBody": "Los bridges (<code>vmbrX</code>) y los bonds (<code>bondX</code>) son construcciones virtuales. Pueden no existir legítimamente en el momento de la inspección (p. ej. un bridge aún sin puertos), por lo que el análisis nunca propone eliminarlos — solo NICs físicas."
|
||||
},
|
||||
"step2": {
|
||||
"heading": "Paso 2: limpieza guiada (5 pasos)",
|
||||
"intro": "Solo se entra si aceptas el prompt al final del análisis. Cada paso requiere confirmación; cancelar en cualquier punto sale sin escribir.",
|
||||
"steps": [
|
||||
{
|
||||
"title": "1. Backup de seguridad",
|
||||
"body": "Copia <code>/etc/network/interfaces</code> a <code>/var/backups/proxmenux/interfaces_backup_<TIMESTAMP></code>. La ruta se muestra antes y después.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "2. Confirmar la lista a eliminar",
|
||||
"body": "Lista exactamente qué bloques de interfaz física se van a eliminar. Si, entre el análisis y la limpieza, las NICs han reaparecido (p. ej. has reasentado una tarjeta), el flujo sale con <em>\"No cleanup needed.\"</em>",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "3. Previsualizar el/los bloque(s) exacto(s)",
|
||||
"body": "Abre una vista con scroll de cada bloque <code>iface</code> que se borraría, tal cual del fichero. Es el momento de detectar p. ej. un hook <code>up</code> interesante que quieras conservar.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "4. Aplicar la eliminación",
|
||||
"body": "Para cada interfaz huérfana, ejecuta <code>sed -i \"/^iface $iface/,/^$/d\" /etc/network/interfaces</code>. Eso borra desde la línea <code>iface</code> que coincide hasta la siguiente línea en blanco.",
|
||||
"tone": "amber"
|
||||
},
|
||||
{
|
||||
"title": "5. Verificación",
|
||||
"body": "Vuelve a leer el fichero, lista lo eliminado y rechequea las interfaces restantes. Imprime el comando de rollback. <strong>No</strong> reinicia networking automáticamente — eliminar un bloque sin uso es seguro aplicarlo al siguiente reinicio y evita tocar el estado en vivo.",
|
||||
"tone": "emerald"
|
||||
}
|
||||
],
|
||||
"noRestartTitle": "No reinicia networking automáticamente",
|
||||
"noRestartBody": "A diferencia de la reparación de bridges, el flujo de limpieza no ofrece reiniciar el servicio. Eliminar un bloque de interfaz sin uso no tiene efecto inmediato en la config en ejecución, así que un reinicio es innecesario y sería un riesgo de conectividad gratuito. El cambio tiene efecto en el siguiente <code>systemctl restart networking</code> manual o en el siguiente reinicio."
|
||||
},
|
||||
"caveats": {
|
||||
"heading": "Avisos importantes",
|
||||
"boundaryTitle": "El límite del bloque es la primera línea en blanco",
|
||||
"boundaryBody": "El patrón <code>sed</code> borra desde <code>iface <name></code> hasta la siguiente línea vacía. Si tu <code>/etc/network/interfaces</code> no tiene líneas en blanco separando bloques (raro, pero posible si está editado a mano), la eliminación puede consumir también el bloque siguiente. Por eso <strong>el paso 3 es obligatorio</strong>: revisa la previsualización antes de confirmar.",
|
||||
"tandemTitle": "Una iface huérfana usada por un bridge se detecta aquí, no en el análisis de bridges",
|
||||
"tandemBody": "Si <code>vmbr0</code> declara <code>bridge-ports enp3s0</code> y <code>enp3s0</code> tiene también su propio bloque <code>iface enp3s0 inet manual</code>, eliminar <code>enp3s0</code> aquí dejará a <code>vmbr0</code> con una referencia colgante. Tras la limpieza, ejecuta el <link>análisis de bridges</link> para reapuntar o quitar el puerto del bridge. Los dos flujos están diseñados para usarse en tándem."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"notFoundTitle": "El análisis muestra mi NIC nueva como \"NOT FOUND\"",
|
||||
"notFoundBody": "El kernel ve el dispositivo con un nombre distinto al que hay en el fichero. Ejecuta <code>ip link show</code> para obtener el nombre real. Este es exactamente el caso en el que <link>Nombres persistentes de interfaz</link> evitaría el problema de aquí en adelante.",
|
||||
"tooMuchTitle": "La limpieza eliminó demasiado (un bloque que quería conservar)",
|
||||
"tooMuchBody": "Restaura desde el backup impreso en el paso 5:",
|
||||
"tooMuchOutro": "Edita el fichero a mano para añadir una línea en blanco clara entre bloques antes de volver a ejecutar la limpieza, o elimina el bloque problemático manualmente.",
|
||||
"bridgeBreakTitle": "Un bridge deja de funcionar después de la limpieza",
|
||||
"bridgeBreakBody": "El bridge dependía de un puerto cuyo bloque <code>iface</code> se acaba de eliminar. Ejecuta el <link>análisis de bridges</link> y la sugerencia apuntará el bridge a una interfaz física existente."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Análisis de bridges y reparación guiada",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tail": " — el seguimiento natural tras una limpieza."
|
||||
},
|
||||
{
|
||||
"label": "Nombres persistentes de interfaz",
|
||||
"href": "/docs/network/persistent-names",
|
||||
"tail": " — evita que se acumulen bloques huérfanos tras cada cambio de hardware."
|
||||
},
|
||||
{
|
||||
"label": "Backup y reinicio de interfaces",
|
||||
"href": "/docs/network/backup-restore",
|
||||
"tail": " — snapshots manuales y el navegador de restauración."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Diagnóstico | ProxMenux Documentation",
|
||||
"description": "Tres comprobaciones de diagnóstico puntuales de solo lectura: Mostrar tabla de rutas, Test de conectividad y Diagnóstico avanzado. Pura inspección — nunca escribe en /etc/network/interfaces y nunca ejecuta un comando modificador (con una excepción explícita y opt-in para purgar NetworkManager cuando se detecta).",
|
||||
"ogTitle": "Diagnóstico | ProxMenux Documentation",
|
||||
"ogDescription": "Diagnóstico de red de solo lectura para el host Proxmox: rutas, alcanzabilidad, estadísticas avanzadas."
|
||||
},
|
||||
"header": {
|
||||
"title": "Diagnóstico",
|
||||
"description": "Tres comprobaciones puntuales de solo lectura que inspeccionan el estado de red en vivo: tabla de rutas, test de conectividad y estadísticas avanzadas. Ninguna escribe en /etc/network/interfaces — seguras de usar en cualquier momento, incluso por SSH. Para monitorización interactiva en vivo, ver Herramientas de monitorización en vivo.",
|
||||
"section": "Red"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Reporta sobre rutas, alcanzabilidad y estadísticas agregadas <strong>sin modificar nada</strong>. Úsalo para confirmar que la red está sana o para identificar IPs duplicadas. Para observación continua de tráfico ver <monitoringLink>Herramientas de monitorización en vivo</monitoringLink>; para ver el fichero de config en crudo ver <backupLink>Backup y reinicio de interfaces</backupLink>."
|
||||
},
|
||||
"routing": {
|
||||
"heading": "Mostrar tabla de rutas",
|
||||
"body": "Lista todas las rutas que el kernel está usando actualmente (<code>ip route show</code>) y resalta la puerta de enlace por defecto. Útil para confirmar que el tráfico hacia internet sale por la interfaz esperada y que ninguna ruta residual está tomando precedencia."
|
||||
},
|
||||
"connectivity": {
|
||||
"heading": "Test de conectividad",
|
||||
"intro": "Envía dos sondas ICMP a tres destinos en secuencia y reporta cada uno. Luego ejecuta un <code>nslookup google.com</code> para verificar la resolución DNS independientemente de ICMP.",
|
||||
"headerTest": "Test",
|
||||
"headerTarget": "Destino",
|
||||
"headerConfirms": "Qué confirma",
|
||||
"rows": [
|
||||
{
|
||||
"test": "Google DNS",
|
||||
"target": "8.8.8.8",
|
||||
"confirms": "Alcanzabilidad externa por IP anycast conocida"
|
||||
},
|
||||
{
|
||||
"test": "Cloudflare DNS",
|
||||
"target": "1.1.1.1",
|
||||
"confirms": "Segunda opinión independiente si Google bloquea ICMP"
|
||||
},
|
||||
{
|
||||
"test": "Gateway",
|
||||
"target": "(ruta por defecto)",
|
||||
"confirms": "Conectividad L2 / L3 con el router local"
|
||||
},
|
||||
{
|
||||
"test": "Resolución DNS",
|
||||
"target": "google.com",
|
||||
"confirms": "El servidor DNS es alcanzable y responde"
|
||||
}
|
||||
],
|
||||
"readingTitle": "Cómo leer el resultado",
|
||||
"readingBody": "Si el test del gateway pasa pero los destinos DNS públicos fallan, tienes conectividad local pero no internet — revisa el upstream del gateway. Si la resolución DNS falla pero los pings a <code>8.8.8.8</code> funcionan, el problema es el resolver, no la red: revisa <code>/etc/resolv.conf</code>."
|
||||
},
|
||||
"advanced": {
|
||||
"heading": "Diagnóstico avanzado",
|
||||
"intro": "Agrega estadísticas de red a nivel global y ejecuta una batería de comprobaciones de problemas comunes. Reporta el número de conexiones activas, puertos en escucha, total de interfaces y señala dos antipatrones explícitamente:",
|
||||
"items": [
|
||||
"<strong>NetworkManager corriendo en un host Proxmox.</strong> NetworkManager y el <code>ifupdown</code> de Proxmox entran en conflicto — los dos intentan gestionar interfaces, lo que provoca bridges que flapean o se niegan a levantar. Si se detecta, la herramienta ofrece un prompt interactivo para detenerlo, deshabilitarlo y purgarlo (es el <em>único</em> diagnóstico que puede modificar el sistema, y solo tras consentimiento explícito).",
|
||||
"<strong>Direcciones IP duplicadas en distintas interfaces.</strong> Dos interfaces con la misma IPv4 causan conectividad intermitente extremadamente difícil de depurar desde dentro de la VM. Se detecta vía <code>ip -4 addr show | sort | uniq -d</code>."
|
||||
],
|
||||
"nmTitle": "El prompt de NetworkManager es la única acción modificadora aquí",
|
||||
"nmBody": "El resto de comprobaciones en Diagnóstico avanzado son de solo lectura. La eliminación de NetworkManager está protegida tras un diálogo sí/no y ejecuta <code>systemctl stop / disable</code> + <code>apt-get purge -y network-manager</code>. Si rechazas, no cambia nada."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"gwTitle": "Test de conectividad reporta el gateway como fallido pero el host tiene internet",
|
||||
"gwBody": "Algunos routers no responden a ICMP desde su interfaz interna aunque sí reenvíen el tráfico. Prueba con <code>traceroute 8.8.8.8</code> desde una consola: si el segundo salto es tu ISP y el test de DNS público pasó, el gateway está bien a pesar del ping fallido.",
|
||||
"dupTitle": "Diagnóstico avanzado sigue señalando IPs duplicadas después de quitar una",
|
||||
"dupBody": "La comprobación mira el estado en vivo del kernel, no el fichero de config. Ejecuta <code>ip -4 addr show</code> para confirmar; si la duplicada sigue ahí, una interfaz todavía la mantiene. Usa <code>ip addr del <IP>/<mask> dev <iface></code> para quitarla del estado en vivo, y luego edita <code>/etc/network/interfaces</code> si también es persistente."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Herramientas de monitorización en vivo",
|
||||
"href": "/docs/network/monitoring",
|
||||
"tail": " — lanzadores interactivos de iftop / iptraf-ng / iperf3."
|
||||
},
|
||||
{
|
||||
"label": "Análisis de bridges y reparación guiada",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tail": " — cuando un vmbrX se queda sin su puerto físico."
|
||||
},
|
||||
{
|
||||
"label": "Análisis de config y limpieza guiada",
|
||||
"href": "/docs/network/config-analysis",
|
||||
"tail": " — cuando una NIC antigua sigue declarada pero ya no está."
|
||||
},
|
||||
{
|
||||
"label": "Backup y reinicio de interfaces",
|
||||
"href": "/docs/network/backup-restore",
|
||||
"tail": " — para hacer snapshot de la config antes de cualquier cambio."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Gestión de red en Proxmox — bridges, bonds, diagnóstico, reparación | ProxMenux",
|
||||
"description": "Diagnóstico de solo lectura, flujos de analizar-y-sugerir y reparaciones guiadas para la stack de red Debian / Proxmox (/etc/network/interfaces). Inspecciona bridges y bonds, ejecuta herramientas de monitorización en vivo, persiste nombres de interfaz, hace backup y reinicia la red de forma segura — con backups obligatorios y previsualizaciones paso a paso.",
|
||||
"ogTitle": "Gestión de red en Proxmox — bridges, bonds, diagnóstico, reparación",
|
||||
"ogDescription": "Diagnóstico, análisis y reparaciones guiadas para la stack de red de Proxmox con backups obligatorios y previsualizaciones paso a paso.",
|
||||
"twitterTitle": "Gestión de red en Proxmox | ProxMenux",
|
||||
"twitterDescription": "Bridges, bonds, diagnóstico y reparaciones guiadas para la stack de red de Proxmox con backups obligatorios."
|
||||
},
|
||||
"header": {
|
||||
"title": "Gestión de red",
|
||||
"description": "Diagnóstico de solo lectura, informes de analizar-y-sugerir y reparaciones guiadas para la stack clásica de red Debian/Proxmox. Cada flujo destructivo hace primero un backup y previsualiza los cambios exactos antes de aplicarlos.",
|
||||
"section": "Red"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué sirve este menú",
|
||||
"body": "Inspeccionar, diagnosticar y (cuando hace falta) reparar la configuración de red del host Proxmox sin perder el acceso remoto. Las herramientas están diseñadas en torno a un principio: <strong>leer primero, proponer, y solo aplicar con consentimiento explícito y un backup de seguridad</strong>. No hay botón de \"arreglar todo automáticamente\"."
|
||||
},
|
||||
"openingMenu": {
|
||||
"heading": "Abrir el menú",
|
||||
"intro": "Desde el menú principal de ProxMenux, selecciona <strong>Red</strong>. Verás esto:",
|
||||
"imageAlt": "Menú Gestión de red con opciones de diagnóstico, monitorización, análisis, reparación, nombres persistentes y backup"
|
||||
},
|
||||
"safety": {
|
||||
"heading": "El modelo de seguridad",
|
||||
"body": "Editar la configuración de red en un host Proxmox remoto es una de las formas más fáciles de bloquearte el acceso. ProxMenux trata cada acción en consecuencia. Las herramientas se dividen en tres niveles de comportamiento — elige la tarjeta que coincida con tu intención:"
|
||||
},
|
||||
"tiers": {
|
||||
"readOnly": {
|
||||
"title": "Solo lectura",
|
||||
"body": "Pura inspección. No puede modificar el sistema bajo ninguna circunstancia.",
|
||||
"items": [
|
||||
"Tabla de rutas, pruebas de conectividad, estadísticas avanzadas",
|
||||
"Monitorización de tráfico en vivo (iftop, iptraf-ng)",
|
||||
"Test de ancho de banda (iperf3)"
|
||||
]
|
||||
},
|
||||
"analyze": {
|
||||
"title": "Analizar y luego sugerir",
|
||||
"body": "Detecta problemas, imprime un informe con los comandos de shell propuestos y se detiene. Tú decides si entras después en la reparación guiada.",
|
||||
"items": [
|
||||
"Análisis de configuración de bridges",
|
||||
"Análisis de configuración de red"
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"title": "Aplicar con backup",
|
||||
"body": "Modifica el sistema. Hace siempre un backup con timestamp del fichero afectado primero y muestra una previsualización antes de escribir.",
|
||||
"items": [
|
||||
"Nombres persistentes de interfaz (ficheros .link)",
|
||||
"Backup manual, restauración y reinicio del servicio"
|
||||
]
|
||||
}
|
||||
},
|
||||
"classicTitle": "Solo stack clásica",
|
||||
"classicBody": "Cada función de análisis y reparación comprueba el gestor de red activo antes de tocar nada. Si el host usa <strong>netplan</strong>, <strong>systemd-networkd</strong> o <strong>NetworkManager</strong>, la herramienta aborta inmediatamente con un mensaje claro — el menú solo soporta la stack clásica de Debian/Proxmox en <code>/etc/network/interfaces</code>. Es intencional: editar un fichero de netplan con reglas escritas para <code>ifupdown</code> corrompería silenciosamente la configuración.",
|
||||
"backups": {
|
||||
"heading": "Dónde van los backups",
|
||||
"intro": "Cada reparación guiada, restauración o backup manual escribe una copia con timestamp de <code>/etc/network/interfaces</code> en <code>/var/backups/proxmenux/</code>:",
|
||||
"rollbackIntro": "Para hacer rollback manualmente desde una consola:"
|
||||
},
|
||||
"readOnlySection": {
|
||||
"heading": "Inspección de solo lectura",
|
||||
"body": "El punto de partida cuando algo huele raro. Pura inspección — nunca escribe en <code>/etc/network/interfaces</code> y nunca ejecuta un comando modificador (con una única excepción explícita y opt-in para purgar NetworkManager cuando se detecta). Seguro de usar por SSH en cualquier momento.",
|
||||
"options": [
|
||||
{
|
||||
"title": "Diagnóstico",
|
||||
"description": "Tres comprobaciones puntuales de solo lectura: Mostrar tabla de rutas, Test de conectividad y Diagnóstico avanzado. Pura inspección — nunca escribe en el sistema."
|
||||
},
|
||||
{
|
||||
"title": "Herramientas de monitorización en vivo",
|
||||
"description": "Tres lanzadores interactivos: iftop (ancho de banda en tiempo real por par de hosts), iptraf-ng (monitor de tráfico multimodo) e iperf3 (test de ancho de banda, modo servidor / cliente)."
|
||||
}
|
||||
]
|
||||
},
|
||||
"analyzeSection": {
|
||||
"heading": "Analizar y luego sugerir",
|
||||
"body": "Se usa cuando una inspección (o una caída real) apunta a un problema de configuración. Cada herramienta recorre la parte relevante de <code>/etc/network/interfaces</code>, imprime un informe detallado con el comando de shell exacto que arreglaría cada hallazgo y <strong>se detiene</strong>. Si aceptas después la reparación guiada opcional, cada cambio se respalda con backup y se previsualiza antes de escribirse.",
|
||||
"options": [
|
||||
{
|
||||
"title": "Análisis de bridges y reparación guiada",
|
||||
"description": "Detecta bridges vmbrX con puertos ausentes o inválidos (típico tras una re-enumeración PCI). Muestra primero un informe; solo repara cuando aceptas el flujo guiado de 5 pasos."
|
||||
},
|
||||
{
|
||||
"title": "Análisis de config y limpieza guiada",
|
||||
"description": "Encuentra interfaces físicas declaradas en /etc/network/interfaces que ya no existen (configs huérfanas que dejan cambios de hardware). Las reporta y ofrece una eliminación guiada."
|
||||
}
|
||||
]
|
||||
},
|
||||
"applySection": {
|
||||
"heading": "Aplicar con backup",
|
||||
"body": "Herramientas que escriben en disco por diseño. Cada una hace un backup con timestamp del fichero afectado antes de escribir, y las opciones destructivas (restauración, reinicio) requieren una confirmación explícita sí/no. <em>Nombres persistentes de interfaz</em> tiene efecto en el siguiente reinicio, no inmediatamente, así que es seguro programarlo incluso en un host remoto.",
|
||||
"options": [
|
||||
{
|
||||
"title": "Nombres persistentes de interfaz",
|
||||
"description": "Fija nombres de interfaz (eno1, enp3s0, …) a direcciones MAC mediante ficheros .link de systemd. Los nombres sobreviven a cambios de slot PCI, actualizaciones de kernel y al añadir / quitar otras NICs."
|
||||
},
|
||||
{
|
||||
"title": "Backup y reinicio de interfaces",
|
||||
"description": "Snapshot manual de /etc/network/interfaces, navegar y restaurar backups previos, ver la config en vivo y reiniciar el servicio de red cuando haga falta."
|
||||
}
|
||||
]
|
||||
},
|
||||
"consoleTitle": "Ten acceso a consola listo",
|
||||
"consoleSubTitle": "Antes de cualquier reparación en un host remoto",
|
||||
"consoleBody": "Si estás conectado por SSH y solo tienes un camino al host, ten un fallback antes de aplicar cambios de red: consola física / IPMI / iKVM, u otra máquina en la misma LAN. Las reparaciones guiadas son seguras y siempre ofrecen un comando de rollback, pero un bridge mal configurado o un enlace caído pueden dejarte bloqueado hasta que llegues a la consola."
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Herramientas de monitorización en vivo | ProxMenux Documentation",
|
||||
"description": "Tres lanzadores interactivos de monitorización de red: iftop (ancho de banda en tiempo real por par de hosts), iptraf-ng (monitor de tráfico multimodo) e iperf3 (test de ancho de banda, modo servidor / cliente). Cada uno se instala la primera vez que se usa.",
|
||||
"ogTitle": "Herramientas de monitorización en vivo | ProxMenux Documentation",
|
||||
"ogDescription": "Monitorización interactiva de red y test de ancho de banda para el host Proxmox: iftop, iptraf-ng, iperf3."
|
||||
},
|
||||
"header": {
|
||||
"title": "Herramientas de monitorización en vivo",
|
||||
"description": "Tres lanzadores interactivos para observación de red en tiempo real y medición de ancho de banda: iftop, iptraf-ng e iperf3. Cada herramienta se autoinstala desde apt la primera vez que se usa, corre en primer plano y se sale con la tecla documentada. De solo lectura sobre la configuración del host — solo observan el tráfico.",
|
||||
"section": "Red"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Tres herramientas de monitorización interactivas, cada una con su entrada de menú. La primera vez que lanzas una, el paquete se instala silenciosamente vía <code>apt-get</code>. Los siguientes lanzamientos arrancan al instante. Ninguna de estas herramientas modifica la configuración de red del host."
|
||||
},
|
||||
"when": {
|
||||
"heading": "Cuándo usar cuál",
|
||||
"headerQuestion": "Pregunta",
|
||||
"headerUse": "Usa",
|
||||
"rows": [
|
||||
{
|
||||
"question": "¿Quién está saturando el enlace <em>ahora mismo</em>?",
|
||||
"use": "iftop"
|
||||
},
|
||||
{
|
||||
"question": "¿Qué desglose por protocolo / tamaños de paquete / flujos TCP hay?",
|
||||
"use": "iptraf-ng"
|
||||
},
|
||||
{
|
||||
"question": "¿Cuánto ancho de banda hay realmente disponible entre dos hosts?",
|
||||
"use": "iperf3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"iftop": {
|
||||
"heading": "Uso de red en tiempo real (iftop)",
|
||||
"body": "Ancho de banda en vivo por par de hosts (origen ↔ destino) — como <code>top</code> para tráfico. Muestra los flujos más pesados arriba, con medias móviles de 2/10/40 segundos. La mejor herramienta para la pregunta <em>\"¿por qué está saturado mi uplink?\"</em>.",
|
||||
"exit": "<strong>Salir:</strong> pulsa <kbd>q</kbd>. ProxMenux muestra un diálogo recordatorio antes de lanzarlo.",
|
||||
"keysTitle": "Teclas útiles dentro de iftop",
|
||||
"keysBody": "<kbd>n</kbd> alterna la resolución DNS, <kbd>p</kbd> muestra números de puerto, <kbd>P</kbd> pausa la pantalla, <kbd>t</kbd> alterna la dirección de la línea (enviado / recibido / ambos), <kbd>1</kbd>/<kbd>2</kbd>/<kbd>3</kbd> ordena por media de 2s / 10s / 40s. <code>man iftop</code> para el set completo."
|
||||
},
|
||||
"iptraf": {
|
||||
"heading": "Herramienta de monitorización de red (iptraf-ng)",
|
||||
"intro": "Monitor de tráfico multimodo basado en menús. Donde iftop responde a <em>\"quién\"</em>, iptraf-ng responde a <em>\"qué\"</em>: conteos de bytes/paquetes por protocolo, seguimiento del estado de conexiones TCP, histogramas de tamaño de paquete y actividad LAN por estación.",
|
||||
"menuIntro": "Al arrancar obtienes un menú de cinco opciones:",
|
||||
"headerMode": "Modo",
|
||||
"headerUseFor": "Úsalo para",
|
||||
"rows": [
|
||||
{
|
||||
"mode": "IP traffic monitor",
|
||||
"useFor": "Lista en vivo de flujos TCP / UDP / ICMP / otro-IP con contadores de bytes y estado de conexión"
|
||||
},
|
||||
{
|
||||
"mode": "General interface stats",
|
||||
"useFor": "Conteos agregados de paquetes IPv4 / IPv6 / TCP / UDP / ICMP / no-IP por NIC"
|
||||
},
|
||||
{
|
||||
"mode": "Detailed interface stats",
|
||||
"useFor": "Igual que arriba pero para una interfaz, con detalle de tamaño y tasa de paquetes"
|
||||
},
|
||||
{
|
||||
"mode": "Statistical breakdowns",
|
||||
"useFor": "Histograma de distribución de tamaño de paquete, por puerto TCP / UDP"
|
||||
},
|
||||
{
|
||||
"mode": "LAN station monitor",
|
||||
"useFor": "Estadísticas de tráfico por MAC del dominio de broadcast local"
|
||||
}
|
||||
],
|
||||
"exit": "<strong>Salir:</strong> pulsa <kbd>x</kbd> desde cualquier vista (o <kbd>Q</kbd> desde el menú principal). ProxMenux muestra un diálogo recordatorio antes de lanzarlo.",
|
||||
"logTitle": "El logging captura a fichero",
|
||||
"logBody": "Cada modo ofrece registrar las estadísticas capturadas en <code>/var/log/iptraf-ng/</code>. Útil si necesitas un registro de un pico de tráfico — déjalo corriendo, vuelca al fichero, revisa el fichero después en lugar de intentar leer la pantalla en vivo."
|
||||
},
|
||||
"iperf3": {
|
||||
"heading": "Test de ancho de banda (iperf3)",
|
||||
"intro1": "Mide el throughput TCP real entre dos hosts. A diferencia de iftop / iptraf-ng (que observan tráfico existente), iperf3 genera tráfico sintético para estresar el enlace. Indispensable para responder a preguntas como <em>\"¿está mi 10 GbE haciendo realmente 10 GbE?\"</em> o <em>\"¿el cuello de botella es la NIC, el switch o el almacenamiento?\"</em>.",
|
||||
"intro2": "iperf3 es una <strong>herramienta de dos hosts</strong>: un lado corre como servidor (escucha en TCP 5201), el otro corre como cliente (se conecta, envía datos, imprime la tasa). El lanzador de ProxMenux pregunta qué modo quieres:",
|
||||
"headerMode": "Modo",
|
||||
"headerBehaviour": "Comportamiento",
|
||||
"headerCli": "CLI equivalente",
|
||||
"rows": [
|
||||
{
|
||||
"mode": "Server",
|
||||
"behaviour": "Escucha en TCP 5201 e imprime resultados de cada test entrante. Se detiene con Ctrl+C.",
|
||||
"cli": "iperf3 -s"
|
||||
},
|
||||
{
|
||||
"mode": "Client",
|
||||
"behaviour": "Pide la IP / hostname del servidor, conecta, ejecuta un test por defecto de 10 segundos e imprime el informe.",
|
||||
"cli": "iperf3 -c <target>"
|
||||
}
|
||||
],
|
||||
"workflowIntro": "Flujo típico para probar un enlace 10 GbE entre dos hosts Proxmox:",
|
||||
"workflow": [
|
||||
"En el host A, abre el menú Red → <em>Test de ancho de banda (iperf3)</em> → elige <strong>Server</strong>.",
|
||||
"En el host B, abre la misma entrada de menú → elige <strong>Client</strong> → introduce la IP del host A.",
|
||||
"Espera 10 segundos. Compara la tasa reportada con el máximo teórico del enlace."
|
||||
],
|
||||
"sample": "Salida de ejemplo del cliente:",
|
||||
"flagsTitle": "Flags útiles a mano (desde una shell)",
|
||||
"flagsBody": "<code>-t 60</code> test más largo (60s en lugar de los 10s por defecto), <code>-P 4</code> 4 streams en paralelo (satura más rápido), <code>-R</code> dirección inversa (servidor → cliente), <code>-u -b 100M</code> test UDP a 100 Mbit/s (para mediciones de jitter / pérdida de paquetes), <code>-p 5202</code> usa un puerto distinto (varios tests en paralelo). <code>man iperf3</code> para el set completo.",
|
||||
"firewallTitle": "Abre el puerto del firewall en el servidor",
|
||||
"firewallBody": "El servidor escucha en TCP <strong>5201</strong> por defecto. Si corres el servidor dentro de un host Proxmox con un firewall estricto (a nivel de datacenter o de host), permite entrada TCP 5201 desde la IP del cliente durante el test y luego ciérralo. Lo mismo aplica a <code>nftables</code> / <code>iptables</code> en hosts bare metal."
|
||||
},
|
||||
"install": {
|
||||
"heading": "El primer lanzamiento instala el paquete",
|
||||
"body": "Los tres lanzadores comprueban si el binario está y ejecutan <code>apt-get update -qq && apt-get install -y <pkg></code> si falta. La instalación es silenciosa: el menú puede parecer congelado durante 10–30 segundos la primera vez. Los siguientes lanzamientos arrancan al instante."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"hangTitle": "La instalación se cuelga eternamente en el primer lanzamiento",
|
||||
"hangBody": "El host no tiene internet o los repos de apt son inalcanzables. Cancela con <kbd>Ctrl</kbd>+<kbd>C</kbd>, ejecuta <code>apt-get update</code> a mano para ver el error real (DNS, firma del repo, proxy …) y luego vuelve al menú.",
|
||||
"refusedTitle": "Cliente iperf3: \"unable to connect to server: Connection refused\"",
|
||||
"refusedBody": "O el servidor no está corriendo, o su firewall bloquea TCP 5201. Confirma en el servidor: <code>ss -tlnp | grep 5201</code> — debería mostrar iperf3 escuchando. Si está escuchando pero el cliente sigue fallando, revisa el camino del firewall entre los dos hosts.",
|
||||
"slowTitle": "iperf3 reporta mucho menos que la velocidad esperada del enlace",
|
||||
"slowBody": "Causas habituales, por orden de probabilidad: (1) uno de los hosts tiene cuello de botella en CPU — prueba <code>iperf3 -c <target> -P 4</code> para usar varios cores; (2) el camino pasa por un enlace más lento (switch gigabit en medio de dos NICs 10 GbE); (3) mismatch de MTU — comprueba <code>ip link show</code> en ambos extremos; (4) offloading de la NIC deshabilitado — ver el script de la comunidad <em>Disable NIC Offloading</em> si tienes una tarjeta Intel e1000e.",
|
||||
"noTrafficTitle": "iftop / iptraf-ng no muestran tráfico en un host con carga",
|
||||
"noTrafficBody": "La captura por defecto va sobre la primera interfaz detectada. Especifica la correcta explícitamente desde la shell: <code>iftop -i vmbr0</code> o <code>iptraf-ng -i vmbr0</code>. El lanzador del menú usa la interfaz por defecto; para interfaces no por defecto, ejecuta desde una consola."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Diagnóstico",
|
||||
"href": "/docs/network/diagnostics",
|
||||
"tail": " — las comprobaciones puntuales de solo lectura (rutas, conectividad, estadísticas avanzadas)."
|
||||
},
|
||||
{
|
||||
"label": "Análisis de bridges y reparación guiada",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tail": " — cuando la monitorización revela que una interfaz o un bridge no hace lo que debería."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Nombres persistentes de interfaz | ProxMenux Documentation",
|
||||
"description": "Fija los nombres de interfaz de Proxmox (eno1, enp3s0, …) a direcciones MAC mediante ficheros .link de systemd para que los nombres sobrevivan a la re-enumeración PCI, actualizaciones de kernel y al añadir / quitar otras NICs.",
|
||||
"ogTitle": "Nombres persistentes de interfaz | ProxMenux Documentation",
|
||||
"ogDescription": "Evita que los nombres de interfaz de Proxmox cambien al modificar el hardware. Usa ficheros .link de systemd basados en la dirección MAC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Nombres persistentes de interfaz",
|
||||
"description": "Genera un fichero .link de systemd por cada NIC física que fija el nombre asignado por el kernel a la MAC de la tarjeta. Una vez aplicado (tras el siguiente reinicio), los nombres de interfaz dejan de moverse cuando añades, quitas o mueves tarjetas PCIe.",
|
||||
"section": "Red"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Para cada NIC física del host, escribe un pequeño fichero en <code>/etc/systemd/network/10-<iface>.link</code> que dice: <em>\"el dispositivo con esta MAC debe llamarse siempre así\"</em>. systemd-udevd aplica la regla en cada arranque, antes de que <code>ifupdown</code> lea <code>/etc/network/interfaces</code>."
|
||||
},
|
||||
"problem": {
|
||||
"heading": "El problema que resuelve",
|
||||
"intro": "Linux deriva los nombres de interfaz por defecto a partir de la topología PCI — <code>eno1</code> = onboard, <code>enp3s0</code> = la tarjeta en el bus PCI 3, slot 0, etc. El esquema de naming es determinista <em>dado el mismo layout de hardware</em>. Cambia el layout y los nombres se mueven:",
|
||||
"items": [
|
||||
"Añade una GPU delante de una NIC existente → el número de bus de la NIC puede cambiar → el nombre cambia.",
|
||||
"Mueve una tarjeta a otro slot PCIe → el nombre cambia.",
|
||||
"Actualización de BIOS / UEFI que re-enumera los dispositivos → los nombres pueden cambiar.",
|
||||
"Reemplaza una tarjeta defectuosa por el mismo modelo en otro slot → el nombre cambia."
|
||||
],
|
||||
"outro": "Tras un cambio así, <code>/etc/network/interfaces</code> sigue referenciando el nombre <em>antiguo</em>; el bridge no levanta; el host pierde la red. Configurar nombres persistentes evita que este escenario vuelva a pasar."
|
||||
},
|
||||
"howWorks": {
|
||||
"heading": "Cómo funciona",
|
||||
"arrowLabel": "por NIC",
|
||||
"nodes": {
|
||||
"detectLabel": "Detectar NICs físicas",
|
||||
"detectDetail": "ls /sys/class/net/\nfiltrar vmbr / bond /\ndocker / veth / wireguard …",
|
||||
"readLabel": "Leer cada MAC",
|
||||
"readDetail": "cat /sys/class/net/\n '<'iface'>'/address",
|
||||
"writeLabel": "Escribir fichero .link",
|
||||
"writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link"
|
||||
},
|
||||
"minimalIntro": "Cada fichero generado es intencionalmente mínimo:",
|
||||
"minimalOutro": "En el arranque, systemd-udevd hace match del dispositivo por MAC y asigna el nombre pedido <em>antes</em> de que ningún otro componente (ifupdown, naming por defecto del kernel) llegue a él. El prefijo <code>10-</code> del fichero asegura que estas reglas se carguen pronto, antes del <code>99-default.link</code> por defecto."
|
||||
},
|
||||
"scope": {
|
||||
"heading": "Qué se escribe y qué se omite",
|
||||
"headerType": "Tipo",
|
||||
"headerBehaviour": "Comportamiento",
|
||||
"headerWhy": "Por qué",
|
||||
"rows": [
|
||||
{
|
||||
"type": "NIC onboard / PCIe",
|
||||
"behaviour": "Se escribe fichero <code>.link</code>",
|
||||
"why": "Respaldada por un dispositivo PCI real — el caso para el que está la herramienta"
|
||||
},
|
||||
{
|
||||
"type": "Wi-Fi (phy80211)",
|
||||
"behaviour": "Se escribe fichero <code>.link</code>",
|
||||
"why": "Tiene una MAC real y se beneficia de la estabilidad de nombre"
|
||||
},
|
||||
{
|
||||
"type": "Bridges (vmbrX)",
|
||||
"behaviour": "Se omite",
|
||||
"why": "Virtual; el nombre viene de <code>/etc/network/interfaces</code>"
|
||||
},
|
||||
{
|
||||
"type": "Bonds (bondX)",
|
||||
"behaviour": "Se omite",
|
||||
"why": "Virtual; el nombre del bond lo fija ifupdown"
|
||||
},
|
||||
{
|
||||
"type": "veth / docker0 / br-XXXX",
|
||||
"behaviour": "Se omite",
|
||||
"why": "Creadas bajo demanda por Docker / LXC — no son hardware persistente"
|
||||
},
|
||||
{
|
||||
"type": "tap / fwpr / fwln",
|
||||
"behaviour": "Se omite",
|
||||
"why": "Creadas bajo demanda por Proxmox por VM/CT"
|
||||
},
|
||||
{
|
||||
"type": "WireGuard / Cilium / Tailscale",
|
||||
"behaviour": "Se omite",
|
||||
"why": "Interfaces software gestionadas por sus propios daemons"
|
||||
}
|
||||
]
|
||||
},
|
||||
"safety": {
|
||||
"heading": "Red de seguridad: se respaldan los .link anteriores",
|
||||
"intro": "Si <code>/etc/systemd/network/</code> ya contiene ficheros <code>.link</code> (de una ejecución anterior u otra herramienta), se copian a un directorio de backup con timestamp antes de generar los nuevos:",
|
||||
"outro": "Para hacer rollback: copia los ficheros desde el directorio de backup y reinicia.",
|
||||
"rebootTitle": "Tiene efecto en el siguiente reinicio, no inmediatamente",
|
||||
"rebootBody": "Los cambios en ficheros <code>.link</code> solo se aplican en el arranque, cuando udev re-enumera los dispositivos. La herramienta reporta <em>\"Changes will apply after reboot\"</em> por este motivo. Renombrar una interfaz en vivo es arriesgado y no se intenta: un <code>vmbr0</code> activo con miembros tendría que reconfigurarse atómicamente, por eso la operación se difiere al siguiente arranque limpio."
|
||||
},
|
||||
"afterReboot": {
|
||||
"heading": "Tras el reinicio",
|
||||
"intro": "Una vez fijados los nombres, el flujo para futuros cambios de hardware es simple:",
|
||||
"items": [
|
||||
"Apaga, cambia hardware (añadir tarjeta, mover slot, …), arranca.",
|
||||
"Cada NIC mantiene su nombre anterior porque su MAC coincide con un fichero <code>.link</code>.",
|
||||
"Si una NIC se reemplaza (MAC distinta), obtiene un nombre del kernel por defecto (<code>enp<bus>s<slot></code>); vuelve a ejecutar este menú para añadir una entrada <code>.link</code> con la MAC de la tarjeta nueva."
|
||||
]
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"emptyTitle": "\"No physical interfaces found\" tras ejecutar la herramienta",
|
||||
"emptyBody": "El host no tiene interfaces respaldadas por PCI / phy80211 visibles para el kernel. Confirma con <code>ls -l /sys/class/net/</code> — cada entrada debería tener un symlink <code>device</code> (PCI) o una entrada <code>phy80211</code> (Wi-Fi). Si faltan ambos para lo que debería ser una NIC real, el driver no está cargado.",
|
||||
"noChangeTitle": "Tras el reinicio, los nombres no han cambiado como esperaba",
|
||||
"noChangeBody": "Comprueba que el fichero está presente y bien formado: <code>cat /etc/systemd/network/10-<iface>.link</code>. Después mira los logs de udev: <code>journalctl -u systemd-udevd -b | grep -i link</code>. Una causa habitual es un parámetro de kernel <code>net.ifnames=0</code> residual que deshabilita el naming predictivo por completo — quítalo de <code>/etc/default/grub</code>, ejecuta <code>update-grub</code> y reinicia.",
|
||||
"undoTitle": "Quiero deshacer el naming persistente",
|
||||
"undoBody": "O bien borra los ficheros <code>.link</code> (<code>rm /etc/systemd/network/10-*.link</code>) o restaura desde el directorio de backup generado en la ejecución anterior. Reinicia para aplicar."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Análisis de bridges y reparación guiada",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tailRich": " — el camino de recuperación cuando los nombres <em>ya</em> se han movido."
|
||||
},
|
||||
{
|
||||
"label": "Análisis de config y limpieza guiada",
|
||||
"href": "/docs/network/config-analysis",
|
||||
"tail": " — para eliminar bloques huérfanos dejados por los cambios de nombre."
|
||||
},
|
||||
{
|
||||
"label": "Diagnóstico",
|
||||
"href": "/docs/network/diagnostics",
|
||||
"tailRich": " — confirma los nuevos nombres con <em>Mostrar tabla de rutas</em> tras el reinicio."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Script Automatizado post-instalación | ProxMenux Documentation",
|
||||
"description": "El script Automatizado post-instalación de ProxMenux aplica un conjunto curado de 13 optimizaciones seguras y conscientes del hardware a un host de Proxmox VE recién instalado, sin preguntas. Cada cambio queda registrado para revertirlo después vía Uninstall Optimizations.",
|
||||
"ogTitle": "Script Automatizado post-instalación | ProxMenux Documentation",
|
||||
"ogDescription": "13 optimizaciones curadas aplicadas a un host de Proxmox VE recién instalado sin preguntas. Consciente del hardware (autodetección SSD/NVMe) y totalmente reversible."
|
||||
},
|
||||
"header": {
|
||||
"title": "Script Automatizado post-instalación",
|
||||
"description": "Un clic, sin preguntas — ProxMenux aplica un conjunto curado de 13 optimizaciones seguras de las que se beneficia casi cualquier host Proxmox. Cada cambio queda registrado en el JSON de herramientas para que puedas deshacer cualquiera de ellos más tarde desde Uninstall Optimizations.",
|
||||
"section": "Post-Install · Automated"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cuándo elegir Automatizado",
|
||||
"body": "Ejecútalo en un host Proxmox recién instalado cuando quieres el baseline sensato sin tener que tomar decisiones. El script es idempotente — ejecutarlo dos veces es seguro, simplemente vuelve a aplicar las mismas configuraciones. Las funcionalidades opt-in (Fastfetch, IOMMU, repo de Ceph, HA, fixes de AMD…) <strong>no</strong> forman parte de esta ruta a propósito; selecciónalas desde <link>Personalizable</link> si las necesitas."
|
||||
},
|
||||
"applies": {
|
||||
"heading": "Qué aplica el script",
|
||||
"intro": "Las optimizaciones se aplican exactamente en este orden. La columna <em>Categoría</em> enlaza con la documentación detallada de cada cambio en la referencia Personalizable.",
|
||||
"headerNum": "#",
|
||||
"headerTool": "Herramienta",
|
||||
"headerWhat": "Qué hace",
|
||||
"headerCategory": "Categoría"
|
||||
},
|
||||
"optimizations": [
|
||||
{
|
||||
"tool": "Repositorios APT + full upgrade",
|
||||
"what": "Desactiva pve-enterprise.sources y ceph.sources enterprise, escribe una fuente limpia sin suscripción para el codename Debian del host, y luego ejecuta apt update && apt full-upgrade -y (el comando oficial de upgrade de Proxmox).",
|
||||
"category": "Basic Settings",
|
||||
"categorySlug": "basic-settings"
|
||||
},
|
||||
{
|
||||
"tool": "Eliminación del banner de suscripción",
|
||||
"what": "Parchea la UI web para ocultar el banner 'No valid subscription'. Pide confirmación antes de aplicar; reversible desde Uninstall Optimizations.",
|
||||
"category": "Customization",
|
||||
"categorySlug": "customization"
|
||||
},
|
||||
{
|
||||
"tool": "Forzar IPv4",
|
||||
"what": "Escribe /etc/apt/apt.conf.d/99-force-ipv4 para que apt use solo IPv4 — esquiva setups de mirror IPv6 inestables.",
|
||||
"category": "Network",
|
||||
"categorySlug": "network"
|
||||
},
|
||||
{
|
||||
"tool": "Saltar paquetes de idioma",
|
||||
"what": "Escribe /etc/apt/apt.conf.d/99-disable-translations para dejar de descargar paquetes específicos de locale. Updates de apt más rápidos y ligeros.",
|
||||
"category": "Basic Settings",
|
||||
"categorySlug": "basic-settings"
|
||||
},
|
||||
{
|
||||
"tool": "Aumentar límites del sistema",
|
||||
"what": "Sube los inotify watches, los límites nofile/nproc, los límites del keyring del kernel y fs.file-max en sysctl.d, limits.d, pam y systemd — lo bastante altos para hosts con muchos contenedores.",
|
||||
"category": "System",
|
||||
"categorySlug": "system"
|
||||
},
|
||||
{
|
||||
"tool": "Tuning de memoria",
|
||||
"what": "Establece vm.swappiness=10, dirty ratios balanceados, vm.overcommit_memory=1, vm.max_map_count=262144 y compaction proactiveness cuando es soportado.",
|
||||
"category": "System",
|
||||
"categorySlug": "system"
|
||||
},
|
||||
{
|
||||
"tool": "Comportamiento ante kernel panic",
|
||||
"what": "Configura el host para reiniciar 10 segundos después de un panic / oops / hardlockup en lugar de quedarse congelado indefinidamente.",
|
||||
"category": "System",
|
||||
"categorySlug": "system"
|
||||
},
|
||||
{
|
||||
"tool": "Tuning del stack de red",
|
||||
"what": "Dimensionado de buffers TCP, hardening IPv4 (redirects off, rp_filter=2, martian log off), rango de puertos locales 1024-65535, TCP MTU probing, RFC 1337, más una unit systemd oneshot para normalizar los bridges de firewall virtual.",
|
||||
"category": "Network",
|
||||
"categorySlug": "network"
|
||||
},
|
||||
{
|
||||
"tool": "Customización de bashrc (root)",
|
||||
"what": "PS1 con colores, aliases comunes (l/la/ll/ls/grep), historial con marcas de tiempo y sourcing de bash-completion, todo dentro de un bloque PMX_CORE_BASHRC delimitado para que sea fácil de quitar.",
|
||||
"category": "Customization",
|
||||
"categorySlug": "customization"
|
||||
},
|
||||
{
|
||||
"tool": "Log2RAM (consciente de SSD, automático)",
|
||||
"what": "Detecta si el disco raíz es SSD / NVMe e instala Log2RAM desde el git upstream. Dimensiona el ramdisk según la RAM del host (128M / 256M / 512M), programa sync periódico y un auto-sync con umbral del 95 %. Ajusta los límites de journald para caber en el ramdisk.",
|
||||
"category": "Storage",
|
||||
"categorySlug": "storage"
|
||||
},
|
||||
{
|
||||
"tool": "ZFS autotrim (solo SSD)",
|
||||
"what": "Activa zpool autotrim=on en cada pool ZFS cuyos vdevs sean todos SSD/NVMe con soporte TRIM (comprueba /sys/block/<dev>/queue/rotational y discard_granularity). Los pools respaldados por HDDs se saltan automáticamente. Solo los pools realmente cambiados por ProxMenux quedan registrados para el uninstall — los pools en los que activaste autotrim a mano se dejan en paz.",
|
||||
"category": "Storage",
|
||||
"categorySlug": "storage"
|
||||
},
|
||||
{
|
||||
"tool": "Límites de tamaño de journald",
|
||||
"what": "Fuerza almacenamiento persistente, capa SystemMaxUse=64M / RuntimeMaxUse=60M, activa compresión, logging a nivel info (requerido para el Monitor). Se salta automáticamente cuando Log2RAM está activo (hace su propio ajuste).",
|
||||
"category": "System",
|
||||
"categorySlug": "system"
|
||||
},
|
||||
{
|
||||
"tool": "Tuning de logrotate",
|
||||
"what": "Rotación diaria con tope de tamaño 10M, 7 rotaciones, compresión y copytruncate — amigable con Log2RAM.",
|
||||
"category": "System",
|
||||
"categorySlug": "system"
|
||||
},
|
||||
{
|
||||
"tool": "Nombres de interfaz persistentes",
|
||||
"what": "Escribe archivos /etc/systemd/network/10-*.link que emparejan cada NIC física por MAC para que los nombres eth0 / enp… se mantengan estables tras reinicios y al añadir nuevas NICs.",
|
||||
"category": "Network",
|
||||
"categorySlug": "network"
|
||||
}
|
||||
],
|
||||
"hardwareTitle": "Valores por defecto conscientes del hardware",
|
||||
"hardwareBody": "El script lee el hardware del host antes de aplicar los ajustes. Log2RAM solo se instala en discos raíz SSD / NVMe por defecto (pregunta si la detección dice lo contrario). El tamaño del ramdisk de Log2RAM se elige a partir de la RAM total (<code>≤ 8 GB → 128M</code>, <code>≤ 16 GB → 256M</code>, <code>'>' 16 GB → 512M</code>). Los límites de journald se ajustan al tamaño del ramdisk cuando Log2RAM está activo, para no llenarlo.",
|
||||
"upgrade": {
|
||||
"heading": "Actualizar y hacer upgrade del sistema",
|
||||
"intro": "El primer paso del bundle Automatizado es el upgrade de Proxmox. La guía oficial de Proxmox para hacer upgrade de un host en ejecución (dentro de la misma versión mayor) es ejecutar:",
|
||||
"after": "Esa única línea es el comando oficial en cualquier release actual de Proxmox. El script Automatizado ejecuta <strong>exactamente</strong> eso, y lo envuelve con la limpieza de repositorios y la limpieza post-upgrade que la guía oficial también recomienda — mismos pasos que la utilidad independiente <link>Proxmox System Update</link>:",
|
||||
"items": [
|
||||
"Desactiva enterprise <code>pve-enterprise.sources</code> / <code>ceph.sources</code>, elimina archivos de repos legacy, escribe una fuente limpia sin suscripción para el codename del host.",
|
||||
"Ejecuta el upgrade de forma no interactiva con <code>DEBIAN_FRONTEND=noninteractive</code> y <code>--force-confdef --force-confold</code> — los archivos de configuración que has customizado siguen siendo tuyos cuando upstream también ha cambiado.",
|
||||
"Instala paquetes esenciales de Proxmox si faltan (<code>zfsutils-linux</code>, <code>proxmox-backup-restore-image</code>, <code>chrony</code>).",
|
||||
"Comprobación de cordura de metadatos LVM, <code>apt-get autoremove -y</code> + <code>apt-get autoclean -y</code>, y prompt de reinicio solo si el kernel realmente cambió."
|
||||
],
|
||||
"sameTitle": "Mismo updater, dos puntos de entrada",
|
||||
"sameBody": "El bundle Automatizado y la utilidad independiente <link>Proxmox System Update</link> comparten los mismos scripts subyacentes (<code>update-pve8.sh</code> / <code>update-pve9_2.sh</code>). Usa la utilidad por separado cuando solo quieras hacer upgrade del host sin aplicar el resto de las optimizaciones."
|
||||
},
|
||||
"endResult": {
|
||||
"heading": "Resultado final esperado",
|
||||
"body": "Cuando el script termina, verás un mensaje de éxito con la salida paso a paso y un prompt de reinicio (algunos ajustes del kernel requieren reiniciar para surtir efecto). Rechazar el reinicio es seguro; los ajustes se aplican en el siguiente arranque.",
|
||||
"imageAlt": "Script Automatizado post-instalación — salida final del terminal mostrando cada optimización aplicada con éxito"
|
||||
},
|
||||
"notDoes": {
|
||||
"heading": "Qué NO hace este script",
|
||||
"items": [
|
||||
"Autodetección de zona horaria (comentada upstream; usa Personalizable si la quieres).",
|
||||
"Desactivar portmapper / rpcbind (mira <secLink>Seguridad</secLink>).",
|
||||
"Activar IOMMU / VFIO (mira <virtLink>Virtualización</virtLink>).",
|
||||
"Instalar Fastfetch / Figurine / repo de Ceph / HA / fixes de CPU AMD (mira <optLink>Opcional</optLink>).",
|
||||
"Instalar pigz o aplicar tuning del ARC de ZFS (mira <perfLink>Rendimiento</perfLink> / <storLink>Almacenamiento</storLink>)."
|
||||
]
|
||||
},
|
||||
"xshokTitle": "Detección de xshok-proxmox",
|
||||
"xshokBody": "Si el host ha ejecutado previamente el script <code>xshok-proxmox</code>, ProxMenux detecta el archivo marcador y te avisa antes de continuar. Algunos tweaks pueden solaparse. El script complementario está deprecado — si decides continuar de todos modos, revisa <link>el resumen</link> para contexto.",
|
||||
"revert": {
|
||||
"heading": "Revertir",
|
||||
"body": "Cada herramienta de la tabla anterior se registra a sí misma en <code>/usr/local/share/proxmenux/installed_tools.json</code>. Abre <link>Uninstall Optimizations</link> para elegir items individuales que revertir. Los backups de los archivos de configuración modificados se dejan junto a los originales con sufijo <code>.bak</code>."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — elige exactamente qué quieres del mismo catálogo."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — revierte cualquier subconjunto de lo aplicado aquí."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de sistema útiles",
|
||||
"href": "/docs/help-info/system-commands",
|
||||
"tail": " — verifica los cambios (uptime, free, journalctl, etc.)."
|
||||
},
|
||||
{
|
||||
"label": "Resumen de Post-Install",
|
||||
"href": "/docs/post-install",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Basic Settings | ProxMenux Documentation",
|
||||
"description": "Opciones post-instalación fundamentales: cambiar a los repositorios sin suscripción de Proxmox y hacer upgrade, autodetectar la zona horaria y activar NTP, saltar la descarga de idiomas de APT, y elegir entre 25 utilidades de sistema comunes para instalar."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Basic Settings",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta categoría",
|
||||
"body": "Cuatro opciones fundamentales que normalmente quieres en cualquier host Proxmox recién instalado: cambiar a los repositorios comunitarios sin suscripción y ejecutar un upgrade completo del sistema, autoconfigurar la zona horaria y la sincronización NTP, eliminar las descargas de idiomas de APT para ahorrar ancho de banda y disco, y elegir de una lista de 25 utilidades de sistema comunes."
|
||||
},
|
||||
"upgrade": {
|
||||
"heading": "Actualizar y hacer upgrade del sistema",
|
||||
"intro": "Reconfigura APT para usar el repositorio gratuito <em>pve-no-subscription</em> (en lugar del repo enterprise que requiere suscripción) y ejecuta un upgrade completo del sistema. Los pasos exactos dependen de la versión mayor de Proxmox VE: ProxMenux la detecta y despacha al script correcto.",
|
||||
"headerVersion": "Versión PVE",
|
||||
"headerScript": "Script despachador",
|
||||
"headerCodename": "Codename Debian",
|
||||
"rows": [
|
||||
{
|
||||
"version": "9.x",
|
||||
"script": "update-pve9_2.sh",
|
||||
"codename": "trixie"
|
||||
},
|
||||
{
|
||||
"version": "8.x",
|
||||
"script": "update-pve8.sh",
|
||||
"codename": "bookworm"
|
||||
}
|
||||
],
|
||||
"officialTitle": "La recomendación oficial de Proxmox",
|
||||
"officialBody": "La guía oficial de upgrade de Proxmox es ejecutar, exactamente en este orden:",
|
||||
"officialOutro": "Esa única línea es todo lo que necesitas en cualquier release actual de Proxmox. El reto no es el comando en sí — es asegurarse de que los repositorios del host están sanos <em>antes</em> de ejecutarlo.",
|
||||
"doesTitle": "Qué hace la opción de ProxMenux — verificado contra el script",
|
||||
"doesIntro": "El update de ProxMenux envuelve los comandos apt exactos de arriba y añade una serie de pasos pre/post que tendrías que recordar tú a mano. Cada item de abajo es lo que el script despachador realmente hace (mira <link>Proxmox System Update</link> para el desglose completo):",
|
||||
"doesItems": [
|
||||
"<strong>Higiene de repositorios primero.</strong> Desactiva enterprise <code>pve-enterprise.sources</code> / <code>ceph.sources</code>, elimina archivos de repos legacy que hayan quedado de versiones anteriores de PVE, y escribe un <code>proxmox.sources</code> limpio apuntando al canal gratuito <em>pve-no-subscription</em> (coincidiendo con el codename Debian del host: trixie para PVE 9, bookworm para PVE 8).",
|
||||
"<strong>Repos Debian reescritos</strong> con main / updates / security, incluyendo <code>non-free-firmware</code>, para que la advertencia de firmware durante el upgrade desaparezca.",
|
||||
"<strong>Ejecuta el upgrade oficial.</strong> <code>apt-get update</code> seguido de <code>apt full-upgrade -y</code> (PVE 9) o <code>apt dist-upgrade -y</code> (PVE 8), ambos lanzados de forma no interactiva con <code>--force-confdef --force-confold</code> para que cualquier archivo de configuración que hayas customizado siga siendo tuyo.",
|
||||
"<strong>Instala paquetes esenciales</strong> si faltan: <code>zfsutils-linux</code>, <code>proxmox-backup-restore-image</code>, <code>chrony</code>.",
|
||||
"<strong>Comprobación de cordura de metadatos LVM.</strong> Busca VMs con passthrough de disco que puedan haber garabateado cabeceras stale de physical-volume sobre discos en bruto; avisa si hay algo raro (no hay fix automático).",
|
||||
"<strong>Limpia al final:</strong> <code>apt-get autoremove -y</code> + <code>apt-get autoclean -y</code>, y luego pregunta por un reinicio si el kernel fue actualizado o si está presente <code>/var/run/reboot-required</code>."
|
||||
],
|
||||
"shortTitle": "En resumen",
|
||||
"shortBody": "La opción ejecuta el exacto <code>apt update && apt full-upgrade -y</code> que Proxmox recomienda, lo envuelve con la limpieza de repos y la limpieza post-upgrade que la guía oficial también te dice que hagas, y pregunta por el reinicio al final. Mira <link>Proxmox System Update</link> — el mismo updater también está disponible como utilidad independiente en el menú principal, con el diagrama completo del proceso.",
|
||||
"subTitle": "No apliques esto a un host con suscripción",
|
||||
"subBody": "Si realmente tienes una suscripción de Proxmox y quieres seguir usando los repositorios enterprise, sáltate esta opción. Volver a ejecutarla desactivaría el repo enterprise y te llevaría al canal comunitario. Puedes restaurar los repos enterprise desde el menú Uninstall si cambias de opinión más tarde.",
|
||||
"safetyTitle": "Comprobación de seguridad post-update",
|
||||
"safetyBody": "Tras el upgrade, el script comprueba si hay discos con metadatos PV (Physical Volume) obsoletos — un caso límite que puede pasar cuando una VM con passthrough de disco garabatea cabeceras LVM sobre un disco en bruto. Si encuentra algo sospechoso verás un aviso sugiriendo <code>pvs</code> para inspeccionarlo. No se toma ninguna acción automáticamente."
|
||||
},
|
||||
"time": {
|
||||
"heading": "Sincronizar la hora automáticamente",
|
||||
"intro": "Detecta la IP pública del servidor vía <code>dig myip.opendns.com @resolver1.opendns.com</code>, luego consulta <code>ipapi.co/'{'ip'}'/timezone</code> para buscar la zona horaria IANA correspondiente, y la aplica con <code>timedatectl set-timezone</code>. Finalmente activa NTP con <code>timedatectl set-ntp true</code>.",
|
||||
"depTitle": "Depende de dos servicios externos",
|
||||
"depBody": "El lookup depende de que OpenDNS e <code>ipapi.co</code> sean accesibles, y de que sus respuestas sean correctas. Si ejecutas Proxmox detrás de una VPN o en una VLAN que sale por una región distinta, la zona horaria autodetectada puede ser incorrecta. En ese caso sáltate esta opción y configura la zona horaria a mano:",
|
||||
"revertTitle": "Reversible desde el menú Uninstall",
|
||||
"revertBody": "<link>Uninstall Optimizations</link> resetea la zona horaria a UTC (un valor por defecto seguro). No desactiva NTP — tu reloj sigue sincronizándose, solo anclado a UTC hasta que pongas una nueva zona horaria manualmente."
|
||||
},
|
||||
"languages": {
|
||||
"heading": "Saltar la descarga de idiomas adicionales",
|
||||
"intro": "En cada <code>apt update</code>, Debian por defecto descarga archivos de traducción para cada locale que distribuye — mucho tráfico y espacio en disco para algo que rara vez verás. Esta opción le dice a APT que solo descargue los metadatos principales. Antes de desactivarlo, ProxMenux <strong>se asegura de que el propio locale del host está realmente generado</strong> (lee <code>/etc/default/locale</code> o <code>/etc/environment</code>, lo añade a <code>/etc/locale.gen</code> si falta, y ejecuta <code>locale-gen</code>). Así no pierdes tu locale de shell como efecto colateral.",
|
||||
"writtenTitle": "Qué se escribe",
|
||||
"revertTitle": "Reversible desde el menú Uninstall",
|
||||
"revertBody": "Borrar <code>/etc/apt/apt.conf.d/99-disable-translations</code> (manualmente o desde el menú Uninstall) restaura el comportamiento por defecto y APT vuelve a descargar los archivos de idioma."
|
||||
},
|
||||
"utilities": {
|
||||
"heading": "Instalar utilidades de sistema comunes",
|
||||
"intro": "Abre un checklist con <strong>25 utilidades curadas</strong> organizadas en grupos. Elige las que quieras, confirma, y ProxMenux instala cada una vía <code>apt</code>, verificando que el paquete funcionó y mostrando un resumen al final.",
|
||||
"imageAlt": "Diálogo de checklist mostrando la lista de utilidades de sistema de ProxMenux con espacio para seleccionar y enter para confirmar",
|
||||
"reuseTitle": "La misma lista se reutiliza en otro sitio",
|
||||
"reuseBody": "El catálogo de 25 utilidades vive en una única fuente de verdad (<code>PROXMENUX_UTILS</code> en <code>scripts/global/utils-install-functions.sh</code>). El menú <em>Utilities and Tools → System Utilities</em> del menú principal de ProxMenux expone la misma lista, así que puedes volver más tarde e instalar más sin volver a ejecutar la post-instalación.",
|
||||
"listTitle": "Qué hay en la lista",
|
||||
"groups": [
|
||||
{
|
||||
"group": "Monitores de sistema",
|
||||
"items": [
|
||||
{
|
||||
"pkg": "htop",
|
||||
"desc": "Visor interactivo de procesos"
|
||||
},
|
||||
{
|
||||
"pkg": "btop",
|
||||
"desc": "Monitor de recursos moderno (CPU, RAM, discos, red, procesos)"
|
||||
},
|
||||
{
|
||||
"pkg": "s-tui",
|
||||
"desc": "UI de monitorización y stress de CPU basada en terminal"
|
||||
},
|
||||
{
|
||||
"pkg": "iftop",
|
||||
"desc": "Uso de ancho de banda por conexión en vivo"
|
||||
},
|
||||
{
|
||||
"pkg": "iotop",
|
||||
"desc": "I/O de disco por proceso"
|
||||
},
|
||||
{
|
||||
"pkg": "iptraf-ng",
|
||||
"desc": "Monitor IP LAN interactivo"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Red",
|
||||
"items": [
|
||||
{
|
||||
"pkg": "iperf3",
|
||||
"desc": "Mide el ancho de banda máximo alcanzable entre hosts"
|
||||
},
|
||||
{
|
||||
"pkg": "net-tools",
|
||||
"desc": "Herramientas legacy (ifconfig, netstat, route). Aún útiles para comprobaciones rápidas."
|
||||
},
|
||||
{
|
||||
"pkg": "ipset",
|
||||
"desc": "Gestiona grandes conjuntos de IPs en el kernel — útil con reglas iptables/nftables."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Descarga y archivos",
|
||||
"items": [
|
||||
{
|
||||
"pkg": "axel",
|
||||
"desc": "Acelerador de descarga paralela ligero"
|
||||
},
|
||||
{
|
||||
"pkg": "aria2",
|
||||
"desc": "Descargador multi-fuente / multi-protocolo (HTTP, FTP, BitTorrent, Metalink)"
|
||||
},
|
||||
{
|
||||
"pkg": "unzip",
|
||||
"desc": "Extraer archivos ZIP"
|
||||
},
|
||||
{
|
||||
"pkg": "zip",
|
||||
"desc": "Crear archivos ZIP"
|
||||
},
|
||||
{
|
||||
"pkg": "cabextract",
|
||||
"desc": "Extraer archivos CAB de Microsoft (útil al trabajar con ISOs de Windows)"
|
||||
},
|
||||
{
|
||||
"pkg": "wimtools",
|
||||
"desc": "Manipular imágenes WIM de Windows (extraer, dividir, montar, aplicar)"
|
||||
},
|
||||
{
|
||||
"pkg": "genisoimage",
|
||||
"desc": "Construir imágenes ISO 9660 desde un árbol de directorios"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Texto y archivos",
|
||||
"items": [
|
||||
{
|
||||
"pkg": "dos2unix",
|
||||
"desc": "Convertir finales de línea CRLF (Windows) a LF (Unix)"
|
||||
},
|
||||
{
|
||||
"pkg": "grc",
|
||||
"desc": "Coloreador genérico — envuelve ping, traceroute, dig, tail, etc. con resaltado de sintaxis"
|
||||
},
|
||||
{
|
||||
"pkg": "plocate",
|
||||
"desc": "Búsqueda rápida de archivos (indexada). Ejecuta `updatedb` tras instalar para construir el índice."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Remoto y sesiones",
|
||||
"items": [
|
||||
{
|
||||
"pkg": "sshpass",
|
||||
"desc": "Autenticación SSH no interactiva por contraseña — útil para scripts, no para uso diario"
|
||||
},
|
||||
{
|
||||
"pkg": "tmux",
|
||||
"desc": "Multiplexador de terminal — sesiones que se separan, paneles divididos, sobrevive a desconexiones"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Hardware y bajo nivel",
|
||||
"items": [
|
||||
{
|
||||
"pkg": "msr-tools",
|
||||
"desc": "Leer/escribir registros específicos del modelo de CPU (rdmsr, wrmsr)"
|
||||
},
|
||||
{
|
||||
"pkg": "intel-gpu-tools",
|
||||
"desc": "Utilidades de diagnóstico de GPU Intel incluyendo `intel_gpu_top`"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Virtualización",
|
||||
"items": [
|
||||
{
|
||||
"pkg": "libguestfs-tools",
|
||||
"desc": "Inspeccionar y modificar imágenes de disco de VMs (virt-ls, virt-cat, guestmount…)"
|
||||
},
|
||||
{
|
||||
"pkg": "chntpw",
|
||||
"desc": "Editar Windows SAM — útil para recuperación de contraseñas en VMs Windows que heredas"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"actionTitle": "Algunas de ellas en acción",
|
||||
"noBulkTitle": "No hay uninstall masivo para utilidades",
|
||||
"noBulkBody": "El menú Uninstall Optimizations <strong>no</strong> registra qué utilidades has instalado — solo si se aplicaron las opciones \"apt languages\", \"time sync\" y \"apt upgrade\". Para eliminar una utilidad concreta más tarde, desinstálala a mano:"
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Proxmox System Update",
|
||||
"href": "/docs/utils/system-update",
|
||||
"tail": " — vuelve a ejecutar el ciclo apt update + dist-upgrade bajo demanda."
|
||||
},
|
||||
{
|
||||
"label": "System Utilities Installer",
|
||||
"href": "/docs/utils/system-utils",
|
||||
"tail": " — instala (o reinstala) utilidades individualmente tras la post-instalación."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de actualizaciones y paquetes",
|
||||
"href": "/docs/help-info/update-commands",
|
||||
"tail": " — referencia de apt."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Script Personalizable post-instalación | ProxMenux Documentation",
|
||||
"description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE con ProxMenux. 10 categorías, ~30 herramientas individuales, UI de checklist. Incluye todo lo que hace el script Automatizado, más funcionalidades opt-in (IOMMU, Fastfetch, Figurine, Ceph, HA, fixes de AMD…).",
|
||||
"ogTitle": "Script Personalizable post-instalación | ProxMenux Documentation",
|
||||
"ogDescription": "10 categorías, ~30 optimizaciones individuales. Elige exactamente qué quieres en un host Proxmox VE. Totalmente reversible."
|
||||
},
|
||||
"header": {
|
||||
"title": "Script Personalizable post-instalación",
|
||||
"description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE. ProxMenux agrupa ~30 herramientas individuales en 10 categorías, cada una con su propio diálogo de checklist. Mismo motor que el Automatizado, pero con control total sobre qué se aplica.",
|
||||
"section": "Post-Install · Customizable"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Cuándo elegir Personalizable",
|
||||
"body": "Elige esta ruta cuando ya sabes qué tweaks quieres en el host — o cuáles definitivamente no quieres. El script presenta un checklist por categoría para que puedas preseleccionar, deseleccionar o mezclar optimizaciones. Cada item puede aplicarse otra vez más tarde (es idempotente) o revertirse desde <link>Uninstall Optimizations</link>."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Comparación con el Automatizado",
|
||||
"body": "Personalizable es un superset del <link>script Automatizado</link>. Cubre las mismas 13 optimizaciones de baseline más una larga lista de opt-ins que el Automatizado se salta a propósito — cosas que solo son útiles en hardware específico (fixes de AMD), hosting específico (OVH RTM), o cargas específicas (IOMMU/VFIO, repo de Ceph, High Availability, Fastfetch, Figurine, tuning del ARC de ZFS, pigz, ZFS auto-snapshot, límites de velocidad de vzdump, Open vSwitch, TCP BBR…)."
|
||||
},
|
||||
"categoriesSection": {
|
||||
"heading": "Las 10 categorías",
|
||||
"body": "El script Personalizable agrupa optimizaciones en 10 categorías. Cada categoría tiene su propio diálogo de checklist y su propia página de documentación — abre una de las tarjetas de abajo para ver el razonamiento, los valores por defecto y los pasos de verificación por opción."
|
||||
},
|
||||
"categories": [
|
||||
{
|
||||
"name": "Basic Settings",
|
||||
"description": "Repositorios, upgrade del sistema, zona horaria, locale, utilidades comunes."
|
||||
},
|
||||
{
|
||||
"name": "System",
|
||||
"description": "Journald, logrotate, límites del kernel, tuning de memoria, kernel panic, reinicios rápidos."
|
||||
},
|
||||
{
|
||||
"name": "Virtualization",
|
||||
"description": "Auto-instalación de guest agent, activación de IOMMU/VFIO para passthrough de PCI."
|
||||
},
|
||||
{
|
||||
"name": "Network",
|
||||
"description": "APT sobre IPv4, tuning de sysctl de red, Open vSwitch, TCP BBR, nombres de interfaz persistentes."
|
||||
},
|
||||
{
|
||||
"name": "Storage",
|
||||
"description": "Dimensionado del ARC de ZFS, ZFS auto-snapshot, límites de velocidad de backups vzdump."
|
||||
},
|
||||
{
|
||||
"name": "Security",
|
||||
"description": "Desactivar portmapper/rpcbind para reducir la superficie de ataque."
|
||||
},
|
||||
{
|
||||
"name": "Customization",
|
||||
"description": "Colores y aliases de bashrc, banner MOTD, eliminación del aviso de suscripción."
|
||||
},
|
||||
{
|
||||
"name": "Monitoring",
|
||||
"description": "OVH Real-Time Monitoring (solo en servidores detectados como OVH)."
|
||||
},
|
||||
{
|
||||
"name": "Performance",
|
||||
"description": "gzip paralelo (pigz) para compresión más rápida en backups y transferencias."
|
||||
},
|
||||
{
|
||||
"name": "Optional",
|
||||
"description": "Fixes de CPU AMD, Fastfetch, Figurine, repo de Ceph, High Availability, Log2RAM."
|
||||
}
|
||||
],
|
||||
"mixTip": {
|
||||
"title": "Mezcla Automatizado y Personalizable",
|
||||
"body": "Un patrón común: ejecutar primero <strong>Automatizado</strong> para fijar el baseline sensato, luego abrir <strong>Personalizable</strong> y elegir solo las herramientas opt-in que te interesan (por ejemplo, IOMMU en un host que va a hacer passthrough de GPU). Los cambios se registran de forma independiente; el menú Uninstall muestra todo lo que has aplicado independientemente de qué ruta lo añadió."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Automated Post-Install",
|
||||
"href": "/docs/post-install/automated",
|
||||
"tail": " — valores por defecto sensatos aplicados sin preguntas."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — revierte cualquier selección de forma limpia."
|
||||
},
|
||||
{
|
||||
"label": "Basic Settings",
|
||||
"href": "/docs/post-install/basic-settings",
|
||||
"tail": " — repos, hora, idioma, utilidades."
|
||||
},
|
||||
{
|
||||
"label": "Virtualization",
|
||||
"href": "/docs/post-install/virtualization",
|
||||
"tail": " — IOMMU + VFIO para passthrough."
|
||||
},
|
||||
{
|
||||
"label": "Security",
|
||||
"href": "/docs/post-install/security",
|
||||
"tailRich": " · <storageLink>Storage</storageLink> · <networkLink>Network</networkLink> · <customLink>Customization</customLink> — otras categorías."
|
||||
},
|
||||
{
|
||||
"label": "Resumen de Post-Install",
|
||||
"href": "/docs/post-install",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Customización | ProxMenux Documentation",
|
||||
"description": "Opciones de customización en el script post-instalación Customizable de ProxMenux: un prompt de bash con colores y aliases útiles, un banner de ProxMenux en el MOTD, y la opción de eliminar el aviso de suscripción de Proxmox de la interfaz web."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Customización",
|
||||
"description": "Tweaks cosméticos y de calidad de vida para el host Proxmox. Ninguno cambia el comportamiento funcional — solo hacen la shell más agradable de usar y ocultan el aviso de suscripción en la UI web. Los tres están registrados y son reversibles desde el menú Uninstall.",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta categoría",
|
||||
"body": "Tres opciones pequeñas e independientes: un <strong>prompt de bash con colores + aliases</strong> para la shell de root, un <strong>banner MOTD</strong> de una línea visible al hacer login por SSH, y la eliminación del <strong>popup \"No valid subscription\"</strong> que Proxmox muestra en cada login a la UI web."
|
||||
},
|
||||
"bashrc": {
|
||||
"heading": "Customizar bashrc",
|
||||
"intro": "Inyecta un bloque curado en <code>/root/.bashrc</code> con un prompt con colores, historial con marcas de tiempo, aliases estándar de <code>ls</code> / <code>grep</code> y un <code>source</code> para autocompletado de bash. Hace que trabajar sobre SSH sea bastante más agradable y deja claro en qué host estás cuando tienes muchas pestañas abiertas.",
|
||||
"writesTitle": "Qué añade ProxMenux a .bashrc",
|
||||
"writesOutro": "El bloque está delimitado por los marcadores <code>PMX_CORE_BASHRC</code>. Ejecutar el script de nuevo reemplaza el bloque anterior en lugar de duplicarlo. El <code>.bashrc</code> original se respalda una vez en <code>/root/.bashrc.bak</code>, y se añade una línea <code>source /root/.bashrc</code> a <code>/root/.bash_profile</code> para que el prompt también se aplique en shells de login (p. ej. tras <code>su -</code>).",
|
||||
"rootTitle": "Solo se aplica a root",
|
||||
"rootBody": "La customización apunta a la shell de la cuenta root. Otros usuarios que crees en el host conservan sus propios valores por defecto. Si administras Proxmox exclusivamente por la UI web y nunca usas la shell, esta opción es pura estética y puedes saltártela."
|
||||
},
|
||||
"motd": {
|
||||
"heading": "Configurar banner MOTD personalizado",
|
||||
"intro": "Antepone <em>\"This system is optimised by: ProxMenux\"</em> a <code>/etc/motd</code>, el mensaje mostrado tras un login SSH exitoso (encima del prompt de la shell, antes de que se ejecute cualquier script de <code>update-motd</code>). Inofensivo y puramente informativo — útil como confirmación visual rápida de que ProxMenux se ha aplicado en este host.",
|
||||
"writesTitle": "Qué escribe ProxMenux",
|
||||
"writesOutro": "El <code>/etc/motd</code> original se respalda en <code>/etc/motd.bak</code> en la primera aplicación. La operación es idempotente: si la línea marcador ya está presente, no se añade nada."
|
||||
},
|
||||
"banner": {
|
||||
"heading": "Eliminar banner de suscripción",
|
||||
"intro": "Elimina el modal <em>\"You do not have a valid subscription for this server\"</em> que aparece cada vez que alguien entra en la UI web de Proxmox sin una suscripción enterprise. El parche es consciente de la versión: las distintas versiones mayores de Proxmox tienen distintos bundles de UI, así que ProxMenux despacha al script correcto.",
|
||||
"versionTitle": "Despacho consciente de la versión",
|
||||
"versionItems": [
|
||||
"<strong>PVE 9.x</strong> → ejecuta <code>remove-banner-pve-v3.sh</code> (parchea tanto el <code>proxmoxlib.js</code> de escritorio como la nueva UI móvil basada en Yew).",
|
||||
"<strong>PVE 8.x</strong> → ejecuta <code>remove-banner-pve8.sh</code> (solo escritorio)."
|
||||
],
|
||||
"versionOutro": "Antes de parchear, ProxMenux respalda los archivos JS/template originales en <code>/usr/local/share/proxmenux/backups/</code> con una marca de tiempo. El flujo Uninstall usa esos backups para restaurar los archivos originales, y como fallback reinstala los paquetes de la UI de Proxmox si el backup falta o está corrupto.",
|
||||
"breakTitle": "Puede romperse tras actualizaciones de Proxmox",
|
||||
"breakBody": "Proxmox publica regularmente actualizaciones de UI que sobrescriben <code>proxmoxlib.js</code>. Cuando eso pasa, el banner vuelve. Puedes reaplicar esta opción tras cada actualización de Proxmox para volver a parchear el archivo, o simplemente aceptar el aviso hasta que la vuelvas a aplicar. ProxMenux también instala un hook APT que vuelve a parchear automáticamente en los upgrades de paquetes — mira <link>Uninstall Optimizations</link> para ver cómo se revierte ese hook.",
|
||||
"legalTitle": "Nota legal (siempre conviene repetirla)",
|
||||
"legalBody": "Esta opción solo oculta el aviso de la UI. <strong>No</strong> te concede soporte enterprise, acceso al repositorio enterprise, ni derecho alguno a distribuir Proxmox comercialmente sin suscripción. Si ejecutas Proxmox en un entorno que genera ingresos, compra una suscripción — apoya al proyecto y te da el canal enterprise estable."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verificación",
|
||||
"intro": "Tras aplicar los tres:",
|
||||
"reversibleTitle": "Los tres son reversibles",
|
||||
"reversibleBody": "<link>Uninstall Optimizations</link> restaura <code>/root/.bashrc</code> y <code>/etc/motd</code> desde sus backups <code>.bak</code>, y o bien restaura los archivos parcheados de la UI desde el directorio de backups o reinstala <code>pve-manager</code>, <code>proxmox-widget-toolkit</code>, <code>libjs-extjs</code> y <code>libpve-http-server-perl</code> con <code>--force-confnew</code> para devolver la UI web al estado vanilla."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Optional",
|
||||
"href": "/docs/post-install/optional",
|
||||
"tail": " — Fastfetch y Figurine (otras customizaciones visuales)."
|
||||
},
|
||||
{
|
||||
"label": "Mostrar información de versión",
|
||||
"href": "/docs/settings/show-version-information",
|
||||
"tail": " — confirma que las customizaciones están registradas como instaladas."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — revierte bashrc, motd, aviso de suscripción."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Script post-instalación de Proxmox VE — Automatizado y personalizable | ProxMenux",
|
||||
"description": "Resumen de los scripts post-instalación de ProxMenux para Proxmox VE. Ejecuta el script Automatizado para valores por defecto sensatos sin preguntas, el script Personalizable para elegir exactamente qué quieres entre 10 categorías (sistema, virtualización, red, almacenamiento, seguridad, rendimiento, opcional), o revierte cualquier cambio por completo con la opción Uninstall Optimizations.",
|
||||
"ogTitle": "Script post-instalación de Proxmox VE — Automatizado y personalizable",
|
||||
"ogDescription": "Aplica optimizaciones comunes post-instalación de Proxmox VE en 10 categorías — automatizadas o a la carta, con opciones reversibles.",
|
||||
"twitterTitle": "Script post-instalación de Proxmox VE | ProxMenux",
|
||||
"twitterDescription": "Optimizaciones post-instalación automatizadas y personalizables para Proxmox VE — con opciones reversibles."
|
||||
},
|
||||
"header": {
|
||||
"title": "Scripts post-instalación",
|
||||
"description": "Configura un host de Proxmox VE recién instalado con las optimizaciones post-instalación de ProxMenux. Tres rutas: ejecutar todo automáticamente, elegir lo que quieres, o revertir cualquier cambio. Todos los cambios quedan registrados.",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué sirve este menú",
|
||||
"body": "Justo después de instalar Proxmox VE, hay decenas de pequeños cambios que hacen el host más rápido y más fácil de mantener — repositorios sin suscripción, límites sensatos para journald, buffers TCP razonables, almacenamiento de logs amigable con SSD, mejoras en bashrc y más. ProxMenux los automatiza todos, registra lo que cambió y te permite revertirlo."
|
||||
},
|
||||
"openingMenu": {
|
||||
"heading": "Abrir el menú",
|
||||
"body": "Desde el menú principal de ProxMenux, selecciona <strong>Settings post-install Proxmox</strong>. Verás esto:",
|
||||
"imageAlt": "Menú de scripts post-instalación con 3 opciones de ProxMenux (Automatizado / Personalizable / Uninstall) seguidas de la sección Community Scripts"
|
||||
},
|
||||
"threeWays": {
|
||||
"heading": "Tres formas de aplicar optimizaciones",
|
||||
"body": "Las tres entradas de ProxMenux comparten el mismo código subyacente y el mismo registro de herramientas instaladas — solo te dan distintos niveles de control. Elige la que se ajusta a cuánto quieres decidir."
|
||||
},
|
||||
"routes": [
|
||||
{
|
||||
"title": "Automatizado",
|
||||
"description": "Un conjunto curado de 13 optimizaciones seguras y siempre útiles aplicadas en secuencia sin preguntas. Buen valor por defecto para la mayoría de usuarios.",
|
||||
"bullets": [
|
||||
"Repos sin suscripción + upgrade del sistema",
|
||||
"Tuning de memoria, kernel y red",
|
||||
"Log2RAM (autodetectado en SSD/NVMe)",
|
||||
"Límites de tamaño de journald + logrotate",
|
||||
"Nombres de interfaz persistentes"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Personalizable",
|
||||
"description": "~30 optimizaciones individuales en 10 categorías. Eliges exactamente cuáles aplicar. Mismo motor que el Automatizado, pero con control total.",
|
||||
"bullets": [
|
||||
"UI de checklist por categoría",
|
||||
"Incluye todo lo que hace el Automatizado, más opciones opt-in (IOMMU, Fastfetch, Figurine, Ceph, HA, fixes de AMD…)",
|
||||
"Ejecuta tantas veces como quieras — los cambios son idempotentes"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Apply Available Updates",
|
||||
"description": "Cuando una optimización post-instalación (Log2Ram, Memory Settings, Logrotate…) tiene en disco una versión más nueva que la registrada en el host, esta entrada muestra solo las que se han movido. Re-ejecuta la función correspondiente y refresca el registro — no toca nada más.",
|
||||
"bullets": [
|
||||
"Opt-in por optimización (solo lo que ha cambiado)",
|
||||
"Mismo selector disponible desde el panel del Monitor",
|
||||
"Una única notificación agrupada cuando llegan actualizaciones nuevas"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Uninstall Optimizations",
|
||||
"description": "Cada cambio hecho por cualquiera de las rutas queda registrado en un JSON, y cada optimización tiene una función inversa. Elige qué revertir y el host vuelve atrás.",
|
||||
"bullets": [
|
||||
"Detecta automáticamente las optimizaciones aplicadas previamente",
|
||||
"La reversión restaura las configuraciones originales desde archivos de backup",
|
||||
"Pregunta antes de reiniciar si hace falta (VFIO, nombres persistentes, etc.)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"whichTitle": "¿Cuál deberías elegir?",
|
||||
"whichBody": "Si es una instalación recién hecha de Proxmox y quieres el baseline sensato sin tener que decidir: <autoLink><strong>Automatizado</strong></autoLink>. Si ya sabes qué tweaks quieres (o cuáles definitivamente no quieres): <customLink><strong>Personalizable</strong></customLink>. Si algo que ya aplicaste tiene una versión más nueva en disco y solo quieres subir esa: <updatesLink><strong>Apply Available Updates</strong></updatesLink>. Si aplicaste algo antes y quieres revertirlo de forma limpia: <uninstallLink><strong>Uninstall Optimizations</strong></uninstallLink>. Puedes mezclarlas — aplicar primero Automatizado, luego abrir Personalizable para añadir opt-ins como Fastfetch o IOMMU, y revertir cualquier item individual más tarde.",
|
||||
"mixing": {
|
||||
"heading": "Mezclar con otros scripts post-instalación",
|
||||
"stackTitle": "No apiles varios scripts post-instalación",
|
||||
"stackBody": "Ejecutar varios scripts post-instalación en el mismo host puede causar archivos de configuración duplicados, entradas sysctl en conflicto, o peor — red rota tras reiniciar. Si ya aplicaste el <strong>Helper-Scripts Post Install</strong>, algunas optimizaciones de ProxMenux pueden solaparse con lo que ya configuró. Quédate con una sola herramienta post-instalación por host.",
|
||||
"xshokTitle": "xshok-proxmox: deprecado",
|
||||
"xshokBody": "Versiones anteriores de ProxMenux referenciaban <a>xshok-proxmox</a> como herramienta post-instalación complementaria. Ese proyecto ahora está deprecado y ya no se ofrece desde ProxMenux. Si una ejecución anterior de xshok-proxmox dejó marcadores en el host, ProxMenux todavía los detecta y te avisa — pero no es algo que debas instalar junto a ProxMenux hoy."
|
||||
},
|
||||
"community": {
|
||||
"heading": "Community scripts",
|
||||
"body": "El menú también expone dos scripts de terceros del proyecto <a>community-scripts</a>: <em>Proxmox VE Post Install</em> y <em>Proxmox VE Microcode</em>. Son wrappers que hacen <code>wget | bash</code> de los scripts de los autores originales. No los mantiene ProxMenux. Mira <link>External Repositories</link> para detalles y consideraciones de confianza antes de ejecutarlos."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Proxmox System Update",
|
||||
"href": "/docs/utils/system-update",
|
||||
"tail": " — mantiene el host actualizado una vez ya se ha hecho la post-instalación."
|
||||
},
|
||||
{
|
||||
"label": "Seguridad",
|
||||
"href": "/docs/security",
|
||||
"tail": " — Fail2Ban + Lynis sobre el hardening de la post-instalación."
|
||||
},
|
||||
{
|
||||
"label": "Mostrar información de versión",
|
||||
"href": "/docs/settings/show-version-information",
|
||||
"tail": " — ver qué componentes post-instalación están registrados como instalados."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de actualizaciones y paquetes",
|
||||
"href": "/docs/help-info/update-commands",
|
||||
"tail": " — referencia de apt / pveupgrade."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Monitorización | ProxMenux Documentation",
|
||||
"description": "Opciones de monitorización en el script post-instalación Customizable de ProxMenux. Por ahora una sola opción: instalar OVH Real-Time Monitoring (RTM), que solo se activa si se detecta que el host es un servidor OVH."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Monitorización",
|
||||
"description": "Opciones de monitorización dentro del script post-instalación Customizable. Esta categoría es pequeña y específica del proveedor — instala el agente OVH Real-Time Monitoring en servidores dedicados de OVH y no hace nada en cualquier otro sitio.",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Alcance estrecho a propósito",
|
||||
"body": "La monitorización post-instalación se limita a <strong>un agente específico de un proveedor</strong>. La monitorización de propósito general (Prometheus, Grafana, node_exporter) queda fuera del alcance aquí porque requiere decisiones arquitectónicas (host separado o no, retención de datos, destinos de alertas) que no encajan en un paso post-instalación de un solo clic. El propio ProxMenux Monitor, integrado en ProxMenux, cubre la mayor parte de ese rol sin necesidad de ningún agente externo."
|
||||
},
|
||||
"ovh": {
|
||||
"heading": "Instalar OVH Real-Time Monitoring (RTM)",
|
||||
"intro": "Si tu host Proxmox es un servidor dedicado alquilado a <a>OVHcloud</a>, puedes activar RTM para exponer telemetría de hardware (temperatura de CPU, estado de la fuente, SMART de discos, estado de la controladora RAID, etc.) al panel de control de OVH. Es el mismo agente que OVH usa para su propia funcionalidad \"Server Monitoring\".",
|
||||
"decisionsTitle": "Cómo decide ProxMenux",
|
||||
"decisionsItems": [
|
||||
"Obtiene la IP pública del host vía <code>curl ipinfo.io/ip</code>.",
|
||||
"Busca el ISP propietario con una consulta <code>whois</code> a <code>v4.whois.cymru.com</code>.",
|
||||
"Si el resultado menciona OVH, descarga <code>last-public-ovh-infra-yak.snap.mirrors.ovh.net/yak/archives/apply.sh</code> y lo pasa por tubería a <code>bash</code> con el manifest puppet de RTM v2.",
|
||||
"Si el resultado <em>no</em> menciona OVH, no se instala nada. La opción es un no-op."
|
||||
],
|
||||
"remoteTitle": "Script remoto pasado por tubería a bash",
|
||||
"remoteBody": "La instalación ejecuta <code>wget -qO - https://…apply.sh | bash</code>. Si el mirror de OVH se ve comprometido alguna vez, el script se ejecuta como root en tu host. Antes de activar esta opción, decide si confías más en la cadena de mirrors de OVH que en la monitorización que ganas. Para la mayoría de usuarios de home-lab o no-OVH esta opción debería quedarse simplemente apagada.",
|
||||
"noOpTitle": "Actívalo solo si el host está realmente en OVH",
|
||||
"noOpBody": "La opción es un no-op en servidores no-OVH, así que marcarla en un Proxmox de home-lab no rompe nada. Pero hoy hay un bug cosmético: incluso en servidores no-OVH el script imprime <em>\"Server belongs to OVH\"</em> al final, lo que puede inducir a error. Mira la nota de solución de problemas más abajo.",
|
||||
"runsTitle": "Qué ejecuta ProxMenux",
|
||||
"verifyTitle": "Verificación",
|
||||
"verifyBody": "En un host OVH real, tras un reinicio deberías ver el <a>panel de RTM</a> en tu OVH Manager con datos en vivo del host. En el lado de Proxmox, el colector RTM es un servicio systemd — compruébalo directamente:",
|
||||
"troubleTitle": "Solución de problemas",
|
||||
"spuriousTitle": "\"Server belongs to OVH\" pero no estoy en OVH",
|
||||
"spuriousBody": "Es una peculiaridad cosmética conocida del script actual: el mensaje de éxito se dispara fuera del condicional de detección de OVH, así que se imprime en cada ejecución. Si la instalación de RTM <em>no</em> ocurrió realmente (comprueba <code>systemctl status ovh-rtm</code> — no existirá), el mensaje es espurio y se puede ignorar. No se instaló nada en tu host.",
|
||||
"revertTitle": "No reversible desde el menú Uninstall",
|
||||
"revertBody": "No hay una entrada de uninstall dedicada para RTM. En un host OVH real, elimina los paquetes a mano con <code>apt purge ovh-*</code> y borra cualquier manifest puppet bajo <code>/etc/puppet/</code> que RTM haya instalado. En un host no-OVH no se instaló nada, así que no hay nada que revertir."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "ProxMenux Monitor",
|
||||
"href": "/docs/settings/proxmenux-monitor",
|
||||
"tail": " — panel web local para el host (funciona en cualquier proveedor, no solo OVH)."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de sistema útiles",
|
||||
"href": "/docs/help-info/system-commands",
|
||||
"tail": " — referencia de monitorización del host local."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Red | ProxMenux Documentation",
|
||||
"description": "Optimizaciones relacionadas con la red en el script post-instalación Customizable de ProxMenux: forzar APT sobre IPv4, aplicar un perfil curado de tuning de sysctl, instalar Open vSwitch, activar TCP BBR + Fast Open, y fijar nombres de interfaz a sus direcciones MAC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Red",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta categoría",
|
||||
"body": "Cinco opciones de red independientes. Dos son pequeñas (<strong>APT sobre IPv4</strong>, <strong>instalación de Open vSwitch</strong>), dos tunean el comportamiento de TCP (<strong>perfil sysctl de red</strong>, <strong>BBR + Fast Open</strong>), y una soluciona un dolor de cabeza operativo común — <strong>fijar nombres de interfaz</strong> para que una NIC nueva o una actualización de BIOS no renombre <code>enp3s0</code> a <code>enp4s0</code> y rompa tus bridges."
|
||||
},
|
||||
"ipv4": {
|
||||
"heading": "Forzar a APT a usar IPv4",
|
||||
"intro": "Escribe <code>Acquire::ForceIPv4 \"true\";</code> en <code>/etc/apt/apt.conf.d/99-force-ipv4</code>. APT entonces se niega a usar IPv6 para descargas de paquetes, incluso si el host tiene conectividad IPv6.",
|
||||
"tipTitle": "A quién beneficia",
|
||||
"tipBody": "Útil cuando tu ruta IPv6 es inestable, más lenta que IPv4, o el mirror Debian/Proxmox falla ocasionalmente sobre IPv6 (pasa). Inofensivo en hosts sin IPv6. En una red dual-stack sana, es solo una garantía de comportamiento predecible — apt no te va a sorprender con un timeout de IPv6."
|
||||
},
|
||||
"sysctl": {
|
||||
"heading": "Aplicar optimizaciones de red",
|
||||
"intro": "Escribe un perfil sysctl curado en <code>/etc/sysctl.d/99-network.conf</code> que cubre buffers de socket core, hardening de ICMP, protección básica contra spoof y tamaños de buffer TCP que tienen sentido en un hipervisor con muchos flujos concurrentes.",
|
||||
"tunedTitle": "Qué se tunea",
|
||||
"headerArea": "Área",
|
||||
"headerSettings": "Ajustes clave",
|
||||
"rows": [
|
||||
{
|
||||
"area": "Buffers de socket core",
|
||||
"settings": "<code>netdev_max_backlog=8192</code>, <code>rmem_max=16M</code>, <code>wmem_max=16M</code>, <code>somaxconn=8192</code>"
|
||||
},
|
||||
{
|
||||
"area": "Hardening de ICMP",
|
||||
"settings": "<code>icmp_echo_ignore_broadcasts=1</code>, <code>icmp_ignore_bogus_error_responses=1</code>"
|
||||
},
|
||||
{
|
||||
"area": "Seguridad de routing",
|
||||
"settings": "<code>accept_redirects=0</code>, <code>accept_source_route=0</code>, <code>secure_redirects=0</code>, <code>send_redirects=0</code>"
|
||||
},
|
||||
{
|
||||
"area": "Reverse path filter",
|
||||
"settings": "<code>rp_filter=2</code> (modo loose, mira la nota abajo)"
|
||||
},
|
||||
{
|
||||
"area": "TCP",
|
||||
"settings": "<code>tcp_mtu_probing=1</code>, <code>tcp_rfc1337=1</code>, <code>tcp_sack=1</code>, <code>tcp_rmem=8K/87K/16M</code>, <code>tcp_wmem=8K/64K/16M</code>"
|
||||
},
|
||||
{
|
||||
"area": "Puertos",
|
||||
"settings": "<code>ip_local_port_range=1024 65535</code> (pool de puertos efímeros)"
|
||||
},
|
||||
{
|
||||
"area": "Sockets Unix",
|
||||
"settings": "<code>net.unix.max_dgram_qlen=4096</code>"
|
||||
}
|
||||
],
|
||||
"sourceOutro": "También añade <code>source /etc/network/interfaces.d/*</code> a <code>/etc/network/interfaces</code> si no está ya presente — práctica estándar para que puedas dejar snippets modulares de interfaz sin editar el archivo principal.",
|
||||
"rpFilterTitle": "Por qué rp_filter=2 (loose) en lugar de 1 (strict)",
|
||||
"rpFilterBody": "El reverse-path filtering strict descarta paquetes cuya fuente se rutearía por una interfaz <em>distinta</em>. Es el valor por defecto correcto en una máquina cliente, pero rompe gravemente en un host Proxmox donde el tráfico de VMs a menudo llega por un bridge y sale por un uplink con rutas asimétricas. <code>rp_filter=2</code> (loose) solo descarta paquetes con fuentes verdaderamente no enrutables. Es un trade-off pragmático — ligera reducción en la detección de spoofing de IP local a cambio de no romper tu red de VMs."
|
||||
},
|
||||
"ovs": {
|
||||
"heading": "Instalar Open vSwitch",
|
||||
"intro": "Instala <code>openvswitch-switch</code> + <code>openvswitch-common</code>. Estos paquetes añaden OVS como implementación alternativa de bridges a los bridges Linux estándar que Proxmox usa por defecto. La instalación por sí sola no cambia ninguna configuración de red — los bridges <code>vmbrX</code> existentes siguen funcionando. OVS pasa a estar disponible en la UI de Proxmox cuando <em>creas</em> un bridge nuevo y lo eliges del desplegable de tipo.",
|
||||
"tipTitle": "Cuándo tiene sentido OVS",
|
||||
"tipBody": "Considera OVS si necesitas <strong>trunking VLAN con IDs de VLAN no contiguos</strong>, <strong>LACP con LLDP en modos específicos</strong>, <strong>programación de flujos granular</strong> (OpenFlow), o interoperación con controladores SDN. Para un home lab con un par de VLANs y un único uplink LACP, los bridges Linux estándar + <code>vmbrX.VID</code> son más simples y van perfectamente bien.",
|
||||
"revertTitle": "No reversible desde el menú Uninstall",
|
||||
"revertBody": "La instalación de OVS no se registra en Uninstall Optimizations. Si decides que no lo quieres, elimínalo a mano — pero solo después de migrar cualquier bridge de vuelta a bridges Linux:"
|
||||
},
|
||||
"bbr": {
|
||||
"heading": "Activar TCP BBR + TCP Fast Open",
|
||||
"intro": "Escribe dos archivos sysctl y los recarga. BBR sustituye el control de congestión por defecto CUBIC por el algoritmo basado en ancho de banda de Google, que maneja long-fat pipes y enlaces con pérdidas mucho mejor. TCP Fast Open (TFO) elimina un round trip en conexiones TCP repetidas al transportar datos en el SYN.",
|
||||
"verifyTitle": "Verificación",
|
||||
"impactTitle": "El impacto depende de la carga",
|
||||
"impactBody": "BBR brilla en enlaces de alta latencia o con pérdidas (replicación intercontinental, túneles VPN, clientes móviles). En una LAN entre dos máquinas en el mismo switch, la diferencia a menudo está dentro del ruido. TFO ayuda más a conexiones HTTP cortas y repetidas.",
|
||||
"revertTitle": "No reversible desde el menú Uninstall",
|
||||
"revertBody": "BBR/TFO no se registran. Para revertir, quita los dos archivos sysctl y recarga:"
|
||||
},
|
||||
"names": {
|
||||
"heading": "Nombres de interfaz (persistentes)",
|
||||
"intro": "Itera sobre cada NIC física que tiene el host (saltándose loopback, veths de Docker, bridges, dispositivos TAP, bonds, Cilium, ZeroTier, WireGuard) y escribe un archivo <code>.link</code> de systemd que vincula el nombre de interfaz actual a la dirección MAC actual. La lógica de naming del kernel ya no puede renombrar esa NIC — el MAC gana.",
|
||||
"whyTitle": "Por qué importa",
|
||||
"whyItems": [
|
||||
"Añadir o quitar dispositivos PCIe puede desplazar la numeración del bus, convirtiendo <code>enp3s0</code> en <code>enp4s0</code>. Si tu <code>/etc/network/interfaces</code> referencia el nombre antiguo, el bridge desaparece al reiniciar.",
|
||||
"Actualizaciones de BIOS / firmware a veces cambian cómo se enumeran los dispositivos, con el mismo efecto.",
|
||||
"Contenedores LXC con NICs <code>hotplug</code> y enlaces bonded pueden hacer race en el arranque y acabar nombrados de forma inconsistente. Fijarlos lo soluciona."
|
||||
],
|
||||
"writtenTitle": "Qué se escribe",
|
||||
"writtenIntro": "Un archivo por NIC física, en <code>/etc/systemd/network/10-<iface>.link</code>:",
|
||||
"writtenOutro": "Cualquier archivo <code>.link</code> preexistente en ese directorio se copia a <code>/etc/systemd/network/backup-<timestamp>/</code> antes de tocar nada.",
|
||||
"pveTitle": "PVE 9 vs PVE 8",
|
||||
"pveBody": "En Proxmox VE 9 (<code>systemd-networkd</code> nativo), el script recarga las reglas udev tras escribir los archivos <code>.link</code> para que las nuevas NICs hotplug cojan el nombre correcto sin reiniciar. En PVE 8 (<code>ifupdown2</code>), el naming de interfaz se resuelve en el arranque de todos modos — se requiere un reinicio para que los cambios surtan efecto. El script activa el flag de reinicio en cualquier caso para que Personalizable te lo pregunte.",
|
||||
"reviewTitle": "Revisa antes el /etc/network/interfaces existente",
|
||||
"reviewBody": "Si tu host tiene configuración legacy en <code>/etc/network/interfaces</code> que referencia nombres de NIC generados por el esquema por defecto del kernel, fijar los nombres <em>de hoy</em> es exactamente lo que quieres. Pero si ya has customizado manualmente la configuración alrededor de nombres específicos, comprueba dos veces que el pinning coincide con lo que el archivo interfaces espera antes de reiniciar.",
|
||||
"revertTitle": "Reversible desde el menú Uninstall",
|
||||
"revertBody": "<link>Uninstall Optimizations</link> borra cada archivo <code>.link</code> de <code>/etc/systemd/network/</code>, restaurando el naming por defecto del kernel en el siguiente reinicio. El backup con marca de tiempo de los archivos originales se queda por si necesitas restaurar alguno manualmente."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Gestión de Red",
|
||||
"href": "/docs/network",
|
||||
"tail": " — diagnósticos, análisis de bridges, reparaciones guiadas."
|
||||
},
|
||||
{
|
||||
"label": "Nombres de interfaz persistentes",
|
||||
"href": "/docs/network/persistent-names",
|
||||
"tail": " — la misma idea expuesta como su propio menú más tarde (usa uno u otro, no ambos)."
|
||||
},
|
||||
{
|
||||
"label": "Referencia de comandos de red",
|
||||
"href": "/docs/help-info/network-commands",
|
||||
"tail": " — ip, ss, ethtool, sysctl."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — revierte cualquiera de estos cambios de red."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Post-instalación: Optional Settings",
|
||||
"description": "Guía de Optional Settings en el script post-instalación de ProxMenux para funcionalidades y optimizaciones adicionales de Proxmox VE.",
|
||||
"ogTitle": "ProxMenux Post-instalación: Optional Settings",
|
||||
"ogDescription": "Guía de Optional Settings en el script post-instalación de ProxMenux para funcionalidades y optimizaciones adicionales de Proxmox VE.",
|
||||
"ogImageAlt": "ProxMenux Post-instalación Optional Settings"
|
||||
},
|
||||
"title": "Optional Settings",
|
||||
"intro": "La categoría <strong>Optional Settings</strong> ofrece funcionalidades y optimizaciones adicionales que puedes elegir aplicar a tu instalación de Proxmox VE. Estos ajustes no son esenciales pero pueden mejorar las capacidades de tu sistema en escenarios específicos.",
|
||||
"available": "Funcionalidades opcionales disponibles",
|
||||
"ceph": {
|
||||
"title": "Añadir soporte Ceph más reciente",
|
||||
"intro": "Esta opción instala el soporte más reciente del sistema de almacenamiento Ceph para Proxmox VE. Ceph es un sistema de almacenamiento distribuido que ofrece alto rendimiento, fiabilidad y escalabilidad.",
|
||||
"doesIntro": "Qué hace:",
|
||||
"doesItems": [
|
||||
"Añade el repositorio de Ceph a tu sistema",
|
||||
"Actualiza las listas de paquetes",
|
||||
"Instala los paquetes Ceph usando el comando 'pveceph install'",
|
||||
"Verifica la instalación"
|
||||
],
|
||||
"howUse": "Cómo usarlo: Tras la instalación, puedes configurar y gestionar almacenamiento Ceph usando la interfaz web de Proxmox VE o herramientas de línea de comandos.",
|
||||
"automates": "Este ajuste automatiza los siguientes comandos:"
|
||||
},
|
||||
"amd": {
|
||||
"title": "Aplicar fixes para CPUs AMD",
|
||||
"intro": "Esta opción aplica fixes específicos para CPUs AMD EPYC y Ryzen para mejorar la estabilidad y la compatibilidad.",
|
||||
"doesIntro": "Qué hace:",
|
||||
"doesItems": [
|
||||
"Detecta si hay presente una CPU AMD EPYC o Ryzen",
|
||||
"Aplica el parámetro de kernel 'idle=nomwait' para prevenir crashes aleatorios",
|
||||
"Configura KVM para que ignore ciertos MSRs (Model Specific Registers) y mejorar la compatibilidad con guests Windows",
|
||||
"Instala el último kernel de Proxmox VE"
|
||||
],
|
||||
"howUse": "Cómo usarlo: Estos fixes se aplican automáticamente y requieren un reinicio del sistema para surtir efecto.",
|
||||
"automates": "Este ajuste automatiza los siguientes comandos:"
|
||||
},
|
||||
"ha": {
|
||||
"title": "Activar servicios High Availability",
|
||||
"intro": "Esta opción activa los servicios High Availability (HA) en Proxmox VE, permitiendo failover automático de VMs y contenedores en caso de fallo de un nodo.",
|
||||
"doesIntro": "Qué hace:",
|
||||
"doesItems": [
|
||||
"Activa y arranca el servicio pve-ha-lrm (Local Resource Manager)",
|
||||
"Activa y arranca el servicio pve-ha-crm (Cluster Resource Manager)",
|
||||
"Activa y arranca el servicio corosync para la comunicación del cluster"
|
||||
],
|
||||
"howUse": "Cómo usarlo: Tras activar estos servicios, puedes configurar grupos y recursos HA en la interfaz web de Proxmox VE.",
|
||||
"automates": "Este ajuste automatiza los siguientes comandos:"
|
||||
},
|
||||
"testing": {
|
||||
"title": "Activar el repositorio testing de Proxmox",
|
||||
"intro": "Esta opción activa el repositorio testing de Proxmox, dando acceso a las versiones más recientes y potencialmente inestables de los paquetes de Proxmox VE.",
|
||||
"doesIntro": "Qué hace:",
|
||||
"doesItems": [
|
||||
"Añade el repositorio testing de Proxmox a las fuentes de paquetes del sistema",
|
||||
"Crea un archivo nuevo en /etc/apt/sources.list.d/ para el repositorio testing",
|
||||
"Actualiza las listas de paquetes para incluir paquetes del nuevo repositorio"
|
||||
],
|
||||
"howUse": "Cómo usarlo: Tras activar este repositorio, puedes actualizar y hacer upgrade de tu sistema para obtener las últimas versiones testing de los paquetes de Proxmox VE. Úsalo con precaución ya que estas versiones pueden ser inestables.",
|
||||
"manualIntro": "Para añadir el repositorio testing de Proxmox manualmente, puedes usar estos comandos:",
|
||||
"noteLabel": "Nota:",
|
||||
"noteBody": "$(lsb_release -cs) detecta automáticamente el codename de la versión de tu Proxmox VE (p. ej., bullseye).",
|
||||
"warnLabel": "Advertencia:",
|
||||
"warnBody": "Activar el repositorio testing puede provocar inestabilidad del sistema. Se recomienda solo para entornos de pruebas."
|
||||
},
|
||||
"fastfetch": {
|
||||
"title": "Instalar y configurar Fastfetch",
|
||||
"intro": "Esta opción instala y configura silenciosamente Fastfetch, una herramienta de información del sistema que muestra las specs del sistema y un logo personalizado al hacer login.",
|
||||
"doesLabel": "Qué hace:",
|
||||
"doesItems": [
|
||||
"Descarga e instala silenciosamente la última versión de Fastfetch",
|
||||
"Te permite elegir un logo personalizado (<strong>ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology</strong>, o uno custom)",
|
||||
"Configura Fastfetch para mostrar <em>\"System optimised by ProxMenux\"</em>",
|
||||
"Configura Fastfetch para que se ejecute automáticamente al hacer login en consola"
|
||||
],
|
||||
"importantLabel": "Importante:",
|
||||
"importantBody": "Si te conectas a Proxmox por SSH, deberías seleccionar el logo <strong>Proxmox</strong> o crear uno custom usando <code>jp2a</code> o <code>img2txt</code>. Los otros logos se generan usando <code>chafa</code> y pueden no mostrarse correctamente en una sesión SSH estándar.",
|
||||
"customLabel": "Logos personalizados:",
|
||||
"customBody1": "Para usar un logo personalizado, coloca tu archivo de texto ASCII art en: <code>/usr/local/share/fastfetch/logos/</code>",
|
||||
"customBody2": "Puedes crear logos personalizados usando herramientas como <code>chafa</code>, <code>jp2a</code> o <code>img2txt</code>.",
|
||||
"customBody3": "Para mejores resultados:",
|
||||
"customItems": [
|
||||
"Mantén la altura del logo en 35 líneas o menos para preservar las proporciones y que quepa en el terminal",
|
||||
"Usa <code>chafa</code> para logos a color (puede no mostrarse correctamente en sesiones SSH)",
|
||||
"Usa <code>jp2a</code> o <code>img2txt</code> para logos compatibles con SSH"
|
||||
],
|
||||
"examplesLabel": "Logos de ejemplo:",
|
||||
"logos": [
|
||||
{
|
||||
"name": "ProxMenux",
|
||||
"alt": "Logo de ProxMenux",
|
||||
"src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmenux.png"
|
||||
},
|
||||
{
|
||||
"name": "Proxmox",
|
||||
"alt": "Logo de Proxmox",
|
||||
"src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmox.png"
|
||||
},
|
||||
{
|
||||
"name": "JC Channel",
|
||||
"alt": "Logo de JC Channel",
|
||||
"src": "/fastfetch/jc-channel.png"
|
||||
},
|
||||
{
|
||||
"name": "Helper-Scripts",
|
||||
"alt": "Logo de Helper-Scripts",
|
||||
"src": "https://macrimi.github.io/ProxMenux/fastfetch/helper-scripts.png"
|
||||
},
|
||||
{
|
||||
"name": "Home-Labs-Club",
|
||||
"alt": "Logo de Home-Labs-Club",
|
||||
"src": "https://macrimi.github.io/ProxMenux/fastfetch/home-labs-club.png"
|
||||
},
|
||||
{
|
||||
"name": "Proxmology",
|
||||
"alt": "Logo de Proxmology",
|
||||
"src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmology.png"
|
||||
}
|
||||
],
|
||||
"automates": "Este ajuste automatiza los siguientes comandos:"
|
||||
},
|
||||
"figurine": {
|
||||
"title": "Instalar y configurar Figurine",
|
||||
"intro": "Esta opción instala y configura Figurine, una herramienta que crea banners de texto ASCII con estilo para tu terminal, mostrando tu hostname en un formato 3D atractivo visualmente.",
|
||||
"doesLabel": "Qué hace:",
|
||||
"doesItems": [
|
||||
"Descarga e instala Figurine v2.0.0 desde GitHub",
|
||||
"Crea un mensaje de bienvenida que muestra tu hostname en ASCII art 3D al hacer login",
|
||||
"Elimina automáticamente cualquier instalación previa de Figurine si la hay",
|
||||
"Configura el mensaje de bienvenida para que se ejecute automáticamente al hacer login"
|
||||
],
|
||||
"practicalLabel": "Uso práctico:",
|
||||
"practicalBody": "Cuando gestionas varios nodos Proxmox en un cluster, Figurine proporciona una indicación visual inmediata de en qué nodo estás logueado. Esto ayuda a prevenir comandos accidentales en el nodo equivocado y mejora tu flujo de trabajo al gestionar varios servidores.",
|
||||
"exampleLabel": "Salida de ejemplo:",
|
||||
"imageAlt": "Salida de ejemplo de Figurine",
|
||||
"automates": "Este ajuste automatiza el siguiente proceso:",
|
||||
"outro": "Tras la instalación, verás tu hostname mostrado en ASCII art 3D cada vez que hagas login, dejando claro inmediatamente con qué nodo Proxmox estás trabajando."
|
||||
},
|
||||
"autoApplication": {
|
||||
"title": "Aplicación automática",
|
||||
"body": "Estas funcionalidades opcionales solo se aplican cuando se seleccionan específicamente durante el proceso post-instalación. Cada funcionalidad puede elegirse individualmente según tus necesidades y preferencias específicas."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Rendimiento | ProxMenux Documentation",
|
||||
"description": "Opciones de rendimiento en el script post-instalación Customizable de ProxMenux. Sustituye gzip de un solo hilo por pigz (gzip paralelo) para backups y compresión más rápidos en hosts multinúcleo."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Rendimiento",
|
||||
"description": "Opciones de rendimiento dentro del script post-instalación Customizable. Por ahora esta categoría contiene una sola optimización: sustituir gzip por pigz para que los backups y la compresión usen todos los núcleos de la CPU en lugar de uno.",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta categoría",
|
||||
"body": "La única opción de rendimiento aquí redirige el gzip del sistema a una implementación paralela. Otros ajustes relacionados con el rendimiento (tuning de memoria, scheduling de I/O, dimensionado del ARC de ZFS, límites del kernel) viven en sus propias categorías (<em>Sistema</em>, <em>Almacenamiento</em>) porque afectan a subsistemas distintos."
|
||||
},
|
||||
"pigz": {
|
||||
"heading": "Usar pigz para compresión gzip más rápida",
|
||||
"intro": "El <code>gzip</code> estándar comprime datos usando <strong>un solo núcleo de CPU</strong>. En hosts Proxmox modernos con 8, 16 o 32 núcleos, eso es un cuello de botella enorme durante backups <code>vzdump</code> de VM/CT, rotación de logs y cualquier otra cosa que pase por <code>gzip</code>. <a>pigz</a> es un reemplazo paralelo drop-in: misma salida compatible con gzip, pero reparte el trabajo entre todos los núcleos.",
|
||||
"doesTitle": "Qué hace ProxMenux",
|
||||
"doesIntro": "Cuatro pasos, todos idempotentes:",
|
||||
"doesItems": [
|
||||
"Establece <code>pigz: 1</code> en <code>/etc/vzdump.conf</code> para que la herramienta de backup de Proxmox use pigz de forma nativa.",
|
||||
"Instala el paquete apt <code>pigz</code> si no está presente.",
|
||||
"Escribe un script wrapper en <code>/bin/pigzwrapper</code> que reenvía todos los argumentos a <code>/usr/bin/pigz</code>.",
|
||||
"Aparta el binario original <code>/bin/gzip</code> a <code>/bin/gzip.original</code> y sustituye <code>/bin/gzip</code> por el wrapper. A partir de ahí, <em>cualquier cosa</em> que llame a <code>gzip</code> — logrotate, <code>tar czf</code>, scripts, vzdump — usa pigz de forma transparente."
|
||||
],
|
||||
"replacesTitle": "Esto sustituye un binario del sistema",
|
||||
"replacesBody": "Sustituir <code>/bin/gzip</code> por un wrapper es inusual. Es seguro (el wrapper produce salida compatible con gzip), pero conviene saberlo: scripts que tengan paths hardcodeados, que se ejecuten dentro de chroots restrictivos o que verifiquen hashes de binarios pueden comportarse de forma distinta. El binario original se conserva como <code>/bin/gzip.original</code> para que siempre puedas dar marcha atrás.",
|
||||
"revertTitle": "No reversible desde el menú Uninstall",
|
||||
"revertBody": "Esta optimización se aplica desde Customizable, pero <strong>actualmente no tiene una entrada equivalente en el menú Uninstall Optimizations</strong>. Para revertirla a mano, restaura el gzip original y borra el wrapper:",
|
||||
"verifyTitle": "Verificación",
|
||||
"verifyBody": "Tras aplicar, <code>gzip --version</code> debería mencionar pigz. Un benchmark rápido también muestra la diferencia de velocidad en un host multinúcleo:",
|
||||
"whenTitle": "Cuándo importa más",
|
||||
"whenBody": "El impacto escala con <strong>cuántos núcleos tiene el host</strong> y <strong>con qué frecuencia ejecutas backups</strong>. En una caja de home-lab de 2 núcleos con un vzdump diario, el beneficio es marginal. En un host de producción de 16 núcleos haciendo backup de una docena de VMs cada noche, pigz puede recortar la ventana de backup a una fracción de lo que tarda el gzip de un solo hilo."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Comandos de backup y restauración",
|
||||
"href": "/docs/help-info/backup-commands",
|
||||
"tailRich": " — referencia de la CLI de vzdump, incluida la opción <code>--pigz</code> threads."
|
||||
},
|
||||
{
|
||||
"label": "Almacenamiento",
|
||||
"href": "/docs/post-install/storage",
|
||||
"tail": " — límites de velocidad de vzdump y tuning del ARC de ZFS."
|
||||
},
|
||||
{
|
||||
"label": "Sistema",
|
||||
"href": "/docs/post-install/system",
|
||||
"tail": " — tuning de descriptores de fichero y de memoria."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Seguridad | ProxMenux Documentation",
|
||||
"description": "Opciones de seguridad disponibles en el script post-instalación Customizable de ProxMenux. Por ahora una sola opción: desactivar el servicio portmapper/rpcbind para reducir la superficie de ataque del host."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Seguridad",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta categoría",
|
||||
"body": "La seguridad post-instalación se limita al <strong>hardening del host que es seguro aplicar sin supervisión</strong> — cosas que desactivan servicios que casi nadie necesita y que se pueden deshacer desde el menú Uninstall. Las herramientas de seguridad activa (Fail2Ban para prevención de intrusiones, Lynis para auditoría) viven bajo la entrada dedicada <em>Seguridad</em> del menú principal de ProxMenux, no aquí en post-instalación."
|
||||
},
|
||||
"rpcbind": {
|
||||
"heading": "Desactivar portmapper / rpcbind",
|
||||
"intro": "<code>rpcbind</code> (antes <code>portmap</code>) es un servicio que mapea números de programa RPC a puertos de red. Es una dependencia para NFS y algunas herramientas legacy basadas en RPC. En un host Proxmox típico que no actúa como servidor NFS, <strong>nada lo usa</strong> — y dejarlo activo mantiene el puerto <code>111/tcp</code> escuchando en cada interfaz.",
|
||||
"whyTitle": "Por qué merece la pena desactivarlo",
|
||||
"whyItems": [
|
||||
"Reduce la superficie de ataque del host — un servicio menos en escucha del que preocuparse.",
|
||||
"Históricamente se ha abusado de él como vector de reflexión/amplificación en ataques DDoS. Desactivar <code>rpcbind</code> elimina ese factor de amplificación en tu host.",
|
||||
"Quita el ruido que genera en logs y en la salida de <code>netstat</code> / <code>ss</code>, haciendo más fácil detectar actividad real."
|
||||
],
|
||||
"nfsTitle": "No desactives esto si usas NFS",
|
||||
"nfsBody": "El servidor NFS <strong>y</strong> el cliente NFS dependen de <code>rpcbind</code> para negociar los puertos que usan <code>mountd</code>, <code>statd</code>, <code>lockd</code>, etc. Si tu host Proxmox <em>exporta</em> shares NFS a otras máquinas o <em>monta</em> shares NFS desde un NAS, no apliques esta opción. Los montajes fallarán con <code>mount.nfs: rpc.statd is not running</code> o similar.",
|
||||
"runsTitle": "Qué ejecuta ProxMenux",
|
||||
"runsOutro": "El paquete se queda instalado (para que tú u otra herramienta podáis reactivarlo más tarde). La unidad de servicio se desactiva para que el servicio no vuelva tras un reinicio.",
|
||||
"verifyTitle": "Verificación",
|
||||
"verifyBody": "Tras aplicar, confirma que <code>rpcbind</code> está apagado y que nada escucha en el puerto 111:",
|
||||
"reversibleTitle": "Reversible desde el menú Uninstall",
|
||||
"reversibleBody": "Este cambio queda registrado. Abre <link>Uninstall Optimizations</link> y elige <em>RPC Disable</em> para restaurarlo. No se purga nada del sistema — simplemente se vuelve a activar el servicio y arranca de nuevo."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Menú de Seguridad",
|
||||
"href": "/docs/security",
|
||||
"tail": " — los pesos pesados: Fail2Ban (prevención de intrusiones) y Lynis (auditoría)."
|
||||
},
|
||||
{
|
||||
"label": "Lynis",
|
||||
"href": "/docs/security/lynis",
|
||||
"tail": " — audita el host para encontrar más oportunidades de hardening."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de sistema útiles",
|
||||
"href": "/docs/help-info/system-commands",
|
||||
"tail": " — estado de servicios, journalctl, referencia de lynis audit."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,158 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Almacenamiento | ProxMenux Documentation",
|
||||
"description": "Optimizaciones de almacenamiento en el script post-instalación Customizable de ProxMenux: dimensionado del ARC de ZFS basado en la RAM del host, zfs-auto-snapshot para snapshots periódicas, y eliminación de los límites de velocidad de backups vzdump."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Almacenamiento",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta categoría",
|
||||
"body": "Tres optimizaciones relacionadas con almacenamiento: tunear el tamaño de la caché <strong>ARC de ZFS</strong> a una fracción sensata de la RAM del host, instalar y programar <strong>auto-snapshots de ZFS</strong>, y eliminar throttles de <strong>vzdump</strong> para que los backups corran a máxima velocidad. Las tres son independientes — elige las que se ajusten a tu setup."
|
||||
},
|
||||
"notTrackedTitle": "Ninguna de estas está en el menú Uninstall",
|
||||
"notTrackedBody": "A diferencia de la mayoría de optimizaciones post-instalación, las tres opciones de Almacenamiento <strong>no se registran actualmente</strong> en el flujo Uninstall Optimizations. Si las aplicas y más tarde quieres revertir, tendrás que hacerlo a mano. Los comandos manuales de rollback se muestran bajo cada sección.",
|
||||
"arc": {
|
||||
"heading": "Optimizar el tamaño del ARC de ZFS",
|
||||
"intro": "El <strong>Adaptive Replacement Cache (ARC)</strong> es la caché de lectura en memoria de ZFS. Sin tuning explícito, ZFS coge alegremente hasta la mitad de la RAM del host para sí mismo, lo que es excesivo en un host Proxmox que también necesita memoria para VMs y LXCs. Esta opción limita el ARC a una fracción sensata de la RAM total según el tamaño de la máquina.",
|
||||
"sizingTitle": "Reglas de dimensionado",
|
||||
"headerRam": "RAM del host",
|
||||
"headerMin": "ARC mín",
|
||||
"headerMax": "ARC máx",
|
||||
"rows": [
|
||||
{
|
||||
"ram": "≤ 16 GB",
|
||||
"min": "512 MB",
|
||||
"max": "512 MB"
|
||||
},
|
||||
{
|
||||
"ram": "17 – 32 GB",
|
||||
"min": "1 GB",
|
||||
"max": "1 GB"
|
||||
},
|
||||
{
|
||||
"ram": "> 32 GB",
|
||||
"min": "RAM / 16",
|
||||
"max": "RAM / 8"
|
||||
}
|
||||
],
|
||||
"after": "En un host de 64 GB, eso significa 4 GB mín / 8 GB máx para el ARC. La config se escribe en <code>/etc/modprobe.d/99-zfsarc.conf</code> y activa unos cuantos tunables ZFS extra (L2ARC prefetch activo, L2ARC write max en 500 MB, timeout TXG más largo).",
|
||||
"rebootTitle": "Requiere reinicio para surtir efecto",
|
||||
"rebootBody": "Los ajustes del ARC se leen cuando se carga el módulo del kernel <code>zfs</code>. <strong>No</strong> se aplican en un sistema en vivo — necesitarás reiniciar el host para que el límite entre en juego. El script activa el flag de \"se requiere reinicio\" automáticamente.",
|
||||
"safeTitle": "Seguro en hosts sin ZFS",
|
||||
"safeBody": "La función comprueba el comando <code>zfs</code> antes de tocar nada. En hosts Proxmox solo ext4 / LVM, marcar esta opción es un no-op — no se escribe nada.",
|
||||
"verifyTitle": "Verificación y rollback manual"
|
||||
},
|
||||
"autoSnap": {
|
||||
"heading": "Instalar ZFS auto-snapshot",
|
||||
"intro": "Instala el paquete <a>zfs-auto-snapshot</a> y reescribe sus schedules cron para que se tomen snapshots automáticamente en varios intervalos. Una gran red de seguridad sin esfuerzo encima de tus backups regulares con vzdump.",
|
||||
"cadenceTitle": "Cadencia de snapshots que configura ProxMenux",
|
||||
"headerLabel": "Etiqueta",
|
||||
"headerRuns": "Cuándo se ejecuta",
|
||||
"headerKept": "Snapshots conservadas",
|
||||
"rows": [
|
||||
{
|
||||
"label": "frequent",
|
||||
"runs": "cada 15 min",
|
||||
"kept": "4"
|
||||
},
|
||||
{
|
||||
"label": "hourly",
|
||||
"runs": "cada hora",
|
||||
"kept": "1"
|
||||
},
|
||||
{
|
||||
"label": "daily",
|
||||
"runs": "una vez al día",
|
||||
"kept": "1"
|
||||
},
|
||||
{
|
||||
"label": "weekly",
|
||||
"runs": "una vez por semana",
|
||||
"kept": "1"
|
||||
},
|
||||
{
|
||||
"label": "monthly",
|
||||
"runs": "una vez al mes",
|
||||
"kept": "1"
|
||||
}
|
||||
],
|
||||
"conservativeTitle": "Conteos de retención conservadores",
|
||||
"conservativeBody": "ProxMenux viene con una retención conservadora (solo 4 frequent + 1 de cada intervalo más largo) para que el almacenamiento de snapshots de ZFS no se infle. Si quieres una retención mayor, edita los números en <code>/etc/cron.d/zfs-auto-snapshot</code>, <code>/etc/cron.hourly/zfs-auto-snapshot</code>, etc. después de ejecutar el script.",
|
||||
"onlyZfsTitle": "Solo útil en pools ZFS",
|
||||
"onlyZfsBody": "Instalar el paquete en un host solo ext4 es inofensivo pero inútil — no hay datasets ZFS de los que tomar snapshot. Sáltate esta opción si no usas ZFS.",
|
||||
"verifyTitle": "Verificación y rollback manual"
|
||||
},
|
||||
"autotrim": {
|
||||
"heading": "Activar ZFS autotrim (pools SSD/NVMe)",
|
||||
"intro": "Activa la propiedad <code>autotrim</code> en cada pool ZFS que esté respaldado exclusivamente por SSDs o NVMe con soporte TRIM. Los pools que incluyen un solo vdev HDD se saltan automáticamente — TRIM en discos rotacionales no tiene sentido y ZFS lo rechazará. Los pools que ya estaban configurados con <code>autotrim=on</code> se dejan como están.",
|
||||
"trimTitle": "Qué hace TRIM, y por qué importa en ZFS",
|
||||
"trimBody1": "Las SSDs / NVMe gestionan el almacenamiento interno en erase blocks de tamaño fijo que son mucho mayores que los sectores lógicos con los que habla el sistema de archivos. Cuando un sistema de archivos borra un archivo, el disco no lo sabe — sigue pensando que esos sectores están en uso, así que su garbage collector interno sigue moviendo datos obsoletos para liberar nuevos erase blocks. <strong>TRIM</strong> es el comando estándar que el SO usa para decirle al disco \"estos sectores ya están libres, puedes borrarlos por adelantado\".",
|
||||
"trimBody2": "Sin TRIM, el rendimiento de la SSD se degrada con el tiempo a medida que el disco se queda sin bloques pre-borrados y tiene que hacer erase-on-write, y la amplificación de escritura aumenta — ambas cosas acortan la vida útil del disco. Con TRIM activado, el disco puede mantener un pool saludable de bloques vacíos listos para escribir.",
|
||||
"trimBody3": "En ZFS, <code>autotrim=on</code> es el equivalente moderno del comando periódico <code>zpool trim <pool></code> — en lugar de tener que acordarte de ejecutar un trim manualmente (o programar uno), el pool emite comandos TRIM automáticamente y de forma continua a medida que los bloques se liberan. Es de bajo overhead y es el ajuste recomendado para pools respaldados por SSD.",
|
||||
"practicalTitle": "¿Por qué es práctico activarlo?",
|
||||
"practicalItems": [
|
||||
"<strong>Rendimiento de escritura sostenido.</strong> Las SSDs que nunca ven comandos TRIM se ralentizan de forma medible con los meses. Autotrim le facilita el trabajo a la controladora.",
|
||||
"<strong>Longevidad del disco.</strong> Menor amplificación de escritura significa menos escrituras NAND totales para la misma cantidad de datos — medible en años de vida útil del disco.",
|
||||
"<strong>Sin cron programado que recordar.</strong> A diferencia de un <code>zpool trim</code> periódico, autotrim es fire-and-forget — el pool lo maneja por su cuenta."
|
||||
],
|
||||
"whenTitle": "¿Cuándo es necesario?",
|
||||
"whenIntro1": "<strong>Deberías activarlo</strong> en cualquier pool ZFS cuyos vdevs sean todos SSD o NVMe con soporte TRIM — la instalación típica de Proxmox sobre SSDs de consumo o enterprise.",
|
||||
"whenIntro2": "<strong>El script se lo salta automáticamente</strong> en:",
|
||||
"whenSkipItems": [
|
||||
"Pools que contienen cualquier vdev HDD (rotacional) — TRIM no tiene sentido allí.",
|
||||
"Discos sin <code>discard_granularity</code> expuesto en sysfs — normalmente SSDs viejas sin TRIM, o rutas pass-through donde el SO no puede ver el dispositivo subyacente.",
|
||||
"Pools donde ZFS mismo reporta la propiedad como no soportada (raro; pools muy antiguos).",
|
||||
"Pools ya configurados con <code>autotrim=on</code> (no-op)."
|
||||
],
|
||||
"whenIntro3": "<strong>No relevante en hosts solo ext4</strong> — no hay nada que ZFS pueda trimear. La función sale con un mensaje amistoso en ese caso.",
|
||||
"recordedTitle": "Por qué solo se registran los pools que ProxMenux cambió",
|
||||
"recordedBody": "La función solo escribe un pool en su archivo de estado interno (<code>/usr/local/share/proxmenux/zfs_autotrim_pools</code>) cuando ha cambiado activamente ese pool de <code>off</code> a <code>on</code>. Los pools que ya tenías con autotrim antes de ejecutar el script se dejan fuera de la lista, para que un futuro Uninstall no apague ajustes que tú mismo configuraste — solo se revierten los cambios propios de ProxMenux.",
|
||||
"manualTitle": "Equivalente manual (ejecuta en tu servidor)",
|
||||
"manualIntro": "La secuencia completa que el script ejecuta contra cada pool es replicable a mano. Esto es lo que escribirías si quisieras hacer lo mismo en un solo pool sin ProxMenux:",
|
||||
"verifyTitle": "Verificación y rollback manual",
|
||||
"oneShotTitle": "¿Necesitas un trim puntual en lugar de continuo?",
|
||||
"oneShotBody": "Algunos operadores prefieren un trim manual durante horas de baja carga en lugar de actividad de trim continua. Desactiva autotrim y programa un cron que ejecute <code>zpool trim <pool></code> — mismo objetivo final, distinta cadencia."
|
||||
},
|
||||
"vzdump": {
|
||||
"heading": "Aumentar la velocidad de backup de vzdump",
|
||||
"intro": "Por defecto, vzdump de Proxmox throttlea los backups para proteger las VMs/CTs en ejecución de inanición de IO. En muchos setups ese throttle es más conservador de lo necesario. Esta opción quita el cap de ancho de banda y baja la prioridad de I/O para que vzdump pueda saturar el path de almacenamiento durante las ventanas de backup.",
|
||||
"changedTitle": "Qué se cambia en /etc/vzdump.conf",
|
||||
"noBackupTitle": "Sin backup de vzdump.conf",
|
||||
"noBackupBody": "El script <strong>edita <code>/etc/vzdump.conf</code> in place</strong> sin crear un <code>.bak</code> primero. Si tenías valores custom ahí (bwlimit, ionice, compress, pigz, tmpdir, exclude-path, etc.), los cambios a <em>esas dos líneas</em> se hacen con <code>sed</code> — la config circundante se preserva — pero no hay snapshot de \"undo\". Haz un backup manual si tu config no es trivial: <code>cp /etc/vzdump.conf /etc/vzdump.conf.pre-proxmenux</code>.",
|
||||
"skipTitle": "Cuándo saltárselo",
|
||||
"skipBody": "En un host con almacenamiento local lento y VMs sensibles a la latencia, quitar el cap de ancho de banda puede causar ralentizaciones notables durante los backups. Si previamente has puesto un <code>bwlimit</code> específico por esa razón, mantenlo — sáltate esta opción.",
|
||||
"verifyTitle": "Verificación y rollback manual"
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Comandos de gestión de ZFS",
|
||||
"href": "/docs/help-info/zfs-commands",
|
||||
"tail": " — referencia zpool / zfs para ARC, snapshots, scrub."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de almacenamiento y discos",
|
||||
"href": "/docs/help-info/storage-commands",
|
||||
"tail": " — referencia genérica de dispositivos de bloque y almacenamiento Proxmox."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de backup y restauración",
|
||||
"href": "/docs/help-info/backup-commands",
|
||||
"tail": " — referencia de la CLI de vzdump (ahora sin los caps legacy de bwlimit / ionice)."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — revierte cambios de ARC / vzdump."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Sistema | ProxMenux Documentation",
|
||||
"description": "Optimizaciones a nivel de sistema en el script post-instalación Customizable de ProxMenux: límites de tamaño de journald y logrotate, límites de kernel y descriptores de fichero más altos, tuning de memoria balanceado, kexec para reinicios rápidos, y recuperación ante kernel panic."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Sistema",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta categoría",
|
||||
"body": "Seis optimizaciones independientes a nivel de sistema. Tunean <strong>journald</strong> y <strong>logrotate</strong> para que los logs no llenen el disco, suben los <strong>límites de kernel y descriptores de fichero</strong> para que aplicaciones con muchos archivos abiertos no peguen contra el techo, <strong>balancean la memoria</strong> para un host de virtualización, añaden <strong>kexec</strong> para \"reinicios sin BIOS\", y configuran <strong>recuperación automática</strong> ante kernel panic. Las seis están registradas y son reversibles desde el menú Uninstall."
|
||||
},
|
||||
"journald": {
|
||||
"heading": "Optimizar journald",
|
||||
"intro": "Reescribe <code>/etc/systemd/journald.conf</code> con valores por defecto sensatos para que el journal de systemd no pueda comerse lentamente tu partición raíz, luego reinicia <code>systemd-journald</code> y limpia (vacuum) los logs existentes.",
|
||||
"keyTitle": "Valores clave",
|
||||
"keyItems": [
|
||||
"<code>Storage=persistent</code> — conservar logs en disco entre reinicios.",
|
||||
"<code>SystemMaxUse=64M</code> / <code>RuntimeMaxUse=60M</code> — caps duros sobre el uso de disco/memoria del journal.",
|
||||
"<code>Compress=yes</code>, <code>Seal=no</code> — comprimir logs, saltar el forward-secure sealing (ahorra CPU).",
|
||||
"<code>MaxLevelStore=info</code> — almacenar info y superiores (requerido para el visor de logs del ProxMenux Monitor y para que Fail2Ban detecte fallos de autenticación SSH/Proxmox desde el journal).",
|
||||
"Rate-limits: <code>1000 eventos / 30 s</code> para prevenir flooding de logs.",
|
||||
"<code>ForwardToSyslog=no</code>, <code>ForwardToWall=no</code> — no duplicar mensajes a syslog ni broadcastear a consolas."
|
||||
],
|
||||
"tipTitle": "Por qué importa MaxLevelStore=info",
|
||||
"tipBody": "Usar un nivel más estricto como <code>warning</code> hace que el visor de logs del ProxMenux Monitor muestre entradas casi idénticas en todos los rangos de fechas (porque la mayoría de la actividad es de nivel info), e impide que Fail2Ban vea logins fallidos. Si quieres menos volumen de logs, apóyate en el cap <code>SystemMaxUse</code> y en <code>RateLimitBurst</code> en lugar de bajar el nivel almacenado."
|
||||
},
|
||||
"logrotate": {
|
||||
"heading": "Optimizar logrotate",
|
||||
"intro": "Reescribe <code>/etc/logrotate.conf</code> con una política más estricta adecuada para un host que también forma parte de un setup Log2RAM de protección de SSD: rotación diaria, retención de 7 días, trigger de tamaño 10 MB, compresión, y <code>copytruncate</code> para que los servicios activos sigan escribiendo sin reabrir sus archivos de log. El <code>logrotate.conf</code> original se respalda en <code>.bak</code> en la primera aplicación.",
|
||||
"tipTitle": "Amigable con Log2RAM",
|
||||
"tipBody": "El trigger <code>size 10M</code> significa que los logs rotan por tamaño <em>o</em> diariamente, lo que ocurra primero. Combinado con el <code>/var/log</code> respaldado en RAM de Log2RAM, esto mantiene el working set pequeño para que los flushes a disco sean baratos."
|
||||
},
|
||||
"limits": {
|
||||
"heading": "Aumentar varios límites del sistema",
|
||||
"intro": "Sube un puñado de límites de kernel, systemd y PAM que por defecto tienen valores demasiado bajos para un host que ejecuta muchas VMs, contenedores y servicios en red.",
|
||||
"headerFile": "Archivo",
|
||||
"headerSets": "Qué establece",
|
||||
"rows": [
|
||||
{
|
||||
"file": "/etc/sysctl.d/99-maxwatches.conf",
|
||||
"sets": "<code>fs.inotify.max_user_watches / max_user_instances / max_queued_events = 1048576</code>"
|
||||
},
|
||||
{
|
||||
"file": "/etc/sysctl.d/99-maxkeys.conf",
|
||||
"sets": "<code>kernel.keys.maxkeys / root_maxkeys = 1000000</code>"
|
||||
},
|
||||
{
|
||||
"file": "/etc/sysctl.d/99-swap.conf",
|
||||
"sets": "<code>vm.swappiness = 10</code>, <code>vm.vfs_cache_pressure = 100</code>"
|
||||
},
|
||||
{
|
||||
"file": "/etc/sysctl.d/99-fs.conf",
|
||||
"sets": "<code>fs.nr_open / file-max = 2097152</code>, <code>fs.aio-max-nr = 1048576</code>"
|
||||
},
|
||||
{
|
||||
"file": "/etc/security/limits.d/99-limits.conf",
|
||||
"sets": "<code>nofile</code> y <code>nproc</code> a 1.048.576 (ilimitados para root)"
|
||||
},
|
||||
{
|
||||
"file": "/etc/systemd/system.conf + user.conf",
|
||||
"sets": "<code>DefaultLimitNOFILE=1048576</code> para servicios systemd"
|
||||
},
|
||||
{
|
||||
"file": "/etc/pam.d/common-session + runuser-l",
|
||||
"sets": "<code>session required pam_limits.so</code> para que lo anterior se aplique en shells de login"
|
||||
},
|
||||
{
|
||||
"file": "/root/.profile",
|
||||
"sets": "<code>ulimit -n 1048576</code> para la shell de root"
|
||||
}
|
||||
],
|
||||
"tipTitle": "Por qué importa inotify",
|
||||
"tipBody": "Aplicaciones como Docker, Syncthing, watchers de Node.js, el escáner de biblioteca de Plex y muchas más pegan rápido contra <code>max_user_watches</code>. El valor por defecto en Debian es 8192 — un solo Plex en ejecución puede agotarlo. 1M es generoso y cuesta ~1 KB de RAM por watch, lo que es despreciable."
|
||||
},
|
||||
"memory": {
|
||||
"heading": "Optimizar ajustes de memoria",
|
||||
"intro": "Escribe un perfil sysctl balanceado en <code>/etc/sysctl.d/99-memory.conf</code>. Diseñado para un host hipervisor — prefiere mantener los working sets de las VMs en RAM y libera páginas de forma proactiva para que las ráfagas de allocation no se atasquen.",
|
||||
"warnTitle": "swappiness=10 en hosts con memoria justa",
|
||||
"warnBody": "En un host con 16 GB de RAM ejecutando muchas VMs, bajar el swappiness puede empujar al kernel a OOM-killear procesos en lugar de hacer swap. Si estás viendo eventos OOM de forma rutinaria, sube el swappiness de vuelta a 30–60 en <code>/etc/sysctl.d/99-memory.conf</code> después de ejecutar el script."
|
||||
},
|
||||
"kexec": {
|
||||
"heading": "Activar reinicios rápidos (kexec)",
|
||||
"intro": "Instala <code>kexec-tools</code> y lo conecta para que puedas reiniciar el host directamente a un kernel nuevo <em>sin pasar por el firmware BIOS/UEFI</em>. En servidores grandes donde el POST tarda 45 – 90 segundos, esto convierte un reinicio de una pausa para el café en unos pocos segundos de downtime.",
|
||||
"installsTitle": "Qué instala ProxMenux",
|
||||
"installsItems": [
|
||||
"Paquete <code>kexec-tools</code> (con debconf pre-respondido para que apt no pregunte durante la instalación).",
|
||||
"Unit systemd <code>/etc/systemd/system/kexec-pve.service</code> — carga el kernel de Proxmox y el initrd en memoria al arrancar, reutilizando la cmdline actual.",
|
||||
"Un alias en <code>/root/.bash_profile</code>: <code>reboot-quick</code> → <code>systemctl kexec</code>."
|
||||
],
|
||||
"usageIntro": "Uso tras el siguiente reinicio (o <code>systemctl start kexec-pve</code> manual):",
|
||||
"warnTitle": "Cuándo no usar kexec",
|
||||
"warnBody": "kexec se salta el init a nivel de firmware. Si dependes de BIOS/UEFI para resetear el estado del hardware — por ejemplo, una GPU haciendo passthrough que solo resetea limpiamente con un POST completo, o un firmware de HBA problemático — los reinicios kexec pueden dejar esos dispositivos en un estado a medio inicializar. Usa un <code>reboot</code> normal tras upgrades de kernel o cuando necesites que los cambios de BIOS/UEFI surtan efecto. <code>reboot-quick</code> es para reinicios del día a día."
|
||||
},
|
||||
"panic": {
|
||||
"heading": "Activar reinicio en kernel panic",
|
||||
"intro": "Hace que el kernel <strong>se reinicie automáticamente</strong> en lugar de quedarse para siempre en una pantalla de panic. Crítico en hosts Proxmox headless/remotos donde un kernel colgado significa que todas tus VMs están caídas hasta que puedas hacer power-cycle a la caja.",
|
||||
"tipTitle": "Combínalo con acceso a consola remota",
|
||||
"tipBody": "El auto-reinicio es un mecanismo de recuperación, no una herramienta de debug. Si quieres <em>investigar</em> un panic en lugar de simplemente volver, usa <link>la opción kexec</link> de arriba con el soporte kdump del kernel (no configurado por ProxMenux) o captura una consola serie a otro host antes de activar el auto-reinicio."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verificación",
|
||||
"intro": "Tras aplicar las optimizaciones de Sistema:",
|
||||
"tipTitle": "Totalmente reversible",
|
||||
"tipBody": "Las seis opciones están registradas en <code>installed_tools.json</code>, así que aparecen en <link>Uninstall Optimizations</link> si quieres revertir alguna. Las reversiones restauran los valores por defecto de los archivos sysctl, eliminan la unit systemd y el alias de kexec, y resetean journald/logrotate a las configuraciones stock de Debian."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Comandos de sistema útiles",
|
||||
"href": "/docs/help-info/system-commands",
|
||||
"tail": " — verifica los cambios (free -h, journalctl, ulimit -a)."
|
||||
},
|
||||
{
|
||||
"label": "Rendimiento",
|
||||
"href": "/docs/post-install/performance",
|
||||
"tail": " — tuning adicional a nivel de sistema (pigz)."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — revierte cualquiera de estos cambios."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,210 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Uninstall Optimizations | ProxMenux Documentation",
|
||||
"description": "Revierte cualquier optimización post-instalación aplicada por ProxMenux. Cada cambio queda registrado en un JSON, y cada herramienta tiene un uninstaller dedicado que restaura la configuración original."
|
||||
},
|
||||
"header": {
|
||||
"title": "Uninstall Optimizations",
|
||||
"description": "Revierte cualquier cambio hecho por los scripts post-instalación Automatizado o Personalizable. ProxMenux mantiene un registro de cada optimización que aplicó y tiene una función de reversión dedicada para cada una — elige cuáles revertir, y el host vuelve atrás.",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Por qué existe",
|
||||
"body": "Cada tweak que aplican los scripts post-instalación queda <strong>registrado</strong> en un JSON en <code>/usr/local/share/proxmenux/installed_tools.json</code>. Ese registro es lo que alimenta el flujo de uninstall — te muestra la lista de optimizaciones actualmente aplicadas, y una función de reversión que restaura el estado original para cada una (desde archivos de backup cuando es posible, o reinstalando los paquetes afectados)."
|
||||
},
|
||||
"openMenu": {
|
||||
"heading": "Cómo abrirlo",
|
||||
"body": "Desde el menú principal de ProxMenux, <strong>Settings post-install Proxmox → Uninstall optimizations</strong>. Verás un checklist de optimizaciones <em>actualmente aplicadas</em> — los items que no has aplicado no aparecen.",
|
||||
"imageAlt": "Checklist de Uninstall Optimizations mostrando los items actualmente aplicados en el host, con checkboxes para seleccionar cuáles revertir"
|
||||
},
|
||||
"howWorks": {
|
||||
"heading": "Cómo funciona la reversión",
|
||||
"steps": [
|
||||
{
|
||||
"title": "Registro y autodetección",
|
||||
"body1": "En la primera ejecución, ProxMenux recorre el host buscando archivos huella (p. ej. <code>/etc/sysctl.d/99-memory.conf</code>, <code>/etc/apt/apt.conf.d/99-force-ipv4</code>, paquete <code>haveged</code> instalado, servicio Log2RAM activo…). Cualquier cosa encontrada se añade al registro como reversible, incluso si fue aplicada por una versión antigua de ProxMenux anterior al registro.",
|
||||
"body2": "Esta migración solo se ejecuta una vez. A partir de ahí, cada apply/revert actualiza el registro directamente."
|
||||
},
|
||||
{
|
||||
"title": "Elige qué revertir",
|
||||
"body1": "El checklist muestra una etiqueta legible por humanos por item (p. ej. <em>Memory Settings Optimization</em>, <em>IOMMU/VFIO PCI Passthrough</em>, <em>Log2RAM (SSD Protection)</em>). Marca las que quieras revertir. Nada que no marques será tocado."
|
||||
},
|
||||
{
|
||||
"title": "Se ejecuta la reversión",
|
||||
"body1": "Para cada item seleccionado, ProxMenux llama a su función de uninstall correspondiente. La mayoría de las reversiones siguen uno de tres patrones:",
|
||||
"items": [
|
||||
"<strong>Basado en backup</strong> — restaura un <code>.bak</code> capturado en el momento de aplicar (bashrc, logrotate.conf, journald.conf, GRUB/kernel cmdline).",
|
||||
"<strong>Borrar la config</strong> — elimina los <code>/etc/sysctl.d/99-*.conf</code>, <code>/etc/apt/apt.conf.d/99-*</code>, o unit systemd de ProxMenux, y recarga.",
|
||||
"<strong>Reinstalación de paquete</strong> — para cambios de UI como el banner de suscripción, reinstala los paquetes upstream con <code>--force-confnew</code> para restaurar la configuración distribuida."
|
||||
],
|
||||
"body2": "Cada reversión registra su progreso. Los items que requieren un reinicio (VFIO, nombres de interfaz persistentes) activan un flag que dispara el prompt de reinicio al final."
|
||||
},
|
||||
{
|
||||
"title": "Reinicio si hace falta",
|
||||
"body1": "Si algún item revertido modificó parámetros del kernel, módulos del kernel, o naming de red, se te ofrecerá un reinicio. Si no, los cambios están en vivo inmediatamente."
|
||||
}
|
||||
]
|
||||
},
|
||||
"reversible": {
|
||||
"heading": "Qué es reversible",
|
||||
"intro": "Cada optimización que aplican los scripts post-instalación tiene un uninstaller correspondiente. Agrupados aquí por área:",
|
||||
"groups": [
|
||||
{
|
||||
"title": "Repositorios y APT",
|
||||
"items": [
|
||||
{
|
||||
"tool": "Subscription Banner Removal",
|
||||
"restores": "Reinstala pve-manager, proxmox-widget-toolkit, libjs-extjs y libpve-http-server-perl con force-confnew para restaurar los archivos originales de la UI. También limpia las copias .js / .gz cacheadas."
|
||||
},
|
||||
{
|
||||
"tool": "APT Language Skip",
|
||||
"restores": "Elimina /etc/apt/apt.conf.d/99-disable-translations. APT volverá a descargar paquetes de idioma."
|
||||
},
|
||||
{
|
||||
"tool": "APT IPv4 Force",
|
||||
"restores": "Elimina /etc/apt/apt.conf.d/99-force-ipv4."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Kernel, memoria y límites del sistema",
|
||||
"items": [
|
||||
{
|
||||
"tool": "Memory Settings",
|
||||
"restores": "Elimina /etc/sysctl.d/99-memory.conf y recarga sysctl."
|
||||
},
|
||||
{
|
||||
"tool": "Kernel Panic Configuration",
|
||||
"restores": "Elimina /etc/sysctl.d/99-kernelpanic.conf."
|
||||
},
|
||||
{
|
||||
"tool": "System Limits Increase",
|
||||
"restores": "Elimina /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf y /etc/security/limits.d/99-limits.conf. Revierte los límites PAM y DefaultLimitNOFILE de systemd."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Red",
|
||||
"items": [
|
||||
{
|
||||
"tool": "Network Optimizations",
|
||||
"restores": "Elimina /etc/sysctl.d/99-network.conf y la unit proxmenux-fwbr-tune.service. Recarga sysctl y systemd."
|
||||
},
|
||||
{
|
||||
"tool": "Persistent Interface Names",
|
||||
"restores": "Elimina cada archivo .link de /etc/systemd/network/. Los nombres de interfaz vuelven al comportamiento por defecto de systemd en el siguiente reinicio."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Logging",
|
||||
"items": [
|
||||
{
|
||||
"tool": "Journald Optimization",
|
||||
"restores": "Reescribe /etc/systemd/journald.conf con los valores por defecto vanilla y reinicia systemd-journald."
|
||||
},
|
||||
{
|
||||
"tool": "Logrotate Optimization",
|
||||
"restores": "Restaura /etc/logrotate.conf desde el archivo .bak capturado antes del cambio."
|
||||
},
|
||||
{
|
||||
"tool": "Log2RAM",
|
||||
"restores": "Para y desactiva el servicio y el timer. Purga cron jobs, units systemd, binarios, archivos de configuración y el directorio /var/log.hdd. También desinstala el paquete apt si se instaló por esa vía."
|
||||
},
|
||||
{
|
||||
"tool": "ZFS autotrim",
|
||||
"restores": "Lee /usr/local/share/proxmenux/zfs_autotrim_pools (la lista de pools que ProxMenux realmente cambió) y ejecuta zpool set autotrim=off en cada uno. Los pools en los que tú activaste autotrim manualmente antes de ejecutar ProxMenux no se tocan."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Shell y apariencia",
|
||||
"items": [
|
||||
{
|
||||
"tool": "Bashrc Customization",
|
||||
"restores": "Restaura /root/.bashrc desde el backup .bak. Si no existe backup, elimina el bloque PMX_CORE_BASHRC por marcadores."
|
||||
},
|
||||
{
|
||||
"tool": "Fastfetch",
|
||||
"restores": "Elimina el binario, el directorio de configuración, el hook update-motd y el bloque de bashrc. Purga el paquete apt si está instalado."
|
||||
},
|
||||
{
|
||||
"tool": "Figurine",
|
||||
"restores": "Elimina el binario, la entrada en profile.d y el bloque de alias en bashrc/profile."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Hardware y virtualización",
|
||||
"items": [
|
||||
{
|
||||
"tool": "IOMMU / VFIO",
|
||||
"restores": "Elimina los módulos vfio de /etc/modules, las entradas de blacklist nouveau / radeon / nvidia, y los parámetros intel_iommu=on / amd_iommu=on / iommu=pt / pcie_acs_override de /etc/kernel/cmdline (ZFS) o GRUB. Reconstruye initramfs."
|
||||
},
|
||||
{
|
||||
"tool": "AMD CPU fixes (Ryzen/EPYC)",
|
||||
"restores": "Elimina idle=nomwait de la cmdline del kernel (ZFS) o GRUB, y las opciones ignore_msrs / report_ignored_msrs de /etc/modprobe.d/kvm.conf."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Servicios y extras",
|
||||
"items": [
|
||||
{
|
||||
"tool": "Time Synchronization",
|
||||
"restores": "Devuelve la zona horaria a UTC (valor por defecto seguro) vía timedatectl."
|
||||
},
|
||||
{
|
||||
"tool": "Entropy Generation (haveged)",
|
||||
"restores": "Para, desactiva y purga el paquete haveged."
|
||||
},
|
||||
{
|
||||
"tool": "kexec (fast reboots)",
|
||||
"restores": "Desactiva kexec-pve.service, elimina el archivo de unit y el alias reboot-quick, purga kexec-tools."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"edge": {
|
||||
"heading": "Casos límite y matices",
|
||||
"packageTitle": "La reinstalación de paquetes toca paquetes vivos de Proxmox",
|
||||
"packageBody": "Revertir <strong>Subscription Banner Removal</strong> reinstala <code>pve-manager</code>, <code>proxmox-widget-toolkit</code>, <code>libjs-extjs</code> y <code>libpve-http-server-perl</code> con <code>--force-confnew</code>. Es generalmente seguro pero sí toca la UI web en ejecución — refresca tu navegador después, y espera unos segundos de reconexión. No lo ejecutes a mitad de una migración o una operación de clonado.",
|
||||
"rebootTitle": "Los nombres persistentes y VFIO necesitan reinicio",
|
||||
"rebootBody": "Eliminar los archivos <code>.link</code> (<em>Persistent Interface Names</em>) y revertir <em>IOMMU/VFIO</em> no afectan al sistema en ejecución — solo importan tras un reinicio. ProxMenux activa el flag de reinicio automáticamente para estos.",
|
||||
"perItemTitle": "Puedes revertir una cosa y mantener el resto",
|
||||
"perItemBody": "El uninstaller opera por item. Si solo quieres eliminar Log2RAM pero mantener el tuning de red y los cambios de bashrc, marca solo <em>Log2RAM</em>. Nada más se toca, y el registro se actualiza en consecuencia."
|
||||
},
|
||||
"inspect": {
|
||||
"heading": "Inspeccionar el registro manualmente",
|
||||
"intro": "Si quieres ver qué está registrado sin abrir el menú:",
|
||||
"outro": "Cada entrada <code>\"tool\": true</code> se corresponde con algo que ProxMenux aplicó y puede revertir. Eliminar una entrada manualmente no se recomienda — usa siempre el menú, que también ejecuta la función de reversión en lugar de simplemente olvidarse del cambio.",
|
||||
"reinstallTitle": "Reinstalación tras uninstall",
|
||||
"reinstallBody": "Revertir una optimización no te impide volver a aplicarla más tarde. Abre <link>el menú Post-Install</link> de nuevo y ejecuta Automatizado o Personalizable — el registro recogerá el nuevo estado."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Automated Post-Install",
|
||||
"href": "/docs/post-install/automated",
|
||||
"tail": " — vuelve a aplicar el baseline de valores por defecto sensatos."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — elige un subconjunto distinto."
|
||||
},
|
||||
{
|
||||
"label": "Desinstalar ProxMenux",
|
||||
"href": "/docs/settings/uninstall-proxmenux",
|
||||
"tail": " — operación distinta: elimina el propio ProxMenux, no sus optimizaciones aplicadas."
|
||||
},
|
||||
{
|
||||
"label": "Resumen de Post-Install",
|
||||
"href": "/docs/post-install",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Apply Available Updates — Optimizaciones post-instalación | ProxMenux Documentation",
|
||||
"description": "Cómo ProxMenux detecta cuándo una optimización post-instalación (Log2Ram, Memory Settings, System Limits, Logrotate, tuning de red…) se ha actualizado upstream, y cómo aplicar la nueva versión — desde el menú Post-Install o desde el panel del Monitor."
|
||||
},
|
||||
"header": {
|
||||
"title": "Apply Available Updates",
|
||||
"description": "Cuando una optimización post-instalación (Log2Ram, Memory Settings, System Limits, Logrotate…) tiene en disco una versión más nueva que la registrada actualmente en el host, ProxMenux la muestra como una actualización disponible. Puedes aplicarla desde el menú Post-Install (lado Scripts) o desde el panel del Monitor — ambas rutas vuelven a ejecutar la misma función post-instalación y refrescan el registro.",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué es esto",
|
||||
"body": "Las optimizaciones post-instalación de ProxMenux están versionadas. Cada script en el repositorio lleva un número de versión (p. ej. <code>Log2ram SSD Protection v1.2</code>), y el host mantiene un registro de qué optimizaciones están activas y en qué versión en <code>/usr/local/share/proxmenux/installed_tools.json</code>. Cuando una release nueva de ProxMenux distribuye una versión actualizada de cualquier optimización, ProxMenux detecta la discrepancia y ofrece reaplicarla solo a esa — sin volver a ejecutar toda la post-instalación."
|
||||
},
|
||||
"why": {
|
||||
"heading": "Por qué existe",
|
||||
"body": "Las optimizaciones post-instalación reciben mejoras de vez en cuando — un mejor tuning de sysctl, un límite de Logrotate más estricto, una nueva heurística de tamaño de Log2RAM, un fix para un caso límite reportado por un tester. Sin una ruta de actualización el operador solo tenía dos opciones: volver a ejecutar manualmente el script post-instalación (lo que reaplica <em>cada</em> optimización) o saltarse la mejora por completo. Apply Available Updates es el término medio: una re-ejecución opt-in por optimización que sube solo las versiones que realmente se han movido."
|
||||
},
|
||||
"detection": {
|
||||
"heading": "Cómo se detectan las actualizaciones",
|
||||
"steps": [
|
||||
{
|
||||
"title": "Scripts versionados en disco",
|
||||
"body": "Cada función post-instalación declara su versión dentro del script (<code>scripts/post_install/auto_post_install.sh</code> y <code>scripts/post_install/customizable_post_install.sh</code>). Un escáner extrae estas versiones de la fuente en disco."
|
||||
},
|
||||
{
|
||||
"title": "Registro versionado en el host",
|
||||
"body": "Cuando el operador aplicó cada optimización, la llamada <code>register_tool</code> correspondiente escribió la versión activa en <code>/usr/local/share/proxmenux/installed_tools.json</code>. Ese archivo es la fuente de verdad de \"qué está activo en este host ahora mismo\"."
|
||||
},
|
||||
{
|
||||
"title": "El Monitor compara ambos lados",
|
||||
"body": "En el arranque y cada 24h, el Monitor compara las versiones de disco contra las versiones del registro. Cualquier discrepancia produce una entrada en <code>/usr/local/share/proxmenux/updates_available.json</code>. Ese archivo alimenta tanto la entrada del menú Post-Install como la tarjeta del panel del Monitor."
|
||||
},
|
||||
{
|
||||
"title": "Una notificación por versión nueva",
|
||||
"body": "Cuando al menos una optimización tiene una actualización pendiente, el Monitor emite una única notificación agrupada — por ejemplo <em>\"4 ProxMenux optimization update(s) available\"</em> — con una línea por herramienta en el mismo formato <code>name (vX → vY)</code> que se usa para las actualizaciones de paquetes de Proxmox. La notificación es anti-cascada para que no se repita día tras día con el mismo conjunto; solo una versión nueva (o una herramienta nueva que entra en la lista) la vuelve a disparar."
|
||||
}
|
||||
]
|
||||
},
|
||||
"pathA": {
|
||||
"heading": "Ruta A — Desde el menú Post-Install",
|
||||
"intro": "Desde el menú principal de ProxMenux, abre <strong>Settings post-install Proxmox</strong>. Cuando hay actualizaciones pendientes, una entrada nueva <strong>Apply available updates (N)</strong> aparece justo encima de <em>Uninstall optimizations</em>. El número refleja cuántas optimizaciones tienen una versión más nueva en disco que la que el host tiene registrada actualmente. Cuando todo está al día la entrada simplemente no aparece, así el menú se mantiene limpio.",
|
||||
"menuAlt": "Menú de Post-Install Scripts mostrando la entrada condicional 'Apply available updates (N)' posicionada justo encima de 'Uninstall optimizations', con el contador indicando cuántas optimizaciones tienen una versión más nueva en disco",
|
||||
"menuCaption": "La entrada <em>Apply available updates (N)</em> solo se renderiza cuando al menos una optimización tiene una actualización pendiente — se oculta cuando el host está al día.",
|
||||
"checklistBody": "Seleccionar la entrada abre un checklist con cada actualización pendiente, cada fila formateada como <code>name (vX → vY)</code>. Todas las filas están pre-marcadas por defecto; desmarca las que no quieras aplicar esta ronda.",
|
||||
"checklistAlt": "Diálogo checklist Apply Available Updates con una fila por optimización pendiente, cada una etiquetada con el nombre de la optimización y la transición de versión (actual → disponible). Todas las filas pre-marcadas.",
|
||||
"checklistCaption": "Opt-in por optimización: elige exactamente qué versiones subir. El mismo motor que alimenta Automatizado y Personalizable post-instalación se ejecuta en segundo plano para reaplicar cada función y refrescar su versión en el registro."
|
||||
},
|
||||
"pathB": {
|
||||
"heading": "Ruta B — Desde el panel del Monitor",
|
||||
"intro": "Las mismas actualizaciones aparecen en el Monitor bajo <link>Settings → ProxMenux Optimizations</link>. Cuando se detectan actualizaciones pendientes la tarjeta muestra un banner \"Updates available\" con el contador y una acción <strong>Apply</strong> que abre el mismo selector por optimización.",
|
||||
"imageAlt": "Tarjeta de ProxMenux Optimizations en el panel del Monitor con un banner Updates available arriba mostrando el contador de actualizaciones pendientes y un botón Apply que abre el selector por optimización",
|
||||
"imageCaption": "La tarjeta Optimizations en el Monitor — cuando al menos una optimización tiene una versión más nueva en disco, el banner lo muestra sin necesidad de acceso por shell."
|
||||
},
|
||||
"applying": {
|
||||
"heading": "Qué pasa cuando aplicas",
|
||||
"steps": [
|
||||
{
|
||||
"title": "Re-ejecuta la función post-instalación",
|
||||
"body": "La función de la optimización elegida se vuelve a ejecutar contra el host. Como cada función post-instalación es <strong>idempotente</strong>, volver a ejecutarla no duplica configuración — sobrescribe la versión anterior con la nueva (archivos sysctl, drop-ins, units de servicio, etc.)."
|
||||
},
|
||||
{
|
||||
"title": "Refresca el registro",
|
||||
"body": "La llamada <code>register_tool</code> dentro de la función escribe la versión nueva en <code>installed_tools.json</code>. El siguiente escaneo ya no ve discrepancia y la entrada de actualización desaparece tanto del menú como de la tarjeta del Monitor."
|
||||
},
|
||||
{
|
||||
"title": "Sin reinicio salvo que la función lo diga",
|
||||
"body": "La mayoría de las actualizaciones surten efecto inmediatamente. Las actualizaciones que tocan módulos del kernel, nombres de interfaz persistentes o VFIO muestran el mismo prompt de reinicio que una instalación recién hecha."
|
||||
}
|
||||
]
|
||||
},
|
||||
"differs": {
|
||||
"heading": "En qué se diferencia de las otras rutas",
|
||||
"headerPath": "Ruta",
|
||||
"headerScope": "Alcance",
|
||||
"headerWhen": "Cuándo tiene sentido",
|
||||
"rows": [
|
||||
{
|
||||
"pathLabel": "Automatizado",
|
||||
"pathHref": "/docs/post-install/automated",
|
||||
"scope": "Reaplica <em>cada</em> optimización del bundle.",
|
||||
"when": "Host recién instalado, o re-baseline completo de un nodo totalmente gestionado."
|
||||
},
|
||||
{
|
||||
"pathLabel": "Personalizable",
|
||||
"pathHref": "/docs/post-install/customizable",
|
||||
"scope": "Elige del catálogo completo.",
|
||||
"when": "Selecciona qué optimizaciones están activas en el host."
|
||||
},
|
||||
{
|
||||
"pathLabel": "Apply available updates",
|
||||
"pathHref": null,
|
||||
"scope": "Solo las optimizaciones cuya versión ha subido en disco.",
|
||||
"when": "Mantén las optimizaciones ya instaladas al día sin tocar el resto."
|
||||
},
|
||||
{
|
||||
"pathLabel": "Uninstall optimizations",
|
||||
"pathHref": "/docs/post-install/uninstall",
|
||||
"scope": "Revierte la optimización y elimina su entrada del registro.",
|
||||
"when": "Hacer rollback de un cambio específico."
|
||||
}
|
||||
]
|
||||
},
|
||||
"notifTitle": "Filtro de notificación",
|
||||
"notifBody": "La notificación que anuncia actualizaciones pendientes es el evento <em>ProxMenux optimization updates available</em>. Está activada por defecto en cada canal, se puede silenciar por canal desde <link>Settings → Notifications</link>, y es anti-cascada — se dispara una vez por conjunto distinto de actualizaciones pendientes, no en cada escaneo de 24h."
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Post-instalación: Virtualización | ProxMenux Documentation",
|
||||
"description": "Opciones de virtualización en el script post-instalación Customizable de ProxMenux: auto-instalar el guest agent correcto si Proxmox corre dentro de una VM, y activar IOMMU / VFIO para que puedas pasar dispositivos PCI (GPUs, NICs, HBAs) directamente a tus propias VMs."
|
||||
},
|
||||
"header": {
|
||||
"title": "Post-instalación: Virtualización",
|
||||
"section": "Settings post-install Proxmox"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta categoría",
|
||||
"body": "Dos opciones independientes. <strong>Install relevant guest agent</strong> es una red de seguridad para cuando Proxmox mismo corre anidado dentro de otro hipervisor. <strong>Enable VFIO IOMMU support</strong> es la que le importa a la mayoría: activa las funcionalidades del kernel que necesitas para pasar una GPU, HBA o NIC directamente a una VM con rendimiento casi nativo."
|
||||
},
|
||||
"guestAgent": {
|
||||
"heading": "Instalar guest agent relevante",
|
||||
"intro": "Detecta el entorno de virtualización en el que corre el host Proxmox (usando <code>systemd-detect-virt</code> y <code>dmidecode</code>) e instala el paquete de guest-tools correspondiente para que el hipervisor exterior pueda comunicarse con Proxmox de forma limpia (shutdown elegante, sincronización de reloj, reporte de IP, etc.).",
|
||||
"headerDetected": "Host detectado",
|
||||
"headerPackage": "Paquete instalado",
|
||||
"rows": [
|
||||
{
|
||||
"detected": "QEMU / KVM",
|
||||
"package": "qemu-guest-agent"
|
||||
},
|
||||
{
|
||||
"detected": "VMware (ESXi, Workstation)",
|
||||
"package": "open-vm-tools"
|
||||
},
|
||||
{
|
||||
"detected": "VirtualBox",
|
||||
"package": "virtualbox-guest-utils"
|
||||
},
|
||||
{
|
||||
"detected": "Bare metal (ninguno)",
|
||||
"package": "— no-op, no se instala nada"
|
||||
}
|
||||
],
|
||||
"skipTitle": "Sáltatelo en Proxmox bare-metal",
|
||||
"skipBody": "Si Proxmox corre directamente sobre hardware (el caso común), marcar esta opción es un no-op — el detector devuelve <code>none</code> y el script sale sin cambios. La opción solo importa para la minoría de setups que corren Proxmox <em>como guest</em> para pruebas o labs."
|
||||
},
|
||||
"vfio": {
|
||||
"heading": "Activar soporte VFIO IOMMU",
|
||||
"intro": "Activa IOMMU en el host y carga los módulos del kernel que hacen posible el passthrough de PCI (<code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code>). Con esto activado, puedes vincular un dispositivo físico a una VM y el guest obtiene acceso directo y casi bare-metal a él.",
|
||||
"whoTitle": "Quién necesita esto",
|
||||
"whoItems": [
|
||||
"Quieres pasar una GPU a una VM Windows de gaming o a una VM macOS.",
|
||||
"Tienes una NIC 10G dedicada para una VM de firewall/router (OPNsense, pfSense).",
|
||||
"Quieres pasar una HBA directamente a una VM TrueNAS/Unraid para ZFS sobre discos sin abstracciones.",
|
||||
"Planeas usar <em>Coral TPU</em>, una capturadora o un dongle SDR en una VM."
|
||||
],
|
||||
"whoOutro": "Si nada de eso aplica, puedes saltarte esta opción tranquilamente. Para passthrough a un <strong>LXC</strong> (no a una VM), IOMMU <em>no</em> es necesario.",
|
||||
"doesTitle": "Qué hace ProxMenux",
|
||||
"doesIntro": "La función es consciente del cargador de arranque: detecta si Proxmox está sobre ZFS (systemd-boot) o LVM/ext4 (GRUB) y escribe en el archivo correcto. También es idempotente — si los parámetros ya están presentes, no se añade nada.",
|
||||
"headerBoot": "Tipo de arranque",
|
||||
"headerFile": "Archivo modificado",
|
||||
"headerPost": "Paso post-actualización",
|
||||
"bootRows": [
|
||||
{
|
||||
"boot": "systemd-boot (ZFS)",
|
||||
"file": "/etc/kernel/cmdline",
|
||||
"post": "proxmox-boot-tool refresh"
|
||||
},
|
||||
{
|
||||
"boot": "GRUB (LVM/ext4)",
|
||||
"file": "/etc/default/grub",
|
||||
"post": "update-grub"
|
||||
}
|
||||
],
|
||||
"kernelIntro": "Parámetros del kernel añadidos:",
|
||||
"modulesIntro": "Módulos del kernel añadidos a <code>/etc/modules</code>:",
|
||||
"blacklistIntro": "Drivers en conflicto puestos en blacklist en <code>/etc/modprobe.d/blacklist.conf</code>:",
|
||||
"blacklistTitle": "Hacer blacklist de drivers de GPU entra en conflicto con el uso de la GPU desde el host",
|
||||
"blacklistBody": "La blacklist garantiza que el kernel del host nunca enlace <em>ningún</em> driver de GPU, para que VFIO pueda reclamar la GPU de forma limpia. Eso es exactamente lo que quieres para passthrough a una VM — pero es <strong>lo contrario</strong> de lo que necesitas para <link>instalar los drivers NVIDIA en el host</link> (para transcodificación en LXC, por ejemplo). Elige una ruta por GPU:",
|
||||
"pathItems": [
|
||||
"<strong>GPU → VM:</strong> activa VFIO/IOMMU aquí, deja los drivers de GPU en blacklist.",
|
||||
"<strong>GPU → LXC (o host):</strong> sáltate esta opción, usa la instalación de NVIDIA en el host, no pongas en blacklist nvidia/nouveau.",
|
||||
"<strong>Dos GPUs:</strong> una puede ir a una VM y la otra a un LXC, pero necesitarás una configuración más granular (vincular solo una tarjeta a <code>vfio-pci</code> por ID PCI). La blacklist por defecto es demasiado amplia para este caso — edita <code>blacklist.conf</code> después."
|
||||
],
|
||||
"acsTitle": "Sobre pcie_acs_override — sé consciente de lo que estás activando",
|
||||
"acsBody": "<code>pcie_acs_override=downstream,multifunction</code> relaja el chequeo de PCIe Access Control Services. Permite al kernel partir grupos IOMMU que el firmware reporta como monolíticos, que a veces es la única forma de hacer passthrough de un dispositivo de un grupo sin arrastrar el resto. El trade-off es <strong>aislamiento reducido entre dispositivos</strong>: una VM maliciosa o comprometida con passthrough tiene una superficie de ataque mayor vía DMA. Bien para un home lab; piénsatelo dos veces antes de activarlo en un host que ejecuta cargas no confiables. Si no lo necesitas, quita ese token de <code>/etc/kernel/cmdline</code> o <code>/etc/default/grub</code> tras ejecutar el script y vuelve a ejecutar el paso de actualización del cargador de arranque.",
|
||||
"rebootTitle": "Se requiere reinicio",
|
||||
"rebootBody": "IOMMU, los módulos VFIO y la blacklist solo surten efecto tras un reinicio + regeneración del initramfs. El script dispara <code>update-initramfs -u -k all</code> y el refresh del cargador de arranque, y activa el flag de \"se requiere reinicio\" para que Personalizable te lo pregunte al final.",
|
||||
"verifyTitle": "Verificación tras el reinicio",
|
||||
"revertTitle": "Reversible desde el menú Uninstall",
|
||||
"revertBody": "<link>Uninstall Optimizations</link> revierte todos los cambios: quita los tokens IOMMU de <code>/etc/kernel/cmdline</code> o GRUB, quita los módulos VFIO de <code>/etc/modules</code>, quita las entradas de blacklist de drivers y reconstruye el initramfs. Se requiere un reinicio para aplicar realmente la reversión."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Add GPU to VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — siguiente paso natural una vez IOMMU + VFIO están activos."
|
||||
},
|
||||
{
|
||||
"label": "Add Controller or NVMe to VM",
|
||||
"href": "/docs/disk-manager/add-controller-nvme-vm",
|
||||
"tail": " — misma infraestructura de passthrough para controladoras de almacenamiento."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de passthrough de GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia de verificación de IOMMU."
|
||||
},
|
||||
{
|
||||
"label": "Uninstall Optimizations",
|
||||
"href": "/docs/post-install/uninstall",
|
||||
"tail": " — revierte IOMMU / VFIO de forma limpia."
|
||||
},
|
||||
{
|
||||
"label": "Customizable Post-Install",
|
||||
"href": "/docs/post-install/customizable",
|
||||
"tail": " — volver al menú padre."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Fail2Ban | ProxMenux Documentation",
|
||||
"description": "Instala Fail2Ban con tres jails afinados para Proxmox (SSH agresivo, Proxmox UI 8006, ProxMenux Monitor 8008). Incluye el arreglo de journald MaxLevelStore, servicios de log propios para fiabilidad, backend nftables/iptables autodetectado y hardening de SSH MaxAuthTries.",
|
||||
"ogTitle": "Fail2Ban | ProxMenux Documentation",
|
||||
"ogDescription": "Protección contra fuerza bruta para SSH y las UIs web de Proxmox, con arreglos específicos de journald y backend para Proxmox."
|
||||
},
|
||||
"header": {
|
||||
"title": "Fail2Ban",
|
||||
"description": "Instala Fail2Ban con una configuración específica para Proxmox: tres jails (SSH agresivo, Proxmox UI en puerto 8006, ProxMenux Monitor en puerto 8008 + proxy inverso), un arreglo del nivel de log de journald para que los eventos de autenticación SSH se almacenen de verdad, dos servicios logger journal-a-archivo que rodean un problema conocido del backend systemd de Fail2Ban, backend de firewall autodetectado y hardening de SSH MaxAuthTries.",
|
||||
"section": "Seguridad"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Instala Fail2Ban desde los repos de Debian y escribe una configuración completa afinada para Proxmox que protege tres superficies de ataque (SSH, Proxmox UI, ProxMenux Monitor) por defecto. Detecta una instalación existente y ofrece un menú de gestión (reinstalar / eliminar) en lugar de volver a ejecutar el instalador."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Diálogo de primer lanzamiento",
|
||||
"body": "En un host sin Fail2Ban, el script muestra un diálogo de confirmación que resume todo lo que va a instalar y configurar. Cancelar sale sin cambios; confirmar arranca el flujo de instalación.",
|
||||
"imageAlt": "Diálogo de confirmación de instalación de Fail2Ban listando los tres jails, el arreglo de journald y el hardening de SSH"
|
||||
},
|
||||
"jails": {
|
||||
"heading": "Los tres jails",
|
||||
"headerJail": "Jail",
|
||||
"headerProtects": "Protege",
|
||||
"headerRetries": "Reintentos / Ventana",
|
||||
"headerBan": "Tiempo de ban",
|
||||
"rows": [
|
||||
{
|
||||
"jail": "[sshd]",
|
||||
"protects": "SSH (modo agresivo — cubre ddos, mode, normal)",
|
||||
"retries": "2 / 60 min",
|
||||
"ban": "9 horas"
|
||||
},
|
||||
{
|
||||
"jail": "[proxmox]",
|
||||
"protects": "UI web de Proxmox (puerto 8006)",
|
||||
"retries": "3 / 10 min",
|
||||
"ban": "1 hora"
|
||||
},
|
||||
{
|
||||
"jail": "[proxmenux]",
|
||||
"protects": "ProxMenux Monitor (puerto 8008 + proxy inverso http/https)",
|
||||
"retries": "3 / 10 min",
|
||||
"ban": "1 hora"
|
||||
}
|
||||
],
|
||||
"outro": "Valores por defecto globales de <code>jail.local</code>: <code>ignoreip = 127.0.0.1/8 ::1</code>, <code>ignoreself = true</code>,<code> bantime = 86400</code> (fallback de 24h para jails que no lo sobrescriben), <code>maxretry = 2</code>, <code>findtime = 1800</code>."
|
||||
},
|
||||
"journald": {
|
||||
"heading": "Por qué importa el arreglo de journald",
|
||||
"intro": "Proxmox entrega <code>/etc/systemd/journald.conf</code> con <codeNw>MaxLevelStore=warning</codeNw>. journald descarta cada mensaje de log <em>por debajo</em> de warning antes de almacenarlo. SSH y PAM emiten fallos de autenticación a niveles <em>info</em> / <em>notice</em>, así que:",
|
||||
"diagram": {
|
||||
"sshLabel": "SSH / PAM",
|
||||
"sshDetail": "fallo de autenticación\n(nivel info / notice)",
|
||||
"journaldLabel": "journald",
|
||||
"journaldDetail": "MaxLevelStore=warning\n→ evento descartado en silencio",
|
||||
"fail2banLabel": "Fail2Ban",
|
||||
"fail2banDetail": "no ve nada\n→ nunca banea nada",
|
||||
"arrowLabel": "Proxmox por defecto"
|
||||
},
|
||||
"afterDiagram": "El instalador detecta esto y escribe un drop-in en <codeXs>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</codeXs> subiendo <code>MaxLevelStore</code> y <code>MaxLevelSyslog</code> a <code>info</code>:",
|
||||
"code": "[Journal]\nMaxLevelStore=info\nMaxLevelSyslog=info",
|
||||
"outro": "Después reinicia <code>systemd-journald</code>. El drop-in se elimina al desinstalar, restaurando el valor por defecto original de Proxmox."
|
||||
},
|
||||
"loggers": {
|
||||
"heading": "Por qué dos servicios logger propios",
|
||||
"intro1": "Fail2Ban puede leer directamente del journal de systemd (<code>backend = systemd</code>), pero en Proxmox este backend tiene problemas conocidos de fiabilidad con los procesos worker de <code>pvedaemon</code> (los eventos de autenticación aparecen en el journal pero Fail2Ban no siempre los recoge) e intermitentemente con <code>sshd</code>.",
|
||||
"intro2": "La solución alternativa: ProxMenux crea dos pequeños servicios systemd que hacen <code>journalctl -f</code> de las unidades relevantes y añaden cada línea a un archivo. Fail2Ban entonces lee esos archivos con el sólido como una roca <code>backend = auto</code> (modo archivo):",
|
||||
"headerService": "Servicio",
|
||||
"headerSource": "Unidad origen",
|
||||
"headerOutput": "Archivo de salida",
|
||||
"rows": [
|
||||
{
|
||||
"service": "proxmox-auth-logger.service",
|
||||
"source": "pvedaemon.service",
|
||||
"output": "/var/log/proxmox-auth.log"
|
||||
},
|
||||
{
|
||||
"service": "ssh-auth-logger.service",
|
||||
"source": "ssh.service",
|
||||
"output": "/var/log/ssh-auth.log"
|
||||
}
|
||||
],
|
||||
"outro": "Ambos servicios se declaran <code>PartOf=fail2ban.service</code> para que se reinicien con Fail2Ban y se paren con él. Modo 640 propiedad de <code>root:adm</code> en los archivos de log. El tercer log usado por el jail <code>[proxmenux]</code> (<code>/var/log/proxmenux-auth.log</code>) lo escribe directamente la app Flask del Monitor de ProxMenux — no hace falta servicio logger para ese."
|
||||
},
|
||||
"backend": {
|
||||
"heading": "Autodetección del backend de firewall",
|
||||
"intro": "El instalador sondea el host: si <code>nft list ruleset</code> funciona, elige <code>nftables</code> como acción de ban. Si no, recae en <code>iptables-multiport</code> / <code>iptables-allports</code>. La elección se escribe en <code>jail.local</code>:",
|
||||
"code": "# nftables host\nbanaction = nftables\nbanaction_allports = nftables[type=allports]\n\n# iptables host (fallback)\nbanaction = iptables-multiport\nbanaction_allports = iptables-allports"
|
||||
},
|
||||
"hardening": {
|
||||
"heading": "Hardening de SSH: MaxAuthTries",
|
||||
"intro": "El control de Lynis <strong>SSH-7408</strong> recomienda <code>MaxAuthTries 3</code> en <code>sshd_config</code>. Con el <code>maxretry = 2</code> de Fail2Ban en el jail SSH, un cliente malicioso nunca llega a tres intentos de todas formas — pero el ajuste explícito satisface la auditoría y añade defensa en profundidad (p. ej. si Fail2Ban está parado por mantenimiento).",
|
||||
"installerIntro": "El instalador:",
|
||||
"items": [
|
||||
"Lee el valor actual de <code>MaxAuthTries</code> (o por defecto 6 si está ausente).",
|
||||
"Lo guarda en <code>/usr/local/share/proxmenux/sshd_maxauthtries_backup</code>.",
|
||||
"Edita <code>sshd_config</code> en sitio — reemplaza la línea existente, descomenta la línea comentada o la añade.",
|
||||
"Recarga <code>sshd</code> (reload, no restart, para mantener vivas las sesiones existentes)."
|
||||
],
|
||||
"outro": "Al desinstalar, el valor original guardado se restaura y se recarga <code>sshd</code> otra vez."
|
||||
},
|
||||
"manage": {
|
||||
"heading": "Gestionar una instalación existente",
|
||||
"intro": "Si Fail2Ban ya está instalado cuando abres el menú, el script lo detecta y muestra un menú de gestión en lugar de volver a ejecutar el instalador:",
|
||||
"headerAction": "Acción",
|
||||
"headerWhat": "Qué hace",
|
||||
"rows": [
|
||||
{
|
||||
"action": "Reinstalar",
|
||||
"what": "Vuelve a ejecutar el instalador completo — reescribe todos los jails con los valores por defecto actuales de ProxMenux. Úsalo cuando una actualización de ProxMenux suba los valores recomendados."
|
||||
},
|
||||
{
|
||||
"action": "Eliminar",
|
||||
"what": "Para fail2ban y los dos servicios logger, purga el paquete apt, elimina todos los archivos de jail / filtro, borra el drop-in de journald (restaurando el valor por defecto de Proxmox) y restaura el MaxAuthTries SSH original."
|
||||
}
|
||||
]
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verifica que funciona",
|
||||
"intro": "Tras la instalación, comandos útiles desde el host:",
|
||||
"code": "# Service status and version\nsystemctl status fail2ban\nfail2ban-client --version\n\n# All active jails\nfail2ban-client status\n\n# Detail on one jail\nfail2ban-client status sshd\nfail2ban-client status proxmox\nfail2ban-client status proxmenux\n\n# Currently banned IPs in a jail\nfail2ban-client status sshd | grep \"Banned IP\"\n\n# Manually unban an IP (use this if you ban yourself)\nfail2ban-client unban 192.0.2.10\n\n# Tail the auth logs Fail2Ban watches\ntail -f /var/log/ssh-auth.log\ntail -f /var/log/proxmox-auth.log\ntail -f /var/log/fail2ban.log"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"neverBansTitle": "Fail2Ban corre pero nunca banea nada",
|
||||
"neverBansBody": "Comprueba que los archivos de log de autenticación reciben entradas de verdad: <code>tail -f /var/log/ssh-auth.log</code> y prueba un intento SSH con contraseña incorrecta desde otra máquina. Si el log se queda vacío, el servicio logger no está corriendo: <code>systemctl status ssh-auth-logger.service</code>. Si está activo pero el log está vacío, comprueba que el drop-in de journald surtió efecto: <code>journalctl --dump-catalog | head</code> — eventos a nivel <em>info</em> deberían ser visibles.",
|
||||
"monitorEmptyTitle": "El jail del Monitor de ProxMenux no tiene entradas ni siquiera tras logins fallidos",
|
||||
"monitorEmptyBody": "El jail <code>[proxmenux]</code> lee <code>/var/log/proxmenux-auth.log</code>, que lo escribe la app Flask del Monitor de ProxMenux — no un logger de journald. Si no usas el Monitor, el archivo se queda vacío y el jail nunca dispara. Eso es lo esperado; la configuración del jail es inocua. Si sí usas el Monitor y el log está vacío, comprueba la configuración de logging de Flask.",
|
||||
"selfBanTitle": "Me he baneado a mí mismo",
|
||||
"selfBanIntro": "Desde una consola / IPMI / iKVM (u otra IP whitelisted):",
|
||||
"selfBanCode": "fail2ban-client unban '<'YOUR_IP'>'\n\n# To prevent it next time, edit /etc/fail2ban/jail.local and add your IP:\nignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.42\n\n# Then reload\nfail2ban-client reload",
|
||||
"aptFailTitle": "apt-get falla: ''Unable to locate package fail2ban''",
|
||||
"aptFailBody": "Al host le faltan los repos de Debian (común en instalaciones de Proxmox a pelo). El instalador detecta esto y escribe <code>/etc/apt/sources.list.d/debian.sources</code> con el codename correcto (<code>bookworm</code> / <code>trixie</code>) antes de reintentarlo. Si sigue fallando, comprueba <code>/etc/os-release</code> en busca de <code>VERSION_CODENAME</code> y confirma que la URL del repo es alcanzable.",
|
||||
"lockoutTitle": "SSH me bloquea el acceso tras la instalación",
|
||||
"lockoutBody": "El instalador establece <code>MaxAuthTries=3</code>. Si tu gestor de contraseñas / agente reintenta múltiples claves, puedes superar ese límite en un único intento de conexión. Limita las claves ofrecidas: <code>ssh -o IdentitiesOnly=yes -i ~/.ssh/specific_key user@host</code>. O sube temporalmente <code>MaxAuthTries</code> en <code>sshd_config</code> mientras depuras."
|
||||
},
|
||||
"files": {
|
||||
"heading": "Archivos escritos",
|
||||
"code": "/etc/fail2ban/jail.local # global defaults + [sshd]\n/etc/fail2ban/jail.d/proxmox.conf # [proxmox]\n/etc/fail2ban/jail.d/proxmenux.conf # [proxmenux]\n/etc/fail2ban/filter.d/proxmox.conf # auth-failure regex for pvedaemon\n/etc/fail2ban/filter.d/proxmenux.conf # auth-failure regex for Monitor\n/etc/systemd/system/proxmox-auth-logger.service # journal → file (pvedaemon)\n/etc/systemd/system/ssh-auth-logger.service # journal → file (sshd)\n/etc/systemd/journald.conf.d/proxmenux-loglevel.conf # MaxLevelStore=info\n/etc/ssh/sshd_config # MaxAuthTries=3 (in-place edit)\n/var/log/proxmox-auth.log # written by logger service\n/var/log/ssh-auth.log # written by logger service\n/var/log/proxmenux-auth.log # written by Monitor Flask app\n/usr/local/share/proxmenux/sshd_maxauthtries_backup # for restore on uninstall"
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"monitorLabel": "ProxMenux Monitor → pestaña de Seguridad",
|
||||
"monitorTail": " — misma instalación accesible desde el panel, más estado en vivo de los jails, IPs baneadas y ajuste por jail de reintentos / tiempo de ban desde el navegador.",
|
||||
"lynisLabel": "Lynis",
|
||||
"lynisTail": " — ejecuta una auditoría de seguridad antes/después para confirmar que el control SSH-7408 se satisface.",
|
||||
"securityLabel": "Resumen de Seguridad",
|
||||
"securityTail": " — volver al resumen de la sección."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Seguridad de Proxmox — Fail2Ban, auditoría de hardening con Lynis | ProxMenux",
|
||||
"description": "Dos herramientas de seguridad instalables para Proxmox VE: Fail2Ban (prevención de intrusiones para SSH, la UI web de Proxmox y el Monitor de ProxMenux) y Lynis (escáner de auditoría y hardening de seguridad instalado desde GitHub upstream).",
|
||||
"ogTitle": "Seguridad de Proxmox — Fail2Ban, auditoría de hardening con Lynis",
|
||||
"ogDescription": "Fail2Ban y Lynis para Proxmox VE — prevención de intrusiones más una auditoría de hardening instaladas y gestionadas por ProxMenux.",
|
||||
"twitterTitle": "Seguridad de Proxmox | ProxMenux",
|
||||
"twitterDescription": "Fail2Ban y Lynis para Proxmox VE — prevención de intrusiones y auditoría de hardening."
|
||||
},
|
||||
"header": {
|
||||
"title": "Seguridad",
|
||||
"description": "Dos herramientas de seguridad complementarias para Proxmox VE: una defensa activa (Fail2Ban — banea IPs que atacan SSH o las UIs web) y una auditoría offline (Lynis — escanea el sistema en busca de huecos de hardening y da una puntuación 0–100). Ambas se instalan y gestionan mediante su propio menú dedicado, con detección de una instalación existente antes de cualquier acción.",
|
||||
"section": "Seguridad"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Defensa activa vs. auditoría offline",
|
||||
"body": "Estas dos herramientas responden a preguntas distintas. <strong>Fail2Ban</strong> responde a <em>\"¿hay algo atacándonos ahora mismo?\"</em> vigilando los logs de autenticación y baneando las IPs ofensoras. <strong>Lynis</strong> responde a <em>\"¿cómo de hardened está este host?\"</em> ejecutando una auditoría de un tirón e imprimiendo recomendaciones concretas. Úsalas juntas: Lynis te dice qué arreglar, Fail2Ban gestiona el abuso en vivo."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir el menú",
|
||||
"body": "Desde el menú principal de ProxMenux, selecciona <strong>Seguridad</strong>. Verás esto:",
|
||||
"imageAlt": "Menú de Seguridad con opciones de Fail2Ban y Lynis"
|
||||
},
|
||||
"pick": {
|
||||
"heading": "Elige tu herramienta",
|
||||
"body": "Las dos herramientas de seguridad son independientes — instala una, ambas o ninguna. Cada tarjeta de abajo salta a la sección que explica la herramienta en detalle."
|
||||
},
|
||||
"cards": {
|
||||
"fail2ban": {
|
||||
"title": "Fail2Ban",
|
||||
"body": "Prevención de intrusiones activa. Vigila los logs de autenticación de SSH y las UIs web y banea IPs tras fallos repetidos.",
|
||||
"bullets": [
|
||||
"Tres jails: SSH, Proxmox UI (8006), ProxMenux Monitor (8008)",
|
||||
"Arregla los valores por defecto de journald de Proxmox que bloquean los logs de autenticación",
|
||||
"Detección automática de nftables / iptables",
|
||||
"Hardening de SSH: MaxAuthTries=3 (recomendación de Lynis)"
|
||||
]
|
||||
},
|
||||
"lynis": {
|
||||
"title": "Lynis",
|
||||
"body": "Auditor de seguridad offline. Escanea el host e imprime una puntuación de hardening más pistas concretas de remediación.",
|
||||
"bullets": [
|
||||
"Instalado desde el GitHub upstream de CISOfy (siempre el último)",
|
||||
"Puntuación de hardening 0–100 + lista de warnings y sugerencias",
|
||||
"Acciones de ejecutar auditoría y actualizar dentro del menú",
|
||||
"De solo lectura por diseño — nunca cambia el sistema"
|
||||
]
|
||||
}
|
||||
},
|
||||
"workflowTip": {
|
||||
"title": "Flujo de trabajo que usa ambos",
|
||||
"body": "Ejecuta primero una auditoría de Lynis para ver tu puntuación de partida y las recomendaciones principales. Aplica los arreglos que quieras. Después instala Fail2Ban — implementa una de las recomendaciones más comunes de Lynis (protección contra fuerza bruta SSH) automáticamente y ajusta <code>MaxAuthTries</code> en <code>sshd_config</code> para satisfacer el control SSH-7408. Vuelve a ejecutar Lynis después para confirmar que la puntuación mejoró."
|
||||
},
|
||||
"fail2banSection": {
|
||||
"heading": "Fail2Ban",
|
||||
"body": "ProxMenux instala Fail2Ban con una configuración afinada específicamente para Proxmox. Más allá del jail estándar de SSH, añade protección para la UI web de Proxmox y el Monitor de ProxMenux, y rodea dos rarezas específicas de Proxmox: un valor por defecto de journald que descarta eventos de autenticación, y el problema del backend systemd que impide a Fail2Ban leer de forma fiable ciertas fuentes del journal. La página de detalle cubre el flujo de instalación completo, los tres jails, el arreglo de journald, el cambio de hardening SSH y la chuleta de solución de problemas.",
|
||||
"optionTitle": "Fail2Ban — instalar y gestionar",
|
||||
"optionDescription": "Tres jails preconfigurados (sshd agresivo, Proxmox UI puerto 8006, ProxMenux Monitor puerto 8008 + proxy inverso), backend nftables/iptables autodetectado, arreglo de journald y hardening de SSH MaxAuthTries."
|
||||
},
|
||||
"lynisSection": {
|
||||
"heading": "Lynis",
|
||||
"body": "ProxMenux clona Lynis desde <code>github.com/CISOfy/lynis</code> en <code>/opt/lynis</code> y lo expone como <code>/usr/local/bin/lynis</code>. El paquete de Debian se evita intencionadamente porque va varias versiones mayores por detrás de upstream. La página de detalle cubre el flujo de instalar / auditar / actualizar / desinstalar, cómo leer el informe y cómo actuar sobre los hallazgos.",
|
||||
"optionTitle": "Lynis — instalar, auditar y gestionar",
|
||||
"optionDescription": "Instala el último Lynis desde el repo oficial de CISOfy en GitHub (no el paquete más antiguo de Debian), ejecuta auditorías del sistema con puntuación de hardening y actualiza vía git pull."
|
||||
},
|
||||
"componentStatus": {
|
||||
"heading": "Estado de componentes",
|
||||
"body": "Ambos instaladores registran su estado en <code>/usr/local/share/proxmenux/components_status.json</code> bajo la categoría <code>security</code>. ProxMenux usa este archivo para decidir si mostrar el menú de instalar o el de gestionar en ejecuciones sucesivas, y los mismos datos alimentan los paneles en el Monitor de ProxMenux cuando está presente."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Lynis | ProxMenux Documentation",
|
||||
"description": "Instala Lynis desde el repositorio oficial de CISOfy en GitHub (siempre el último), ejecuta una auditoría del sistema con puntuación de hardening 0–100, actualiza vía git pull. De solo lectura por diseño — nunca modifica el sistema.",
|
||||
"ogTitle": "Lynis | ProxMenux Documentation",
|
||||
"ogDescription": "Instala y ejecuta el auditor de seguridad Lynis en Proxmox VE. Instalación desde GitHub upstream, auditoría, actualización."
|
||||
},
|
||||
"header": {
|
||||
"title": "Lynis",
|
||||
"description": "Clona el último Lynis desde el repositorio oficial de CISOfy en GitHub, lo expone como /usr/local/bin/lynis y ofrece acciones de ejecutar auditoría / actualizar / reinstalar / desinstalar desde el menú. Auditor de solo lectura por diseño — nunca modifica el sistema, solo reporta.",
|
||||
"section": "Seguridad"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Instala Lynis (el auditor de seguridad de código abierto de CISOfy) desde GitHub upstream en <code>/opt/lynis</code> y crea un wrapper en <code>/usr/local/bin/lynis</code> para que esté en tu <code>PATH</code>. Detecta una instalación existente al arrancar y muestra un menú de gestión (auditoría / actualizar / reinstalar / eliminar) en su lugar."
|
||||
},
|
||||
"manageMenu": {
|
||||
"heading": "Menú de gestión (tras la instalación)",
|
||||
"intro": "Una vez instalado Lynis, cada invocación posterior abre el menú de gestión en lugar de volver a ejecutar el instalador. Desde aquí lanzas una auditoría, actualizas vía git pull, reinstalas o desinstalas:",
|
||||
"imageAlt": "Menú de gestión de Lynis con opciones de auditoría, actualizar, reinstalar y eliminar"
|
||||
},
|
||||
"whyUpstream": {
|
||||
"heading": "Por qué GitHub upstream, no apt",
|
||||
"intro": "Debian entrega Lynis vía apt, pero el paquete suele ir varias versiones mayores por detrás de upstream. Los controles más nuevos, los arreglos para nuevos vectores de ataque y las recomendaciones refinadas solo aterrizan en el repo de GitHub. El propio Lynis es un script de shell autocontenido — sin compilación, sin dependencias más allá de <code>git</code> para la instalación — así que clonar el repo es el método de instalación canónico recomendado por la propia CISOfy.",
|
||||
"headerSource": "Origen",
|
||||
"headerPath": "Ruta de instalación",
|
||||
"headerUpdate": "Método de actualización",
|
||||
"headerFresh": "Frescura de versión",
|
||||
"rows": [
|
||||
{
|
||||
"sourceRich": "<strong>ProxMenux (este script)</strong>",
|
||||
"path": "/opt/lynis/",
|
||||
"update": "git pull (desde el menú)",
|
||||
"fresh": "Última versión upstream"
|
||||
},
|
||||
{
|
||||
"sourceRich": "<strong>Debian apt</strong>",
|
||||
"path": "/usr/bin/lynis",
|
||||
"update": "apt upgrade",
|
||||
"fresh": "A menudo meses / años por detrás"
|
||||
}
|
||||
]
|
||||
},
|
||||
"install": {
|
||||
"heading": "Cómo funciona la instalación",
|
||||
"node1Label": "github.com/CISOfy/lynis",
|
||||
"node1Detail": "git clone\n(instala git primero si falta)",
|
||||
"node2Label": "/opt/lynis/",
|
||||
"node2Detail": "repo completo\nincluyendo script ./lynis",
|
||||
"node3Label": "/usr/local/bin/lynis",
|
||||
"node3Detail": "wrapper:\ncd /opt/lynis && ./lynis $@",
|
||||
"outro": "El wrapper es obligatorio — Lynis insiste en ejecutarse desde su propio directorio porque carga rutas relativas para plugins y datos de perfil. El wrapper oculta ese detalle para que <code>lynis audit system</code> simplemente funcione desde cualquier sitio."
|
||||
},
|
||||
"detection": {
|
||||
"heading": "Rutas de detección",
|
||||
"intro": "Antes de mostrar el menú, el script comprueba tres ubicaciones para decidir si Lynis ya está presente:",
|
||||
"items": [
|
||||
"<code>/usr/local/bin/lynis</code> — wrapper instalado por ProxMenux",
|
||||
"<code>/opt/lynis/lynis</code> — ruta directa (por si el wrapper se eliminó)",
|
||||
"<code>/usr/bin/lynis</code> — versión instalada por apt, si el usuario la instaló así anteriormente"
|
||||
],
|
||||
"outro": "Si se encuentra cualquiera de estas, se abre el menú de gestión. El script <strong>no</strong> desinstala un Lynis instalado por apt — solo el que él mismo gestiona (<code>/opt/lynis</code> + el wrapper)."
|
||||
},
|
||||
"audit": {
|
||||
"heading": "Ejecutar una auditoría",
|
||||
"intro": "Desde el menú de gestión, elige <strong>Ejecutar auditoría de seguridad ahora</strong>. Esto equivale a ejecutar:",
|
||||
"code": "lynis audit system --no-colors",
|
||||
"outro": "La auditoría tarda de 30 segundos a unos minutos según el tamaño del host. La salida fluye directamente al terminal — no hay spinner. Lynis imprime secciones por cada categoría de control, marcando cada test como <ok>[ OK ]</ok>, <warn>[ WARNING ]</warn> o <sugg>[ SUGGESTION ]</sugg>. El resumen al final tiene los números titulares:",
|
||||
"summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================"
|
||||
},
|
||||
"report": {
|
||||
"heading": "Leer el informe",
|
||||
"intro": "Las dos secciones importantes son <strong>Warnings</strong> (cosas que deberías arreglar pronto) y <strong>Suggestions</strong> (recomendaciones para mejorar el hardening). Cada item lleva un ID de control como <code>SSH-7408</code> — útil al buscar en la documentación de Lynis la justificación y el arreglo.",
|
||||
"headerMarker": "Marcador",
|
||||
"headerMeaning": "Significado",
|
||||
"headerAction": "Acción",
|
||||
"rows": [
|
||||
{
|
||||
"markerRich": "<strong>OK</strong>",
|
||||
"meaning": "Test superado",
|
||||
"action": "Nada"
|
||||
},
|
||||
{
|
||||
"markerRich": "<strong>WARNING</strong>",
|
||||
"meaning": "Problema real, se recomienda arreglarlo",
|
||||
"action": "Lee la descripción del control, planea un arreglo"
|
||||
},
|
||||
{
|
||||
"markerRich": "<strong>SUGGESTION</strong>",
|
||||
"meaning": "Mejora de hardening disponible",
|
||||
"action": "Aplica si encaja en tu modelo de amenazas"
|
||||
}
|
||||
],
|
||||
"outro": "El informe completo y los datos legibles por máquina se escriben en <code>/var/log/lynis.log</code> y <code>/var/log/lynis-report.dat</code> por el propio Lynis."
|
||||
},
|
||||
"pairFail2ban": {
|
||||
"title": "Combina con Fail2Ban",
|
||||
"body": "SSH-7408 (MaxAuthTries) es uno de los warnings más comunes. Instalar <link>Fail2Ban</link> desde ProxMenux lo limpia automáticamente porque el instalador establece <code>MaxAuthTries=3</code> como parte de su paso de hardening de SSH. Vuelve a ejecutar Lynis después para confirmar que el warning ha desaparecido."
|
||||
},
|
||||
"update": {
|
||||
"heading": "Actualizar Lynis",
|
||||
"body": "Desde el menú de gestión, <strong>Actualizar Lynis a la última versión</strong> ejecuta <code>git pull --quiet</code> dentro de <code>/opt/lynis</code>. Si el directorio existe pero no es un checkout de Git (p. ej. alguien copió los archivos a mano), el script recae en una reinstalación completa."
|
||||
},
|
||||
"reinstall": {
|
||||
"heading": "Reinstalar / desinstalar",
|
||||
"headerAction": "Acción",
|
||||
"headerWhat": "Qué hace",
|
||||
"rows": [
|
||||
{
|
||||
"actionRich": "<strong>Reinstalar</strong>",
|
||||
"whatRich": "Elimina <code>/opt/lynis</code>, vuelve a clonar desde GitHub, recrea el wrapper. Úsalo si el checkout local está corrupto."
|
||||
},
|
||||
{
|
||||
"actionRich": "<strong>Eliminar</strong>",
|
||||
"whatRich": "Borra <code>/opt/lynis</code> y <code>/usr/local/bin/lynis</code>. Los logs en <code>/var/log/lynis*</code> se mantienen (son historial de auditoría). Un Lynis instalado por apt en <code>/usr/bin/lynis</code> se deja sin tocar."
|
||||
}
|
||||
]
|
||||
},
|
||||
"cli": {
|
||||
"heading": "Opciones CLI útiles",
|
||||
"intro": "Una vez instalado, Lynis se puede invocar directamente desde un shell con opciones extra no expuestas por el menú:",
|
||||
"code": "lynis show version # version + build date\nlynis show commands # list every available command\nlynis show details TEST-ID # explain a specific control\nlynis audit system --quick # skip slow tests (e.g. malware scan)\nlynis audit system --pentest # treat host as untrusted (more aggressive)\nlynis update info # check if a newer Lynis is available\n\n# Filter the report log for just the warnings\ngrep \"Warning\" /var/log/lynis.log\n\n# Same, for suggestions only\ngrep \"Suggestion\" /var/log/lynis.log"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"cloneTitle": "git clone falla durante la instalación",
|
||||
"cloneBody": "El host necesita acceso a red y DNS para alcanzar <code>github.com</code>. Desde una consola: <code>curl -sI https://github.com</code> y <code>git ls-remote https://github.com/CISOfy/lynis.git</code> revelarán el error real (DNS, TLS, proxy, URL del repo). Si se requiere un proxy, establece <code>https_proxy</code> en el entorno antes de volver a ejecutar el menú.",
|
||||
"notFoundTitle": "lynis: command not found tras la instalación",
|
||||
"notFoundIntro": "El wrapper en <code>/usr/local/bin/lynis</code> no se creó o se eliminó. Arreglo más rápido: reinstalar desde el menú. Arreglo manual:",
|
||||
"notFoundCode": "cat > /usr/local/bin/lynis <<'EOF'\n#!/bin/bash\ncd /opt/lynis && ./lynis \"$@\"\nEOF\nchmod +x /usr/local/bin/lynis",
|
||||
"sshTitle": "La auditoría imprime \"Warning: Test SSH-7408 — MaxAuthTries set incorrectly\"",
|
||||
"sshIntro": "El demonio SSH permite demasiados intentos de autenticación por conexión. O bien instala <link>Fail2Ban</link> desde ProxMenux (que establece <code>MaxAuthTries=3</code> automáticamente) o edita <code>/etc/ssh/sshd_config</code> a mano:",
|
||||
"sshCode": "sed -i 's/^#?MaxAuthTries.*/MaxAuthTries 3/' /etc/ssh/sshd_config\nsystemctl reload sshd",
|
||||
"scoreTitle": "La puntuación bajó tras una actualización de Proxmox",
|
||||
"scoreBody": "Ejecuta <code>lynis update info</code> primero — una actualización de Lynis puede haber añadido controles nuevos que marcan configuración existente. Actualiza Lynis desde el menú, vuelve a auditar y atiende los nuevos hallazgos."
|
||||
},
|
||||
"files": {
|
||||
"heading": "Archivos escritos",
|
||||
"code": "/opt/lynis/ # full Lynis git checkout\n/usr/local/bin/lynis # wrapper script (cd + exec)\n/var/log/lynis.log # human-readable audit log (Lynis itself)\n/var/log/lynis-report.dat # machine-readable report (Lynis itself)"
|
||||
},
|
||||
"sample": {
|
||||
"heading": "Informe de ejemplo",
|
||||
"intro": "ProxMenux Monitor empaqueta cada ejecución de Lynis en un PDF de varias páginas disponible desde la <link>pestaña de Seguridad</link> en el panel. La primera página es el resumen ejecutivo — puntuación de hardening, info del sistema, vista general de la postura de seguridad. Las páginas siguientes listan cada warning con explicación y cada sugerencia rankeada por impacto, más el inventario de paquetes usado durante la auditoría.",
|
||||
"imageAlt": "Primera página del PDF del Lynis Security Audit Report — resumen ejecutivo con Hardening Index 71/100, bloque de información del sistema y vista general de la postura de seguridad con firewall, escáner de malware y recuento de paquetes instalados",
|
||||
"captionPrefix": "Primera página de un informe de ejemplo. El PDF completo (",
|
||||
"captionLink": "ejemplo",
|
||||
"captionSuffix": ") continúa con warnings detallados, sugerencias y la lista de paquetes instalados.",
|
||||
"cli": "En el lado CLI los mismos datos están en <code>/var/log/lynis-report.dat</code> (archivo plano legible por máquina) y <code>/var/log/lynis.log</code> (log de ejecución legible por humanos). El PDF lo genera bajo demanda ProxMenux Monitor — ejecutar <code>lynis</code> desde la línea de comandos no produce uno."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/monitor/dashboard/security",
|
||||
"label": "ProxMenux Monitor → pestaña de Seguridad",
|
||||
"tail": " — ejecuta la auditoría, navega informes históricos y descarga el PDF directo desde el panel."
|
||||
},
|
||||
{
|
||||
"href": "/docs/security/fail2ban",
|
||||
"label": "Fail2Ban",
|
||||
"tailRich": " — implementa la protección contra fuerza bruta SSH que Lynis recomienda."
|
||||
},
|
||||
{
|
||||
"href": "/docs/security",
|
||||
"label": "Resumen de Seguridad",
|
||||
"tail": " — volver al resumen de la sección."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "HTTPS para ProxMenux Monitor — certificado del host Proxmox o rutas personalizadas | ProxMenux",
|
||||
"description": "Sirve ProxMenux Monitor sobre HTTPS usando o bien el certificado del host Proxmox (autodetectado, incluyendo el certificado Let's Encrypt subido vía la pestaña ACME de Proxmox) o un certificado personalizado en cualquier ruta del disco.",
|
||||
"ogTitle": "HTTPS para ProxMenux Monitor — certificado del host Proxmox o personalizado",
|
||||
"ogDescription": "Habilita HTTPS en el puerto 8008 con el certificado del host Proxmox o cualquier par .pem / .key personalizado."
|
||||
},
|
||||
"header": {
|
||||
"title": "HTTPS para ProxMenux Monitor",
|
||||
"description": "Activa HTTPS para el Monitor (puerto 8008) usando o bien el certificado del host Proxmox que el Monitor autodetecta, o un certificado personalizado ubicado en cualquier sitio del disco. La opción de Proxmox elige de forma transparente el certificado subido por ACME cuando está presente, así que un certificado Let's Encrypt gestionado por la UI de Proxmox se reutiliza sin un trabajo de renovación extra.",
|
||||
"section": "Seguridad"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué cubre esta página",
|
||||
"body": "Cómo cambiar el Monitor de HTTP a HTTPS en el panel Settings → Security, a qué apunta realmente cada fuente de certificado en disco, cómo se comporta la opción de Proxmox cuando el host tiene un certificado Let's Encrypt y cómo establecer rutas personalizadas si gestionas certificados fuera de Proxmox."
|
||||
},
|
||||
"wheresetting": {
|
||||
"heading": "Dónde vive el ajuste",
|
||||
"body": "Abre el Monitor y ve a <strong>Settings → Security → HTTPS / SSL</strong>. El panel muestra el estado actual (HTTP o HTTPS), y en un host sin HTTPS aún lista las fuentes de certificado que el Monitor ha podido detectar.",
|
||||
"imageAlt": "Panel Settings → Security → HTTPS / SSL en el Monitor mostrando el estado HTTPS desactivado, el certificado de Proxmox autodetectado (subject, issuer, expiry) y la opción Use Custom Certificate",
|
||||
"caption": "Panel Settings → Security → HTTPS / SSL antes de la activación. El Monitor saca a la luz el certificado que el propio Proxmox está usando y lo ofrece como una fuente de un solo clic."
|
||||
},
|
||||
"twoways": {
|
||||
"heading": "Dos formas de habilitar HTTPS",
|
||||
"proxmox": {
|
||||
"title": "Usar el certificado de Proxmox",
|
||||
"summary": "Un clic. El Monitor reutiliza el certificado que el propio Proxmox VE sirve en el puerto 8006.",
|
||||
"items": [
|
||||
"Autodetectado — no hay ruta que teclear",
|
||||
"Elige el certificado subido por ACME si está presente, recae en el self-signed por defecto",
|
||||
"La renovación pasa por Proxmox; el Monitor sigue automáticamente en el siguiente arranque"
|
||||
]
|
||||
},
|
||||
"custom": {
|
||||
"title": "Usar un certificado personalizado",
|
||||
"summaryRich": "Apunta el Monitor a un par <code>.pem</code> / <code>.key</code> en cualquier sitio del disco.",
|
||||
"items": [
|
||||
"Solo rutas absolutas (el proceso del Monitor debe poder leer ambos)",
|
||||
"Útil cuando los certificados vienen de <code>certbot</code>, <code>acme.sh</code> o un wildcard",
|
||||
"La renovación es tuya — reinicia el servicio del Monitor tras que el archivo cambie"
|
||||
]
|
||||
}
|
||||
},
|
||||
"proxmoxCert": {
|
||||
"heading": "Certificado de Proxmox — a qué apunta realmente",
|
||||
"intro": "Proxmox VE mantiene dos pares de certificado en <code>/etc/pve/local/</code>:",
|
||||
"table": {
|
||||
"headers": {
|
||||
"file": "Archivo",
|
||||
"origin": "Origen",
|
||||
"when": "Cuándo lo usa el Monitor"
|
||||
},
|
||||
"rows": [
|
||||
{
|
||||
"fileRich": "<code>pveproxy-ssl.pem</code><br /><code>pveproxy-ssl.key</code>",
|
||||
"originRich": "Certificado personalizado subido vía la UI de Proxmox — incluyendo el certificado Let's Encrypt emitido en <em>Datacenter → Node → Certificates → ACME</em>.",
|
||||
"when": "Preferido siempre que existan ambos archivos. El Monitor seguirá el certificado que el propio Proxmox está sirviendo."
|
||||
},
|
||||
{
|
||||
"fileRich": "<code>pve-ssl.pem</code><br /><code>pve-ssl.key</code>",
|
||||
"originRich": "Certificado self-signed generado en el momento de la instalación por el PKI de Proxmox.",
|
||||
"whenRich": "Fallback cuando no hay <code>pveproxy-ssl.pem</code> presente."
|
||||
}
|
||||
]
|
||||
},
|
||||
"callout": {
|
||||
"title": "Misma prioridad que el propio Proxmox",
|
||||
"bodyRich": "<code>pveproxy</code> usa la misma regla de selección, así que elegir la opción de Proxmox en el Monitor siempre sirve el certificado que la UI web de Proxmox ya está sirviendo en el puerto 8006. Sin copias, sin pipeline de renovación aparte."
|
||||
}
|
||||
},
|
||||
"letsencrypt": {
|
||||
"heading": "Obtener un certificado Let's Encrypt vía Proxmox ACME",
|
||||
"intro": "Proxmox VE entrega su propio cliente ACME. Pulsar <em>\"Order Certificate Now\"</em> escribe el resultado en <code>/etc/pve/local/pveproxy-ssl.pem</code>, que es exactamente lo que el Monitor lee. La receta de cinco pasos de abajo es el mismo procedimiento que la <extlink1>guía oficial de Proxmox</extlink1> — destilada a los comandos que realmente necesitas ejecutar.",
|
||||
"prereqs": {
|
||||
"title": "Prerrequisitos",
|
||||
"items": [
|
||||
"El nodo tiene un nombre DNS real (no solo una IP) apuntándole.",
|
||||
"<strong>O bien</strong> puerto 80 alcanzable desde la internet pública (challenge HTTP-01, el más simple), <strong>o bien</strong> un proveedor de DNS con credenciales API (challenge DNS-01 — funciona detrás de NAT, soporta wildcards).",
|
||||
"Una dirección de email para la cuenta ACME."
|
||||
]
|
||||
},
|
||||
"step1": {
|
||||
"heading": "Paso 1 — Registrar la cuenta ACME",
|
||||
"introRich": "Reemplaza el email por el tuyo. El nombre de cuenta <code>default</code> es solo una etiqueta — puedes usar cualquier cadena.",
|
||||
"code": "pvenode acme account register default you@example.com",
|
||||
"afterRich": "Proxmox te pide aceptar los términos de servicio de Let's Encrypt. Tras eso la cuenta se persiste en <code>/etc/pve/priv/acme/</code> y la pestaña ACME en la GUI la mostrará."
|
||||
},
|
||||
"step2": {
|
||||
"heading": "Paso 2 — Elige un tipo de challenge",
|
||||
"http01Rich": "<strong>HTTP-01</strong> es el más fácil: está integrado, sin plugin extra. Let's Encrypt se conecta a <code>http://<your-host>/.well-known/acme-challenge/...</code> en el puerto 80, así que el puerto 80 debe estar abierto desde la internet pública a tu nodo — típicamente un port forward en tu router.",
|
||||
"dns01Rich": "<strong>DNS-01</strong> funciona sin exponer el puerto 80 (bueno para homelabs detrás de CG-NAT) y es la única opción para certificados wildcard. Añades un plugin DNS una vez con el token API de tu proveedor. Ejemplo con Cloudflare:",
|
||||
"code": "pvenode acme plugin add dns cf \\\n --api cloudflare \\\n --data CF_Token=YOUR_CLOUDFLARE_API_TOKEN",
|
||||
"outroRich": "Para otros proveedores (Gandi, OVH, AWS Route 53, etc.) consulta <code>pvenode acme plugin add dns --help</code> — Proxmox entrega <extlink2>todos los plugins DNS de acme.sh</extlink2>."
|
||||
},
|
||||
"step3": {
|
||||
"heading": "Paso 3 — Asocia el dominio a tu nodo",
|
||||
"http01Rich": "Para HTTP-01 (usa el plugin <code>standalone</code> integrado):",
|
||||
"code1": "pvenode config set --acme domains=host.example.com,account=default",
|
||||
"dns01": "Para DNS-01 con el plugin de Cloudflare del paso 2:",
|
||||
"code2": "pvenode config set --acmedomain0 domain=host.example.com,plugin=cf\npvenode config set --acme account=default",
|
||||
"wildcardRich": "¿Wildcard? Añade <code>domain=*.example.com</code> en una entrada <code>--acmedomainN</code> separada. Los wildcards requieren DNS-01."
|
||||
},
|
||||
"step4": {
|
||||
"heading": "Paso 4 — Pide el certificado",
|
||||
"code": "pvenode acme cert order",
|
||||
"afterRich": "La primera ejecución suele tardar 30–60 segundos mientras el challenge se propaga. En caso de éxito Proxmox escribe <code>/etc/pve/local/pveproxy-ssl.pem</code> + <code>.key</code>, reinicia <code>pveproxy</code> y un cron de renovación se programa automáticamente (los certificados Let's Encrypt son válidos 90 días; Proxmox los renueva a los 60)."
|
||||
},
|
||||
"step5": {
|
||||
"heading": "Paso 5 — Verifica el issuer",
|
||||
"code": "openssl x509 -in /etc/pve/local/pveproxy-ssl.pem -noout -issuer",
|
||||
"afterRich": "Debería imprimir un issuer empezando por <code>O = Let's Encrypt</code>. Si en su lugar pone <code>CN = Proxmox Virtual Environment</code> la orden falló y el archivo sigue siendo el certificado self-signed de PVE — vuelve a ejecutar <code>pvenode acme cert order --debug 1</code> para ver por qué."
|
||||
},
|
||||
"gui": {
|
||||
"title": "¿Prefieres la GUI? Los mismos cinco pasos",
|
||||
"bodyRich": "<em>Datacenter → ACME</em> registra la cuenta, <em>Datacenter → ACME → Plugins</em> añade el plugin DNS, <em>Node → Certificates → ACME</em> asocia el dominio y <em>Order Certificates Now</em> ejecuta el paso 4. Los comandos CLI de arriba son útiles para scriptar y para setups headless / solo CLI."
|
||||
}
|
||||
},
|
||||
"switchToHttps": {
|
||||
"heading": "Cambiar el Monitor a HTTPS",
|
||||
"bodyRich": "Una vez que <code>/etc/pve/local/pveproxy-ssl.pem</code> está firmado por Let's Encrypt, el lado del Monitor es un clic: abre <strong>Settings → Security → HTTPS / SSL</strong>, confirma que el issuer mostrado en el panel del certificado detectado pone <em>Let's Encrypt</em> (y no la CA local de Proxmox) y pulsa <strong>Use Proxmox Certificate</strong>. El servicio del Monitor reinicia y la siguiente carga del navegador es HTTPS en el puerto 8008 — sin warning de certificado, ya que la cadena está confiada públicamente."
|
||||
},
|
||||
"custom": {
|
||||
"heading": "Certificado personalizado — cuándo usarlo",
|
||||
"intro": "Pulsa <strong>Use Custom Certificate</strong> para introducir dos rutas absolutas:",
|
||||
"items": [
|
||||
"<strong>Certificado</strong> — cadena completa en PEM (<code>.pem</code> o <code>.crt</code>).",
|
||||
"<strong>Clave privada</strong> — clave correspondiente en PEM (<code>.key</code>)."
|
||||
],
|
||||
"outro": "Ambos archivos los lee el proceso del Monitor al arrancar. Asegúrate de que se mantengan legibles por el usuario con el que corre la unidad systemd (root por defecto). Ubicaciones comunes cuando ACME se gestiona fuera de Proxmox:",
|
||||
"code": "# certbot\n/etc/letsencrypt/live/<your-host>/fullchain.pem\n/etc/letsencrypt/live/<your-host>/privkey.pem\n\n# acme.sh\n~/.acme.sh/<your-host>_ecc/fullchain.cer\n~/.acme.sh/<your-host>_ecc/<your-host>.key",
|
||||
"symlinkCallout": {
|
||||
"title": "Destinos de symlink vs. archivos",
|
||||
"bodyRich": "<code>certbot</code> almacena los archivos reales en <code>/etc/letsencrypt/archive/</code> y la ruta <code>live/</code> es un symlink. Apunta el Monitor al symlink de <code>live/</code>, no al archivo de <code>archive/</code> — así cada ciclo de renovación simplemente reescribe el destino del symlink y el Monitor toma el nuevo certificado en el siguiente arranque del servicio."
|
||||
}
|
||||
},
|
||||
"afterHttps": {
|
||||
"heading": "Tras habilitar HTTPS",
|
||||
"bodyRich": "Guardar el cambio escribe <code>/etc/proxmenux/ssl_config.json</code> y dispara un reinicio de la unidad systemd <code>proxmenux-monitor</code>. La pestaña del navegador perderá su conexión actual — recárgala en <code>https://<host>:8008/</code>. La primera carga con un certificado Let's Encrypt no debería mostrar warning; con el certificado self-signed de Proxmox el navegador requerirá una excepción, la misma que para el puerto 8006.",
|
||||
"reverse": {
|
||||
"heading": "Proxies inversos y webhooks",
|
||||
"bodyRich": "Cuando el Monitor cambia a HTTPS, las URLs de webhook de Proxmox VE registradas para notificaciones también pasan de <code>http://</code> a <code>https://</code> automáticamente. Las entradas de webhook existentes se reescriben la próxima vez que una regla de notificación se guarda o se vuelve a detectar, así que no hace falta edición manual de la configuración de notificaciones de Proxmox."
|
||||
}
|
||||
},
|
||||
"trustCa": {
|
||||
"heading": "Confiar en la CA self-signed de Proxmox",
|
||||
"intro1Rich": "Si prefieres mantener el certificado por defecto generado por Proxmox (sin ACME), puedes parar el warning del navegador importando la CA raíz del clúster en el almacén de confianza del SO o navegador. El Monitor seguirá autodetectando el mismo <code>/etc/pve/local/pveproxy-ssl.pem</code>; lo único que cambia es que el dispositivo que ve el panel ahora reconoce el issuer.",
|
||||
"intro2Rich": "El archivo de la CA vive en <code>/etc/pve/pve-root-ca.pem</code> en cada nodo. En un clúster la ruta está en el sistema de archivos compartido <code>pmxcfs</code>, así que todos los nodos comparten la misma raíz, y una sola importación cubre el datacenter entero. Cópialo a tu máquina:",
|
||||
"code": "scp root@<your-host>:/etc/pve/pve-root-ca.pem ./pve-root-ca.pem",
|
||||
"thenImport": "Después impórtalo en el lado del cliente:",
|
||||
"items": [
|
||||
"<strong>Linux (todo el sistema):</strong> <code>sudo cp pve-root-ca.pem /usr/local/share/ca-certificates/pve-root-ca.crt</code> seguido de <code>sudo update-ca-certificates</code>. Los navegadores que usan el almacén del sistema (Chromium, Edge) lo toman tras reiniciar; Firefox usa su propio almacén y necesita la importación manual de abajo.",
|
||||
"<strong>macOS:</strong> doble clic en el archivo <code>.pem</code>, se abre Keychain Access → añádelo al keychain del <em>Sistema</em> → establece <em>Trust → Always Trust</em>.",
|
||||
"<strong>Windows:</strong> clic derecho en el archivo → <em>Install Certificate</em> → colócalo en <em>Trusted Root Certification Authorities</em>.",
|
||||
"<strong>Firefox (cualquier SO):</strong> <em>Settings → Privacy y Security → Certificates → View Certificates → Authorities → Import</em>, marca <em>Trust this CA to identify websites</em>."
|
||||
],
|
||||
"standalone": {
|
||||
"title": "Nodos standalone fuera de un clúster",
|
||||
"bodyRich": "Cada host Proxmox no clusterizado tiene su propio <code>pve-root-ca.pem</code>. Si gestionas varios hosts standalone, repite la copia/importación para cada uno, o únelos a un clúster para que compartan una sola raíz."
|
||||
}
|
||||
},
|
||||
"disable": {
|
||||
"heading": "Deshabilitar HTTPS",
|
||||
"bodyRich": "Pulsa <strong>Disable HTTPS</strong> en el mismo panel. El servicio del Monitor reinicia de vuelta en HTTP plano — útil si un archivo de certificado personalizado se vuelve no legible y el servicio no vuelve a levantarse. No hay paso de desinstalación aparte; los propios archivos de certificado no se tocan.",
|
||||
"stateCallout": {
|
||||
"title": "Dónde vive el estado",
|
||||
"bodyRich": "<code>/etc/proxmenux/ssl_config.json</code> almacena las rutas de certificado activas y la fuente (<code>none</code>, <code>proxmox</code>, <code>custom</code>). Borrar el archivo equivale a deshabilitar HTTPS — en el siguiente arranque el Monitor recae en HTTP."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Cambiar canal de release | ProxMenux Documentation",
|
||||
"description": "Cambia ProxMenux entre los canales estable (main) y beta (develop) en un diálogo. Bidireccional, idempotente, ejecuta el instalador oficial para el canal elegido y normaliza el servicio del Monitor.",
|
||||
"ogTitle": "Cambiar canal de release | ProxMenux Documentation",
|
||||
"ogDescription": "Una opción de Settings para cambiar entre los canales estable y beta — sin volver a ejecutar instaladores a mano."
|
||||
},
|
||||
"header": {
|
||||
"title": "Cambiar canal de release",
|
||||
"description": "Una opción unificada de Settings para cambiar ProxMenux entre los canales estable (rama main) y beta (rama develop). La antigua \"Desactivar programa beta\" unidireccional se ha sustituido por un diálogo bidireccional que siempre ofrece ambas direcciones y ejecuta el instalador oficial del canal que elijas.",
|
||||
"section": "Settings"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué ha cambiado",
|
||||
"body": "Versiones anteriores de ProxMenux exponían dos flujos separados — \"Desactivar programa beta\" (solo visible cuando beta estaba activo) y una nueva ejecución manual del instalador beta para volver a unirte. Se han fusionado en una única entrada <strong>Cambiar canal de release</strong> siempre presente, que muestra el canal actual y te deja saltar entre estable y beta en cualquier dirección."
|
||||
},
|
||||
"why": {
|
||||
"heading": "Por qué existe esta opción",
|
||||
"intro": "ProxMenux se entrega desde dos ramas git:",
|
||||
"items": [
|
||||
"<strong>Estable</strong> — la rama <code>main</code>. A donde apunta el README, lo que la mayoría de operadores quieren, con una cadencia de releases más lenta y solo cambios que ya han pasado por validación beta.",
|
||||
"<strong>Beta</strong> — la rama <code>develop</code>. Funciones nuevas y builds del Monitor; lleva el tag que la próxima release estable heredará. Algunas cosas pueden no funcionar perfectamente — ese es el trato al que te apuntas y la forma en que las funciones nuevas se prueban antes de salir."
|
||||
],
|
||||
"outro": "Saltar entre canales requería antes recordar la URL del instalador correcta, copiarla del README y editar <code>config.json</code> a mano si algo se desincronizaba. La opción unificada hace todo el flujo como una única acción guiada."
|
||||
},
|
||||
"dialog": {
|
||||
"heading": "El diálogo",
|
||||
"intro": "Desde el menú principal, <strong>Settings → Cambiar canal de release</strong>. Aparece un menú de dos líneas:",
|
||||
"options": [
|
||||
"<code>stable</code> — Estable (rama main)",
|
||||
"<code>beta</code> — Beta (rama develop)"
|
||||
],
|
||||
"behaviour": "El canal actual aparece preseleccionado y mostrado en la parte superior del menú. Elegir el mismo canal devuelve un mensaje amable de \"Este canal de release ya está activo\" — el diálogo es totalmente idempotente. Elegir un canal distinto saca una confirmación con texto específico del canal:",
|
||||
"directions": [
|
||||
"<strong>Estable → Beta:</strong> avisa de que los builds beta pueden contener bugs o funciones incompletas.",
|
||||
"<strong>Beta → Estable:</strong> avisa de que las comprobaciones de actualizaciones beta cesarán y el instalador estable reinstalará los componentes del canal estable."
|
||||
]
|
||||
},
|
||||
"confirm": {
|
||||
"heading": "Qué pasa al confirmar",
|
||||
"items": [
|
||||
"<strong>Descarga el instalador oficial</strong> del canal de destino:<ul><li>Estable: <code>install_proxmenux.sh</code> desde <code>main</code></li><li>Beta: <code>install_proxmenux_beta.sh</code> desde <code>develop</code></li></ul>Se verifica que la descarga existe y se hace ejecutable antes del siguiente paso.",
|
||||
"<strong>Ejecuta el instalador</strong> de principio a fin. El instalador es el mismo que publica el README — sin ruta propia, sin atajos. Eso significa que la detección de componentes existentes, backups de archivos, instalación de dependencias, preservación de idioma, etc. se comportan idénticamente a una instalación recién hecha del canal de destino.",
|
||||
"Al cambiar a <strong>estable</strong>, el menú poda después cualquier metadato beta sobrante de <code>config.json</code>: <code>beta_program</code>, <code>beta_version</code>, <code>install_branch</code>, <code>update_available.beta*</code> se borran, y <code>proxmenux_monitor.status = beta_updated</code> se normaliza a <code>updated</code>. El archivo sobrante <code>beta_version.txt</code> y cualquier instalador beta descargado se eliminan.",
|
||||
"Al cambiar a estable, el archivo de la unidad systemd del Monitor también se reescribe desde la plantilla estable (elimina el sufijo \"Beta\" de la descripción de la unidad, apunta <code>ExecStart</code> de vuelta al directorio de runtime) para que un <code>systemctl status</code> fresco refleje el canal en el que estás.",
|
||||
"Recarga el menú de configuración. La siguiente visita a <em>Mostrar información de versión</em> mostrará el nuevo canal."
|
||||
]
|
||||
},
|
||||
"switching": {
|
||||
"heading": "Saltar adelante y atrás",
|
||||
"intro": "Ambas direcciones pasan por el mismo instalador — <strong>no</strong> son flujos especiales de desinstalación + reinstalación. Cada dirección simplemente ejecuta el instalador propio del canal, que está diseñado para ser idempotente y seguro de reejecutar sobre una instalación existente. Consecuencias prácticas:",
|
||||
"items": [
|
||||
"Tu configuración existente, login de ProxMenux Monitor (<code>auth.json</code>), canales de notificación, registro post-instalación, umbrales personalizados — nada de eso se toca. El cambio de canal solo intercambia el árbol de scripts y el AppImage binario.",
|
||||
"Un Monitor que estaba activo antes del cambio sigue activo después; uno que estaba desactivado sigue desactivado.",
|
||||
"El <code>auth.json</code>, los tokens de API y el secreto JWT de ProxMenux Monitor se preservan entre cambios de canal. Las sesiones no se cierran.",
|
||||
"Puedes saltar de canal tantas veces como quieras — el diálogo lo aceptará cada vez y volverá a ejecutar el instalador. No hace falta reiniciar Proxmox."
|
||||
]
|
||||
},
|
||||
"feedback": {
|
||||
"heading": "Reportar incidencias desde la beta",
|
||||
"intro": "Si algo se comporta de forma inesperada mientras estás en el canal beta, abrir una incidencia con suficiente contexto es lo que cierra la brecha hacia una release estable. El reporte más útil incluye:",
|
||||
"items": [
|
||||
"Qué hiciste y qué esperabas que pasara.",
|
||||
"Cualquier mensaje de error mostrado en pantalla.",
|
||||
"Los logs relevantes del Monitor:"
|
||||
],
|
||||
"logsCommand": "journalctl -u proxmenux-monitor -n 50 --no-pager",
|
||||
"versionLine": "La versión actual de ProxMenux (Settings → <link>Mostrar información de versión</link>).",
|
||||
"issueLine": "Abre una <ghlink>incidencia en GitHub</ghlink> con esa información y llegamos al arreglo más rápido."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"intro": "Si prefieres el shell o estás scriptando el cambio de canal, el diálogo no es más que un wrapper fino sobre estos comandos:"
|
||||
},
|
||||
"unifiedCallout": {
|
||||
"title": "Por qué ahora ambas direcciones son una sola opción",
|
||||
"body": "La antigua \"Desactivar programa beta\" solo existía si el host se había unido alguna vez a la beta. Los operadores que querían <em>unirse</em> tenían que encontrar la URL del instalador beta en otro sitio; los que querían <em>salir</em> a veces tenían que limpiar manualmente los metadatos <code>beta_*</code> para asegurarse. La opción unificada <strong>Cambiar canal de release</strong> siempre aparece, hace explícito el canal actual y trata ambas direcciones como el mismo tipo de operación — ejecutable, repetible, idempotente."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"downloadTitle": "\"No se pudo descargar el instalador\"",
|
||||
"downloadBody": "HTTPS saliente a <code>raw.githubusercontent.com</code> falló. Comprueba la conectividad y el DNS desde el host:",
|
||||
"downloadCmd": "curl -fsSL -o /tmp/test https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh && head -1 /tmp/test",
|
||||
"downloadOutro": "Si esto falla fuera de ProxMenux, es un problema de red / proxy en el host.",
|
||||
"errorsTitle": "\"El instalador terminó con errores\"",
|
||||
"errorsBody": "El instalador devolvió un código de salida distinto de cero. El canal anterior y los componentes ya instalados se quedan como estaban antes del cambio. Vuelve a ejecutar la acción; si sigue fallando, ejecuta el instalador manualmente desde un shell (mira el equivalente manual de arriba) — eso te da la salida completa en lugar del resumen del diálogo.",
|
||||
"configTitle": "\"No se pudo actualizar el archivo de configuración\" tras cambiar a estable",
|
||||
"configBody": "La limpieza post-instalación de metadatos beta falló — normalmente porque <code>config.json</code> tiene un error de sintaxis por una edición manual. Valídalo:",
|
||||
"configCmd": "jq . /usr/local/share/proxmenux/config.json",
|
||||
"configOutro": "Arregla o restaura el archivo y vuelve a ejecutar la opción."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/settings/show-version-information",
|
||||
"label": "Mostrar información de versión",
|
||||
"tail": " — confirma qué canal está activo ahora."
|
||||
},
|
||||
{
|
||||
"href": "/docs/settings/proxmenux-monitor",
|
||||
"label": "ProxMenux Monitor",
|
||||
"tail": " — el servicio del Monitor que se reconstruye como parte del cambio."
|
||||
},
|
||||
{
|
||||
"href": "/docs/settings",
|
||||
"label": "Resumen de Settings",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Cambiar idioma | ProxMenux Documentation",
|
||||
"description": "Cambia la UI de ProxMenux entre inglés, español, francés, alemán, italiano o portugués. Solo instalación con traducción — usa googletrans + una tabla de traducción precacheada. El menú se recarga automáticamente con el nuevo idioma.",
|
||||
"ogTitle": "Cambiar idioma | ProxMenux Documentation",
|
||||
"ogDescription": "Elige el idioma de la interfaz de ProxMenux desde el menú Settings. Seis idiomas soportados."
|
||||
},
|
||||
"header": {
|
||||
"title": "Cambiar idioma",
|
||||
"description": "Cambia la UI de ProxMenux entre seis idiomas soportados. Guarda la elección en config.json y vuelve a ejecutar el menú con el nuevo idioma. Solo disponible en el tipo de instalación con traducción — la instalación normal (ligera) es solo en inglés por diseño.",
|
||||
"section": "Settings"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué es esto",
|
||||
"body": "Un menú de diálogo que lista los seis idiomas soportados. Elige uno, ProxMenux lo guarda en <code>config.json</code> como <code>.language</code>, después vuelve a ejecutar <code>config_menu.sh</code> para que el nuevo idioma surta efecto inmediatamente."
|
||||
},
|
||||
"warn": {
|
||||
"title": "Solo instalación con traducción",
|
||||
"body": "Esta opción solo aparece en Settings si pasan ambas comprobaciones: existe <code>/opt/googletrans-env/bin/activate</code> (venv de Python con googletrans) <em>y</em> <code>config.json</code> tiene un <code>.language</code> no vacío. En la instalación normal (solo inglés) ninguno está presente y el selector de idioma no se muestra."
|
||||
},
|
||||
"supported": {
|
||||
"heading": "Idiomas soportados",
|
||||
"headerCode": "Código",
|
||||
"headerLang": "Idioma",
|
||||
"headerNotes": "Notas",
|
||||
"rows": [
|
||||
{
|
||||
"code": "en",
|
||||
"lang": "Inglés",
|
||||
"notes": "Idioma fuente — el más preciso"
|
||||
},
|
||||
{
|
||||
"code": "es",
|
||||
"lang": "Español",
|
||||
"notes": "Cacheado + autotraducido"
|
||||
},
|
||||
{
|
||||
"code": "fr",
|
||||
"lang": "Francés",
|
||||
"notes": "Cacheado + autotraducido"
|
||||
},
|
||||
{
|
||||
"code": "de",
|
||||
"lang": "Alemán",
|
||||
"notes": "Cacheado + autotraducido"
|
||||
},
|
||||
{
|
||||
"code": "it",
|
||||
"lang": "Italiano",
|
||||
"notes": "Cacheado + autotraducido"
|
||||
},
|
||||
{
|
||||
"code": "pt",
|
||||
"lang": "Portugués",
|
||||
"notes": "Cacheado + autotraducido"
|
||||
}
|
||||
]
|
||||
},
|
||||
"englishTip": {
|
||||
"title": "El inglés es el más preciso",
|
||||
"body": "Las cadenas en otros idiomas se producen mediante una tabla precacheada sembrada desde googletrans. Cadenas de casos límite (opciones que se disparan raramente, añadidos recientes) pueden caer en una llamada en vivo a googletrans o en el original inglés. Si una traducción no encaja, el inglés es siempre la fuente de verdad."
|
||||
},
|
||||
"underHood": {
|
||||
"heading": "Cómo funciona por dentro",
|
||||
"items": [
|
||||
"El menú de diálogo lista los 6 códigos; eliges uno.",
|
||||
"Si <code>config.json</code> existe: <code>jq --arg lang \"$new_language\" '.language = $lang'</code> actualiza el campo en sitio.",
|
||||
"Si <code>config.json</code> no existe: se crea uno nuevo con el código de idioma en un objeto de un solo campo.",
|
||||
"Diálogo de confirmación: <em>\"Idioma cambiado a <code>\"</em>.",
|
||||
"<code>exec bash config_menu.sh</code> recarga el menú Settings con el nuevo idioma activo."
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noOptionTitle": "La opción no aparece en Settings",
|
||||
"noOptionBody": "Estás en la instalación normal (solo inglés). Para obtener soporte de idiomas, reinstala ProxMenux eligiendo la opción de instalación con traducción (trae venv de Python + googletrans).",
|
||||
"stillEnglishTitle": "Cambié de idioma pero la UI sigue mostrando inglés",
|
||||
"stillEnglishBody": "El menú se vuelve a ejecutar tras el cambio. Si abriste un shell nuevo y arrancaste un entrypoint distinto de ProxMenux, ejecuta <code>menu</code> de nuevo para tomar el nuevo idioma. Confirma: <code>jq -r '.language' /usr/local/share/proxmenux/config.json</code>."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/settings/show-version-information",
|
||||
"label": "Mostrar información de versión",
|
||||
"tail": " — confirma el tipo de instalación y el idioma actual."
|
||||
},
|
||||
{
|
||||
"href": "/docs/settings",
|
||||
"label": "Resumen de Settings",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Settings de ProxMenux — Activación del Monitor, canal de release, idiomas | ProxMenux",
|
||||
"description": "Menú de configuración de ProxMenux: activación de ProxMenux Monitor y conmutador del servicio, restablecer contraseña del Monitor, cambiar canal de release entre estable y beta, selección de idioma (instalación con traducción), información de versión y desinstalación. Las opciones aparecen condicionalmente según lo que esté instalado y activo.",
|
||||
"ogTitle": "Settings de ProxMenux — Activación del Monitor, canal de release, idiomas",
|
||||
"ogDescription": "Configura ProxMenux — servicio del Monitor, canal de release, idioma, info de versión y desinstalación.",
|
||||
"twitterTitle": "Settings de ProxMenux",
|
||||
"twitterDescription": "Activación del Monitor, cambio de canal de release, idiomas, info de versión y desinstalación."
|
||||
},
|
||||
"header": {
|
||||
"title": "Settings",
|
||||
"description": "Menú de configuración de ProxMenux. Lista lo que está instalado, te deja conmutar el servicio del Monitor, restablecer la contraseña de login del Monitor, cambiar entre canales de release estable y beta en cualquier dirección, cambiar el idioma de la UI (solo instalación con traducción) y proporciona un desinstalador limpio. Las opciones aparecen condicionalmente — lo que ves depende de tu tipo de instalación y del estado actual.",
|
||||
"section": "Settings"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué sirve este menú",
|
||||
"body": "Auto-administración del propio ProxMenux: servicio del Monitor, salida del canal beta, idioma, diagnósticos de versión y el desinstalador. Nada en este menú toca tus VMs, contenedores ni almacenamiento."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir el menú",
|
||||
"body": "Desde el menú principal de ProxMenux, pulsa <kbd>s</kbd>. Las opciones mostradas dependen de tu tipo de instalación y de lo que esté actualmente activo:",
|
||||
"imageAlt": "Menú Settings de ProxMenux con opciones condicionales según el tipo de instalación y el estado de los componentes"
|
||||
},
|
||||
"installTypes": {
|
||||
"heading": "Dos tipos de instalación, menús distintos",
|
||||
"intro": "ProxMenux se entrega en dos sabores. El menú Settings se adapta al que tengas:",
|
||||
"headerType": "Tipo de instalación",
|
||||
"headerBundles": "Qué incluye",
|
||||
"headerMenu": "El menú muestra",
|
||||
"rows": [
|
||||
{
|
||||
"type": "Con traducción",
|
||||
"bundles": "venv de Python + googletrans + configuración multi-idioma",
|
||||
"menuRich": "<strong>Cambiar idioma</strong> + Mostrar versión + Desinstalar"
|
||||
},
|
||||
{
|
||||
"type": "Normal (ligera)",
|
||||
"bundles": "Solo inglés, sin venv, huella menor",
|
||||
"menu": "Mostrar versión + Desinstalar (sin selector de idioma)"
|
||||
}
|
||||
],
|
||||
"detectionTitle": "La detección es automática",
|
||||
"detectionBody": "El script comprueba <code>/opt/googletrans-env/bin/activate</code> y una clave <code>language</code> no vacía en <code>config.json</code>. Ambas presentes → instalación con traducción. Falta alguna → instalación normal. No eliges; el menú se adapta."
|
||||
},
|
||||
"options": {
|
||||
"heading": "Opciones del menú",
|
||||
"intro": "Cinco herramientas. Los badges de <em>Condicional</em> significan que la opción solo aparece cuando se cumple el prerrequisito (Monitor instalado; programa beta activo; instalación con traducción).",
|
||||
"list": [
|
||||
{
|
||||
"icon": "Activity",
|
||||
"href": "/docs/settings/proxmenux-monitor",
|
||||
"title": "ProxMenux Monitor",
|
||||
"description": "Activa / desactiva la unidad systemd proxmenux-monitor.service, comprueba su estado actual y restablece la contraseña de login del panel si se ha perdido. UI web disponible en TCP 8008.",
|
||||
"badge": "Condicional"
|
||||
},
|
||||
{
|
||||
"icon": "TestTube",
|
||||
"href": "/docs/settings/beta-program",
|
||||
"title": "Cambiar canal de release",
|
||||
"description": "Cambia entre estable (main) y beta (develop) en cualquier dirección desde un único diálogo. Ejecuta el instalador oficial para el canal elegido; idempotente y siempre visible.",
|
||||
"badge": "Siempre disponible"
|
||||
},
|
||||
{
|
||||
"icon": "Info",
|
||||
"href": "/docs/settings/show-version-information",
|
||||
"title": "Mostrar información de versión",
|
||||
"description": "Versión de ProxMenux, tipo de instalación, componentes instalados, rutas de archivos, estado del entorno virtual e idioma actual."
|
||||
},
|
||||
{
|
||||
"icon": "Trash2",
|
||||
"href": "/docs/settings/uninstall-proxmenux",
|
||||
"title": "Desinstalar ProxMenux",
|
||||
"description": "Elimina ProxMenux y (opcionalmente) sus dependencias. También restaura los backups de /root/.bashrc y /etc/motd creados en el momento de la instalación."
|
||||
}
|
||||
]
|
||||
},
|
||||
"configTip": {
|
||||
"title": "Dónde vive la configuración",
|
||||
"bodyRich": "La mayor parte del estado gestionado por este menú vive en <code>/usr/local/share/proxmenux/config.json</code> — <code>language</code>, <code>beta_program.status</code> y flags de instalación por componente. El estado del servicio del Monitor vive en systemd (<code>proxmenux-monitor.service</code>), no aquí. La versión se lee de <code>/usr/local/share/proxmenux/version.txt</code>."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor | ProxMenux Documentation",
|
||||
"description": "Activa o desactiva la unidad systemd proxmenux-monitor.service e inspecciona su estado actual. El Monitor expone una UI web en TCP 8008 para monitorización visual del host.",
|
||||
"ogTitle": "ProxMenux Monitor | ProxMenux Documentation",
|
||||
"ogDescription": "Conmuta el servicio systemd proxmenux-monitor y comprueba su estado desde el menú Settings."
|
||||
},
|
||||
"header": {
|
||||
"title": "ProxMenux Monitor",
|
||||
"description": "Dos acciones relacionadas dentro del menú Settings: conmutar la unidad systemd proxmenux-monitor.service (start / stop y enable / disable en un clic) y ver su estado detallado actual. El Monitor expone una UI web en TCP 8008 para monitorización visual del host.",
|
||||
"section": "Settings"
|
||||
},
|
||||
"intro": {
|
||||
"title": "¿Qué es ProxMenux Monitor?",
|
||||
"body": "ProxMenux Monitor es un panel web integrado que proporciona visibilidad en tiempo real de tu infraestructura Proxmox — accesible desde cualquier navegador en tu red, sin necesidad de terminal."
|
||||
},
|
||||
"offers": {
|
||||
"heading": "Qué ofrece",
|
||||
"items": [
|
||||
"Monitorización en tiempo real de CPU, RAM, uso de disco y tráfico de red.",
|
||||
"Resumen de VMs y contenedores LXC en ejecución con indicadores de estado.",
|
||||
"Autenticación de login para proteger el acceso.",
|
||||
"Autenticación de dos factores (2FA) con soporte TOTP.",
|
||||
"Soporte para proxy inverso (Nginx / Traefik).",
|
||||
"Diseñado para funcionar tanto en escritorio como en dispositivos móviles."
|
||||
]
|
||||
},
|
||||
"access": {
|
||||
"heading": "Acceso",
|
||||
"intro": "Una vez instalado, el panel está disponible en:",
|
||||
"url": "http://<your-proxmox-ip>:8008",
|
||||
"outro": "El Monitor se instala automáticamente como parte de la instalación estándar de ProxMenux y corre como un servicio systemd (<code>proxmenux-monitor.service</code>) que arranca automáticamente al iniciar."
|
||||
},
|
||||
"warnConditional": {
|
||||
"title": "Las opciones de Settings solo son visibles cuando el Monitor está instalado",
|
||||
"body": "Las dos entradas de menú descritas debajo solo aparecen en Settings si <code>proxmenux-monitor.service</code> está registrado en systemd. Si no las ves, el Monitor no se instaló (es opcional durante la instalación de ProxMenux). Para añadirlo más tarde, reinstala ProxMenux con la última versión y elige la opción de Monitor."
|
||||
},
|
||||
"toggle": {
|
||||
"heading": "Activar / Desactivar",
|
||||
"intro": "La primera entrada de menú es un único conmutador que alterna entre dos estados según si el servicio está actualmente corriendo:",
|
||||
"headerState": "Estado actual",
|
||||
"headerLabel": "Etiqueta del menú mostrada",
|
||||
"headerAction": "Acción al confirmar",
|
||||
"rows": [
|
||||
{
|
||||
"state": "active",
|
||||
"label": "Desactivar ProxMenux Monitor",
|
||||
"action": "systemctl stop + disable"
|
||||
},
|
||||
{
|
||||
"state": "inactive",
|
||||
"label": "Activar ProxMenux Monitor",
|
||||
"action": "systemctl enable + start"
|
||||
}
|
||||
],
|
||||
"outro": "Cada conmutación requiere un diálogo explícito sí/no antes de ejecutarse. Activar / Desactivar es simétrico: desactivar para el servicio <em>y</em> deshabilita el auto-arranque al iniciar; activar habilita el auto-arranque <em>y</em> arranca el servicio inmediatamente."
|
||||
},
|
||||
"status": {
|
||||
"heading": "Mostrar estado del servicio del Monitor",
|
||||
"intro": "La segunda entrada de menú es de solo lectura. Limpia la pantalla, muestra el logo de ProxMenux y el título <em>\"ProxMenux Monitor Service Verification\"</em>, después reporta:",
|
||||
"items": [
|
||||
"<strong>Estado del servicio:</strong> active, inactive o not_installed.",
|
||||
"<strong>URL de la UI web</strong> (solo cuando está activo): <code>http://<host_ip>:8008</code> — derivado de <code>hostname -I | awk '''{print $1}'''</code>.",
|
||||
"<strong>Salida detallada de systemd:</strong> <code>systemctl status proxmenux-monitor.service --no-pager -l</code> — muestra líneas de log recientes, ExecStart, MainPID, etc."
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"title": "Equivalentes manuales",
|
||||
"intro": "Desde cualquier shell:",
|
||||
"code": "systemctl status proxmenux-monitor.service # detailed status\nsystemctl is-active proxmenux-monitor.service # one-word status\nsystemctl enable --now proxmenux-monitor.service # enable + start\nsystemctl disable --now proxmenux-monitor.service # stop + disable\njournalctl -u proxmenux-monitor.service -f # follow live logs"
|
||||
},
|
||||
"reset": {
|
||||
"heading": "Restablecer contraseña del Monitor",
|
||||
"intro": "Ruta de recuperación para el operador que perdió la contraseña del panel (o el dispositivo 2FA). La opción solo aparece cuando el Monitor está instalado en el host. Al seleccionarla:",
|
||||
"items": [
|
||||
"Pide confirmación con un diálogo sí/no — la acción es destructiva para las credenciales de login.",
|
||||
"Hace backup del <code>/root/.config/proxmenux-monitor/auth.json</code> existente a <code>auth.json.bak-<UTC timestamp></code> (modo <code>0600</code>) para que el estado previo se pueda restaurar manualmente si el reset fue un error.",
|
||||
"Para el servicio <code>proxmenux-monitor</code> para que la edición en disco no compita con un login en vuelo.",
|
||||
"Limpia los campos de identidad en <code>auth.json</code>: <code>enabled=false</code>, <code>configured=false</code>, vacía <code>username</code>, <code>password_hash</code>, <code>totp_secret</code> y el array de códigos de backup.",
|
||||
"<strong>Preserva</strong> el <code>jwt_secret</code> y los <code>api_tokens</code> / <code>revoked_tokens</code> registrados — para que los tokens de API de larga vida usados por Home Assistant u otros scripts <em>sigan autenticando</em> tras el reset.",
|
||||
"Reinicia el servicio. La siguiente visita a <code>http://<host>:8008</code> muestra el asistente de configuración de primer lanzamiento para que se pueda crear una nueva cuenta de administrador."
|
||||
],
|
||||
"preservedTitle": "Qué sobrevive al reset, qué no",
|
||||
"preservedBody": "<strong>Borrado:</strong> nombre de usuario, hash de contraseña, secreto TOTP de 2FA, códigos de backup. <strong>Preservado:</strong> <code>jwt_secret</code>, metadatos de <code>api_tokens</code>, lista de <code>revoked_tokens</code>. Si quieres activamente invalidar también todo token de API existente (pizarra limpia total), borra <code>auth.json</code> manualmente en lugar de usar esta opción de menú — el siguiente arranque del servicio regenera el secreto JWT y todo lo demás desde cero.",
|
||||
"trustTitle": "El acceso al host físico es el ancla de confianza",
|
||||
"trustBody": "Esta ruta de reset requiere shell root en el host. Cualquiera que pueda ejecutar el comando <code>menu</code> como root ya controla la máquina, así que darle la recuperación de contraseña no es una escalada de privilegios — es coherente con cómo funciona cualquier otra herramienta de administración en Proxmox. El corolario: el login del Monitor no protegerá nada de alguien a quien ya hayas dejado entrar al shell de Proxmox.",
|
||||
"seeAlso": "Mira también <link>Monitor → Access y Auth → Recuperar una contraseña perdida</link> para el mismo flujo descrito desde el lado del panel, además del contexto más amplio sobre cómo se hashean las contraseñas y cómo se genera el secreto JWT."
|
||||
},
|
||||
"files": {
|
||||
"heading": "Archivos implicados",
|
||||
"code": "/etc/systemd/system/proxmenux-monitor.service # systemd unit\n/root/.config/proxmenux-monitor/ # runtime config dir\n/var/log/proxmenux-auth.log # Flask app auth log\n # (read by Fail2Ban [proxmenux] jail)"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"missingTitle": "Ambas opciones del menú faltan",
|
||||
"missingBody": "El Monitor no está registrado en systemd. Confirma con <code>systemctl list-unit-files | grep proxmenux-monitor</code> — si no hay salida, reinstala ProxMenux desde el instalador oficial con la última versión y elige la opción de Monitor durante la instalación.",
|
||||
"unreachableTitle": "Servicio activado pero la URL es inalcanzable",
|
||||
"unreachableBody": "La salida del estado en Settings te da la IP. Confirma:",
|
||||
"unreachableCmd": "ss -tlnp | grep 8008 # is anything listening?\njournalctl -u proxmenux-monitor -n 100 --no-pager # recent errors\ncurl -sI http://localhost:8008 # local reachability",
|
||||
"unreachableOutro": "Si localhost funciona pero el externo no, comprueba el firewall del host (<code>pve-firewall</code> o nftables) para TCP 8008 entrante.",
|
||||
"stopsTitle": "Activé el servicio pero se para solo unos segundos después",
|
||||
"stopsBody": "Lo más habitual es un conflicto de puerto (algo más en 8008) o una comprobación de dependencias fallando. El journal lo dirá: <code>journalctl -u proxmenux-monitor.service -b</code>."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/security/fail2ban",
|
||||
"label": "Fail2Ban",
|
||||
"tailRich": " — el jail <code>[proxmenux]</code> protege el Monitor en TCP 8008."
|
||||
},
|
||||
{
|
||||
"href": "/docs/settings",
|
||||
"label": "Resumen de Settings",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Mostrar información de versión | ProxMenux Documentation",
|
||||
"description": "Autodiagnóstico de ProxMenux de solo lectura: número de versión, tipo de instalación (con traducción / normal), componentes instalados desde config.json, rutas de archivos, estado del entorno virtual e idioma actual.",
|
||||
"ogTitle": "Mostrar información de versión | ProxMenux Documentation",
|
||||
"ogDescription": "Volcado de diagnóstico de versión de ProxMenux, tipo de instalación, componentes, archivos e idioma."
|
||||
},
|
||||
"header": {
|
||||
"title": "Mostrar información de versión",
|
||||
"description": "Diagnóstico de solo lectura. Lee version.txt, config.json y unas pocas rutas de archivos conocidas, después renderiza un cuadro de texto desplazable con la versión, tipo de instalación, componentes instalados, presencia de archivos, estado del entorno virtual e idioma actual.",
|
||||
"section": "Settings"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué es esto",
|
||||
"body": "Un autodiagnóstico. Útil al reportar una incidencia (pega el contenido del diálogo en el reporte del bug) o para confirmar que una instalación se completó limpiamente. No modifica nada."
|
||||
},
|
||||
"reports": {
|
||||
"heading": "Qué reporta",
|
||||
"headerSection": "Sección",
|
||||
"headerSource": "Origen",
|
||||
"headerContent": "Contenido",
|
||||
"rows": [
|
||||
{
|
||||
"section": "Versión actual",
|
||||
"source": "version.txt",
|
||||
"contentRich": "Número de versión de una sola línea; <code>Unknown</code> si el archivo falta"
|
||||
},
|
||||
{
|
||||
"section": "Tipo de instalación",
|
||||
"source": "comprobaciones de venv + config.json",
|
||||
"content": "Con traducción (multi-idioma) o Normal (solo inglés)"
|
||||
},
|
||||
{
|
||||
"section": "Componentes instalados",
|
||||
"source": "config.json",
|
||||
"content": "Estado por componente (✓ instalado / creado / actualizado, ✗ faltante)"
|
||||
},
|
||||
{
|
||||
"section": "Archivos de ProxMenux",
|
||||
"source": "comprobaciones del sistema de archivos",
|
||||
"contentRich": "Presencia y rutas de <code>menu</code>, <code>utils.sh</code>, <code>config.json</code>, <code>version.txt</code>"
|
||||
},
|
||||
{
|
||||
"section": "Entorno virtual",
|
||||
"source": "/opt/googletrans-env",
|
||||
"content": "Solo instalación con traducción — presencia de venv + pip"
|
||||
},
|
||||
{
|
||||
"section": "Idioma actual",
|
||||
"source": "config.json",
|
||||
"contentRich": "Con traducción: código de idioma desde <code>.language</code>; Normal: <code>English (Fixed)</code>"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sampleHeading": "Salida de ejemplo",
|
||||
"manualHeading": "Equivalentes manuales",
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"unknownTitle": "La versión muestra \"Unknown\"",
|
||||
"unknownBody": "<code>/usr/local/share/proxmenux/version.txt</code> falta o no es legible. Lo más habitual es por una instalación parcial. Reinstala desde la fuente oficial de ProxMenux.",
|
||||
"noConfigTitle": "No hay información de instalación disponible",
|
||||
"noConfigBody": "<code>config.json</code> falta. El script no puede enumerar los componentes sin él. Reinstala para regenerarlo.",
|
||||
"wrongStatusTitle": "Un componente muestra ✗ y estoy seguro de haberlo instalado",
|
||||
"wrongStatusBody": "Significa que <code>config.json</code> no registra ese componente como instalado — podría ser un script que aún no se registra a sí mismo, o una instalación manual que se saltó ProxMenux. El diálogo refleja lo que dice <code>config.json</code>, no lo que hay realmente en disco."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/settings/uninstall-proxmenux",
|
||||
"label": "Desinstalar ProxMenux",
|
||||
"tail": " — elimina todos estos archivos."
|
||||
},
|
||||
{
|
||||
"href": "/docs/settings",
|
||||
"label": "Resumen de Settings",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Desinstalar ProxMenux | ProxMenux Documentation",
|
||||
"description": "Desinstalador limpio de ProxMenux con eliminación opcional de dependencias (jq, dialog, python3-*) y restauración automática de los backups de /root/.bashrc y /etc/motd creados en el momento de la instalación. También elimina el servicio proxmenux-monitor si está presente.",
|
||||
"ogTitle": "Desinstalar ProxMenux | ProxMenux Documentation",
|
||||
"ogDescription": "Elimina limpiamente ProxMenux de un host Proxmox con limpieza opcional de dependencias."
|
||||
},
|
||||
"header": {
|
||||
"title": "Desinstalar ProxMenux",
|
||||
"description": "Elimina ProxMenux del host Proxmox con un flujo interactivo: confirmación, eliminación opcional de dependencias, limpieza del servicio ProxMenux Monitor, restauración de los backups de /root/.bashrc y /etc/motd. Muestra una barra de progreso todo el tiempo.",
|
||||
"section": "Settings"
|
||||
},
|
||||
"scopeWarn": {
|
||||
"title": "Afecta solo a la instalación de ProxMenux — no a tus VMs / CTs / almacenamiento",
|
||||
"body": "Desinstalar ProxMenux elimina los scripts de ProxMenux, el lanzador del menú, el servicio opcional Monitor y cualquier backup que ProxMenux hizo de archivos del sistema cuando lo instalaste. <strong>No toca tus VMs, contenedores, almacenamiento, configuración de red, Fail2Ban, driver NVIDIA ni nada más que hayas instalado vía ProxMenux.</strong> Esas cosas se quedan como están."
|
||||
},
|
||||
"flow": {
|
||||
"heading": "El flujo de desinstalación",
|
||||
"items": [
|
||||
"<strong>Diálogo de confirmación.</strong> Sí/no — \"¿Seguro que quieres desinstalar ProxMenux?\"",
|
||||
"<strong>Checklist de eliminación de dependencias.</strong> La lista preseleccionada depende del tipo de instalación (mira la tabla de abajo). Todas las casillas por defecto en OFF — te apuntas a eliminar cada dependencia.",
|
||||
"<strong>La eliminación corre con una barra de progreso.</strong> Elimina el venv (solo instalación con traducción), el lanzador <code>menu</code>, el árbol <code>/usr/local/share/proxmenux/</code>, el servicio ProxMenux Monitor si está presente, las dependencias que marcaste y, por último, restaura los backups de archivos del sistema (mira abajo).",
|
||||
"<strong>Diálogo de finalización.</strong> Lista las dependencias eliminadas y sale."
|
||||
]
|
||||
},
|
||||
"deps": {
|
||||
"heading": "Eliminación de dependencias: qué se ofrece",
|
||||
"intro": "La checklist depende del tipo de instalación. <strong>Ninguna casilla está marcada por defecto</strong> — son paquetes de todo el sistema que otras aplicaciones podrían usar, así que el valor por defecto más seguro es dejarlos.",
|
||||
"headerType": "Tipo de instalación",
|
||||
"headerOffered": "Se ofrece para eliminar",
|
||||
"rows": [
|
||||
{
|
||||
"type": "Con traducción",
|
||||
"offeredRich": "<code>python3-venv</code>, <code>python3-pip</code>, <code>python3</code>, <code>jq</code>"
|
||||
},
|
||||
{
|
||||
"type": "Normal",
|
||||
"offeredRich": "<code>dialog</code>, <code>jq</code>"
|
||||
}
|
||||
],
|
||||
"warnTitle": "Paquetes de todo el sistema — piénsalo dos veces",
|
||||
"warnBody": "<code>python3</code>, <code>jq</code> y <code>dialog</code> los usan habitualmente otras herramientas (incluyendo el propio Proxmox en algunos flujos). Eliminar <code>python3</code> en particular puede romper helpers de Proxmox, utilidades de Ceph y muchos scripts de terceros. Déjalos a menos que estés seguro de que nada más los necesita."
|
||||
},
|
||||
"removed": {
|
||||
"heading": "Qué se elimina",
|
||||
"code": "/usr/local/bin/menu # the launcher\n/usr/local/share/proxmenux/ # everything: scripts, config, cache, version\n/opt/googletrans-env/ # virtual env (Translation install only)\n/etc/systemd/system/proxmenux-monitor.service # Monitor service unit\n/root/.config/proxmenux-monitor/ # Monitor config dir\n # + dependencies you ticked in the checklist"
|
||||
},
|
||||
"restored": {
|
||||
"heading": "Qué se restaura",
|
||||
"items": [
|
||||
"Si <code>/root/.bashrc.bak</code> existe → se renombra de vuelta a <code>/root/.bashrc</code> (tu bashrc original vuelve).",
|
||||
"Si <code>/etc/motd.bak</code> existe → se renombra de vuelta a <code>/etc/motd</code>. Si no, la línea de ProxMenux (<em>\"This system is optimised by: ProxMenux\"</em>) se elimina del motd existente con sed."
|
||||
]
|
||||
},
|
||||
"othersCallout": {
|
||||
"title": "Otros componentes instalados por ProxMenux se quedan",
|
||||
"body": "Cualquier cosa que ProxMenux instaló vía otros menús — Fail2Ban, Lynis, drivers NVIDIA, ajustes post-instalación — <strong>no</strong> la toca este desinstalador. Cada uno tiene su propio flujo de desinstalación dentro de su menú correspondiente (o puedes eliminarlo con apt directamente). Mira <em>Mostrar información de versión</em> primero para ver qué hay registrado."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Desinstalación manual",
|
||||
"intro": "Si por alguna razón el desinstalador del menú no se puede ejecutar (p. ej. <code>dialog</code> ya falta), la secuencia manual equivalente:",
|
||||
"code": "# 1. Stop and remove the Monitor service (if installed)\nsystemctl stop proxmenux-monitor.service 2>/dev/null\nsystemctl disable proxmenux-monitor.service 2>/dev/null\nrm -f /etc/systemd/system/proxmenux-monitor.service\nrm -rf /root/.config/proxmenux-monitor\nsystemctl daemon-reload\nsystemctl reset-failed 2>/dev/null\n\n# 2. Remove the venv (Translation install only)\nrm -rf /opt/googletrans-env\n\n# 3. Remove ProxMenux files\nrm -f /usr/local/bin/menu\nrm -rf /usr/local/share/proxmenux\n\n# 4. Restore backups\n[ -f /root/.bashrc.bak ] && mv /root/.bashrc.bak /root/.bashrc\n[ -f /etc/motd.bak ] && mv /etc/motd.bak /etc/motd \\\n || sed -i '/This system is optimised by: ProxMenux/d' /etc/motd"
|
||||
},
|
||||
"reinstall": {
|
||||
"heading": "Reinstalar más tarde",
|
||||
"body": "Ejecuta el instalador oficial de ProxMenux otra vez. Elige con traducción o normal como prefieras — la elección es independiente de lo que tuvieses antes."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"hangTitle": "La desinstalación se queda colgada en \"Removing googletrans and virtual environment\"",
|
||||
"hangBody": "<code>pip uninstall</code> puede atascarse si pip no responde. Desde otro shell: <code>rm -rf /opt/googletrans-env</code> directamente (el script hace lo mismo como fallback tras pip).",
|
||||
"aptTitle": "apt avisa de paquetes aún en uso durante la eliminación de dependencias",
|
||||
"aptBody": "Esperado si marcaste <code>python3</code> o <code>jq</code> mientras otras cosas en el host dependen de ellos. El <code>autoremove</code> de apt se negará a eliminarlos en ese caso (que es el comportamiento seguro). Desmarca esa dependencia y vuelve a ejecutar.",
|
||||
"motdTitle": "El MOTD sigue mostrando la línea de ProxMenux tras desinstalar",
|
||||
"motdBody": "O no existía <code>/etc/motd.bak</code> y la limpieza con sed no coincidió (p. ej. la línea fue modificada). Edita <code>/etc/motd</code> a mano y elimina cualquier línea sobrante de ProxMenux."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/settings/show-version-information",
|
||||
"label": "Mostrar información de versión",
|
||||
"tail": " — mira lo que se eliminaría antes de desinstalar."
|
||||
},
|
||||
{
|
||||
"href": "/docs/settings",
|
||||
"label": "Resumen de Settings",
|
||||
"tail": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Host: añadir target iSCSI como almacenamiento de Proxmox | ProxMenux Documentation",
|
||||
"description": "Registra un target iSCSI como almacenamiento de Proxmox usando ProxMenux. Gestiona la instalación de open-iscsi, el descubrimiento del portal vía sendtargets, la selección del target y pvesm add iscsi. Proporciona dispositivos de bloque raw para imágenes de disco de VM.",
|
||||
"ogTitle": "Host: añadir target iSCSI como almacenamiento de Proxmox | ProxMenux Documentation",
|
||||
"ogDescription": "Registra un target iSCSI como almacenamiento de Proxmox con descubrimiento guiado. Usa pvesm add iscsi y proporciona dispositivos de bloque raw para discos de VM."
|
||||
},
|
||||
"header": {
|
||||
"title": "Host: añadir target iSCSI como almacenamiento de Proxmox",
|
||||
"description": "Registra un target iSCSI (de una SAN, TrueNAS / FreeNAS, Synology, un target Windows Server, cualquier array que hable iSCSI) como almacenamiento de Proxmox. Las LUNs exportadas aparecen como dispositivos de bloque y pueden alojar imágenes de disco de VM con un rendimiento cercano al local sobre la red.",
|
||||
"section": "Almacenamiento y compartición · Host"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "ProxMenux envuelve <code>pvesm add iscsi</code> en un flujo guiado: instala <code>open-iscsi</code> si hace falta, pide el portal iSCSI (IP:puerto), ejecuta <code>iscsiadm --mode discovery --type sendtargets</code> contra él, te deja elegir un IQN de target y registra el almacenamiento iSCSI en Proxmox. El servicio <code>iscsid</code> mantiene después la sesión iSCSI viva entre reinicios."
|
||||
},
|
||||
"vocab": {
|
||||
"heading": "Vocabulario iSCSI (referencia rápida)",
|
||||
"headerTerm": "Término",
|
||||
"headerMeaning": "Significado",
|
||||
"rows": [
|
||||
{
|
||||
"term": "Portal",
|
||||
"meaningRich": "El endpoint del servicio iSCSI en el servidor del target — una IP (o hostname) más un puerto TCP. El puerto por defecto es <code>3260</code>; ProxMenux lo asume si no especificas uno."
|
||||
},
|
||||
{
|
||||
"term": "Target",
|
||||
"meaningRich": "Un único \"servidor\" exportado dentro del portal, identificado por su IQN (<em>iSCSI Qualified Name</em>). Un portal puede alojar muchos targets."
|
||||
},
|
||||
{
|
||||
"term": "IQN",
|
||||
"meaningRich": "La forma canónica es <code>iqn.YYYY-MM.reverse.domain:identifier</code>, por ejemplo <code>iqn.2024-08.com.truenas:proxmox-pool</code>. Tanto el target como el initiator tienen su propio IQN."
|
||||
},
|
||||
{
|
||||
"term": "LUN",
|
||||
"meaningRich": "Un dispositivo de bloque dentro de un target (Logical Unit Number). Un único target puede exponer varias LUNs; cada LUN aparece como su propio disco en Proxmox y puede convertirse en un disco de VM."
|
||||
},
|
||||
{
|
||||
"term": "Initiator",
|
||||
"meaningRich": "El cliente que conecta a un target — en este caso, tu host Proxmox. El initiator tiene su propio IQN guardado en <code>/etc/iscsi/initiatorname.iscsi</code>. Los targets normalmente solo aceptan sesiones de IQNs de initiator preautorizados."
|
||||
}
|
||||
]
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir la herramienta",
|
||||
"body": "Desde el menú principal de ProxMenux, abre <strong>Storage & Share Manager → Add iSCSI Target as Proxmox Storage</strong>. Verás este submenú con cuatro opciones:",
|
||||
"imageAlt": "Menú iSCSI Host Manager — Add / View / Remove / Test connectivity"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script (flujo Add)",
|
||||
"body": "El flujo tiene dos fases con una separación clara entre \"configurar el initiator, descubrir targets\" y \"registrar realmente el almacenamiento en Proxmox\". A diferencia de NFS / Samba, no hay auto-descubrimiento en la subnet — debes conocer la dirección del portal (iSCSI no es amigable con broadcast)."
|
||||
},
|
||||
"add": {
|
||||
"heading": "Añadir target iSCSI como almacenamiento de Proxmox",
|
||||
"items": [
|
||||
"<strong>Entrada del portal</strong> — escribe la IP o hostname del servidor del target iSCSI. Se asume el puerto <code>3260</code> a menos que escribas <code>host:port</code>.",
|
||||
"<strong>Descubrimiento de targets</strong> — ProxMenux llama a <code>iscsiadm --mode discovery --type sendtargets --portal <ip:port></code>. El servidor responde con cada IQN que permite ver a este initiator. Si el descubrimiento falla, el script muestra el error exacto de <code>iscsiadm</code> y lista las causas comunes (IP incorrecta, firewall, IQN del initiator no autorizado).",
|
||||
"<strong>Selección del target</strong> — si hay un solo target se selecciona automáticamente; con varios targets se muestra un menú.",
|
||||
"<strong>Storage ID</strong> — por defecto es <code>iscsi-<último segmento del IQN, máx. 20 caracteres></code>. Solo letras, dígitos, <code>-</code> y <code>_</code>.",
|
||||
"<strong>Content type</strong> — a diferencia de NFS / Samba, el contenido iSCSI está <strong>fijado a <code>images</code></strong>. iSCSI expone dispositivos de bloque raw, no un sistema de archivos, así que Proxmox solo te deja alojar discos de VM ahí."
|
||||
],
|
||||
"authTitle": "Autorizar el initiator de Proxmox en el target",
|
||||
"authBody1": "Antes de que el flujo Add funcione de principio a fin, el target iSCSI debe conocer tu host Proxmox. Obtén tu IQN de initiator:",
|
||||
"authBody2": "Después añade ese IQN a la lista de acceso del target (en TrueNAS: <em>Sharing → Block → Initiators Groups</em>; en Synology: <em>SAN Manager → iSCSI → Target → Edit → Initiators</em>; etc.). Si el initiator no está autorizado, el descubrimiento de <code>iscsiadm</code> devuelve una lista vacía o un error de autenticación."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "El flujo entero se traduce a estos comandos:"
|
||||
},
|
||||
"view": {
|
||||
"heading": "Ver almacenamientos iSCSI configurados",
|
||||
"body": "Lista cada entrada iSCSI en Proxmox (<code>pvesm status | awk ''$2 == \"iscsi\"''</code>) con portal, IQN del target, content type y estado en vivo."
|
||||
},
|
||||
"remove": {
|
||||
"heading": "Eliminar almacenamiento iSCSI",
|
||||
"body": "Ejecuta <code>pvesm remove <storage-id></code> tras confirmar portal, target y contenido. Solo se elimina el registro en Proxmox — <strong>el propio target iSCSI no se toca</strong> y las sesiones existentes en el lado del kernel pueden persistir hasta el siguiente reinicio.",
|
||||
"warnTitle": "Discos de VM existentes en este iSCSI primero",
|
||||
"warnBody": "Eliminar un almacenamiento iSCSI mientras las VMs todavía tienen discos en él deja a esas VMs apuntando a un almacén desaparecido. Proxmox marcará el error, pero los datos de la LUN siguen intactos en el target — puedes volver a registrar el almacenamiento después para recuperar los discos. Aun así, mueve o haz backup de las VMs primero por seguridad."
|
||||
},
|
||||
"test": {
|
||||
"heading": "Probar conectividad iSCSI",
|
||||
"body": "Ejecuta una pasada de diagnóstico: comprueba que <code>iscsiadm</code> está instalado, imprime tu IQN de initiator, confirma que <code>iscsid</code> está corriendo, hace ping a cada portal registrado, prueba su puerto e informa de <code>pvesm status</code> más si hay una sesión iSCSI activa (<code>iscsiadm --mode session</code>). Una sesión activa más un portal alcanzable pero \"inactive\" en Proxmox normalmente significa un estado obsoleto — prueba <code>pvesm set <id> --disable 0</code>."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"portalTitle": "\"Cannot reach portal\" pero la IP del servidor responde en otra parte",
|
||||
"portalBody": "El ping falló en la dirección del portal. Comprueba que estás llegando a la interfaz de la <em>red de almacenamiento</em> (iSCSI suele vivir en una VLAN / subnet separada de la red de gestión). Verifica también el DNS si escribiste un hostname.",
|
||||
"discoverTitle": "\"iSCSI discovery failed\" desde iscsiadm",
|
||||
"discoverIntro": "El script muestra el error exacto. Causas más comunes:",
|
||||
"discoverItems": [
|
||||
"IP / puerto del portal incorrectos (revisa, el valor por defecto es 3260).",
|
||||
"El servicio iSCSI no está corriendo en el servidor del target.",
|
||||
"El firewall bloquea el 3260 entre Proxmox y el target.",
|
||||
"<strong>El IQN del initiator no está autorizado en el target.</strong> Causa más frecuente en arrays empresariales. Añade tu IQN de Proxmox a la ACL de initiators del target primero."
|
||||
],
|
||||
"noTargetTitle": "No se encuentran targets pero el descubrimiento tuvo éxito",
|
||||
"noTargetBody": "El servidor aceptó tu initiator pero no le expone ningún target. Revisa los controles de autenticación / acceso del target — algunos arrays permiten descubrimiento a todos los IQNs pero filtran qué targets puede ver cada IQN.",
|
||||
"noLunTitle": "Las LUNs no aparecen en /dev/disk/by-path tras el registro",
|
||||
"noLunBody": "<code>pvesm add iscsi</code> tuvo éxito pero el kernel no ve dispositivos de bloque. Comprueba <code>iscsiadm --mode session</code> — si no hay sesión activa, inicia una manualmente con <code>iscsiadm --mode node --login</code>. Si hay sesión pero no aparecen LUNs, fuerza un rescan: <code>iscsiadm --mode session --rescan</code>. Si sigue sin haber nada, probablemente el target todavía no tiene LUNs asignadas a este IQN (configura el mapeo de LUN en el target).",
|
||||
"chapTitle": "Autenticación CHAP",
|
||||
"chapBody": "ProxMenux no expone los campos de usuario / contraseña CHAP en el flujo interactivo. Si tu target requiere CHAP, registra con ProxMenux primero (el descubrimiento con CHAP puede fallar, pero <code>pvesm add</code> escribirá la entrada igualmente), luego añade credenciales manualmente: <code>pvesm set <id> --username <chap-user></code> y edita <code>/etc/iscsi/iscsid.conf</code> con la contraseña, después <code>systemctl restart iscsid</code>. Es una carencia del script actual — documentada aquí para que sepas qué hacer."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share/host-nfs",
|
||||
"label": "Share NFS como almacenamiento de Proxmox",
|
||||
"tail": " — alternativa a nivel de archivo. Más sencillo de configurar, más flexible (backup / ISO / tmpl / images), ligeramente más lento para discos de VM en vivo."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-samba",
|
||||
"label": "Samba / CIFS como almacenamiento de Proxmox",
|
||||
"tail": " — otra opción a nivel de archivo; evítalo para discos de VM en vivo por la semántica de locking."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-local-disk",
|
||||
"label": "Añadir disco local como almacenamiento de Proxmox",
|
||||
"tail": " — cuando el disco es local al host Proxmox, no está en otra máquina sobre la red."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Host: añadir disco local como almacenamiento de Proxmox | ProxMenux Documentation",
|
||||
"description": "Formatea un disco local SATA / SAS / NVMe en un host Proxmox y regístralo como almacenamiento Proxmox directory o ZFS pool. Detección segura de discos, gate de confirmación para operaciones destructivas, fstab basado en UUID, creación de ZFS pool y pvesm add dir / zfspool por dentro.",
|
||||
"ogTitle": "Host: añadir disco local como almacenamiento de Proxmox | ProxMenux Documentation",
|
||||
"ogDescription": "Formatea un disco local y regístralo como almacenamiento Proxmox directory o ZFS pool con un flujo guiado y filtrado por seguridad."
|
||||
},
|
||||
"header": {
|
||||
"title": "Host: añadir disco local como almacenamiento de Proxmox",
|
||||
"description": "Coge un disco físico del host Proxmox, opcionalmente formatéalo (ext4 / xfs / btrfs / zfs) y regístralo como almacenamiento de Proxmox — bien como directory (pvesm add dir) o como ZFS pool (pvesm add zfspool). ProxMenux filtra la lista de discos para que no puedas elegir el disco raíz ni nada en uso, y hace explícito cada paso destructivo antes de ejecutarlo.",
|
||||
"section": "Almacenamiento y compartición · Host"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Otras herramientas de <em>Host</em> en esta sección tratan con almacenamiento de <strong>red</strong> (NFS / Samba / iSCSI). Esta trata con discos <strong>locales</strong> — unidades físicas conectadas a tu host Proxmox que quieres usar para discos de VM, backups, ISOs o templates. ProxMenux prepara el disco (partición + formato + montaje) y lo registra en Proxmox para que la UI pueda colocar contenido ahí."
|
||||
},
|
||||
"destructive": {
|
||||
"title": "Herramienta destructiva para la ruta 'format'",
|
||||
"body": "La ruta <em>Format</em> <strong>borra cada partición y byte del disco seleccionado</strong>. ProxMenux muestra la lista de discos con un banner de advertencia, filtra los discos ya en uso y exige una confirmación explícita antes de ejecutar cualquier <code>wipefs</code> / <code>sgdisk</code> / <code>mkfs</code>. Aun así — lee la ruta del dispositivo en voz alta dos veces antes de escribir \"yes\"."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Directory vs ZFS pool — cuál elegir",
|
||||
"headerDir": "Directory (ext4 / xfs / btrfs)",
|
||||
"headerZfs": "ZFS pool",
|
||||
"rows": [
|
||||
{
|
||||
"label": "Tipo de almacenamiento Proxmox",
|
||||
"dirRich": "<code>dir</code>",
|
||||
"zfsRich": "<code>zfspool</code>"
|
||||
},
|
||||
{
|
||||
"label": "Formato de disco de VM",
|
||||
"dir": "Archivo qcow2 / raw en un sistema de archivos",
|
||||
"zfs": "Dataset ZFS nativo (zvol) por disco"
|
||||
},
|
||||
{
|
||||
"label": "Snapshots",
|
||||
"dir": "Snapshots qcow2; snapshots btrfs si fs=btrfs",
|
||||
"zfs": "Nativos, instantáneos, copy-on-write"
|
||||
},
|
||||
{
|
||||
"label": "Thin provisioning",
|
||||
"dir": "Sí (qcow2 por defecto)",
|
||||
"zfs": "Sí (ZFS por defecto)"
|
||||
},
|
||||
{
|
||||
"label": "Necesidades de RAM",
|
||||
"dir": "Bajas",
|
||||
"zfs": "Altas — ZFS usa la RAM libre como caché ARC"
|
||||
},
|
||||
{
|
||||
"label": "Content types soportados",
|
||||
"dir": "images, backup, iso, vztmpl, snippets, rootdir",
|
||||
"zfs": "images, rootdir solamente (almacenamiento de bloque)"
|
||||
},
|
||||
{
|
||||
"label": "Mejor para",
|
||||
"dir": "Disco de propósito general: mezcla de discos de VM, backups, ISOs",
|
||||
"zfs": "Disco puramente de datos de VM / LXC con necesidades de snapshot + integridad"
|
||||
}
|
||||
]
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir la herramienta",
|
||||
"body": "Desde el menú principal de ProxMenux, abre <strong>Storage & Share Manager → Add Local Disk as Proxmox Storage</strong>. Verás este submenú con cuatro opciones:",
|
||||
"imageAlt": "Menú Local Disk Manager — Add / View / Remove / List available disks"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script (flujo Add)",
|
||||
"body": "El flujo tiene dos fases con un filtro de seguridad de triple gate. La Fase 1 descubre discos seguros, decide qué hacer con el elegido y recoge los parámetros de almacenamiento; la Fase 2 hace el trabajo destructivo. Hasta la confirmación final el disco queda intacto."
|
||||
},
|
||||
"format": {
|
||||
"heading": "Formatear un disco en blanco",
|
||||
"intro": "La ruta para un disco nuevo o uno cuyo contenido no te importa.",
|
||||
"items": [
|
||||
"Elige el disco (los discos del sistema / en uso quedan ocultos).",
|
||||
"Elige \"Format disk (ERASE all data)\".",
|
||||
"Elige el sistema de archivos — mira la tabla de arriba para las contrapartidas.",
|
||||
"Storage ID (por defecto <code>disk-<device></code>), ruta de montaje, preset de content type.",
|
||||
"Confirma en el diálogo <strong>FINAL CONFIRMATION — DATA WILL BE ERASED</strong>.",
|
||||
"ProxMenux limpia la tabla de particiones, crea una partición que abarca el disco entero, ejecuta <code>mkfs.<fs></code> (o <code>zpool create</code>), la monta, la añade a <code>/etc/fstab</code> por UUID con <code>defaults,nofail</code> y la registra en Proxmox vía <code>pvesm add dir</code> o <code>pvesm add zfspool</code>."
|
||||
],
|
||||
"tipTitle": "Por qué UUID + nofail en /etc/fstab",
|
||||
"tipBody": "El script escribe <code>UUID=… /mnt/<id> <fs> defaults,nofail 0 2</code>. El UUID sobrevive a reordenaciones de dispositivos entre reinicios (así que <code>/dev/sdc</code> pasando a ser <code>/dev/sdd</code> no rompe el arranque). <code>nofail</code> significa que si el disco desaparece alguna vez (fallo de hardware, desconectado), Proxmox arranca igualmente — el almacenamiento simplemente se mostrará como inactive hasta que el disco vuelva."
|
||||
},
|
||||
"reuse": {
|
||||
"heading": "Reutilizar un sistema de archivos existente",
|
||||
"intro": "La ruta para un disco en el que quieres conservar los datos — quizá lo moviste de otro host Proxmox, o el disco ya tiene backups / ISOs que quieres mantener accesibles.",
|
||||
"items": [
|
||||
"Elige el disco.",
|
||||
"Elige \"Use existing filesystem\".",
|
||||
"Storage ID, ruta de montaje, preset de content type.",
|
||||
"ProxMenux <strong>no</strong> toca los datos: crea el punto de montaje, monta el disco, añade una entrada UUID a <code>/etc/fstab</code> y lo registra como almacenamiento Proxmox <code>dir</code>."
|
||||
],
|
||||
"warnTitle": "La ruta de reutilización no gestiona pools ZFS",
|
||||
"warnBody": "Si el disco ya contiene un pool ZFS, la ruta de <em>reuse</em> aquí simplemente intenta montarlo como un sistema de archivos normal — y falla. Para importar un pool ZFS existente usa <code>zpool import <name></code> en línea de comandos y después regístralo manualmente con <code>pvesm add zfspool</code>."
|
||||
},
|
||||
"presets": {
|
||||
"heading": "Presets de content type",
|
||||
"intro": "En vez de una larga lista de verificación, ProxMenux ofrece 4 presets más una opción custom. La cadena del preset se pasa a <code>pvesm add … --content <csv></code>:",
|
||||
"headerPreset": "Preset",
|
||||
"headerContent": "Cadena de contenido",
|
||||
"headerUse": "Caso de uso",
|
||||
"rows": [
|
||||
{
|
||||
"preset": "VM Storage",
|
||||
"content": "images,backup",
|
||||
"use": "Un almacén de discos de VM dedicado que también guarda backups de esas VMs cerca."
|
||||
},
|
||||
{
|
||||
"preset": "Standard NAS",
|
||||
"content": "backup,iso,vztmpl",
|
||||
"use": "Un disco de archivo / media — backups, ISOs y templates LXC. Sin discos de VM en vivo aquí."
|
||||
},
|
||||
{
|
||||
"preset": "All types",
|
||||
"content": "images,backup,iso,vztmpl,snippets",
|
||||
"use": "\"Que decida el host\" — permite todos los content types que Proxmox soporta en este almacenamiento."
|
||||
},
|
||||
{
|
||||
"preset": "Custom",
|
||||
"content": "(entrada libre)",
|
||||
"useRich": "Escribe el CSV exacto tú mismo, p. ej. <code>images</code> solo, o <code>rootdir,images</code>."
|
||||
}
|
||||
],
|
||||
"zfsTitle": "El contenido del ZFS pool es más limitado",
|
||||
"zfsBody": "Si elegiste <strong>zfs</strong> como sistema de archivos, Proxmox solo acepta <code>images</code> y <code>rootdir</code> como content types en un <code>zfspool</code> (es almacenamiento de bloque, no un sistema de archivos para ISOs). Los presets de arriba siguen funcionando pero Proxmox descarta silenciosamente los content types que no puede usar — comprueba <code>pvesm status</code> después."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"extIntro": "Formatear + registrar un disco como almacenamiento directory ext4:",
|
||||
"zfsIntro": "O como ZFS pool:"
|
||||
},
|
||||
"view": {
|
||||
"heading": "Ver almacenamientos de disco",
|
||||
"body": "Lista cada almacenamiento Proxmox respaldado por disco (tanto <code>dir</code> como <code>zfspool</code> creados por el usuario — los pools del sistema como <code>rpool</code> quedan ocultos). Muestra la ruta de montaje / nombre del pool, content types y estado en vivo."
|
||||
},
|
||||
"remove": {
|
||||
"heading": "Eliminar almacenamiento de disco",
|
||||
"body": "Desregistra el almacenamiento de Proxmox (<code>pvesm remove</code>) y ofrece limpiar la entrada correspondiente en <code>/etc/fstab</code>. Para pools ZFS el script <strong>no</strong> destruye automáticamente el pool — eso es un paso aparte <code>zpool destroy <name></code> que haces a mano cuando estés seguro.",
|
||||
"warnTitle": "Datos y dependencias de VM existentes",
|
||||
"warnBody": "Eliminar el almacenamiento no toca el sistema de archivos ni el pool — los datos siguen en el disco. Pero las VMs / CTs que referencian este almacenamiento por ID fallarán al arrancar tras la eliminación. Mueve esos discos de VM a otro almacenamiento (o haz un backup) antes de eliminar."
|
||||
},
|
||||
"list": {
|
||||
"heading": "Listar discos disponibles",
|
||||
"body": "Una vista de diagnóstico de solo lectura: imprime la salida de <code>lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,MODEL</code> seguida de los almacenamientos <code>dir</code> / <code>zfspool</code> que Proxmox ya conoce. Buena primera parada al abrir la herramienta cuando quieres ver \"¿qué hay en este host?\" antes de añadir nada."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noDisksTitle": "\"No available disks found\"",
|
||||
"noDisksIntro": "El filtro de seguridad ocultó cada disco. Razones comunes:",
|
||||
"noDisksItems": [
|
||||
"Solo está presente el disco raíz.",
|
||||
"Cada otro disco forma parte de un array ZFS / LVM / RAID activo.",
|
||||
"Cada otro disco está referenciado por una config de VM o LXC (passthrough).",
|
||||
"El disco está en modo solo lectura (hardware fallando o write-blocker)."
|
||||
],
|
||||
"noDisksOutro": "Usa <em>List Available Disks</em> desde el menú para ver la salida cruda de <code>lsblk</code> y entender qué pasa.",
|
||||
"mountedTitle": "El formateo falla con \"device is mounted\"",
|
||||
"mountedBody": "Algo automontó el disco (udisksd, un gestor de escritorio, una unit de systemd persistente). Desmóntalo: <code>umount /dev/sdX?*</code> o <code>systemctl stop <whatever-mounts-it></code>, y reintenta. El filtro de seguridad del script debería haber ocultado discos montados, así que si has llegado a este error el montaje ocurrió entre que se mostró el menú y tú confirmaste.",
|
||||
"zpoolTitle": "zpool create falla \"invalid vdev specification\"",
|
||||
"zpoolBody": "Normalmente significa que el disco todavía tiene firmas GPT / LVM / ZFS obsoletas que <code>zpool</code> se niega a sobrescribir sin force. El script ejecuta <code>wipefs</code> y <code>sgdisk --zap-all</code> antes del formato, pero un disco muy terco puede seguir teniendo una etiqueta obsoleta. Fuerza una limpieza manualmente: <code>zpool labelclear -f /dev/sdX</code> o <code>dd if=/dev/zero of=/dev/sdX bs=1M count=10</code> y reintenta.",
|
||||
"inactiveTitle": "El almacenamiento aparece como inactive tras el reinicio",
|
||||
"inactiveBody": "Comprueba <code>findmnt <mount-path></code> — si el montaje falta, algo en <code>/etc/fstab</code> falló. <code>dmesg | tail</code> normalmente apunta a la razón (mismatch de UUID, corrupción del sistema de archivos, <code>nofail</code> abandonó el reintento). Un <code>mount -a</code> normalmente reactiva el almacenamiento una vez arreglada la causa."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/disk-manager/format-disk",
|
||||
"label": "Disk Manager: Format / Wipe Physical Disk",
|
||||
"tail": " — alternativa de bajo nivel cuando solo quieres preparar un disco sin registrarlo como almacenamiento de Proxmox."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-iscsi",
|
||||
"label": "Añadir target iSCSI como almacenamiento de Proxmox",
|
||||
"tail": " — equivalente de red cuando el dispositivo de bloque vive en otra máquina."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-local-shared",
|
||||
"label": "Añadir directorio compartido en el host",
|
||||
"tail": " — prepara un directorio en el host para bind mounts LXC (no registra un almacenamiento de Proxmox)."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Host: añadir directorio compartido en el host | ProxMenux Documentation",
|
||||
"description": "Crea un directorio en el host listo para bind mounts LXC, con permisos que funcionan a la vez para contenedores privileged y unprivileged. Sticky bit + world-rwx + ACLs para herencia por defecto.",
|
||||
"ogTitle": "Host: añadir directorio compartido en el host | ProxMenux Documentation",
|
||||
"ogDescription": "Prepara un directorio en el host para bind mounts LXC con permisos compatibles con CTs privileged y unprivileged."
|
||||
},
|
||||
"header": {
|
||||
"title": "Host: añadir directorio compartido en el host",
|
||||
"description": "Crea un directorio en el host diseñado para hacer bind mount en uno o más contenedores LXC. ProxMenux aplica un conjunto de permisos que funciona a la vez para CTs privileged y unprivileged — sin quebraderos de cabeza con UIDs desplazados, sin chowns por contenedor — y registra el directorio para que el LXC Mount Manager lo pueda recoger después.",
|
||||
"section": "Almacenamiento y compartición · Host"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué es esto (y qué NO es)",
|
||||
"body": "Esta herramienta <strong>no</strong> registra nada en Proxmox (no hay <code>pvesm add</code> aquí). Solo prepara un directorio en el host — <code>/mnt/shared</code>, por defecto — con permisos que cualquier contenedor LXC puede leer y escribir, sin importar si el CT es privileged o unprivileged. El siguiente paso habitual es hacer bind mount en cada CT con el <mountLink>LXC Mount Manager</mountLink>."
|
||||
},
|
||||
"why": {
|
||||
"heading": "Por qué una herramienta dedicada para esto",
|
||||
"intro": "Cuando haces bind mount de un directorio del host en un contenedor LXC, los permisos dependen de:",
|
||||
"items": [
|
||||
"Si el CT es <strong>privileged</strong> (UID 0 en CT = UID 0 en host) o <strong>unprivileged</strong> (UID 0 en CT = UID 100000 en host — todo desplazado +100000).",
|
||||
"La propiedad del directorio del host (un archivo propiedad del UID 1000 en el host aparece como \"others\" desde la perspectiva de un CT unprivileged, porque ningún usuario del CT mapea al UID 1000 del host).",
|
||||
"Si varios CTs comparten el mismo directorio (CTs diferentes pueden tener rangos de UID diferentes)."
|
||||
],
|
||||
"outro": "El truco pragmático que ProxMenux usa aquí es <strong>dar acceso a todo el mundo</strong> a nivel de sistema de archivos: world-rwx más el sticky bit, más ACLs para que los archivos nuevos hereden los mismos permisos. Cualquier UID mapeado puede leer y escribir; no se requiere alineamiento de UID / GID."
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El script no tiene menú principal — ejecuta una sola acción, <strong>Create shared directory</strong>. La Fase 1 recoge la ruta destino; la Fase 2 crea el directorio y aplica permisos."
|
||||
},
|
||||
"bits": {
|
||||
"heading": "Qué hace cada bit de permiso",
|
||||
"intro": "El número <strong>1777</strong> no es arbitrario — es el mismo modo que Linux usa para <code>/tmp</code>. Tres propiedades combinadas:",
|
||||
"headerBit": "Bit",
|
||||
"headerEffect": "Efecto",
|
||||
"headerWhy": "Por qué importa aquí",
|
||||
"rows": [
|
||||
{
|
||||
"bit": "1 (sticky)",
|
||||
"effect": "Solo el propietario del archivo puede borrar / renombrar un archivo.",
|
||||
"why": "Evita que el CT-A borre archivos creados por el CT-B en el mismo directorio."
|
||||
},
|
||||
{
|
||||
"bit": "777 (rwx-rwx-rwx)",
|
||||
"effect": "Todos pueden leer, escribir y atravesar.",
|
||||
"why": "Los UIDs de CT unprivileged (100000+) aparecen como \"others\" desde el host, así que world-rwx les da acceso."
|
||||
},
|
||||
{
|
||||
"bit": "ACLs (default)",
|
||||
"effect": "Heredado en cada archivo / subdir recién creado.",
|
||||
"why": "Los permisos se aplican para siempre — el contenido nuevo conserva el perfil abierto sin reejecutar el script."
|
||||
}
|
||||
],
|
||||
"privTitle": "Los CTs privileged ven lo mismo, solo que sin el desplazamiento",
|
||||
"privBody": "Para un CT privileged, el UID 0 en el CT es el UID 0 en el host, así que <code>root</code> dentro del CT puede leer / escribir el directorio del host directamente. <code>1777</code> sigue estando bien — solo significa que usuarios no-root dentro del CT también pueden usar el directorio. Los mismos permisos cubren ambos casos."
|
||||
},
|
||||
"where": {
|
||||
"heading": "Dónde poner el directorio compartido",
|
||||
"intro": "El selector de ubicación ofrece cuatro opciones:",
|
||||
"opt1Title": "1. Crear nueva carpeta en /mnt",
|
||||
"opt1Body": "La elección habitual. ProxMenux sugiere automáticamente el primer nombre libre (<code>shared</code>, <code>shared2</code>, <code>shared3</code>, …). Solo tienes que confirmar o escribir un nombre diferente.",
|
||||
"opt2Title": "2. Introducir ruta personalizada",
|
||||
"opt2Body": "Para directorios fuera de <code>/mnt</code>. Cualquier ruta absoluta vale (p. ej. <code>/srv/media</code>, <code>/data/family</code>). El script aplica los mismos permisos.",
|
||||
"opt3Title": "3. Ver carpetas existentes en /mnt",
|
||||
"opt3Body": "Diagnóstico de solo lectura: lista cada directorio bajo <code>/mnt</code> con sus permisos, propietario y espacio disponible. Útil antes de crear uno nuevo para evitar colisiones de nombres.",
|
||||
"opt4Title": "4. Cancelar",
|
||||
"opt4Body": "Sale sin crear nada. Igual que pulsar <kbd>Esc</kbd>.",
|
||||
"tipTitle": "¿Dónde vive /mnt?",
|
||||
"tipBody": "Por defecto <code>/mnt</code> está en el sistema de archivos raíz de Proxmox. Si quieres el directorio compartido en un disco diferente (un disco de datos, un pool ZFS), monta ese disco bajo <code>/mnt/<name></code> primero (Disk Manager o <diskLink>Añadir disco local como almacenamiento de Proxmox</diskLink>), y después crea el directorio compartido como subcarpeta dentro — o elige \"Introducir ruta personalizada\" aquí y apunta al disco montado."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "El flujo entero se puede reproducir a mano:"
|
||||
},
|
||||
"next": {
|
||||
"heading": "Siguiente paso: bind mount en contenedores",
|
||||
"body": "Crear el directorio solo lo prepara — ningún contenedor lo ve aún. Para hacerlo visible dentro de uno o más LXCs, usa el <mountLink>LXC Mount Manager</mountLink> para hacer bind mount de <code>/mnt/<name></code> en los CTs. Como los permisos ya están abiertos, el Mount Manager <strong>no</strong> ofrecerá cambiarlos — el directorio está listo para usar tal cual."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"mkdirTitle": "\"Failed to create directory\"",
|
||||
"mkdirBody": "Normalmente un problema del sistema de archivos: <code>/mnt</code> está en un sistema de archivos solo lectura, la ruta contiene un componente que no es un directorio (p. ej. escribiste <code>/etc/passwd/sub</code>), o el disco está lleno. Comprueba con <code>df -h /mnt</code> y <code>mount | grep /mnt</code>.",
|
||||
"writeTitle": "El contenedor no puede escribir pese a los permisos abiertos",
|
||||
"writeBody": "Comprueba que el CT está usando realmente el bind mount (<code>pct config <ctid> | grep ^mp</code>). Dentro del CT, ejecuta <code>touch /mnt/data/test-$(date +%s)</code> — si esto falla con permission denied, el montaje puede estar en un sistema de archivos del host que no respeta ACLs (algunos montajes <code>ext3</code> o <code>vfat</code> antiguos). Mueve el directorio compartido a un backing ext4 / xfs / btrfs / zfs.",
|
||||
"aclTitle": "Comandos ACL no disponibles silenciosamente",
|
||||
"aclBody": "En una instalación mínima de Proxmox <code>setfacl</code> / <code>getfacl</code> pueden no estar instalados. El script hace un fallback elegante (comprobación <code>command -v setfacl</code>) y aplica solo permisos POSIX — que suele ser suficiente, pero los archivos nuevos no heredarán automáticamente el perfil permisivo. Instala <code>acl</code> con <code>apt-get install -y acl</code> y reejecuta el script sobre el directorio."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-mount-points",
|
||||
"label": "LXC Mount Manager",
|
||||
"tail": " — el siguiente paso natural: hacer bind mount de este directorio en uno o más contenedores."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-local-disk",
|
||||
"label": "Añadir disco local como almacenamiento de Proxmox",
|
||||
"tailRich": " — si quieres el directorio compartido en un disco dedicado, prepara el disco primero, móntalo bajo <code>/mnt</code> y crea la subcarpeta compartida aquí."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Host: montar share NFS en el host | ProxMenux Documentation",
|
||||
"description": "Monta un export NFS externo en el host Proxmox — bien como almacenamiento de Proxmox (pvesm add nfs), bien como un montaje fstab del host normal (NO visible en Datacenter > Storage), o ambos. El método fstab es ideal para hacer bind mount del share en contenedores LXC sin exponerlo como almacenamiento de Proxmox.",
|
||||
"ogTitle": "Host: montar share NFS en el host | ProxMenux Documentation",
|
||||
"ogDescription": "Monta un export NFS externo en el host Proxmox vía pvesm, fstab o ambos. La ruta fstab es ideal para bind mounts LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Host: montar share NFS en el host",
|
||||
"description": "Monta un export NFS externo (de un NAS, otro servidor, un share de homelab…) en el host Proxmox. Elige uno o ambos métodos: regístralo como almacenamiento de Proxmox (visible en Datacenter > Storage) y/o añade un montaje /etc/fstab normal en una ruta que tú elijas (útil para hacer bind mount del share en contenedores LXC sin exponerlo como almacenamiento de Proxmox).",
|
||||
"section": "Almacenamiento y compartición · Host"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "ProxMenux ofrece dos métodos de montaje para cualquier export NFS: <strong>(1) Almacenamiento de Proxmox</strong> vía <code>pvesm add nfs</code> — el share aparece en Datacenter > Storage y Proxmox gestiona el montaje en <code>/mnt/pve/<id></code>; <strong>(2) Montaje fstab del host</strong> en una ruta que tú elijas — persistente vía <code>/etc/fstab</code>, NO visible como almacenamiento de Proxmox, ideal para hacer bind mount en contenedores LXC (la UI de Proxmox queda limpia). Puedes ejecutar un método, el otro o ambos."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir la herramienta",
|
||||
"body": "Desde el menú principal de ProxMenux, abre <strong>Storage & Share Manager → Mount NFS Share on Host</strong>. Verás este submenú con cuatro opciones:",
|
||||
"imageAlt": "Menú NFS Host Manager — Mount / View / Remove / Test connectivity"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene dos fases con una separación clara entre \"descubrir, validar y elegir\" y \"montar / escribir config realmente\". Tras seleccionar un export, eliges el método o métodos de montaje vía una lista de verificación; el resto de diálogos solo piden parámetros para los métodos que seleccionaste. Hasta la confirmación final, ni <code>/etc/pve/storage.cfg</code> ni <code>/etc/fstab</code> se tocan."
|
||||
},
|
||||
"modes": {
|
||||
"heading": "Selector de método de montaje (dos opciones, marca una o ambas)",
|
||||
"intro": "Tras seleccionar y validar el export, ProxMenux muestra una lista de verificación con los dos métodos de montaje. Puedes marcar uno o ambos. Si pulsas OK sin marcar nada, el diálogo reaparece hasta que elijas al menos una opción o pulses Cancel para salir del flujo.",
|
||||
"imageAlt": "Lista de verificación de método de montaje con opciones pvesm y fstab",
|
||||
"headerMethod": "Método",
|
||||
"headerMount": "Ruta de montaje",
|
||||
"headerUi": "Visible en Datacenter > Storage",
|
||||
"headerUseCase": "Caso de uso típico",
|
||||
"rows": [
|
||||
{
|
||||
"method": "<strong>Como almacenamiento de Proxmox (pvesm)</strong>",
|
||||
"mountRich": "<code>/mnt/pve/<storage-id></code> (gestionado por Proxmox)",
|
||||
"ui": "Sí",
|
||||
"useCase": "Imágenes de disco de VM, backups, ISOs, templates LXC — cualquier cosa que necesite aparecer en la UI de Proxmox."
|
||||
},
|
||||
{
|
||||
"method": "<strong>Solo fstab del host</strong>",
|
||||
"mountRich": "<code>/mnt/<path></code> (tú eliges la ruta)",
|
||||
"ui": "No",
|
||||
"useCaseRich": "Hacer bind mount del share en uno o más LXCs <em>sin</em> exponerlo como almacenamiento de Proxmox. Mantiene la UI de Datacenter limpia."
|
||||
},
|
||||
{
|
||||
"method": "<strong>Ambos</strong>",
|
||||
"mount": "Ambas rutas de arriba (dos conexiones NFS independientes al servidor)",
|
||||
"ui": "Sí",
|
||||
"useCase": "Quieres integración con la UI Y una ruta estable del lado del host con permisos abiertos para bind mounts LXC. El servidor ve dos conexiones desde el host."
|
||||
}
|
||||
],
|
||||
"bothTitle": "\"Ambos\" crea dos montajes NFS independientes",
|
||||
"bothBody": "Marcar ambas opciones ejecuta cada método independientemente — pvesm monta en <code>/mnt/pve/<id></code>, fstab monta en <code>/mnt/<path></code>. El servidor ve dos conexiones TCP desde el host Proxmox. Esto es intencional: te permite mantener el almacenamiento pvesm limpio (opciones por defecto de Proxmox) mientras tienes un montaje separado del lado del host con permisos abiertos para bind mounts LXC."
|
||||
},
|
||||
"pvesmBranch": {
|
||||
"heading": "Método A — Como almacenamiento de Proxmox (pvesm)",
|
||||
"intro": "Si <em>Como almacenamiento de Proxmox</em> está marcado, ProxMenux ejecuta el flujo pvesm original:",
|
||||
"items": [
|
||||
"<strong>Storage ID</strong> — cómo llamará Proxmox a este almacenamiento. Por defecto es <code>nfs-<server-ip-with-dashes></code>. Solo se aceptan letras, dígitos, <code>-</code> y <code>_</code>.",
|
||||
"<strong>Content types</strong> — Proxmox vincula categorías de contenido a volúmenes de almacenamiento; elige qué se le permite a este NFS contener:"
|
||||
],
|
||||
"headerType": "Content type",
|
||||
"headerAllows": "Qué permite",
|
||||
"rows": [
|
||||
{
|
||||
"type": "import",
|
||||
"allowsRich": "Importaciones de imágenes de disco (seleccionado por defecto). Necesario para <em>Import Disk Image to VM</em>."
|
||||
},
|
||||
{
|
||||
"type": "backup",
|
||||
"allowsRich": "Archivos de backup de VM y CT (<code>vzdump</code>)."
|
||||
},
|
||||
{
|
||||
"type": "iso",
|
||||
"allows": "Imágenes ISO de instalación."
|
||||
},
|
||||
{
|
||||
"type": "vztmpl",
|
||||
"allows": "Templates LXC."
|
||||
},
|
||||
{
|
||||
"type": "images",
|
||||
"allows": "Imágenes de disco de VM en vivo (esto convierte el NFS en un almacén de discos de VM)."
|
||||
},
|
||||
{
|
||||
"type": "rootdir",
|
||||
"allows": "Sistemas de archivos raíz de LXC (raro para NFS — lee la nota de abajo)."
|
||||
},
|
||||
{
|
||||
"type": "snippets",
|
||||
"allows": "Scripts de hook y snippets cloud-init."
|
||||
}
|
||||
],
|
||||
"warnTitle": "images y rootdir en NFS",
|
||||
"warnBody": "Marcar <code>images</code> en un almacenamiento NFS deja a Proxmox colocar discos de VM en vivo ahí. Funciona, pero la latencia de NFS + su semántica de locks lo hacen notablemente más lento que el almacenamiento local (y un corte de red pausa cada VM respaldada por ese almacén). Marcar <code>rootdir</code> significa que alojarás sistemas de archivos raíz de LXC sobre NFS, lo que históricamente da problemas con contenedores unprivileged (interacciones overlay / chown). Es preferible mantener <code>images</code> / <code>rootdir</code> en almacenamiento local o iSCSI y usar NFS para <code>backup</code> / <code>iso</code> / <code>vztmpl</code>.",
|
||||
"result": "El resultado es <code>pvesm add nfs <id> --server <srv> --export <path> --content <csv></code> y Proxmox automonta en <code>/mnt/pve/<id></code>."
|
||||
},
|
||||
"fstabBranch": {
|
||||
"heading": "Método B — Solo montaje fstab del host",
|
||||
"intro": "Si <em>Solo como montaje fstab del host</em> está marcado, ProxMenux pide una ruta de montaje del host y opciones persistentes, luego monta y escribe la entrada en <code>/etc/fstab</code>:",
|
||||
"items": [
|
||||
"<strong>Ruta de montaje del host</strong> — por defecto <code>/mnt/<export-basename></code>. Debe ser una ruta absoluta. Si algo ya está montado ahí, o existe una entrada fstab para la misma ruta, ProxMenux te avisa y ofrece reemplazarla.",
|
||||
"<strong>Mount options</strong> — elige <em>Read/Write</em> (por defecto con <code>rw,hard,nofail,_netdev,rsize=131072,wsize=131072,timeo=600,retrans=2</code>), <em>Read-only</em>, o <em>Custom</em> (escribe tu propia cadena de opciones)."
|
||||
],
|
||||
"appliesIntro": "Una vez confirmes, el script:",
|
||||
"applies": [
|
||||
"<code>mkdir -p</code> de la ruta de montaje.",
|
||||
"<code>mount -t nfs -o <opts> <srv>:<export> <path></code>.",
|
||||
"Escribe una entrada de una línea en <code>/etc/fstab</code>: <code><srv>:<export> <path> nfs <opts> 0 0</code>.",
|
||||
"Ejecuta <code>systemctl daemon-reload</code> para que systemd recoja la nueva entrada fstab.",
|
||||
"Intenta <code>chmod 1777</code> + <code>setfacl o::rwx</code> en el punto de montaje (best-effort silencioso — solo tiene éxito si el servidor NFS lo permite; muchos exports NAS ya sirven rutas world-writable)."
|
||||
],
|
||||
"lxcTitle": "Usar el montaje fstab desde un LXC",
|
||||
"lxcBody": "El script imprime el comando <code>pct set</code> exacto al final para hacer bind mount de la ruta en un contenedor, p. ej. <code>pct set <ctid> -mp0 /mnt/<path>,mp=/mnt/<ct-path>,shared=1,backup=0</code>. O usa el <mountLink>LXC Mount Manager</mountLink>, que detecta el montaje fstab automáticamente. <strong>No se hacen cambios dentro del contenedor</strong> — para que los LXCs unprivileged lean/escriban los datos NFS, el script depende de la semántica world-writable del export del lado del servidor (típica en defaults de Synology, TrueNAS, OMV). Si tu servidor NFS aplica squash a root o restringe permisos, mira Solución de problemas.",
|
||||
"noUiTitle": "El montaje fstab NO es un almacenamiento de Proxmox",
|
||||
"noUiBody": "El montaje fstab del host es invisible para la UI web de Proxmox — por diseño. No aparece en <em>Datacenter > Storage</em>, no puedes seleccionarlo en el creador de VM / CT, y los trabajos de backup de Proxmox no pueden apuntarlo. Es puramente una ruta del sistema de archivos del host. Si quieres también integración con la UI, marca <em>ambos</em> métodos en el selector."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"pvesmIntro": "El Método A (pvesm) se traduce a:",
|
||||
"fstabIntro": "El Método B (fstab) se traduce a:"
|
||||
},
|
||||
"view": {
|
||||
"heading": "Ver almacenamientos NFS configurados",
|
||||
"body": "Lista cada entrada NFS en Proxmox (<code>pvesm status | awk ''$2 == \"nfs\"''</code>) con servidor, export, content types, ruta de montaje y estado en vivo. <strong>Nota:</strong> esta vista solo muestra almacenamientos registrados con pvesm — los montajes solo en fstab no se listan aquí. Compruébalos con <code>findmnt -t nfs</code> o <code>grep nfs /etc/fstab</code>."
|
||||
},
|
||||
"remove": {
|
||||
"heading": "Eliminar almacenamiento NFS",
|
||||
"body": "Ejecuta <code>pvesm remove <storage-id></code> tras una confirmación que muestra servidor / export / contenido. Solo se elimina el registro del lado de Proxmox — <strong>el propio servidor NFS remoto nunca se toca</strong>, no se borran archivos. Para eliminar un montaje solo en fstab, edita <code>/etc/fstab</code> a mano y ejecuta <code>umount <path></code>.",
|
||||
"warnTitle": "Haz backup de las dependencias primero",
|
||||
"warnBody": "Si VMs, CTs o trabajos de backup todavía referencian este almacenamiento (por ID), eliminarlo los deja apuntando a un almacén desaparecido. Proxmox marcará el error pero no limpiará. Mueve o elimina esas referencias primero, después elimina el almacenamiento."
|
||||
},
|
||||
"test": {
|
||||
"heading": "Probar conectividad NFS",
|
||||
"body": "Ejecuta una pasada de diagnóstico sobre cada almacenamiento NFS registrado en Proxmox: comprueba que <code>showmount</code> está disponible, que <code>rpcbind</code> está corriendo, hace ping a cada servidor, prueba el puerto 2049, llama a <code>showmount -e</code> y finalmente informa de la vista del propio Proxmox (<code>pvesm status</code>). Buena primera parada cuando un almacenamiento aparece como <em>inactive</em> en la UI de Proxmox."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noServersTitle": "\"No NFS servers found on the network\"",
|
||||
"noServersBody": "El auto-descubrimiento usa <code>nmap -p 2049 --open <subnet>/24</code>. El servidor puede no responder si: está en una VLAN / subnet diferente, su firewall bloquea las sondas nmap (muchos lo hacen) o el puerto 2049 está intencionalmente cerrado en esa interfaz. Usa la opción <em>Manual</em> con la IP o hostname del servidor en su lugar.",
|
||||
"portTitle": "\"NFS port (2049) is not accessible\"",
|
||||
"portBody": "El ping tuvo éxito pero <code>nc -z -w 3 <server> 2049</code> falló. Comprueba que el servicio NFS está corriendo en el servidor (<code>systemctl status nfs-server</code> en Linux, Panel de Control → File Services en Synology, plugin NFS en OMV / TrueNAS) y que el firewall permite el 2049 desde el host Proxmox.",
|
||||
"showmountTitle": "\"Failed to connect\" desde showmount",
|
||||
"showmountBody": "El servidor rechazó la consulta de la lista de exports. Causas comunes: el servidor aplica ACLs de cliente estrictas (tu IP de Proxmox no está en la lista permitida), <code>rpcbind</code> no está corriendo en el servidor o el servidor expone solo NFSv4 con <code>showmount</code> deshabilitado. La ruta del export se puede añadir manualmente igualmente si la conoces.",
|
||||
"inactiveTitle": "El almacenamiento aparece como inactive en la UI de Proxmox",
|
||||
"inactiveBody": "Ejecuta <em>Test NFS Connectivity</em> primero — el 99 % de las veces esto marca el salto exacto que se rompe (DNS, puerto, permisos de montaje). Si la conectividad va bien pero Proxmox sigue marcando inactive, comprueba <code>journalctl -u pvestatd</code> en el nodo Proxmox; DNS intermitente o montajes NFS lentos al arrancar pueden dejar almacenamientos en estado inactive hasta que <code>pvesm set <id> --disable 0</code> se reaplica.",
|
||||
"lxcNoWriteTitle": "El montaje fstab funciona pero un LXC unprivileged no puede escribir por un bind mount",
|
||||
"lxcNoWriteBody": "Los permisos NFS se aplican del lado del servidor, no del host. Las opciones fstab (<code>uid=</code>, <code>file_mode=</code>) que funcionan para CIFS <strong>no</strong> se aplican a NFS. Si tu LXC unprivileged (root dentro del CT = UID 100000 en el host, mapeado a NFS como \"others\") no puede escribir, el servidor NFS o bien aplica squash a root o bien tiene permisos restrictivos. Arregla en el servidor: cambia el export a <code>no_root_squash</code> si confías en el host, o pon el export world-writable (Synology, TrueNAS, OMV exponen esto en su UI). El script intenta <code>chmod 1777</code> en el montaje pero eso solo tiene éxito cuando el servidor lo permite.",
|
||||
"fstabBootTitle": "El montaje fstab no se levanta tras el reinicio",
|
||||
"fstabBootBody": "El script añade <code>nofail,_netdev</code> para que un share que falte al arranque no bloquee el inicio. Si el montaje nunca se levanta: confirma que la red es alcanzable (<code>ping <server></code>), comprueba <code>journalctl -u remote-fs.target</code> y verifica que la entrada es válida con <code>mount -fav | grep nfs</code>. <code>mount -a</code> después del arranque monta todo lo que falte actualmente."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share/host-samba",
|
||||
"label": "Samba / CIFS como almacenamiento de Proxmox",
|
||||
"tail": " — mismo patrón de flujo (Método A pvesm + Método B fstab) para shares SMB/CIFS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-mount-points",
|
||||
"label": "LXC Mount Manager",
|
||||
"tailRich": " — hacer bind mount de la ruta solo en fstab <code>/mnt/<path></code> en uno o más contenedores."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-nfs-client",
|
||||
"label": "Cliente NFS en LXC",
|
||||
"tail": " — alternativa: monta NFS directamente desde dentro de un contenedor privileged (se salta el host)."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Host: montar share Samba en el host | ProxMenux Documentation",
|
||||
"description": "Monta un share Samba / CIFS externo en el host Proxmox — bien como almacenamiento de Proxmox (pvesm add cifs), bien como un montaje fstab del host normal con uid/gid/file_mode abiertos (NO visible en Datacenter > Storage), o ambos. El método fstab abre los permisos para que un LXC unprivileged que haga bind mount de la ruta pueda leer/escribir sin cambios dentro del contenedor.",
|
||||
"ogTitle": "Host: montar share Samba en el host | ProxMenux Documentation",
|
||||
"ogDescription": "Monta un share Samba / CIFS externo en el host Proxmox vía pvesm, fstab con permisos abiertos (ideal para bind mounts LXC), o ambos."
|
||||
},
|
||||
"header": {
|
||||
"title": "Host: montar share Samba en el host",
|
||||
"description": "Monta un share Samba (SMB / CIFS) externo — de un NAS, una máquina Windows, un export SMB de TrueNAS — en el host Proxmox. Elige uno o ambos métodos: regístralo como almacenamiento de Proxmox (visible en Datacenter > Storage) y/o añade un montaje /etc/fstab normal en una ruta que tú elijas, con uid/gid/file_mode abiertos para que los LXCs unprivileged puedan hacer bind mount y escribir sin cambios dentro del contenedor.",
|
||||
"section": "Almacenamiento y compartición · Host"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "ProxMenux ofrece dos métodos de montaje para cualquier share Samba: <strong>(1) Almacenamiento de Proxmox</strong> vía <code>pvesm add cifs</code> — visible en Datacenter > Storage, montado en <code>/mnt/pve/<id></code>, credenciales guardadas cifradas en <code>/etc/pve/priv/storage/<id>.pw</code>; <strong>(2) Montaje fstab del host</strong> en una ruta que tú elijas — persistente vía <code>/etc/fstab</code>, montado con <code>uid=0,gid=0,file_mode=0777,dir_mode=0777</code> para que los bind mounts LXC unprivileged puedan escribir, credenciales guardadas en un archivo solo para root en <code>/etc/samba/credentials/</code> (la contraseña nunca aparece en <code>fstab</code>). Puedes ejecutar un método, el otro o ambos."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir la herramienta",
|
||||
"body": "Desde el menú principal de ProxMenux, abre <strong>Storage & Share Manager → Mount Samba Share on Host</strong>. Verás este submenú con cuatro opciones:",
|
||||
"imageAlt": "Menú Samba Host Manager — Mount / View / Remove / Test connectivity"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene dos fases. Fase 1: descubre el servidor, valida credenciales, elige share y elige método o métodos de montaje vía una lista de verificación. Fase 2: solo se ejecutan los métodos que marcaste. Las credenciales se necesitan por adelantado porque <code>smbclient</code> las necesita para listar shares. Hasta la confirmación final, ni <code>/etc/pve/storage.cfg</code> ni <code>/etc/fstab</code> se tocan."
|
||||
},
|
||||
"modes": {
|
||||
"heading": "Selector de método de montaje (dos opciones, marca una o ambas)",
|
||||
"intro": "Tras seleccionar el share y validar las credenciales, ProxMenux muestra una lista de verificación con los dos métodos de montaje. Puedes marcar uno o ambos. Si pulsas OK sin marcar nada, el diálogo reaparece hasta que elijas al menos una opción o pulses Cancel para salir del flujo.",
|
||||
"headerMethod": "Método",
|
||||
"headerMount": "Ruta de montaje",
|
||||
"headerUi": "Visible en Datacenter > Storage",
|
||||
"headerUseCase": "Caso de uso típico",
|
||||
"rows": [
|
||||
{
|
||||
"method": "<strong>Como almacenamiento de Proxmox (pvesm)</strong>",
|
||||
"mountRich": "<code>/mnt/pve/<storage-id></code> (gestionado por Proxmox)",
|
||||
"ui": "Sí",
|
||||
"useCase": "Backups, ISOs, templates LXC — cualquier cosa que necesite aparecer en la UI de Proxmox. Los discos de VM en vivo están técnicamente soportados pero desaconsejados en CIFS (semántica de locking)."
|
||||
},
|
||||
{
|
||||
"method": "<strong>Solo fstab del host</strong>",
|
||||
"mountRich": "<code>/mnt/<path></code> con uid/gid/file_mode abiertos",
|
||||
"ui": "No",
|
||||
"useCaseRich": "Hacer bind mount del share en uno o más LXCs <em>sin</em> exponerlo como almacenamiento de Proxmox. Los permisos abiertos garantizan que los CTs unprivileged puedan escribir a través del bind mount."
|
||||
},
|
||||
{
|
||||
"method": "<strong>Ambos</strong>",
|
||||
"mount": "Ambas rutas de arriba (dos conexiones CIFS independientes al servidor)",
|
||||
"ui": "Sí",
|
||||
"useCase": "Quieres integración con la UI Y una ruta estable del lado del host con permisos abiertos para bind mounts LXC. El montaje pvesm usa los valores por defecto de Proxmox; el montaje fstab aplica el uid/gid/file_mode abierto por separado."
|
||||
}
|
||||
],
|
||||
"bothTitle": "\"Ambos\" crea dos conexiones CIFS independientes",
|
||||
"bothBody": "pvesm y fstab montan el mismo share dos veces con opciones distintas. El montaje pvesm en <code>/mnt/pve/<id></code> usa los valores por defecto de Proxmox (sin uid/gid abiertos) — la UI de Proxmox está contenta. El montaje fstab en <code>/mnt/<path></code> usa <code>uid=0,gid=0,file_mode=0777,dir_mode=0777</code> — los bind mounts LXC unprivileged a él pueden escribir. Dos conexiones TCP al servidor SMB desde el mismo host Proxmox."
|
||||
},
|
||||
"pvesmBranch": {
|
||||
"heading": "Método A — Como almacenamiento de Proxmox (pvesm)",
|
||||
"intro": "Si <em>Como almacenamiento de Proxmox</em> está marcado, ProxMenux ejecuta el flujo pvesm original:",
|
||||
"items": [
|
||||
"<strong>Storage ID</strong> — por defecto <code>cifs-<server-ip-with-dashes></code>. Solo letras, dígitos, <code>-</code> y <code>_</code>.",
|
||||
"<strong>Content types</strong> — CIFS expone <strong>6</strong> opciones (las mismas que NFS menos <code>rootdir</code>, que Proxmox no permite en CIFS porque la semántica de locking no puede sostener un rootfs LXC en vivo):"
|
||||
],
|
||||
"headerType": "Content type",
|
||||
"headerAllows": "Qué permite",
|
||||
"rows": [
|
||||
{
|
||||
"type": "import",
|
||||
"allows": "Importaciones de imágenes de disco (seleccionado por defecto)."
|
||||
},
|
||||
{
|
||||
"type": "backup",
|
||||
"allowsRich": "Archivos de backup de VM y CT (<code>vzdump</code>)."
|
||||
},
|
||||
{
|
||||
"type": "iso",
|
||||
"allows": "Imágenes ISO de instalación."
|
||||
},
|
||||
{
|
||||
"type": "vztmpl",
|
||||
"allows": "Templates LXC."
|
||||
},
|
||||
{
|
||||
"type": "images",
|
||||
"allowsRich": "Imágenes de disco de VM en vivo — <strong>avisado en línea</strong>, ver abajo."
|
||||
},
|
||||
{
|
||||
"type": "snippets",
|
||||
"allows": "Scripts de hook y snippets cloud-init."
|
||||
}
|
||||
],
|
||||
"warnTitle": "Discos de VM en vivo en CIFS",
|
||||
"warnBody": "Si marcas <code>images</code>, ProxMenux saca un aviso antes de continuar. CIFS usa un modelo de locking advisory que interactúa mal con las operaciones de disco de KVM (snapshots, migración en vivo, I/O bajo contención). Un almacén de backups o ISOs en CIFS es perfectamente correcto; un almacén de discos en vivo es buscarse problemas. Usa NFS (o almacenamiento local) para <code>images</code> cuando puedas.",
|
||||
"credsTitle": "Dónde guarda pvesm las credenciales",
|
||||
"credsBody": "Cuando usas autenticación de usuario, la contraseña NO se escribe en <code>/etc/pve/storage.cfg</code>. Proxmox la guarda en <code>/etc/pve/priv/storage/<storage-id>.pw</code> — modo <code>0600</code>, propietario <code>root</code>, miembro del cluster sync. Si más adelante cambias la contraseña en el servidor Samba, usa <code>pvesm set <id> --password <new></code> o elimina y vuelve a añadir a través de ProxMenux."
|
||||
},
|
||||
"fstabBranch": {
|
||||
"heading": "Método B — Solo montaje fstab del host",
|
||||
"intro": "Si <em>Solo como montaje fstab del host</em> está marcado, ProxMenux pide una ruta de montaje del host y opciones persistentes, escribe un archivo de credenciales solo para root (modo User), luego monta y escribe la entrada en <code>/etc/fstab</code>:",
|
||||
"items": [
|
||||
"<strong>Ruta de montaje del host</strong> — por defecto <code>/mnt/<share-name></code>. Debe ser una ruta absoluta. Si algo ya está montado ahí, o existe una entrada fstab, ProxMenux ofrece reemplazarla.",
|
||||
"<strong>Mount options</strong> — elige <em>Read/Write</em> (por defecto con <code>rw,uid=0,gid=0,file_mode=0777,dir_mode=0777,iocharset=utf8,nofail,_netdev</code>), <em>Read-only</em> (variante de solo lectura con <code>file_mode=0555,dir_mode=0555</code>), o <em>Custom</em> (escribe tu propia cadena de opciones). El uid/gid/file_mode abiertos siempre se recomiendan para escrituras a través de bind mount LXC."
|
||||
],
|
||||
"credsTitle": "Archivo de credenciales (modo User)",
|
||||
"credsBody": "Si te autenticaste con usuario + contraseña, ProxMenux escribe un archivo de credenciales solo para root en <code>/etc/samba/credentials/<server>_<share>.cred</code> (modo <code>0600</code>) con líneas <code>username=</code> y <code>password=</code>, y lo referencia en la entrada fstab vía la opción de montaje <code>credentials=</code>. El texto en claro nunca aterriza en <code>/etc/fstab</code>. Para el modo Guest, en su lugar se añade la opción <code>guest</code> y no se crea archivo de credenciales.",
|
||||
"appliesIntro": "Una vez confirmes, el script:",
|
||||
"applies": [
|
||||
"<code>mkdir -p</code> de la ruta de montaje.",
|
||||
"<code>mount -t cifs -o <opts>,credentials=<file></code> (o <code>guest</code>) <code>//<srv>/<share> <path></code>.",
|
||||
"Escribe una entrada de una línea en <code>/etc/fstab</code>: <code>//<srv>/<share> <path> cifs <opts> 0 0</code>.",
|
||||
"Ejecuta <code>systemctl daemon-reload</code> para que systemd recoja la nueva entrada fstab."
|
||||
],
|
||||
"lxcTitle": "Usar el montaje fstab desde un LXC unprivileged",
|
||||
"lxcBody": "Como el cliente CIFS aplica <code>uid=0,gid=0,file_mode=0777,dir_mode=0777</code>, cada archivo en el montaje pertenece al UID 0 del host con modo 0777. Un LXC unprivileged que haga bind mount de la ruta ve permisos \"others\" en cada entrada (root del CT = UID 100000 del host = others en el sistema de archivos del host), así que las lecturas y escrituras tienen éxito. <strong>No se hacen cambios dentro del contenedor</strong> — sin <code>chown</code> en el CT, sin configuración de grupo, nada modificado en <code>/etc/lxc</code> más allá de la única línea <code>mp</code> de bind mount. El script imprime el comando <code>pct set</code> exacto al final, o usa el <mountLink>LXC Mount Manager</mountLink> para adjuntar la ruta.",
|
||||
"noUiTitle": "El montaje fstab NO es un almacenamiento de Proxmox",
|
||||
"noUiBody": "El montaje fstab del host es invisible para la UI web de Proxmox — por diseño. No aparece en <em>Datacenter > Storage</em>, no puedes seleccionarlo en el creador de VM / CT y los trabajos de backup de Proxmox no pueden apuntarlo. Es puramente una ruta del sistema de archivos del host. Si quieres también integración con la UI, marca <em>ambos</em> métodos en el selector."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"pvesmIntro": "El Método A (pvesm) se traduce a:",
|
||||
"fstabUserIntro": "Método B (fstab, auth de usuario) — archivo de credenciales + montaje:",
|
||||
"fstabGuestIntro": "Método B (fstab, auth guest) — sin archivo de credenciales:"
|
||||
},
|
||||
"view": {
|
||||
"heading": "Ver almacenamientos CIFS configurados",
|
||||
"body": "Lista cada entrada CIFS en Proxmox (<code>pvesm status | awk ''$2 == \"cifs\"''</code>) con servidor, share, content types, usuario (o <em>Guest</em>), ruta de montaje y estado en vivo. La contraseña <strong>nunca se imprime</strong>. <strong>Nota:</strong> esta vista solo muestra almacenamientos registrados con pvesm — los montajes solo en fstab no se listan. Compruébalos con <code>findmnt -t cifs</code> o <code>grep cifs /etc/fstab</code>."
|
||||
},
|
||||
"remove": {
|
||||
"heading": "Eliminar almacenamiento CIFS",
|
||||
"body": "Ejecuta <code>pvesm remove <storage-id></code> tras una confirmación que muestra servidor / share / contenido. Solo se elimina el registro del lado de Proxmox — <strong>el servidor Samba remoto no se toca</strong>. Proxmox también borra el archivo de credenciales emparejado. Para eliminar un montaje solo en fstab, edita <code>/etc/fstab</code> a mano, ejecuta <code>umount <path></code> y elimina el archivo de <code>/etc/samba/credentials/</code>.",
|
||||
"warnTitle": "Haz backup de las dependencias primero",
|
||||
"warnBody": "Las VMs, CTs o trabajos de backup que referencien este almacenamiento por ID fallarán tras la eliminación. Mueve / elimina esas referencias antes de eliminar el almacenamiento."
|
||||
},
|
||||
"test": {
|
||||
"heading": "Probar conectividad Samba",
|
||||
"body": "Ejecuta una pasada de diagnóstico sobre cada almacenamiento CIFS registrado en Proxmox: comprueba que <code>smbclient</code> está disponible, hace ping a cada servidor, prueba los puertos 445 y 139, intenta un listado guest e informa de la vista del propio Proxmox (<code>pvesm status</code>). \"Requires authentication\" en el listado guest significa que tu servidor solo expone shares a usuarios autenticados — normal en la mayoría de setups NAS."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noServersTitle": "\"No Samba servers found on the network\"",
|
||||
"noServersBody": "El auto-descubrimiento usa <code>nmap -p 139,445</code>. El servidor puede estar en una subnet diferente, con firewall o solo alcanzable por hostname (mDNS / WINS). Usa la opción <em>Manual</em> con la IP o hostname en su lugar.",
|
||||
"noSharesTitle": "\"No accessible shares found\"",
|
||||
"noSharesBody": "<code>smbclient -L</code> no devolvió nada para estas credenciales. Causas: el usuario no tiene permiso para listar shares (prueba con credenciales de admin una vez, o escribe el nombre del share manualmente), el servidor tiene la visibilidad de shares deshabilitada o las credenciales son incorrectas. El script te permite escribir el nombre del share a mano en este caso.",
|
||||
"denyTitle": "El montaje de Proxmox falla con NT_STATUS_ACCESS_DENIED",
|
||||
"denyBody": "Las credenciales que pvesm guardó están desincronizadas con el servidor Samba (contraseña cambiada, cuenta deshabilitada, mismatch de domain / workgroup). Vuelve a introducir credenciales con <code>pvesm set <id> --username <u> --password <p></code> o elimina y vuelve a añadir desde ProxMenux. Si el servidor está en un dominio AD, añade <code>--domain <DOMAIN></code> a la llamada <code>pvesm set</code>.",
|
||||
"sleepTitle": "\"host is down\" o el estado del almacenamiento pasa a inactive por la noche",
|
||||
"sleepBody": "Algunos appliances NAS ponen SMB en suspensión agresivamente. <code>pvestatd</code> entonces ve el almacenamiento como inactive hasta que el primer acceso despierta al NAS. Si es cosmético, no hay nada roto. Si causa fallos de backup, deshabilita la desconexión por idle de SMB en el NAS o programa los backups fuera de la ventana de suspensión.",
|
||||
"lxcNoWriteTitle": "El bind mount LXC unprivileged no puede escribir en la ruta fstab",
|
||||
"lxcNoWriteBody": "Confirma que el montaje usa las opciones abiertas: <code>findmnt /mnt/<path></code> debería mostrar <code>uid=0,gid=0,file_mode=0777,dir_mode=0777</code>. Si una cadena de opciones Custom omite esas, un LXC unprivileged tendrá permission denied (los UIDs del CT mapean a \"others\" del host, que sin file_mode abierto no tienen bit de escritura). Vuelve a montar con el preset RW por defecto o añade las cuatro opciones de vuelta a tu cadena custom.",
|
||||
"fstabBootTitle": "El montaje fstab no se levanta tras el reinicio",
|
||||
"fstabBootBody": "El script añade <code>nofail,_netdev</code> para que un share que falte al arranque no bloquee el inicio. Si el montaje nunca se levanta: confirma que la red es alcanzable (<code>ping <server></code>), comprueba <code>journalctl -u remote-fs.target</code>, verifica que el archivo de credenciales sigue existiendo (<code>ls -l /etc/samba/credentials/</code>) y es legible, y prueba <code>mount -a</code> manualmente."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share/host-nfs",
|
||||
"label": "Share NFS como almacenamiento de Proxmox",
|
||||
"tail": " — página hermana con el mismo patrón de flujo (Método A pvesm + Método B fstab) y contrapartidas en paralelo."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-mount-points",
|
||||
"label": "LXC Mount Manager",
|
||||
"tailRich": " — hacer bind mount de la ruta solo en fstab <code>/mnt/<path></code> en uno o más contenedores."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-samba-client",
|
||||
"label": "Cliente Samba en LXC",
|
||||
"tail": " — alternativa: monta Samba directamente desde dentro de un contenedor privileged (se salta el host)."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "NFS, Samba, iSCSI y puntos de montaje LXC en Proxmox — Almacenamiento y compartición | ProxMenux",
|
||||
"description": "Integra almacenamiento externo y local en Proxmox VE y comparte carpetas entre el host y los contenedores LXC. Añade shares NFS, Samba (CIFS) y targets iSCSI como almacenamiento de Proxmox, configura bind mounts LXC (Mount Manager) y ejecuta clientes y servidores NFS / Samba dentro de contenedores.",
|
||||
"ogTitle": "NFS, Samba, iSCSI y puntos de montaje LXC en Proxmox — Almacenamiento y compartición",
|
||||
"ogDescription": "Integra almacenamiento externo y local en Proxmox VE — registro de NFS, Samba e iSCSI más bind mounts LXC y compartición por red.",
|
||||
"twitterTitle": "Proxmox NFS, Samba, iSCSI | ProxMenux",
|
||||
"twitterDescription": "Añade NFS / Samba / iSCSI como almacenamiento de Proxmox y comparte carpetas entre el host y LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Storage & Share Manager",
|
||||
"description": "Integra almacenamiento externo o local en Proxmox VE y comparte carpetas entre el host y los contenedores LXC. Tres bloques de herramientas: integración de almacenamiento en el host (registra almacenamiento en el propio Proxmox), el LXC Mount Manager (bind mounts con un manejo pragmático de permisos) y compartición por red en LXC (flujos de cliente y servidor NFS / Samba para casos de uso concretos).",
|
||||
"section": "Almacenamiento y compartición"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para qué sirve este menú",
|
||||
"body": "El Disk Manager trabaja a nivel de <em>discos físicos individuales</em>. Storage & Share Manager trabaja un nivel por encima — <strong>registra pools de almacenamiento y shares de red en Proxmox</strong> (para que la UI y el creador de VMs los puedan usar) y <strong>configura la compartición de archivos entre el host y tus contenedores</strong>."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir el menú",
|
||||
"body": "Desde el menú principal de ProxMenux, selecciona <strong>Storage & Share Manager</strong>. Verás esto:",
|
||||
"imageAlt": "Menú Storage & Share Manager con bloques HOST y LXC"
|
||||
},
|
||||
"groups": {
|
||||
"heading": "Tres grupos de herramientas",
|
||||
"intro": "El menú se divide en tres bloques. <strong>Integración de almacenamiento en el host</strong> registra almacenamiento externo o local en el propio Proxmox. El <strong>LXC Mount Manager</strong> es la herramienta principal para compartir carpetas con contenedores — un flujo de bind mount pragmático que gestiona el mapeo de UIDs de CTs unprivileged en el lado del host. <strong>Compartición por red en LXC</strong> cubre cuatro escenarios adicionales en los que un contenedor necesita <em>consumir</em> o <em>exponer</em> shares NFS / Samba directamente.",
|
||||
"hostTitle": "Almacenamiento en el host",
|
||||
"hostBody": "Registra almacenamiento externo y local en Proxmox vía <code>pvesm add …</code>. Una vez registrado, el almacenamiento aparece en la UI de Proxmox y queda disponible para los creadores de VMs y CTs.",
|
||||
"hostItems": [
|
||||
"NFS / Samba / iSCSI externo → almacenamiento de Proxmox",
|
||||
"Disco local → almacenamiento Proxmox directory o ZFS",
|
||||
"Directorio local compartido (para bind mounts entre CTs)"
|
||||
],
|
||||
"lxcMountTitle": "LXC Mount Manager",
|
||||
"lxcMountBody": "La herramienta principal de compartición LXC. Hace bind mount de directorios del host dentro de los contenedores vía <code>pct set -mpN</code> y gestiona las particularidades de permisos de los CTs unprivileged sin crear ningún grupo o usuario dentro del contenedor.",
|
||||
"lxcMountItems": [
|
||||
"Funciona con CTs privileged y unprivileged",
|
||||
"Ofrece aplicar <code>o+rwx</code> en el directorio del host para UIDs unprivileged",
|
||||
"Repara montajes CIFS / NFS existentes si hace falta"
|
||||
],
|
||||
"lxcNetTitle": "Compartición por red en LXC",
|
||||
"lxcNetBody": "Cuatro flujos adicionales para escenarios en los que un contenedor necesita consumir o exponer shares NFS / Samba directamente. Todos requieren un contenedor <strong>privileged</strong>.",
|
||||
"lxcNetItems": [
|
||||
"<strong>Cliente</strong> NFS / Samba (consumir shares externos)",
|
||||
"<strong>Servidor</strong> NFS / Samba (exponer carpetas del CT)"
|
||||
]
|
||||
},
|
||||
"host": {
|
||||
"heading": "Integración de almacenamiento en el host",
|
||||
"intro": "Registra almacenamiento en Proxmox. Cada opción llama a <code>pvesm add …</code> por dentro, así que el almacenamiento aparece en <strong>Datacenter → Storage</strong> y queda disponible para los creadores de VM / CT.",
|
||||
"options": [
|
||||
{
|
||||
"href": "/docs/storage-share/host-nfs",
|
||||
"icon": "Network",
|
||||
"title": "Añadir share NFS como almacenamiento de Proxmox",
|
||||
"description": "Registra un export NFS externo como almacenamiento de Proxmox vía pvesm add nfs. Proxmox gestiona el montaje — no hacen falta entradas en fstab."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-samba",
|
||||
"icon": "Share2",
|
||||
"title": "Añadir share Samba como almacenamiento de Proxmox",
|
||||
"description": "Registra un share Samba / CIFS externo como almacenamiento de Proxmox vía pvesm add cifs. Proxmox gestiona el montaje y las credenciales."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-iscsi",
|
||||
"icon": "Database",
|
||||
"title": "Añadir target iSCSI como almacenamiento de Proxmox",
|
||||
"description": "Conecta a un target iSCSI externo y lo registra como almacenamiento de Proxmox (dispositivo de bloque) para imágenes de disco de VM."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-local-disk",
|
||||
"icon": "HardDrive",
|
||||
"title": "Añadir disco local como almacenamiento de Proxmox",
|
||||
"description": "Formatea un disco local SATA / SAS / NVMe y lo registra como almacenamiento Proxmox directory o ZFS pool."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-local-shared",
|
||||
"icon": "FolderOpen",
|
||||
"title": "Añadir directorio compartido en el host",
|
||||
"description": "Crea un directorio en el host pensado para hacer bind mount en varios CTs. No es un almacenamiento de Proxmox — solo un recurso del lado del host para bind mounts LXC."
|
||||
}
|
||||
]
|
||||
},
|
||||
"lxcMount": {
|
||||
"heading": "LXC Mount Manager",
|
||||
"intro": "La herramienta principal para compartir carpetas entre el host Proxmox y los contenedores LXC. Usa <code>pct set -mpN</code> para hacer bind mount de un directorio del host dentro del contenedor, y gestiona las particularidades de permisos de los CTs unprivileged en el lado del host (no se crea ningún grupo ni usuario dentro del contenedor).",
|
||||
"card": {
|
||||
"title": "Puntos de montaje LXC (host ↔ CT)",
|
||||
"description": "Bind mount de cualquier directorio del host dentro de un contenedor LXC vía pct set -mpN. Funciona con CTs privileged y unprivileged; ofrece chmod o+rwx / ACLs en el directorio del host y repara montajes CIFS / NFS existentes cuando hace falta."
|
||||
}
|
||||
},
|
||||
"lxcNet": {
|
||||
"heading": "Compartición por red en LXC",
|
||||
"intro": "Usa estos flujos cuando un contenedor necesita <em>ser</em> un endpoint NFS / Samba — ya sea consumiendo un share externo (cliente) o exponiendo sus propias carpetas (servidor). Para la mayoría de necesidades de compartición de archivos (bind mounts host ↔ CT), el <mountLink>LXC Mount Manager</mountLink> es más sencillo y no requiere contenedores privileged.",
|
||||
"options": [
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-nfs-client",
|
||||
"icon": "Download",
|
||||
"title": "Cliente NFS en LXC",
|
||||
"description": "Monta shares NFS externos desde dentro de un contenedor LXC privileged. Soporta auto-descubrimiento, persistencia en /etc/fstab y desmontaje limpio."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-samba-client",
|
||||
"icon": "Download",
|
||||
"title": "Cliente Samba en LXC",
|
||||
"description": "Monta shares Samba / CIFS desde dentro de un contenedor LXC privileged. Credenciales guardadas de forma segura, auto-descubrimiento disponible."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-nfs-server",
|
||||
"icon": "Upload",
|
||||
"title": "Servidor NFS en LXC",
|
||||
"description": "Exporta carpetas por NFS desde dentro de un contenedor LXC privileged."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-samba-server",
|
||||
"icon": "Upload",
|
||||
"title": "Servidor Samba en LXC",
|
||||
"description": "Expone carpetas por SMB / CIFS desde dentro de un contenedor LXC privileged."
|
||||
}
|
||||
]
|
||||
},
|
||||
"privReq": {
|
||||
"title": "Requisito de contenedor privileged",
|
||||
"body": "Los cuatro flujos de <strong>compartición por red en LXC</strong> de arriba requieren un contenedor <strong>privileged</strong> — los módulos de kernel (<code>nfs-kernel-server</code>, <code>smbd</code>, <code>mount.nfs</code>, <code>mount.cifs</code>) necesitan capabilities que los CTs unprivileged no exponen. Si solo necesitas compartir archivos entre el host y un CT unprivileged, usa el <mountLink>LXC Mount Manager</mountLink> en su lugar — hace bind mount desde el host y ajusta los permisos en el lado del host para que el contenedor pueda leer y escribir sin trucos de módulos de kernel."
|
||||
},
|
||||
"unprivExplain": {
|
||||
"title": "Cómo gestiona ProxMenux los permisos de CT unprivileged",
|
||||
"body": "Los contenedores LXC unprivileged desplazan sus UIDs en <strong>+100000</strong> en el host (UID 0 del contenedor = UID 100000 del host, UID 1000 del contenedor = UID 101000 del host, …). Por tanto, un archivo creado por un usuario del contenedor aparece en el host como <em>others</em> — sin pertenecer a ningún usuario o grupo real del host. El LXC Mount Manager aborda esto de forma pragmática: en vez de intentar alinear UIDs / GIDs entre host y CT, ofrece aplicar <code>chmod o+rwx</code> (más las ACLs correspondientes) en el directorio del host, para que cualquier UID mapeado pueda leer y escribir. Para CIFS remonta con <code>uid=0,gid=0,file_mode=0777,dir_mode=0777</code>; para NFS pone un directorio sticky escribible por todos y, si el servidor aplica squash a root, te guía al ajuste correcto del lado del servidor."
|
||||
},
|
||||
"scripts": {
|
||||
"heading": "Scripts implicados",
|
||||
"intro": "Cada página individual enlaza al script que dirige su flujo. El archivo de abajo es un helper compartido que no está documentado como página propia pero lo usan varios de los flujos de compartición por red en LXC:",
|
||||
"itemTail": " — validación de CT, selección de punto de montaje, comprobación de privileged y helpers de configuración de grupo universal compartidos entre los flujos de cliente / servidor en LXC."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Puntos de montaje LXC (host ↔ contenedor) | ProxMenux Documentation",
|
||||
"description": "El LXC Mount Manager — bind mount de cualquier directorio del host en uno o más contenedores LXC vía pct set -mpN. Gestiona las particularidades de permisos de los contenedores unprivileged, repara montajes CIFS / NFS existentes en el lado del host y nunca modifica nada dentro del contenedor.",
|
||||
"ogTitle": "Puntos de montaje LXC (host ↔ contenedor) | ProxMenux Documentation",
|
||||
"ogDescription": "Bind mount de directorios del host en contenedores LXC. Gestiona el mapeo de UIDs unprivileged de forma pragmática, repara el acceso CIFS / NFS en el lado del host."
|
||||
},
|
||||
"header": {
|
||||
"title": "Puntos de montaje LXC (host ↔ contenedor)",
|
||||
"description": "La herramienta principal para compartir carpetas entre el host Proxmox y los contenedores LXC. Bind mount de cualquier directorio del host en uno o más contenedores usando la sintaxis nativa pct set -mpN de Proxmox. La parte inteligente: resuelve los quebraderos de cabeza de permisos de los contenedores unprivileged en el lado del host — nunca modifica nada dentro del contenedor.",
|
||||
"section": "Almacenamiento y compartición · LXC"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace",
|
||||
"body": "Coge un directorio que vive en el host Proxmox (una carpeta local, un share NAS montado, un almacenamiento gestionado por Proxmox…) y haz que aparezca dentro de un contenedor LXC en una ruta que tú elijas, con permisos que funcionan incluso para contenedores unprivileged — sin tocar nada dentro del contenedor."
|
||||
},
|
||||
"bigPicture": {
|
||||
"heading": "Cómo funciona (visión general)",
|
||||
"intro": "Un bind mount es exactamente lo que el nombre dice: Proxmox le dice al kernel \"el directorio del host <code>X</code> también debería aparecer en la ruta <code>Y</code> dentro de este contenedor\". No hay copia, ni sync, ni red — ambos lados ven los <em>mismos archivos</em> a la vez.",
|
||||
"sourceLabel": "Host Proxmox",
|
||||
"sourceDetail": "/mnt/data\n(tu carpeta)",
|
||||
"targetLabel": "Contenedor LXC",
|
||||
"targetDetail": "/mnt/data\n(aparece aquí)",
|
||||
"arrowLabel": "bind mount",
|
||||
"outro": "La ruta del host a la izquierda y la ruta del contenedor a la derecha pueden ser diferentes — por ejemplo, <code>/mnt/nas-films</code> en el host puede convertirse en <code>/media/films</code> dentro del contenedor. El script añade la entrada a la config del contenedor (<code>/etc/pve/lxc/<ctid>.conf</code>) usando el siguiente índice <code>mpN</code> libre, con dos valores por defecto seguros incorporados:",
|
||||
"items": [
|
||||
"<code>shared=1</code> — le dice a Proxmox que los datos son almacenamiento compartido, así que no intenta migrar el disco al migrar el contenedor.",
|
||||
"<code>backup=0</code> — excluye el bind mount de los backups <code>vzdump</code> (los datos viven en el host, los respaldas por separado)."
|
||||
]
|
||||
},
|
||||
"perms": {
|
||||
"heading": "Gestión de permisos — la parte inteligente",
|
||||
"intro": "Los bind mounts son fáciles en principio. La parte difícil son los permisos: un contenedor LXC <strong>unprivileged</strong> desplaza cada UID en <strong>+100000</strong>, así que un archivo creado dentro del contenedor por el usuario 1000 aparece en el host como UID 101000 — un UID que nadie en el host posee. Para que esto funcione sin alinear UIDs entre hosts y contenedores, ProxMenux aplica el truco adecuado de \"abrir permisos\" en el lado del <em>host</em>, dependiendo del tipo de directorio que elegiste:",
|
||||
"headerType": "Tipo de directorio del host",
|
||||
"headerAction": "Qué ofrece hacer el script",
|
||||
"localType": "Carpeta local",
|
||||
"localTypeSub": "p. ej. /mnt/data",
|
||||
"localActionRich": "<code>chmod o+rwx</code> + <code>setfacl o::rwx</code> en el directorio del host. Solo se ofrece si el CT es unprivileged y los permisos actuales son insuficientes.",
|
||||
"cifsType": "CIFS / SMB montado",
|
||||
"cifsTypeSub": "p. ej. /mnt/pve/cifs-…",
|
||||
"cifsActionRich": "Remontar con <code>uid=0, gid=0, file_mode=0777, dir_mode=0777</code> para que el CT (cualquier UID) pueda leer y escribir el share. <code>/etc/fstab</code> se actualiza.",
|
||||
"nfsType": "NFS montado",
|
||||
"nfsTypeSub": "p. ej. /mnt/pve/nfs-…",
|
||||
"nfsActionRich": "<code>chmod 1777</code> + <code>setfacl o::rwx</code> en el montaje NFS. No puede anular el squash del lado del servidor — si ni siquiera el root del host puede escribir, se te guía a arreglar el export en el servidor NFS.",
|
||||
"privTitle": "Los contenedores privileged no necesitan nada de esto",
|
||||
"privBody": "Para contenedores privileged, el UID 0 en el CT es el UID 0 en el host — root dentro del CT puede leer y escribir el directorio del host directamente sin trucos de permisos. El script detecta esto y se salta el paso de \"abrir permisos\" por completo.",
|
||||
"noCtTitle": "El script nunca modifica nada dentro del contenedor",
|
||||
"noCtBody": "Todos los ajustes de permisos ocurren en el <strong>sistema de archivos del host</strong>. Sin chowns por <code>pct exec</code>, sin grupos creados en el CT, sin fstab dentro del contenedor. Si reutilizas el directorio bind-mounted en un CT distinto después, se aplican los mismos permisos automáticamente — sin setup por contenedor."
|
||||
},
|
||||
"writes": {
|
||||
"heading": "Qué escribe ProxMenux — y qué no",
|
||||
"intro": "Una confusión común al hacer bind mount en un CT unprivileged: la gente asume que ProxMenux debe estar escribiendo entradas <code>lxc.idmap</code> en <code>/etc/pve/lxc/<CTID>.conf</code>. <strong>No lo hace.</strong> Solo se añade una línea a ese archivo — el propio bind mount:",
|
||||
"outro": "La línea de salida que ves al final de la ejecución, <em>\"Unprivileged container — UID offset: 100000\"</em>, es puramente informativa — solo te dice que el CT está usando el mapeo unprivileged por defecto de Proxmox (root en CT = UID 100000 en host). El script no configura nada a su alrededor.",
|
||||
"twoWaysHeading": "Las dos formas de hacer que los permisos funcionen — y por qué ProxMenux elige una",
|
||||
"headerApproach": "Enfoque",
|
||||
"headerChanges": "Qué cambia",
|
||||
"headerWhen": "Cuándo encaja",
|
||||
"hostType": "Permisos del lado del host",
|
||||
"hostTypeSub": "(lo que hace este script)",
|
||||
"hostChangesRich": "<code>chmod o+rwx</code> + <code>setfacl o::rwx</code> en el directorio del host. Los UIDs mapeados del CT (100000+) caen en el cubo \"others\", así que abrir <em>others</em> es suficiente.",
|
||||
"hostWhen": "Acceso genérico a carpeta compartida desde cualquier CT. Varios CTs compartiendo el mismo directorio del host. Sencillo y reutilizable.",
|
||||
"idmapTypeRich": "<code>lxc.idmap</code>",
|
||||
"idmapTypeSub": "(este script no lo usa)",
|
||||
"idmapChangesRich": "Mapeo personalizado de UID/GID en <code>/etc/pve/lxc/<CTID>.conf</code> más entradas correspondientes en <code>/etc/subuid</code> + <code>/etc/subgid</code> en el host. El CT debe reiniciarse en cada cambio.",
|
||||
"idmapWhenRich": "Necesitas que un UID <em>específico</em> dentro del CT mapee a un UID <em>específico</em> en el host (p. ej. <code>media:1000</code> en el CT debe poseer archivos como <code>media:1000</code> en el host para que NFS no aplique squash). Un setup más rígido, normalmente solo merece la pena para ese escenario exacto.",
|
||||
"idmapTipTitle": "Cuándo necesitas lxc.idmap de verdad",
|
||||
"idmapTipBody": "Si el LXC Mount Manager no cubre tu caso — típicamente porque necesitas que los archivos escritos desde dentro del CT aterricen en el host como un UID/GID específico (exports NFS con <code>all_squash</code>, shares Samba con propiedad estricta, compartir un directorio con un usuario del host que tiene el mismo nombre que alguien dentro del CT) — ese es el momento de añadir entradas <code>lxc.idmap</code> a mano. El Mount Manager no te peleará: la línea de bind mount que escribió es independiente de cualquier configuración idmap que añadas después."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir la herramienta",
|
||||
"body": "Desde el menú principal de ProxMenux, abre <strong>Storage & Share Manager → Configure LXC Mount Points (Host ↔ Container)</strong>. Verás este submenú con tres opciones:",
|
||||
"imageAlt": "Menú LXC Mount Manager — Add / View / Remove"
|
||||
},
|
||||
"addFlow": {
|
||||
"heading": "Añadir un montaje — flujo completo",
|
||||
"intro": "La vista técnica, para cuando quieras saber exactamente qué hace cada diálogo:"
|
||||
},
|
||||
"sources": {
|
||||
"heading": "Qué puedes elegir como directorio del host",
|
||||
"intro": "El selector de directorio del host es el más exhaustivo de la sección de Almacenamiento y compartición. Escanea cuatro fuentes y presenta una lista deduplicada:",
|
||||
"headerSource": "Fuente",
|
||||
"headerWhere": "De dónde viene",
|
||||
"headerLabel": "Etiqueta en el menú",
|
||||
"rows": [
|
||||
{
|
||||
"source": "Montajes de red activos",
|
||||
"whereRich": "Shares CIFS / NFS montados actualmente, parseados de <code>/proc/mounts</code>.",
|
||||
"labelRich": "<code>NFS [used/size]</code> o <code>CIFS/SMB [used/size]</code>"
|
||||
},
|
||||
{
|
||||
"source": "Montajes fstab inactivos",
|
||||
"whereRich": "Definidos en <code>/etc/fstab</code> pero no montados actualmente.",
|
||||
"labelRich": "<code>fstab(off)-NFS</code> / <code>fstab(off)-CIFS/SMB</code>"
|
||||
},
|
||||
{
|
||||
"source": "Directorios locales",
|
||||
"whereRich": "Subdirectorios bajo <code>/mnt</code> que no son montajes de red.",
|
||||
"labelRich": "<code>Local [size]</code>"
|
||||
},
|
||||
{
|
||||
"source": "Almacenamientos Proxmox",
|
||||
"whereRich": "Rutas de almacenamiento bajo <code>/mnt/pve/*</code> (NFS / CIFS registrados vía <code>pvesm</code>).",
|
||||
"labelRich": "<code>PVE-NFS</code> / <code>PVE-CIFS/SMB</code> / <code>Proxmox-Storage</code>"
|
||||
},
|
||||
{
|
||||
"source": "Entrada manual",
|
||||
"where": "Cualquier otra cosa — escribe la ruta absoluta tú mismo.",
|
||||
"labelRich": "<em>Introducir ruta manualmente</em>"
|
||||
}
|
||||
],
|
||||
"tipTitle": "Las rutas internas de Proxmox quedan filtradas",
|
||||
"tipBody": "El selector se salta explícitamente las rutas internas de Proxmox (<code>/mnt/pve/local</code>, <code>/mnt/pve/local-lvm</code>, <code>/mnt/pve/backup</code>, …) — están reservadas para internos de Proxmox y no deberías hacerles bind mount. Solo aparecen los almacenamientos añadidos por el usuario."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"privIntro": "Para un contenedor privileged — el caso más simple, sin trucos de permisos:",
|
||||
"unprivLocalIntro": "Para un contenedor unprivileged con un directorio local del host — abre los permisos en el host primero:",
|
||||
"unprivCifsIntro": "Para un contenedor unprivileged con un share CIFS ya montado en el host:"
|
||||
},
|
||||
"view": {
|
||||
"heading": "Ver puntos de montaje",
|
||||
"body": "Lista cada entrada <code>mpN</code> de cada contenedor en este host Proxmox, agrupado por id de CT y mostrando ruta del host → ruta del contenedor más cualquier opción extra. Solo lectura — útil como comprobación antes de añadir o eliminar nada."
|
||||
},
|
||||
"remove": {
|
||||
"heading": "Eliminar un punto de montaje",
|
||||
"body": "Elige el contenedor, elige la entrada <code>mpN</code>, confirma. El script ejecuta <code>pct set --delete mpN</code> para quitar la entrada de la config del CT y ofrece reiniciar el contenedor si está corriendo. El directorio del host y su contenido <strong>no se tocan</strong> — puedes volver a añadir el montaje después (o adjuntar el mismo directorio a un CT distinto).",
|
||||
"warnTitle": "Los contenedores en ejecución necesitan un reinicio para que los cambios surtan efecto",
|
||||
"warnBody": "Tanto añadir como eliminar puntos de montaje solo se hacen visibles dentro del contenedor tras un reinicio. El script ofrece un <code>pct reboot</code> de un clic al final de cada operación; puedes declinar y reiniciar manualmente después."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"noMountTitle": "El montaje aparece en la config del pct pero no dentro del contenedor",
|
||||
"noMountBody": "Los bind mounts solo se adjuntan cuando el contenedor arranca. Si añadiste el montaje mientras el CT estaba corriendo, reinícialo (<code>pct reboot <ctid></code>). Si ya está reiniciado y sigue faltando, comprueba <code>pct config <ctid></code> para confirmar que la entrada existe y que la ruta del host realmente contiene un directorio.",
|
||||
"noWriteTitle": "El contenedor puede ver el directorio pero no puede escribir",
|
||||
"noWriteBody": "Casi siempre un problema de permisos. Para contenedores unprivileged, ejecuta de nuevo el fix de permisos del script — las ACLs del directorio del host pueden haber sido reseteadas por otra herramienta (rsync, restore desde backup, <code>chmod</code> manual). Para CIFS, revisa las opciones de montaje en el host: <code>findmnt /mnt/pve/cifs-…</code>, busca valores <code>uid=</code> / <code>gid=</code> / <code>file_mode=</code>.",
|
||||
"alreadyTitle": "\"This path is already used as a mount point in this container\"",
|
||||
"alreadyBody": "Elegiste la misma ruta del contenedor que ya está cableada a un directorio del host distinto. O elige una ruta del contenedor diferente, o elimina el punto de montaje existente primero.",
|
||||
"nfsTitle": "El acceso NFS sigue bloqueado tras aplicar el fix del host",
|
||||
"nfsIntro": "Tu servidor NFS está aplicando squash a root o a todas las conexiones. El script puede detectar esto (intenta escribir un archivo de prueba desde el host) y muestra guía del lado del servidor. Dos arreglos comunes del lado del servidor para el export:",
|
||||
"nfsItems": [
|
||||
"<code>no_root_squash</code> — los CTs privileged pueden escribir directamente.",
|
||||
"<code>all_squash,anonuid=65534,anongid=65534</code> — para CTs unprivileged."
|
||||
],
|
||||
"nfsOutro": "Estos cambios ocurren en el servidor NFS (TrueNAS, Synology, tu export personalizado, …), no en Proxmox.",
|
||||
"fstabOffTitle": "Montar entradas \"fstab(off)\" no hace nada",
|
||||
"fstabOffBody": "El selector muestra entradas <code>fstab(off)-</code> cuando un montaje de red está definido en fstab pero no está montado actualmente. El script te deja hacer bind mount de la ruta, pero el directorio estará vacío hasta que realmente montes el share (<code>mount <path></code> en el host). Móntalo primero, luego bind en el CT."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share/host-local-shared",
|
||||
"label": "Añadir directorio compartido en el host",
|
||||
"tailRich": " — primer paso típico: prepara un <code>/mnt/shared</code> en el host antes de hacerle bind mount en uno o más CTs aquí."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-nfs",
|
||||
"label": "Añadir share NFS como almacenamiento de Proxmox",
|
||||
"extraHref": "/docs/storage-share/host-samba",
|
||||
"extraLabel": "Añadir share Samba como almacenamiento de Proxmox",
|
||||
"joiner": " / ",
|
||||
"tailRich": " — registra un share externo en Proxmox primero, luego haz bind mount de su ruta <code>/mnt/pve/<id></code> en el CT aquí."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-nfs-client",
|
||||
"label": "Cliente NFS en LXC",
|
||||
"extraHref": "/docs/storage-share/lxc-samba-client",
|
||||
"extraLabel": "Cliente Samba en LXC",
|
||||
"joiner": " / ",
|
||||
"tail": " — la alternativa cuando quieres que el propio CT monte el share (requiere un contenedor privileged)."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Cliente NFS en LXC | ProxMenux Documentation",
|
||||
"description": "Monta shares NFS directamente desde dentro de un contenedor LXC de Proxmox con ProxMenux. Auto-instala nfs-common, soporta auto-descubrimiento en la LAN, montajes persistentes vía /etc/fstab y comportamiento seguro en el arranque. Requiere un contenedor privileged.",
|
||||
"ogTitle": "Cliente NFS en LXC | ProxMenux Documentation",
|
||||
"ogDescription": "Monta shares NFS desde dentro de un contenedor LXC privileged. Auto-descubrimiento, persistencia en /etc/fstab, defaults de arranque seguros."
|
||||
},
|
||||
"header": {
|
||||
"title": "Cliente NFS en LXC",
|
||||
"description": "Monta shares NFS directamente desde dentro de un contenedor LXC de Proxmox. El contenedor se convierte en un cliente NFS real — habla con el servidor NFS sobre la red, ejecuta mount.nfs, escribe en /etc/fstab. ProxMenux instala nfs-common por ti, te ayuda a encontrar servidores y exports, y aplica defaults seguros de arranque.",
|
||||
"section": "Almacenamiento y compartición · LXC"
|
||||
},
|
||||
"privReq": {
|
||||
"title": "Contenedor privileged requerido",
|
||||
"body": "El cliente <code>mount.nfs</code> del kernel necesita capabilities (<code>SYS_ADMIN</code> como mínimo) que los contenedores LXC unprivileged no exponen. El script lo impone — te pide elegir un CT y <strong>aborta si es unprivileged</strong>. Si necesitas el share dentro de un CT unprivileged, móntalo en el host Proxmox primero (con <hostNfsLink>Share NFS como almacenamiento de Proxmox</hostNfsLink>) y hazle bind mount en el CT con el <mountLink>LXC Mount Manager</mountLink>."
|
||||
},
|
||||
"what": {
|
||||
"heading": "Qué hace",
|
||||
"body": "A diferencia del LXC Mount Manager — que hace que el CT vea algo <em>a través del</em> host Proxmox — este script le da al contenedor su <strong>propio cliente NFS</strong>: habla NFS sobre la red, monta shares directamente desde el servidor NFS y guarda el montaje en el <code>/etc/fstab</code> del contenedor. El host Proxmox no está en la ruta de datos.",
|
||||
"diagramServerLabel": "Servidor NFS",
|
||||
"diagramServerDetail": "/export/data",
|
||||
"diagramHostLabel": "Host Proxmox",
|
||||
"diagramHostDetail": "(solo un\npuente de red)",
|
||||
"diagramCtLabel": "LXC (privileged)",
|
||||
"diagramCtDetail": "/mnt/data\nmount.nfs dentro del CT",
|
||||
"diagramArrow": "NFS",
|
||||
"twoWaysTitle": "Dos formas de dar acceso NFS a un CT — elige una",
|
||||
"twoWaysBind": "<strong>Bind mount vía host</strong> (<mountLink>LXC Mount Manager</mountLink>): el host monta el NFS una vez, cada CT hace bind mount de la misma ruta. Funciona con CTs unprivileged. Recomendado cuando varios CTs necesitan el mismo share.",
|
||||
"twoWaysDirect": "<strong>Montaje NFS directo dentro del CT</strong> (esta página): el CT monta el NFS él mismo. Requiere privileged. Útil cuando el CT debe poseer su conexión / credenciales, o para setups donde cada CT habla con un servidor distinto."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir la herramienta",
|
||||
"body": "Desde el menú principal de ProxMenux, abre <strong>Storage & Share Manager → Configure NFS Client in LXC (only privileged)</strong>. ProxMenux te pide primero <strong>elegir el CT destino</strong> (y lo arranca si está parado); aborta si es unprivileged. Una vez seleccionado el CT, ves este submenú:",
|
||||
"imageAlt": "Menú NFS Client Manager — Mount / View / Unmount / Test connectivity"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script (flujo Mount)"
|
||||
},
|
||||
"fstabFlags": {
|
||||
"heading": "Por qué esos flags de fstab",
|
||||
"intro": "Para montajes permanentes el script añade tres flags más allá de las opciones NFS estándar: <code>_netdev,x-systemd.automount,noauto</code>. Cada uno resuelve un problema real de boot:",
|
||||
"headerFlag": "Flag",
|
||||
"headerEffect": "Qué hace",
|
||||
"rows": [
|
||||
{
|
||||
"flag": "_netdev",
|
||||
"effect": "Le dice al sistema init que este montaje necesita la red. El arranque no se bloquea esperándolo antes de que la red esté arriba."
|
||||
},
|
||||
{
|
||||
"flag": "x-systemd.automount",
|
||||
"effectRich": "Crea una unit auto-mount de systemd: el montaje solo ocurre la primera vez que algo accede a <code>/mnt/<path></code>. Un servidor NFS inalcanzable al arrancar no atasca el CT."
|
||||
},
|
||||
{
|
||||
"flag": "noauto",
|
||||
"effect": "Salta el montaje eager al arrancar. Combinado con la unit automount de arriba, el montaje se establece de forma lazy en el primer acceso."
|
||||
}
|
||||
],
|
||||
"netEffectTitle": "Efecto neto",
|
||||
"netEffectBody": "Tu contenedor siempre arranca, incluso si el servidor NFS está offline. La primera vez que algo toca la ruta de montaje, systemd lo monta silenciosamente. Si el servidor sigue caído, ese único acceso falla con <em>resource temporarily unavailable</em> — pero nada más en el CT se ve afectado."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "Reproduce el flujo entero a mano — cada comando se ejecuta <strong>dentro del CT</strong> vía <code>pct exec <ctid> --</code> o directamente vía <code>pct enter <ctid></code>:"
|
||||
},
|
||||
"view": {
|
||||
"heading": "Ver montajes actuales",
|
||||
"body": "Lista cada punto de montaje NFS activo dentro del CT (<code>mount | grep nfs</code>) más cada línea NFS en el <code>/etc/fstab</code> del CT. Para cada entrada fstab se muestra el estado del montaje en vivo — útil para detectar montajes permanentes que no se levantaron al arrancar."
|
||||
},
|
||||
"unmount": {
|
||||
"heading": "Desmontar share NFS",
|
||||
"body": "Combina los montajes en vivo y las entradas fstab en una sola lista, te deja elegir uno y <strong>elimina la línea correspondiente de <code>/etc/fstab</code></strong>. El script <em>no</em> ejecuta <code>umount</code> en el montaje en vivo — en su lugar te dice que hace falta un reinicio del CT para que el desmontaje surta efecto.",
|
||||
"warnTitle": "El script elimina entradas fstab, no montajes en vivo",
|
||||
"warnBody": "Es una decisión de diseño deliberada: <code>umount</code> en un montaje ocupado falla con \"device busy\" cuando algo dentro del CT lo sigue usando. Eliminar la entrada fstab garantiza que el montaje desaparezca limpiamente en el siguiente arranque del CT. Si quieres el montaje fuera <em>ya</em> y estás seguro de que nada lo está usando, ejecuta <code>pct exec <ctid> -- umount /mnt/<path></code> a mano después de que el script termine."
|
||||
},
|
||||
"test": {
|
||||
"heading": "Probar conectividad NFS",
|
||||
"body": "Pasada de diagnóstico dentro del CT: confirma que <code>nfs-common</code> está instalado, que <code>rpcbind</code> está corriendo, lista los montajes NFS actuales y luego itera sobre cada servidor NFS referenciado en fstab y comprueba ping → puerto 2049 → <code>showmount -e</code>. Buena primera parada cuando un montaje permanente no se levanta."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"privTitle": "Contenedor privileged requerido (el script aborta)",
|
||||
"privBody": "El CT seleccionado es unprivileged. El cliente NFS del kernel necesita la capability <code>SYS_ADMIN</code> que los CTs unprivileged no exponen. O bien convierte el CT a privileged (la conversión & Disk Manager está documentada en la página <importLink>Import Disk to LXC</importLink>) o usa la ruta alternativa descrita en el aviso al inicio de esta página.",
|
||||
"aptTitle": "apt-get install nfs-common falla",
|
||||
"aptIntro": "El script asume un CT de la familia Debian (<code>apt-get</code>). Si el CT corre Alpine / Arch / Rocky / Alma, el paso de instalación falla silenciosamente. Instala el cliente NFS a mano para esa distro:",
|
||||
"aptItems": [
|
||||
"Alpine: <code>apk add nfs-utils</code>",
|
||||
"Arch: <code>pacman -S nfs-utils</code>",
|
||||
"Rocky / Alma: <code>dnf install nfs-utils</code>"
|
||||
],
|
||||
"aptOutro": "Después reejecuta el script de ProxMenux — el paso de instalación se salta cuando las herramientas ya están presentes.",
|
||||
"portTitle": "\"NFS port (2049) is not accessible\"",
|
||||
"portBody": "El ping tuvo éxito pero <code>nc -z <server> 2049</code> falló desde dentro del CT. Comprueba que el servicio NFS está corriendo en el servidor, que el firewall permite el 2049 desde la red del CT y que el CT realmente tiene una ruta de red válida (prueba <code>pct exec <ctid> -- ip route</code>).",
|
||||
"bootTitle": "El montaje permanente tiene éxito pero no se levanta al arrancar",
|
||||
"bootBody": "Casi siempre uno de: la red no está lista cuando el CT monta (los flags <code>_netdev,x-systemd.automount,noauto</code> del script lo arreglan — vuelve a añadir el montaje vía el script si escribiste la línea fstab a mano sin esos), el servidor es inalcanzable al arrancar (auto-mount espera al primer acceso — eso es normal) o DNS no resuelto al arrancar (usa la IP del servidor, no su hostname).",
|
||||
"squashTitle": "El servidor aplica squash a root, sin acceso de escritura desde dentro del CT",
|
||||
"squashIntro": "El export NFS usa <code>root_squash</code> (el valor por defecto) y el CT escribe como root. Dos opciones:",
|
||||
"squashItems": [
|
||||
"Lado del servidor: cambia el export a <code>no_root_squash</code> (solo si confías en el CT).",
|
||||
"Lado del CT: escribe como un usuario no-root que el servidor acepte, o haz chown del share apropiadamente."
|
||||
],
|
||||
"squashOutro": "ProxMenux no puede arreglar esto — es política del servidor."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-mount-points",
|
||||
"label": "Puntos de montaje LXC (host ↔ contenedor)",
|
||||
"tail": " — la alternativa para CTs unprivileged: monta en host, bind en CT."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-samba-client",
|
||||
"label": "Cliente Samba en LXC",
|
||||
"tail": " — página hermana, mismo patrón para shares SMB / CIFS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-nfs-server",
|
||||
"label": "Servidor NFS en LXC",
|
||||
"tailRich": " — el inverso: expone carpetas <em>desde</em> un CT por NFS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-nfs",
|
||||
"label": "Share NFS como almacenamiento de Proxmox",
|
||||
"tail": " — registra el share en el propio Proxmox en vez de dentro de un único CT."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Servidor NFS en LXC | ProxMenux Documentation",
|
||||
"description": "Expón carpetas por NFS desde dentro de un contenedor LXC de Proxmox con ProxMenux. Auto-instala nfs-kernel-server, configura una convención de grupo sharedfiles universal, gestiona /etc/exports, ACL de red y desinstalación. Requiere un contenedor privileged.",
|
||||
"ogTitle": "Servidor NFS en LXC | ProxMenux Documentation",
|
||||
"ogDescription": "Ejecuta un servidor NFS dentro de un contenedor LXC privileged. Grupo sharedfiles universal, ACL de red y desinstalación completa."
|
||||
},
|
||||
"header": {
|
||||
"title": "Servidor NFS en LXC",
|
||||
"description": "Ejecuta un servidor NFS de kernel dentro de un contenedor LXC de Proxmox y expón carpetas a otras máquinas en la red. ProxMenux instala nfs-kernel-server, configura una convención de grupo sharedfiles universal para que múltiples CTs privileged puedan compartir archivos limpiamente, gestiona /etc/exports y ofrece una ruta de desinstalación completa.",
|
||||
"section": "Almacenamiento y compartición · LXC"
|
||||
},
|
||||
"privReq": {
|
||||
"title": "Contenedor privileged requerido",
|
||||
"body": "<code>nfs-kernel-server</code> necesita montar el sistema de archivos del kernel <code>nfsd</code> en <code>/proc/fs/nfsd</code>, lo que requiere <code>CAP_SYS_ADMIN</code> en el namespace del kernel del host — no solo en el namespace de usuario del contenedor. LXC unprivileged no expone esa capability. En la práctica, el servicio simplemente falla al arrancar con <code>rpc.nfsd: Unable to access /proc/fs/nfsd errno 2 (No such file or directory)</code> y systemd marca <code>nfs-server.service</code> como una dependencia fallida. El script impone un CT privileged y <strong>aborta si es unprivileged</strong>. Si no puedes usar un CT privileged, ejecuta el servidor NFS dentro de una VM."
|
||||
},
|
||||
"what": {
|
||||
"heading": "Qué hace",
|
||||
"body": "Esto es lo <em>opuesto</em> de la página del cliente NFS. El contenedor se convierte en un <strong>servidor</strong> NFS: expone una carpeta de su sistema de archivos a clientes en la red. Otros CTs, el host Proxmox, VMs o máquinas físicas pueden entonces montar esa carpeta.",
|
||||
"diagramServerLabel": "LXC (privileged) — servidor NFS",
|
||||
"diagramServerDetail": "/mnt/data\n(carpeta que expones)\n\nchown root:sharedfiles\nchmod 2775 (SGID)\n\nnfs-kernel-server\n+ rpcbind corriendo",
|
||||
"diagramClientLabel": "Cualquier cliente en la red",
|
||||
"diagramClientDetail": "otro CT, el host,\nuna VM, una máquina física…",
|
||||
"diagramArrow": "export NFS"
|
||||
},
|
||||
"shared": {
|
||||
"heading": "La convención del grupo \"sharedfiles\"",
|
||||
"body": "Antes de exportar la carpeta, ProxMenux crea un grupo llamado <code>sharedfiles</code> con <strong>GID 101000</strong> dentro del contenedor, añade cada usuario regular a él, luego pone el directorio del export a <code>root:sharedfiles</code> con modo <code>2775</code>. El <code>2</code> al principio es el bit SGID — cada archivo o carpeta creada dentro hereda automáticamente el grupo <code>sharedfiles</code>.",
|
||||
"gidTitle": "Por qué GID 101000 específicamente",
|
||||
"gidBody": "Mapea al GID <strong>1000</strong> del host cuando un contenedor unprivileged lee el mismo archivo (el idmap por defecto de LXC desplaza todo en +100000). En el flujo actual de ProxMenux el propio servidor NFS corre en un CT <strong>privileged</strong> (sin desplazamiento de su lado), pero la convención mantiene el GID numéricamente consistente con CTs cliente unprivileged que puedan montar este share después. Dos CTs privileged usando ambos <code>sharedfiles</code> con GID 101000 pueden leer / escribir los archivos del otro limpiamente porque los números de GID coinciden de principio a fin.",
|
||||
"remapTitle": "El script también crea usuarios 'remap_*' — son vestigiales aquí",
|
||||
"remapBody": "Por cada usuario regular en el CT (y para UIDs comunes como 33 = www-data, 1000, 1001, 1002), el script crea un usuario paralelo <code>remap_<uid></code> con UID = <code><uid> + 100000</code>, todos miembros de <code>sharedfiles</code>. El desplazamiento <code>+100000</code> imita el idmap unprivileged de LXC, pero como este script impone un CT <strong>privileged</strong> (sin desplazamiento), esos usuarios <code>remap_*</code> son cuentas shadow sin contraparte real en el host. Son restos inofensivos de una intención de diseño más ambiciosa. Si no los ves en <code>getent passwd</code>, no se rompe nada."
|
||||
},
|
||||
"defaults": {
|
||||
"heading": "Opciones de export por defecto — léelo primero",
|
||||
"warnTitle": "Las opciones por defecto incluyen no_root_squash",
|
||||
"warnBody": "ProxMenux usa por defecto <code>rw,sync,no_subtree_check,'<'strong'>'no_root_squash'<'/strong'>'</code>. Esto significa que <strong>cualquier usuario root del cliente puede escribir como root en el export</strong> — apropiado para una LAN doméstica de confianza pero nunca para una red no confiable. Si tu CT es alcanzable desde un segmento no confiable (una red pública, un VPS, una VLAN hostil), <strong>cambia las opciones del export a <code>root_squash</code></strong> en el diálogo de opciones custom."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir la herramienta",
|
||||
"body": "Desde el menú principal de ProxMenux, abre <strong>Storage & Share Manager → Configure NFS Server in LXC (only privileged)</strong>. ProxMenux te pide primero elegir el CT destino (y lo arranca si está parado); aborta si es unprivileged. Una vez seleccionado el CT ves este submenú con cinco opciones:",
|
||||
"imageAlt": "Menú NFS Server Manager — Create / View / Delete / Status / Uninstall"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script (flujo Create)"
|
||||
},
|
||||
"network": {
|
||||
"heading": "ACL de red — quién puede montar el share",
|
||||
"intro": "El campo network en <code>/etc/exports</code> filtra qué clientes pueden montar. ProxMenux ofrece tres modos:",
|
||||
"headerMode": "Modo",
|
||||
"headerValue": "Valor escrito en /etc/exports",
|
||||
"headerWhen": "Cuándo elegirlo",
|
||||
"rows": [
|
||||
{
|
||||
"mode": "Red local",
|
||||
"value": "192.168.0.0/16",
|
||||
"whenRich": "LAN doméstica / SOHO estándar. Cubre cada dirección <code>192.168.*.*</code>."
|
||||
},
|
||||
{
|
||||
"mode": "Subnet personalizada",
|
||||
"value": "tu CIDR (p. ej. 10.0.0.0/24)",
|
||||
"when": "Cuando tu LAN no está en 192.168.x.x o quieres un alcance más estrecho."
|
||||
},
|
||||
{
|
||||
"mode": "Host único",
|
||||
"value": "tu IP (p. ej. 10.0.0.42)",
|
||||
"when": "Solo una máquina específica debería montar. La más restrictiva."
|
||||
}
|
||||
]
|
||||
},
|
||||
"options": {
|
||||
"heading": "Opciones de export explicadas",
|
||||
"headerOption": "Opción",
|
||||
"headerEffect": "Qué hace",
|
||||
"rows": [
|
||||
{
|
||||
"option": "rw / ro",
|
||||
"effect": "Permitir acceso de lectura-escritura o solo lectura para los clientes que conecten."
|
||||
},
|
||||
{
|
||||
"option": "sync",
|
||||
"effectRich": "Responder a las peticiones de escritura solo después de que los datos estén en disco. Más seguro que <code>async</code> a costa de throughput."
|
||||
},
|
||||
{
|
||||
"option": "no_subtree_check",
|
||||
"effect": "Saltar la comprobación por petición de que el archivo sigue dentro del subárbol exportado. Más rápido y evita problemas cuando los archivos se renombran a mitad de operación."
|
||||
},
|
||||
{
|
||||
"option": "no_root_squash",
|
||||
"effectRich": "<strong>Confiar en el root del cliente.</strong> Un cliente que monte como root escribe como root en el servidor. Bueno para LANs de confianza (p. ej. herramientas de backup necesitan preservar la propiedad). Reemplázalo con <code>root_squash</code> si no confías plenamente en cada máquina de la ACL de red."
|
||||
}
|
||||
]
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "Reproduce el flujo entero a mano — cada comando se ejecuta <strong>dentro del CT</strong> vía <code>pct exec <ctid> --</code> o <code>pct enter <ctid></code>:"
|
||||
},
|
||||
"view": {
|
||||
"heading": "Ver exports actuales",
|
||||
"body": "Cat de <code>/etc/exports</code> desde dentro del CT (saltando comentarios / blancos) e imprime cada export con su ACL de red y cadena de opciones. Útil para comprobar qué carpetas están expuestas antes de compartir la IP del CT con alguien."
|
||||
},
|
||||
"delete": {
|
||||
"heading": "Eliminar un export",
|
||||
"body": "Lista cada línea en <code>/etc/exports</code> para selección, elimina la elegida (<code>sed -i</code>), ejecuta <code>exportfs -ra</code> y reinicia <code>nfs-kernel-server</code>. La propia carpeta y su contenido se dejan intactos."
|
||||
},
|
||||
"status": {
|
||||
"heading": "Comprobar estado NFS",
|
||||
"body": "Pasada de diagnóstico: confirma que <code>nfs-kernel-server</code> y <code>rpcbind</code> están instalados y activos, imprime la salida de <code>exportfs -v</code>, lista las sesiones NFS activas (<code>showmount -a</code>) y las conexiones de cliente actuales."
|
||||
},
|
||||
"uninstall": {
|
||||
"heading": "Desinstalar servidor NFS",
|
||||
"body": "Limpieza completa tras confirmación: para + deshabilita <code>nfs-kernel-server</code> y <code>rpcbind</code>, vacía <code>/etc/exports</code>, hace <code>apt-get purge</code> de los paquetes NFS, elimina el grupo <code>sharedfiles</code> y los usuarios <code>remap_*</code>, mata cualquier proceso residual. Las <strong>propias carpetas exportadas no se borran</strong> — solo la configuración NFS y los paquetes.",
|
||||
"warnTitle": "El script se detiene en la línea del export, no en los datos",
|
||||
"warnBody": "Tanto <em>Delete export</em> como <em>Uninstall NFS server</em> eliminan la configuración del export. Los datos en la carpeta exportada se preservan. Para borrar también los datos, hazlo explícitamente con <code>rm -rf</code> después de que el script termine — y haz backup primero si alguien todavía podría necesitarlos."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"privTitle": "Contenedor privileged requerido (el script aborta)",
|
||||
"privBody": "El CT seleccionado es unprivileged. <code>nfs-kernel-server</code> no puede arrancar ahí porque montar <code>/proc/fs/nfsd</code> necesita <code>CAP_SYS_ADMIN</code> en el namespace del kernel del host, y el módulo <code>nfsd</code> tampoco está expuesto al namespace del contenedor (<code>modprobe nfsd</code> desde dentro devuelve <code>FATAL: Module nfsd not found</code>). Si te saltas el gate, verás <code>rpc.nfsd: Unable to access /proc/fs/nfsd errno 2 (No such file or directory)</code> en el journal y ningún puerto NFS llegará a abrirse. Las únicas opciones viables son: convertir el CT a privileged, o mover el servidor NFS a una VM.",
|
||||
"aptTitle": "apt-get install falla",
|
||||
"aptIntro": "El script asume un CT de la familia Debian. En Alpine / Arch / Rocky / Alma, instala los paquetes del servidor NFS a mano:",
|
||||
"aptItems": [
|
||||
"Alpine: <code>apk add nfs-utils</code>",
|
||||
"Arch: <code>pacman -S nfs-utils</code>",
|
||||
"Rocky / Alma: <code>dnf install nfs-utils</code>"
|
||||
],
|
||||
"aptOutro": "Después reejecuta el script de ProxMenux — el paso de instalación se salta cuando las herramientas ya están presentes.",
|
||||
"aclTitle": "El cliente no puede montar: 'access denied by server'",
|
||||
"aclBody": "La IP del cliente está fuera de la ACL de red que configuraste. Vuelve a crear el export con una subnet más amplia, o añade la IP exacta del cliente. Pega común: los clientes que conectan a través de NAT del router pueden aparecer con la IP WAN del router, no la IP LAN del cliente — comprueba en el servidor con <code>tcpdump -n port 2049</code>.",
|
||||
"ownTitle": "Los archivos escritos por el cliente aparecen con propiedad rara en el servidor",
|
||||
"ownIntro": "Dos posibilidades:",
|
||||
"ownItems": [
|
||||
"Con <code>no_root_squash</code> (por defecto), el root del cliente escribe como root en el servidor. Los archivos pertenecen a <code>root:sharedfiles</code> gracias al SGID de la carpeta.",
|
||||
"Los usuarios cliente no-root escriben como su propio UID/GID. Si su UID no existe en el servidor, los archivos aparecen con números raw (p. ej. <code>1234:1234</code>). Usa el grupo <code>sharedfiles</code> también en el cliente, o alinea UIDs entre los sistemas que comparten archivos."
|
||||
],
|
||||
"noShowTitle": "El servidor es alcanzable pero showmount no devuelve nada",
|
||||
"noShowBody": "Tras editar <code>/etc/exports</code>, debes recargar la tabla de exports con <code>exportfs -ra</code> y reiniciar <code>nfs-kernel-server</code> — el script hace ambas cosas, pero si editaste el archivo a mano, hazlo tú. Confirma también que el firewall en el CT (y en el host Proxmox) permite TCP/UDP 2049 y el puerto rpcbind (111)."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-nfs-client",
|
||||
"label": "Cliente NFS en LXC",
|
||||
"tail": " — el inverso: monta shares NFS externos desde dentro de un CT."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-samba-server",
|
||||
"label": "Servidor Samba en LXC",
|
||||
"tail": " — página hermana, mismo patrón con SMB / CIFS en vez de NFS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-nfs",
|
||||
"label": "Share NFS como almacenamiento de Proxmox",
|
||||
"tailRich": " — una vez que tu CT esté exportando, registra ese share NFS en Proxmox para que aparezca bajo <em>Datacenter → Storage</em>."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Cliente Samba en LXC | ProxMenux Documentation",
|
||||
"description": "Monta shares Samba / CIFS directamente desde dentro de un contenedor LXC de Proxmox con ProxMenux. Auto-instala cifs-utils + smbclient, soporta auto-descubrimiento, almacenamiento seguro de credenciales y montajes persistentes vía /etc/fstab. Requiere un contenedor privileged.",
|
||||
"ogTitle": "Cliente Samba en LXC | ProxMenux Documentation",
|
||||
"ogDescription": "Monta shares Samba / CIFS desde dentro de un contenedor LXC privileged. Auto-descubrimiento, archivo seguro de credenciales, persistencia en /etc/fstab."
|
||||
},
|
||||
"header": {
|
||||
"title": "Cliente Samba en LXC",
|
||||
"description": "Monta shares Samba (SMB / CIFS) directamente desde dentro de un contenedor LXC de Proxmox. El contenedor se convierte en un cliente CIFS real — habla con el servidor Samba sobre la red, ejecuta mount.cifs, guarda las credenciales de forma segura y escribe en /etc/fstab. ProxMenux instala cifs-utils + smbclient por ti y valida las credenciales contra el servidor antes de montar.",
|
||||
"section": "Almacenamiento y compartición · LXC"
|
||||
},
|
||||
"privReq": {
|
||||
"title": "Contenedor privileged requerido",
|
||||
"body": "El cliente <code>mount.cifs</code> del kernel necesita capabilities (<code>SYS_ADMIN</code> como mínimo) que los contenedores LXC unprivileged no exponen. El script lo impone — te pide elegir un CT y <strong>aborta si es unprivileged</strong>. Si necesitas el share dentro de un CT unprivileged, móntalo en el host Proxmox primero (con <hostSambaLink>Samba / CIFS como almacenamiento de Proxmox</hostSambaLink>) y hazle bind mount en el CT con el <mountLink>LXC Mount Manager</mountLink>."
|
||||
},
|
||||
"what": {
|
||||
"heading": "Qué hace",
|
||||
"body": "El contenedor habla CIFS sobre la red y monta el share por su cuenta. El host Proxmox es solo el puente de red — no ve ni gestiona el montaje.",
|
||||
"diagramServerLabel": "Servidor Samba",
|
||||
"diagramServerDetail": "//srv/share",
|
||||
"diagramHostLabel": "Host Proxmox",
|
||||
"diagramHostDetail": "(solo un\npuente de red)",
|
||||
"diagramCtLabel": "LXC (privileged)",
|
||||
"diagramCtDetail": "/mnt/share\nmount.cifs dentro del CT",
|
||||
"diagramArrow": "CIFS",
|
||||
"twoWaysTitle": "Dos formas de dar a un CT un share Samba — elige una",
|
||||
"twoWaysBind": "<strong>Bind mount vía host</strong> (<mountLink>LXC Mount Manager</mountLink>): el host monta el CIFS una vez, cada CT hace bind mount de la misma ruta. Funciona con CTs unprivileged. Recomendado cuando varios CTs necesitan el mismo share.",
|
||||
"twoWaysDirect": "<strong>Montaje CIFS directo dentro del CT</strong> (esta página): el CT monta el CIFS él mismo. Requiere privileged. Útil cuando el CT debe poseer sus propias credenciales, o cuando cada CT habla con un servidor diferente."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir la herramienta",
|
||||
"body": "Desde el menú principal de ProxMenux, abre <strong>Storage & Share Manager → Configure Samba Client in LXC (only privileged)</strong>. ProxMenux te pide primero <strong>elegir el CT destino</strong> (y lo arranca si está parado); aborta si es unprivileged. Una vez seleccionado el CT ves este submenú:",
|
||||
"imageAlt": "Menú Samba Client Manager — Mount / View / Unmount / Test connectivity"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script (flujo Mount)"
|
||||
},
|
||||
"creds": {
|
||||
"heading": "Dónde vive la contraseña",
|
||||
"body": "ProxMenux <strong>nunca guarda la contraseña en texto plano</strong> en el comando de montaje ni en <code>/etc/fstab</code>. En su lugar escribe un archivo de credenciales dentro del CT:",
|
||||
"whyTitle": "Por qué un archivo separado en vez de fstab",
|
||||
"whyBody": "El módulo CIFS acepta opciones <code>username=</code> / <code>password=</code> en línea en fstab, pero cualquiera que pueda leer <code>/etc/fstab</code> ve la contraseña en claro. Poner las credenciales en un archivo solo para root y apuntar fstab a él (<code>credentials=</code>) mantiene la contraseña fuera de la config legible por todos."
|
||||
},
|
||||
"options": {
|
||||
"heading": "Opciones de montaje explicadas",
|
||||
"headerOption": "Opción",
|
||||
"headerEffect": "Qué hace",
|
||||
"rows": [
|
||||
{
|
||||
"option": "rw / ro",
|
||||
"effect": "Modo lectura-escritura o solo lectura para el montaje entero."
|
||||
},
|
||||
{
|
||||
"option": "file_mode=0664",
|
||||
"effect": "Permisos reportados para archivos vía CIFS. Por defecto deja escribir a owner+group, leer a others."
|
||||
},
|
||||
{
|
||||
"option": "dir_mode=0775",
|
||||
"effect": "Permisos reportados para directorios. Por defecto deja entrar y crear a owner+group, atravesar a others."
|
||||
},
|
||||
{
|
||||
"option": "iocharset=utf8",
|
||||
"effect": "Forzar UTF-8 para los nombres de archivo que vienen por la red. Evita mojibake en nombres no-ASCII."
|
||||
},
|
||||
{
|
||||
"option": "credentials=file",
|
||||
"effect": "Leer usuario / contraseña del archivo (añadido automáticamente para auth de usuario)."
|
||||
},
|
||||
{
|
||||
"option": "guest",
|
||||
"effect": "Autenticar como guest, sin credenciales (añadido automáticamente cuando se elige guest)."
|
||||
},
|
||||
{
|
||||
"option": "_netdev",
|
||||
"effect": "Le dice al sistema init que este montaje necesita la red. El arranque no se bloquea esperándolo."
|
||||
},
|
||||
{
|
||||
"option": "x-systemd.automount",
|
||||
"effect": "Montaje lazy: solo monta en el primer acceso. Un servidor CIFS inalcanzable al arrancar no atasca el CT."
|
||||
},
|
||||
{
|
||||
"option": "noauto",
|
||||
"effect": "Salta el montaje eager al arrancar. Combinado con la unit automount, el montaje se establece de forma lazy."
|
||||
}
|
||||
],
|
||||
"netEffectTitle": "Efecto neto de los flags fstab",
|
||||
"netEffectBody": "Tu contenedor siempre arranca, incluso si el servidor Samba está offline. La primera vez que algo toca la ruta de montaje, systemd lo monta silenciosamente. Si el servidor sigue caído, ese único acceso falla con <em>resource temporarily unavailable</em> — pero nada más en el CT se ve afectado."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"body": "Reproduce el flujo entero a mano — cada comando se ejecuta <strong>dentro del CT</strong> vía <code>pct exec <ctid> --</code> o directamente vía <code>pct enter <ctid></code>:",
|
||||
"guestIntro": "Variante guest — sin archivo de credenciales:"
|
||||
},
|
||||
"view": {
|
||||
"heading": "Ver montajes actuales",
|
||||
"body": "Lista cada punto de montaje CIFS activo dentro del CT (<code>mount -t cifs</code>) más cada línea CIFS en el <code>/etc/fstab</code> del CT. Para cada entrada fstab se muestra el estado del montaje en vivo — útil para detectar montajes permanentes que no se levantaron al arrancar."
|
||||
},
|
||||
"unmount": {
|
||||
"heading": "Desmontar share Samba",
|
||||
"body": "Combina los montajes en vivo y las entradas fstab en una sola lista, te deja elegir uno y <strong>elimina la línea correspondiente de <code>/etc/fstab</code></strong> más el archivo de credenciales asociado. El script no ejecuta <code>umount</code> en el montaje en vivo — en su lugar te dice que hace falta un reinicio del CT para que el desmontaje surta efecto.",
|
||||
"warnTitle": "El script elimina entradas fstab, no montajes en vivo",
|
||||
"warnBody": "Mismo diseño que el cliente NFS: <code>umount</code> en un montaje ocupado falla con \"device busy\". Eliminar la entrada fstab garantiza que el montaje desaparezca limpiamente en el siguiente arranque del CT. Si quieres el montaje fuera <em>ya</em>, ejecuta <code>pct exec <ctid> -- umount /mnt/<path></code> a mano después de que el script termine."
|
||||
},
|
||||
"test": {
|
||||
"heading": "Probar conectividad Samba",
|
||||
"body": "Pasada de diagnóstico dentro del CT: confirma que <code>cifs-utils</code> está instalado, lista los montajes CIFS actuales y luego, por cada servidor referenciado en fstab, comprueba ping → puertos 139/445 → listado guest. \"Requires authentication\" en el test de guest es normal para cualquier servidor que no exponga shares públicos."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"privTitle": "Contenedor privileged requerido (el script aborta)",
|
||||
"privBody": "El CT seleccionado es unprivileged. El cliente CIFS del kernel necesita la capability <code>SYS_ADMIN</code> que los CTs unprivileged no exponen. O bien convierte el CT a privileged, o usa la ruta alternativa descrita en el aviso al inicio de esta página.",
|
||||
"aptTitle": "apt-get install falla",
|
||||
"aptIntro": "El script asume un CT de la familia Debian (<code>apt-get</code>). En Alpine / Arch / Rocky / Alma, instala el cliente CIFS a mano:",
|
||||
"aptItems": [
|
||||
"Alpine: <code>apk add cifs-utils samba-client</code>",
|
||||
"Arch: <code>pacman -S cifs-utils smbclient</code>",
|
||||
"Rocky / Alma: <code>dnf install cifs-utils samba-client</code>"
|
||||
],
|
||||
"aptOutro": "Después reejecuta el script de ProxMenux — el paso de instalación se salta cuando las herramientas ya están presentes.",
|
||||
"guestFallbackTitle": "\"The server connected you as guest instead of the specified user\"",
|
||||
"guestFallbackBody": "La validación activa del script detectó un problema real de auth. El servidor aceptó la conexión pero la degradó a guest porque las credenciales son incorrectas. Causas comunes: typo en el usuario / contraseña, el usuario no existe en el servidor, el usuario está bloqueado o el workgroup / dominio no coincide. Reejecuta el flujo y vuelve a introducir las credenciales con cuidado (la contraseña queda oculta en el diálogo).",
|
||||
"denyTitle": "\"NT_STATUS_ACCESS_DENIED\" al montar",
|
||||
"denyBody": "Las credenciales se validaron pero el share deniega el acceso. Comprueba en el lado del servidor si el usuario tiene permisos en ese share específico (la validación solo confirma el login, no las ACLs por share). Comprueba también si el servidor requiere una versión específica del protocolo SMB: añade <code>vers=3.0</code> (o <code>2.1</code>, <code>2.0</code>) a las opciones de montaje.",
|
||||
"utf8Title": "Nombres de archivo UTF-8 / no-ASCII salen estropeados",
|
||||
"utf8Body": "Las opciones por defecto incluyen <code>iocharset=utf8</code>, pero algunas configuraciones de servidor reportan un codepage inesperado. Si los nombres con acentos / símbolos se ven mal, prueba también <code>nounix</code> (algunos servidores Samba Linux lo necesitan cuando el cliente también es Linux) o pon en el lado del servidor <code>unix extensions = no</code>.",
|
||||
"bootTitle": "El montaje permanente tiene éxito pero no se levanta al arrancar",
|
||||
"bootBody": "Casi siempre uno de: la red no está lista cuando el CT monta (los flags <code>_netdev,x-systemd.automount,noauto</code> del script lo arreglan), el servidor es inalcanzable al arrancar (auto-mount espera al primer acceso — eso es normal) o DNS no resuelto al arrancar (usa la IP del servidor, no su hostname)."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-mount-points",
|
||||
"label": "Puntos de montaje LXC (host ↔ contenedor)",
|
||||
"tail": " — la alternativa para CTs unprivileged: monta en host, bind en CT."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-nfs-client",
|
||||
"label": "Cliente NFS en LXC",
|
||||
"tail": " — página hermana, mismo patrón para shares NFS."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/lxc-samba-server",
|
||||
"label": "Servidor Samba en LXC",
|
||||
"tailRich": " — el inverso: expone carpetas <em>desde</em> un CT por Samba."
|
||||
},
|
||||
{
|
||||
"href": "/docs/storage-share/host-samba",
|
||||
"label": "Samba / CIFS como almacenamiento de Proxmox",
|
||||
"tail": " — registra el share en el propio Proxmox en vez de dentro de un único CT."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user