No description
  • Svelte 41.2%
  • Python 31.6%
  • Rust 19.8%
  • TypeScript 3.4%
  • HTML 2.4%
  • Other 1.5%
Find a file
Sebastian Serfling 4152c4da89
Some checks failed
CI / rust (Node-Agent) (push) Has been cancelled
CI / rust (VM-Guest-Agent) (push) Has been cancelled
CI / rust (Windows-VM-Guest-Agent) (push) Has been cancelled
CI / python (push) Has been cancelled
CI / frontend (push) Has been cancelled
CI / secrets (push) Has been cancelled
CI / audit-python (push) Has been cancelled
CI / audit-rust (Node-Agent) (push) Has been cancelled
CI / audit-rust (VM-Guest-Agent) (push) Has been cancelled
CI / audit-rust (Windows-VM-Guest-Agent) (push) Has been cancelled
CI / audit-frontend (push) Has been cancelled
fix(bulk-update): Live-Log-Fenster poppt nicht mehr auto auf, läuft als Task
Bulk-Update (Node-Strip, Cross-Tenant, NodeUpdatesPanel) öffnete das große
BulkUpdateMode-Overlay auch für 1 VM/CT. Der Job wird server-seitig ohnehin als
bulk_update-Task geführt und im TaskDock mit Live-Log angezeigt — das Overlay war
fürs Monitoring redundant.

- bulkUpdate store: neues minimized-Flag; open() startet jetzt sofort ALLE
  Kandidaten (confirm() als Gate) minimiert statt Select-Phase; maximize()/
  minimize() ergänzt; resume() reattacht minimiert; close() resettet Flag.
- BulkUpdateMode: rendert nur bei open_ && !minimized; Header-×/Backdrop/Footer
  minimieren laufende Jobs statt zu schließen.
- TaskDock: #170-Auto-Aufpopp überspringt bulk_update; Klick auf laufenden
  bulk_update-Task zieht per maximize() das Per-Item-Overlay auf.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 15:27:49 +02:00
.gitea/workflows ci(wiki): Ordner→Wiki-Tab Sync-Automatik (scripts/sync-wiki.sh + Gitea-Workflow) 2026-06-30 00:01:29 +02:00
faq feat: Task-UX, Node-Bulk-Ops, FAQ-Wiki (#133,#168-#171,#173) 2026-06-23 00:20:52 +02:00
frontend fix(bulk-update): Live-Log-Fenster poppt nicht mehr auto auf, läuft als Task 2026-07-16 15:27:49 +02:00
Node-Agent fix(host-update): Zombie-PID blockierte Host-Updates dauerhaft 2026-07-02 23:13:41 +02:00
scripts ci(wiki): Ordner→Wiki-Tab Sync-Automatik (scripts/sync-wiki.sh + Gitea-Workflow) 2026-06-30 00:01:29 +02:00
server fix(db): send_command hält Aufrufer-Transaktion nicht mehr übers Agent-await → Pool-Exhaustion behoben 2026-07-14 11:07:47 +02:00
VM-Guest-Agent feat: Auto-Upgrade opt-in + node-uebergreifender Task-Verlauf (#174) 2026-06-26 11:11:22 +02:00
wiki refactor(auto-upgrade): Trigger macht nur noch Upgrades, "Upgrade"-Checkbox raus (#204) 2026-06-30 22:36:20 +02:00
Windows-VM-Guest-Agent feat(dashboard): overview tab shows VM/CT cards with HTTP-service links 2026-06-19 18:29:58 +02:00
.gitignore feat(node-agent): self-update verlangt gueltige ed25519-Signatur (#113 Phase 2) 2026-06-26 13:53:44 +02:00
ARCHITECTURE.md docs: ARCHITECTURE.md — Komponenten, Node-Agent-Kanäle, Scan-/Notification-Modell 2026-06-02 11:45:25 +00:00
AUTHORS chore(license): AGPLv3 + Dual-License-Notice + SPDX-Header in alle Quelldateien 2026-06-02 15:00:19 +00:00
LICENSE chore(license): AGPLv3 + Dual-License-Notice + SPDX-Header in alle Quelldateien 2026-06-02 15:00:19 +00:00
LICENSING.md chore(license): AGPLv3 + Dual-License-Notice + SPDX-Header in alle Quelldateien 2026-06-02 15:00:19 +00:00
project_check_prompt style(settings): move Save button to page header (top) 2026-06-02 00:09:49 +02:00
README.md fix(repo): resolve open Gitea issues #1–#10 2026-06-01 14:17:58 +02:00
report.html chore(repo): consolidate routes, agent refactor, VM-agent updates 2026-06-01 08:34:12 +02:00

theProx

Proxmox Remote Management Platform — zentrales WebUI zur Verwaltung mehrerer Proxmox-Hosts über ausgehende WebSocket-Agenten.


Architektur

┌──────────────────────────────────────────────────────────┐
│  Client (Browser)                                        │
│  :8080 (intern, VPN) ← nginx-intern                     │
└───────────────┬──────────────────────────────────────────┘
                │
┌───────────────▼──────────────────────────────────────────┐
│  FastAPI Backend  :8765                                  │
│  ┌─────────────┐  ┌────────────────┐  ┌───────────────┐ │
│  │ REST API    │  │ WebSocket      │  │ Scheduler     │ │
│  │ /api/*      │  │ /ws/agent      │  │ (async, 60s)  │ │
│  │ /auth/*     │  │ /ws/terminal/  │  └───────────────┘ │
│  └─────────────┘  └────────────────┘                    │
└───────────────┬──────────────────────────────────────────┘
                │ WebSocket (ausgehend, Agent verbindet sich)
┌───────────────▼──────────────────────────────────────────┐
│  Proxmox-Host (Node-Agent)                               │
│  theprox-node-agent (Rust) — root, verbindet zu Server   │
│  pvesh / qm / pct CLI → Proxmox API                     │
│  TCP :9100 ◄── VM-Guest-Agenten (Metrics + Scans)       │
└───────────────┬──────────────────────────────────────────┘
                │ TCP (JSON-Lines, Guest verbindet zu Host)
┌───────────────▼──────────────────────────────────────────┐
│  VM Guest-Agent (Rust)                                   │
│  theprox-vm-agent — läuft in Linux/FreeBSD/Windows-VMs   │
│  sendet Metrics (15s) + Scans (5min) an Host-Agent       │
└──────────────────────────────────────────────────────────┘

Kein offener Port auf den Proxmox-Hosts erforderlich. Der Node-Agent verbindet sich ausgehend zum Server. VM-Guest-Agenten verbinden sich ausgehend zum Host-Agent (Port 9100).


UI-Aufbau

Die App ist ein Single-Page-Dashboard unter / (kein Modul-Routing mehr). Node-Übersicht mit Inline-Graphen + KPIs; Detailfunktionen liegen in ausklappbaren Panels (pro Node) und einem VM-Modal (pro VM/CT).

Bereich Inhalt
Dashboard (/) Node-Liste, Host-Identity, Inline-Graphen, KPIs, Cluster-Alerts, Cross-Tenant Bulk-Update
Node-Panels (admin-node-tabs/) Updates · Backup · Ports · Network · Jobs · Security · Audit · Logs · Command · Scheduler
VM-Modal (admin-vm-modal/tabs/) Info · Monitoring · Updates · Backups · Snapshots · Storage · Network · Ports · Docker · Commands · Security · Jobs · Audit · Logs
Notizen (/notizen) mustchange/Changelog-Notizen pro VM und global
Profil (/profil) Eigenes Konto, Passwort, Sessions
Einstellungen (/settings) OIDC/SSO, SMTP, Benachrichtigungen, SSL/ACME, Mandanten, User-CRUD, Host-Provisioning

VM-Updates laufen über den VM-Guest-Agent bzw. QEMU-Agent, Backups via vzdump, Terminal via PTY direkt auf Host/VM.


Stack

Komponente Technologie
Backend Python 3.11 · FastAPI · SQLAlchemy async · PostgreSQL · Alembic
Frontend SvelteKit 5 (Runes) · TypeScript · Inter + IBM Plex Mono
Node-Agent Python 3 · websockets · pvesh/qm/pct CLI (gebundleter Monolith)
VM Guest-Agent Rust (static musl) · Linux/FreeBSD/Windows · TCP-JSON-Lines
Infrastruktur Docker Compose · nginx (dual: public + intern)
Auth JWT (httpOnly Cookie) · RBAC (superadmin + per-Tenant read/write)

Schnellstart

Voraussetzungen

  • Docker + Docker Compose
  • Zugang zu einem Proxmox-Host (für Agent-Installation)

1. Konfiguration

.env in server/ erstellen:

DB_PASSWORD=<sicheres-passwort>
JWT_SECRET=<zufälliger-string-min-32-zeichen>
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=<sicheres-passwort>
SERVER_URL=http://DEINE-SERVER-IP:8765

2. Stack starten

cd server
docker compose up -d

Dienste:

  • :8080 — WebUI (intern/VPN)
  • :8765 — Agent-WebSocket (öffentlich erreichbar)

3. Ersten Proxmox-Host registrieren

  1. Browser → http://SERVER:8080 → Login
  2. EinstellungenHost-ProvisioningHost registrieren (nur Superadmin)
  3. Generierten curl-Befehl auf dem Proxmox-Host als root ausführen:
curl -fsSL http://SERVER:8765/install/<TOKEN> | bash

Der Agent verbindet sich automatisch und erscheint nach wenigen Sekunden als Online.


Projektstruktur

theProx/
├── server/                    FastAPI Backend
│   ├── main.py                App-Einstiegspunkt, WebSocket- + Install-Endpoints
│   ├── database.py            AsyncSession, get_db, init_db (Alembic)
│   ├── scheduler.py           Background-Scheduler (asyncio)
│   ├── rate_limit.py          Rate-Limiting
│   ├── auth/
│   │   ├── jwt.py             Token-Encode/Decode
│   │   ├── rbac.py            RBAC: require_superadmin/read/write, check_*_scope
│   │   └── local.py           Lokaler Admin-Fallback
│   ├── models/                SQLAlchemy ORM-Modelle
│   ├── routers/               FastAPI Router (admin/deploy/backup/docker/…)
│   ├── websocket/
│   │   ├── manager.py         AgentManager, Future-Pattern für Commands
│   │   └── agent_ws.py        WebSocket-Endpoint für Agenten
│   ├── tunneling/             Reverse-Tunnel-Manager (Guacamole/guaclite)
│   ├── guaclite/              schlanker Guacamole-Client
│   ├── services/              Service-Layer
│   ├── settings/              Systemkonfiguration (JSONB in DB)
│   ├── migrations/            Alembic-Migrationen (ab 0001_baseline)
│   ├── nginx/
│   │   ├── public.conf        :8765 — nur /ws/agent
│   │   └── intern.conf        :8080 — WebUI + API
│   ├── docker-compose.yml
│   └── Dockerfile
├── frontend/                  SvelteKit Frontend
│   └── src/
│       ├── lib/
│       │   ├── api.ts         Alle API-Methoden
│       │   ├── stores/        Svelte Stores (auth, nodes)
│       │   └── components/    admin-node-tabs/, admin-vm-modal/, ui/, Terminal …
│       └── routes/
│           ├── login/
│           ├── terminal/
│           └── (app)/         Geschützte Seiten
│               ├── +layout.svelte   Sidebar-Shell
│               ├── +page.svelte     Dashboard (Nodes + VM-Modal)
│               ├── notizen/
│               ├── profil/
│               └── settings/
├── Node-Agent/                Host-Agent (Rust, läuft auf Proxmox-Hosts)
│   ├── src/                   Rust-Quellen (main, dispatcher, commands, data, outbox, …)
│   ├── theprox-node-agent-x86_64  vorkompiliertes static Binary (Install-Output)
│   └── systemd/               theprox-agent.service
├── VM-Guest-Agent/            Rust-Crate (Linux/FreeBSD), läuft in VMs
│   ├── src/collect/           Collector (linux.rs, freebsd.rs, mod.rs)
│   └── theprox-vm-agent-x86_64  vorkompiliertes static Binary
└── Windows-VM-Guest-Agent/    Rust-Crate für Windows-VMs (+ Installer .exe)

RBAC

Berechtigung läuft pro Mandant (Tenant) über zwei Booleans, nicht über globale Rollen.

Ebene Recht
is_superadmin (User-Flag) Alles — überspringt sämtliche Tenant-/Node-Checks
can_write (pro Tenant) Schreibend (impliziert can_read): Aktionen, Terminal, Jobs
can_read (pro Tenant) Lesend: Nodes, VMs, Monitoring im Tenant-Scope
user_node_access Optionale Per-User-Node-Whitelist innerhalb des Tenant-Scopes

RBAC-Helpers (server/auth/rbac.py): require_superadmin, require_read(), require_write(), plus check_node_scope / check_vm_scope. require_role(min) existiert als Backwards-Compat-Shim (viewer→read, operator/admin→write).

Tenant-Isolation: Nodes (1 Node → max. 1 Mandant) und VMID-Ranges werden Mandanten zugewiesen. Nutzer ohne is_superadmin sehen nur Ressourcen ihrer Mandanten; nicht zugewiesene Nodes sind nur für Superadmin sichtbar.


Agent

Der Agent ist ein Rust-Binary (Node-Agent/, ausgeliefert als statisches theprox-node-agent). Rust wurde als einzige kanonische Variante gewählt: Single-Binary-Deploy ohne venv/Python-Abhängigkeiten, geringerer Footprint. Die frühere Python-Variante wurde entfernt (Issue #2; Archiv: Git-Tag archive/python-node-agent). Deployment via Install-Script:

  • Systemd-Service: theprox-agent
  • Konfig: /etc/theprox-agent/agent.conf
  • Logs: journalctl -u theprox-agent -f
  • Neustart: systemctl restart theprox-agent

Verbindet sich ausgehend via WebSocket, führt Proxmox-Befehle lokal via pvesh, qm, pct aus und öffnet PTY-Terminals direkt auf dem Host. Lauscht zusätzlich auf TCP :9100 für VM-Guest-Agenten.

VM Guest-Agent

Optionaler Rust-Agent innerhalb der VMs (Linux/FreeBSD/Windows) für detaillierte In-Guest-Metriken und -Scans:

curl -fsSL http://SERVER:8765/vm-install/<TOKEN> | bash
  • Konfig: /etc/theprox-vm-agent/agent.conf
  • Verbindet ausgehend per TCP (JSON-Lines) zum Host-Agent (:9100)
  • Sendet Metrics (15s) + Scans (5min)
  • Binaries: VM-Guest-Agent/theprox-vm-agent-{arch} (static musl, vorkompiliert)

Sicherheitshinweise

  • WebUI (:8080) nicht öffentlich exponieren — nur über VPN/Firewall zugänglich
  • Agent-Endpoint (:8765) muss vom Proxmox-Host erreichbar sein (nur /ws/agent wird weitergeleitet)
  • JWT-Secret mind. 32 Zeichen, zufällig generiert
  • Agent-Tokens sind pro-Host einmalig und via UI rotierbar