# PegaProx — Panel de Gestión Multi-Nodo > **LXC**: TYAN VMID 123 > **IP**: 192.168.10.125 > **URL**: https://192.168.10.125:5000 > **Versión**: v1.1.1 (release estable, checkout por tag) > **Estado**: ✅ running --- ## Descripción Panel web para el control y administración centralizada de los 3 nodos Proxmox (TYAN, Cisco1, DellT430-2) sin necesidad de cluster Proxmox. Proporciona métricas en vivo, gestión de VMs/LXC, snapshots programados, backups, alertas, RBAC y auditoría. - Repo: https://github.com/PegaProx/project-pegaprox - Docs: https://docs.pegaprox.com - Licencia: AGPL-3.0 ## Infraestructura | Parámetro | Valor | |---|---| | **Nodo** | TYAN (192.168.10.3) | | **VMID** | 123 | | **Tipo** | LXC (unprivileged) | | **OS** | Ubuntu 24.04 | | **CPU** | 4 cores | | **RAM** | 4 GB | | **Disco** | 40 GB (local-lvm) | | **IP** | 192.168.10.125/24 | | **Instalación** | Git tag `v1.1.1` en `/opt/PegaProx` + venv + `deploy.sh --no-interactive` | | **Servicio** | `systemctl status pegaprox` (systemd, autostart) | | **Puertos** | 5000 (Web), 5001 (VNC WebSocket), 5002 (SSH WebSocket) | ## Acceso | Método | Detalle | |---|---| | Web UI (LAN) | https://192.168.10.125:5000 (cert autofirmado) | | Web UI (exterior) | https://pegaprox.consultoria-as.com — vía **Cloudflare Tunnel** | | Consolas (LAN) | aceptar una vez `https://192.168.10.125:5001` y `https://192.168.10.125:5002` en el navegador | | Admin | usuario `admin` / `Aasi940812` | | SSH | `ssh root@192.168.10.125` (password: `Aasi940812`) | ## Túnel Cloudflare | Parámetro | Valor | |---|---| | **Conector** | `cloudflared` 2026.9.1 (repo pkg.cloudflare.com, Ubuntu 24.04) | | **Servicio** | `systemctl status cloudflared` (token-managed, `/etc/cloudflared/token`) | | **Protocolo** | `http2` forzado via override systemd (`/etc/systemd/system/cloudflared.service.d/override.conf`) — QUIC a region2 falló en el precheck | | **Origen** | Dashboard Zero Trust → Public hostname → Type `HTTPS`, Service `https://localhost:5000`, **No TLS Verify** activado | > **Troubleshooting del montaje (Sept 2026):** > 1. Token del conector con "Invalid tunnel secret" → el token se había copiado mal/regenerado; pedirlo fresco del dashboard. > 2. Error **1016/530** → el registro DNS viejo `pegaprox` bloqueaba el public hostname; se borró y el túnel recreó el CNAME. > 3. Error **502 con x509** → Type `HTTPS` contra un origen con cert autofirmado. > 4. Error **502 con connection reset** → Type `HTTPS` contra PegaProx en modo reverse proxy (HTTP plano); el Type correcto es `HTTP`. > 5. Consolas sin conectar por túnel → activado modo reverse proxy; el frontend enruta los WS por el puerto principal. ## Router nginx (consolas por el dominio) — Sept 2026 Las consolas (VNC de VMs y terminal de LXC/nodos) funcionan **por el dominio** mediante nginx como router de WebSockets en el mismo LXC: | Componente | Detalle | |---|---| | **nginx** | `127.0.0.1:8080` (config: `/etc/nginx/sites-available/pegaprox`) | | **Panel + API** | `/` → `http://127.0.0.1:5000` (pywsgi) | | **Consolas WS** | paths `vncwebsocket`/`termwebsocket`/`shellws` → `http://127.0.0.1:5001` (standalone websockets lib) | | **Túnel** | cloudflared token-managed → Service `http://localhost:8080` en el dashboard | **Flujo verificado end-to-end**: login → `/api/ws/token` → `/console` (ticket PVEVNC) → handshake `101` por el dominio → banner `RFB` del nodo ✓ **SSH key para los nodos**: PegaProx usa el CLI `ssh` para el túnel VNC (no acepta password). Clave generada en `/opt/PegaProx/.ssh_console_key` (ed25519), authorized_keys en root de los 3 nodos, y configurada en cada cluster vía `PUT /api/clusters/` con `ssh_key`. **Notas de resolución (contexto)**: - Modo reverse-proxy de PegaProx con pywsgi+geventwebsocket emitía el `101` duplicado (bug upstream, reproducible sin Cloudflare); desactivado el interceptor (`use_websocket_handler=False` + override `run_websocket` en `app.py`). - Handler de PegaProx conectaba `wss://{host}:{port-VNC}` en vez del puerto API (8006); parche local `api_port` en `vms.py`. - El reloj de TYAN estuvo desfazado y provocó `401 invalid PVEVNC ticket` intermitentes; verificar NTP si reaparece. - La ruta pywsgi de consola sigue con otro defecto (no entrega RFB); por eso las consolas van al 5001 standalone vía nginx. ## Nodos Conectados (root@pam para pruebas) | Cluster | Host | Guests visibles | |---|---|---| | TYAN | 192.168.10.3 | 14 (todos running) | | Cisco1 | 192.168.10.185 | 16 (12 running) | | DellT430-2 | 192.168.10.187 | 9 (todos running) | > **Nota**: PegaProx auto-creó un **API token** para `root@pam` en cada nodo Proxmox (feature #110). Para producción, considerar crear un usuario PVE dedicado con roles limitados (`PVEVMAdmin`, `PVEDatastoreAdmin`, `PVESysAdmin`) en lugar de root. ## Seguridad (pendiente de endurecer) - [ ] Activar **2FA (TOTP)** en la cuenta admin (Settings → Security) - [x] Exposición externa via Cloudflare Tunnel (sin puertos abiertos) - [ ] Activar **Cloudflare Access** (zero-trust con 2FA) sobre el hostname `pegaprox.consultoria-as.com` antes de uso en producción - [ ] Cambiar de root@pam a usuario PVE con permisos limitados al terminar las pruebas - [ ] La DB está encriptada (SQLCipher); master key en `/etc/pegaprox/secret.key` (respaldarla) ## Actualizaciones ```bash cd /opt/PegaProx # verificar el tag estable antes de actualizar git fetch --tags && git tag -l | sort -V | tail -5 ``` O desde la UI: Settings → Updates → Check for Updates. --- *Documentación de PegaProx - Consultoria-AS* *Actualizado: 19 Septiembre 2026*