Gladys sur Unraid

Hello,

Je suis de retour, j’ai reçu mes premiers périphériques zigbee et je voulais les tester sur unraid pour voir si cela marchait correctement avant de publier ça à tout le monde et bingo, j’ai des magnifiques beugs qui sont facilement et pas facilement resolvable.

voici mes conteneurs et les map associés et effectivement ça match pas.

gladys-z2m-mqtt ne trouve pas son fichier de configuration de même pour zigbee2mqtt, bref le module zigbee2mqtt ne fonctionne pas directement.

Pour que cela fonctionne, je vois 2 possibilités:

  1. Dechanger le path de base /mnt/user/appdata/Gladys vers la valeur par défaut qui est recommandé par le guide d’installation qui est /var/lib/gladysassistant. Problème : c’est pas une pratique courante chez unraid, les plugins doivent plutot être sur appdata donc on risque d’avoir des difficultés à valider le plugins, et le deuxième obstacle pour moi c’est que je suis pas certains de si lib est sur la clé USB contenant l’OS du NAS ou bien sur les disques du serveur et si c’est la clé USB c’est vraiment pas fou. (Je vais faire un test pour vérifier)
  2. On ajoute une variable au démarrage du docker qui renseigne le path host qui contient le path host de /var/lib/gladysassistant et on configure correctement les dockers mqtt quand on les lances.
    Ou bien docker nous permet de récupérer cette information, je m’y connais pas assez et on utilise alors ce path là (ce qui serait encore mieux)

Voilà je veux bien vos retours !

En tout cas super pour le reste, j’ai bien vu pour le repos, pour la publication j’aurais juste à pm quelqu’un sur le forum d’unraid

Yes c’est une bonne idée, j’ai eu le même retour d’un ami qui vient d’installer Gladys sur un Synology, il a le même souci.

Edit: J’édite mon message, ce que je propose ne marche pas, le SQLITE_FILE_PATH provient de l’intérieur du container. Je pense qu’on a pas le choix, soit on extrait le path du volume mais il faut passer par l’API de docker sur le container actuel (pas forcément simple), ou alors on ajoute une variable d’environnement.

@cicoub13 @AlexTrovato @VonOx Ce débat me dit déjà quelque chose, on s’était dit quoi ?

Ouai on en avait parler, de souvenir la solution pérenne c’est d’utiliser une variable d’environnement en argument du docker run.

1 « J'aime »

Et c’est très facilement configurable sous Unraid :ok_hand:

1 « J'aime »

sinon est ce que ça : How can I find where is the docker container directory in host machine? - Stack Overflow

ça pourrait pas faire l’affaire ?
Je m’y connais pas assez en docker

Le soucis c’est que tu peux avoir plusieurs volumes donc comment reconnaître le bon ?

Le début de discussion liée Zigbee2mqtt : Image docker de test basée Gladys v4 - #267 by cicoub13

@VonOx je comprend pas tu as parfaitement trouvé la solution non ?
Dans ce que je lis je vois que tu arrives à récupérer les paths et le bon path c’est celui qui a côté container /var/lib/gladysassistant non ?
J’ai pas compris pourquoi il fallait une variable après du coup

Non c’est celui de l’hôte justement

Gladys crée des conteneurs et la configuration de ces conteneur ( fichiers persistants)

Sauf que depuis le conteneur on ne sait quelle est le point de montage sur l’hôte.

Jusqu’à présent on avait que du Linux/Mac donc en dur dans le code c’est /var/lib/gladysassistant

A priori unraid est un Linux mais un peu particulier…

La solution ça serai des la création du conteneur gladys de lui indiquer dans une variable quel est le point de montage sur l’hôte et s’en servir pour créer les conteneurs.

Ok c’est ça que je comprend pas bien :

ça correspond au valeur par defaut ? ou à ce qui est actuellement utilisé sur le docker ?
Par ce que si c’est ce qui est actuellement en cours sur le docker c’est facile à récupérer. Donc je suis persuader que je comprend pas bien le problème vu que la solution m’a l’air simple

Bah la c’est simple mais si ton path c’est /ici/toto y’a aucun moyen de deviner que c’est le mount sur l’hôte.

Ça pourrait le faire mais à voir ce que les autres en pensent.

J’essaye d’anticiper les problèmes :grin:

J’ai éditer mon précédent message

Donc si j’applique à mon cas tu obtiens :

[
'/var/run/docker.sock:/var/run/docker.sock',
'/run/udev:/run/udev',
'/dev:/dev',
'/mnt/user/appdata/Gladys:/var/lib/gladysassistant'
]

Sauf qu’il y a en permanence la même chose à droite le /var/lib/gladysassistant/ il change jamais donc c’est ça qui permet de l’identifier non ?

Edit après avoir vu ton edit : oui je suis parfaitement d’accord avec toi, mais toi tu semblais avoir trouver une méthode pour le faire automatiquement correct ou pas ?

En théorie oui ça ne change pas.

Edit: oui l’idée c’est de lister les mount, de chercher /var/lib/gladysassistant et de prendre la valeur à gauche

Le /var/lib/gladysassistant il vient du SQLITE_FILE_PATH, donc je ne dirais pas non plus qu’il bouge jamais, mais oui il est connu dans le code :slight_smile:

Du coup pour récapituler, deux options:

  • Option 1: Extraire le dossier depuis les volumes montés, en trouvant le bon dossier grâce au SQLITE_FILE_PATH
  • Option 2: Variable d’environnement, genre GLADYS_FOLDER_PATH_ON_HOST, ce qui est peut-être plus explicite et plus prédictible. Surtout que dans le cas où on lance Gladys via Syno ou Unraid, on peut très bien ajouter cette variable.

Moi qui utilises UNRAID depuis assez longtemps, je pense que l’option 2 est la meilleure. D’autant qu’il est facile dans le template pour Unraid de commenter les champs à remplir pour guider l ’ utilisteur si besoin

2 « J'aime »

Pour rebondir sur tout ça, je suis allé voir le code pour essayer de voir si je pouvais le faire, mais en fait tout ça est déjà codé du coup je comprend plus rien :sweat_smile:

L’intégration Zigbee2mqtt appelle bien la fonction basePath:

 const { basePathOnContainer, basePathOnHost } = await this.basePath();

Qui elle même retourne bien le path côté host:

Donc je comprend pas pourquoi ça marche pas, le code est là ! :smiley:

@cicoub13 dis moi si ça te dit quelque chose !

En lisant le code j’ai l’impression que c’est inversé, qu’on récupère le path côté container, je me trompe ?

gladys-z2m-mqtt-env.sh ${basePathOnContainer}

C’est normal, cette partie se déroule dans le container.

L’endroit où on définit le volume, c’est ici:

Par contre, il y a quelque chose qui ne veut pas, cette ligne mutate l’objet json global, donc ça fait push à chaque fois que cette fonction est appelée, et ça touche à la variable globale, ça va pas ça

Idem ici ( https://github.com/GladysAssistant/Gladys/blob/master/server/services/zigbee2mqtt/lib/installMqttContainer.js#L34 ), le push mutate l’objet global.

C’est ça qui pose problème tu penses ?