diff --git a/CHANGELOG.md b/CHANGELOG.md index 83b9dde..93e7e66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ### Sicherheit +## [0.6.1] – 2026-10-12 + +### Behoben +- Debian-12-Templates bekamen keine cloud-init-Konfiguration: das cloud-init-Laufwerk hing an ide2 (SATA bei q35), den der Debian-12-Cloud-Kernel nicht kennt. Neue Templates nutzen scsi1 (#021) + ## [0.6.0] – 2026-10-12 ### Hinzugefügt diff --git a/DEVLOG.md b/DEVLOG.md index 8d7c65c..b33f843 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,7 +2,7 @@ ## Zeitübersicht -**Gesamt:** 7 h 39 min (Sitzung 1–3) +**Gesamt:** 8 h 14 min (Sitzung 1–4) Zeiten stammen aus den Git-Commit-Zeitstempeln je Issue; Wartezeit auf Rückmeldungen ist enthalten. @@ -22,7 +22,7 @@ Zeiten stammen aus den Git-Commit-Zeitstempeln je Issue; Wartezeit auf Rückmeld | #012 Vorlagen | 0 h 11 min | | #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 | +| #021 Template-Bau ohne SSH | 0 h 19 min + 0 h 35 min Abnahme | | #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 | @@ -35,10 +35,27 @@ Zeiten stammen aus den Git-Commit-Zeitstempeln je Issue; Wartezeit auf Rückmeld |---|---| | v0.1.0 | 1 h 15 min | **abgeschlossen** | v0.2.0 | 1 h 32 min | **abgeschlossen** -| v0.3.0 | 1 h 48 min | **abgeschlossen** (Abnahme #021 offen) +| v0.3.0 | 1 h 48 min | **abgeschlossen** | v0.4.0 | 0 h 42 min | **abgeschlossen** | v0.5.0 | 1 h 39 min | **abgeschlossen** | v0.6.0 | 0 h 40 min | **abgeschlossen** +| v0.6.1 | 0 h 35 min | **abgeschlossen** + +--- + +## 2026-10-12 · Sitzung 4 · 19:50–20:26 +**Issue:** #021 (Abnahme), Vorüberlegung #020 +**Version:** 0.6.1 + +### Erledigt +- Freie Bau-Adresse gesucht (Ping/ARP-Probe vom Testhost, .150–.199 stumm) → 10.0.10.180 +- #021 abgenommen: Template 9003 (Debian 12) ohne Node-SSH über die Bau-Adresse gebaut, daraus VM 111 `pd-deb12` ohne Node-SSH ausgerollt +- Dabei gefunden und behoben: cloud-init-Laufwerk an `ide2` wird vom Debian-12-Cloud-Kernel nicht gesehen → `scsi1` +- Fehlgeschlagenen ersten Bau mit `proxdeploy cleanup` aufgeräumt (VM 9003 gestoppt und gelöscht) + +### Entscheidungen +- **cloud-init-Laufwerk an virtio-SCSI** für neue Templates; vorhandene (9000–9002) bleiben – deren Kernel kennen SATA. +- **Feldtest 8.x (#020) nicht als verschachtelte VM auf pve-demo:** 7 GB RAM, VMs liefen dort auf dritter Virtualisierungsebene; braucht einen echten 8.x-Host. --- diff --git a/README.md b/README.md index 7874dee..6ab68e2 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ Version und Änderungen stehen im [CHANGELOG](CHANGELOG.md), der Plan in |---|---|---| | 1 · v0.1.0 | Server-Verwaltung, Fingerprint-Pinning, Verbindungstest mit Fähigkeitserkennung | ✓ fertig, auf PVE 9.2 geprüft | | 2 · v0.2.0 | Katalog, Template-Bau, Debian-13-VM, Live-Fortschritt, Assistent | ✓ fertig, auf PVE 9.2 geprüft | -| 3 · v0.3.0 | LXC, Ubuntu, Profile, Vorlagen, Profile im Template, SSH-Schlüssel | ✓ fertig, auf PVE 9.2 geprüft (Bau-Adresse #021: Abnahme offen) | +| 3 · v0.3.0 | LXC, Ubuntu, Profile, Vorlagen, Profile im Template, SSH-Schlüssel, Template-Bau ohne SSH | ✓ fertig, auf PVE 9.2 geprüft | | 4 · v0.4.0 | CLI `proxdeploy` (Go), API-Tokens | ✓ fertig, auf PVE 9.2 geprüft | | 5 · v0.5.0 | Verlauf, Aufräumen, Audit-Log, Benutzer, OIDC | ✓ fertig (Aufräumen auf PVE 9.2 geprüft, OIDC gegen Mock-IdP) | | 6 · v0.6.0 | Branding, README mit Screenshots, Docker Compose, LXC-Installer | ✓ fertig, Installer auf PVE 9.2 geprüft | diff --git a/cli/api/openapi.json b/cli/api/openapi.json index 3027686..ae9935c 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.0", + "version": "0.6.1", "description": "REST-API von ProxDeploy – dieselbe für Web-GUI und CLI. Fehler: `{ fehler: { code, nachricht, hinweis?, felder? } }`." }, "servers": [ diff --git a/docs/issues/021-template-bau-ohne-ssh.md b/docs/issues/021-template-bau-ohne-ssh.md index e5a5dbe..50d1337 100644 --- a/docs/issues/021-template-bau-ohne-ssh.md +++ b/docs/issues/021-template-bau-ohne-ssh.md @@ -1,8 +1,8 @@ # #021 Template-Bau ohne SSH (Bau-Adresse) -**Status:** umgesetzt, Abnahme auf pve-demo ausstehend +**Status:** erledigt **Meilenstein:** v0.3.0 **Labels:** feature, proxmox -**Geschätzt:** 3 h **Tatsächlich:** 0 h 19 min +**Geschätzt:** 3 h **Tatsächlich:** 0 h 19 min + 0 h 35 min Abnahme ## Ziel Templates auch auf Servern ohne SSH zum Node bauen. Der Guest-Agent wird dann nicht per Snippet, @@ -15,7 +15,7 @@ sondern über SSH **in die Vorbereitungs-VM** eingebaut. - [x] Fähigkeitserkennung: „Template-Bau per API ohne SSH möglich, wenn Bau-Adresse gesetzt“ ## Akzeptanzkriterien -- [ ] Template-Bau auf pve-demo mit abgeschaltetem SSH +- [x] Template-Bau auf pve-demo mit abgeschaltetem SSH (2026-10-12, Bau-Adresse 10.0.10.180): Template 9003 tpl-debian-12; daraus VM 111 pd-deb12 ebenfalls ohne Node-SSH ausgerollt, Agent aus dem Template, eigene Maschinen-ID ## Abhängigkeiten #007 @@ -25,3 +25,9 @@ sondern über SSH **in die Vorbereitungs-VM** eingebaut. - Der Bereitstellungsschlüssel kommt per cloud-init an den Standardbenutzer des Images; danach werden alle authorized_keys, ciuser, sshkeys und die feste Adresse entfernt. - Host-Key der frischen VM ist vorher unbekannt (TOFU, nur für diese eine Verbindung). - Aus #007 ausgegliedert, damit Etappe 2 nicht wartet: der Testhost hat SSH, und VM-Deployments aus vorhandenen Templates laufen ohnehin ohne SSH. +- **Abnahme fand einen echten Fehler:** Das cloud-init-Laufwerk hing als `ide2` an der q35-Maschine + (also am SATA-Controller). Der „cloud“-Kernel von Debian 12 hat dafür keinen Treiber – cloud-init + fand keine Datenquelle, die VM bootete als „localhost“ ohne Adresse. Debian 13 und Ubuntu kennen + den Controller, deshalb fiel es bisher nicht auf. Neue Templates hängen das Laufwerk an `scsi1` + (virtio-SCSI wie die System-Disk). Vorhandene Templates bleiben, wie sie sind. +- Bau-Adresse per Ping- und ARP-Probe vom Testhost gewählt (10.0.10.150–199 stumm, Florians Freigabe „such dir eine IP“). diff --git a/docs/issues/README.md b/docs/issues/README.md index 35296d3..5704d9d 100644 --- a/docs/issues/README.md +++ b/docs/issues/README.md @@ -24,5 +24,5 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a | [#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 | – | -| [#021](021-template-bau-ohne-ssh.md) | Template-Bau ohne SSH (Bau-Adresse) | umgesetzt, Abnahme offen | v0.3.0 | 3 h | 0 h 19 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 | diff --git a/package.json b/package.json index ff93e6f..b3ffaf9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proxdeploy", - "version": "0.6.0", + "version": "0.6.1", "private": true, "type": "module", "description": "VMs und LXC-Container auf Proxmox VE ausrollen, per Web oder CLI", diff --git a/src/engine/ablaeufe/template-bau.ts b/src/engine/ablaeufe/template-bau.ts index 282a01f..4c163b3 100644 --- a/src/engine/ablaeufe/template-bau.ts +++ b/src/engine/ablaeufe/template-bau.ts @@ -470,7 +470,10 @@ export function templateBauSchritte(e: TemplateBauEingabe, stand: TemplateBauSta serial0: "socket", vga: "serial0", agent: "enabled=1,fstrim_cloned_disks=1", - ide2: `${e.storage}:cloudinit`, + // cloud-init-Laufwerk am virtio-SCSI-Controller, nicht an ide2: q35 hängt IDE an SATA (AHCI), + // und der „cloud“-Kernel von Debian 12 hat keinen Treiber dafür – cloud-init fände keine + // Datenquelle und bliebe stumm (gefunden bei der Abnahme von #021). + scsi1: `${e.storage}:cloudinit`, ipconfig0: "ip=dhcp", ciupgrade: false, tags: ["proxdeploy-template", d.id, ...profilIds.map((p) => `profil-${p}`)].join(";"), diff --git a/src/lib/version.ts b/src/lib/version.ts index dbd01fa..9db6070 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.0"; +export const VERSION = process.env["NEXT_PUBLIC_APP_VERSION"] ?? "0.6.1"; export const GIT_SHA = (process.env["NEXT_PUBLIC_GIT_SHA"] ?? "").slice(0, 7); export function versionText(): string { diff --git a/tests/engine/template-bau.test.ts b/tests/engine/template-bau.test.ts index 46d8af9..61a165b 100644 --- a/tests/engine/template-bau.test.ts +++ b/tests/engine/template-bau.test.ts @@ -147,7 +147,7 @@ describe("Template-Bau", () => { cpu: "host", serial0: "socket", agent: "enabled=1,fstrim_cloned_disks=1", - ide2: "local-zfs:cloudinit", + scsi1: "local-zfs:cloudinit", tags: "proxdeploy-template;debian-13", }); const configs = mock.anfragen.filter((a) => a.methode === "PUT").map((a) => Object.fromEntries(a.rumpf));