Jeedom sur VM, zigbee2mqtt, zwavejs2mqtt

Re,

J’ai eu le temps de chercher un peu. J’ai testé l’installation des containers précédemment cités mais retour en arrière… Ne faut-il pas utiliser docker-compose ? À la manière de ce fichier : https://github.com/balkian/zigbee2mqtt/blob/master/docker-compose.yml
J’ai installé docker-compose et vu quelques vidéos. Plein de choses obscures pour moi mais j’ai compris qu’il fallait qu’il y ait des données persistantes pour sauvegarder les configs (volumes) et des configs pour le réseau, les devices, etc. Je vois en gros le foncitonnement.
Pour Zwave : https://github.com/zwave-js/zwavejs2mqtt/blob/master/docker/docker-compose.yml
Pour Zigbee : Zigbee2MQTT

Je me trompe sur toute la ligne et j’essaie de mettre la charrue avant les bœufs :cow: :cowboy_hat_face: ? J’installe mes containers et je vois ensuite ? Parce que j’ai l’impression qu’il suffit d’une commande pour l’installation et rien d’autre (donc pas grand chose à faire finalement).

Merci pour ton temps :pray:.

Salut,

Quelques infos rapides sur docker/docker-compose :

Techniquement docker-compose c’est juste une notation dans un fichier de ce qu’on fait en ligne de commande :
Par exemple la déclaration d’un volume est présente Zigbee2MQTT

 -v $(pwd)/data:/app/data \

ça monte le répertoire courant $pwd dans à la place de /app/data dans le container

au format docker-compose l’équivalent c’est

      volumes:
        - ./data:/app/data

Après en allant plus loin docker-compose ça permet aussi de monter plusieurs containers d’un coup, de gérer l’ordre de lancement, de faire les build, les stage, les pull etc… dans 1 seul fichier.
L’avantage du docker-compose c’est que ça laisse une trace …la(es) ligne(s) de commande, si elle(s) est(sont) pas notée(s) quelques part, on a vite fait de tout oublier.

Dans l’exemple en lien ci-dessus, il y a pas trop de question à se poser, tout est déjà fait (pas forcement de la manière la plus propre (à cause des privilèges) mais ça marche sans se prendre la tête… La seule difficulté c’est fournir la bonne demi-ligne pour l’usb…

      devices:
        - /dev/ttyACM0:/dev/ttyACM0

La première partie (- /dev/ttyACM0:) peut varier (ça correspond à la clé telle que vu sur la VM). La seconde est fixe (dans le container il n’y a qu’une clé exploitée)

Dernier point, les données sont persistantes dans une certaine mesure sans les volumes car elles sont toujours rattachées au même container, même après arrêt/relance de celui-ci. Par contre, si le container change d’id, il récupère rien de l’ancien (c’est pas les siennes)…
Pour le réseau c’est moins important, il faut juste que zigbee2mqtt et mosquitto soit dans le même pour se joindre facilement. Que ce soit un nouveau à chaque fois ou toujours le même importe pas vraiment

Allez puisque tu as cherché et manifestement compris quelques notions importantes, voilà ce que j’ai chez moi (et adapté pour jeedom)

version: '3.8'
########################################################
networks:
  mqtt:
    name: mqtt
########################################################
services:
  mosquitto:
    restart: unless-stopped
    environment:
      - TIMEZONE=Europe/Paris
      - PUID=33
    container_name: mosquitto
    ports:
      - '1883:1883'
    volumes:
      - '/applications/docker/mqtt/mosquitto/mosquitto.db:/mosquitto/data/mosquitto.db'
      - '/applications/docker/mqtt/mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf'
      - '/applications/docker/mqtt/mosquitto/passwordfile:/passwordfile'
      - '/etc/localtime:/etc/localtime:ro'
      - '/etc/timezone:/etc/timezone:ro'
    image: 'eclipse-mosquitto:latest'
    networks:
      - mqtt
    user: "33:20"
########################################################
  zigbee2mqtt:
    restart: unless-stopped
    depends_on:
      - "mosquitto"
    ports:
      - '8080:8080'
    environment:
      - TIMEZONE=Europe/Paris
    container_name: zigbee2mqtt
    volumes:
      - '/applications/docker/mqtt/zigbee2mqtt:/app/data'
      - '/run/udev:/run/udev:ro'
      - '/etc/localtime:/etc/localtime:ro'
      - '/etc/timezone:/etc/timezone:ro'
    devices:
      - /dev/ttyACM0:/dev/ttyACM0
    privileged: true
    image: 'koenkk/zigbee2mqtt:latest'
    networks:
      - mqtt
    user: "33:20"

Donc mes données persistantes sont dans /applications/docker/mqtt/
A toi d’adapter… pour le contenu de mosquitto.conf et configuration.yaml

2 « J'aime »

C’est super ! Merci vraiment pour tous tes conseils et ces précisions !
Ton fichier docker- compose va m’être d’une grande aide.
Je continue de creuser l’affaire et voir ce que je peux faire pour adapter ça à ma situation !
Je te fais un retour dès que j’ai quelque chose de concluant :smiley:.
Bonne soirée.

Décidemment… Je ne trouve pas la solution.
Je pense que les volumes ne se créent pas correctement (le problème vient certainement de moi).

Par exemple :

    volumes:
      - '/docker/mqtt/mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf'

Devrait créer un chemin sur ma VM indiquant à docker où se trouvent le fichier mosquitto.conf, non ?
Lorsque je fais un sudo docker-compose up, j’ai bien /docker/mqtt/mosquitto/config/mosquitto.conf mais mosquitto.conf est créé comme un répertoire et non un fichier. Il en est de même pour mosquitto.db ou encore mosquitto.log.

L’erreur renvoyée est :


ERROR: for mosquitto  Cannot start service mosquitto: OCI runtime create failed: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: rootfs_linux.go:60: mounting "/docker/mqtt/mosquitto/mosquitto.conf" to rootfs at "/var/lib/docker/overlay2/637e7dafb7db78325368cbdc1feb45febda768c1e2524b2fd1f980230c38ccf1/merged/mosquitto/config/mosquitto.conf" caused: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

ERROR: for mosquitto  Cannot start service mosquitto: OCI runtime create failed: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: rootfs_linux.go:60: mounting "/docker/mqtt/mosquitto/mosquitto.conf" to rootfs at "/var/lib/docker/overlay2/637e7dafb7db78325368cbdc1feb45febda768c1e2524b2fd1f980230c38ccf1/merged/mosquitto/config/mosquitto.conf" caused: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: Encountered errors while bringing up the project.

Je pense comprendre ce que cela veut dire : mosquitto.conf devrait être une fichier mais c’est un dossier sur l’host. L’erreur se répète pour mosquitto.conf.

user@mqtt:/docker/mqtt$ ls -lsha
total 16K
4,0K drwxr-xr-x 4 root root 4,0K avril 11 13:49 .
4,0K drwxr-xr-x 4 root root 4,0K avril 11 12:41 ..
4,0K drwxr-xr-x 3 root root 4,0K avril 11 13:49 log
4,0K drwxr-xr-x 5 root root 4,0K avril 11 13:49 mosquitto

user@mqtt:/docker/mqtt/mosquitto$ ls -lsha
total 20K
4,0K drwxr-xr-x 5 root root 4,0K avril 11 13:49 .
4,0K drwxr-xr-x 4 root root 4,0K avril 11 13:49 ..
4,0K drwxr-xr-x 2 root root 4,0K avril 11 13:49 mosquitto.conf
4,0K drwxr-xr-x 2 root root 4,0K avril 11 13:49 mosquitto.db
4,0K drwxr-xr-x 2 root root 4,0K avril 11 13:49 passwordfile

J’en ai rêvé cette nuit : quelle prise de tête :dizzy_face:.

Je n’ai que mosquitto pour l’instant !

Oui c’est un fichier et pas un répertoire… et voilà ce que ça pourrait contenir

persistence true
log_type debug
persistence_location /mosquitto/data/
per_listener_settings true
allow_anonymous true
password_file /passwordfile

Arrête le conteneur, efface le répertoire, creer un fichier, ajoute le contenu ci-dessus et relance le conteneur

C’est comme ça que ça rentre :muscle:

PS: ça va être la même chose pour le configuration.yaml

Oui, j’avais déjà essayé de créer manuellement mosquitto.conf avant de lancer le docker-compose up mais ça n’a pas fonctionné 1618143158: Error: Unable to open config file /mosquitto/config/mosquitto.conf.
C’est sensé se créer seul ?

PS: ça va être le même chose pour le configuration.yaml

J’ai hâte :rofl:

Et non car données persistantes …

Attention à l’endroit ou tu le crée, si je comprends bien la log :

      - '/docker/mqtt/mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf'

Donc dans /docker/mqtt/mosquitto/config/mosquitto.conf et avec les droits du user dédié à docker

Oui, j’ai bien crée le mosquitto.conf au bon endroit.
J’ai fait une docker-compose rm mosquitto en l’ayant stoppé avant.
J’ai désormais Warning: Persistence file is empty.

/docker/mqtt/mosquitto et dedans différents dossiers : config data log passwordfile. Dans config j’ai mosquitto.conf (j’ai copié-colleé ce que tu as proposé). Dans data j’ai un dossier mosquitto.db crée par docker-compose.

Pour le docker-compose.yml il est à la racine (donc pas dans /docker) tu penses que ça y est pour quelque chose ? (/docker contient seulement le dossier mqtt et ses sous-dossiers).

version: '3.8'
#networks
networks:
  mqtt:
#mosquitto
services:
  mosquitto:
    container_name: mosquitto
    image: eclipse-mosquitto:latest
    restart: unless-stopped
    ports:
       - '1883:1883'
    volumes:
      - '/docker/mqtt/mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf'
      - '/docker/mqtt/mosquitto/data/mosquitto.db:/mosquitto/data/mosquitto.db'
      - '/docker/mqtt/mosquitto/log/mosquitto.log:/mosquitto/log/mosquitto.log'
    networks:
       - mqtt

Tu as d’autres soucis de fichiers/dossiers à tous les coups:

image
Créer les via touch

Non, tu peux mettre le docker-compose.yml n’importe ou …

Du genre me placer dans :

  • /docker/mqtt/mosquitto/config et lancer touch mosquitto.conf
  • /docker/mqtt/mosquitto/data et lancer touch mosquitto.db
  • /docker/mqtt/mosquitto/log et lancer touch mosquitto.log

J’ai testé dans le data :

user@mqtt:/docker/mqtt/mosquitto/data$ sudo touch mosquitto.db
user@mqtt:/docker/mqtt/mosquitto/data$ ls
mosquitto.db

Et il me créé un répertoire mosquitto.db

Quant tu dis :

persistence true
log_type debug
persistence_location /mosquitto/data/
per_listener_settings true
allow_anonymous true
password_file /passwordfile

EDIT : La persistence_location écrite telle quelle est correcte dans mon cas, n’est-ce pas ?

Il faut virer les répertoires ayant les même noms que les fichiers avant…
D’ailleurs, les logs persistants … au début OK, mais après on s’en fiche, tu les as dans l’output du container

Oui je pense avoir fait ça :

user@mqtt:/docker/mqtt/mosquitto/data$ sudo rmdir mosquitto.db
user@mqtt:/docker/mqtt/mosquitto/data$ ls
user@mqtt:/docker/mqtt/mosquitto/data$ touch mosquitto.db
touch: impossible de faire un touch 'mosquitto.db': Permission non accordée
user@mqtt:/docker/mqtt/mosquitto/data$ sudo touch mosquitto.db
user@mqtt:/docker/mqtt/mosquitto/data$ ls
mosquitto.db

EDIT : ok, je n’ai pas touché à ton exemple donc ça devrait être bon.

Attention la config, ça correspond à la vue DANS le conteneur … donc par principe, pas touche au valeurs par défaut

sudo touch mosquitto.db

Tu le fais bien pour le rm …

Je l’ai fait aussi pour le touch ; il y est juste en dessous. C’était un oubli au premier.
Ben en retentant ça a fonctionné avec touch (le fichier est crée).
L’erreur reste identique cependant.

1 « J'aime »

Donc ce Warning: Persistence file is empty. est toujours là malgré la création de mosquitto.db. :exploding_head:

Un warning c’est pas bloquant…
Arrives tu à te connecter au broker désormais ?

J’ai un code erreur 13 mosquitto exited with code 13 et docker-compose ps me renvoie :

  Name                 Command                 State      Ports
---------------------------------------------------------------
mosquitto   /docker-entrypoint.sh /usr ...   Restarting

Pour me connecter au brocker, je dois t’avouer que je ne sais absolument pas… J’ai toujours laissé jMQTT installer mosquitto et pas de config à faire.
J’ai lancé mosquitto_pub -t 'this/is/a/topic' -m 'Hello World!' mais rien à voir non ? mosquitto_pub n’est pas une commande apparemment.

Restarting c’est moyen…
Comme tu as monté les logs en persistants, ça donne quoi dans le contenu ?

Si mais ça impose d’avoir le client installé (ce que fais jMQTT dans les dépendances)… Comme alternative MQTT Explorer c’est pas mal

Rien n’a été écrit dans mosquitto.log, c’est vide.
Je lance l’installation de MQTT Explorer.