[Tuto] Installer HAOS sur Proxmox avec Z2M et MQTT (Full SSL/TLS - Lets Encrypt)

L’idée de ce tutoriel est de regrouper un peu toutes les infos que j’ai pu trouver pour l’installation de HAOS, Z2M et MQTT sur des VM séparés au sein de Proxmox et le tout en full SSL/TLS (Lets encrypt) sur ce type de machine :
https://www.backmarket.fr/fr-fr/p/hp-prodesk-600-g3-mini-core-i5-25-ghz-ssd-256-go-ram-16-go/6d624d2f-519a-4eee-b8be-0a8787ce95dc

La séparation des différents rôles ici est que j’aime bien avoir un serveur par rôle et aussi que je souhaite pouvoir connecter à l’avenir un HAOS de test sur le serveur MQTT. Je n’ai pas encore étudié la chose par contre :upside_down_face:

Pensez également à appairer vos équipements à l’emplacement final et non juste à côté de votre émetteur.

J’utilise cette version pour la clé Zigbee :
https://www.amazon.fr/dp/B09KXTCMSC
J’étais partie sur le modèle ci dessous mais j’ai rencontré quelques petits soucis (Perte de communication au bout d’un certains temps avec les modules par exemple (Je l’utiliserai lorsqu’elle ne sera plus en experimental dans Zigbee2mqtt :

Passons aux choses sérieuses :grin:

Installation proxmox

L’installation de proxmox reste simple, il suffit d’installer la dernière version de proxmox via une clé usb ou un lecteur DVD en USB en ayant bien sur pris le soin d’y mettre l’ISO de proxmox

Concernant la partie accès en HTTPS, il faut :

Dans la partie ACME cliquez sur Add :


Remplir tout les champs et cliquez sur Register
image
Sur la partie Challenge Plugins cliquez sur Add
image
Vue que proxmox n’est pas censé avoir de ports ouvert depuis l’extérieur, privilégiez plutôt une méthode via DNS, voici un exemple avec infomaniak. Une fois remplie, cliquez sur OK
image

Ne pas oublier de modifier le mot de passe du compte root et d’activer le MFA sur ce compte.
Pour ceci, tout ce passe dans la partie permission. Ici rien de compliqué, je ne vais pas détailler
image

Exécutez ensuite le script Proxmox VE 7 Post Install et répondez Yes à toutes les questions.

image

Configuration SMTP Proxmox

Afin de pouvoir recevoir les emails de notre serveur proxmox, il est nécessaire de configurer un serveur SMTP, au moins pour les emails de backups.
Procéder en tapant les commandes suivantes : (Exemple avec Infomaniak), n’oubliez pas de modifier le serveur, le nom d’utilisateur et le mot de passe

apt install libsasl2-modules
nano /etc/postfix/sasl_passwd
mail.infomaniak.com youremail@gmail.com:votremotdepasse
postmap hash:/etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd
nano /etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version

compatibility_level = 2

myhostname=proxmox.xxx.local.srv-home.fr

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 127.0.0.0/8
inet_interfaces = loopback-only
recipient_delimiter = +

# Adding gmail compatibility

relayhost = mail.infomaniak.com:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/Entrust_Root_Certification_Authority.pem
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
smtp_tls_session_cache_timeout = 3600s
postfix reload
apt install postfix-pcre
nano /etc/postfix/smtp_header_checks
/^From:.*/ REPLACE From: Proxmox <monemail@srv-home.fr>
postmap /etc/postfix/smtp_header_checks
nano /etc/postfix/main.cf
smtp_header_checks = pcre:/etc/postfix/smtp_header_checks
sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
nano /etc/postfix/sender_canonical_maps
postmap  /etc/postfix/sender_canonical_maps

Permet de faire partir tout les emails avec ce compte

/.+/    monemailemettrice@srv-home.fr
systemctl restart postfix.service

Test envoi email

echo "Email à partir de Postfix du PVE" | mail -s "Test par Postfix" monemailreceptrice@srv-home.fr

Installation HAOS en VM

Exécutez le script Home Assistant OS VM

image

Indiquez les paramètres que vous souhaitez mettre à la VM, personnellement j’ai laissé les paramètres par défaut
J’ai juste modifié le CPU en le passant à host et modifié le nom de la VM en haos
image

Redirigez les ports 80 et 443 vers votre VM depuis votre routeur/box afin d’y accéder depuis l’extérieur et permettre à Let’s Encrypt de générer/renouveler le certificat (Je ne traite pas ici la manière de faire avec les DNS car mon installation est accessible de l’extérieur).

Faites pointer un nom de domaine externe exemple toto.srv-home.fr vers l’IP de votre box/routeur au niveau des DNS public.

Suivre les étapes du 1er démarrage de HAOS et prenant bien soin d’activer également le MFA sur le compte que vous venez de créer

Installez ensuite NGINX Home Assistant SSL proxy et Let’s Encrypt depuis les modules complémentaires d’HAOS et configurer les avec le domaine toto.srv-home.fr en suivant la doc officiel :wink:

Installation Mosquitto (Mqtt)

Installer une VM sous ubuntu 22.04, mettez la complétement à jour et lancez les commandes suivantes :

***sudo apt install -y mosquitto mosquitto-clients**
**sudo systemctl enable mosquitto.service**
**sudo nano /etc/mosquitto/mosquitto.conf**
sudo mosquitto_passwd -c /etc/mosquitto/passwd z2m
**nano /etc/mosquitto/mosquitto.conf**
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /var/run/mosquitto/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

port 1883 localhost
allow_anonymous false
password_file /etc/mosquitto/passwd
tls_version tlsv1.3

listener 8883
certfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/cert.pem
cafile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/chain.pem
keyfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/privkey.pem

listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/cert.pem
cafile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/chain.pem
keyfile /etc/letsencrypt/live/mqtt.xxx.local.srv-home.fr/privkey.pem

include_dir /etc/mosquitto/conf.d

Activez le SSL : (A adapter en fonction du plugin que vous utilisez pour récupérer le certificat de votre nom de domaine) Ici il s’agit d’un exemple avec infomaniak

apt install certbot
apt install python3-pip
pip install certbot-dns-infomaniak
export INFOMANIAK_API_TOKEN=xxx
certbot certonly \
  --authenticator dns-infomaniak \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --agree-tos \
  --rsa-key-size 4096 \
  -d 'mqtt.xxx.local.srv-home.fr'

Par défaut, certbot installe un service qui renouvelle périodiquement ses certificats automatiquement. Pour ce faire, la commande doit connaître la clé API, sinon elle échouera silencieusement.

Afin d’activer le renouvellement automatique de vos certificats génériques, vous devrez modifier /lib/systemd/system/certbot.service. Ajoutez-y la ligne suivante dans Service, en remplaçant <YOUR_API_TOKEN> par votre jeton :

Environment="INFOMANIAK_API_TOKEN=<YOUR_API_TOKEN>"

Ensuite ouvrez le fichier de config

nano /etc/letsencrypt/renewal/xxx.conf

Ajouter

renew_hook = systemctl reload mosquitto
chmod -R 755 /etc/letsencrypt/live
chmod -R 755 /etc/letsencrypt/archive
sudo systemctl restart mosquitto

Installation Zigbee2mqtt

Installer une VM sous ubuntu 22.04, mettez la complétement à jour et suivre la procédure suivante :

Voici mon fichier /opt/zigbee2mqtt/data/configuration.yaml à titre d’exemple, il faut modifier le auth_token qui vous permettra de vous connecter à l’interface web ainsi que le mot de passe de l’utilisateur z2m que l’on a mis précédemment lors de l’installation de MQTT

homeassistant: true
permit_join: true
mqtt:
  base_topic: zigbee2mqtt
  server: mqtts://mqtt.xxx.local.srv-home.fr:8883
  user: z2m
  password: achanger
  keepalive: 60
  reject_unauthorized: true
  version: 4
  include_device_information: true
serial:
  port: >-
    /dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0
advanced:
  pan_id: GENERATE
  network_key: GENERATE
  channel: 25
  homeassistant_legacy_entity_attributes: false
  legacy_api: false
  legacy_availability_payload: false
  log_level: info
  log_syslog:
    app_name: Zigbee2MQTT
    eol: /n
    host: localhost
    localhost: localhost
    path: /dev/log
    pid: process.pid
    port: 514
    protocol: udp4
    type: '5424'
  last_seen: ISO_8601
frontend:
  port: 443
  host: 0.0.0.0
  url: https://z2m.xxx.local.srv-home.fr
  ssl_cert: /etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/fullchain.pem
  ssl_key: /etc/letsencrypt/live/z2m.xxx.local.srv-home.fr/privkey.pem
  auth_token: amodifier
device_options:
  legacy: false
availability:
  active:
    timeout: 20
  passive:
    timeout: 360

Lorsque vous avez intégré tout vos équipements, pensez a bien passer permit_join: true à permit_join: false et à redémarrer Zigbee2mqtt

Activer le SSL : (A adapter en fonction du plugin que vous utilisez pour récupérer le certificat de votre nom de domaine) Ici il s’agit d’un exemple avec infomaniak

apt install certbot
apt install python3-pip
pip install certbot-dns-infomaniak
export INFOMANIAK_API_TOKEN=xxx
certbot certonly \
  --authenticator dns-infomaniak \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --agree-tos \
  --rsa-key-size 4096 \
  -d 'z2m.xxx.local.srv-home.fr'

Par défaut, certbot installe un service qui renouvelle périodiquement ses certificats automatiquement. Pour ce faire, la commande doit connaître la clé API, sinon elle échouera silencieusement.

Afin d’activer le renouvellement automatique de vos certificats génériques, vous devrez modifier /lib/systemd/system/certbot.service. Ajoutez-y la ligne suivante dans Service, en remplaçant <YOUR_API_TOKEN> par votre jeton :

Environment="INFOMANIAK_API_TOKEN=<YOUR_API_TOKEN>"
nano /etc/letsencrypt/renewal/z2m.oullins.local.srv-home.fr

Ajouter (Si vous avez une astuce pour intégrer un reload je suis preneur :slight_smile:

renew_hook = systemctl restart zigbee2mqtt
chmod -R 755 /etc/letsencrypt/live
chmod -R 755 /etc/letsencrypt/archive

Dans le fichier /etc/systemd/system/zigbee2mqtt.service j’ai du remplacer User=pi par User=root. J’e n’ai pas trouvé de moyen de faire autrement pour le moment mais si vous avez une idée pour le faire tourner avec un utilisateur avec moins de droits, je suis preneur également :wink:

sudo systemctl restart zigbee2mqtt

Zigbee2mqtt doit être maintenant disponible à l’adresse https://z2m.xxx.local.srv-home.fr en indiquant bien le mot de passe que vous avez mis dans auth_token

Faire communiquer MQTT et HAOS

Il faut configurer l’intégration MQTT comme ceci :


image

Il ne vous reste plus qu’a intégrer des équipements auprès de Zigbee2Mqtt et ils devraient remonter automatiquement :

image

Voilà, j’espère ne rien avoir oublié car j’ai construis ce tutoriel sur les différentes notes que j’ai pu prendre tout au long de mon installation.

N’hésitez pas à me faire remonter vos remarques/suggestions/idées/problèmes afin d’améliorer ce tutoriel si vous êtes amener à vous en servir ou pas d’ailleurs :wink:

Edit 04/06/2023 : Bien configurer les disques des VM installé avec l’option Write through pour le cache
CF : Installing Home Assistant OS using Proxmox 8 - #968 by nickrout - Community Guides - Home Assistant Community
image

Edit 14/08/2023 : Lors de mon second jour de vacance (J’étais loin de chez moi :frowning: ), j’ai eu un problème de coupures réseaux avec proxmox avec ce type d’erreur :

e1000e 0000:00:1f.6 eno1: Reset adapter unexpectedly

Application du correctif trouvé ici : e1000e:reset adapter unexpectedly | Proxmox Support Forum

apt install ethtool
ethtool -K eno1 tso off gso off gro off

Pour l’appliquer au prochain reboot

nano /etc/network/interfaces
iface eno1 inet manual
    # ... existing lines
    post-up /sbin/ethtool -K $IFACE tso off gso off gro off
10 « J'aime »

Salut. Merci pour ce super Tuto qui m’étonne ne pas avoir plus de succès.

Petite question pour Mqtt et z2m pourquoi ne pas passer par les conteneurs proxmox plutôt qu’une VM complète. Ne serait ce pas plus sobre en ressources?

Merci.

1 « J'aime »

Salut,

Merci pour le compliment :slight_smile:
Pour répondre à ta question, j’ai vu qu’il y avait des petits problèmes apparement avec LXC :
https://forum.hacf.fr/t/lxc-zigbee2mqtt/22000/18

J’ai donc souhaité partir sur une installation ou j’aurai le moins de problèmes possible :slight_smile:

1 « J'aime »

Super tuto Merci :+1:

1 « J'aime »

Petite édition du message suite à un problème réseau rencontré durant mes vacances :frowning:

Salut @prohand,

Merci pour ce tuto très complet, reste plus qu’à installer nodered en // et ton zigbee sera 100% autonome. :wink:

J’ai pour ma part fais un truc quasi équivalent mais qui je pense est un peu moins propre que toi.

J’avais déjà :

  • Proxmox en version 7.x
  • 1x container LXC avec portainer dans lequel j’ai 3 stack, à savoir nginx-proxy manager, duckdns et domoticz
  • 1x VM pour HAOS basé sur le script de TTECK avec en add-on Mosquitto et Zigbee2mqtt via une clé Deconz et une trentaine de device zigbee.
  • 1x container LXC pour Nodered basé sur le script de TTECK
  • 1x container LXC pour MaxiaDB basé sur le script de TTECK
  • 1x container LXC pour InfluxDB base sur le script de TTECK

Je viens de créer aujourd’hui :

  • 1x container LXC pour le broker MQTT basé sur le script de TTECK
  • 1x container LXC pour zigbee2mqtt également basé sur le script de TTECK avec une clé sonoff ZBDongle-P en parallèle de ma clé Deconz pour justement tester la fiabilité.

Du coup par rapport à toi j’ai rien en https car tout est en local, le reverse proxy se chargeant de la redirection et je n’ai pas implémenté les mails.

1 « J'aime »

Bonjour @neuvidor j’ai hate d’avoir ton retour sur les lxc pour mqtt et z2m.
Car je souhaite faire sous proxmox une vm haos et lxc mqtt et lxc z2m.
Sur le lxc z2m tu as pris le template debian ou alpine ?

J’ai pris Debian car j’avoue qu’avec mon faible niveau, c’était la première fois que j’ai rencontré le terme Alpine…

Pourquoi attends-tu mon retour, c’est l’avantage de proxmox, tout mettre en // :wink:. Bon après il faut quand même 2 clés zigbee, mon cas.

@Neuvidor

Je te rassure je n’ai pas un niveau élevé en linux non plus.

Pour l’instant je suis sur une debian 11 qui tourne sur un vieux portable avec Ha supervised et tout en addons, mais je veux séparer tout cela sous promox car j’ai fait l’acquisition d’un elitedesk.

C’était le retour de zigbee2mqtt en lxc j’ai vu dans des posts que certains avaient des crash du lxc.

Bonjour,
Je reviens vers toi je n’ai pas eu le temps de me lancer vers la migration de mon installation sur l’elitedesk.
Pour les lxc zigbee2mqtt et mosquitto as-tu eu des soucis comme certain on remonté?

Alors pour le moment zigbee2mqtt et mosquitto tournent toujours mais je n’ai pas réellement fait de test, j’ai juste mis un capteur de mouvement dessus et laissé tourné.

Bonjour à tous,

Merci pour le tuto.
J’utilise Nginx Proxy Manager en LXC notamment pour mon HA.

@Neuvidor: Quand tu dis « reverse proxy se chargeant de la redirection » dans ton post, peux-tu m’expliquer stp ?

Aujourd’hui, je souhaite mettre en place la même chose (dans le but de sécurisé au maximum mon installation) mais j’ai l’impression que je dois créer des sous-domaines avec OVH, ce que je ne souhaite pas faire.

Merci.
Aurel

Salut, je ne comprends pas ce que tu veut faire en fait avec nginx?

Salut,

J’utilise actuellement NGINX pour mon HA pour un accès depuis l’extérieur.

Je veux sécuriser mes connexions à mes serveurs (passer en https) et je voulais voir si je pouvais utiliser les certificats NGINX pour faire cela ?

Oui tout a fait quand tu rentre ta connexion pour ha il faut dans certificat et le tour est joué

bonjour, je m excuse de m incruster sur ce fil mais en cherchant des tutos pour proxmox je suis tomber sur celui ci qui m interressait un peu plus car etant aussi chez infomanaik il m est difficile de faire pointer mon nom de domaine sur ma freebox, ou plus precisemment sur mon HA en proxmox, avec mon telephone avec un reseau free je tombe systematiquement sur l erreur DNS_PROBE_POSSIBLE
je voulais savoir si tu avais une freebox
si jutilise le nom de domaine de free, c est ma compagne qui ne peut pas se connecter avec son telephone sfr, je me casse la tete depuis quelques jours…

Hello,

Il faut que tu fasses pointer ha.tondomaine.fr sur l’ip de ta freebox qui doit être en ip fixe et faire une règle de NAT au niveau de ta freebox pour rediriger le port 443 vers l’ip interne de ton ha
Avec ceci tu devrais pouvoir accéder à ton ha depuis l’extérieur (via la 4g de ton mobile par exemple)

il faut surtout vérifier que tu possèdes bien une ipv4 fullstack et non pas une ip en cg-nat (ip partagée entre plusieurs abonnés free)

Merci de ta reponse,
comme je l ai dit avec mon téléphone free ca marche tres bien avec un nom de domaine freebox.os, mais ma compagne n’arrive pas a y acceder
j ai lut sur le forum et ailleurs c est a cause d une histoire d’ipv6/ipv4… apparemment le port 443 en cause si j ai bien tout compris
donc avec le nom de domaine free pas de probleme de redirection.
je suis bien en full stack
par contre en utilisant mon nom de domaine infomaniak je n ai pas reussit a faire marcher pour mon telephone et apparement ma compagne non plus
erreur de dns apparement, mais j ai pas tout compris… DNS_PROBE_POSSIBLE
avec frebox elle envoit bien les données de compagnion avec son telephone mais impossible d y acceder…
apparement , infomaniak appel l ipv6 de home assistant il ne veut pas d ipv4 de la box
du coup avec mon tel free ca ne marche qu en local mais pas sur leur réseau telephonique…

J’allais le dire tu es confronté a un soucis de résolution IPv6 les noms de domaine freeboxos résolvent l’ipv4 publié mais aussi l’IPv6 de ta box et suivant les opérateurs mobiles l’ipv6 n’est pas toujours implémenté (donc ça vas bien chercher l’ipv4)
Mais pas contre avec infomaniak ça devrait fonctionner sans soucis mais a toi de paramétrer ton ipv4 publique
Attention l’IPv6 ne fonctionne pas de la même façon déjà il n’y a pas de nat donc chaque machine à sa propre ip

1 « J'aime »