Der Test liest Version, Cluster, Nodes, Storages, Bridges, VNets und die effektiven Rechte des Tokens und leitet daraus ab, welcher Vorgang per API, per SSH oder gar nicht geht – je PVE-Version: Template-Bau per API erst ab 8.4 mit import-Storage, Snippets und LXC-Exec nur per SSH. Fehlende Rechte erscheinen einzeln mit Pfad und Zweck; die Rollenliste in docs/proxmox-rechte.md prüft ein Test gegen den Code. SSH-Host-Keys werden wie Zertifikate erst nach Bestätigung genutzt, und bestätigt werden kann nur ein Schlüssel, den der letzte Test gesehen hat. Statussymbole in der GUI sind jetzt gezeichnet: ◐ und ○ fehlen im Web-Subset von JetBrains Mono. Refs #003 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
103 lines
3.0 KiB
Plaintext
103 lines
3.0 KiB
Plaintext
// Datenmodell von ProxDeploy. Namensabbildung zur Vorgabe: siehe CLAUDE.md.
|
||
// Modelle kommen mit dem Issue dazu, das sie braucht – der Plan in docs/architektur.md
|
||
// zeigt das Zielbild.
|
||
|
||
generator client {
|
||
provider = "prisma-client"
|
||
output = "../src/generated/prisma"
|
||
}
|
||
|
||
datasource db {
|
||
provider = "postgresql"
|
||
}
|
||
|
||
enum Rolle {
|
||
ADMIN
|
||
OPERATOR
|
||
}
|
||
|
||
enum Quelle {
|
||
WEB
|
||
CLI
|
||
API
|
||
SYSTEM
|
||
}
|
||
|
||
model Benutzer {
|
||
id String @id @default(cuid())
|
||
benutzername String @unique
|
||
anzeigename String
|
||
email String?
|
||
/// argon2id; leer bei Benutzern, die sich nur per OIDC anmelden.
|
||
passwortHash String?
|
||
oidcSubjekt String? @unique
|
||
rolle Rolle @default(OPERATOR)
|
||
aktiv Boolean @default(true)
|
||
/// Persönliche Standardwerte im Assistenten.
|
||
standards Json?
|
||
erstelltAm DateTime @default(now())
|
||
geaendertAm DateTime @updatedAt
|
||
protokoll Protokoll[]
|
||
}
|
||
|
||
/// Audit-Log. Nur anhängen – ein Trigger verweigert UPDATE und DELETE.
|
||
model Protokoll {
|
||
id BigInt @id @default(autoincrement())
|
||
zeit DateTime @default(now())
|
||
benutzerId String?
|
||
benutzer Benutzer? @relation(fields: [benutzerId], references: [id], onDelete: SetNull)
|
||
quelle Quelle
|
||
aktion String
|
||
ziel String?
|
||
details Json?
|
||
ip String?
|
||
|
||
@@index([zeit])
|
||
@@index([benutzerId, zeit])
|
||
}
|
||
|
||
model Einstellung {
|
||
schluessel String @id
|
||
wert Json
|
||
geaendertAm DateTime @updatedAt
|
||
}
|
||
|
||
/// Ein Proxmox-VE-Einzelhost oder -Cluster. Geheimnisse liegen AES-256-GCM-verschlüsselt (v1.…).
|
||
model Server {
|
||
id String @id @default(cuid())
|
||
/// Kurzname, auch für die CLI (`--server rz1`).
|
||
name String @unique
|
||
/// Anzeigename, z. B. „Rechenzentrum 1“.
|
||
titel String
|
||
/// https://host:8006
|
||
url String
|
||
/// user@realm!tokenid
|
||
tokenId String
|
||
tokenGeheimnis String
|
||
/// Aus: nur ein gepinnter Fingerprint zählt. An: Systemvertrauen (+ optional Pin).
|
||
tlsPruefen Boolean @default(false)
|
||
/// SHA-256 des Serverzertifikats, Großbuchstaben mit Doppelpunkten.
|
||
fingerabdruck String?
|
||
sshAktiv Boolean @default(false)
|
||
sshBenutzer String @default("root")
|
||
sshPort Int @default(22)
|
||
sshPrivat String?
|
||
sshOeffentlich String?
|
||
/// Gepinnte Host-Keys je Node: { "pve01": "SHA256:…" }.
|
||
sshHostSchluessel Json?
|
||
templateVmidVon Int @default(9000)
|
||
templateVmidBis Int @default(9999)
|
||
gastVmidVon Int @default(100)
|
||
/// Statische Adresse für die Template-Vorbereitung ohne SSH: { bridge, vlan, ip, gateway }.
|
||
bauNetz Json?
|
||
/// Standard-Node, -Storage, -Bridge für den Assistenten.
|
||
standards Json?
|
||
/// Bericht des letzten Verbindungstests inkl. Fähigkeiten (VerbindungsBericht, #003).
|
||
letzterTest Json?
|
||
erreichbar Boolean?
|
||
pveVersion String?
|
||
geprueftAm DateTime?
|
||
erstelltAm DateTime @default(now())
|
||
geaendertAm DateTime @updatedAt
|
||
}
|