Installation Docker OCI - OpenCCU/OpenCCU GitHub Wiki
OpenCCU kann als Docker/OCI-Container auf bestehenden amd64- bzw. arm64 (aarch64)-Systemen betrieben werden. Der Container bietet nahezu den vollen Funktionsumfang eines „normalen“ OpenCCU-Systems; bestimmte Funktionen – etwa die Netzwerkeinrichtung oder der WebUI-basierte Update-Mechanismus – sind jedoch bewusst deaktiviert, da diese Aufgaben üblicherweise auf dem Host-System und nicht innerhalb des Containers erledigt werden.
Wie bei einer regulären OpenCCU-Installation werden passende Homematic-Funkmodule benötigt. Die zugehörigen Kernel-Treiber für Funkmodule wie RPI-RF-MOD, HM-MOD-RPI-PCB, HmIP-RFUSB sowie für die Adapter HB-RF-USB / HB-RF-USB-2 und HB-RF-ETH müssen dabei jedoch auf dem Host und nicht im Container installiert werden; der Container nutzt dann diese bereits geladenen Treiber. Die Treiber lassen sich entweder über das Skript install-docker.sh oder manuell installieren. In beiden Fällen werden die von @alexreinert über piVCCU bereitgestellten Kernel-Module auf dem Host installiert.
Important
Damit OpenCCU mit einem HmIP-HAP oder HmIPW-DRAP kommunizieren kann, verwendet die folgende Anleitung ein macvlan-Docker-Netzwerk. Dafür werden zwei statische IP-Adressen – <IP-ADDRESS> und <AUX-ADDRESS> – aus dem lokalen Netzwerk benötigt, die außerhalb des DHCP-Bereichs des Routers liegen. <IP-ADDRESS> wird dem Container und <AUX-ADDRESS> dem Docker-Host zugewiesen, damit Host und Container einander erreichen können.
- Ein Debian-basiertes amd64- oder arm64-Host-System (z. B. Debian, Ubuntu, Raspberry Pi OS 64-Bit, Armbian). 32-Bit-Systeme werden seit OpenCCU 3.87.6.20260313 nicht mehr unterstützt.
- Eine aktuelle Version der Kernel-Module
pivccu-modules-dkms(mindestens 1.0.88). Ältere Versionen führen dazu, dass der Homematic IP-Dienst im Container nicht startet bzw. einHmIP-RFUSB-TKnicht erkannt wird. - Ein unterstütztes Funkmodul.
Docker auf dem Host installieren und vorbereiten:
-
Docker installieren:
sudo sh -c "wget -qO - https://get.docker.com | bash -" -
Benutzer der Gruppe
dockerhinzufügen, damit er Docker-Kommandos ausführen darf:sudo usermod -aG docker $USER exec su -l $USER
-
Docker-Funktion prüfen mit dem hello-world-Beispiel:
docker run hello-world
Danach ist der Host bereit für den Betrieb von Docker-Containern.
Zur Einrichtung aller Voraussetzungen und zum Starten des OpenCCU-Containers kann entweder das Skript install-docker.sh verwendet oder manuell mit docker pull, docker load oder Docker Compose vorgegangen werden.
Verwendete Platzhalter – durch die Werte der eigenen Umgebung ersetzen:
-
<IP-ADDRESS>– die statische IP-Adresse (z. B.192.168.178.4) des Containers; außerhalb des DHCP-Bereichs. -
<AUX-ADDRESS>– eine zusätzliche statische IP-Adresse (z. B.192.168.178.3) für den Host, damit Host und Container im selben Subnetz kommunizieren können; ebenfalls außerhalb des DHCP-Bereichs und nicht die Haupt-IP des Hosts. -
<INTERFACE>– das primäre Netzwerkinterface des Hosts (z. B.eth0). -
<SUBNET>– das Subnetz des lokalen Netzwerks (z. B.192.168.178.0/24). -
<GATEWAY>– die IP-Adresse des Standard-Gateways (z. B.192.168.178.1).
Für eine möglichst einfache Einrichtung (oder bei wenig Linux-/Docker-Erfahrung) empfiehlt sich das Installationsskript:
-
Ausführen:
wget -qO - https://openccu.de/install-docker.sh | bash -Fordert das Skript erweiterte Rechte an, erneut mit
sudoausführen:sudo sh -c "wget -qO - https://openccu.de/install-docker.sh | bash -"Während der Installation fragt das Skript ggf. folgende Werte ab:
-
<IP-ADDRESS>– IP-Adresse des Containers (statisch, außerhalb DHCP) -
<AUX-ADDRESS>– zusätzliche IP-Adresse des Hosts (statisch, außerhalb DHCP) -
<INTERFACE>,<SUBNET>,<GATEWAY>– werden automatisch ermittelt, können aber angepasst werden
-
-
Container starten:
docker start -i ccu
Hinweis: Ohne
-istartet der Container im Hintergrund.
Das Skript kann jederzeit erneut ausgeführt werden, um die Docker-Einrichtung zu prüfen, an Änderungen in OpenCCU anzupassen oder OpenCCU zu aktualisieren. Weitere Einstellmöglichkeiten des Skripts sind im Anhang beschrieben.
Für volle Kontrolle (oder bei Verwendung von Werkzeugen wie Docker Compose) wie folgt vorgehen.
Folgende Abhängigkeiten auf dem Docker-Host installieren, damit der OpenCCU-Container korrekt auf die Homematic-Funkhardware zugreifen kann:
-
pivccu-modules-dkmsinstallieren (Treiber fürRPI-RF-MOD,HM-MOD-RPI-PCB,HmIP-RFUSBsowieHB-RF-USB(-2)/HB-RF-ETH):sudo apt install wget ca-certificates build-essential bison flex libssl-dev gpg wget -qO - https://apt.pivccu.de/piVCCU/public.key | sudo gpg --dearmor -o /usr/share/keyrings/pivccu-archive-keyring.gpg sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/pivccu-archive-keyring.gpg] https://apt.pivccu.de/piVCCU stable main" >/etc/apt/sources.list.d/pivccu.list' sudo apt update sudo apt install pivccu-modules-dkms
Für das Übersetzen der Module werden die Kernel-Header des laufenden Kernels benötigt, z. B.
linux-headers-rpi-v8unter Raspberry Pi OS (64-Bit) bzw.linux-headers-$(uname -r)unter Debian/Ubuntu. -
GPIO-Funkmodul (
RPI-RF-MOD/HM-MOD-RPI-PCB) – nicht erforderlich beiHB-RF-USB,HB-RF-USB-2,HB-RF-ETHoderHmIP-RFUSB:-
Armbian: Device-Tree-Overlays installieren:
sudo apt install pivccu-devicetree-armbian
-
Raspberry Pi OS:
- Device-Tree-Overlays installieren:
sudo apt install pivccu-modules-raspberrypi
- Serielle Schnittstelle für das Funkmodul freigeben (nicht beim Raspberry Pi 5): Beim Raspberry Pi 3/4 belegt das integrierte Bluetooth die serielle Schnittstelle (
ttyAMA0), die das Funkmodul an GPIO 14/15 benötigt.-
Variante A (empfohlen, entspricht der Konfiguration von OpenCCU selbst): Bluetooth auf die Mini-UART verlegen; Bluetooth bleibt eingeschränkt nutzbar.
sudo bash -c 'cat <<EOT >>/boot/firmware/config.txt enable_uart=1 dtoverlay=miniuart-bt EOT'
-
Variante B (falls Bluetooth nicht benötigt wird oder Probleme auftreten): Bluetooth vollständig deaktivieren.
sudo bash -c 'cat <<EOT >>/boot/firmware/config.txt dtoverlay=disable-bt EOT' sudo systemctl disable hciuart
-
Variante A (empfohlen, entspricht der Konfiguration von OpenCCU selbst): Bluetooth auf die Mini-UART verlegen; Bluetooth bleibt eingeschränkt nutzbar.
- Serielle Konsole deaktivieren:
sudo sed -i /boot/firmware/cmdline.txt -e "s/console=\(serial0\|ttyAMA0\),[0-9]\+ //" sudo systemctl stop [email protected] && sudo systemctl disable [email protected] && sudo systemctl mask [email protected]
config.txtbzw.cmdline.txtdirekt unter/boot/. - Device-Tree-Overlays installieren:
-
Armbian: Device-Tree-Overlays installieren:
-
HmIP-RFUSB – sicherstellen, dass keine kollidierende udev-Regel vorhanden ist:
sudo rm -f /etc/udev/rules.d/10-hmiprfusb.rules
-
udev-Regeln für Homematic-Geräte anlegen:
sudo bash -c 'cat <<EOF >/etc/udev/rules.d/99-Homematic.rules ATTRS{idVendor}=="1b1f", ATTRS{idProduct}=="c020", ENV{ID_MM_DEVICE_IGNORE}="1" ATTRS{idVendor}=="1b1f", ATTRS{idProduct}=="c00f", ENV{ID_MM_DEVICE_IGNORE}="1" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6f70", ENV{ID_MM_DEVICE_IGNORE}="1" ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="8c07", ENV{ID_MM_DEVICE_IGNORE}="1" EOF'
-
eq3_char_loopbeim Systemstart laden:sudo sh -c 'echo eq3_char_loop >/etc/modules-load.d/eq3_char_loop.conf' -
Kernel-Module jetzt starten/laden:
sudo service pivccu-dkms start sudo modprobe eq3_char_loop
Hinweis: Schlägt
modprobe eq3_char_loopfehl, die Kernel-Header installieren bzw. aktualisieren (siehe Schritt 1) und die Module neu übersetzen:sudo apt install --reinstall pivccu-modules-dkms
-
macvlan-Netzwerk mit dem Namenccuanlegen (entfällt bei Verwendung von Docker Compose, siehe unten):docker network create -d macvlan \ --opt parent=<INTERFACE> \ --subnet <SUBNET> \ --gateway <GATEWAY> \ ccu -
„Shim“-Verbindung einrichten, damit der Host den Container erreichen kann (macvlan trennt Host und Container standardmäßig):
sudo ip link add ccu-shim link <INTERFACE> type macvlan mode bridge sudo ip addr add <AUX-ADDRESS> dev ccu-shim sudo ip link set ccu-shim up sudo ip route add <IP-ADDRESS> dev ccu-shim protocol static
Diese
ip-Kommandos sind nicht dauerhaft; sie müssen bei jedem Systemstart ausgeführt bzw. in ein Startskript übernommen werden.Beispiel für Debian/Ubuntu mit ifupdown – Datei
/etc/network/if-up.d/99-ccu-shim-networkanlegen:#!/bin/sh if [ "$IFACE" = "<INTERFACE>" ]; then if ! ip link show ccu-shim >/dev/null 2>&1; then ip link add ccu-shim link <INTERFACE> type macvlan mode bridge ip addr add <AUX-ADDRESS> dev ccu-shim ip link set ccu-shim up ip route add <IP-ADDRESS> dev ccu-shim protocol static fi fi
Danach:
sudo chmod a+rx /etc/network/if-up.d/99-ccu-shim-network
Beispiel für Systeme mit NetworkManager (z. B. Raspberry Pi OS):
sudo nmcli connection add type macvlan con-name ccu-shim ifname ccu-shim mode bridge dev <INTERFACE> sudo nmcli connection modify ccu-shim ipv4.addresses "<AUX-ADDRESS>" sudo nmcli connection modify ccu-shim ipv4.method manual sudo nmcli connection modify ccu-shim +ipv4.routes "<IP-ADDRESS>" sudo nmcli connection modify ccu-shim connection.autoconnect yes sudo nmcli connection up ccu-shim
Kontrolle, ob die Einstellungen korrekt übernommen wurden:
nmcli device status ip route show
Der Container kann über docker pull, docker load oder Docker Compose (bzw. über das Skript install-docker.sh) eingerichtet werden. Alle <…>-Platzhalter entsprechend ersetzen.
- Aktuelles Image herunterladen:
docker pull ghcr.io/openccu/openccu:latest
- Container anlegen:
docker create --name ccu \ --read-only \ --volume ccu_data:/usr/local:rw \ --volume /lib/modules:/lib/modules:ro \ --volume /run/udev/control:/run/udev/control \ --privileged --restart always --stop-timeout 30 \ --network ccu --ip <IP-ADDRESS> --hostname ccu \ ghcr.io/openccu/openccu:latest - Starten:
Hinweis: Ohne
docker start -i ccu
-istartet der Container im Hintergrund.
- Aktuelles OpenCCU-Docker/OCI-Image herunterladen (für arm64-Hosts
oci_arm64stattoci_amd64verwenden):wget https://github.com/OpenCCU/OpenCCU/releases/download/3.XX.XX.YYYYMMDD/OpenCCU-3.XX.XX.YYYYMMDD-oci_amd64.tgz
- In Docker laden:
docker load < OpenCCU-3.XX.XX.YYYYMMDD-oci_amd64.tgz - Container anlegen:
docker create --name ccu \ --read-only \ --volume ccu_data:/usr/local:rw \ --volume /lib/modules:/lib/modules:ro \ --volume /run/udev/control:/run/udev/control \ --privileged --restart always --stop-timeout 30 \ --network ccu --ip <IP-ADDRESS> --hostname ccu \ ghcr.io/openccu/openccu:amd64-3.XX.XX.YYYYMMDD - Starten:
Hinweis: Ohne
docker start -i ccu
-istartet der Container im Hintergrund.
- Folgendes in die
docker-compose.ymlaufnehmen:services: openccu: image: ghcr.io/openccu/openccu:latest container_name: ccu hostname: ccu read_only: true privileged: true restart: unless-stopped stop_grace_period: 30s volumes: - ccu_data:/usr/local:rw - /lib/modules:/lib/modules:ro - /run/udev/control:/run/udev/control networks: ccu: ipv4_address: <IP-ADDRESS> volumes: ccu_data: networks: ccu: name: ccu driver: macvlan driver_opts: parent: <INTERFACE> ipam: config: - subnet: <SUBNET> gateway: <GATEWAY>
- Mit Compose starten:
docker compose up -d
-
ERROR: could not insert 'eq3_char_loop': Exec format errorDie notwendigen Kernel-Module konnten nicht für den Host-Kernel übersetzt werden. Abhilfe:sudo apt remove --purge linux-headers-* sudo rm -rf /usr/src/linux-headers-* sudo apt autoremove && sudo apt autoclean sudo apt install linux-headers-generic sudo apt install --reinstall pivccu-modules-dkms
(Unter Raspberry Pi OS statt
linux-headers-genericdas Paketlinux-headers-rpi-v8installieren.) -
Homematic IP-Dienst startet nicht bzw.
HmIP-RFUSB-TKwird nicht erkannt Die Kernel-Module auf dem Host sind zu alt.pivccu-modules-dkmsauf mindestens Version 1.0.88 aktualisieren:sudo apt update && sudo apt install --only-upgrade pivccu-modules-dkms -
Langsame oder unzuverlässige Funkkommunikation Sicherstellen, dass der Container genügend CPU-Zeit erhält, um Funktelegramme rechtzeitig zu verarbeiten. Dazu z. B.
--cap-add=SYS_NICEsowie CPU-Einstellungen beimdocker createergänzen, bzw. in Compose:openccu: # ... cap_add: - SYS_NICE cpu_shares: 4096 # 4x mehr CPU-Zyklen in Lastspitzen deploy: update_config: order: stop-first resources: reservations: cpus: '0.6' memory: 256M
-
(Teilweise veraltet) Fehler
cpu.rt_runtime_us == 0indocker logs ccuDer Host-Kernel wurde mitCONFIG_RT_GROUP_SCHEDübersetzt und der Docker-Daemon verfügt über zu wenig Echtzeit-Laufzeit.-
Option für den Docker-Daemon in
/etc/docker/daemon.jsonsetzen:{ "cpu-rt-runtime": 950000 }Danach Docker neu starten:
sudo systemctl restart docker. -
Je nach Installationsweg zusätzlich:
-
install-docker.sh: in aktuellen Versionen nicht erforderlich. -
docker pull/docker load: beim Anlegen des Containers ergänzen:--cpu-rt-runtime 950000 --ulimit rtprio=99
-
Docker Compose (
docker-compose.yml):cpu_rt_runtime: 950000 ulimits: rtprio: 99
-
-
Im Browser die IP-Adresse des Containers aufrufen:
http://<IP-ADDRESS>/
Anschließend helfen die ersten Schritte nach der Installation bei der weiteren Einrichtung.
Entweder SSH in der WebUI aktivieren oder:
docker exec -it ccu /bin/shUpdates erfolgen vom Host aus (auf dem für Docker üblichen Weg) mit demselben Verfahren wie bei der Installation – also durch erneutes Ausführen von install-docker.sh, per docker pull mit anschließendem Neuanlegen des Containers oder über Docker Compose (docker compose pull && docker compose up -d). Die Konfiguration im Volume ccu_data bleibt dabei erhalten.
Um die gesamte OpenCCU-Container-Einrichtung zu entfernen (inklusive Netzwerke und Konfigurationen auf dem Host), das Installationsskript mit dem Parameter uninstall aufrufen:
wget -qO - https://openccu.de/install-docker.sh | sudo bash -s uninstallDabei werden Container, Netzwerke und zugehörige Konfigurationsdateien entfernt. Nach einem Neustart sollte nur noch das Daten-Volume (ccu_data) übrig sein, das bei Bedarf mit docker volume rm ccu_data gelöscht werden kann.
Über Umgebungsvariablen lassen sich die Voreinstellungen des Skripts anpassen:
-
CCU_DATA_VOLUMEName des Docker-Volumes für die persistenten CCU-Daten (kann auch auf ein eingebundenes NAS, ein Cluster-Dateisystem usw. zeigen). Standard:ccu_data -
CCU_OCI_REPOZu verwendendes Container-Image-Repository. Standard:ghcr.io/openccu/openccu -
CCU_OCI_TAGTag des Container-Images. Standard:latest -
CCU_CONTAINER_NAMEName der Container-Instanz (wird auch als--hostnameverwendet). Standard:ccu -
CCU_CONTAINER_IPStatische IP-Adresse des Containers (z. B.192.168.178.4), außerhalb des DHCP-Bereichs. Standard: (leer; wird interaktiv abgefragt) -
CCU_CONTAINER_IP_AUXZusätzliche IP-Adresse des Hosts (z. B.192.168.178.3), im selben Subnetz, außerhalb des DHCP-Bereichs. Standard: (leer; wird interaktiv abgefragt) -
CCU_NETWORK_NAMEName des Docker-macvlan-Netzwerks. Standard:ccu -
CCU_NETWORK_INTERFACENetzwerkinterface des Hosts (z. B.eth0,ensXX). Standard: (automatisch ermittelt bzw. interaktiv abgefragt) -
CCU_NETWORK_SUBNETSubnetz (z. B.192.168.178.0/24). Standard: (automatisch ermittelt bzw. interaktiv abgefragt) -
CCU_NETWORK_GATEWAYIP-Adresse des Gateways (z. B.192.168.178.1). Standard: (automatisch ermittelt bzw. interaktiv abgefragt) -
CCU_DOCKER_RUN_OPTIONSZusätzliche Optionen fürdocker run. Standard: (leer) -
CCU_DOCKER_PULL_OPTIONSZusätzliche Optionen fürdocker pull. Standard: (leer) -
CCU_DOCKER_PULL_REFRESHOb das Image perdocker pullaktualisiert werden soll. Standard:true -
CCU_DOCKER_STOP_TIMEOUTZeit (in Sekunden), die dem Container zum Beenden gewährt wird, bevor Docker ihn zwangsweise stoppt. Standard:30