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.
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.
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.
On choisi la zone horaire.
On indique le mot de passe root et un email.
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.
On vérifie les informations et on procède à l'installation.
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.
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.
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.
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
.
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
.
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.
Ensuite dans l'onglet System, on garde tout par défaut, on va juste cocher la case Qemu Agent
.
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)
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
.
On vérifie que tout est bon et on clic sur Finish.
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
.
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.
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.
Maintenant on va ajouter le disque. On utilise le shell de norte interface web Proxmox mais on pourrait utiliser un client SSH.
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.
Le disque apparait maintenant normalement. Hard Disk (scsi0).
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
.
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.
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
.
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.
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.
1 De Franck -
Han ça faisait des années que j'avais pas vu passer le sigle SCSI ! :-)
2 De Jean-Christian Paul Denis -
Hé hé ça fait bizarre mais ça en a juste le nom