# TODO Arbeitsliste auf Basis von `proxmox-console-entwicklungsplan.md`. Die Entwurfsdatei bleibt unveraendert; Fortschritt und Annahmen werden hier gepflegt. ## In Arbeit - [x] E0-T01: Monorepo-Grundgeruest - [x] Ordner fuer `backend/`, `worker/`, `console-proxy/`, `frontend/`, `migrations/`, `deploy/` angelegt - [x] Root-Dateien `README.md`, `CHANGELOG.md`, `.gitignore`, `.env.example` angelegt - [x] Minimale Startpunkte fuer Backend, Worker, Console-Proxy und Frontend angelegt - [x] Lokale Toolchain geprueft: Go 1.26.4 ist im PATH - [x] Erste Build-/Test-Kommandos ausgefuehrt - [x] E0-T02: Lokale Dev-Umgebung mit offizieller Supabase-Self-Hosted-Konfiguration und Redis - [x] `Makefile` mit `dev`, `migrate`, `test`, `lint`, `build`, `frontend-build`, `verify` angelegt - [x] Reduzierten Supabase-Compose-Versuch entfernt - [x] Offizielle Supabase-Self-Hosted-Dateien einbinden - [x] Projekt-spezifische ENV-Datei aus offizieller Vorlage ableiten - [x] Infrastruktur testweise starten - [x] Healthchecks/Erreichbarkeit pruefen - [x] E0-T03: CI-Pipeline mit Build, Lint, Tests und Secret-Scan - [x] Forgejo-Actions-Workflow fuer Pushes auf `main` und Pull Requests angelegt - [x] Go- und Frontend-Verifikation ueber `make verify` eingebunden - [x] Gitleaks-Secret-Scan mit enger Allowlist fuer offizielle Supabase-Beispieldateien eingebunden - [x] E0-T04: Konfigurations- und Logging-Layer fuer Go-Dienste - [x] Gemeinsames Go-Modul `platform/` angelegt - [x] ENV-basierte Konfiguration mit Defaults und Validierung eingebunden - [x] Einheitliches strukturiertes JSON-Logging mit Service- und Env-Feldern eingebunden - [x] Backend, Worker und Console-Proxy auf den gemeinsamen Layer umgestellt ## Naechste Aufgaben - [x] E2-T01: Migrations-Setup mit `golang-migrate` - [x] Versioniertes SQL-Namensschema unter `migrations/` angelegt - [x] `make migrate`, `make migrate-down` und `make migrate-version` verdrahtet - [x] Migrationen laufen lokal per `migrate`-Binary oder Docker-Image `migrate/migrate:v4.18.3` - [x] DB-URL wird aus `.env`, `deploy/supabase/.env` oder `MIGRATE_DATABASE_URL` abgeleitet - [x] E2-T02: Kern-Tabellen: profiles, tenants, memberships - [x] Migration fuer `profiles`, `tenants`, `memberships` angelegt - [x] `profiles.id` referenziert `auth.users.id` - [x] Rollen-Enum `membership_role` mit `owner`, `admin`, `member`, `viewer` angelegt - [x] FKs, Unique-/Primary-Keys und Indizes gesetzt - [x] E2-T03: Projekte & Quotas - [x] Migration fuer `projects` und `project_quotas` angelegt - [x] Projekte referenzieren eindeutig einen Tenant - [x] Quotas referenzieren 1:1 ein Projekt und erhalten Defaults - [x] Quota-Checks fuer nicht-negative Werte gesetzt - [x] E2-T04: Clusters-Tabelle fuer verschluesselte Credentials - [x] Migration fuer `clusters` angelegt - [x] `encrypted_token` als `bytea` ohne Klartext-Token-Spalte angelegt - [x] `token_id`, `api_endpoint`, `tls_fingerprint`, Status und Zeitstempel angelegt - [x] Checks und Indizes fuer Endpoint/Status gesetzt - [x] E2-T05: VMs & Ressourcen-Mapping - [x] Migration fuer `vms` und `ssh_keys` angelegt - [x] VMs referenzieren eindeutig Projekt und Cluster - [x] Unique-Index auf `(cluster_id, proxmox_vmid)` gesetzt - [x] Ressourcen- und Pflichtfeld-Checks gesetzt - [x] E2-T06: VMID-Allokator - [x] Clusterweite Allocator-Tabelle angelegt - [x] VMID-Reservationen vor Proxmox-Calls modelliert - [x] Transaktionssichere Funktion `reserve_next_vmid(cluster_id)` mit `SELECT ... FOR UPDATE` angelegt - [x] Concurrency-Test mit 50 parallelen Reservierungen lokal verifiziert - [x] E2-T07: Audit-Log-Tabelle - [x] Append-only Tabelle `audit_log` angelegt - [x] Tenant- und Profil-Referenzen gesetzt - [x] Index auf `(tenant_id, created_at)` gesetzt - [x] UPDATE/DELETE per Trigger blockiert - [x] E2-T08: RLS-Policies - [x] RLS auf tenant-bezogenen Tabellen aktiviert - [x] Membership-basierte SELECT-Policies angelegt - [x] Audit-Log auf owner/admin beschraenkt - [x] Direkter Query als Nicht-Mitglied lokal verifiziert - [x] Supabase-Advisor-Follow-up: RLS auf allen uebrigen Public-Tabellen aktiviert - [x] E1-T02: JWT-Validierungs-Middleware im Backend - [x] `Authorization: Bearer ` Middleware angelegt - [x] RS256/ES256 Validierung gegen Supabase-JWKS angelegt - [x] Lokalen HS256-Fallback fuer Self-Hosted-Legacy-Keys angelegt - [x] Issuer, Expiry, Not-Before und Signatur werden validiert - [x] `sub`, `email`, `role` werden als Principal in den Request-Context gelegt - [x] Geschuetzten `/me` Endpunkt angelegt - [x] E1-T03: Profil-Sync - [x] Lazy Provisioning nach erfolgreicher JWT-Validierung angelegt - [x] `profiles` wird idempotent per `insert ... on conflict` erstellt/aktualisiert - [x] Profil-Sync-Middleware mit Unit-Tests angelegt - [x] `/me` fuehrt Profil-Sync vor Handler-Ausfuehrung aus - [x] E4-T01: Mitgliedschafts-Resolver - [x] Tenant-Mitgliedschaft aus `profiles`/`memberships` anhand JWT-`sub` geladen - [x] Tenant-ID aus Request-Route ableitbar gemacht - [x] Mitgliedschaft und Rolle im Request-Context bereitgestellt - [x] Nicht-Mitglieder erhalten `403` - [x] E4-T02: Policy-/Permission-Funktion - [x] Rollen und Aktionen zentral definiert - [x] `Can(role, action)` angelegt - [x] Tabellengetriebene Unit-Tests fuer Rollen/Aktionen angelegt - [x] `cluster.manage` fuer Tenant-Rollen bewusst verweigert - [x] E4-T03: Autorisierungs-Middleware - [x] Deklarativen `Require(action, handler)` Helper angelegt - [x] Rollenpruefung nutzt zentrale `rbac.Can` Policy-Funktion - [x] Fehlende oder unzureichende Rechte liefern `403` - [x] Tenant-Membership-Endpunkt exemplarisch mit `project.read` geschuetzt - [x] E10-Vorgriff: Frontend-Prototyp - [x] Supabase Auth Login/Registrierung angebunden - [x] Backend-`/me` Profil-Sync-Pruefung angebunden - [x] 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.`. - 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.