Déploiement sur Proxmox VE LXC (passthrough iGPU)

Voie recommandée : hôte PVE → conteneur LXC privilégié → docker dans le conteneur → image SkyView. N'installez pas docker directement sur l'hôte PVE (Proxmox le déconseille officiellement ; cela entre en conflit avec les iptables / apt de PVE). LXC est isolé par espaces de noms avec une surcharge de performance quasi nulle, et le passthrough /dev/dri est presque identique à l'exécution de docker directement sur l'hôte.

1. Matériel pris en charge et variante recommandée

MatérielVariante recommandéeÉtat de l'iGPU
Mini PC N100 / N305 / N355openvinoiGPU Alder Lake-N, /dev/renderD128 disponible
Ancien NUC J4125 / J4105openvinoiGPU Apollo Lake, /dev/renderD128 disponible
i3-i7 11e génération et plus + Iris XeopenvinoMeilleur rapport qualité-prix
Hôte PVE avec GPU NVIDIAcuda ou trtNécessite d'installer le pilote NVIDIA sur l'hôte PVE puis de transmettre /dev/nvidia* au LXC

2. Prérequis (sur l'hôte PVE)

  1. 1

    Vérifier que l'hôte a /dev/dri

    Exécutez ls -la /dev/dri/ dans le shell PVE ; vous devriez voir card0/card1 + renderD128 ; sinon le noyau PVE n'a pas chargé i915, exécutez d'abord modprobe i915

  2. 2

    Télécharger le modèle Debian 12

    Interface web PVE → local → CT Templates → bouton Templates → recherchez et téléchargez debian-12-standard (ou pveam download local debian-12-standard_12.x_amd64.tar.zst)

  3. 3

    Trouver les GID des groupes render/video

    Exécutez getent group render et getent group video dans le shell PVE et notez les GID (par défaut render=104, video=44) ; vous en aurez besoin plus tard pour pct set

3. Créer le conteneur LXC

bash
# Dans le shell de l'hôte PVE : créer un conteneur vmid=101, 4 cœurs, 4 Go de RAM, 40 Go de disque
pct create 101 local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst \
  --hostname yunkan \
  --cores 4 --memory 4096 --swap 1024 \
  --rootfs local-lvm:40 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp,firewall=0 \
  --unprivileged 0 \
  --features nesting=1,keyctl=1 \
  --onboot 1

pct start 101

Doit être privilégié + nesting=1 + keyctl=1

--unprivileged 0 = LXC privilégié, le choix le plus simple pour un usage domestique (exécuter docker dans un conteneur non privilégié nécessite plus de 90 lignes de réglages lxc.conf). nesting=1 permet d'exécuter docker dans le conteneur, et keyctl=1 permet à l'overlayfs de docker de fonctionner.

4. Transmettre l'iGPU au LXC

bash
# Sur l'hôte PVE : transmettre renderD128 et card1 au vmid=101
pct set 101 -dev0 /dev/dri/renderD128,gid=104   # groupe render
pct set 101 -dev1 /dev/dri/card1,gid=44         # groupe video

# Redémarrer le conteneur pour que le passthrough du périphérique prenne effet
pct reboot 101

# Vérification : entrer dans le conteneur et vérifier que /dev/dri existe
pct exec 101 -- ls -la /dev/dri/

5. Installer docker dans le LXC + exécuter SkyView

bash
# Entrer dans le LXC
pct enter 101

# Installer docker
curl -fsSL https://get.docker.com | sh

# Exécuter le script en une ligne de SkyView (sélectionne automatiquement la variante openvino car /dev/dri est détecté)
curl -fsSL https://cdn.yun-kan.com/yunkan-install.sh | bash

À la fin, le script indique l'IP du LXC + le port (par exemple http://10.0.0.148:23406/). Ouvrez cette adresse depuis n'importe quelle machine du même sous-réseau pour accéder à l'assistant de configuration.

6. Mise à jour

La mise à niveau s'effectue dans le LXC (pct enter 101), exactement comme sur un hôte Linux classique — aucune étape spécifique au LXC. Privilégiez la méthode A (mise à niveau en un clic depuis la console web, sans ligne de commande) ; utilisez la méthode B / C pour figer une version précise ou si vous préférez la ligne de commande.

Option A : mise à jour web en un clic (recommandée)

Ouvrez Web Admin → Paramètres → Mise à niveau du système et cliquez sur Mettre à niveau. Le système télécharge la nouvelle image et recrée le conteneur principal automatiquement (un conteneur d'exécution éphémère apparaît pendant la bascule et se supprime une fois terminé). Si la nouvelle version ne démarre pas, retour arrière automatique vers la version précédente — aucune ligne de commande nécessaire. Le socket docker fonctionne normalement dans le LXC : ce chemin est entièrement pris en charge.

Option B : mise à jour en ligne de commande

À utiliser pour maîtriser vous-même le moment de la mise à niveau ou figer une version précise. Entrez dans le LXC puis exécutez dans le répertoire de déploiement (par défaut ~/skyview) :

bash
pct enter 101
cd ~/skyview

# Mettre à jour vers la dernière image pour le tag actuel (latest par défaut) et reconstruire
docker compose -p yunkan -f compose.yml up -d --pull always

Pour épingler une version spécifique, changez d'abord le tag de l'image dans le compose, puis reconstruisez (conservez la même variante — voir l'avertissement ci-dessous) :

bash
cd ~/skyview
# Remplacez 0.9.9 par la version cible
sed -i 's|image: .*/yunkan-.*|image: registry.cn-hangzhou.aliyuncs.com/yunkan/yunkan-openvino:0.9.9|' compose.yml
docker compose -p yunkan -f compose.yml up -d --pull always --force-recreate

Ne changez pas de variante par erreur lors d'une mise à jour

La variante dans le tag de l'image (openvino / cpu / cuda / trt) doit correspondre à l'originale — une installation LXC + passthrough iGPU utilise openvino, et la remplacer par erreur par cpu fait perdre l'accélération matérielle. En cas de doute, exécutez docker ps pour voir si le nom de l'image actuelle contient -openvino ou -cpu. Les volumes data/ et recordings/ sont compatibles entre versions, la migration de la base de données s'exécute automatiquement au démarrage du nouveau conteneur, et la mise à jour ne fait perdre aucune donnée.

Option C : relancer le script d'installation

Le script d'installation est idempotent : le relancer retélécharge l'image, régénère le fichier compose et recrée le conteneur. Idéal pour remettre une ancienne installation au dernier standard (il retire aussi l'ancien conteneur auxiliaire yunkan-updater) :

bash
pct enter 101
curl -fsSL https://cdn.yun-kan.com/yunkan-install.sh | bash

7. Sauvegarde / restauration

  • Snapshot LXC : avant une mise à jour, pct snapshot 101 pre-upgrade-$(date +%Y%m%d) ; en cas de problème, pct rollback 101 <nom-du-snapshot> restaure instantanément tout le conteneur
  • Sauvegarde LXC : vzdump 101 --storage local sauvegarde tout le conteneur (y compris le volume docker) via la sauvegarde standard de PVE ; ou interface web → sélectionnez 101 → Backup
  • Restauration : pct restore <nouveau-vmid> <fichier-de-sauvegarde> restaure à partir d'une sauvegarde
  • ⚠️ Ne détruisez pas puis recréez pour reconstruire : reconstruire le LXC change /etc/machine-id, ce qui fait dériver l'empreinte de licence → elle consomme un nouvel emplacement en boucle. Pour réinitialiser, utilisez toujours pct restore à partir d'une sauvegarde ; ne créez jamais un nouveau conteneur

8. FAQ

/dev/dri n'apparaît pas dans le LXC

Vérifiez que les commandes pct set sont correctes (attention aux numéros de gid selon ce que vous avez réellement trouvé sur votre hôte) ; redémarrez le conteneur avec pct reboot 101 ; si le problème persiste, pct config 101 | grep dev pour voir si la configuration a bien été écrite.

docker run signale une erreur keyctl

Vous avez oublié --features keyctl=1 lors de la création du conteneur. Ajoutez-le : pct set 101 --features nesting=1,keyctl=1, puis pct reboot 101.

Gérer tous vos LXC de manière centralisée

Interface web PVE → Datacenter → sélectionnez le LXC 101 → visualisez CPU/mémoire/disque/réseau ; plus convivial que de se connecter à l'hôte et d'exécuter docker stats.
Déploiement sur Proxmox VE LXC - Documentation SkyView