Files
proxui/TODO.md
T

18 KiB

TODO

Arbeitsliste auf Basis von proxmox-console-entwicklungsplan.md. Die Entwurfsdatei bleibt unveraendert; Fortschritt und Annahmen werden hier gepflegt.

In Arbeit

  • E0-T01: Monorepo-Grundgeruest
    • Ordner fuer backend/, worker/, console-proxy/, frontend/, migrations/, deploy/ angelegt
    • Root-Dateien README.md, CHANGELOG.md, .gitignore, .env.example angelegt
    • Minimale Startpunkte fuer Backend, Worker, Console-Proxy und Frontend angelegt
    • Lokale Toolchain geprueft: Go 1.26.4 ist im PATH
    • Erste Build-/Test-Kommandos ausgefuehrt
  • E0-T02: Lokale Dev-Umgebung mit offizieller Supabase-Self-Hosted-Konfiguration und Redis
    • Makefile mit dev, migrate, test, lint, build, frontend-build, verify angelegt
    • Reduzierten Supabase-Compose-Versuch entfernt
    • Offizielle Supabase-Self-Hosted-Dateien einbinden
    • Projekt-spezifische ENV-Datei aus offizieller Vorlage ableiten
    • Infrastruktur testweise starten
    • Healthchecks/Erreichbarkeit pruefen
  • E0-T03: CI-Pipeline mit Build, Lint, Tests und Secret-Scan
    • Forgejo-Actions-Workflow fuer Pushes auf main und Pull Requests angelegt
    • Go- und Frontend-Verifikation ueber make verify eingebunden
    • Gitleaks-Secret-Scan mit enger Allowlist fuer offizielle Supabase-Beispieldateien eingebunden
  • E0-T04: Konfigurations- und Logging-Layer fuer Go-Dienste
    • Gemeinsames Go-Modul platform/ angelegt
    • ENV-basierte Konfiguration mit Defaults und Validierung eingebunden
    • Einheitliches strukturiertes JSON-Logging mit Service- und Env-Feldern eingebunden
    • Backend, Worker und Console-Proxy auf den gemeinsamen Layer umgestellt

Naechste Aufgaben

  • E2-T01: Migrations-Setup mit golang-migrate
    • Versioniertes SQL-Namensschema unter migrations/ angelegt
    • make migrate, make migrate-down und make migrate-version verdrahtet
    • Migrationen laufen lokal per migrate-Binary oder Docker-Image migrate/migrate:v4.18.3
    • DB-URL wird aus .env, deploy/supabase/.env oder MIGRATE_DATABASE_URL abgeleitet
  • E2-T02: Kern-Tabellen: profiles, tenants, memberships
    • Migration fuer profiles, tenants, memberships angelegt
    • profiles.id referenziert auth.users.id
    • Rollen-Enum membership_role mit owner, admin, member, viewer angelegt
    • FKs, Unique-/Primary-Keys und Indizes gesetzt
  • E2-T03: Projekte & Quotas
    • Migration fuer projects und project_quotas angelegt
    • Projekte referenzieren eindeutig einen Tenant
    • Quotas referenzieren 1:1 ein Projekt und erhalten Defaults
    • Quota-Checks fuer nicht-negative Werte gesetzt
  • E2-T04: Clusters-Tabelle fuer verschluesselte Credentials
    • Migration fuer clusters angelegt
    • encrypted_token als bytea ohne Klartext-Token-Spalte angelegt
    • token_id, api_endpoint, tls_fingerprint, Status und Zeitstempel angelegt
    • Checks und Indizes fuer Endpoint/Status gesetzt
  • E2-T05: VMs & Ressourcen-Mapping
    • Migration fuer vms und ssh_keys angelegt
    • VMs referenzieren eindeutig Projekt und Cluster
    • Unique-Index auf (cluster_id, proxmox_vmid) gesetzt
    • Ressourcen- und Pflichtfeld-Checks gesetzt
  • E2-T06: VMID-Allokator
    • Clusterweite Allocator-Tabelle angelegt
    • VMID-Reservationen vor Proxmox-Calls modelliert
    • Transaktionssichere Funktion reserve_next_vmid(cluster_id) mit SELECT ... FOR UPDATE angelegt
    • Concurrency-Test mit 50 parallelen Reservierungen lokal verifiziert
  • E2-T07: Audit-Log-Tabelle
    • Append-only Tabelle audit_log angelegt
    • Tenant- und Profil-Referenzen gesetzt
    • Index auf (tenant_id, created_at) gesetzt
    • UPDATE/DELETE per Trigger blockiert
  • E2-T08: RLS-Policies
    • RLS auf tenant-bezogenen Tabellen aktiviert
    • Membership-basierte SELECT-Policies angelegt
    • Audit-Log auf owner/admin beschraenkt
    • Direkter Query als Nicht-Mitglied lokal verifiziert
    • Supabase-Advisor-Follow-up: RLS auf allen uebrigen Public-Tabellen aktiviert
  • E1-T02: JWT-Validierungs-Middleware im Backend
    • Authorization: Bearer <jwt> Middleware angelegt
    • RS256/ES256 Validierung gegen Supabase-JWKS angelegt
    • Lokalen HS256-Fallback fuer Self-Hosted-Legacy-Keys angelegt
    • Issuer, Expiry, Not-Before und Signatur werden validiert
    • sub, email, role werden als Principal in den Request-Context gelegt
    • Geschuetzten /me Endpunkt angelegt
  • E1-T03: Profil-Sync
    • Lazy Provisioning nach erfolgreicher JWT-Validierung angelegt
    • profiles wird idempotent per insert ... on conflict erstellt/aktualisiert
    • Profil-Sync-Middleware mit Unit-Tests angelegt
    • /me fuehrt Profil-Sync vor Handler-Ausfuehrung aus
  • E4-T01: Mitgliedschafts-Resolver
    • Tenant-Mitgliedschaft aus profiles/memberships anhand JWT-sub geladen
    • Tenant-ID aus Request-Route ableitbar gemacht
    • Mitgliedschaft und Rolle im Request-Context bereitgestellt
    • Nicht-Mitglieder erhalten 403
  • E4-T02: Policy-/Permission-Funktion
    • Rollen und Aktionen zentral definiert
    • Can(role, action) angelegt
    • Tabellengetriebene Unit-Tests fuer Rollen/Aktionen angelegt
    • cluster.manage fuer Tenant-Rollen bewusst verweigert
  • E4-T03: Autorisierungs-Middleware
    • Deklarativen Require(action, handler) Helper angelegt
    • Rollenpruefung nutzt zentrale rbac.Can Policy-Funktion
    • Fehlende oder unzureichende Rechte liefern 403
    • Tenant-Membership-Endpunkt exemplarisch mit project.read geschuetzt
  • E10-Vorgriff: Frontend-Prototyp
    • Supabase Auth Login/Registrierung angebunden
    • Backend-/me Profil-Sync-Pruefung angebunden
    • App-Shell mit Platzhalter-Views fuer Projekte, VMs, SSH-Keys, Audit und Konsole angelegt
  • E3-T01: Krypto-Layer fuer Envelope-Encryption
    • AES-256-GCM mit 32-Byte-Master-Key angelegt
    • Master-Key aus MASTER_KEY_BASE64 konfiguriert
    • Ciphertext-Format mit Version-Byte und vorangestellter Nonce angelegt
    • Roundtrip, falscher Key, falsche Version und fehlender Key per Unit-Test abgedeckt
  • E3-T02: Cluster-Repository
    • GetCluster laedt Cluster und entschluesselt das Token im Speicher
    • UpsertCluster verschluesselt Token-Secrets vor dem Speichern
    • SQL-Storage fuer public.clusters angelegt
    • Unit-Test stellt sicher, dass gespeicherte Tokens keinen Klartext enthalten
  • E3-T03: Proxmox-HTTP-Client mit TLS-Pinning
    • HTTPS-Client mit normaler Zertifikatsvalidierung plus SHA-256-Fingerprint-Pinning angelegt
    • PVEAPIToken=<token_id>=<secret> Auth-Header gesetzt
    • Get, Post, Put, Delete mit Kontext, Timeout und Retry angelegt
    • Mock-Server-Tests fuer passenden und falschen Fingerprint angelegt
  • E3-T04: Admin-Endpunkt: Cluster verwalten
    • Interne Operator-Token-Middleware fuer /internal/* angelegt
    • POST /internal/clusters fuer Cluster-Anlage angelegt
    • PUT /internal/clusters/{clusterID} fuer Token-Rotation und Cluster-Update angelegt
    • PATCH /internal/clusters/{clusterID}/status fuer Status-Updates angelegt
    • Responses enthalten kein token_secret
  • E6-T01: Worker-Grundgeruest
    • asynq-Worker mit Redis-Anbindung ueber REDIS_ADDR angelegt
    • Worker pingt Supabase-DB ueber DATABASE_URL
    • Graceful Shutdown fuer asynq-Server angelegt
    • Dummy-Job proxui.dummy mit Handler und Unit-Tests angelegt
  • E6-T02: UPID-Polling-Job
    • Job-Typ proxmox.task.poll mit Payload fuer Cluster, Node, UPID und Ziel-VM angelegt
    • Polling-Handler mit Proxmox-Status-Client-Interface angelegt
    • VM-Status-Update und Audit-Writer fuer finale Task-Ergebnisse angelegt
    • Mock-Proxmox-Test fuer running -> stopped/OK und Fehlerstatus angelegt
    • Echte Cluster-Client-Aufloesung ueber gemeinsames Cluster-Repository und Proxmox-Client verdrahtet
  • Shared-Plattform-Follow-up fuer Worker-Integration
    • Cluster-Repository von backend/internal nach platform/cluster verschoben
    • Krypto-Layer nach platform/encryption verschoben
    • Proxmox-Client nach platform/proxmox verschoben
    • Backend und Worker nutzen dieselben Implementierungen
  • E5-T01: VM-Liste & Detail
    • GET /projects/{projectID}/vms angelegt
    • GET /vms/{vmID} angelegt
    • SQL-Queries joinen immer ueber projects und memberships
    • Nicht-Mitglieder erhalten keine VM-Daten
    • Handler-Tests fuer sichtbare und unsichtbare VMs angelegt
  • E5-T02: Power-Aktionen
    • POST /vms/{vmID}/start angelegt
    • POST /vms/{vmID}/stop angelegt
    • POST /vms/{vmID}/reboot angelegt
    • vm.power wird anhand der Membership-Rolle geprueft
    • Proxmox-Call liefert UPID und queued proxmox.task.poll
    • Audit-Log-Eintrag fuer ausgeloeste Power-Aktion wird geschrieben
  • E5-T03: Reconciliation-Job
    • Periodischen asynq-Scheduler fuer proxmox.reconcile.all angelegt
    • Aktive Cluster werden aus der DB geladen
    • Bekannte VMs je Cluster werden gegen Proxmox status/current geprueft
    • Drift wird als Audit-Event vm.reconcile.drift geloggt
    • Kein Auto-Fix: DB-Status wird im Reconciliation-Lauf nicht ueberschrieben
  • E7-T01: SSH-Key-Verwaltung
    • GET /tenants/{tenantID}/ssh-keys (Liste mit RBAC ssh_key.read)
    • POST /tenants/{tenantID}/ssh-keys (Erstellen mit RBAC ssh_key.manage)
    • GET /ssh-keys/{keyID} (Detail mit Membership-Check und Tenant-Abgleich)
    • DELETE /ssh-keys/{keyID} (Löschen mit RBAC ssh_key.manage)
    • Repository, Handler und Tests angelegt
    • Routen in main.go verdrahtet und Build/Tests verifiziert
  • E7-T02: Template-Verwaltung
    • Migration 0010_templates mit templates-Tabelle (id, cluster_id, name, description, proxmox_template_vmid, proxmox_node, timestamps)
    • GET /internal/templates (Liste aller Templates)
    • POST /internal/templates (Template anlegen inkl. On-Conflict-Upsert)
    • PUT /internal/templates/{templateID} (Template aktualisieren mit partiellen Feldern)
    • DELETE /internal/templates/{templateID} (Template loeschen)
    • Alle Endpunkte mit Operator-Token und cluster.manage Permission gesichert
    • Repository, Handler und Tests angelegt
    • Build und alle Tests gruen
  • E7-T03: VM-Erstellung (Clone + cloud-init)
    • Proxmox-Client erweitert: CloneVM, ConfigureCloudInit, StartVM, CloudInitConfig
    • Repository erweitert: GetProjectInfo (mit Membership-Rolle), CheckQuota, ReserveNextVMID, InsertVM
    • POST /projects/{projectID}/vms Handler mit: Auth, Project-Info (mit Membership/RBAC), Template-Lookup, Quota-Check, VMID-Reservierung, DB-Insert, Clone, CloudInit, Start, Task-Enqueue, Audit-Write
    • SSHKeyResolver Interface und Adapter im sshkey-Package
    • ProvisionResolver Adapter im template-Package
    • ProvisionDependencies mit ClusterRepo, TemplateRepo, ClientFactory, Tasks, Audit, SSHKeyLookup
    • Route in main.go verdrahtet
    • Build und alle Tests gruen
  • E7-T04: VM löschen
    • Proxmox-Client: StopVM, DeleteVM
    • DELETE /vms/{vmID} Handler: Auth/Membership per GetVM, RBAC vm.delete, Stop+Delete via Proxmox, Task-Enqueue, Audit
    • Route in main.go verdrahtet
    • Build und alle Tests gruen
  • E8-T01: Konsolen-Ticket-Endpunkt
    • POST /vms/{vmID}/console mit RBAC vm.console
    • HMAC-signiertes Proxy-Ticket mit Cluster, Node, VMID, VNC-Info, Endpoint, Expiry
    • console Package mit Handler, Ticket-Signer und Verifikations-Funktion
  • E8-T02: Websocket-Proxy-Dienst
    • console-proxy mit GET /ws?ticket=...
    • Ticket-Validierung, WebSocket-Dial zu Proxmox VNC
    • Bidirektionales Proxy zwischen Client und Proxmox
    • Build und alle Tests gruen
  • E9-T02: Audit-Anzeige (read)
    • GET /tenants/{tenantID}/audit mit Paginierung, Membership + RBAC audit.read
    • Nur owner/admin haben Zugriff (viewer/member → 403)
    • Repository, Handler und Tests angelegt
    • Route in main.go verdrahtet und alle Tests gruen
  • E10: Frontend-MVP
    • Mehrere Dateien: api.ts (API-Client), Komponenten (AuthScreen, VMList, VMCreate, SSHKeys, AuditLog, ConsoleView)
    • VM-Übersicht mit Power-Buttons (Start/Stop/Reboot) und Löschen
    • VM-Erstellungs-Wizard mit Template, Ressourcen, SSH-Key
    • SSH-Key-Verwaltung (Anzeigen, Hinzufügen, Löschen)
    • Audit-Log-Ansicht
    • Konsole-Ansicht mit Proxy-Ticket-Abruf
    • Build (npm run build) erfolgreich

MVP-Backlog

  • E1: Supabase Auth, JWT-Middleware und Profil-Sync
  • E2: Datenmodell, Migrationen, RLS und VMID-Allokator
  • E3: Envelope-Encryption, Cluster-Repository, Proxmox-Client und interne Cluster-Verwaltung
  • E4: RBAC, Membership-Resolver, Policy-Funktion und Autorisierungs-Middleware
  • E6: Worker-Grundgeruest und UPID-Polling
  • E5: VM-Liste, Detail, Power-Aktionen und Reconciliation
  • E7: SSH-Keys, Templates und Provisioning
  • E8: Konsolen-Tickets und Websocket-Proxy
  • E9: Audit-Writer und Audit-Anzeige
  • E10: Frontend-MVP fuer Auth, Projekte, VMs, Wizard und Konsole

Annahmen

  • Modulpfad vorlaeufig: proxui. Falls spaeter ein Git-Remote/Org-Name feststeht, wird der Go-Modulpfad angepasst.
  • Supabase wird lokal nicht mehr per reduziertem Eigenbau gestartet; naechster Ansatz ist die offizielle Self-Hosted-Konfiguration.
  • Offizieller Supabase-Docker-Upstream: supabase/supabase@996d2b7c1e8ee85ca584160963f26b67d63b7e56.
  • Lokaler Host-DB-Zugriff laeuft ueber Supavisor: Session-Port 5432, Transaction-Port 6543, Username-Format postgres.<POOLER_TENANT_ID>.
  • UI-Texte werden Deutsch, Code-Identifier Englisch.

Verifikation

  • 2026-06-09: go work sync erfolgreich mit lokalem GOCACHE=.tmp/go-build.
  • 2026-06-09: go test ./backend/... ./worker/... ./console-proxy/... erfolgreich; aktuell keine Testdateien vorhanden.
  • 2026-06-09: go build ./backend/cmd/api ./worker/cmd/worker ./console-proxy/cmd/console-proxy erfolgreich.
  • 2026-06-09: npm install --prefix frontend erfolgreich; 0 Vulnerabilities.
  • 2026-06-09: npm run build --prefix frontend erfolgreich.
  • 2026-06-09: make verify erfolgreich.
  • 2026-06-09: Orbstack geprueft: Docker-Kontext orbstack, Engine OrbStack, Architektur aarch64, Docker 29.4.0.
  • 2026-06-09: Reduzierter Supabase-Compose-Versuch entfernt; lokale Container und Volumes per docker compose down -v --remove-orphans geloescht.
  • 2026-06-09: Offizielle Supabase-Self-Hosted-Docker-Dateien nach deploy/supabase/ kopiert; docker compose config erfolgreich.
  • 2026-06-09: make dev mit offiziellem Supabase-Stack erfolgreich; alle offiziellen Supabase-Container healthy.
  • 2026-06-09: GET /auth/v1/admin/users ueber Kong mit Service-Role-Key erfolgreich: leere User-Liste statt Studio-Fehler.
  • 2026-06-10: CI-Workflow fuer Forgejo Actions angelegt; lokales make verify erfolgreich.
  • 2026-06-10: Gitleaks-Secret-Scan lokal mit zricethezav/gitleaks:v8.28.0 erfolgreich; keine Leaks gefunden.
  • 2026-06-10: Gemeinsamer Go-Config-/Logging-Layer angelegt; Tests fuer Config-Defaults und Validierung ergaenzt.
  • 2026-06-10: golang-migrate-Setup mit Baseline-Migration angelegt; lokaler Up/Down-Lauf gegen Supabase verifiziert.
  • 2026-06-10: Kern-Tabellen-Migration 0002_core_identity angelegt und lokal gegen Supabase verifiziert.
  • 2026-06-10: Projekte-und-Quotas-Migration 0003_projects_and_quotas angelegt und lokal gegen Supabase verifiziert.
  • 2026-06-10: Cluster-Migration 0004_clusters angelegt und lokal gegen Supabase verifiziert.
  • 2026-06-10: VMs-und-SSH-Keys-Migration 0005_vms_and_ssh_keys angelegt und lokal gegen Supabase verifiziert.
  • 2026-06-10: VMID-Allokator-Migration 0006_vmid_allocator angelegt und mit 50 parallelen Reservierungen lokal gegen Supabase verifiziert.
  • 2026-06-10: Audit-Log-Migration 0007_audit_log angelegt und Append-only-Verhalten lokal gegen Supabase verifiziert.
  • 2026-06-10: RLS-Migration 0008_rls_policies angelegt und Mitglied/Nicht-Mitglied-Isolation lokal gegen Supabase verifiziert.
  • 2026-06-10: RLS-Advisor-Cleanup 0009_rls_advisor_cleanup angelegt; alle Public-Tabellen haben RLS aktiv.
  • 2026-06-10: JWT-Middleware-Tests fuer gueltige, abgelaufene, manipulierte und fehlende Tokens erfolgreich.
  • 2026-06-10: Profil-Sync-Tests erfolgreich; lokaler /me Request legt genau ein profiles-Profil an.
  • 2026-06-10: RBAC-Policy-Funktion mit tabellengetriebenen Rollen/Aktions-Tests erfolgreich.
  • 2026-06-10: Frontend-Prototyp mit Supabase Auth und Backend-/me Check erfolgreich gebaut.
  • 2026-06-11: Membership-Resolver mit Middleware-Tests fuer erlaubte, fehlende und verbotene Tenant-Zugriffe angelegt.
  • 2026-06-11: Autorisierungs-Middleware mit Tests fuer erlaubte, fehlende und verweigerte Permissions angelegt.
  • 2026-06-11: AES-GCM-Krypto-Layer fuer Cluster-Tokens mit Master-Key-Validierung und Unit-Tests angelegt.
  • 2026-06-11: Cluster-Repository mit verschluesseltem Token-Speicher und Entschluesselung beim Laden angelegt.
  • 2026-06-11: Proxmox-HTTP-Client mit TLS-Fingerprint-Pinning, Token-Auth, Timeout und Retry angelegt.
  • 2026-06-11: Interne Operator-Endpunkte fuer Cluster-Anlage, Token-Rotation und Status-Updates angelegt.
  • 2026-06-11: Worker-Grundgeruest mit asynq, Redis-Anbindung, DB-Ping und Dummy-Job-Tests angelegt.
  • 2026-06-11: UPID-Polling-Job mit VM-Status-Update, Audit-Writer und Mock-Proxmox-Tests angelegt.
  • 2026-06-11: Shared Cluster-/Krypto-/Proxmox-Packages nach platform/ verschoben und Worker-UPID-Polling an echte Cluster-Aufloesung angeschlossen.
  • 2026-06-11: VM-Read-Endpunkte fuer Projekt-Listen und Details mit Membership-gefilterten Queries angelegt.
  • 2026-06-11: VM-Power-Endpunkte fuer start/stop/reboot mit Proxmox-UPID, Queue-Enqueue und Audit-Write angelegt.
  • 2026-06-11: Reconciliation-Job fuer aktive Proxmox-Cluster angelegt; Drift wird report-only auditiert.