Offizielles FHEM Docker Basis Image für verschiedene Plattformen

Begonnen von Loredo, 28 Juli 2018, 21:24:57

Vorheriges Thema - Nächstes Thema

ManOki

Ok, das scheint ein FHEM-eigenes Modul zu sein, bei mir liegt es in /opt/fhem/FHEM/RTypes.pm ... wirf am besten dein Container inkl. Volume weg und fang neu an.

persching

Ich hab jetzt von docker alles auf dem System gelöscht, Images, Volumes, komplett alles. Danach wieder docker-compose up -d und alles wurde neu heruntergeladen und erzeugt. Es ändert aber nix. Ich kann den Container auch mit der fhem.cfg statt der configDB starten. Aber das möchte ich nicht mehr. In meiner aktuellen configDB habe ich auch nur die Sachen eingefügt, die in der fhem.cfg beinhaltet sind. Also aktuell keine persönlichen Konfigurationen.

ManOki

Ok, dann zeig mal dein docker-compose.yml her. Welche docker-Version verwendest du?

persching

dirk@homeserver:~$ docker version
Client:
Version:           18.06.1-ce
API version:       1.38
Go version:        go1.10.4
Git commit:        e68fc7a
Built:             Tue May  7 17:57:34 2019
OS/Arch:           linux/amd64
Experimental:      false

Server:
Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       e68fc7a
  Built:            Tue May  7 17:57:34 2019
  OS/Arch:          linux/amd64
  Experimental:     false


Und noch die docker-compose.yml. Basis war hier die aus dem git repo von fhem-docker.


# This is an exmaple Docker Compose file to start your own Docker Stack

version: '2.3'

networks:
  net:
    driver: bridge
    # enable_ipv6: true
    ipam:
      driver: default
      config:
        - subnet: 172.27.0.0/24
          gateway: 172.27.0.1
        # - subnet: fd00:0:0:0:27::/80
        #   gateway: fd00:0:0:0:27::1
volumes:
  portainer_data:

services:

  ####
  # HINT: use only ONE of the example "fhem:" service
  # definitions below !
  #

  # Example w/ custom environment variables
  fhem:
    image: fhem/fhem:latest
    restart: always
    networks:
      - net
    ports:
      - "8083:8083"
      - "7072:7072"
    volumes:
      - "./fhem/:/opt/fhem/"
      - "./fhem/contrib/configDB/configDB.conf:/opt/fhem/configDB.conf"
    environment:
      FHEM_UID: 6061
      FHEM_GID: 6061
      TIMEOUT: 10
      RESTART: 1
      TELNETPORT: 7072
      TZ: Europe/Berlin
      CONFIGTYPE: configDB
    depends_on:
      - mysql

  portainer:
    image: portainer/portainer:1.20.0
    restart: always
    command: -H unix:///var/run/docker.sock --no-auth
    networks:
      - net
    ports:
      - "9000:9000"
    environment:
      - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/portainer.crt
      - REGISTRY_HTTP_TLS_KEY=/certs/portainer.key
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
      - /home/pirate/certs/portainer.key:/certs/portainer.key
      - /home/pirate/certs/portainer.crt:/certs/portainer.crt

  mysql:
    image: mysql/mysql-server:5.7
    restart: always
    networks:
      - net
    expose:
      - "3306"
      - "33060"
    ports:
      - "3306:3306"
      - "33060:33060"
    volumes:
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/fhem-init-sql
      - ./mysql/data:/var/lib/mysql
    environment:
      - MYSQL_RANDOM_ROOT_PASSWORD=yes

ManOki

Und das host-Verzeichnis ./fhem ist zu Beginn leer und wird erst durch den Container gefüllt, richtig?

persching

ja, ich hatte einfach ein git clone https://github.com/fhem/fhem-docker.git ausgeführt, die docker-compose.yml ergänzt und den Ordner mit den mysql Daten in das entsprechende directory kopiert. Danach dann noch die fhem/contrib/configDB/configDB.conf angepasst und versucht die Datenbank soweit zu bereinigen, damit fhem erstmal startet. Der nächste Step wäre dann nach und nach die Datenbank um meine devices aus der alten Datenbank zu erweitern (mit SQL Scripten INSERT INTO .... usw.).

ManOki

Das klingt alles irgendwie falsch..ich nehme an, du probierst eher herum und hast nicht wirklich Ahnung (von docker, mysql usw.), was genau du tun sollst. Wenn dem nicht so ist, ignoriere die folgenden Hinweise.

- auf der Github README steht: "docker pull fhem/fhem" und nicht clone, warum tust du das?
- mysql Daten: Was ist das? Meinst du mysqldump Dateien? An welche Stelle packst du die?
- Bitte nicht eigenständig an der fhem.cfg oder in dem Fall configDB herumschrauben .. das steht überall im Forum. Weder manuell löschen, noch anschließend mit SQL Insert Skripten im Anschluss Konfigurationen ändern!

Versuche erstmal mit einer wirklich leeren Datenbank und einem leeren Container zu starten. Ich werde das Gefühl nicht los, dass dein "./fhem" Verzeichnis nicht schon bereits von einer anderen FHEM-Instanz gefüllt wurde.

persching

Du hast recht, ich probiere, weil Docker für mich neu ist. Zwar habe ich schon viel gelesen und mir Videos angeschaut, aber so 100%ig steige ich da noch nicht durch. Aber jeder fängt mal klein an. Ja, in der Readme steht man soll docker pull fhem/fhem eingeben und nicht git clone.... Warum tue ich das? Ganz einfach: ich möchte mein persönliches fhem repo auf meinem Synology NAS mit git speichern und wollte dieses repo als Basis nehmen. Aber auch beim Thema git bin ich erstmal noch neu. Aber nun back to topic:

Ich habe jetzt das komplette Dockerzeug bereinigt, eine neuen Ordner fhem und fhem/core angelegt und dort mit docker pull fhem/fhem den Container geladen. Dann mit docker run -d --name fhem -p 8083:8083 -v /fhem/core:/opt/fhem fhem/fhem ein leeres Hostverzeichnis dem Container zugewiesen. So startet fhem auch, aber das hat es bereits mit der alten Umgebung. Nun habe ich in fhem/core/contrib/configDB/configDB.conf meine Zugangsdaten eingetragen und meine alte docker-compose.yml in den Ordner fhem geladen (also den Ordner, den ich erstellt habe in meinem home-Verzeichnis - die Daten liegen ja nach dem docker run Befehl in fhem/core) und dazu meinen Ordner "mysql" mit dem Inhalt "init.sql". Ein docker-compose up -d hat dann wieder alles gestartet.

Inhalt der init.sql:
CREATE DATABASE `fhem` DEFAULT CHARACTER SET = `utf8`;

CREATE USER 'fhemuser'@'%' IDENTIFIED BY 'xxx';

REVOKE CREATE ROUTINE, CREATE VIEW, CREATE USER, ALTER, SHOW VIEW, CREATE, ALTER ROUTINE, EVENT, SUPER, INSERT, RELOAD, SELECT, DELETE, FILE, SHOW DATABASES, TRIGGER, SHUTDOWN, REPLICATION CLIENT, GRANT OPTION, PROCESS, REFERENCES, UPDATE, DROP, REPLICATION SLAVE, EXECUTE, LOCK TABLES, CREATE TEMPORARY TABLES, INDEX ON *.* FROM 'fhemuser'@'%';

UPDATE mysql.user SET max_questions = 0, max_updates = 0, max_connections = 0 WHERE User = 'fhemuser' AND Host = '%';

GRANT CREATE ROUTINE, CREATE VIEW, ALTER, SHOW VIEW, CREATE, ALTER ROUTINE, EVENT, INSERT, SELECT, DELETE, TRIGGER, GRANT OPTION, REFERENCES, UPDATE, DROP, EXECUTE, LOCK TABLES, CREATE TEMPORARY TABLES, INDEX ON `fhem`.* TO 'fhemuser'@'%';

USE `fhem`;

CREATE TABLE history (
    TIMESTAMP TIMESTAMP,
    DEVICE varchar(64),
    TYPE varchar(64),
    EVENT varchar(512),
    READING varchar(64),
    VALUE varchar(255),
    UNIT varchar(32),
    KEY `Search_Idx` (`DEVICE`,`READING`,`TIMESTAMP`,`VALUE`),
    KEY `Device_Idx` (`DEVICE`,`READING`),
    KEY `Report_Idx` (`TIMESTAMP`,`READING`) USING BTREE
);

CREATE TABLE current (
    TIMESTAMP TIMESTAMP,
    DEVICE varchar(64),
    TYPE varchar(64),
    EVENT varchar(512),
    READING varchar(64),
    VALUE varchar(255),
    UNIT varchar(32)
);

CREATE TABLE fhemversions (
`VERSION` INT,
`VERSIONUUID` CHAR ( 50 )
);
CREATE TABLE fhemstate (
`stateString` TEXT
);
CREATE TABLE fhemconfig (
`COMMAND` VARCHAR ( 32 ),
`DEVICE` VARCHAR ( 64 ),
`P1` VARCHAR ( 50 ),
`P2` TEXT,
`VERSION` INT,
`VERSIONUUID` CHAR ( 50 )
);
CREATE TABLE fhemb64filesave (
`filename` TEXT,
`content` BLOB
);
CREATE INDEX config_idx ON fhemconfig (
`versionuuid`,
`version`
);

FLUSH PRIVILEGES;


Nun scheint aber die Datenbank nicht angelegt zu werden. Spiele ich die alte Datenbank ein, dann hab ich wieder die selbe Fehlermeldung wie zu Beginn -> die Datenbank ist das Problem.

Aber wie kommt man zu einer noch leeren Datenbank, die sowohl die Configs, als auch das Logging beinhaltet??

Und zum Thema keine manuelle Bearbeitung der Datenbank bzw. der fhem.cfg:
Mir sind die Probleme schon bekannt, aber über welchen Weg soll ich meine bisherige FHEM Installation auf das neue System portieren? Ich denke dazu ist ein SQL Dump der jetzigen sqlite DB und ein einfügen in die mysql DB notwendig. Aber ich lasse mich auch gerne eines besseren belehren, denn ich denke ich bin nicht der Erste und sicherlich auch nicht der letzte, der vor diesem Problem steht.

persching

So, ich glaub ich hab meinen Fehler gefunden:

in der docker-compose.yml war der Fehler in folgender Zeile:

- ./mysql/init.sql:/docker-entrypoint-initdb.d/fhem-init-sql

richtig ist:

- ./mysql/init.sql:/docker-entrypoint-initdb.d/fhem-init.sql

Wenn man mit dem Fehler schon einmal ein docker-compose up -d ausgeführt wurde, dann wurden die Datenbank versucht zu initialisieren, aber es hat nicht geklappt. Trotzdem wurde im mysql Container etwas angelegt. Nach der Korrektur wurde das init-script nicht mehr beachtet, weil es schon eine (wenn auch missglückte) Initialisierung gab.

Mit
docker-compose stop
docker-compose rm
cd mysql
rm -f data
docker-compose up -d

wurden die Daten gelöscht und beim nächsten starten korrekt initialisiert. Mein fhem-container ist nun mit Status 'healthy' in portainer gelistet. 

ManOki

Zitat von: persching am 03 November 2019, 17:42:56
Du hast recht, ich probiere, weil Docker für mich neu ist. Zwar habe ich schon viel gelesen und mir Videos angeschaut, aber so 100%ig steige ich da noch nicht durch. Aber jeder fängt mal klein an. Ja, in der Readme steht man soll docker pull fhem/fhem eingeben und nicht git clone.... Warum tue ich das? Ganz einfach: ich möchte mein persönliches fhem repo auf meinem Synology NAS mit git speichern und wollte dieses repo als Basis nehmen. Aber auch beim Thema git bin ich erstmal noch neu. Aber nun back to topic:

Das sollte kein Vorwurf werden :) Ich wollte es nur wissen, damit ich nicht völlig in die falsche Richtung schreibe und du denkst "das kenne ich doch schon alles, laaangweilig"  ;)

Falls du systemd verwendest, empfehle ich dir sowas: https://philipp-weissmann.de/docker-compose_mit_systemd/ Dort wird ein generischer docker-compose@.service konfiguriert, mit dem du dann z.B. docker-compose@fhem starten kannst. Und statt dem gesamten fhem-docker repo richtest du dir dann nur noch ein repo (im Blog-Eintrag wäre das dann /opt/dockerfiles/fhem) für deine Konfigurationsdateien ein, also docker-compose.yml, configDB.conf etc. ein. Dann musst du auch nicht ständig das fhem-docker repo in deins nachziehen (ich nehme mal an, dass du eh keine Änderungen bzgl. fhem-docker machen würdest).

Zitat von: persching am 03 November 2019, 17:42:56
Und zum Thema keine manuelle Bearbeitung der Datenbank bzw. der fhem.cfg:
Mir sind die Probleme schon bekannt, aber über welchen Weg soll ich meine bisherige FHEM Installation auf das neue System portieren? Ich denke dazu ist ein SQL Dump der jetzigen sqlite DB und ein einfügen in die mysql DB notwendig. Aber ich lasse mich auch gerne eines besseren belehren, denn ich denke ich bin nicht der Erste und sicherlich auch nicht der letzte, der vor diesem Problem steht.

Ja ein dump der vollständigen Datenbank ist natürlich notwendig. Aber du hattest vorher geschrieben, dass du einzelne Zeilen gelöscht hast und anschließend diese wieder mit INSERT INTO einfügen wolltest.

Aber soweit ich das jetzt verstehe, läuft deine Instanz und die Probleme sind gelöst, oder?  8)

rieders

Hallo

Ich habe mich bisher noch nicht mit docker befasst.
Jetzt möchte ich Fhem vom Raspberry auf die DS 218+ übertragen bzw. laufen lassen.
Ich hatte schon mal ein Image runter geladen , was auch lief.
Nun wollte ich meine Dateien, welche ich im Tablet UI sich befinden auf die Diskstation übertragen.
Leider finde ich den Pfad nicht.

Gibt es eine Anleitung oder sowas für Fhem Docker auf der Diskstation?

Grüße
André

Master_Nick

Generelle Anleitung hier: https://github.com/fhem/fhem-docker/

Für die DiskStation eher selbst zu übertragen.
Aber solange die Docker kann "sollte" das ja durchaus gehen.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

persching

Zitat von: ManOki am 04 November 2019, 10:41:29
Ja ein dump der vollständigen Datenbank ist natürlich notwendig. Aber du hattest vorher geschrieben, dass du einzelne Zeilen gelöscht hast und anschließend diese wieder mit INSERT INTO einfügen wolltest.

Aber soweit ich das jetzt verstehe, läuft deine Instanz und die Probleme sind gelöst, oder?  8)

Ich hatte einzelne Zeilen verwendet, indem ich die fhem.cfg aus dem docker repo "nachbilden" wollte. Der komplette Dump geht z.b. nicht, weil ich mindestens das https Zeug entfernen muss. Aber das sollte jetzt nicht das große Problem sein. Ansonsten läuft erstmal die configDB, Logging läuft noch nicht, aber da hab ich noch nicht nach dem Fehler gesucht. Erstmal denke ich, dass ich weiter komme...

Master_Nick

Eine einzelne Zeile sollte ja auch mit den korrekten Argumenten und Environmentvariablen reichen :-)
docker run oder was machste bei der Synologie?
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

persching

So, meine Migration von der alten Installation auf die docker Installation ist weitestgehend abgeschlossen. Meine Probleme waren bei der Presence-Erkennung über die Fritzbox. Lösung war eine Anmeldung mit Benutzername und Passwort an der Fritzbox. Werte für Nodered hatte ich per jsonlist2 abgefragt, das ging auch nicht wegen dem csrf-Token. Das habe ich gelöst, in dem ich eine WEBapi auf Port 8088 ohne csfr-Token erstellt habe und diese WEBapi nur Container-intern angesprechbar habe (docker-compose Eintrag: expose - "8088") .
Weiterhin hab ich ein Darstellungsproblem von ä/ö/ü/ß. Wenn ich die Devices korrigiere und speichere, dann funktioniert es. Irgendwie ist das wohl beim Datenbankübertrag von Alt nach Neu kaputt gegangen. Das ist aber ein lösbares Problem.

Insgesamt gefällt mir die Dockerlösung wirklich gut. Danke fürs basteln und für die Unterstützung... :)