2 Commits
Author SHA1 Message Date
florian.wildeandClaude Opus 5.5 8b37329c92 chore(release): v0.6.1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:25:49 +02:00
florian.wildeandClaude Opus 5.5 7beeafd2f6 fix(templates): cloud-init-Laufwerk an scsi1 statt ide2
q35 hängt IDE an den SATA-Controller; der Cloud-Kernel von Debian 12 kennt ihn nicht, cloud-init fand keine Datenquelle. Gefunden bei der Abnahme von #021 auf pve-demo: Template-Bau über die Bau-Adresse und eine Debian-12-VM daraus, beides ohne SSH zum Node.

Closes #021

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:25:45 +02:00
10 changed files with 44 additions and 13 deletions
+5
View File
@@ -17,6 +17,11 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
### Sicherheit ### 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 ## [0.6.0] – 2026-10-12
### Hinzugefügt ### Hinzugefügt
+20 -3
View File
@@ -2,7 +2,7 @@
## Zeitübersicht ## 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. 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 | | #012 Vorlagen | 0 h 11 min |
| #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 | | #021 Template-Bau ohne SSH | 0 h 19 min + 0 h 35 min Abnahme |
| #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 |
@@ -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.1.0 | 1 h 15 min | **abgeschlossen**
| v0.2.0 | 1 h 32 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.4.0 | 0 h 42 min | **abgeschlossen**
| 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**
---
## 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.
--- ---
+1 -1
View File
@@ -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 | | 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 | | 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 | | 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) | | 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 | | 6 · v0.6.0 | Branding, README mit Screenshots, Docker Compose, LXC-Installer | ✓ fertig, Installer auf PVE 9.2 geprüft |
+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.0", "version": "0.6.1",
"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": [
+9 -3
View File
@@ -1,8 +1,8 @@
# #021 Template-Bau ohne SSH (Bau-Adresse) # #021 Template-Bau ohne SSH (Bau-Adresse)
**Status:** umgesetzt, Abnahme auf pve-demo ausstehend **Status:** erledigt
**Meilenstein:** v0.3.0 **Meilenstein:** v0.3.0
**Labels:** feature, proxmox **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 ## Ziel
Templates auch auf Servern ohne SSH zum Node bauen. Der Guest-Agent wird dann nicht per Snippet, 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“ - [x] Fähigkeitserkennung: „Template-Bau per API ohne SSH möglich, wenn Bau-Adresse gesetzt“
## Akzeptanzkriterien ## 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 ## Abhängigkeiten
#007 #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. - 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). - 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. - 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“).
+1 -1
View File
@@ -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 | | [#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 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 | | [#022](022-template-profile.md) | Templates mit eingebackenen Profilen | erledigt | v0.3.0 | 4 h | 0 h 22 min |
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "proxdeploy", "name": "proxdeploy",
"version": "0.6.0", "version": "0.6.1",
"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",
+4 -1
View File
@@ -470,7 +470,10 @@ export function templateBauSchritte(e: TemplateBauEingabe, stand: TemplateBauSta
serial0: "socket", serial0: "socket",
vga: "serial0", vga: "serial0",
agent: "enabled=1,fstrim_cloned_disks=1", 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", ipconfig0: "ip=dhcp",
ciupgrade: false, ciupgrade: false,
tags: ["proxdeploy-template", d.id, ...profilIds.map((p) => `profil-${p}`)].join(";"), tags: ["proxdeploy-template", d.id, ...profilIds.map((p) => `profil-${p}`)].join(";"),
+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.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 const GIT_SHA = (process.env["NEXT_PUBLIC_GIT_SHA"] ?? "").slice(0, 7);
export function versionText(): string { export function versionText(): string {
+1 -1
View File
@@ -147,7 +147,7 @@ describe("Template-Bau", () => {
cpu: "host", cpu: "host",
serial0: "socket", serial0: "socket",
agent: "enabled=1,fstrim_cloned_disks=1", agent: "enabled=1,fstrim_cloned_disks=1",
ide2: "local-zfs:cloudinit", scsi1: "local-zfs:cloudinit",
tags: "proxdeploy-template;debian-13", tags: "proxdeploy-template;debian-13",
}); });
const configs = mock.anfragen.filter((a) => a.methode === "PUT").map((a) => Object.fromEntries(a.rumpf)); const configs = mock.anfragen.filter((a) => a.methode === "PUT").map((a) => Object.fromEntries(a.rumpf));