homebridge im docker

Begonnen von Elektrolurch, 29 November 2024, 13:18:16

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo zusammen,

ich habe in den letzten Wochen einige Pakete in den docker übernommen, dass hat auch geklappt. Leidr aber nicht für homebridge mit der fhem - Erweiterung. homebridge und fhem - plugin starten, lesen auch die config und die fhem - devices ein, sehe ich im log - File, aber die homebridge ist von den Apple - Geräten mit der home - App  nicht erreichbar. Das ärgerliche ist dann auch noch, dass in der Home - App die Geräte / Raum Zuordnung verloren geht. Angeblich sind die ja  im Verzeichnis .homebridge/accessories und .homebridge/persist gespeichert. Kann das aber nicht bestätigen, wenn ich in der Home - App was ändere, ändert sich nicht das Datum der Ordner.
Auch funktioniert es nicht, die Instanz mit dem Nutzer fhem:dialout zu starten, dann kommt der Fehler, dass npm bestimmte Dateien in .npm nicht schreiben kann.
Hier der ./run.sh - Befehl, mit dem ich die docker - Instanz initialisiere:
#!/bin/sh

# Skriptname und Hinweis ausgeben
echo "Skriptname: $0"
echo "Hinweis: Dieses Skript installiert Homebridge mit der FHEM-Erweiterung in Docker."

# UID und GID ermitteln
FHEM_UID=$(id -u fhem 2>/dev/null)
DIALOUT_GID=$(getent group dialout | awk -F: '{print $3}')

# echo "Ermittelte UID für fhem: $FHEM_UID"
# echo "Ermittelte GID für dialout: $DIALOUT_GID"

# Prüfen, ob UID und GID gültig sind
# if [ -z "$FHEM_UID" ] || [ "$FHEM_UID" -le 0 ] || [ -z "$DIALOUT_GID" ] || [ "$DIALOUT_GID" -le 0 ]; then
#    echo "Fehler: UID für fhem oder GID für dialout ist ungültig. Abbruch."
#     exit 1
# fi

if [ ! -d "/hdd/sda4/docker/homebridge/config" ] || \
   [ ! -d "/hdd/sda4/docker/homebridge/data" ] || \
   [ ! -d "/hdd/sda4/docker/homebridge/logs" ]; then
    echo "Fehler: Ein oder mehrere erforderliche Verzeichnisse fehlen."
    exit 1
fi

#    --user ${FHEM_UID}:${DIALOUT_GID} \
# -v /hdd/sda4/docker/homebridge/logs:/var/log/homebridge \
#    -p 8581:8581 \
#    -p 51826:51826 \
#    -p 52000-52100:52000-52100 \
   



# Homebridge-Container starten
docker run -d \
    --name homebridge \
    --restart on-failure:3 \
    --network=host \
-v /hdd/sda4/docker/homebridge/config:/home/homebridge/.homebridge \
    -v /hdd/sda4/docker/homebridge/data:/homebridge/data \
    -v /hdd/sda4/docker/homebridge/logs:/var/log/homebridge \
    -v /hdd/sda4/docker/homebridge/npm-cache:/home/homebridge/.npm \
    homebridge/homebridge || {
        echo "Fehler: Docker-Container konnte nicht gestartet werden."
        exit 1
    }

# Überprüfen, ob Homebridge korrekt gestartet wurde
if [ $? -eq 0 ]; then
    echo "Homebridge erfolgreich gestartet. Plugin für FHEM wird installiert."
    # docker exec -it homebridge npm install -g homebridge-fhem
docker exec homebridge npm install -g homebridge-fhem

    # Überprüfen, ob die Installation des Plugins erfolgreich war
    docker exec homebridge homebridge --plugin-path /usr/local/lib/node_modules/homebridge-fhem || {
    echo "Fehler: FHEM-Plugin wird nicht korrekt geladen."
    exit 1
}

if [ $? -eq 0 ]; then
        echo "FHEM-Erweiterung erfolgreich installiert."
exit 0
    else
        echo "Fehler bei der Installation der FHEM-Erweiterung."
        exit 1
    fi
else
    echo "Fehler beim Starten von Homebridge."
    exit 1
fi

Jemand eine Idee?

Elektrolurch
 
configDB und Windows befreite Zone!

passibe

#1
Woher hast du dieses Skript?
Ehrlich gesagt ist das nicht wirklich gut. Besser ist es, das ordentlich zu machen und mit docker compose zu arbeiten. Würde mal annehmen, dass es dazu irgendwo ein Tutorial gibt.

Nun zu den Problemen:

Dass das nicht mit dem Benutzer läuft ist logisch, denn beim Start des Containers sagst du ja nur
Zitat von: Elektrolurch am 29 November 2024, 13:18:16# Homebridge-Container starten
docker run -d \
    --name homebridge \
    --restart on-failure:3 \
    --network=host \
-v /hdd/sda4/docker/homebridge/config:/home/homebridge/.homebridge \
    -v /hdd/sda4/docker/homebridge/data:/homebridge/data \
    -v /hdd/sda4/docker/homebridge/logs:/var/log/homebridge \
    -v /hdd/sda4/docker/homebridge/npm-cache:/home/homebridge/.npm \
    homebridge/homebridge || {
        echo "Fehler: Docker-Container konnte nicht gestartet werden."
        exit 1
    }
und eben nicht – wie im auskommentierten Teil – zusätzlich noch
Zitat von: Elektrolurch am 29 November 2024, 13:18:16#    --user ${FHEM_UID}:${DIALOUT_GID} \

Ob es sinnvoll ist, das unter dem FHEM-Benutzer laufen zu lassen oder man dafür nicht einen gesonderten Benutzer anlegen sollte, ließe sich übrigens auch noch überlegen. Ich bin mir darüber hinaus gar nicht so sicher, ob homebridge es überhaupt unterstützt mit non-root gestartet zu werden, das müsstest du auch nochmal nachschauen bzw. ausprobieren.

Dann dazu:
Zitat von: Elektrolurch am 29 November 2024, 13:18:16aber die homebridge ist von den Apple - Geräten mit der home - App  nicht erreichbar
Es ist also nicht erreichbar. Wird die Instanz denn überhaupt richtig über Bonjour/Zeroconf/mDNS announced? Kannst du am Mac z.B. mit der App "Discovery" überprüfen.
Parallel bitte auch mit
sudo ss -tlpn | grep LISTENüberprüfen, ob Homebridge überhaupt Ports öffnet und lauscht. Normalerweise sind das TCP-Ports irgendwo im >50000er-Bereich und 8581 für das Webinterface. Ggfs. musst du das auch mit der Ausgabe von docker inspect abgleichen (unter "ExposedPorts"), um herauszufinden welche Ports da überhaupt freigegeben werden sollen.

Gleichzeitig wundert mich dann aber:
Zitat von: Elektrolurch am 29 November 2024, 13:18:16dass in der Home - App die Geräte / Raum Zuordnung verloren geht
Wie kannst du denn da überhaupt etwas anpassen (bzw. erwarten, dass es übernommen wird), wenn sich die Home-App nicht einmal mit der Homebridge verbindet? Also erstmal eins nach dem anderen.

Elektrolurch

Also, ohne Container läuft homebridge einwandfrei mit dem Nutzer fhem:dialout. Hatte ich aber auch geschrieben. Aber im Container kommen dann Fehlermeldungen von npm, dass da Dateien nicht geschrieben werden können, weil die Berechtigung fehlt, daher habe ich das erst einmal auskommentiert.
Ob das jetzt ein shell-Skript ist oder ein compose File, ist erst einmal egal. Ich hätte gerne einmal ein funktionierendes Skript gesehen, um abzugleichen, welche Volumes exportiert werden und welche Ports für den Container freigegeben werden.
Wenn also jemand einen funktionierenden  homebridge Container hat, bitte hier das Skript / den Startbefehl posten. Danke.
Die Frage, warum die Raumzurodnung / Namenszuordnung in Homebridge verloren geht, ist eine Grundsatzfrage und zielt darauf ab, was man sichern muss, damit die Zuordnung eben NICHT verloren geht. Die o.g. genannten Ordner persist und accessories scheinen es ja nicht zu sein, auch wenn ich die wieder aus einer Sicherung einspiele, ist die Zurordnung Raum und Name weg. Hat da jemand eine dauerhafte Lösung?


Elektrolurch
configDB und Windows befreite Zone!

passibe

Bitte sehr:

services:
  homebridge:
    image: homebridge/homebridge
    container_name: homebridge
    restart: unless-stopped
    labels:
      com.centurylinklabs.watchtower.enable: "true"
    network_mode: "host"
    hostname: homebridge
    environment:
      HOMEBRIDGE_CONFIG_UI: 1
      HOMEBRIDGE_CONFIG_UI_PORT: 8581
      TZ: Europe/Berlin
    volumes:
      - ./homebridge:/homebridge

Eigentlich sollte es reichen deine alte Homebridge zu stoppen, das ganze aktuelle Homebridge-Verzeichnis zu dem Pfad im Compose-file zu verschieben und von dort aus ein chown -R root:root homebridge auszuführen. Dann einfach starten. Musst es halt in das gleiche compose-file wie fhem packen, damit beide container im gleichen Netzwerk sind. Oder manuell ein Netzwerk erstellen und dann im compose-file als external hinterlegen.
Dann ggfs. noch den Hostnamen von FHEM in der config.json anpassen.

Das sollteTM klappen, aber wäre jedenfalls mal ein erster Schritt zum weiter debuggen.
Vorher natürlich mal ein Backup machen, aber hast du ja schon.

Wenn du übrigens von network_mode host weg willst, dann musst du dir selbst ein Service-File konfigurieren, das du dann separat mit Avachi advertised. Würde ich aber erstmal lassen. Siehe hier.

Weil ich manchmal das Problem hatte, dass Accessories gelöscht werden, wenn Homebridge schon startet aber FHEM noch nicht erreichbar ist, habe ich in ./homebridge/startup.sh folgendes Skript eingebaut, das prüft, ob FHEM erreichbar ist und falls nicht für 2 Minuten schläft, bevor es es nochmal versucht (inkl. Senden einer Benachrichtung über ntfy, aber das kannst du für dich auch einfach rauslöschen bzw. auf dein Benachrichtungssystem umstellen). Auch hier natürlich den Hostnamen von FHEM ggfs. anpassen:

#!/bin/bash

#
# Docker Homebridge Custom Startup Script - homebridge/homebridge
#
# This script can be used to customise the environment and will be executed as
# the root user each time the container starts.
#
# Example installing packages:
#
# apt-get update
# apt-get install -y python3
#

ntfy () {
    curl --silent --show-error --fail \
            -H "Authorization: Bearer ABCD" \
            -H "Priority: 2" \
            -H "Tags: $1" \
            -H "Title: Homebridge" \
            --data "$2" \
        "https://ntfy.example.org/fhem" > /dev/null 2>&1
}

MSG_UNREACH="
FHEM unreachable.
Retrying startup in 2 minutes.
"
MSG_OK="
FHEM reachable.
Starting.
"

until [ \
  "$(curl -s -w '%{http_code}' -o /dev/null "http://fhem:8083/fhem")" \
  -eq 401 ]
do
        ntfy x "$MSG_UNREACH"
    NOTIFY_ON_SUCCESS=1
    sleep 120
done

if [ -n "$NOTIFY_ON_SUCCESS" ]; then
    ntfy white_check_mark "$MSG_OK"
fi