From f338061d0f7837e6fe9c565faf510ed321df510f Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Fri, 23 Oct 2026 16:13:04 +0200 Subject: [PATCH] chore(release): v1.0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feldtest auf PVE 9.2 vollständig (VM/LXC × Debian 12/13, Ubuntu 22.04/24.04/26.04, mit und ohne SSH zum Node); 8.x nicht im Einsatz und nicht geprüft. Dazu Standardwerte je Server und die Fehler aus dem Feldtest. Closes #020 Closes #023 Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 16 +++++++-- CLAUDE.md | 4 +-- DEVLOG.md | 23 ++++++++++++- cli/api/openapi.json | 2 +- docs/architektur.md | 2 +- docs/issues/020-feldtest.md | 58 ++++++++++++++++++++++++++------ docs/issues/023-standardwerte.md | 4 +-- docs/issues/README.md | 4 +-- package.json | 2 +- src/lib/version.ts | 2 +- 10 files changed, 93 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7c46f8..25a524c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,20 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ## [Unveröffentlicht] +### Hinzugefügt + +### Geändert + +### Behoben + +### Entfernt + +### Sicherheit + +## [1.0.0] – 2026-10-23 + +Erste stabile Fassung: alle Etappen der Vorgabe, Feldtest auf Proxmox VE 9.2 (#020). Proxmox VE 8.x ist im Code unterstützt, aber nicht im Feldtest geprüft; OIDC ist gegen einen nachgebauten Identity Provider getestet. + ### Hinzugefügt - Standardwerte je Server (Node, Storage, Bridge) im Server-Formular; der Assistent belegt sie vor, die CLI nutzt sie für kurze Befehle (#023) @@ -24,8 +38,6 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). - Seitenleiste scrollt, wenn ihr Inhalt höher als der Bildschirm ist (#023) - Beim Wechsel des Servers im Assistenten wurde die erste Bridge statt vmbr0 vorbelegt (#023) -### Entfernt - ### Sicherheit - Next.js 16.4.0 → 16.4.2: zwei kritische Lücken (Remote Code Execution in der Bildoptimierung mit SVG und in `use cache`) und eine hohe (DoS über Server Actions); ProxDeploy nutzte die betroffenen Funktionen nicht, der Bild-Endpunkt ist aber standardmäßig erreichbar - Prisma 7.10.0 → 7.10.1: hebt `mysql2` und `deepmerge-ts` über bekannte Lücken (nur im Prisma-CLI, nicht zur Laufzeit) diff --git a/CLAUDE.md b/CLAUDE.md index b0a6572..c846a55 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -100,8 +100,8 @@ Abläufe prüfen Desktop (1440 px) und Handy (**390 px, kein horizontales Scroll - Branch `main`; je Issue/Etappe `phase/NNN-kurzname`, nach Abschluss `--ff-only` nach `main`. - Conventional Commits, deutscher Betreff ≤ 72 Zeichen, Körper erklärt das Warum, Fußzeile `Closes #NNN` bzw. `Refs #NNN`. Identität `Florian Wilde `. -- SemVer; jede Etappe ein annotierter Tag `vX.Y.Z`. **1.0.0 erst nach dem Feldtest** auf echtem - Proxmox 8.x und 9.x (#020). +- SemVer; jede Etappe ein annotierter Tag `vX.Y.Z`. 1.0.0 nach dem Feldtest auf PVE 9.x (#020) – + im Einsatz ist nur 9.x; 8.x bleibt im Code, gilt aber als „nicht im Feldtest geprüft“. - `CHANGELOG.md` (Keep a Changelog, deutsch) und `DEVLOG.md` (Zeit je Issue/Meilenstein aus den Commit-Zeitstempeln, Sitzungen mit „Erledigt“ und „Entscheidungen“) werden mit jedem Issue gepflegt; `docs/issues/*.md` tragen Status und tatsächliche Zeit. diff --git a/DEVLOG.md b/DEVLOG.md index b33f843..cd9a0ca 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,7 +2,7 @@ ## Zeitübersicht -**Gesamt:** 8 h 14 min (Sitzung 1–4) +**Gesamt:** 12 h 09 min (Sitzung 1–5) Zeiten stammen aus den Git-Commit-Zeitstempeln je Issue; Wartezeit auf Rückmeldungen ist enthalten. @@ -23,6 +23,8 @@ Zeiten stammen aus den Git-Commit-Zeitstempeln je Issue; Wartezeit auf Rückmeld | #022 Profile im Template | 0 h 22 min | | #015 (Teil) SSH-Schlüssel | 0 h 10 min | | #021 Template-Bau ohne SSH | 0 h 19 min + 0 h 35 min Abnahme | +| #023 Standardwerte je Server | 1 h 40 min | +| #020 Feldtest 9.x, 1.0.0 | 2 h 15 min | | #013 CLI und API-Tokens | 0 h 42 min | | #014 Verlauf, Wiederholen, Aufräumen | 1 h 21 min | | #015 Benutzer, Passwort, Audit-Log | 0 h 10 min | @@ -40,6 +42,25 @@ Zeiten stammen aus den Git-Commit-Zeitstempeln je Issue; Wartezeit auf Rückmeld | v0.5.0 | 1 h 39 min | **abgeschlossen** | v0.6.0 | 0 h 40 min | **abgeschlossen** | v0.6.1 | 0 h 35 min | **abgeschlossen** +| v1.0.0 | 3 h 55 min | **abgeschlossen** + +--- + +## 2026-10-23 · Sitzung 5 · 13:55–16:10 (dazu 2026-10-12 20:26–22:06 für #023) +**Issue:** #020, #023 +**Version:** 1.0.0 + +### Erledigt +- #023: Standardwerte je Server (Node, Storage, Bridge) im Formular, im Assistenten und für die CLI; dabei die zu breite Übersicht am Handy gefunden – und dass `keinQuerscrollen` Herauszoomen nicht bemerkte +- Florians Entscheidungen: nur PVE 9.x, OIDC vorerst ohne echten IdP, Lizenz offen, Gitea-Release freigegeben +- Sicherheit: Next.js 16.4.0 → 16.4.2 (zwei kritische Lücken), Prisma 7.10.1 +- Feldtest 9.x: Ubuntu 22.04/26.04 als VM und LXC, Debian 12 als LXC, Ubuntu 26.04 mit Docker im LXC – über die installierte Instanz (CT 109), Update dreimal durchgespielt +- Gefunden und behoben: Abbrüche bei ausgelastetem Node (Wiederholen, Task-Status bis Zeitlimit), angelegte ID zu spät gemerkt, useradd bei vorhandener Gruppe, nesting-Standard, `pnpm test:container` unter pnpm 12 + +### Entscheidungen +- **Wiederholen nur, wo es sicher ist:** lesend immer, schreibend nur bei sicher nicht angekommener Anfrage – ein doppeltes „VM anlegen“ wäre schlimmer als ein Abbruch. +- **Sicherheitsupdates vor der Zwei-Wochen-Regel.** +- **nesting standardmäßig an** wie die Proxmox-Oberfläche. --- diff --git a/cli/api/openapi.json b/cli/api/openapi.json index b8bb00d..39bf4a8 100644 --- a/cli/api/openapi.json +++ b/cli/api/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "ProxDeploy API", - "version": "0.6.1", + "version": "1.0.0", "description": "REST-API von ProxDeploy – dieselbe für Web-GUI und CLI. Fehler: `{ fehler: { code, nachricht, hinweis?, felder? } }`." }, "servers": [ diff --git a/docs/architektur.md b/docs/architektur.md index 7104c19..c619df9 100644 --- a/docs/architektur.md +++ b/docs/architektur.md @@ -595,7 +595,7 @@ proxdeploy/ | v0.4.0 | 4 – CLI | #013 | alle Befehle gegen die laufende Instanz | | v0.5.0 | 5 – Verlauf, Audit, Rollen, OIDC | #014–#016 | – | | v0.6.0 | 6 – Branding, README, Installer | #017–#019 | Installer in echtem LXC | -| v1.0.0 | Feldtest 8.x + 9.x, Feinschliff | #020 | vollständig | +| v1.0.0 | Feldtest 9.x (8.x nicht im Einsatz), Feinschliff | #020, #023 | vollständig | Bis die Testumgebung steht, entwickle ich gegen einen **Proxmox-Mock** (`tests/proxmox-mock/`, ein kleiner HTTP-Server mit Zustand, der die benutzten Endpunkte inkl. UPID-Tasks nachbildet). Die diff --git a/docs/issues/020-feldtest.md b/docs/issues/020-feldtest.md index 64fe95c..fb91bf4 100644 --- a/docs/issues/020-feldtest.md +++ b/docs/issues/020-feldtest.md @@ -1,21 +1,57 @@ -# #020 Feldtest 8.x und 9.x, Version 1.0.0 -**Status:** offen +# #020 Feldtest und Version 1.0.0 +**Status:** erledigt **Meilenstein:** v1.0.0 **Labels:** test -**Geschätzt:** 6 h **Tatsächlich:** – +**Geschätzt:** 6 h **Tatsächlich:** 2 h 15 min (Sitzung 5) ## Ziel -Vollständiger Durchlauf gegen echte Proxmox-Hosts beider Hauptversionen. +Vollständiger Durchlauf gegen echte Proxmox-Hosts. + +**Umfang angepasst (Florian, 2026-10-23):** im Einsatz ist nur Proxmox VE 9.x – kein Feldtest auf 8.x, +kein zweiter 9.x-Host; OIDC vorerst nicht gegen einen echten Identity Provider (lokale Benutzer reichen). ## Aufgaben -- [ ] Matrix: VM/LXC × Debian/Ubuntu × mit/ohne SSH × 8.x/9.x -- [ ] Gefundene Fehler als eigene Issues +- [x] Matrix auf pve-demo (PVE 9.2.2): VM/LXC × Debian/Ubuntu × mit/ohne SSH zum Node +- [x] Gefundene Fehler behoben (siehe unten), jeweils mit Test +- [x] Abhängigkeiten auf bekannte Lücken geprüft (`pnpm audit --prod`) -## Akzeptanzkriterien -- [ ] Alle Kombinationen grün oder mit Begründung ausgeschlossen +## Matrix (PVE 9.2.2) -## Abhängigkeiten -alle +| Gast | mit SSH zum Node | ohne SSH zum Node | +|---|---|---| +| VM Debian 13 | ✓ pd-test01…04, pd-cli01 | – (Weg wie Debian 12) | +| VM Debian 12 | – | ✓ pd-deb12 (Template über Bau-Adresse, #021) | +| VM Ubuntu 22.04 | – | ✓ pd-ft-u2204 | +| VM Ubuntu 24.04 | ✓ pd-ubu01 | – | +| VM Ubuntu 26.04 | – | ✓ pd-ft-u2604 | +| LXC Debian 13 | ✓ pd-ct01 (pct exec) | ✓ pd-abnahme (SSH in den Container) | +| LXC Debian 12 | – | ✓ pd-ft-ct-d12 | +| LXC Ubuntu 22.04 | – | ✓ pd-ft-ct-u2204 | +| LXC Ubuntu 24.04 | ✓ pd-cli02 | ✓ pd-ct02 | +| LXC Ubuntu 26.04 + docker | – | ✓ pd-ft-ct-u2604 (Docker 29.9 im unprivilegierten CT) | + +Templates: Debian 12/13, Ubuntu 22.04/24.04/26.04, Debian 13 mit eingebackenem docker. „Ohne SSH“ +heißt hier: über die installierte Instanz (LXC-Installer, CT 109), die keinen SSH-Zugang zum Node hat. +Die Wege „mit/ohne SSH“ unterscheiden sich nur beim Template-Bau (Snippet vs. Bau-Adresse) und bei der +LXC-Provisionierung (pct exec vs. SSH in den Container); beide sind je Familie mindestens einmal gelaufen. + +## Gefunden und behoben +- **Next.js 16.4.0** hatte zwei kritische und eine hohe Lücke → 16.4.2; Prisma 7.10.1 hebt `mysql2`/`deepmerge-ts`. +- **Ausgelasteter Node** (76 % I/O-Druck, Storage-Abfragen 15 s): Aufträge brachen beim ersten + Verbindungswackler ab. Jetzt: GET bis zu dreimal wiederholt, Statusabfragen laufender Tasks bis zum + Task-Zeitlimit, Schreibendes nur bei sicher nicht angekommener Anfrage, Verbindungsaufbau 30 s, + Schreibaufrufe 120 s. +- **Angelegte ID zu spät gemerkt:** brach das Warten ab, legte Proxmox den Gast trotzdem fertig an und + „Aufräumen“ kannte ihn nicht (CT 114). Jetzt gemerkt, sobald Proxmox den Auftrag angenommen hat. +- **Benutzer wie eine vorhandene Gruppe** („admin“ auf Ubuntu 22.04) → useradd Code 9. Gruppe wird Primärgruppe. +- **nesting** jetzt standardmäßig an wie in der Proxmox-Oberfläche (Warnung bei systemd 249/252). +- `pnpm test:container` lief seit pnpm 12 nicht (`pnpm -s`); deckt jetzt auch den Gruppenfall ab. ## Notizen / Entscheidungen -– +- Paralleles Ausrollen wurde auf dem Testhost bewusst nur mit zwei Gästen geprüft (Batch in Etappe 4): + fünf Gäste plus zwei Template-Builds überfordern dessen Storage. +- Randfall: eine VMID-Reservierung wird bei Auftragsende frei, auch wenn Proxmox den Gast noch anlegt; + ein zweiter Auftrag kann dieselbe ID bekommen. Mit dem längeren Schreib-Zeitlimit selten; „Aufräumen“ + löscht wegen der Prüfung der Beschreibung trotzdem nie das Falsche (im Feldtest so beobachtet). +- Die Entwicklungs-App wurde zweimal von außen beendet (Neustart eines anderen Projekts per + `pkill -f "next start"`); der Feldtest lief deshalb über die installierte Instanz. diff --git a/docs/issues/023-standardwerte.md b/docs/issues/023-standardwerte.md index a0fb582..748f623 100644 --- a/docs/issues/023-standardwerte.md +++ b/docs/issues/023-standardwerte.md @@ -1,8 +1,8 @@ # #023 Standardwerte je Server **Status:** erledigt -**Meilenstein:** v0.7.0 +**Meilenstein:** v1.0.0 **Labels:** feature -**Geschätzt:** 1 h **Tatsächlich:** – +**Geschätzt:** 1 h **Tatsächlich:** 1 h 40 min (inkl. Fehlersuche Handy-Übersicht) ## Ziel Die Vorgabe nennt unter „Einstellungen“ Standardwerte. Der Server kannte sie schon (die CLI füllt diff --git a/docs/issues/README.md b/docs/issues/README.md index c80a334..3824847 100644 --- a/docs/issues/README.md +++ b/docs/issues/README.md @@ -23,7 +23,7 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a | [#017](017-branding.md) | Branding-Assets | erledigt | v0.6.0 | 4 h | 0 h 17 min | | [#018](018-readme.md) | README und Dokumentation | erledigt | v0.6.0 | 4 h | 0 h 02 min | | [#019](019-installer.md) | Docker-Image und LXC-Installer | erledigt | v0.6.0 | 6 h | 0 h 20 min | -| [#020](020-feldtest.md) | Feldtest 8.x und 9.x, Version 1.0.0 | offen | v1.0.0 | 6 h | – | +| [#020](020-feldtest.md) | Feldtest 9.x, Version 1.0.0 | erledigt | v1.0.0 | 6 h | 2 h 15 min | | [#021](021-template-bau-ohne-ssh.md) | Template-Bau ohne SSH (Bau-Adresse) | erledigt | v0.3.0 | 3 h | 0 h 54 min | | [#022](022-template-profile.md) | Templates mit eingebackenen Profilen | erledigt | v0.3.0 | 4 h | 0 h 22 min | -| [#023](023-standardwerte.md) | Standardwerte je Server | erledigt | v0.7.0 | 1 h | – | +| [#023](023-standardwerte.md) | Standardwerte je Server | erledigt | v1.0.0 | 1 h | 1 h 40 min | diff --git a/package.json b/package.json index 40983fa..11656af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proxdeploy", - "version": "0.6.1", + "version": "1.0.0", "private": true, "type": "module", "description": "VMs und LXC-Container auf Proxmox VE ausrollen, per Web oder CLI", diff --git a/src/lib/version.ts b/src/lib/version.ts index 9db6070..52ea616 100644 --- a/src/lib/version.ts +++ b/src/lib/version.ts @@ -2,7 +2,7 @@ * Version und Git-Stand für Seitenleiste, `/api/v1/ich` und die Kopfzeile der CLI. * Beide Werte werden beim Bauen gesetzt (Docker-Build-Arg bzw. Installer). */ -export const VERSION = process.env["NEXT_PUBLIC_APP_VERSION"] ?? "0.6.1"; +export const VERSION = process.env["NEXT_PUBLIC_APP_VERSION"] ?? "1.0.0"; export const GIT_SHA = (process.env["NEXT_PUBLIC_GIT_SHA"] ?? "").slice(0, 7); export function versionText(): string {