From 6a1a57d450af934c736c46dddb96305f029cdc29 Mon Sep 17 00:00:00 2001 From: buanet Date: Sat, 18 Sep 2021 13:16:25 +0200 Subject: [PATCH 1/9] doku --- src/README_docker_hub_buanet.md | 110 ++++++++++++++++++++++++++++++ src/README_docker_hub_iobroker.md | 110 ++++++++++++++++++++++++++++++ src/img/iobroker_logo.png | Bin 0 -> 64327 bytes 3 files changed, 220 insertions(+) create mode 100644 src/README_docker_hub_buanet.md create mode 100644 src/README_docker_hub_iobroker.md create mode 100644 src/img/iobroker_logo.png diff --git a/src/README_docker_hub_buanet.md b/src/README_docker_hub_buanet.md new file mode 100644 index 0000000..63f5133 --- /dev/null +++ b/src/README_docker_hub_buanet.md @@ -0,0 +1,110 @@ + +[![Docker Image Size (tag)](https://img.shields.io/docker/image-size/buanet/iobroker/latest?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) +[![Docker Pulls](https://img.shields.io/docker/pulls/buanet/iobroker?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) +[![Docker Stars](https://img.shields.io/docker/stars/buanet/iobroker?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker)
+[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/buanet/ioBroker.docker/Build%20debian%20based%20image%20\(beta\))](https://github.com/buanet/docker.watchdog/actions/workflows/docker_build_main_image.yml) +[![Release](https://img.shields.io/github/v/release/buanet/ioBroker.docker?style=flat)](https://github.com/buanet/ioBroker.docker/releases) +[![Github Issues](https://img.shields.io/github/issues/buanet/ioBroker.docker?style=flat)](https://github.com/buanet/ioBroker.docker/issues)
+[![Source](https://img.shields.io/badge/source-github-blue?style=flat)](https://github.com/buanet/ioBroker.docker) +[![License](https://img.shields.io/github/license/buanet/ioBroker.docker?style=flat)](https://github.com/buanet/ioBroker.docker/blob/master/LICENSE.md) +[![Donate](https://img.shields.io/badge/donate-paypal-blue?style=flat)](https://paypal.me/buanet) + +**Note:** New major versions (e.g. v4, v5, v6) of the image always come with a new major verson of node (preinstalled). To avoid issues when upgrading into a new major version the best practice recommendation is to migrate using backup and restore procedure. For more details please see "Best Practices" section on official [readme.md](https://github.com/buanet/ioBroker.docker#best-practices). + +# Quick reference + +* Maintained by: [buanet](https://github.com/buanet) and [ioBroker](https://github.com/ioBroker) +* Where to get support: [ioBroker Forum](https://forum.iobroker.net/), [ioBroker Discord Channel](https://discord.gg/HwUCwsH) +* Where to report issues: [Github Repository Issues](https://github.com/buanet/ioBroker.docker/issues) +* Supported architectures: amd64, arm32v7, arm64v8 +* Changelog: [Github Repository Changelog](https://github.com/buanet/ioBroker.docker/blob/main/CHANGELOG.md) +* All other questions should be answered here: [Github Repository Readme](https://github.com/buanet/ioBroker.docker#readme) or [iobroker.net](https://www.iobroker.net/) + +# Supported tags + +* `v5.2.0`, `v5.2.0-amd64`, `v5.2.0-arm32v7`, `v5.2.0-arm64v8`, `latest-v5`, `latest` +* `v5.2.0-node14`, `v5.2.0-node14-amd64`, `v5.2.0-node14-arm32v7`, `v5.2.0-node14-arm64v8`, `latest-v5-node14`, `latest-node14` +* `v5.1.0`, `v5.2.0-amd64`, `v5.2.0-armv7hf`, `v5.2.0-aarch64` + +# What is ioBroker? + +Text + +# How to use this image? + +## Running from command-line + +For taking a first look at iobroker on docker it would be enough to simply run the following basic docker run command: + +``` +docker run -p 8081:8081 --name iobroker -h iobroker iobroker/iobroker +``` + +## Running with docker-compose + +When using docker-compose define the iobroker service like this: + +``` +version: '2' + +services: + iobroker: + container_name: iobroker + image: iobroker/iobroker + hostname: iobroker + restart: always + ports: + - "8081:8081" +``` + +## Persistent data + +To make your ioBroker configuration persistent it is recommended to mount a volume or path to `/opt/iobroker`. + +On command-line add +``` +-v iobrokerdata:/opt/iobroker +``` +On docker-compose add +``` + volumes: + - iobrokerdata:/opt/iobroker +``` + +## Configuration via environment variables + +You could use environment variables to auto configure your ioBroker container on startup. + +### Configure ioBroker application: + +* `IOB_ADMINPORT`(optional, default: 8081) Sets ioBroker adminport on startup +* `IOB_MULTIHOST`(optional) Sets ioBroker "master" or "slave" for multihost support (needs additional config for objectsdb and statesdb!) +* `IOB_OBJECTSDB_HOST` (optional, default: 127.0.0.1) Sets host for ioBroker objects db +* `IOB_OBJECTSDB_PORT` (optional, default: 9001) Sets port for ioBroker objects db +* `IOB_OBJECTSDB_TYPE` (optional, default: file) Sets type of ioBroker objects db, cloud be "file" or "redis" (at the moment redis as objects db is [not officially supported by ioBroker](https://github.com/ioBroker/ioBroker#databases)) +* `IOB_STATESDB_HOST` (optional, default: 127.0.0.1) Sets host for ioBroker states db +* `IOB_STATESDB_PORT` (optional, default: 9000) Sets port for ioBroker states db +* `IOB_STATESDB_TYPE` (optional, default: file) Sets type of ioBroker states db, could be "file" or "redis" + +### Activate special features: + +* `AVAHI` (optional, default: false) Installs and activates avahi-daemon for supporting yahka-adapter, can be "true" or "false" +* `ZWAVE` false|Will install openzwave to support zwave-adapter, can be "true" or "false"| + +### Configure environment: + +* `LANG` (optional, default: de_DE.UTF‑8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 +* `LANGUAGE` (optional, default: de_DE:de) The following locales are pre-generated: de_DE:de, en_US:en +* `LC_ALL` (optional, default: de_DE.UTF-8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 +* `PACKAGES` (optional) Installs additional linux packages to your container, packages should be seperated by whitespace like this: "package1 package2 package3". +* `SETGID` (optional, default: 1000) In some cases it might be useful to specify the gid of the containers iobroker user to match an existing group on the docker host +* `SETUID` (optional, default: 1000) In some cases it might be useful to specify the uid of the containers iobroker user to match an existing user on the docker host +* `TZ` (optional, default: Europe/Berlin) Specifys the timeszone +* `USBDEVICES` (optional) Sets relevant permissions on mounted devices like "/dev/ttyACM0". For more than one device separate with ";". + +# Support the Project + +If you like what you see please leave us stars and likes on our repos and join our growing community. +See you soon. :) + + diff --git a/src/README_docker_hub_iobroker.md b/src/README_docker_hub_iobroker.md new file mode 100644 index 0000000..cd19163 --- /dev/null +++ b/src/README_docker_hub_iobroker.md @@ -0,0 +1,110 @@ + + +[![Docker Image Size (tag)](https://img.shields.io/docker/image-size/buanet/iobroker/latest?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) +[![Docker Pulls](https://img.shields.io/docker/pulls/buanet/iobroker?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) +[![Docker Stars](https://img.shields.io/docker/stars/buanet/iobroker?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker)
+[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/buanet/ioBroker.docker/Build%20debian%20based%20image%20\(beta\))](https://github.com/buanet/docker.watchdog/actions/workflows/docker_build_main_image.yml) +[![Release](https://img.shields.io/github/v/release/buanet/ioBroker.docker?style=flat)](https://github.com/buanet/ioBroker.docker/releases) +[![Github Issues](https://img.shields.io/github/issues/buanet/ioBroker.docker?style=flat)](https://github.com/buanet/ioBroker.docker/issues)
+[![Source](https://img.shields.io/badge/source-github-blue?style=flat)](https://github.com/buanet/ioBroker.docker) +[![License](https://img.shields.io/github/license/buanet/ioBroker.docker?style=flat)](https://github.com/buanet/ioBroker.docker/blob/master/LICENSE.md) + +**Note:** New major versions (e.g. v4, v5, v6) of the image always come with a new major verson of node (preinstalled). To avoid issues when upgrading into a new major version the best practice recommendation is to migrate using backup and restore procedure. For more details please see "Best Practices" section on official [readme.md](https://github.com/buanet/ioBroker.docker#best-practices). + +# Quick reference + +* Maintained by: [buanet](https://github.com/buanet) and [ioBroker](https://github.com/ioBroker) +* Where to get support: [ioBroker Forum](https://forum.iobroker.net/), [ioBroker Discord Channel](https://discord.gg/HwUCwsH) +* Where to report issues: [Github Repository Issues](https://github.com/buanet/ioBroker.docker/issues) +* Supported architectures: amd64, arm32v7, arm64v8 +* Changelog: [Github Repository Changelog](https://github.com/buanet/ioBroker.docker/blob/main/CHANGELOG.md) +* All other questions should be answered here: [Github Repository Readme](https://github.com/buanet/ioBroker.docker#readme) or [iobroker.net](https://www.iobroker.net/) + +# Supported tags + +* `v5.2.0`, `v5.2.0-amd64`, `v5.2.0-arm32v7`, `v5.2.0-arm64v8`, `latest-v5`, `latest` +* `v5.2.0-node14`, `v5.2.0-node14-amd64`, `v5.2.0-node14-arm32v7`, `v5.2.0-node14-arm64v8`, `latest-v5-node14`, `latest-node14` +* `v5.1.0`, `v5.2.0-amd64`, `v5.2.0-armv7hf`, `v5.2.0-aarch64` + +# What is ioBroker? + +Text + +# How to use this image? + +## Running from command-line + +For taking a first look at iobroker on docker it would be enough to simply run the following basic docker run command: + +``` +docker run -p 8081:8081 --name iobroker -h iobroker iobroker/iobroker +``` + +## Running with docker-compose + +When using docker-compose define the iobroker service like this: + +``` +version: '2' + +services: + iobroker: + container_name: iobroker + image: iobroker/iobroker + hostname: iobroker + restart: always + ports: + - "8081:8081" +``` + +## Persistent data + +To make your ioBroker configuration persistent it is recommended to mount a volume or path to `/opt/iobroker`. + +On command-line add +``` +-v iobrokerdata:/opt/iobroker +``` +On docker-compose add +``` + volumes: + - iobrokerdata:/opt/iobroker +``` + +## Configuration via environment variables + +You could use environment variables to auto configure your ioBroker container on startup. + +### Configure ioBroker application: + +* `IOB_ADMINPORT`(optional, default: 8081) Sets ioBroker adminport on startup +* `IOB_MULTIHOST`(optional) Sets ioBroker "master" or "slave" for multihost support (needs additional config for objectsdb and statesdb!) +* `IOB_OBJECTSDB_HOST` (optional, default: 127.0.0.1) Sets host for ioBroker objects db +* `IOB_OBJECTSDB_PORT` (optional, default: 9001) Sets port for ioBroker objects db +* `IOB_OBJECTSDB_TYPE` (optional, default: file) Sets type of ioBroker objects db, cloud be "file" or "redis" (at the moment redis as objects db is [not officially supported by ioBroker](https://github.com/ioBroker/ioBroker#databases)) +* `IOB_STATESDB_HOST` (optional, default: 127.0.0.1) Sets host for ioBroker states db +* `IOB_STATESDB_PORT` (optional, default: 9000) Sets port for ioBroker states db +* `IOB_STATESDB_TYPE` (optional, default: file) Sets type of ioBroker states db, could be "file" or "redis" + +### Activate special features: + +* `AVAHI` (optional, default: false) Installs and activates avahi-daemon for supporting yahka-adapter, can be "true" or "false" +* `ZWAVE` false|Will install openzwave to support zwave-adapter, can be "true" or "false"| + +### Configure environment: + +* `LANG` (optional, default: de_DE.UTF‑8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 +* `LANGUAGE` (optional, default: de_DE:de) The following locales are pre-generated: de_DE:de, en_US:en +* `LC_ALL` (optional, default: de_DE.UTF-8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 +* `PACKAGES` (optional) Installs additional linux packages to your container, packages should be seperated by whitespace like this: "package1 package2 package3". +* `SETGID` (optional, default: 1000) In some cases it might be useful to specify the gid of the containers iobroker user to match an existing group on the docker host +* `SETUID` (optional, default: 1000) In some cases it might be useful to specify the uid of the containers iobroker user to match an existing user on the docker host +* `TZ` (optional, default: Europe/Berlin) Specifys the timeszone +* `USBDEVICES` (optional) Sets relevant permissions on mounted devices like "/dev/ttyACM0". For more than one device separate with ";". + +# Support the Project + +If you like what you see please leave us stars and likes on our repos and join our growing community. +See you soon. :) + + diff --git a/src/img/iobroker_logo.png b/src/img/iobroker_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..00c71bbcae5e537b593d733e4ac69e845e382ac5 GIT binary patch literal 64327 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 literal 0 HcmV?d00001 From 3625cbd854e44a30571a4f0ba3a1a95516be5e9f Mon Sep 17 00:00:00 2001 From: buanet Date: Sat, 18 Sep 2021 13:24:38 +0200 Subject: [PATCH 2/9] doku --- src/README_docker_hub_buanet.md | 7 +++---- src/README_docker_hub_iobroker.md | 6 ++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/README_docker_hub_buanet.md b/src/README_docker_hub_buanet.md index 63f5133..a0be349 100644 --- a/src/README_docker_hub_buanet.md +++ b/src/README_docker_hub_buanet.md @@ -1,3 +1,4 @@ + [![Docker Image Size (tag)](https://img.shields.io/docker/image-size/buanet/iobroker/latest?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) [![Docker Pulls](https://img.shields.io/docker/pulls/buanet/iobroker?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) @@ -28,7 +29,7 @@ # What is ioBroker? -Text +Text coming soon. # How to use this image? @@ -81,7 +82,7 @@ You could use environment variables to auto configure your ioBroker container on * `IOB_MULTIHOST`(optional) Sets ioBroker "master" or "slave" for multihost support (needs additional config for objectsdb and statesdb!) * `IOB_OBJECTSDB_HOST` (optional, default: 127.0.0.1) Sets host for ioBroker objects db * `IOB_OBJECTSDB_PORT` (optional, default: 9001) Sets port for ioBroker objects db -* `IOB_OBJECTSDB_TYPE` (optional, default: file) Sets type of ioBroker objects db, cloud be "file" or "redis" (at the moment redis as objects db is [not officially supported by ioBroker](https://github.com/ioBroker/ioBroker#databases)) +* `IOB_OBJECTSDB_TYPE` (optional, default: file) Sets type of ioBroker objects db, cloud be "file" or "redis" ([not officially supported](https://github.com/ioBroker/ioBroker#databases)). * `IOB_STATESDB_HOST` (optional, default: 127.0.0.1) Sets host for ioBroker states db * `IOB_STATESDB_PORT` (optional, default: 9000) Sets port for ioBroker states db * `IOB_STATESDB_TYPE` (optional, default: file) Sets type of ioBroker states db, could be "file" or "redis" @@ -106,5 +107,3 @@ You could use environment variables to auto configure your ioBroker container on If you like what you see please leave us stars and likes on our repos and join our growing community. See you soon. :) - - diff --git a/src/README_docker_hub_iobroker.md b/src/README_docker_hub_iobroker.md index cd19163..2b0dd71 100644 --- a/src/README_docker_hub_iobroker.md +++ b/src/README_docker_hub_iobroker.md @@ -28,7 +28,7 @@ # What is ioBroker? -Text +Text coming soon. # How to use this image? @@ -81,7 +81,7 @@ You could use environment variables to auto configure your ioBroker container on * `IOB_MULTIHOST`(optional) Sets ioBroker "master" or "slave" for multihost support (needs additional config for objectsdb and statesdb!) * `IOB_OBJECTSDB_HOST` (optional, default: 127.0.0.1) Sets host for ioBroker objects db * `IOB_OBJECTSDB_PORT` (optional, default: 9001) Sets port for ioBroker objects db -* `IOB_OBJECTSDB_TYPE` (optional, default: file) Sets type of ioBroker objects db, cloud be "file" or "redis" (at the moment redis as objects db is [not officially supported by ioBroker](https://github.com/ioBroker/ioBroker#databases)) +* `IOB_OBJECTSDB_TYPE` (optional, default: file) Sets type of ioBroker objects db, cloud be "file" or "redis" ([not officially supported](https://github.com/ioBroker/ioBroker#databases)). * `IOB_STATESDB_HOST` (optional, default: 127.0.0.1) Sets host for ioBroker states db * `IOB_STATESDB_PORT` (optional, default: 9000) Sets port for ioBroker states db * `IOB_STATESDB_TYPE` (optional, default: file) Sets type of ioBroker states db, could be "file" or "redis" @@ -106,5 +106,3 @@ You could use environment variables to auto configure your ioBroker container on If you like what you see please leave us stars and likes on our repos and join our growing community. See you soon. :) - - From 01175aa825732ff6fab294cdd9552c78873d81a7 Mon Sep 17 00:00:00 2001 From: buanet Date: Sat, 18 Sep 2021 19:31:51 +0200 Subject: [PATCH 3/9] testing --- debian/node12/Dockerfile | 4 +++- debian/scripts/iobroker_startup.sh | 23 ++--------------------- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/debian/node12/Dockerfile b/debian/node12/Dockerfile index d594501..720a8c4 100644 --- a/debian/node12/Dockerfile +++ b/debian/node12/Dockerfile @@ -48,9 +48,11 @@ WORKDIR / RUN apt-get update \ && curl -sL https://iobroker.net/install.sh | bash - \ && mkdir -p /opt/scripts/.docker_config/ \ - && echo $(hostname) > /opt/scripts/.docker_config/.install_host \ && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ + && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ && echo $(hostname) > /opt/.firstrun \ + # Deleting UUID from build + && iobroker unsetup -y # Backup initial ioBroker and userscript folder && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ diff --git a/debian/scripts/iobroker_startup.sh b/debian/scripts/iobroker_startup.sh index 84e2964..ef5e6b8 100644 --- a/debian/scripts/iobroker_startup.sh +++ b/debian/scripts/iobroker_startup.sh @@ -75,7 +75,7 @@ echo "$(printf -- '-%.0s' {1..80})" echo ' ' # Adding ckeck file for easy docker detection by ioBroker -echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker +# echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker # <<< moved to dockerfile # Installing/updating additional packages, registering maintenance script and setting uid/gid if [ "$packages" != "" ] || [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] || [ -f /opt/.firstrun ] @@ -133,12 +133,11 @@ then echo "Restoring initial ioBroker installation..." tar -xf /opt/initial_iobroker.tar -C / # Removing UUID generated on docker image build - bash iobroker unsetup -y + #bash iobroker unsetup -y # <<< moved to dockerfile echo "Done." elif [ -f /opt/iobroker/iobroker ] then echo "Existing installation of ioBroker detected in /opt/iobroker." - rm -f /opt/scripts/.docker_config/.install_host elif [ $(ls *_backupiobroker.tar.gz 2> /dev/null | wc -l) != "0" ] && [ $(tar -ztvf /opt/iobroker/*_backupiobroker.tar.gz "backup/backup.json" 2> /dev/null | wc -l) != "0" ] then if [ "$multihost" = "slave" ] @@ -216,24 +215,6 @@ then echo ' ' fi -# Checking for first run of a new installation and renaming ioBroker -#if [ -f /opt/scripts/.docker_config/.install_host ] -#then -# echo "Looks like this is a new and empty installation of ioBroker." -# echo "Hostname needs to be updated to " $(hostname)"..." -# bash iobroker host $(cat /opt/scripts/.docker_config/.install_host) -# rm -f /opt/scripts/.docker_config/.install_host -# echo "Done." -# echo ' ' -#elif [ $(bash iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') != $(hostname) ] -#then -# echo "Hostname in ioBroker does not match the hostname of this container." -# echo "Updating hostname to " $(hostname)"..." -# bash iobroker host $(iobroker object get system.adapter.admin.0 --pretty | grep -oP '(?<="host": ")[^"]*') -# echo "Done." -# echo ' ' -#fi - ##### # STEP 4 - Setting up prerequisites for some ioBroker-adapters From d5e7f9885e19f5c5309ad4b136592c459f768fdc Mon Sep 17 00:00:00 2001 From: buanet Date: Sat, 18 Sep 2021 19:33:23 +0200 Subject: [PATCH 4/9] testing --- debian/node12/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/node12/Dockerfile b/debian/node12/Dockerfile index 720a8c4..ddceb6e 100644 --- a/debian/node12/Dockerfile +++ b/debian/node12/Dockerfile @@ -52,7 +52,7 @@ RUN apt-get update \ && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ && echo $(hostname) > /opt/.firstrun \ # Deleting UUID from build - && iobroker unsetup -y + && iobroker unsetup -y \ # Backup initial ioBroker and userscript folder && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ From c798465219ad549cc8e810e91e7b898a743a99c3 Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 19 Sep 2021 01:39:49 +0200 Subject: [PATCH 5/9] testing --- debian/node14/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/node14/Dockerfile b/debian/node14/Dockerfile index 6c9efb2..f565b39 100644 --- a/debian/node14/Dockerfile +++ b/debian/node14/Dockerfile @@ -48,9 +48,11 @@ WORKDIR / RUN apt-get update \ && curl -sL https://iobroker.net/install.sh | bash - \ && mkdir -p /opt/scripts/.docker_config/ \ - && echo $(hostname) > /opt/scripts/.docker_config/.install_host \ && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ + && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ && echo $(hostname) > /opt/.firstrun \ + # Deleting UUID from build + && iobroker unsetup -y \ # Backup initial ioBroker and userscript folder && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ From 07d15bcf20ea92e9526046455134e3b7fcc3c400 Mon Sep 17 00:00:00 2001 From: buanet Date: Tue, 21 Sep 2021 17:50:26 +0200 Subject: [PATCH 6/9] update actions --- ..._image.yml => build-debian-image-main.yml} | 75 ++++++++++--------- 1 file changed, 38 insertions(+), 37 deletions(-) rename .github/workflows/{docker_build_main_image.yml => build-debian-image-main.yml} (79%) diff --git a/.github/workflows/docker_build_main_image.yml b/.github/workflows/build-debian-image-main.yml similarity index 79% rename from .github/workflows/docker_build_main_image.yml rename to .github/workflows/build-debian-image-main.yml index bd335df..cba5550 100644 --- a/.github/workflows/docker_build_main_image.yml +++ b/.github/workflows/build-debian-image-main.yml @@ -1,24 +1,25 @@ # Github action to build Docker image from main branch (tag: latest) - -name: Build Docker image from main +name: Build debian based image (latest) on: workflow_dispatch: - #release: - # types: - # - published - + release: + types: + - published + schedule: + - cron: '42 3 * * 5' + jobs: - bulid_latest: + bulid-latest-image: runs-on: ubuntu-latest steps: - - name: Checkout (main) + - name: Checkout repo (main) uses: actions/checkout@v2.3.4 with: repository: 'buanet/ioBroker.docker' ref: 'main' - - name: Get and wirte version and date + - name: Get and write version and date id: version run: | VERSION="$(cat .VERSION)" @@ -30,83 +31,83 @@ jobs: echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV echo "This is the Buildnumber/Timestamp: $DATI" echo "dati=$DATI" >> $GITHUB_ENV - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./amd64/Dockerfile > ./amd64/Dockerfile.tmp - mv -f ./amd64/Dockerfile.tmp ./amd64/Dockerfile - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./arm32v7/Dockerfile > ./arm32v7/Dockerfile.tmp - mv -f ./arm32v7/Dockerfile.tmp ./arm32v7/Dockerfile - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./arm64v8/Dockerfile > ./arm64v8/Dockerfile.tmp - mv -f ./arm64v8/Dockerfile.tmp ./arm64v8/Dockerfile + # startup script + sed -e "s/\${VERSION}/$VERSION/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp + mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh + # amd64 + sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node12/Dockerfile > ./debian/node12/Dockerfile.tmp + mv -f ./debian/node12/Dockerfile.tmp ./debian/node12/Dockerfile - name: Set up manifest tool run: | wget https://github.com/estesp/manifest-tool/releases/download/v0.7.0/manifest-tool-linux-amd64 -O manifest-tool chmod +x manifest-tool - + - name: Set up QEMU uses: docker/setup-qemu-action@v1.2.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v1.3.0 + uses: docker/setup-buildx-action@v1.5.1 - name: Login to DockerHub uses: docker/login-action@v1.10.0 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - + - name: Login to GitHub Container Registry uses: docker/login-action@v1.10.0 with: registry: ghcr.io username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - + - name: Build Docker image (amd64) uses: docker/build-push-action@v2.6.1 with: - context: ./amd64 - file: ./amd64/Dockerfile + context: ./debian + file: ./debian/node12/Dockerfile push: true platforms: linux/amd64 tags: | buanet/iobroker:${{ env.version }}-amd64, ghcr.io/buanet/iobroker:${{ env.version }}-amd64 - - - name: Build Docker image (armv32v7) + + - name: Build Docker image (arm32v7) uses: docker/build-push-action@v2.6.1 with: - context: ./arm32v7 - file: ./arm32v7/Dockerfile + context: ./debian + file: ./debian/node12/Dockerfile push: true platforms: linux/arm/v7 tags: | buanet/iobroker:${{ env.version }}-arm32v7, ghcr.io/buanet/iobroker:${{ env.version }}-arm32v7 - + - name: Build Docker image (arm64v8) uses: docker/build-push-action@v2.6.1 with: - context: ./arm64v8 - file: ./arm64v8/Dockerfile + context: ./debian + file: ./debian/node12/Dockerfile push: true - platforms: linux/arm64 + platforms: linux/arm64/v8 tags: | buanet/iobroker:${{ env.version }}-arm64v8, ghcr.io/buanet/iobroker:${{ env.version }}-arm64v8 - + - name: Create and push manifests run: | sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/latest/g" ./manifest.yml > manifest_latest.yaml ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_latest.yaml - sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.majorversion }}/g" ./manifest.yml > manifest_latestmajor.yaml - ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_latestmajor.yaml - sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.version }}/g" ./manifest.yml > manifest_version.yaml - ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_version.yaml sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/latest/g" ./manifest_ghcr.yml > manifest_ghcr_latest.yaml ./manifest-tool --username ${{ secrets.PACKAGES_USER }} --password ${{ secrets.PACKAGES_PASS }} push from-spec manifest_ghcr_latest.yaml - sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.majorversion }}/g" ./manifest_ghcr.yml > manifest_ghcr_latestmajor.yaml - ./manifest-tool --username ${{ secrets.PACKAGES_USER }} --password ${{ secrets.PACKAGES_PASS }} push from-spec manifest_ghcr_latestmajor.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.majorversion }}/g" ./manifest.yml > manifest_majorversion.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_majorversion.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.majorversion }}/g" ./manifest_ghcr.yml > manifest_ghcr_majorversion.yaml + ./manifest-tool --username ${{ secrets.PACKAGES_USER }} --password ${{ secrets.PACKAGES_PASS }} push from-spec manifest_ghcr_majorversion.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.version }}/g" ./manifest.yml > manifest_version.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_version.yaml sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.version }}/g" ./manifest_ghcr.yml > manifest_ghcr_version.yaml ./manifest-tool --username ${{ secrets.PACKAGES_USER }} --password ${{ secrets.PACKAGES_PASS }} push from-spec manifest_ghcr_version.yaml @@ -128,4 +129,4 @@ jobs: env: OWNER: buanet PACKAGE_NAME: iobroker - PER_PAGE: 100 + PER_PAGE: 100 From edd9c5ec519dc6de1dc8905bfac781ff2bfeefda Mon Sep 17 00:00:00 2001 From: buanet Date: Tue, 21 Sep 2021 19:33:03 +0200 Subject: [PATCH 7/9] add github action --- .github/workflows/build-debian-image-main.yml | 4 +- .../workflows/build-debian-image-main_iob.yml | 96 +++++++++++++++++++ manifest_iob.yml | 19 ++++ 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/build-debian-image-main_iob.yml create mode 100644 manifest_iob.yml diff --git a/.github/workflows/build-debian-image-main.yml b/.github/workflows/build-debian-image-main.yml index cba5550..783059a 100644 --- a/.github/workflows/build-debian-image-main.yml +++ b/.github/workflows/build-debian-image-main.yml @@ -50,7 +50,7 @@ jobs: id: buildx uses: docker/setup-buildx-action@v1.5.1 - - name: Login to DockerHub + - name: Login to DockerHub (buanet) uses: docker/login-action@v1.10.0 with: username: ${{ secrets.DOCKER_USER }} @@ -96,7 +96,7 @@ jobs: buanet/iobroker:${{ env.version }}-arm64v8, ghcr.io/buanet/iobroker:${{ env.version }}-arm64v8 - - name: Create and push manifests + - name: Create and push manifests (buanet) run: | sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/latest/g" ./manifest.yml > manifest_latest.yaml ./manifest-tool --username ${{ secrets.DOCKER_USER }} --password ${{ secrets.DOCKER_PASS }} push from-spec manifest_latest.yaml diff --git a/.github/workflows/build-debian-image-main_iob.yml b/.github/workflows/build-debian-image-main_iob.yml new file mode 100644 index 0000000..ed4edba --- /dev/null +++ b/.github/workflows/build-debian-image-main_iob.yml @@ -0,0 +1,96 @@ +# Github action to build Docker image from main branch for iobroker/iobroker (tag: latest) +name: Build debian based image (latest) + +on: + workflow_dispatch: + release: + types: + - published + schedule: + - cron: '42 3 * * 5' + +jobs: + bulid-latest-image: + runs-on: ubuntu-latest + steps: + - name: Checkout repo (main) + uses: actions/checkout@v2.3.4 + with: + repository: 'buanet/ioBroker.docker' + ref: 'main' + + - name: Get and write version and date + id: version + run: | + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + echo "This is the Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "This is the Major Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "This is the Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # startup script + sed -e "s/\${VERSION}/$VERSION/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp + mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh + # amd64 + sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node12/Dockerfile > ./debian/node12/Dockerfile.tmp + mv -f ./debian/node12/Dockerfile.tmp ./debian/node12/Dockerfile + + - name: Set up manifest tool + run: | + wget https://github.com/estesp/manifest-tool/releases/download/v0.7.0/manifest-tool-linux-amd64 -O manifest-tool + chmod +x manifest-tool + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1.2.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1.5.1 + + - name: Login to DockerHub (iobroker) + uses: docker/login-action@v1.10.0 + with: + username: ${{ secrets.DOCKER_USER_IOB }} + password: ${{ secrets.DOCKER_PASS_IOB }} + + - name: Build Docker image (amd64) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node12/Dockerfile + push: true + platforms: linux/amd64 + tags: | + iobroker/iobroker:${{ env.version }}-amd64, + + - name: Build Docker image (arm32v7) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node12/Dockerfile + push: true + platforms: linux/arm/v7 + tags: | + iobroker/iobroker:${{ env.version }}-arm32v7, + + - name: Build Docker image (arm64v8) + uses: docker/build-push-action@v2.6.1 + with: + context: ./debian + file: ./debian/node12/Dockerfile + push: true + platforms: linux/arm64/v8 + tags: | + iobroker/iobroker:${{ env.version }}-arm64v8, + + - name: Create and push manifests (iobroker) + run: | + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/latest/g" ./manifest_iob.yml > manifest_latest_iob.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER_IOB }} --password ${{ secrets.DOCKER_PASS_IOB }} push from-spec manifest_latest_iob.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.majorversion }}/g" ./manifest_iob.yml > manifest_majorversion_iob.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER_IOB }} --password ${{ secrets.DOCKER_PASS_IOB }} push from-spec manifest_majorversion_iob.yaml + sed -e "s/\${VERSION}/${{ env.version }}/g" -e "s/\${DOCKERTAG}/${{ env.version }}/g" ./manifest_iob.yml > manifest_version_iob.yaml + ./manifest-tool --username ${{ secrets.DOCKER_USER_IOB }} --password ${{ secrets.DOCKER_PASS_IOB }} push from-spec manifest_version_iob.yaml diff --git a/manifest_iob.yml b/manifest_iob.yml new file mode 100644 index 0000000..80ddb53 --- /dev/null +++ b/manifest_iob.yml @@ -0,0 +1,19 @@ +image: iobroker/iobroker:${DOCKERTAG} +manifests: + - + image: iobroker/iobroker:${VERSION}-amd64 + platform: + architecture: amd64 + os: linux + - + image: iobroker/iobroker:${VERSION}-arm64v8 + platform: + architecture: arm64 + variant: v8 + os: linux + - + image: iobroker/iobroker:${VERSION}-arm32v7 + platform: + architecture: arm + variant: v7 + os: linux From 945f7d05930360218a056589cd4ac6683df26575 Mon Sep 17 00:00:00 2001 From: buanet Date: Thu, 30 Sep 2021 12:54:45 +0200 Subject: [PATCH 8/9] update hub readme --- debian/scripts/iobroker_startup.sh | 10 ---------- src/README_docker_hub_buanet.md | 17 +++++++++++++++-- src/README_docker_hub_iobroker.md | 17 +++++++++++++++-- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/debian/scripts/iobroker_startup.sh b/debian/scripts/iobroker_startup.sh index ef5e6b8..643eeb8 100644 --- a/debian/scripts/iobroker_startup.sh +++ b/debian/scripts/iobroker_startup.sh @@ -74,9 +74,6 @@ echo "----- Step 1 of 5: Preparing container echo "$(printf -- '-%.0s' {1..80})" echo ' ' -# Adding ckeck file for easy docker detection by ioBroker -# echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker # <<< moved to dockerfile - # Installing/updating additional packages, registering maintenance script and setting uid/gid if [ "$packages" != "" ] || [ $(cat /etc/group | grep 'iobroker:' | cut -d':' -f3) != $setgid ] || [ $(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3) != $setuid ] || [ -f /opt/.firstrun ] then @@ -132,8 +129,6 @@ then echo "There is no data detected in /opt/iobroker." echo "Restoring initial ioBroker installation..." tar -xf /opt/initial_iobroker.tar -C / - # Removing UUID generated on docker image build - #bash iobroker unsetup -y # <<< moved to dockerfile echo "Done." elif [ -f /opt/iobroker/iobroker ] then @@ -158,11 +153,6 @@ then echo "Done." echo "Restoring ioBroker..." bash iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 - # fixing hostname issues when restoring on different host - open issue https://github.com/ioBroker/ioBroker.js-controller/issues/1450 - #if [ $(jq -r .system.hostname ./iobroker-data/iobroker.json) != $(hostname) ] - #then - # bash iobroker host $(jq -r .system.hostname ./iobroker-data/iobroker.json) - #fi echo "Done." echo ' ' echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" diff --git a/src/README_docker_hub_buanet.md b/src/README_docker_hub_buanet.md index a0be349..353733d 100644 --- a/src/README_docker_hub_buanet.md +++ b/src/README_docker_hub_buanet.md @@ -1,4 +1,4 @@ - + [![Docker Image Size (tag)](https://img.shields.io/docker/image-size/buanet/iobroker/latest?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) [![Docker Pulls](https://img.shields.io/docker/pulls/buanet/iobroker?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) @@ -19,6 +19,7 @@ * Where to report issues: [Github Repository Issues](https://github.com/buanet/ioBroker.docker/issues) * Supported architectures: amd64, arm32v7, arm64v8 * Changelog: [Github Repository Changelog](https://github.com/buanet/ioBroker.docker/blob/main/CHANGELOG.md) +* Source code: [Github Repository](https://github.com/buanet/ioBroker.docker) * All other questions should be answered here: [Github Repository Readme](https://github.com/buanet/ioBroker.docker#readme) or [iobroker.net](https://www.iobroker.net/) # Supported tags @@ -29,7 +30,9 @@ # What is ioBroker? -Text coming soon. +IoBroker is a open source IoT platform written in JavaScript that easily connects smarthome componets from different manufactures. With the help of plugins (called: "adapters") ioBroker is able to communicate with a big variety of IoT hardware and services using different protocols and APIs.
+All data is stored in a central database that all adapters can access. With this it is very easy to build up logical connections, automation scripts and beautiful visualisations.
+For further details please check out [iobroker.net](https://www.iobroker.net). # How to use this image? @@ -103,6 +106,16 @@ You could use environment variables to auto configure your ioBroker container on * `TZ` (optional, default: Europe/Berlin) Specifys the timeszone * `USBDEVICES` (optional) Sets relevant permissions on mounted devices like "/dev/ttyACM0". For more than one device separate with ";". +## Notes about Docker networks + +The examples above are dealing with the Docker default bridge network. In general there are [some reasons](https://docs.docker.com/network/bridge/#differences-between-user-defined-bridges-and-the-default-bridge) why it might be the better choice to use a user-defined bridge network. + +Using a Docker bridge network works fine for taking a first look and with most of the ioBroker adapters (if you dont forget to redirect the ports your adapers use).
+But some ioBroker adapters are using techniques like [Multicast](https://en.wikipedia.org/wiki/Multicast) or [Broadcast](https://en.wikipedia.org/wiki/Broadcasting_(networking)) for automatic detection of IoT devices
+In this case it may be useful to switch to [host](https://docs.docker.com/network/host/) or [MACVLAN](https://docs.docker.com/network/macvlan/) network. + +For more information about networking with Docker please refer to the [official Docker docs](https://docs.docker.com/network/). + # Support the Project If you like what you see please leave us stars and likes on our repos and join our growing community. diff --git a/src/README_docker_hub_iobroker.md b/src/README_docker_hub_iobroker.md index 2b0dd71..26768ef 100644 --- a/src/README_docker_hub_iobroker.md +++ b/src/README_docker_hub_iobroker.md @@ -1,4 +1,4 @@ - + [![Docker Image Size (tag)](https://img.shields.io/docker/image-size/buanet/iobroker/latest?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) [![Docker Pulls](https://img.shields.io/docker/pulls/buanet/iobroker?style=flat)](https://hub.docker.com/repository/docker/buanet/iobroker) @@ -18,6 +18,7 @@ * Where to report issues: [Github Repository Issues](https://github.com/buanet/ioBroker.docker/issues) * Supported architectures: amd64, arm32v7, arm64v8 * Changelog: [Github Repository Changelog](https://github.com/buanet/ioBroker.docker/blob/main/CHANGELOG.md) +* Source code: [Github Repository](https://github.com/buanet/ioBroker.docker) * All other questions should be answered here: [Github Repository Readme](https://github.com/buanet/ioBroker.docker#readme) or [iobroker.net](https://www.iobroker.net/) # Supported tags @@ -28,7 +29,9 @@ # What is ioBroker? -Text coming soon. +IoBroker is a open source IoT platform written in JavaScript that easily connects smarthome componets from different manufactures. With the help of plugins (called: "adapters") ioBroker is able to communicate with a big variety of IoT hardware and services using different protocols and APIs.
+All data is stored in a central database that all adapters can access. With this it is very easy to build up logical connections, automation scripts and beautiful visualisations.
+For further details please check out [iobroker.net](https://www.iobroker.net). # How to use this image? @@ -102,6 +105,16 @@ You could use environment variables to auto configure your ioBroker container on * `TZ` (optional, default: Europe/Berlin) Specifys the timeszone * `USBDEVICES` (optional) Sets relevant permissions on mounted devices like "/dev/ttyACM0". For more than one device separate with ";". +## Notes about Docker networks + +The examples above are dealing with the Docker default bridge network. In general there are [some reasons](https://docs.docker.com/network/bridge/#differences-between-user-defined-bridges-and-the-default-bridge) why it might be the better choice to use a user-defined bridge network. + +Using a Docker bridge network works fine for taking a first look and with most of the ioBroker adapters (if you dont forget to redirect the ports your adapers use).
+But some ioBroker adapters are using techniques like [Multicast](https://en.wikipedia.org/wiki/Multicast) or [Broadcast](https://en.wikipedia.org/wiki/Broadcasting_(networking)) for automatic detection of IoT devices
+In this case it may be useful to switch to [host](https://docs.docker.com/network/host/) or [MACVLAN](https://docs.docker.com/network/macvlan/) network. + +For more information about networking with Docker please refer to the [official Docker docs](https://docs.docker.com/network/). + # Support the Project If you like what you see please leave us stars and likes on our repos and join our growing community. From 3f040e51a043e8bb21670f9c4a4d84d29a711b87 Mon Sep 17 00:00:00 2001 From: buanet Date: Thu, 30 Sep 2021 12:59:13 +0200 Subject: [PATCH 9/9] fix typo --- src/README_docker_hub_buanet.md | 2 +- src/README_docker_hub_iobroker.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/README_docker_hub_buanet.md b/src/README_docker_hub_buanet.md index 353733d..f62f20e 100644 --- a/src/README_docker_hub_buanet.md +++ b/src/README_docker_hub_buanet.md @@ -93,7 +93,7 @@ You could use environment variables to auto configure your ioBroker container on ### Activate special features: * `AVAHI` (optional, default: false) Installs and activates avahi-daemon for supporting yahka-adapter, can be "true" or "false" -* `ZWAVE` false|Will install openzwave to support zwave-adapter, can be "true" or "false"| +* `ZWAVE` (optional, default: false) Installs openzwave to support zwave-adapter, can be "true" or "false" ### Configure environment: diff --git a/src/README_docker_hub_iobroker.md b/src/README_docker_hub_iobroker.md index 26768ef..70b7b78 100644 --- a/src/README_docker_hub_iobroker.md +++ b/src/README_docker_hub_iobroker.md @@ -92,7 +92,7 @@ You could use environment variables to auto configure your ioBroker container on ### Activate special features: * `AVAHI` (optional, default: false) Installs and activates avahi-daemon for supporting yahka-adapter, can be "true" or "false" -* `ZWAVE` false|Will install openzwave to support zwave-adapter, can be "true" or "false"| +* `AVAHI` (optional, default: false) Installs and activates avahi-daemon for supporting yahka-adapter, can be "true" or "false" ### Configure environment: