Files

113 lines
5.5 KiB
Markdown

# 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/<id>` 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*