diff --git a/ROADMAP.es.md b/ROADMAP.es.md new file mode 100644 index 00000000..833aa6c3 --- /dev/null +++ b/ROADMAP.es.md @@ -0,0 +1,266 @@ +# ProxMenux logo ProxMenux — Roadmap + +> Última actualización: **2026-05-20** · Versión actual: **1.2.1.2-beta** +> 🇬🇧 English version: [ROADMAP.md](ROADMAP.md) + +Este documento es nuestra hoja de ruta para llevar ProxMenux y +ProxMenux Monitor a un estado **listo para producción**. Está basado +en las dos infografías que un colaborador preparó y enriquecido con +una auditoría real del código actual. + +## 🖼️ Infografías de origen + +Las dos infografías que sirvieron de punto de partida son obra de la +comunidad y resumen visualmente las dos grandes áreas de trabajo: + +| ProxMenux Monitor (Dashboard) | ProxMenux (Scripts) | +|---|---| +| Fases ProxMenux Monitor | Fases ProxMenux | +| *Mejoras recomendadas para hacerlo más seguro, útil y apto para producción* | *Mejoras recomendadas para hacerlo más seguro, auditable y apto para producción* | + +**Cómo lo usamos:** + +* La tabla **Estado actual** refleja lo que YA tenemos hoy. +* El **Plan por versión** marca qué entra en cada release. +* La sección **Cambios publicados** se va rellenando a medida que + cerramos items, con la versión en la que se entregó. + +Símbolos: + +* 🟢 — Hecho y en producción +* 🟡 — Parcial (existe la base, falta UI o feature completa) +* 🔴 — Pendiente + +--- + +## 🎯 Visión + +> *"La prioridad no es añadir más métricas ni más scripts, sino mejorar +> seguridad, alertas, permisos, auditabilidad e integración real con +> Proxmox."* + +ProxMenux ya es una herramienta potente para administradores que +gestionan su propio nodo. El siguiente salto es convertirlo en una +herramienta **apta para entornos de producción y para clientes**: + +* El operador tiene que poder dar **acceso de solo lectura** a + terceros sin miedo a que toquen nada. +* Tiene que existir un **historial auditable** de qué pasó y quién + lo hizo. +* Los cambios destructivos tienen que poder **previsualizarse y + revertirse**. +* La instalación tiene que poder operarse en **modo conservador** + cuando el nodo no es un laboratorio. + +--- + +## 📊 Estado actual + +### ProxMenux Monitor (Dashboard) + +#### 1️⃣ Modo solo lectura +| Item | Estado | Notas | +|---|---|---| +| Separar monitorizar de controlar | 🔴 | El dashboard mezcla ambos hoy | +| Dashboard 100 % read-only | 🟡 | El scope `read_only` existe en los API tokens, falta exponerlo al usuario web | +| Sin acciones de start/stop por defecto | 🔴 | Requiere lo anterior | +| Ideal para clientes y producción | 🔴 | Llega cuando el modo solo lectura esté completo | + +#### 2️⃣ Permisos y tokens +| Item | Estado | Notas | +|---|---|---| +| Roles viewer / operator / admin | 🔴 | Single-user hoy | +| Tokens con scopes | 🟡 | 2 scopes (`read_only`, `full_admin`), no granulares | +| Caducidad configurable | 🟡 | Hoy fija en 365 días | +| Tokens de solo lectura para NA / homepage | 🟢 | Cubierto por `scope=read_only` | + +#### 3️⃣ Seguridad web +| Item | Estado | Notas | +|---|---|---| +| Bind a localhost o LAN | 🔴 | El backend escucha en `0.0.0.0:8008` | +| HTTPS y proxy inverso guiado | 🟢 | Documentado, ACME + self-signed CA trust | +| Allowlist IP opcional | 🔴 | No existe | +| Rate limits y bloqueo anti-fuerza bruta | 🟡 | Hay cooldown en login; no es un panel configurable. Fail2Ban es opcional | + +#### 4️⃣ Logs y auditoría +| Item | Estado | Notas | +|---|---|---| +| Registrar login, logout e intentos fallidos | 🟡 | Se notifica `auth_fail`; no hay panel histórico | +| Guardar IP, usuario y token usado | 🟡 | Llega a notificación, no se persiste para auditar | +| Auditar accesos sobre VM/LXC | 🔴 | Las acciones de control no se registran | +| Historial claro con resultado y error | 🔴 | No hay pestaña "Audit" | + +#### 5️⃣ Alertas útiles +| Item | Estado | Notas | +|---|---|---| +| CPU, RAM, disco y temperatura altos | 🟢 | Health Monitor + thresholds configurables | +| Snapshot / backup confirmado | 🟢 | Eventos `vzdump_complete` | +| SMART warnings y predicción | 🟢 | `disk_failure_predicted` + tiers de `disk_io_error` (1.2.1.2) | +| Telegram, Gotify, ntfy, email, webhook | 🟢 | 7 canales activos | + +#### 6️⃣ PBS y cluster +| Item | Estado | Notas | +|---|---|---| +| Último backup por VM/LXC | 🟢 | Visible en el modal de cada VM/CT | +| VMs sin backup y jobs fallidos | 🟡 | `vzdump_failed` se notifica; falta una vista agregada | +| Quorum, nodos, estado global | 🟢 | Health tab + eventos de cluster | +| Dashboard de salud del entorno | 🟢 | Health tab | + +--- + +### ProxMenux (Scripts y Post-install) + +#### 1️⃣ Seguridad operativa +| Item | Estado | Notas | +|---|---|---| +| Dry-run / previsualización antes de aplicar | 🔴 | No existe como flag general | +| Avisos delante de cambios críticos | 🟡 | Algunos diálogos, no uniforme | +| Verificación posterior de la acción | 🟡 | `update_component_status` registra el resultado | +| Confirmación reforzada en tareas sensibles | 🟡 | Hay `whiptail --yesno` en algunos scripts; no es regla | + +#### 2️⃣ Rollback y recuperación +| Item | Estado | Notas | +|---|---|---| +| Restaurar última configuración válida | 🟢 | Sistema `backup_restore/` completo (host backup + `apply_pending_restore`) | +| Menú de recuperación antes de fallos | 🟡 | Existe el restore manual, falta un wizard preventivo | +| Revertir red / postinstall / grupos | 🟡 | El backup snapshotea, no hay rollback granular por subsistema | +| Empaquetado para diagnóstico (`bug-report`) | 🔴 | No existe el bundle | + +#### 3️⃣ Scripts externos +| Item | Estado | Notas | +|---|---|---| +| Listas, hashes y firma | 🔴 | Se ejecutan sin verificación | +| Fijar versión / commit / hash | 🔴 | Helper-scripts traídos en vivo del upstream | +| Etiquetar nivel de riesgo | 🟡 | El menú nuevo añadió "richer context"; falta etiqueta formal | +| Mostrar script antes de ejecutarlo | 🔴 | Sin paso de preview | + +#### 4️⃣ Logs y trazabilidad +| Item | Estado | Notas | +|---|---|---| +| Registrar acción, usuario y fecha | 🟡 | Logs en `/var/log/proxmenux/`, no estructurados | +| Guardar comandos y archivos modificados | 🔴 | No hay tracking de qué tocó cada script | +| Errores claros con código de salida | 🟡 | Algunos scripts sí; no es regla | +| Historial de cambios reciente | 🔴 | No hay UI "qué hizo ProxMenux en este host" | + +#### 5️⃣ Modo producción +| Item | Estado | Notas | +|---|---|---| +| Perfil conservador para todo el nodo | 🔴 | El concepto no existe | +| Bloquear acciones destructivas por defecto | 🔴 | Tampoco | +| Limitar cambios de red sin confirmación | 🟡 | Algunos scripts piden confirmación | +| Más validaciones y avisos | 🟡 | Mejoras incrementales, no como modo | + +#### 6️⃣ Entornos reales +| Item | Estado | Notas | +|---|---|---| +| Salida tipo "esto pasó" clara y multilingüe | 🟡 | `translate()` + `msg_*` funcionan; falta resumen final | +| Visibilidad de quorum / almacenamiento | 🟢 | En el Monitor | +| Postinstall Proxmox Backup Server | 🟢 | Script PBS ya está | +| Detector de fallos rápido para escenarios | 🟡 | Health Monitor; falta "preflight" antes de cada cambio | + +--- + +## 🗺️ Plan por versión + +> Los items se agrupan por relación **valor / esfuerzo**, no por +> orden estricto. El plan se puede reordenar según feedback de +> testers del grupo. + +### v1.2.2-beta — *Lo barato y de alto impacto* + +Objetivo: cerrar los huecos que ya tienen base en el código y dan +mejora visible de seguridad sin tocar arquitectura. + +* [ ] **Modo solo lectura del usuario web.** Bindeo del scope + `read_only` ya existente del JWT a la sesión interactiva. La + UI esconde los botones de acción (start/stop, ejecutar + scripts, terminal) cuando el scope no es `full_admin`. +* [ ] **Tabla de audit log + pestaña en el dashboard.** Nueva tabla + SQLite `audit_log(ts, user, ip, action, target, result, error)`. + Hookear desde `flask_security_routes` y `flask_script_runner`. + Render simple en una pestaña "Audit". +* [ ] **Allowlist IP.** Campo nuevo en `Settings → Security → + "Limitar acceso a estas IPs"`. Decorator `@require_allowed_ip` + aplicado a todas las blueprints. +* [ ] **Caducidad configurable de tokens API.** Campo `expires_at` + en la metadata del token; honrarlo en `verify_token`. + +### v1.2.3-beta — *Lo medio* + +Objetivo: dar herramientas serias de operación antes de aplicar +cambios. + +* [ ] **Tokens con scope granular.** Mínimo cuatro: `read_only`, + `vm_control`, `script_runner`, `full_admin`. El frontend + enseña qué scopes tiene el token actual. +* [ ] **Dry-run en scripts post-install.** Flag `--dry-run` + compatible con todos los scripts de `scripts/post_install/`. + La salida muestra exactamente qué cambiaría sin tocar el host. +* [ ] **Bundle de diagnóstico (`proxmenux bug-report`).** Comprime + `/var/log/proxmenux/`, `journalctl -u proxmenux-monitor`, + `dmesg --since=24h`, `dpkg -l | grep -i proxmenux`, + `managed_installs.json` y los `errors`/`disk_observations` de + la base de datos en un único `.tar.gz`. Output ofuscado de + tokens y secrets. +* [ ] **Vista agregada "VMs sin backup".** Una nueva tarjeta en el + tab de Backups que liste todas las VM/CT sin job de backup + reciente, con accesos directos al PBS. + +### v1.3.0 — *Lo grande* + +Objetivo: el salto a producción. Requiere release mayor por cambios +de modelo de datos y de UX. + +* [ ] **RBAC con roles viewer / operator / admin.** Multi-usuario, + contraseña por usuario, role por sesión. Migración de + `auth.json` a tabla `users(id, username, password_hash, role, + created_at, last_login)`. Revisión de todas las blueprints para + mapear endpoints → role mínimo. +* [ ] **Modo producción.** Flag global en `/etc/proxmenux/profile` + que conmuta: + * Confirmaciones reforzadas + * Anti-cascade más agresivo + * Acciones destructivas ocultas o deshabilitadas + * Allowlist IP forzada a no-vacía + * Tokens `full_admin` deshabilitados en favor de `vm_control` + ack +* [ ] **Rollback granular por subsistema.** Sobre la infraestructura + `backup_restore` existente, permitir revertir solo "Red", solo + "Post-install", solo "Grupos y permisos", etc. +* [ ] **Historial de cambios visible en el Monitor.** Pestaña + "Changes" que liste cada modificación que ProxMenux hizo sobre + el host (archivo, antes / después, script responsable). + +### Probablemente fuera de scope + +* **Firma criptográfica de scripts upstream.** Depende del + comportamiento de community-scripts (no controlamos su pipeline). + Mantener un mirror firmado propio sería mucho trabajo para poco + beneficio. Cerrado salvo decisión externa. + +--- + +## 📦 Cambios publicados + +> Esta sección se actualiza con cada release. Sin tocar el plan de +> arriba: aquí se anota qué pasó de pendiente (🔴 / 🟡) a hecho (🟢) +> y en qué versión. + +| Fecha | Versión | Item | Notas | +|---|---|---|---| +| — | — | — | Aún no hay items cerrados de este roadmap | + +--- + +## 💬 Cómo aportar + +Cualquier persona del grupo puede: + +* Comentar en el item que considere prioritario o que falte. +* Proponer un nuevo item con el formato de la tabla + (categoría + descripción + por qué importa). +* Sugerir mover items entre versiones si el orden no encaja con + su uso real. + +El roadmap es vivo y se reordena. La única regla es: **los items +solo cambian de estado 🔴/🟡 → 🟢 cuando hay código que los respalda +en una release publicada**. diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 00000000..f2fa4763 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,263 @@ +# ProxMenux logo ProxMenux — Roadmap + +> Last update: **2026-05-20** · Current version: **1.2.1.2-beta** +> 🇪🇸 Versión en español: [ROADMAP.es.md](ROADMAP.es.md) + +This document is our roadmap to bring ProxMenux and ProxMenux Monitor +to a **production-ready** state. It is based on the two infographics +a community member prepared, enriched with a real audit of the +current codebase. + +## 🖼️ Source infographics + +The two infographics that seeded this roadmap are a community +contribution and summarise the two main areas of work visually: + +| ProxMenux Monitor (Dashboard) | ProxMenux (Scripts) | +|---|---| +| ProxMenux Monitor phases | ProxMenux phases | +| *Recommended improvements to make it safer, more useful, and production-ready* | *Recommended improvements to make it safer, auditable, and production-ready* | + +**How we use this document:** + +* The **Current state** table reflects what we already have today. +* The **Plan by version** marks what goes into each release. +* The **Shipped changes** section gets filled in as we close items, + with the version they shipped in. + +Symbols: + +* 🟢 — Done and in production +* 🟡 — Partial (foundation exists, UI or full feature missing) +* 🔴 — Pending + +--- + +## 🎯 Vision + +> *"The priority is not to add more metrics or more scripts, but to +> improve security, alerting, permissions, auditability and real +> integration with Proxmox."* + +ProxMenux is already a powerful tool for sysadmins running their own +node. The next leap is making it a tool **fit for production +environments and customers**: + +* The operator must be able to give **read-only access** to third + parties without worrying that they will touch anything. +* There must be an **auditable history** of what happened and who + did it. +* Destructive changes must be **previewable and revertible**. +* The install must be operable in **conservative mode** when the + node is not a lab. + +--- + +## 📊 Current state + +### ProxMenux Monitor (Dashboard) + +#### 1️⃣ Read-only mode +| Item | Status | Notes | +|---|---|---| +| Separate monitoring from control | 🔴 | The dashboard mixes both today | +| 100 % read-only dashboard | 🟡 | The `read_only` scope exists for API tokens, but isn't exposed to the web user | +| No start/stop actions by default | 🔴 | Depends on the above | +| Ideal for clients and production | 🔴 | Lands when read-only mode is complete | + +#### 2️⃣ Permissions and tokens +| Item | Status | Notes | +|---|---|---| +| viewer / operator / admin roles | 🔴 | Single-user today | +| Tokens with scopes | 🟡 | 2 scopes (`read_only`, `full_admin`), not granular | +| Configurable expiry | 🟡 | Currently fixed at 365 days | +| Read-only tokens for NA / homepage | 🟢 | Covered by `scope=read_only` | + +#### 3️⃣ Web security +| Item | Status | Notes | +|---|---|---| +| Bind to localhost or LAN | 🔴 | Backend listens on `0.0.0.0:8008` | +| HTTPS and guided reverse proxy | 🟢 | Documented, ACME + self-signed CA trust | +| Optional IP allowlist | 🔴 | Does not exist | +| Rate limits and brute-force blocking | 🟡 | Login cooldown exists; not a configurable panel. Fail2Ban is optional | + +#### 4️⃣ Logs and auditing +| Item | Status | Notes | +|---|---|---| +| Log login, logout and failed attempts | 🟡 | `auth_fail` is notified; no historical panel | +| Save IP, user and token used | 🟡 | Reaches the notification, not persisted for audit | +| Audit access to VM/LXC | 🔴 | Control actions are not recorded | +| Clear history with result and error | 🔴 | No "Audit" tab | + +#### 5️⃣ Useful alerts +| Item | Status | Notes | +|---|---|---| +| High CPU, RAM, disk and temperature | 🟢 | Health Monitor + configurable thresholds | +| Snapshot / backup confirmed | 🟢 | `vzdump_complete` events | +| SMART warnings and prediction | 🟢 | `disk_failure_predicted` + `disk_io_error` tiers (1.2.1.2) | +| Telegram, Gotify, ntfy, email, webhook | 🟢 | 7 active channels | + +#### 6️⃣ PBS and cluster +| Item | Status | Notes | +|---|---|---| +| Last backup per VM/LXC | 🟢 | Visible in the VM/CT modal | +| VMs with no backup and failed jobs | 🟡 | `vzdump_failed` is notified; aggregated view missing | +| Quorum, nodes, global state | 🟢 | Health tab + cluster events | +| Environment health dashboard | 🟢 | Health tab | + +--- + +### ProxMenux (Scripts and post-install) + +#### 1️⃣ Operational safety +| Item | Status | Notes | +|---|---|---| +| Dry-run / preview before applying | 🔴 | No general flag | +| Warnings before critical changes | 🟡 | Some dialogs, not uniform | +| Post-action verification | 🟡 | `update_component_status` records the result | +| Reinforced confirmation on sensitive tasks | 🟡 | `whiptail --yesno` in some scripts; not a rule | + +#### 2️⃣ Rollback and recovery +| Item | Status | Notes | +|---|---|---| +| Restore last valid configuration | 🟢 | Full `backup_restore/` system (host backup + `apply_pending_restore`) | +| Recovery menu before failures | 🟡 | Manual restore exists, no preventive wizard | +| Revert network / post-install / groups | 🟡 | Backup snapshots, no granular per-subsystem rollback | +| Diagnostic bundle (`bug-report`) | 🔴 | No bundle | + +#### 3️⃣ External scripts +| Item | Status | Notes | +|---|---|---| +| Lists, hashes and signature | 🔴 | Run without verification | +| Pin version / commit / hash | 🔴 | Helper-scripts pulled live from upstream | +| Risk-level label | 🟡 | New menu added "richer context"; no formal label | +| Show script before running it | 🔴 | No preview step | + +#### 4️⃣ Logs and traceability +| Item | Status | Notes | +|---|---|---| +| Log action, user and date | 🟡 | Logs in `/var/log/proxmenux/`, not structured | +| Save commands and modified files | 🔴 | No tracking of what each script touched | +| Clear errors with exit code | 🟡 | Some scripts do; not a rule | +| Recent-changes history | 🔴 | No "what ProxMenux did on this host" UI | + +#### 5️⃣ Production mode +| Item | Status | Notes | +|---|---|---| +| Conservative profile for the whole node | 🔴 | Concept does not exist | +| Block destructive actions by default | 🔴 | Same | +| Limit network changes without confirmation | 🟡 | Some scripts ask for confirmation | +| More validations and warnings | 🟡 | Incremental improvements, not as a mode | + +#### 6️⃣ Real environments +| Item | Status | Notes | +|---|---|---| +| Clear, multilingual "this happened" output | 🟡 | `translate()` + `msg_*` work; final summary missing | +| Quorum / storage visibility | 🟢 | In the Monitor | +| Proxmox Backup Server post-install | 🟢 | PBS script already in place | +| Fast failure detector for scenarios | 🟡 | Health Monitor; no "preflight" before each change | + +--- + +## 🗺️ Plan by version + +> Items are grouped by **value / effort** ratio, not strict order. +> The plan can be reordered based on feedback from the group's +> testers. + +### v1.2.2-beta — *Cheap and high-impact* + +Goal: close the gaps that already have a foundation in code and +deliver visible security gains without touching architecture. + +* [ ] **Read-only mode for the web user.** Bind the existing JWT + `read_only` scope to the interactive session. The UI hides + action buttons (start/stop, run scripts, terminal) when the + scope is not `full_admin`. +* [ ] **Audit log table + dashboard tab.** New SQLite table + `audit_log(ts, user, ip, action, target, result, error)`. + Hook into `flask_security_routes` and `flask_script_runner`. + Render as a simple "Audit" tab. +* [ ] **IP allowlist.** New field in `Settings → Security → + "Limit access to these IPs"`. `@require_allowed_ip` decorator + applied to all blueprints. +* [ ] **Configurable API-token expiry.** `expires_at` field on the + token metadata; honour it in `verify_token`. + +### v1.2.3-beta — *Medium effort* + +Goal: provide serious operational tools before applying changes. + +* [ ] **Granular token scopes.** Minimum four: `read_only`, + `vm_control`, `script_runner`, `full_admin`. The frontend + shows which scopes the current token has. +* [ ] **Dry-run for post-install scripts.** `--dry-run` flag + supported across all `scripts/post_install/` scripts. Output + shows exactly what would change without touching the host. +* [ ] **Diagnostic bundle (`proxmenux bug-report`).** Tar.gz of + `/var/log/proxmenux/`, `journalctl -u proxmenux-monitor`, + `dmesg --since=24h`, `dpkg -l | grep -i proxmenux`, + `managed_installs.json` and the `errors` / `disk_observations` + tables. Tokens and secrets obfuscated in the output. +* [ ] **Aggregated "VMs with no backup" view.** New card in the + Backups tab listing every VM/CT without a recent backup job, + with direct shortcuts to PBS. + +### v1.3.0 — *Major scope* + +Goal: the leap to production. Requires a major release due to data +model and UX changes. + +* [ ] **RBAC with viewer / operator / admin roles.** Multi-user, + per-user password, per-session role. Migration from + `auth.json` to a `users(id, username, password_hash, role, + created_at, last_login)` table. Review every blueprint to map + endpoints → minimum role. +* [ ] **Production mode.** Global flag in `/etc/proxmenux/profile` + that toggles: + * Reinforced confirmations + * More aggressive anti-cascade + * Destructive actions hidden or disabled + * IP allowlist forced non-empty + * `full_admin` tokens disabled in favour of `vm_control` + ack +* [ ] **Granular rollback per subsystem.** Building on the existing + `backup_restore` infra, allow reverting only "Network", only + "Post-install", only "Groups and permissions", etc. +* [ ] **Change history visible in the Monitor.** "Changes" tab + listing every modification ProxMenux made on the host + (file, before / after, responsible script). + +### Probably out of scope + +* **Cryptographic signing of upstream scripts.** Depends on the + community-scripts pipeline (we don't control it). Maintaining our + own signed mirror would be high effort for limited benefit. + Closed unless an external decision changes it. + +--- + +## 📦 Shipped changes + +> This section is updated with every release. Without touching the +> plan above: here we note which items moved from pending (🔴 / 🟡) +> to done (🟢) and in which version. + +| Date | Version | Item | Notes | +|---|---|---|---| +| — | — | — | No items closed yet from this roadmap | + +--- + +## 💬 How to contribute + +Anyone in the group can: + +* Comment on the item they consider a priority or notice missing. +* Propose a new item using the table format + (category + description + why it matters). +* Suggest moving items between versions if the ordering doesn't + match their real use. + +The roadmap is alive and gets reordered. The only rule is: +**items only change state 🔴/🟡 → 🟢 when there is code backing them +in a published release**.