275 lines
18 KiB
Markdown
275 lines
18 KiB
Markdown
# 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 <jwt>` 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
|
|
- [x] E3-T01: Krypto-Layer fuer Envelope-Encryption
|
|
- [x] AES-256-GCM mit 32-Byte-Master-Key angelegt
|
|
- [x] Master-Key aus `MASTER_KEY_BASE64` konfiguriert
|
|
- [x] Ciphertext-Format mit Version-Byte und vorangestellter Nonce angelegt
|
|
- [x] Roundtrip, falscher Key, falsche Version und fehlender Key per Unit-Test abgedeckt
|
|
- [x] E3-T02: Cluster-Repository
|
|
- [x] `GetCluster` laedt Cluster und entschluesselt das Token im Speicher
|
|
- [x] `UpsertCluster` verschluesselt Token-Secrets vor dem Speichern
|
|
- [x] SQL-Storage fuer `public.clusters` angelegt
|
|
- [x] Unit-Test stellt sicher, dass gespeicherte Tokens keinen Klartext enthalten
|
|
- [x] E3-T03: Proxmox-HTTP-Client mit TLS-Pinning
|
|
- [x] HTTPS-Client mit normaler Zertifikatsvalidierung plus SHA-256-Fingerprint-Pinning angelegt
|
|
- [x] `PVEAPIToken=<token_id>=<secret>` Auth-Header gesetzt
|
|
- [x] `Get`, `Post`, `Put`, `Delete` mit Kontext, Timeout und Retry angelegt
|
|
- [x] Mock-Server-Tests fuer passenden und falschen Fingerprint angelegt
|
|
- [x] E3-T04: Admin-Endpunkt: Cluster verwalten
|
|
- [x] Interne Operator-Token-Middleware fuer `/internal/*` angelegt
|
|
- [x] `POST /internal/clusters` fuer Cluster-Anlage angelegt
|
|
- [x] `PUT /internal/clusters/{clusterID}` fuer Token-Rotation und Cluster-Update angelegt
|
|
- [x] `PATCH /internal/clusters/{clusterID}/status` fuer Status-Updates angelegt
|
|
- [x] Responses enthalten kein `token_secret`
|
|
- [x] E6-T01: Worker-Grundgeruest
|
|
- [x] asynq-Worker mit Redis-Anbindung ueber `REDIS_ADDR` angelegt
|
|
- [x] Worker pingt Supabase-DB ueber `DATABASE_URL`
|
|
- [x] Graceful Shutdown fuer asynq-Server angelegt
|
|
- [x] Dummy-Job `proxui.dummy` mit Handler und Unit-Tests angelegt
|
|
- [x] E6-T02: UPID-Polling-Job
|
|
- [x] Job-Typ `proxmox.task.poll` mit Payload fuer Cluster, Node, UPID und Ziel-VM angelegt
|
|
- [x] Polling-Handler mit Proxmox-Status-Client-Interface angelegt
|
|
- [x] VM-Status-Update und Audit-Writer fuer finale Task-Ergebnisse angelegt
|
|
- [x] Mock-Proxmox-Test fuer `running` -> `stopped/OK` und Fehlerstatus angelegt
|
|
- [x] Echte Cluster-Client-Aufloesung ueber gemeinsames Cluster-Repository und Proxmox-Client verdrahtet
|
|
- [x] Shared-Plattform-Follow-up fuer Worker-Integration
|
|
- [x] Cluster-Repository von `backend/internal` nach `platform/cluster` verschoben
|
|
- [x] Krypto-Layer nach `platform/encryption` verschoben
|
|
- [x] Proxmox-Client nach `platform/proxmox` verschoben
|
|
- [x] Backend und Worker nutzen dieselben Implementierungen
|
|
- [x] E5-T01: VM-Liste & Detail
|
|
- [x] `GET /projects/{projectID}/vms` angelegt
|
|
- [x] `GET /vms/{vmID}` angelegt
|
|
- [x] SQL-Queries joinen immer ueber `projects` und `memberships`
|
|
- [x] Nicht-Mitglieder erhalten keine VM-Daten
|
|
- [x] Handler-Tests fuer sichtbare und unsichtbare VMs angelegt
|
|
- [x] E5-T02: Power-Aktionen
|
|
- [x] `POST /vms/{vmID}/start` angelegt
|
|
- [x] `POST /vms/{vmID}/stop` angelegt
|
|
- [x] `POST /vms/{vmID}/reboot` angelegt
|
|
- [x] `vm.power` wird anhand der Membership-Rolle geprueft
|
|
- [x] Proxmox-Call liefert UPID und queued `proxmox.task.poll`
|
|
- [x] Audit-Log-Eintrag fuer ausgeloeste Power-Aktion wird geschrieben
|
|
- [x] E5-T03: Reconciliation-Job
|
|
- [x] Periodischen asynq-Scheduler fuer `proxmox.reconcile.all` angelegt
|
|
- [x] Aktive Cluster werden aus der DB geladen
|
|
- [x] Bekannte VMs je Cluster werden gegen Proxmox `status/current` geprueft
|
|
- [x] Drift wird als Audit-Event `vm.reconcile.drift` geloggt
|
|
- [x] Kein Auto-Fix: DB-Status wird im Reconciliation-Lauf nicht ueberschrieben
|
|
- [x] E7-T01: SSH-Key-Verwaltung
|
|
- [x] `GET /tenants/{tenantID}/ssh-keys` (Liste mit RBAC `ssh_key.read`)
|
|
- [x] `POST /tenants/{tenantID}/ssh-keys` (Erstellen mit RBAC `ssh_key.manage`)
|
|
- [x] `GET /ssh-keys/{keyID}` (Detail mit Membership-Check und Tenant-Abgleich)
|
|
- [x] `DELETE /ssh-keys/{keyID}` (Löschen mit RBAC `ssh_key.manage`)
|
|
- [x] Repository, Handler und Tests angelegt
|
|
- [x] Routen in `main.go` verdrahtet und Build/Tests verifiziert
|
|
- [x] E7-T02: Template-Verwaltung
|
|
- [x] Migration `0010_templates` mit `templates`-Tabelle (id, cluster_id, name, description, proxmox_template_vmid, proxmox_node, timestamps)
|
|
- [x] `GET /internal/templates` (Liste aller Templates)
|
|
- [x] `POST /internal/templates` (Template anlegen inkl. On-Conflict-Upsert)
|
|
- [x] `PUT /internal/templates/{templateID}` (Template aktualisieren mit partiellen Feldern)
|
|
- [x] `DELETE /internal/templates/{templateID}` (Template loeschen)
|
|
- [x] Alle Endpunkte mit Operator-Token und `cluster.manage` Permission gesichert
|
|
- [x] Repository, Handler und Tests angelegt
|
|
- [x] Build und alle Tests gruen
|
|
- [x] E7-T03: VM-Erstellung (Clone + cloud-init)
|
|
- [x] Proxmox-Client erweitert: `CloneVM`, `ConfigureCloudInit`, `StartVM`, `CloudInitConfig`
|
|
- [x] Repository erweitert: `GetProjectInfo` (mit Membership-Rolle), `CheckQuota`, `ReserveNextVMID`, `InsertVM`
|
|
- [x] `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
|
|
- [x] `SSHKeyResolver` Interface und Adapter im sshkey-Package
|
|
- [x] `ProvisionResolver` Adapter im template-Package
|
|
- [x] `ProvisionDependencies` mit ClusterRepo, TemplateRepo, ClientFactory, Tasks, Audit, SSHKeyLookup
|
|
- [x] Route in `main.go` verdrahtet
|
|
- [x] Build und alle Tests gruen
|
|
- [x] E7-T04: VM löschen
|
|
- [x] Proxmox-Client: `StopVM`, `DeleteVM`
|
|
- [x] `DELETE /vms/{vmID}` Handler: Auth/Membership per GetVM, RBAC `vm.delete`, Stop+Delete via Proxmox, Task-Enqueue, Audit
|
|
- [x] Route in `main.go` verdrahtet
|
|
- [x] Build und alle Tests gruen
|
|
- [x] E8-T01: Konsolen-Ticket-Endpunkt
|
|
- [x] `POST /vms/{vmID}/console` mit RBAC `vm.console`
|
|
- [x] HMAC-signiertes Proxy-Ticket mit Cluster, Node, VMID, VNC-Info, Endpoint, Expiry
|
|
- [x] `console` Package mit Handler, Ticket-Signer und Verifikations-Funktion
|
|
- [x] E8-T02: Websocket-Proxy-Dienst
|
|
- [x] `console-proxy` mit `GET /ws?ticket=...`
|
|
- [x] Ticket-Validierung, WebSocket-Dial zu Proxmox VNC
|
|
- [x] Bidirektionales Proxy zwischen Client und Proxmox
|
|
- [x] Build und alle Tests gruen
|
|
- [x] E9-T02: Audit-Anzeige (read)
|
|
- [x] `GET /tenants/{tenantID}/audit` mit Paginierung, Membership + RBAC `audit.read`
|
|
- [x] Nur owner/admin haben Zugriff (viewer/member → 403)
|
|
- [x] Repository, Handler und Tests angelegt
|
|
- [x] Route in `main.go` verdrahtet und alle Tests gruen
|
|
- [x] E10: Frontend-MVP
|
|
- [x] Mehrere Dateien: `api.ts` (API-Client), Komponenten (`AuthScreen`, `VMList`, `VMCreate`, `SSHKeys`, `AuditLog`, `ConsoleView`)
|
|
- [x] VM-Übersicht mit Power-Buttons (Start/Stop/Reboot) und Löschen
|
|
- [x] VM-Erstellungs-Wizard mit Template, Ressourcen, SSH-Key
|
|
- [x] SSH-Key-Verwaltung (Anzeigen, Hinzufügen, Löschen)
|
|
- [x] Audit-Log-Ansicht
|
|
- [x] Konsole-Ansicht mit Proxy-Ticket-Abruf
|
|
- [x] Build (`npm run build`) erfolgreich
|
|
|
|
## MVP-Backlog
|
|
|
|
- [x] E1: Supabase Auth, JWT-Middleware und Profil-Sync
|
|
- [x] E2: Datenmodell, Migrationen, RLS und VMID-Allokator
|
|
- [x] E3: Envelope-Encryption, Cluster-Repository, Proxmox-Client und interne Cluster-Verwaltung
|
|
- [x] E4: RBAC, Membership-Resolver, Policy-Funktion und Autorisierungs-Middleware
|
|
- [x] E6: Worker-Grundgeruest und UPID-Polling
|
|
- [x] E5: VM-Liste, Detail, Power-Aktionen und Reconciliation
|
|
- [x] E7: SSH-Keys, Templates und Provisioning
|
|
- [x] E8: Konsolen-Tickets und Websocket-Proxy
|
|
- [x] E9: Audit-Writer und Audit-Anzeige
|
|
- [x] 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.
|