sites: Inventar und Zielbild an echte Knoten (pve44–pve61) angepasst; ADR-0001/0002/0006 ergänzt
ci / test (push) Successful in 25s

Aufbauplan Task 0.4:
- inventory.yaml: pve44/46/48/52/61 und GODE-PC-05/06 (Ada, Windows, cpu_roles: false)
- proxmox.yaml: eine GPU-VM pro Knoten mit allen Karten (D2), local-lvm/tank (D1 B),
  192.168.100.0/24 ohne VLAN, Gast-IPs .220–.239 (ANNAHME bis Task 0.2)
- registry.yaml/prometheus.yml: ops-Labels auf gpu-pve44/46/48, Ada ohne pve_node/vmid
- tofu: dynamische hostpci, Speicher je Gast; Ansible: pve_gpu_hosts/pve_kiosk,
  Replikation auf mehrere Ziele
- Placement: cpu_roles=false schließt Arbeitsplätze/Kiosk von CPU-Rollen aus
- PLAN §1.3/§1.4/§9 und ADR-Nachträge (D1 entschieden, D2/D3 Bestätigung offen)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 01:39:49 +02:00
co-authored by Claude Opus 5.5
parent 8cf27b48ce
commit c81e372c49
20 changed files with 343 additions and 190 deletions
+50 -33
View File
@@ -1,38 +1,55 @@
# Inventar des Clusters "knaster".
# ANNAHME: Die Verteilung der GPUs und SSDs auf die Hosts ist noch nicht erfasst. Bitte beim
# gemeinsamen Deployment mit `knaster inventory collect` auf jedem Node ersetzen.
# Inventar des Clusters "knaster" – Stand 12.10.2026 (Aufbauplan docs/superpowers/plans/2026-10-12-…, Ausgangslage).
# Quelle: Healthcheck 08.10. + Inventar pve48 12.10. + Angaben des Nutzers. Beim Bootstrap mit
# `knaster inventory collect` gegenprüfen; Abweichungen hier eintragen.
# Speicher: Variante B (D1) – sda = System (local + local-lvm), sdb wird nach Freigabe zum ZFS-Pool `tank`.
nodes:
- name: pve-ada
cpu: {model: "unbekannt", cores: 6, threads: 12}
- name: pve44 # 192.168.100.210, ThinkStation P310
cpu: {model: "Intel Core i7-6700", cores: 4, threads: 8}
memory_gb: 32
disks: [{name: sda, size_gb: 256}, {name: sdb, size_gb: 256}] # sdb: altes Windows (NTFS) → tank
gpus:
- {index: 0, name: "Quadro M4000", memory_gb: 8, compute_cap: 5.2, disabled: true, note: "außer Betrieb bis Benchmark-Tag (Task 3.3, ADR-0006)"}
- {index: 1, name: "Quadro P2000", memory_gb: 5, compute_cap: 6.1}
- name: pve46 # 192.168.100.209, ThinkStation P310, Legacy-Boot, eine Platte (kein ZFS)
cpu: {model: "Intel Core i7-6700", cores: 4, threads: 8}
memory_gb: 32
disks: [{name: sda, size_gb: 256}]
gpus:
- {index: 0, name: "Quadro M4000", memory_gb: 8, compute_cap: 5.2, disabled: true, note: "außer Betrieb bis Benchmark-Tag (Task 3.3, ADR-0006)"}
- {index: 1, name: "Quadro P2000", memory_gb: 5, compute_cap: 6.1}
- name: pve48 # 192.168.100.212, ThinkStation P310, Legacy-Boot
cpu: {model: "Intel Core i7-6700", cores: 4, threads: 8}
memory_gb: 32
disks: [{name: sda, size_gb: 256}, {name: sdb, size_gb: 256}, {name: sdc, size_gb: 128}] # sdb → tank, sdc bleibt unberührt
gpus:
- {index: 0, name: "Quadro M4000", memory_gb: 8, compute_cap: 5.2, disabled: true, note: "außer Betrieb bis Benchmark-Tag (Task 3.3, ADR-0006)"}
- {index: 1, name: "Quadro P2000", memory_gb: 5, compute_cap: 6.1}
- name: pve52 # 192.168.100.207, ThinkStation P320, nur M4000 verbaut
cpu: {model: "Intel Core i7-7700", cores: 4, threads: 8}
memory_gb: 32
disks: [{name: sda, size_gb: 256}, {name: sdb, size_gb: 256}] # sdb: altes Windows (BitLocker) → tank
gpus:
- {index: 0, name: "Quadro M4000", memory_gb: 8, compute_cap: 5.2, disabled: true, note: "außer Betrieb bis Benchmark-Tag (Task 3.3, ADR-0006)"}
- name: pve61 # 192.168.100.214, Surface Book, LAN über USB-NIC im Dock – nur Kiosk
cpu: {model: "Intel Core i5-8350U", cores: 4, threads: 8}
memory_gb: 8
disks: [{name: nvme0n1, size_gb: 256}]
cpu_roles: false
labels: {platform: proxmox, purpose: kiosk}
# Außerhalb des Proxmox-Clusters (D3): Windows-Arbeitsplätze, tagsüber haben Mitarbeitende Vorrang.
# Leistung kommt über die Worker-Registry v2 (LocalLLMWorker.ps1, llama-server). Nur die eigene GPU wird verplant.
- name: gode-pc-05
cpu: {model: "unbekannt (Task 0.1 e2)", cores: 0, threads: 0}
memory_gb: 64
disks: [{name: sda, size_gb: 256}, {name: sdb, size_gb: 256}]
cpu_roles: false
labels: {platform: windows, worker: worker-registry-v2}
gpus:
- {index: 0, name: "NVIDIA RTX 4000 Ada Generation", memory_gb: 20, compute_cap: 8.9}
- {index: 1, name: "NVIDIA RTX 4000 Ada Generation", memory_gb: 20, compute_cap: 8.9}
- name: pve1
cpu: {model: "Intel Core i7 (6. Gen) 3.4 GHz", cores: 4, threads: 8}
memory_gb: 32
disks: [{name: sda, size_gb: 128}, {name: sdb, size_gb: 256}]
- name: gode-pc-06
cpu: {model: "unbekannt (Task 0.1 e2)", cores: 0, threads: 0}
memory_gb: 64
cpu_roles: false
labels: {platform: windows, worker: worker-registry-v2}
gpus:
- {index: 0, name: "Quadro M4000", memory_gb: 8, compute_cap: 5.2, disabled: true, note: "außer Betrieb bis llama-bench + Strommessung (ADR-0006)"}
- {index: 1, name: "Quadro M4000", memory_gb: 8, compute_cap: 5.2, disabled: true, note: "außer Betrieb bis llama-bench + Strommessung (ADR-0006)"}
- name: pve2
cpu: {model: "Intel Core i7 (7. Gen) 3.6 GHz", cores: 4, threads: 8}
memory_gb: 32
disks: [{name: sda, size_gb: 128}, {name: sdb, size_gb: 256}, {name: sdc, size_gb: 256}]
gpus:
- {index: 0, name: "Quadro M4000", memory_gb: 8, compute_cap: 5.2, disabled: true, note: "außer Betrieb bis llama-bench + Strommessung (ADR-0006)"}
- {index: 1, name: "Quadro M4000", memory_gb: 8, compute_cap: 5.2, disabled: true, note: "außer Betrieb bis llama-bench + Strommessung (ADR-0006)"}
- name: pve3
cpu: {model: "Intel Core i7 (7. Gen) 3.6 GHz", cores: 4, threads: 8}
memory_gb: 32
disks: [{name: sda, size_gb: 128}, {name: sdb, size_gb: 256}]
gpus:
- {index: 0, name: "Quadro P2000", memory_gb: 5, compute_cap: 6.1}
- {index: 1, name: "Quadro P2000", memory_gb: 5, compute_cap: 6.1}
- name: pve4
cpu: {model: "Intel Core i7 (7. Gen) 3.6 GHz", cores: 4, threads: 8}
memory_gb: 32
disks: [{name: sda, size_gb: 128}, {name: sdb, size_gb: 256}, {name: sdc, size_gb: 256}]
gpus:
- {index: 0, name: "Quadro P2000", memory_gb: 5, compute_cap: 6.1}
- {index: 0, name: "NVIDIA RTX 4000 Ada Generation", memory_gb: 20, compute_cap: 8.9}
+34 -21
View File
@@ -1,31 +1,44 @@
# Proxmox-Zielbild für "knaster" (Eingabe für platform/proxmox/tofu und ansible).
# ANNAHMEN (Hosts, VM-IDs, IPs, PCI-Adressen) bis zum Inventarlauf – siehe docs/IMPLEMENTATION.md.
# Grundlage: Aufbauplan docs/superpowers/plans/2026-10-12-aufbau-cluster-knaster.md (D1 B, D2, D5).
# ANNAHME bis Task 0.2: Gast-IPs aus dem vorgeschlagenen Block .220–.239 (DHCP-Ausschluss noch nicht geprüft).
# ANNAHME bis Task 3.1: PCI-Pfade/IOMMU-Gruppen wie auf pve48 geprüft; auf jedem Knoten mit `lspci -nn` bestätigen.
cluster:
endpoint: https://pve1:8006/
storage_vm: tank # ZFS-Pool auf SSD 2+3 (ADR-0002)
endpoint: https://192.168.100.210:8006/ # pve44, IP-Literal (Global Constraints)
storage_default: local-lvm # D1 B: GPU-VMs auf der System-SSD; HA-Gäste auf `tank` (pve44/48/52)
storage_iso: local
template_vmid: 9000 # Ubuntu 24.04 Cloud-Image-Template (pro Node vorhanden)
template_vmid: 9000 # Ubuntu 24.04 Cloud-Image-Template (pro GPU-Knoten vorhanden)
lxc_template: "local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst" # ANNAHME: Dateiname nach `pveam update` prüfen
bridge: vmbr0
vlan_svc: 20
gateway: 10.20.0.1
dns: 10.20.0.1
vlan_svc: null # flaches Netz, vorerst kein VLAN (D5)
gateway: 192.168.100.1
dns: 192.168.100.120
ssh_public_key_file: ~/.ssh/id_ed25519.pub
pci_mappings: # Proxmox Resource Mappings (Datacenter → Resource Mappings → PCI)
gpu-ada-1: {node: pve-ada, path: "0000:01:00", id: "10de:27b2", subsystem_id: "", iommu_group: 0}
gpu-ada-2: {node: pve-ada, path: "0000:02:00", id: "10de:27b2", subsystem_id: "", iommu_group: 0}
gpu-p2000-1: {node: pve3, path: "0000:01:00", id: "10de:1c30", subsystem_id: "", iommu_group: 0}
gpu-p2000-2: {node: pve3, path: "0000:02:00", id: "10de:1c30", subsystem_id: "", iommu_group: 0}
gpu-p2000-3: {node: pve4, path: "0000:01:00", id: "10de:1c30", subsystem_id: "", iommu_group: 0}
nodes: # Proxmox-Knoten (Cluster-Mitglieder), Ansible-Gruppen siehe platform/proxmox/ansible
pve44: {ip: 192.168.100.210, gpu_host: true, zfs_tank: true}
pve46: {ip: 192.168.100.209, gpu_host: true, zfs_tank: false} # eine Platte
pve48: {ip: 192.168.100.212, gpu_host: true, zfs_tank: true}
pve52: {ip: 192.168.100.207, gpu_host: true, zfs_tank: true}
pve61: {ip: 192.168.100.214, gpu_host: false, zfs_tank: false} # Surface, Kiosk, keine Gäste
vms: # GPU-Rollen als VM (ADR-0001)
gpu-main: {node: pve-ada, vmid: 201, cores: 6, memory_mb: 28672, disk_gb: 40, models_disk_gb: 100, gpu: gpu-ada-1, ip: 10.20.0.201/24, role: gpu-vllm, driver_generation: modern}
gpu-flex: {node: pve-ada, vmid: 202, cores: 6, memory_mb: 28672, disk_gb: 40, models_disk_gb: 100, gpu: gpu-ada-2, ip: 10.20.0.202/24, role: gpu-vllm, driver_generation: modern}
gpu-embed-1: {node: pve3, vmid: 221, cores: 2, memory_mb: 6144, disk_gb: 30, models_disk_gb: 20, gpu: gpu-p2000-1, ip: 10.20.0.221/24, role: gpu-llamacpp, profile: embed, driver_generation: legacy}
gpu-embed-2: {node: pve4, vmid: 222, cores: 2, memory_mb: 6144, disk_gb: 30, models_disk_gb: 20, gpu: gpu-p2000-3, ip: 10.20.0.222/24, role: gpu-llamacpp, profile: embed, driver_generation: legacy}
gpu-small: {node: pve3, vmid: 231, cores: 2, memory_mb: 8192, disk_gb: 30, models_disk_gb: 20, gpu: gpu-p2000-2, ip: 10.20.0.231/24, role: gpu-llamacpp, profile: chat, driver_generation: legacy}
pci_mappings: # Datacenter → Resource Mappings → PCI; Pfad ohne Funktion = Grafik + Audio
gpu-m4000-pve44: {node: pve44, path: "0000:01:00", id: "10de:13f1", subsystem_id: "", iommu_group: 1}
gpu-p2000-pve44: {node: pve44, path: "0000:02:00", id: "10de:1c30", subsystem_id: "", iommu_group: 8}
gpu-m4000-pve46: {node: pve46, path: "0000:01:00", id: "10de:13f1", subsystem_id: "", iommu_group: 1}
gpu-p2000-pve46: {node: pve46, path: "0000:02:00", id: "10de:1c30", subsystem_id: "", iommu_group: 8}
gpu-m4000-pve48: {node: pve48, path: "0000:01:00", id: "10de:13f1", subsystem_id: "", iommu_group: 1}
gpu-p2000-pve48: {node: pve48, path: "0000:02:00", id: "10de:1c30", subsystem_id: "", iommu_group: 8}
gpu-m4000-pve52: {node: pve52, path: "0000:01:00", id: "10de:13f1", subsystem_id: "", iommu_group: 1}
containers: # Infrastruktur als LXC (ADR-0001), HA + ZFS-Replikation (ADR-0002)
infra: {node: pve1, vmid: 101, cores: 4, memory_mb: 12288, disk_gb: 60, ip: 10.20.0.101/24, ha: true, replicate_to: pve2}
vms: # eine GPU-VM pro Knoten mit allen Karten (D2), 12 GB fest (RAM-Budget)
gpu-pve44: {node: pve44, vmid: 244, cores: 4, memory_mb: 12288, disk_gb: 40, models_disk_gb: 60, gpus: [gpu-m4000-pve44, gpu-p2000-pve44], ip: 192.168.100.224/24, role: gpu-llamacpp, driver_generation: legacy}
gpu-pve46: {node: pve46, vmid: 246, cores: 4, memory_mb: 12288, disk_gb: 40, models_disk_gb: 60, gpus: [gpu-m4000-pve46, gpu-p2000-pve46], ip: 192.168.100.226/24, role: gpu-llamacpp, driver_generation: legacy}
gpu-pve48: {node: pve48, vmid: 248, cores: 4, memory_mb: 12288, disk_gb: 40, models_disk_gb: 60, gpus: [gpu-m4000-pve48, gpu-p2000-pve48], ip: 192.168.100.228/24, role: gpu-llamacpp, driver_generation: legacy}
gpu-pve52: {node: pve52, vmid: 252, cores: 4, memory_mb: 12288, disk_gb: 40, models_disk_gb: 60, gpus: [gpu-m4000-pve52], ip: 192.168.100.232/24, role: gpu-llamacpp, driver_generation: legacy}
containers: # LXC (Container zuerst); HA + Replikation nur auf `tank`-Knoten (Task 2.2)
ops: {node: pve46, vmid: 100, cores: 2, memory_mb: 1024, disk_gb: 16, ip: 192.168.100.220/24, storage: local-lvm, nesting: false} # Ansible/OpenTofu, kein HA (RAM-Budget)
infra: {node: pve44, vmid: 101, cores: 4, memory_mb: 8192, disk_gb: 60, ip: 192.168.100.221/24, storage: tank, nesting: true, ha: true, replicate_to: [pve52, pve48]}
# Später, eigene Tasks: pbs (VM 110, pve52, Task 5.1, .222), grp-test (LXC, pve48 auf tank, Phase 8, .223).
replication_schedule: "*/15"
+16 -13
View File
@@ -1,6 +1,9 @@
# Registry für den Cluster "knaster" (SPEC-core §1).
# Clients sprechen nur Slot-Namen an; litellm_model ist der Alias in deploy/litellm/config.yaml.
# ops: Labels für den Healer (Portainer-Endpoint, Container, Proxmox-Node, VM-ID).
# Stand Aufbauplan Task 0.4: P2000-Slots in den GPU-VMs gpu-pve44/46/48 (Zuordnung ANNAHME bis Benchmark-Tag,
# Task 3.3). Ada-Slots laufen auf Windows-Arbeitsplätzen (D3) ohne Proxmox; Umstellung auf die
# Worker-Registry v2 folgt in Task 6.4, bis dahin behalten sie ihre Engine.
slots:
tier0-strong:
tier: 0
@@ -15,37 +18,37 @@ slots:
tier: 1
device: gpu
engine: vllm
node: gpu-main # RTX 4000 Ada #1
node: gpu-main # RTX 4000 Ada, GODE-PC-05 (Windows, D3)
litellm_model: tier1-general
base_model: qwen3-14b-awq # Startkandidat, Entscheidung per Kalibrierungslauf
max_context: 32768
effective_context: 16384
supports_lora: true
fallbacks: [tier1-flex]
ops: {docker_host: gpu-main, container: vllm, pve_node: pve-ada, vmid: "201"} # VM-IDs/Hosts: ANNAHME bis Deployment
ops: {docker_host: gpu-main, container: vllm} # kein Proxmox (D3); bis Task 6.4
tier1-flex:
tier: 1
device: gpu
engine: vllm
node: gpu-flex # RTX 4000 Ada #2 (nachts Training → unavailable)
node: gpu-flex # RTX 4000 Ada, GODE-PC-06 (Windows, D3)
litellm_model: tier1-flex
base_model: qwen3-14b-awq
max_context: 32768
effective_context: 16384
supports_lora: true
ops: {docker_host: gpu-flex, container: vllm, pve_node: pve-ada, vmid: "202"} # VM-IDs/Hosts: ANNAHME bis Deployment
ops: {docker_host: gpu-flex, container: vllm} # kein Proxmox (D3); bis Task 6.4
verifier-small:
tier: 1
device: gpu
engine: llamacpp
node: gpu-small # Quadro M4000 (Nutzen per Benchmark prüfen)
node: gpu-small # Quadro P2000 in gpu-pve48
litellm_model: verifier-small
base_model: qwen3-4b-q4km
max_context: 8192
effective_context: 6144
ops: {docker_host: gpu-small, container: llamacpp-chat, pve_node: pve3, vmid: "231"} # VM-IDs/Hosts: ANNAHME bis Deployment
ops: {docker_host: gpu-pve48, container: llamacpp-chat, pve_node: pve48, vmid: "248"} # ANNAHME bis Task 3.3
signature-extractor:
tier: 1
@@ -56,18 +59,18 @@ slots:
base_model: qwen3-4b-q4km
max_context: 8192
effective_context: 6144
ops: {docker_host: gpu-small, container: llamacpp-chat, pve_node: pve3, vmid: "231"} # VM-IDs/Hosts: ANNAHME bis Deployment
ops: {docker_host: gpu-pve48, container: llamacpp-chat, pve_node: pve48, vmid: "248"} # ANNAHME bis Task 3.3
embed-default:
tier: 1
device: gpu
engine: llamacpp
node: gpu-embed # Quadro P2000
node: gpu-embed # Quadro P2000, redundant in gpu-pve44 und gpu-pve46
litellm_model: embed-default
base_model: qwen3-embedding-0.6b-q8
max_context: 8192
kind: embedding
ops: {docker_host: gpu-embed-1, container: llamacpp-embed, pve_node: pve3, vmid: "221"} # VM-IDs/Hosts: ANNAHME bis Deployment
ops: {docker_host: gpu-pve44, container: llamacpp-embed, pve_node: pve44, vmid: "244"} # ANNAHME bis Task 3.3
rerank-default:
tier: 1
@@ -78,7 +81,7 @@ slots:
base_model: bge-reranker-v2-m3-q8
max_context: 8192
kind: rerank
ops: {docker_host: gpu-embed-1, container: llamacpp-rerank, pve_node: pve3, vmid: "221"} # VM-IDs/Hosts: ANNAHME bis Deployment
ops: {docker_host: gpu-pve44, container: llamacpp-rerank, pve_node: pve44, vmid: "244"} # ANNAHME bis Task 3.3
# --- Sprachausgabe (ADR-0006) ---
tts-de:
@@ -90,17 +93,17 @@ slots:
base_model: piper-de-thorsten-medium
max_context: 5000 # Zeichen pro Anfrage (TTS-Dienst-Limit)
kind: tts
ops: {docker_host: infra, container: tts-piper, pve_node: pve1, vmid: "101"} # ANNAHME bis Deployment
ops: {docker_host: infra, container: tts-piper, pve_node: pve44, vmid: "101"} # HA: kann nach pve52/pve48 wandern
tts-de-hq:
tier: 1
device: gpu
engine: pytorch
node: gpu-flex # teilt sich die Ada mit tier1-flex; während Training unavailable
node: gpu-flex # teilt sich die Ada mit tier1-flex; unter Windows erst ab Phase 9 (WSL2, D3)
litellm_model: tts-de-hq
base_model: qwen3-tts-1.7b
max_context: 5000
kind: tts
ops: {docker_host: gpu-flex, container: qwen-tts, pve_node: pve-ada, vmid: "202"} # ANNAHME bis Deployment
ops: {docker_host: gpu-flex, container: qwen-tts} # kein Proxmox (D3)
adapters: []