Homegear auf docker - erste Schritte

Hallo

verschiedene Gründe haben mich dazu gebracht von homegear mit einem raspi 2, Stretch, ro filesystem auf einen raspi 3b+, buster und ssd umzusteigen. auch wollte ich jetzt docker nutzen.

Als homematic bidcos interface nutze ich den SCC - Stackable CC1101.

Die wichtigsten apps

  • homegear (stable)
  • eclipse mosquitto

docker Installation

  • curl -sSL https://get.docker.com | sh
  • sudo usermod -aG docker pi

homegear Installation
Im Wesentlichen folgte ich der Beschreibung: Docker Hub
wenn man genau liest steht auch alles Wichtige dort beschrieben.

Da ich nur mit dem user pi arbeite und nicht permanent als user root arbeiten möchte ein paar Änderungen:

Das Anlegen der Directories für homegear:

sudo mkdir -p /homegear-data/etc
sudo mkdir /homegear-data/lib
sudo mkdir /homegear-data/log

Docker Netzwerk für die Kommunikation zwischen homegear und mosquitto:

docker network create \
 --driver bridge \
 home-net

Der Vorteil eines eigenen docker Netzwerkes anstelle des default Netzwerkes besteht darin, dass die docker Container mit Namen untereinander kommunizieren können und keine IP’s angegeben werden müssen. (Networking with standalone containers | Docker Documentation)

Starten von homegear:

docker run -d \
 --restart always \
 -v /homegear-data/etc:/etc/homegear:Z \
 -v /homegear-data/lib:/var/lib/homegear:Z \
 -v /homegear-data/log:/var/log/homegear:Z \
 -v /sys:/sys \
 -e TZ=Europe/Berlin -e HOST_USER_ID=$(id -u) \
 -e HOST_USER_GID=$(id -g) \
 -p 2001:2001 \
 -p 2002:2002 \
 -p 2003:2003 \
 --device=/dev/ttyAMA0 \
 --name homegear \
 --hostname homegear \
 --network home-net \
 homegear/homegear:stable

Zur Erklärung - angepasst nach Kommentaren siehe unten:

  • --restart always erlaub das starten beim hochfahren des Raspi.
  • -v /sys:/sys ist notwendig um die GPIO pins aus dem docker container anzusprechen (SCC Modul)
  • --hostname homegear setzt den intern verwendeten hostname der docker Instanz (nicht zwingend notwendig - mach die instanz lesbarer)
  • --name homegear damit kann die docker Instanz mit einem Namen von anderen Instanzen aus adressiert werden (vom mosquitto container aus: ping homegear)
  • --network home-net hinzufügen zu einem Netzwerk
  • --rm würde den Container nach Beendigung löschen. Möchte ich aber nicht.

Starten von eclipse-mosquitto:
Für Interessierte. Durch das eigene Netzwerk, kann jetzt aus dem homegear container der mosquitto container mit dem Namen mosquito addressiert werden. Interessant für flows und mqtt Konfigurationen.

docker run -d \
 --restart always \
 -p 1883:1883 \
 -p 8883:8883 \
 -v /mosquitto-data/config:/mosquitto/config \
 -v /mosquitto-data/log:/mosquitto/log \
 -v /mosquitto-data/data:/mosquitto/data \
 --hostname mosquitto \
 --name mosquitto \
 --network home-net \
 eclipse-mosquitto

vielen Dank für die Hilfe des Forums :slight_smile:

3 Likes

Hallo @jipp,

sehr schöne Anleitung!

Viele Grüße

Sathya

@Sim, magst du das mit in die Doku aufnehmen oder in den Starterguide?

Anbei ein Beispiel für die ein Docker Compose setup incl. IPv6:
(docker: 20.10.1, docker-compose: 1.27.4)
ip6tables ist noch nicht 100% ausgereift, deshalb auf false, Siehe auch ip6tables command am Ende.

/etc/docker/daemon.json:

{
  "debug": false,
  "experimental": true,
  "ipv6": true,
  "ip6tables": false, 
  "bip": "192.168.1.1/24",
  "fixed-cidr-v6": "fd00:0:0:1::/64"
}

homegear.yml:

networks:
  homegear:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: br-homegear
    enable_ipv6: true
    ipam:
      config:
      - subnet: 192.168.2.0/24
      - subnet: fd00:0:0:2::/64
      driver: default
    name: homegear
services:
  homegear:
    container_name: homegear
    depends_on:
      mosquitto:
        condition: service_started
    devices:
# Anpassen je nach angeschlossenem Device
    - /dev/ttyAMA0:/dev/ttyAMA0
    - /dev/ttyACM0:/dev/ttyACM0
    environment:
# $(id -u) und $(id -g) müssen von Hand eingetragen werden da docker-compose nicht automatisch auswertet
      HOST_USER_GID: '1000'
      HOST_USER_ID: '1000'
      TZ: Europe/Berlin
    hostname: homegear
#    image: homegear/homegear:latest
    image: homegear/homegear:testing
    labels:
      docker.group: homegear
    networks:
      homegear: null
    ports:
    - protocol: tcp
      published: 2001
      target: 2001
    - protocol: tcp
      published: 2002
      target: 2002
    - protocol: tcp
      published: 2003
      target: 2003
    restart: unless-stopped
    stop_grace_period: 60s
    volumes:
    - /docker/homegear/etc:/etc/homegear:Z
    - /docker/homegear/lib:/var/lib/homegear:Z
    - /docker/homegear/log:/var/log/homegear:Z
    - /sys:/sys:rw
  mosquitto:
    container_name: mosquitto
    environment:
      TZ: Europe/Berlin
    hostname: mosquitto
    image: eclipse-mosquitto:latest
    labels:
      docker.group: homegear
    networks:
      homegear: null
    ports:
    - protocol: tcp
      published: 1883
      target: 1883
    - protocol: tcp
      published: 8883
      target: 8883
    restart: unless-stopped
    volumes:
    - /docker/mosquitto/config:/mosquitto/config:rw
    - /docker/mosquitto/data:/mosquitto/data:rw
    - /docker/mosquitto/log:/mosquitto/log:rw
version: '3'
  • Starten: docker-compose -f homegear.yml up -d
  • Stoppen: docker-compose -f homegear.yml down
  • Logs: docker-compose -f homegear.yml logs -f

IPv6 connect aus dem Container heraus benötigt:
ip6tables -t nat -A POSTROUTING -s fd00:0:0:2::/64 ! -o br-homegear -j MASQUERADE

/boot/cmdline.txt sollte das folgende beinhalten:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

2 Likes

Jein. hostname setzt den Host-Namen im Container, die Adressierung von außen geschieht aber über den Container-Namen (name).

Insofern kann der hostname-Parameter entfallen.

2 Likes

du hast recht.

name ist verantwortlich für die Erreichbarkeit mit Namen zwischen den docker Containern.
Trotzdem würde ich nicht auf hostname verzichten. Ich glaube das in der Admin UI der Systemname mit einer von Docker gewählten ID gesetzt wird.

Ein explizit gesatzer Hostname schadet nicht, insofern ist dein aktualisierter Hinweis im initialen Post völlig korrekt. Wie Du richtig bemerkst, wird er u.a. für die Anzeige im Admin UI verwendet (daran sieht man auch, dass ich ihn nicht gesetzt habe :slight_smile: )

Hallo @jipp,

darf ich das in die offizielle Doku übernehmen?

Viele Grüße

Sathya

Gerne
Bin ja froh etwas beizutragen :+1:

1 Like

Drin: Docker Hub

Hier ein Update der config von oben:

  • docker IPv6 Änderungen
  • healthcheck für homegear main Prozess, damit der Container automatisch neu startet falls der Hauptprozess sich beendet (danke an Neuer_User)
  • hinzufügen der port 80, 443 für spätere updates

Anbei ein Beispiel für die ein Docker Compose setup incl. IPv6:
(docker: 20.10.6, docker-compose: 1.29.0) ip6tables erzeugt automatisch die benötigten Filter für IPv6.

/etc/docker/daemon.json:

{
  "debug": false,
  "experimental": true,
  "ipv6": true,
  "ip6tables": true, 
  "bip": "192.168.1.1/24",
  "fixed-cidr-v6": "fd00:0:0:1::/64",
  "dns": ["192.168.178.1"]
}

homegear.yml:

networks:
  homegear:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: br-homegear
    enable_ipv6: true
    ipam:
      config:
      - subnet: 192.168.2.0/24
      - subnet: fd00:0:0:2::/64
      driver: default
    name: homegear
services:
  homegear:
    container_name: homegear
    depends_on:
      mosquitto:
        condition: service_started
    devices:
# Anpassen je nach angeschlossenem Device
    - /dev/ttyAMA0:/dev/ttyAMA0
    - /dev/ttyACM0:/dev/ttyACM0
    environment:
# $(id -u) und $(id -g) müssen von Hand eingetragen werden da docker-compose nicht automatisch auswertet
      HOST_USER_GID: '1000'
      HOST_USER_ID: '1000'
      TZ: Europe/Berlin
    healthcheck:
      test: ps -q `cat /var/run/homegear/homegear.pid` || bash -c 'kill -s 15 -1'
      interval: 10s
      timeout: 5s
      retries: 1
    hostname: homegear
#    image: homegear/homegear:latest
    image: homegear/homegear:testing
    labels:
      docker.group: homegear
    networks:
      homegear: null
    ports:
    - protocol: tcp
      published: 80
      target: 80
    - protocol: tcp
      published: 443
      target: 443
    - protocol: tcp
      published: 2001
      target: 2001
    - protocol: tcp
      published: 2002
      target: 2002
    - protocol: tcp
      published: 2003
      target: 2003
    restart: unless-stopped
    stop_grace_period: 60s
    volumes:
    - /docker/homegear/etc:/etc/homegear:Z
    - /docker/homegear/lib:/var/lib/homegear:Z
    - /docker/homegear/log:/var/log/homegear:Z
    - /sys:/sys:rw
  mosquitto:
    container_name: mosquitto
    environment:
      TZ: Europe/Berlin
    hostname: mosquitto
    image: eclipse-mosquitto:latest
    labels:
      docker.group: homegear
    networks:
      homegear: null
    ports:
    - protocol: tcp
      published: 1883
      target: 1883
    - protocol: tcp
      published: 8883
      target: 8883
    restart: unless-stopped
    volumes:
    - /docker/mosquitto/config:/mosquitto/config:rw
    - /docker/mosquitto/data:/mosquitto/data:rw
    - /docker/mosquitto/log:/mosquitto/log:rw
version: '3'
  • Starten: docker-compose -f homegear.yml up -d
  • Stoppen: docker-compose -f homegear.yml down
  • Logs: docker-compose -f homegear.yml logs -f

/boot/cmdline.txt sollte das folgende beinhalten:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Für IPv6 autoconfiguration sollte /usr/lib/dhcpcd/dhcpcd-hooks/99-sysctl erstellt werden und folgendes beinhalten (eth0 an das benutzte Interface anpassen):

sysctl net.ipv6.conf.eth0.accept_ra=2

Dies ist notwendig damit das Interface nicht nur nach einem Reboot, sondern auch später noch router advertisements empfangen kann.