jgcb00
4. März 2022 um 21:02
21
Okay, das ist genau das, was ich nicht ganz verstehe:
Entspricht das den Standardwerten oder dem, was aktuell im Docker verwendet wird?
Denn wenn es das ist, was gerade im Docker läuft, ist es einfach abzurufen. Also bin ich mir sicher, dass ich das Problem nicht richtig verstehe, weil die Lösung mir einfach erscheint.
VonOx
4. März 2022 um 21:06
22
Bah das ist einfach, aber wenn dein Pfad /hier/toto ist, gibt es keine Möglichkeit zu erraten, dass es sich um das Mount auf dem Host handelt.
Das könnte funktionieren, aber man muss sehen, was die anderen dazu sagen.
Ich versuche, Probleme vorherzusehen
Ich habe meine vorherige Nachricht bearbeitet
jgcb00
4. März 2022 um 21:16
23
Also wenn ich das auf meinen Fall anwende, bekomme ich:
[
'/var/run/docker.sock:/var/run/docker.sock',
'/run/udev:/run/udev',
'/dev:/dev',
'/mnt/user/appdata/Gladys:/var/lib/gladysassistant'
]
Aber es steht immer dasselbe rechts, /var/lib/gladysassistant/, es ändert sich nie, also ist das das, was es identifiziert, oder?
Edit nach deinem Edit: Ja, ich bin völlig deiner Meinung, aber du schien eine Methode gefunden zu haben, um das automatisch zu machen, richtig oder falsch?
VonOx
4. März 2022 um 21:20
24
Theoretisch ja, das ändert sich nicht.
Edit: Ja, die Idee ist, die Mounts aufzulisten, nach /var/lib/gladysassistant zu suchen und den Wert links davon zu nehmen.
jgcb00:
Aber es ist immer dasselbe auf der rechten Seite /var/lib/gladysassistant/, es ändert sich nie, also ist das das, was es identifiziert, oder?
Der /var/lib/gladysassistant kommt vom SQLITE_FILE_PATH, also würde ich auch nicht sagen, dass er sich nie ändert, aber ja, er ist im Code bekannt
Zusammengefasst also zwei Optionen:
Option 1: Verzeichnis aus den gemounteten Volumes extrahieren, indem man das richtige Verzeichnis über den SQLITE_FILE_PATH findet
Option 2: Umgebungsvariable, zum Beispiel GLADYS_FOLDER_PATH_ON_HOST, was vielleicht aussagekräftiger und vorhersehbarer ist. Vor allem, weil man in dem Fall, in dem man Gladys über Syno oder Unraid startet, diese Variable sehr gut hinzufügen kann.
guim31
7. März 2022 um 09:09
26
Da ich UNRAID schon seit einiger Zeit verwende, denke ich, dass Option 2 die beste ist. Zumal es im Unraid-Template einfach ist, die auszufüllenden Felder zu kommentieren, um den Benutzer bei Bedarf zu führen.
Um darauf aufzubauen, habe ich den Code angesehen, um zu sehen, ob ich es machen könnte, aber alles ist bereits codiert, also verstehe ich nichts mehr
Die Zigbee2mqtt-Integration ruft tatsächlich die basePath-Funktion auf:
filters: { name: [containerDescriptor.name] },
});
let [container] = dockerContainers;
if (dockerContainers.length === 0) {
let containerMqtt;
try {
logger.info('MQTT broker is being installed as Docker container...');
logger.info(`Pulling ${containerDescriptor.Image} image...`);
await this.gladys.system.pull(containerDescriptor.Image);
// Prepare broker env
logger.info(`Preparing broker environment...`);
const containerDescriptorToMutate = cloneDeep(containerDescriptor);
const { basePathOnContainer, basePathOnHost } = await this.gladys.system.getGladysBasePath();
const mosquittoFolderPath = path.join(basePathOnContainer, '/zigbee2mqtt/mqtt');
const mosquittoConfigFilePath = path.join(mosquittoFolderPath, 'mosquitto.conf');
const mosquittoPasswordFilePath = path.join(mosquittoFolderPath, 'mosquitto.passwd');
logger.info(`Writing Mosquitto config file in ${mosquittoConfigFilePath}`);
const { basePathOnContainer, basePathOnHost } = await this.basePath();
Die wiederum den Host-Pfad zurückgibt:
https://github.com/GladysAssistant/Gladys/blob/master/server/services/zigbee2mqtt/lib/basePath.js#L23
Also verstehe ich nicht, warum es nicht funktioniert, der Code ist doch da!
@cicoub13 sag mir, ob dir das etwas sagt!
VonOx
7. März 2022 um 17:29
29
Beim Lesen des Codes habe ich den Eindruck, dass es umgekehrt ist, dass man den Pfad auf der Container-Seite abruft. Liege ich da falsch?
});
let [container] = dockerContainers;
if (dockerContainers.length === 0) {
let containerMqtt;
try {
logger.info('MQTT broker is being installed as Docker container...');
logger.info(`Pulling ${containerDescriptor.Image} image...`);
await this.gladys.system.pull(containerDescriptor.Image);
// Prepare broker env
logger.info(`Preparing broker environment...`);
const containerDescriptorToMutate = cloneDeep(containerDescriptor);
const { basePathOnContainer, basePathOnHost } = await this.gladys.system.getGladysBasePath();
const mosquittoFolderPath = path.join(basePathOnContainer, '/zigbee2mqtt/mqtt');
const mosquittoConfigFilePath = path.join(mosquittoFolderPath, 'mosquitto.conf');
const mosquittoPasswordFilePath = path.join(mosquittoFolderPath, 'mosquitto.passwd');
logger.info(`Writing Mosquitto config file in ${mosquittoConfigFilePath}`);
gladys-z2m-mqtt-env.sh ${basePathOnContainer}
Das ist normal, dieser Teil läuft im Container.
Der Ort, an dem das Volume definiert wird, ist hier:
if (dockerContainers.length === 0) {
let containerMqtt;
try {
logger.info('MQTT broker is being installed as Docker container...');
logger.info(`Pulling ${containerDescriptor.Image} image...`);
await this.gladys.system.pull(containerDescriptor.Image);
// Prepare broker env
logger.info(`Preparing broker environment...`);
const containerDescriptorToMutate = cloneDeep(containerDescriptor);
const { basePathOnContainer, basePathOnHost } = await this.gladys.system.getGladysBasePath();
const mosquittoFolderPath = path.join(basePathOnContainer, '/zigbee2mqtt/mqtt');
const mosquittoConfigFilePath = path.join(mosquittoFolderPath, 'mosquitto.conf');
const mosquittoPasswordFilePath = path.join(mosquittoFolderPath, 'mosquitto.passwd');
logger.info(`Writing Mosquitto config file in ${mosquittoConfigFilePath}`);
// Ensure that the mosquitto folder exist
await fse.ensureDir(mosquittoFolderPath);
Aber es gibt etwas, das nicht funktioniert: Diese Zeile mutiert das globale JSON-Objekt, wodurch jedes Mal, wenn diese Funktion aufgerufen wird, ein Push erfolgt und die globale Variable verändert wird. Das geht nicht.
VonOx
7. März 2022 um 17:37
33
Glaubst du, dass das das Problem ist?
Ich glaube nicht, dass das hier der Bug ist, aber auf jeden Fall ist sicher, dass dieses Problem Bugs verursacht
Ich habe eine kleine VM gestartet, um das alles zu testen.
Ich habe einen Container mit den folgenden Parametern gestartet:
docker run -d \
// entfernt zur Lesbarkeit
-v /var/lib/gladysassistant_other_folder:/var/lib/gladysassistant \
gladysassistant/gladys:v4
Ich habe Logs hinzugefügt und einen Zigbee2mqtt-Container gestartet, und das ist das Ergebnis:
2022-03-07T18:55:44+0100 <info> installMqttContainer.js:25 (Zigbee2mqttManager.installMqttContainer) MQTT-Broker wird als Docker-Container installiert...
2022-03-07T18:55:44+0100 <info> installMqttContainer.js:26 (Zigbee2mqttManager.installMqttContainer) Pulling eclipse-mosquitto:2-Image...
2022-03-07T18:55:47+0100 <info> installMqttContainer.js:30 (Zigbee2mqttManager.installMqttContainer) Vorbereitung der Broker-Umgebung...
{
basePathOnContainer: '/var/lib/gladysassistant',
basePathOnHost: '/var/lib/gladysassistant'
}
[ '/var/lib/gladysassistant/zigbee2mqtt/mqtt:/mosquitto/config' ]
2022-03-07T18:55:47+0100 <info> installMqttContainer.js:37 (Zigbee2mqttManager.installMqttContainer) Container wird erstellt...
2022-03-07T18:55:47+0100 <info> installMqttContainer.js:51 (Zigbee2mqttManager.installMqttContainer) MQTT-Broker wird neu gestartet...
Der basePathOnHost ist falsch, es gibt einen Fehler in der basePath-Funktion
Ich untersuche das…
Ich komme nicht weiter, nachdem ich Logs hinzugefügt habe. Der Aufruf:
const gladysMounts = await this.gladys.system.getContainerMounts(os.hostname());
Gibt ein leeres Array zurück… Also ist gladysMounts leer und der Standardwert wird angewendet.
Ich setze meine Untersuchung fort.
Ich denke, ich verstehe, die Funktion erwartet eine containerId:
const { PlatformNotCompatible } = require('../../utils/coreErrors');
/**
* @description Return list of mounts for this container.
* @param {string} containerId - Id of the container.
* @returns {Promise} Resolve with list of mounts.
* @example
* const binds = await getContainerMounts('e24ae1745d91');
*/
async function getContainerMounts(containerId) {
if (!this.dockerode) {
throw new PlatformNotCompatible('SYSTEM_NOT_RUNNING_DOCKER');
}
const containers = await this.dockerode.listContainers({
filters: { id: [containerId] },
});
const [container] = containers;
if (!container) {
return [];
Und die Funktion sendet den Hostnamen:
https://github.com/GladysAssistant/Gladys/blob/master/server/services/zigbee2mqtt/lib/basePath.js#L17
Man sollte die ID des aktuellen Containers senden.
Ich habe ein GitHub-Issue mit den Details erstellt:
ouvert 06:10PM - 07 Mar 22 UTC
fermé 09:42AM - 29 Mar 22 UTC
The function here needs the containerId => https://github.com/GladysAssistant/Gl… adys/blob/master/server/lib/system/system.getContainerMounts.js#L10
But instead, sends the os.hostname() =>
https://github.com/GladysAssistant/Gladys/blob/master/server/services/zigbee2mqtt/lib/basePath.js#L17
Discussions here =>
https://community.gladysassistant.com/t/gladys-sur-unraid/6959/37?u=pierre-gilles
Und:
ouvert 06:12PM - 07 Mar 22 UTC
fermé 09:43AM - 29 Mar 22 UTC
Push mutate the global object :
https://github.com/GladysAssistant/Gladys/bl… ob/master/server/services/zigbee2mqtt/lib/installZ2mContainer.js#L37
https://github.com/GladysAssistant/Gladys/blob/master/server/services/zigbee2mqtt/lib/installMqttContainer.js#L34
jgcb00
8. März 2022 um 21:24
39
Vielen Dank für diese Fortschritte,
Mit der Veröffentlichung von 4.8 wird es die Gelegenheit geben, das Update auf Unraid zu testen, da ich keinen Watchtower laufen habe…
Daher warte ich ab, ob es mir vorschlägt, das Docker-Image mit einer neuen zu aktualisieren
Haltet uns auf dem Laufenden! Allerdings sind die Dinge, über die ich im Zusammenhang mit Unraid gesprochen habe (die Fixes in Bezug auf Zigbee2mqtt), nicht in dieser Version 4.8 enthalten, sie werden in der nächsten Aktualisierung verfügbar sein Ich habe heute Morgen daran gearbeitet, aber es war zu spät, um sie in die Version 4.8 einzubauen.
jgcb00
8. März 2022 um 21:29
41
Ja, ich dachte mir schon, dass kein Problem besteht, die Instanz funktioniert auf meiner Seite, wir sind nicht in Eile, je mehr Zeit vergeht, desto wettbewerbsfähiger wird Gladys, also lassen wir ruhig etwas Zeit.
Vielen Dank auf jeden Fall, sehr nett das Update!