chore(release): v1.0.0

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 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 16:13:04 +02:00
co-authored by Claude Opus 5.5
parent ca9d6de446
commit f338061d0f
10 changed files with 93 additions and 24 deletions
+14 -2
View File
@@ -7,6 +7,20 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
## [Unveröffentlicht] ## [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 ### 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) - 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) - 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) - Beim Wechsel des Servers im Assistenten wurde die erste Bridge statt vmbr0 vorbelegt (#023)
### Entfernt
### Sicherheit ### 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 - 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) - Prisma 7.10.0 → 7.10.1: hebt `mysql2` und `deepmerge-ts` über bekannte Lücken (nur im Prisma-CLI, nicht zur Laufzeit)
+2 -2
View File
@@ -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`. - 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 - Conventional Commits, deutscher Betreff ≤ 72 Zeichen, Körper erklärt das Warum, Fußzeile
`Closes #NNN` bzw. `Refs #NNN`. Identität `Florian Wilde <wilde.florian@gmail.com>`. `Closes #NNN` bzw. `Refs #NNN`. Identität `Florian Wilde <wilde.florian@gmail.com>`.
- SemVer; jede Etappe ein annotierter Tag `vX.Y.Z`. **1.0.0 erst nach dem Feldtest** auf echtem - SemVer; jede Etappe ein annotierter Tag `vX.Y.Z`. 1.0.0 nach dem Feldtest auf PVE 9.x (#020) –
Proxmox 8.x und 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 - `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; Commit-Zeitstempeln, Sitzungen mit „Erledigt“ und „Entscheidungen“) werden mit jedem Issue gepflegt;
`docs/issues/*.md` tragen Status und tatsächliche Zeit. `docs/issues/*.md` tragen Status und tatsächliche Zeit.
+22 -1
View File
@@ -2,7 +2,7 @@
## Zeitübersicht ## 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. 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 | | #022 Profile im Template | 0 h 22 min |
| #015 (Teil) SSH-Schlüssel | 0 h 10 min | | #015 (Teil) SSH-Schlüssel | 0 h 10 min |
| #021 Template-Bau ohne SSH | 0 h 19 min + 0 h 35 min Abnahme | | #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 | | #013 CLI und API-Tokens | 0 h 42 min |
| #014 Verlauf, Wiederholen, Aufräumen | 1 h 21 min | | #014 Verlauf, Wiederholen, Aufräumen | 1 h 21 min |
| #015 Benutzer, Passwort, Audit-Log | 0 h 10 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.5.0 | 1 h 39 min | **abgeschlossen**
| v0.6.0 | 0 h 40 min | **abgeschlossen** | v0.6.0 | 0 h 40 min | **abgeschlossen**
| v0.6.1 | 0 h 35 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.
--- ---
+1 -1
View File
@@ -2,7 +2,7 @@
"openapi": "3.0.3", "openapi": "3.0.3",
"info": { "info": {
"title": "ProxDeploy API", "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? } }`." "description": "REST-API von ProxDeploy – dieselbe für Web-GUI und CLI. Fehler: `{ fehler: { code, nachricht, hinweis?, felder? } }`."
}, },
"servers": [ "servers": [
+1 -1
View File
@@ -595,7 +595,7 @@ proxdeploy/
| v0.4.0 | 4 – CLI | #013 | alle Befehle gegen die laufende Instanz | | v0.4.0 | 4 – CLI | #013 | alle Befehle gegen die laufende Instanz |
| v0.5.0 | 5 – Verlauf, Audit, Rollen, OIDC | #014–#016 | – | | v0.5.0 | 5 – Verlauf, Audit, Rollen, OIDC | #014–#016 | – |
| v0.6.0 | 6 – Branding, README, Installer | #017–#019 | Installer in echtem LXC | | 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 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 kleiner HTTP-Server mit Zustand, der die benutzten Endpunkte inkl. UPID-Tasks nachbildet). Die
+47 -11
View File
@@ -1,21 +1,57 @@
# #020 Feldtest 8.x und 9.x, Version 1.0.0 # #020 Feldtest und Version 1.0.0
**Status:** offen **Status:** erledigt
**Meilenstein:** v1.0.0 **Meilenstein:** v1.0.0
**Labels:** test **Labels:** test
**Geschätzt:** 6 h **Tatsächlich:** – **Geschätzt:** 6 h **Tatsächlich:** 2 h 15 min (Sitzung 5)
## Ziel ## 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 ## Aufgaben
- [ ] Matrix: VM/LXC × Debian/Ubuntu × mit/ohne SSH × 8.x/9.x - [x] Matrix auf pve-demo (PVE 9.2.2): VM/LXC × Debian/Ubuntu × mit/ohne SSH zum Node
- [ ] Gefundene Fehler als eigene Issues - [x] Gefundene Fehler behoben (siehe unten), jeweils mit Test
- [x] Abhängigkeiten auf bekannte Lücken geprüft (`pnpm audit --prod`)
## Akzeptanzkriterien ## Matrix (PVE 9.2.2)
- [ ] Alle Kombinationen grün oder mit Begründung ausgeschlossen
## Abhängigkeiten | Gast | mit SSH zum Node | ohne SSH zum Node |
alle |---|---|---|
| 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 ## 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.
+2 -2
View File
@@ -1,8 +1,8 @@
# #023 Standardwerte je Server # #023 Standardwerte je Server
**Status:** erledigt **Status:** erledigt
**Meilenstein:** v0.7.0 **Meilenstein:** v1.0.0
**Labels:** feature **Labels:** feature
**Geschätzt:** 1 h **Tatsächlich:** – **Geschätzt:** 1 h **Tatsächlich:** 1 h 40 min (inkl. Fehlersuche Handy-Übersicht)
## Ziel ## Ziel
Die Vorgabe nennt unter „Einstellungen“ Standardwerte. Der Server kannte sie schon (die CLI füllt Die Vorgabe nennt unter „Einstellungen“ Standardwerte. Der Server kannte sie schon (die CLI füllt
+2 -2
View File
@@ -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 | | [#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 | | [#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 | | [#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 | | [#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 | | [#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 |
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "proxdeploy", "name": "proxdeploy",
"version": "0.6.1", "version": "1.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"description": "VMs und LXC-Container auf Proxmox VE ausrollen, per Web oder CLI", "description": "VMs und LXC-Container auf Proxmox VE ausrollen, per Web oder CLI",
+1 -1
View File
@@ -2,7 +2,7 @@
* Version und Git-Stand für Seitenleiste, `/api/v1/ich` und die Kopfzeile der CLI. * 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). * 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 const GIT_SHA = (process.env["NEXT_PUBLIC_GIT_SHA"] ?? "").slice(0, 7);
export function versionText(): string { export function versionText(): string {