Files
proxui/TODO.md
T

10 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

MVP-Backlog

  • E1: Supabase Auth, JWT-Middleware und Profil-Sync
  • E2: Datenmodell, Migrationen, RLS und VMID-Allokator
  • E3: Envelope-Encryption, Cluster-Repository und Proxmox-Client
  • 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.