[Docker / Container] echodevice

Begonnen von Sidey, 12 April 2026, 16:56:20

Vorheriges Thema - Nächstes Thema

Sidey

Hallo,

ich möchte hier mein Projekt kurz vorstellen und auch die grundlegende Architektur erläutern, weil die Frage sonst vermutlich recht schnell aufkommt.

Der FHEM-Docker-Container ist in erster Linie darauf ausgelegt, Perl-Programme auszuführen. Das Modul `echodevice` und auch einige andere Lösungen nutzen zusätzlich weitere Laufzeitumgebungen, zum Beispiel Node.js.

Seit Version 5 des FHEM-Images ist kein Node Package Manager mehr im FHEM-(Perl-)Docker-Image enthalten. In der Vergangenheit bedeutete das meist, dass man sich dafür ein eigenes angepasstes Image bauen musste.
Das dorr enthaltene NodeJS (18) ist schon längst aus der Wartung.
Da hier auch mit Authentifizierungsinformationen handelt, sollte einem die Sicherheit der Software nicht völlig egal sein.

Nach einer kurzen Diskussion hier im Forum habe ich mich daher entschieden, das von `echodevice` verwendete `alexa-cookie2` in einen eigenen Hilfscontainer auszulagern. Das Ganze heißt `alexa-cookie-service`.

Der Service stellt eine REST-API zur Verfügung, über die die notwendigen Schritte für die Anmeldung am Amazon-Dienst umgesetzt werden können.

Projektlink: 
https://github.com/fhem/alexa-cookie-service

Grobes Integrationsmuster: 
FHEM / echodevice -> HTTP/REST -> alexa-cookie-service -> Amazon

Das bedeutet konkret:

- Das Modul `echodevice` bleibt im normalen FHEM-Container.
- Der separate Service-Container stellt per REST-API die Funktionen rund um `alexa-cookie2` bereit.
- FHEM ruft diese API bei Bedarf auf, anstatt Node.js-Code direkt im FHEM-Container auszuführen.

Die Motivation für die Trennung ist vor allem:

- Der FHEM-Container soll möglichst nah an einer klassischen und gut wartbaren FHEM-Laufzeitumgebung bleiben.
- Ein Node.js-Projekt bringt eine eigene Runtime, eigene Abhängigkeiten und meist auch einen anderen Release- und Update-Zyklus mit.
- Wenn man beides in einen einzigen Container packt, vermischt man zwei technisch unterschiedliche Aufgabenbereiche.
- Das macht Images größer, die Wartung aufwendiger und erschwert Updates, Fehlersuche und Debugging.
- Zusätzlich wird es unpraktisch, wenn man nur den Service neu starten oder aktualisieren möchte, ohne gleichzeitig die FHEM-Umgebung anzufassen.

Mit einem separaten Service-Container ist die Trennung sauberer:

- Der Node.js-Dienst kann in einer dafür passenden Umgebung laufen.
- Beide Komponenten können unabhängig voneinander gestartet, gestoppt und aktualisiert werden.
- Fehler lassen sich leichter eingrenzen, weil klarer ist, ob ein Problem aus FHEM oder aus dem Service stammt.

Mir ist wichtig, dass diese Entscheidung nicht als unnötige Verkomplizierung verstanden wird. Auf den ersten Blick könnte es einfacher wirken, alles in einen Container zu legen. Praktisch erkauft man sich diese vermeintliche Einfachheit aber oft mit mehr Aufwand bei Pflege und Betrieb.

Die Aufteilung in FHEM-Container und Service-Container ist daher eine bewusste Designentscheidung zugunsten von Stabilität, Wartbarkeit und klaren Zuständigkeiten.

Damit das aktuelle echodevice Modul mit der Integration weiter funktioniert, habe ich ein paar Hilfs Definitionen (HTTPMOD, notify, at) auf der Projektseite beschrieben.

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth

FlatTV

Hallo Sidey,

ich wollte das mal kurz testen, bekomme nach
curl -H "x-auth-token: change-me" http://127.0.0.1:58080/api/statusein
{"error":"Unauthorized"}zurück
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

Sidey

Zitat von: FlatTV am 12 Mai 2026, 16:26:02Hallo Sidey,

ich wollte das mal kurz testen, bekomme nach
curl -H "x-auth-token: change-me" http://127.0.0.1:58080/api/status

Hast Du als AUTH_TOKEN auch change-me gesetzt?
Der Wert muss mit dem Header übereinstimmen.

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth

FlatTV

Ja, aber nicht in der yml Datei  :-\
thx
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

FlatTV

#4
Also wenn ich nur eine yml Datei auf meinem pi habe, startet der Container nicht.

name: alexa-cookie-service
alexa-cookie-service-1 exited with code 1 (restarting)
alexa-cookie-service-1  |
alexa-cookie-service-1  | > alexa-cookie-service@0.3.0 start
alexa-cookie-service-1  | > node src/server.js
alexa-cookie-service-1  |
alexa-cookie-service-1  | node:fs:1370
alexa-cookie-service-1  |   const result = binding.mkdir(
alexa-cookie-service-1  |                          ^
alexa-cookie-service-1  |
alexa-cookie-service-1  | Error: EACCES: permission denied, mkdir '/data/cookie-export'
alexa-cookie-service-1  |     at Object.mkdirSync (node:fs:1370:26)
alexa-cookie-service-1  |     at Object.<anonymous> (/app/src/server.js:13:4)
alexa-cookie-service-1  |     at Module._compile (node:internal/modules/cjs/loader:1705:14)
alexa-cookie-service-1  |     at Object..js (node:internal/modules/cjs/loader:1838:10)
alexa-cookie-service-1  |     at Module.load (node:internal/modules/cjs/loader:1441:32)
alexa-cookie-service-1  |     at Function._load (node:internal/modules/cjs/loader:1263:12)
alexa-cookie-service-1  |     at TracingChannel.traceSync (node:diagnostics_channel:328:14)
alexa-cookie-service-1  |     at wrapModuleLoad (node:internal/modules/cjs/loader:237:24)
alexa-cookie-service-1  |     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:171:5)
alexa-cookie-service-1  |     at node:internal/main/run_main_module:36:49 {
alexa-cookie-service-1  |   errno: -13,
alexa-cookie-service-1  |   code: 'EACCES',
alexa-cookie-service-1  |   syscall: 'mkdir',
alexa-cookie-service-1  |   path: '/data/cookie-export'
alexa-cookie-service-1  | }
alexa-cookie-service-1  |
alexa-cookie-service-1  | Node.js v22.22.2
alexa-cookie-service-1  | npm notice
alexa-cookie-service-1  | npm notice New major version of npm available! 10.9.7 -> 11.14.1
alexa-cookie-service-1  | npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.14.1
alexa-cookie-service-1  | npm notice To update run: npm install -g npm@11.14.1
alexa-cookie-service-1  | npm notice
alexa-cookie-service-1 exited with code 1 (restarting)

cat alexa-cookie-service.yml
name: alexa-cookie-service
networks:
  fhem-net:
    external: true
services:
  alexa-cookie-service:
    image: ghcr.io/fhem/alexa-cookie-service:0.3.0
    volumes:
      - ./alexa-cookie-data:/data
      - ./fhem/cache/alexa-cookie:/opt/fhem/cache/alexa-cookie
    environment:
      HOST: 0.0.0.0
      PORT: 58080
      AUTH_TOKEN: 87b4feb87546bc9bca881d54dde1c3381f39711d5419dbfdb1b35c688db533fc
      DATA_DIR: /data
      STATE_FILE: /data/alexa-registration.json
      METADATA_FILE: /data/service-metadata.json
      COOKIE_EXPORT_DIR: /data/cookie-export
      # COOKIE_EXPORT_DIR: /opt/fhem/cache/alexa-cookie
      DEBUG_HTML_DIR: /data/debug-html
      AMAZON_PAGE: amazon.de
      BASE_AMAZON_PAGE: amazon.com
      ACCEPT_LANGUAGE: de-DE
      PROXY_PUBLIC_HOST: 192.168.178.188
      PROXY_LISTEN_BIND: 0.0.0.0
      PROXY_PORT: 58090
      PROXY_ONLY: true
      SETUP_PROXY: true
      APP_NAME: FHEM EchoDevice Cookie Service
      USE_HERMES: false
      REFRESH_SCHEDULE_HOURS: 24
      REFRESH_MIN_AGE_HOURS: 6
      REQUEST_TIMEOUT_MS: 30000
      LOG_LEVEL: combined
      TZ:   Europe/Berlin
    ports:
      - '58090:58090'
    networks:
      - fhem-net
    restart: unless-stopped
    user: '6061:6061'

So sieht das Verzeichnis aus:
571567 4 drwxrwxr-x  5 pi   pi   4096 May 12 18:12 .
 132722 4 drwx------ 22 pi   pi   4096 May 12 18:12 ..
1116707 4 drwxr-xr-x  2 root root 4096 May 12 18:12 alexa-cookie-data
 535855 4 -rw-rw-r--  1 pi   pi   1256 May 12 18:12 alexa-cookie-service.yml
 566774 4 drwxr-xr-x  4 6062 6062 4096 May 12 10:26 alexa-fhem
 535631 4 -rw-rw-r--  1 pi   pi    380 May 12 09:25 alexa-fhem.yml
 535633 4 -rw-rw-r--  1 pi   pi    847 May 12 09:20 deconz.yml
 535629 4 -rw-rw-r--  1 pi   pi    389 May 12 09:48 docker-compose.yml
 571777 4 drwxr-x--- 15 6061 6061 4096 May 12 15:51 fhem
 535888 4 -rw-rw-r--  1 pi   pi   1837 May 12 16:47 fhem.yml
 535628 4 -rw-rw-r--  1 pi   pi    408 May 12 09:03 openccu.yml
 535619 4 -rw-rw-r--  1 pi   pi    560 May 12 09:58 portainer.yml
 

//edit
Wenn der Ordner von fhem angelegt wurde, geht das auch.
Ich habe das mal mit sudo chown -R 6061:6061 alexa-cookie-data/ simuliert.
Raspi4 - im wesentlichen mit Phoscon, HomeMatic ( aktuell über debmatic), CUL, BOSE-ST und Alexa (Connector)

Sidey

Zitat von: FlatTV am 12 Mai 2026, 18:25:25Also wenn ich nur eine yml Datei auf meinem pi habe, startet der Container nicht.

...

Ich habe das mal mit sudo chown -R 6061:6061 alexa-cookie-data/ simuliert.

Ja, das /data Verzeichnis muss für den angegeben User beschreibbar sein. Das könnte ich in der readme noch hinterlegen.

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth