Ma domotique III : Virtualisation

Au début de ma domotique j'étais réfractaire à tout ce qui était virtuel, installant une distribution sur une machine pour chaque besoin, mais ça c'était avant !

Lorsque j'ai commencé la domotique, j'utilisais des Raspberry Pi (W, 2 ou 3), j'installais la distribution Linux qui allait avec et je me tapais des lignes et des lignes de commande pour tenter d'installer le moindre truc et je recommençais du début à chaque plantage. J'étais borné, ne voulant pas entendre parler de machine virtuelle ou de conteneur, croyant que tout serait plus solide si j'installais tout moi même sur une base solide. Bon, ben j'avais tord, quelques années plus tard je ne jure que par des VM et des conteneurs. Bigre.

La virtualisation a pleins d'avantages, facile de sauvegarder, supprimer, restaurer, modifier. Aujourd'hui un petit bout de config, 2 clics et une ligne de commande suffisent à lancer tout ce qu'il faut pour gérer un protocole. Alors dans l'absolue il a fallu préparer en amont des templates et avoir un gestionnaire de container fonctionnel, mais j'ai pris le temps et aujourd'hui je gagne du temps.

Mes choix se sont portés sur la distribution de gestion de VM nommé Proxmox VE dans sa version public, la construction de template de VM à base de Debian, le système de container Docker et le gestionnaire Portainer. J'empile même les deux en mettant un Docker dans un VM. Simple et efficace pour compartimenter les protocoles domotique et pour sauvegarder tout ça. Ces deux gestionnaires ont une interface web plutôt bien réussi ce qui facilite encore plus leurs utilisations.

Interface Proxmox VE
Exemple d'interface web de la distribution Proxmox VE, mars 2024


Interface de Portainer
Exemple d'interface web du gestionnaire Portainer, mars 2024


Aujourd'hui pour faire tourner ma domotique j'ai 12 machines virtuelles embarquant chacune un ou plusieurs Docker, et avec tout ça le processeur de mon serveur n'atteint même pas les 1% d'utilisation. (bon il a 28 cœurs mais quand même) C'est juste hallucinant. L'accumulation de tous ces avantages fait que je ne reviendrais jamais en arrière et que je ne peux que vous conseiller de prendre ce chemin dès le départ.

Avant de commencer les screenshots et les lignes de commande pour préparer tout ça, je vais faire un mini rappel sur certains termes utiliser précédemment :

  • Proxmox : Gestionnaire de machines virtuelles (VM)
  • Debian : Distribution Linux, composée presque exclusivement de logiciels libres
  • Docker : Outil qui peut empaqueter une application et ses dépendances dans un conteneur isolé
  • Portainer : Gestionnaire de conteneur Docker

Vous êtes prêt pour un bon gros pavé ? C'est partie, avec à la fin de ce billet un premier exemple d'utilisation en 3 lignes de commande.

Installation de Proxmox

Proxmox est fait pour travailler en cluster, c'est à dire que vous avez plusieurs machines physiques sur lesquels chaque machine virtuelle est dupliquée. On ne va pas utiliser cette fonctionnalité car on n'en a pas besoin et surtout nous avons besoin des ports USB pour les clefs Zigbee, Zwave et autres, ce qui rend la duplication impossible.
Il existe des centaines du tuto se ressemblant les uns les autres expliquant l'installation de Proxmox. Je vais quand même m'y coller juste pour le plaisir de faire les captures d'écran depuis l'installation de Proxmox sur un VM Proxmox !
Il faut commencer par télécharger l'ISO de Proxmox VE sur le site de Proxmox et la graver sur une clef USB, pour cela j'utilise le logiciel BalenaEtcher. Ensuite insérer la clef USB dans un port du serveur et démarrer le serveur. La procédure d'installation commence.

Promox VE install 01
Promox VE install 01, avr. 2024


On accepte les termes et on choisie le disque. La seule difficulté que j'avais lors de l'installation et d'avoir choisi un raid matériel depuis le bios de ma carte mère et ensuite le faire reconnaitre lors de l'installation de Proxmox. Il a fallu que je choisisse dans les options le Raid 1 zfs en sélectionnant mes deux disques. Rien de bien méchant.

Promox VE install 02
Promox VE install 02, avr. 2024


On choisi la zone horaire.

Promox VE install 03
Promox VE install 03, avr. 2024


On indique le mot de passe root et un email.

Promox VE install 04
Promox VE install 04, avr. 2024


On sélectionne l'interface réseau, le nom de la machine et les IPs. Sur les captures je suis dans un VM de mon réseau de test donc à adapter selon votre configuration.

Promox VE install 05
Promox VE install 05, avr. 2024


On vérifie les informations et on procède à l'installation.

Promox VE install 06
Promox VE install 06, avr. 2024


Une fois l'installation terminé, le serveur reboot. On en a fini avec le serveur. On peut se connecter à l'interface web depuis notre PC. L'IP du serveur est celle vu pendant l'installation auquel il faut ajouté le port 8006. Une alerte nous informe que la connexion n'est pas sécurise, pas grave la machine n'est pas accessible hors de la maison. On entre nos identifiant root et voila.

Promox VE install 07
Promox VE install 07, avr. 2024


Une alerte indique que nous avons pas de licence valide, normal on utilise la version libre. On va tout de suite modifier les sources pour les mises à jour pour ajouter le dépôt No-Subscription et enlever le dépôt Entreprise. Ces réglages sont dans Datacentre -> notre machine -> Updates -> Repositories -> Add.

Promox VE install 08
Promox VE install 08, avr. 2024


Promox VE install 09
Promox VE install 09, avr. 2024


Une fois les dépôts configurer, on remonte dans Updates on clique sur Refresh puis sur Upgrade. Notre machine est à jour. Si le noyau est modifié il faudra surement redémarrer le serveur.

Promox VE install 10
Promox VE install 10, avr. 2024


Voila pour la partie serveur. Il faudra ajouter la gestion des backups. Je ferais peut-être un billet sur l'utilisation de Proxmox Backup Server tel que je l'utilise. C'est bien pratique.

Création du template Debian

Pour ma domotique, j'utilise un template de VM qui me permet de créer des VM en 2 minutes, la base est toujours la même, seuls l'IP et le conteneur Docker changent. Je vais faire dans un premier temps un template uniquement de la distribution puis je le dupliquerais pour faire un second template avec ce qu'il faut pour Docker.
Dans l'interface web de Proxmox, On va dans Datacentre -> notre machine, on clic droit dessus pour ouvrir son menu et on fait Create VM.

PVE Template Install 02
PVE Template, bouton de création VM, avr. 2024


On paramètre maintenant notre machine virtuelle. Dans l'onglet General, on change le VM ID, on va en mettre un assez élevé pour ne pas le mélanger aux autres, je prend 900 pour ce template et on va la nommé, ici ce sera template-debian.

PVE Template Install 03
PVE Template, Onglet général, avr. 2024


Ensuite dans l'onglet OS, on lui indique de ne pas utiliser de média (on va le faire de manière spéciale un peu plus tard), le reste ne change pas.

PVE Tempalte Install 04
PVE Template, Onglet OS, avr. 2024


Ensuite dans l'onglet System, on garde tout par défaut, on va juste cocher la case Qemu Agent.

PVE Template Install 05
PVE Template, Onglet System, avr. 2024


Ensuite dans l'onglet Disks, on va supprimer le disque par défaut. (on va l'ajouter de manière spéciale un peu plus tard)

PVE Template Install 06
PVE Template, Onglet Disks, avr. 2024


On ne touche pas aux onglet CPU et Memory, on pourra les modifier lors de la création de nos VM. Dans l'onglet Network on choisie le Brigde réseau à utiliser et on décoche la case Firewall.

PVE Template Install 07
PVE Template, Onglet Network, avr. 2024


On vérifie que tout est bon et on clic sur Finish.

PVE Template Install 08
PVE Template, Onglet Confirm, avr. 2024


On passe à la seconde phase de la création du template, il va falloir lui ajouter un disque Cloud-init. Pour cela on se rend dans Datacentre -> notre machine -> norte VM (900) -> Hardware, on déroule le menu Add et on sélectionne CloudInit Drive, on utilise le Bus IDE 0 et le Storage local-lvm.

PVE Template Install 09
PVE Template, menu Add hardware, avr. 2024


Toujours sur notre VM 900 on se rend dans la partie Cloud-init et on va modifier le User et son Password. Ces identifiant serviront à se connecter à la machine en SSH par exemple, cette utilisateur aura les droits sudo.

PVE Template Install 10
PVE Template, paramètres Cloud-init, avr. 2024


Dans cette partie on va également configurer le réseau pour utiliser DHCP, même si on le verra par la suite on va assigner une IP à chaque machine virtuelle avant de la démarrer.

PVE Template Install 11
PVE Template, config DHCP, avr. 2024


Maintenant on va ajouter le disque. On utilise le shell de norte interface web Proxmox mais on pourrait utiliser un client SSH.

PVE Template Install 12
PVE Template, node shell, avr. 2024


Et on va enchainer quelques commandes :

  • Tout d'abord on télécharge l'image de l'OS Debian pour KVM
  • On redimensionne l'image (je mets 16G par defaut, on pourra ensuite changer pour chaque machine)
  • On autorise la console (le 900 est le numero de notre template)
  • On importe le disque dans la VM template
  • On scanne les volumes pour les prendre en compte

Ce qui donne dans le shell :

wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2
qemu-img resize debian-12-generic-amd64.qcow2 16G
qm set 900 --serial0 socket --vga serial0
qm importdisk 900 debian-12-generic-amd64.qcow2 local-lvm
qm rescan


On retourne dans la partie dédiée à notre template, dans Hardware il faut ajouter le disque qu'on vient de créer en cliquant dessus puis Add.

PVE Template Install 14
PVE Template, Add unused disk, avr. 2024


Le disque apparait maintenant normalement. Hard Disk (scsi0).

PVE Template Install 15
PVE Template, hardware with disk, avr. 2024


On se déplace dans le menu Options et on va modifier l'ordre de boot en passant le disque scsi0 en second et en cocher sa case Enabled.

PVE Template Install 16
PVE Template, Boot order, avr. 2024


Tout est prêt pour un premier démarrage du template, on se rend dans la console de la VM 900 et on démarre la machine. Ca mouline un moment puis plus rien, il suffit de taper entrer et l'invite de commande apparait.

PVE Template Install 17
PVE Template, console, avr. 2024


Le login et le mot de passe sont ceux indiqués dans la configuration de Cloud-init. On va :

  • Mettre à jour l'OS
  • Installer Qemu
  • L'ajouter au boot

Ce qui donne dans la console :

sudo apt update && sudo apt upgrade -y
sudo apt install qemu-guest-agent
sudo systemctl enable qemu-guest-agent


Sur les dernières versions de Debian, le service SSH n'est pas activé, je l'utilise, donc je vais l'activer de suite :

sudo systemctl enable ssh
sudo systemctl start ssh


Maintenant on va faire un reset de l'ID du template et nettoyer les informations d'initialisation.
A chaque démarrage de la VM de template pour y apporter des modifications, il sera obligatoire de refaire ces lignes de commandes !

sudo su -
cat /dev/null > /etc/900
cat /dev/null > /var/lib/dbus/900
cloud-init clean


Il ne reste plus qu'à arrêter notre template avec un joli :

shutdown -h now


Voila la VM de template Debian est prête à être cloné.

Création du template contenant Docker

Pour la création du second template Docker contenant les outils pour Portainer on va cloner le template Debian qu'on vient de créer et lui apporter les modifications nécessaires.

Pour cela on clic droit sur le template Debian pour afficher le menu et on choisi Clone.

PVE Template Docker Install 01
PVE Template, Docker clone, avr. 2024


On choisi un numéro ID de Vm, comme précédement on en prend un élevé ici 910 puis on lui donne un nom, ici template-docker. On valide. Le clonage prend un peu de temps puis on lance la console de notre nouvelle VM, l'utilisateur et le mot de passe sont ceux donner dans le template Debian.

PVE Template Docker Install 02
PVE Template, Docker console, avr. 2024


On va ensuite enchainer les commandes pour ajouter Docker :

  • Ajout du répertoire de clés pgp
  • Ajout du logiciel pgp
  • Téléchargement de la clé
  • Ajout de la clé
  • Mise à jour des dépôts
  • Installation de Docker et de tout ce qu'on aura besoin pour nos VM
  • Ajout des droits de l'utilisateur sur Docker
  • On se délogue pour prendre en compte les droits

Ce qui donne dans la console :

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
exit

On se relogue sur la console et on ajoute l'agent Portainer qui nous servira sur les futurs VM :

docker run -d -p 9001:9001 --name portainer_agent --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes portainer/agent:2.19.4

Comme on a modifié le template il faut à nouveau le nettoyer :

sudo su -
cat /dev/null > /etc/900
cat /dev/null > /var/lib/dbus/900
cloud-init clean
shutdown -h now


Et voila notre seconde template dédié à docker prêt.

Création de la machine virtuelle Portainer

Ca va aller vite grâce à nos templates !

On va cloner le Template Docker et ensuite lui assigner une IP fixe dans notre réseau. Pour ma part quand c'est possible, l'ID de ma VM sera également l'IP de la machine virtuelle. Pour cela on se rend dans le shell de notre serveur Proxmox (ou en SSH) et on enchaine les deux commandes suivantes :

qm clone 910 120 --name portainer
qm set 120 --ipconfig0 ip=10.1.4.120/23,gw=10.1.4.1
  • Je clone mon template d'ID 910 vers le VM d'ID 120 que je nomme portainer
  • J'assigne à la VM 120 l'IP 10.1.4.120 dans mon réseau

Je ne touche ni à la taille du disque, ni à la taille de la mémoire, ni au nombre de processeur de ma futur VM, les valeurs par défaut du template iront très bien. Maintenant on démarre la VM et on se connecte à la console (ou en SSH vers l'IP qu'on vient d'assigner) le login et le mot de passe sont ceux indiqués lors de la création du tout premier template.
Et on exécute un docker de Portainer :

docker run -d -p 80:8000 -p 443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

Et voila, le gestionnaire de Docker de notre domotique est fonctionnel et est accessible par interface web à l'adresse http://10.4.1.120. (sur le port 80)

Magique.

Dans le prochain billet je présente la VM MQTT qui est le centre d'échange d'informations de ma domotique et l'utilisation de Portainer pour ce premier cas.

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Ajouter un rétrolien

URL de rétrolien : https://chez.jcdenis.fr/trackback/461

Haut de page