# Détection environnement Proxmox

**Date:** 2026-01-10
**Version script:** 1.5.0
**Type:** Feature

## Problème

Les systèmes Proxmox VE sont basés sur Debian, donc la détection OS standard affiche simplement "debian" sans distinction entre :
- Un serveur Proxmox VE (hôte hyperviseur)
- Une VM hébergée sur Proxmox
- Un conteneur LXC Proxmox
- Un système Debian standard

## Solution

Ajout d'une détection complète Proxmox dans le script `bench.sh` avec trois nouveaux indicateurs :

### Nouveaux champs collectés

1. **`is_proxmox_host`** (boolean)
   - `true` si le système est un hôte Proxmox VE
   - `false` sinon

2. **`is_proxmox_guest`** (boolean)
   - `true` si le système est une VM ou conteneur hébergé sur Proxmox
   - `false` sinon

3. **`proxmox_version`** (string)
   - Version de Proxmox VE (ex: "8.1.3")
   - Uniquement pour les hôtes Proxmox

4. **`virtualization_type`** (string)
   - Type de virtualisation détecté : `kvm`, `qemu`, `lxc`, `none`, etc.

## Méthodes de détection

### 1. Détection hôte Proxmox

Le script vérifie si le système EST un serveur Proxmox :

```bash
# Méthode 1 : Commande pveversion
if command -v pveversion &>/dev/null; then
    is_proxmox_host="true"
    proxmox_version=$(pveversion 2>/dev/null | grep 'pve-manager' | awk '{print $2}')
fi

# Méthode 2 : Présence du dossier de config Proxmox
if [[ -d /etc/pve ]]; then
    is_proxmox_host="true"
fi
```

**Indicateurs :**
- Commande `pveversion` disponible
- Dossier `/etc/pve` existe (configuration cluster Proxmox)

### 2. Détection guest Proxmox

Le script détecte si le système tourne DANS une VM/conteneur Proxmox :

```bash
# Détection virtualisation
virtualization_type=$(systemd-detect-virt 2>/dev/null || echo "none")

# Si KVM/QEMU détecté
if [[ "$virtualization_type" == "kvm" || "$virtualization_type" == "qemu" ]]; then
    # Vérifier QEMU Guest Agent (installé par défaut sur VM Proxmox)
    if command -v qemu-ga &>/dev/null || systemctl is-active qemu-guest-agent &>/dev/null; then
        is_proxmox_guest="true"
    fi

    # Vérifier DMI pour indicateurs Proxmox/QEMU
    dmi_system=$(sudo dmidecode -t system 2>/dev/null | grep -i "manufacturer\|product")
    if echo "$dmi_system" | grep -qi "qemu\|proxmox"; then
        is_proxmox_guest="true"
    fi
fi

# Si conteneur LXC détecté
if [[ "$virtualization_type" == "lxc" ]]; then
    is_proxmox_guest="true"  # Probablement un CT Proxmox
fi
```

**Indicateurs :**
- Type virtualisation : `kvm`, `qemu`, `lxc`
- Agent QEMU guest présent
- DMI system contient "QEMU" ou "Proxmox"

## Affichage dans le script

Lors de l'exécution du benchmark, les informations Proxmox sont affichées :

```
✅ Collecte des informations système de base
Hostname: debian-vm
OS: debian 13 (trixie)
Kernel: 6.12.57+deb13-amd64
💠 VM/Conteneur Proxmox détecté (type: kvm)
```

Ou pour un hôte Proxmox :

```
Hostname: pve-host
OS: debian 12 (bookworm)
Kernel: 6.8.12-1-pve
🔷 Proxmox VE Host détecté (version: 8.1.3)
```

## Structure JSON collectée

Le script génère un objet JSON `virtualization` dans `SYSTEM_INFO` :

```json
{
  "hostname": "debian-vm",
  "os": {
    "name": "debian",
    "version": "13 (trixie)",
    "kernel_version": "6.12.57+deb13-amd64",
    "architecture": "x86_64"
  },
  "virtualization": {
    "is_proxmox_host": false,
    "is_proxmox_guest": true,
    "proxmox_version": "",
    "virtualization_type": "kvm"
  }
}
```

## Stockage base de données

### Migration 017

Ajout de 3 nouvelles colonnes à `hardware_snapshots` :

```sql
ALTER TABLE hardware_snapshots ADD COLUMN is_proxmox_host BOOLEAN DEFAULT FALSE;
ALTER TABLE hardware_snapshots ADD COLUMN is_proxmox_guest BOOLEAN DEFAULT FALSE;
ALTER TABLE hardware_snapshots ADD COLUMN proxmox_version TEXT;
```

### Modèle SQLAlchemy

```python
# app/models/hardware_snapshot.py
is_proxmox_host = Column(Boolean, nullable=True)
is_proxmox_guest = Column(Boolean, nullable=True)
proxmox_version = Column(String(100), nullable=True)
```

### Schéma Pydantic

Nouvelle classe `VirtualizationInfo` :

```python
# app/schemas/hardware.py
class VirtualizationInfo(BaseModel):
    is_proxmox_host: bool = False
    is_proxmox_guest: bool = False
    proxmox_version: Optional[str] = None
    virtualization_type: Optional[str] = None
```

Et ajout dans `HardwareData` :

```python
class HardwareData(BaseModel):
    cpu: Optional[CPUInfo] = None
    ram: Optional[RAMInfo] = None
    # ...
    virtualization: Optional[VirtualizationInfo] = None
```

## Extraction backend

Dans `app/api/benchmark.py`, extraction des données virtualization :

```python
# Virtualization (support both old and new format)
if hw.virtualization:
    snapshot.virtualization_type = hw.virtualization.virtualization_type
    snapshot.is_proxmox_host = hw.virtualization.is_proxmox_host
    snapshot.is_proxmox_guest = hw.virtualization.is_proxmox_guest
    snapshot.proxmox_version = hw.virtualization.proxmox_version
elif hw.os and hw.os.virtualization_type:
    # Fallback for old format
    snapshot.virtualization_type = hw.os.virtualization_type
```

## Cas d'usage

### 1. Identifier les hôtes Proxmox dans l'inventaire

```sql
SELECT hostname, os_name, proxmox_version
FROM hardware_snapshots
WHERE is_proxmox_host = 1;
```

Résultat :
```
hostname       | os_name  | proxmox_version
---------------|----------|----------------
pve-host-01    | debian   | 8.1.3
pve-host-02    | debian   | 8.0.4
```

### 2. Lister les VM Proxmox

```sql
SELECT hostname, virtualization_type
FROM hardware_snapshots
WHERE is_proxmox_guest = 1;
```

Résultat :
```
hostname       | virtualization_type
---------------|--------------------
debian-vm      | kvm
ubuntu-ct      | lxc
```

### 3. Distinguer Debian standard vs Proxmox

```sql
SELECT
    hostname,
    CASE
        WHEN is_proxmox_host = 1 THEN 'Proxmox Host'
        WHEN is_proxmox_guest = 1 THEN 'Proxmox Guest'
        ELSE 'Debian Standard'
    END as type
FROM hardware_snapshots
WHERE os_name = 'debian';
```

## Référence technique

### systemd-detect-virt

Outil systemd pour détecter la virtualisation :

```bash
$ systemd-detect-virt
kvm

$ systemd-detect-virt --container
none
```

**Valeurs possibles :**
- `kvm` - VM KVM (Proxmox utilise KVM)
- `qemu` - Émulation QEMU
- `lxc` - Conteneur LXC (Proxmox CT)
- `vmware` - VMware
- `virtualbox` - VirtualBox
- `xen` - Xen hypervisor
- `docker` - Conteneur Docker
- `none` - Pas de virtualisation

### pveversion

Commande Proxmox pour afficher la version :

```bash
$ pveversion
pve-manager/8.1.3/b46aac3b42da5d15 (running kernel: 6.8.12-1-pve)

$ pveversion | grep pve-manager
pve-manager/8.1.3/b46aac3b42da5d15
```

### dmidecode -t system

Informations DMI du système :

```bash
$ sudo dmidecode -t system
System Information
    Manufacturer: QEMU
    Product Name: Standard PC (Q35 + ICH9, 2009)
    Version: pc-q35-8.1
```

Sur une VM Proxmox, on voit typiquement "QEMU" comme fabricant.

## Avantages

### 1. Distinction claire des environnements

✅ **Avant :** Tous les systèmes Debian affichaient simplement "debian"
✅ **Après :** Distinction entre hôte Proxmox, guest Proxmox, et Debian standard

### 2. Inventaire précis

✅ Savoir quels serveurs sont des hyperviseurs Proxmox
✅ Identifier les VM/CT hébergés sur Proxmox
✅ Suivre les versions de Proxmox déployées

### 3. Optimisations futures

✅ Benchmarks adaptés (VM vs bare metal)
✅ Métriques spécifiques Proxmox (QEMU agent)
✅ Alertes sur versions Proxmox obsolètes

## Rétrocompatibilité

✅ **Anciens benchmarks** : Nouveaux champs NULL, pas d'impact
✅ **Ancien format JSON** : Le backend supporte l'ancien format avec `os.virtualization_type`
✅ **Nouveaux benchmarks** : Utilise le nouveau format avec objet `virtualization`

## Tester la détection

### Sur une VM KVM

```bash
sudo systemd-detect-virt
# kvm

sudo dmidecode -t system | grep -i manufacturer
# Manufacturer: QEMU

systemctl is-active qemu-guest-agent
# active (si installé)
```

### Sur un hôte Proxmox

```bash
command -v pveversion
# /usr/bin/pveversion

pveversion
# pve-manager/8.1.3/...

ls /etc/pve
# authkey.pub  ceph.conf  corosync.conf  ...
```

### Sur Debian standard

```bash
systemd-detect-virt
# none

command -v pveversion
# (vide, pas de sortie)
```

## Fichiers modifiés

1. **scripts/bench.sh**
   - Ajout fonction `detect_proxmox()` (lignes 268-322)
   - Intégration dans `collect_system_info()` (ligne 343)
   - Affichage des infos Proxmox (lignes 415-426)
   - Ajout objet `virtualization` dans JSON (ligne 407)

2. **backend/migrations/017_add_proxmox_fields.sql**
   - Migration BDD pour nouveaux champs

3. **backend/apply_migration_017.py**
   - Script d'application migration 017

4. **backend/app/models/hardware_snapshot.py**
   - Ajout colonnes BDD (lignes 70-72)

5. **backend/app/schemas/hardware.py**
   - Classe `VirtualizationInfo` (lignes 123-128)
   - Ajout dans `HardwareData` (ligne 191)

6. **backend/app/api/benchmark.py**
   - Extraction données virtualization (lignes 133-141)

## Voir aussi

- [BENCH_SCRIPT_VERSIONS.md](BENCH_SCRIPT_VERSIONS.md) - Historique versions script
- [systemd-detect-virt man page](https://www.freedesktop.org/software/systemd/man/systemd-detect-virt.html)
- [Proxmox VE Documentation](https://pve.proxmox.com/wiki/Main_Page)

---

**Auteur:** Claude Code
**Version:** 1.0
