15 KiB
15 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.exampleangelegt - 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
- Ordner fuer
- E0-T02: Lokale Dev-Umgebung mit offizieller Supabase-Self-Hosted-Konfiguration und Redis
Makefilemitdev,migrate,test,lint,build,frontend-build,verifyangelegt- 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
mainund Pull Requests angelegt - Go- und Frontend-Verifikation ueber
make verifyeingebunden - Gitleaks-Secret-Scan mit enger Allowlist fuer offizielle Supabase-Beispieldateien eingebunden
- Forgejo-Actions-Workflow fuer Pushes auf
- 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
- Gemeinsames Go-Modul
Naechste Aufgaben
- E2-T01: Migrations-Setup mit
golang-migrate- Versioniertes SQL-Namensschema unter
migrations/angelegt make migrate,make migrate-downundmake migrate-versionverdrahtet- Migrationen laufen lokal per
migrate-Binary oder Docker-Imagemigrate/migrate:v4.18.3 - DB-URL wird aus
.env,deploy/supabase/.envoderMIGRATE_DATABASE_URLabgeleitet
- Versioniertes SQL-Namensschema unter
- E2-T02: Kern-Tabellen: profiles, tenants, memberships
- Migration fuer
profiles,tenants,membershipsangelegt profiles.idreferenziertauth.users.id- Rollen-Enum
membership_rolemitowner,admin,member,viewerangelegt - FKs, Unique-/Primary-Keys und Indizes gesetzt
- Migration fuer
- E2-T03: Projekte & Quotas
- Migration fuer
projectsundproject_quotasangelegt - Projekte referenzieren eindeutig einen Tenant
- Quotas referenzieren 1:1 ein Projekt und erhalten Defaults
- Quota-Checks fuer nicht-negative Werte gesetzt
- Migration fuer
- E2-T04: Clusters-Tabelle fuer verschluesselte Credentials
- Migration fuer
clustersangelegt encrypted_tokenalsbyteaohne Klartext-Token-Spalte angelegttoken_id,api_endpoint,tls_fingerprint, Status und Zeitstempel angelegt- Checks und Indizes fuer Endpoint/Status gesetzt
- Migration fuer
- E2-T05: VMs & Ressourcen-Mapping
- Migration fuer
vmsundssh_keysangelegt - VMs referenzieren eindeutig Projekt und Cluster
- Unique-Index auf
(cluster_id, proxmox_vmid)gesetzt - Ressourcen- und Pflichtfeld-Checks gesetzt
- Migration fuer
- E2-T06: VMID-Allokator
- Clusterweite Allocator-Tabelle angelegt
- VMID-Reservationen vor Proxmox-Calls modelliert
- Transaktionssichere Funktion
reserve_next_vmid(cluster_id)mitSELECT ... FOR UPDATEangelegt - Concurrency-Test mit 50 parallelen Reservierungen lokal verifiziert
- E2-T07: Audit-Log-Tabelle
- Append-only Tabelle
audit_logangelegt - Tenant- und Profil-Referenzen gesetzt
- Index auf
(tenant_id, created_at)gesetzt - UPDATE/DELETE per Trigger blockiert
- Append-only Tabelle
- 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,rolewerden als Principal in den Request-Context gelegt- Geschuetzten
/meEndpunkt angelegt
- E1-T03: Profil-Sync
- Lazy Provisioning nach erfolgreicher JWT-Validierung angelegt
profileswird idempotent perinsert ... on conflicterstellt/aktualisiert- Profil-Sync-Middleware mit Unit-Tests angelegt
/mefuehrt Profil-Sync vor Handler-Ausfuehrung aus
- E4-T01: Mitgliedschafts-Resolver
- Tenant-Mitgliedschaft aus
profiles/membershipsanhand JWT-subgeladen - Tenant-ID aus Request-Route ableitbar gemacht
- Mitgliedschaft und Rolle im Request-Context bereitgestellt
- Nicht-Mitglieder erhalten
403
- Tenant-Mitgliedschaft aus
- E4-T02: Policy-/Permission-Funktion
- Rollen und Aktionen zentral definiert
Can(role, action)angelegt- Tabellengetriebene Unit-Tests fuer Rollen/Aktionen angelegt
cluster.managefuer Tenant-Rollen bewusst verweigert
- E4-T03: Autorisierungs-Middleware
- Deklarativen
Require(action, handler)Helper angelegt - Rollenpruefung nutzt zentrale
rbac.CanPolicy-Funktion - Fehlende oder unzureichende Rechte liefern
403 - Tenant-Membership-Endpunkt exemplarisch mit
project.readgeschuetzt
- Deklarativen
- E10-Vorgriff: Frontend-Prototyp
- Supabase Auth Login/Registrierung angebunden
- Backend-
/meProfil-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_BASE64konfiguriert - 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
GetClusterlaedt Cluster und entschluesselt das Token im SpeicherUpsertClusterverschluesselt Token-Secrets vor dem Speichern- SQL-Storage fuer
public.clustersangelegt - 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 gesetztGet,Post,Put,Deletemit 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/clustersfuer Cluster-Anlage angelegtPUT /internal/clusters/{clusterID}fuer Token-Rotation und Cluster-Update angelegtPATCH /internal/clusters/{clusterID}/statusfuer Status-Updates angelegt- Responses enthalten kein
token_secret
- Interne Operator-Token-Middleware fuer
- E6-T01: Worker-Grundgeruest
- asynq-Worker mit Redis-Anbindung ueber
REDIS_ADDRangelegt - Worker pingt Supabase-DB ueber
DATABASE_URL - Graceful Shutdown fuer asynq-Server angelegt
- Dummy-Job
proxui.dummymit Handler und Unit-Tests angelegt
- asynq-Worker mit Redis-Anbindung ueber
- E6-T02: UPID-Polling-Job
- Job-Typ
proxmox.task.pollmit 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/OKund Fehlerstatus angelegt - Echte Cluster-Client-Aufloesung ueber gemeinsames Cluster-Repository und Proxmox-Client verdrahtet
- Job-Typ
- Shared-Plattform-Follow-up fuer Worker-Integration
- Cluster-Repository von
backend/internalnachplatform/clusterverschoben - Krypto-Layer nach
platform/encryptionverschoben - Proxmox-Client nach
platform/proxmoxverschoben - Backend und Worker nutzen dieselben Implementierungen
- Cluster-Repository von
- E5-T01: VM-Liste & Detail
GET /projects/{projectID}/vmsangelegtGET /vms/{vmID}angelegt- SQL-Queries joinen immer ueber
projectsundmemberships - Nicht-Mitglieder erhalten keine VM-Daten
- Handler-Tests fuer sichtbare und unsichtbare VMs angelegt
- E5-T02: Power-Aktionen
POST /vms/{vmID}/startangelegtPOST /vms/{vmID}/stopangelegtPOST /vms/{vmID}/rebootangelegtvm.powerwird 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.allangelegt - Aktive Cluster werden aus der DB geladen
- Bekannte VMs je Cluster werden gegen Proxmox
status/currentgeprueft - Drift wird als Audit-Event
vm.reconcile.driftgeloggt - Kein Auto-Fix: DB-Status wird im Reconciliation-Lauf nicht ueberschrieben
- Periodischen asynq-Scheduler fuer
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-Port6543, Username-Formatpostgres.<POOLER_TENANT_ID>. - UI-Texte werden Deutsch, Code-Identifier Englisch.
Verifikation
- 2026-06-09:
go work syncerfolgreich mit lokalemGOCACHE=.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-proxyerfolgreich. - 2026-06-09:
npm install --prefix frontenderfolgreich; 0 Vulnerabilities. - 2026-06-09:
npm run build --prefix frontenderfolgreich. - 2026-06-09:
make verifyerfolgreich. - 2026-06-09: Orbstack geprueft: Docker-Kontext
orbstack, EngineOrbStack, Architekturaarch64, Docker29.4.0. - 2026-06-09: Reduzierter Supabase-Compose-Versuch entfernt; lokale Container und Volumes per
docker compose down -v --remove-orphansgeloescht. - 2026-06-09: Offizielle Supabase-Self-Hosted-Docker-Dateien nach
deploy/supabase/kopiert;docker compose configerfolgreich. - 2026-06-09:
make devmit offiziellem Supabase-Stack erfolgreich; alle offiziellen Supabase-Container healthy. - 2026-06-09:
GET /auth/v1/admin/usersueber Kong mit Service-Role-Key erfolgreich: leere User-Liste statt Studio-Fehler. - 2026-06-10: CI-Workflow fuer Forgejo Actions angelegt; lokales
make verifyerfolgreich. - 2026-06-10: Gitleaks-Secret-Scan lokal mit
zricethezav/gitleaks:v8.28.0erfolgreich; 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_identityangelegt und lokal gegen Supabase verifiziert. - 2026-06-10: Projekte-und-Quotas-Migration
0003_projects_and_quotasangelegt und lokal gegen Supabase verifiziert. - 2026-06-10: Cluster-Migration
0004_clustersangelegt und lokal gegen Supabase verifiziert. - 2026-06-10: VMs-und-SSH-Keys-Migration
0005_vms_and_ssh_keysangelegt und lokal gegen Supabase verifiziert. - 2026-06-10: VMID-Allokator-Migration
0006_vmid_allocatorangelegt und mit 50 parallelen Reservierungen lokal gegen Supabase verifiziert. - 2026-06-10: Audit-Log-Migration
0007_audit_logangelegt und Append-only-Verhalten lokal gegen Supabase verifiziert. - 2026-06-10: RLS-Migration
0008_rls_policiesangelegt und Mitglied/Nicht-Mitglied-Isolation lokal gegen Supabase verifiziert. - 2026-06-10: RLS-Advisor-Cleanup
0009_rls_advisor_cleanupangelegt; 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
/meRequest legt genau einprofiles-Profil an. - 2026-06-10: RBAC-Policy-Funktion mit tabellengetriebenen Rollen/Aktions-Tests erfolgreich.
- 2026-06-10: Frontend-Prototyp mit Supabase Auth und Backend-
/meCheck 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.