From b8bddc55d4d18998b6661cd54b16e6f5f2a1cc41 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 8 Jun 2020 11:13:35 +0200 Subject: [PATCH 1/8] testing for multihost support --- amd64/scripts/iobroker_startup.sh | 84 +++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh index 4c2b690..a796ea4 100644 --- a/amd64/scripts/iobroker_startup.sh +++ b/amd64/scripts/iobroker_startup.sh @@ -3,6 +3,7 @@ # Reading ENV adminport=$IOB_ADMINPORT avahi=$AVAHI +multihost=$IOB_MULTIHOST objectsdbhost=$IOB_OBJECTSDB_HOST objectsdbport=$IOB_OBJECTSDB_PORT objectsdbtype=$IOB_OBJECTSDB_TYPE @@ -254,6 +255,89 @@ then fi +# Checking ENV for multihost setup +# Configuring objects db host +if [ "$multihost" = "master" ] && [ "$objectsdbtype" = "" ] && [ "$objectsdbhost" = "" ] && [ "$objectsdbport" = "" ] +then + echo "Multihost is set as \"master\" by ENV and no external objects db is set." + echo "Setting host of objects db to \"0.0.0.0\" to allow external communication..." + jq --arg objectsdbhost "0.0.0.0" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + echo "Done." + echo ' ' +elif [ "$multihost" = "master" ] && [ "$objectsdbhost" = "127.0.0.1" ] +then + echo "Multihost is set as \"master\" by ENV. But objects db host is set to \"127.0.0.1\" by ENV too." + echo "This configuration will not work! Please change or remove ENV \"IOB_OBJECTSDB_HOST\" and start over!" + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "master" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] +then + echo "Multihost is set as \"master\" by ENV and external objects db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif [[ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]] || [[ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]] || [[ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]] +then + echo "Multihost is set as \"slave\" by ENV. But no external objects db is set." + echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a maser objects db." + echo "Please check your settings and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "slave" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] +then + echo "Multihost is set as \"slave\" by ENV and external objects db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif [ "$multihost" != "" ] +then + echo "Multihost is set but it seems like some configuration is missing." + echo "Please checke if you have configured the ENVs \"MULTIHOST\", \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" correctly and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +fi +#Configuring states db host +if [ "$multihost" = "master" ] && [ "$statesdbtype" = "" ] && [ "$statesdbhost" = "" ] && [ "$statesdbport" = "" ] +then + echo "Multihost is set as \"master\" by ENV and no external states db is set." + echo "Setting host of states db to \"0.0.0.0\" to allow external communication..." + jq --arg statesdbhost "0.0.0.0" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + echo "Done." + echo ' ' +elif [ "$multihost" = "master" ] && [ "$statesdbhost" = "127.0.0.1" ] +then + echo "Multihost is set as \"master\" by ENV. But states db host is set to \"127.0.0.1\" by ENV too." + echo "This configuration will not work! Please change or remove ENV \"IOB_STATESDB_HOST\" and start over!" + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "master" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] +then + echo "Multihost is set as \"master\" by ENV and external states db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif [[ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]] || [[ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]] || [[ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]] +then + echo "Multihost is set as \"slave\" by ENV. But no external states db is set." + echo "You have to configure ENVs \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESDB_PORT\" to connect to a maser states db." + echo "Please check your settings and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "slave" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] +then + echo "Multihost is set as \"slave\" by ENV and external states db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif [ "$multihost" != "" ] +then + echo "Multihost is set but it seems like some configuration is missing." + echo "Please checke if you have configured the ENVs \"MULTIHOST\", \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESTDB_PORT\" correctly and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +fi + + # Checking ENVs for custom setup of objects db if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] then From 1c7d8925662775c028a703c6ec71dc2aa79abd9b Mon Sep 17 00:00:00 2001 From: buanet Date: Tue, 9 Jun 2020 11:40:09 +0200 Subject: [PATCH 2/8] testing --- amd64/scripts/iobroker_startup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh index a796ea4..ca1d5f1 100644 --- a/amd64/scripts/iobroker_startup.sh +++ b/amd64/scripts/iobroker_startup.sh @@ -276,7 +276,7 @@ then echo "Skipping this step..." echo "Done." echo ' ' -elif [[ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]] || [[ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]] || [[ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]] +elif ([ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]) then echo "Multihost is set as \"slave\" by ENV. But no external objects db is set." echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a maser objects db." @@ -316,7 +316,7 @@ then echo "Skipping this step..." echo "Done." echo ' ' -elif [[ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]] || [[ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]] || [[ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]] +elif ([ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]) then echo "Multihost is set as \"slave\" by ENV. But no external states db is set." echo "You have to configure ENVs \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESDB_PORT\" to connect to a maser states db." From 52a247603443526a1167d50ce587ad125891316a Mon Sep 17 00:00:00 2001 From: andre <> Date: Sun, 21 Jun 2020 21:42:47 +0200 Subject: [PATCH 3/8] some testing --- amd64/Dockerfile | 4 +++- amd64/scripts/iobroker_startup.sh | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/amd64/Dockerfile b/amd64/Dockerfile index 55f9309..32f416c 100644 --- a/amd64/Dockerfile +++ b/amd64/Dockerfile @@ -92,4 +92,6 @@ ENV DEBIAN_FRONTEND="teletype" \ TZ="Europe/Berlin" # Run startup-script -ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] +# ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] +ENTRYPOINT ["/opt/scripts/iobroker_startup.sh"] +CMD ["gosu iobroker node node_modules/iobroker.js-controller/controller.js"] diff --git a/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh index ca1d5f1..6227836 100644 --- a/amd64/scripts/iobroker_startup.sh +++ b/amd64/scripts/iobroker_startup.sh @@ -451,7 +451,7 @@ echo ' ' echo "Starting ioBroker..." echo ' ' -gosu iobroker node node_modules/iobroker.js-controller/controller.js +# gosu iobroker node node_modules/iobroker.js-controller/controller.js # Preventing container restart by keeping a process alive even if iobroker will be stopped -tail -f /dev/null +# tail -f /dev/null From c80b5f9c8b56fec1ddf1041bab05f4add9112fe4 Mon Sep 17 00:00:00 2001 From: andre <> Date: Sun, 21 Jun 2020 22:21:11 +0200 Subject: [PATCH 4/8] some testing --- amd64/Dockerfile | 2 +- amd64/scripts/iobroker_startup.sh | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/amd64/Dockerfile b/amd64/Dockerfile index 32f416c..39d1f2b 100644 --- a/amd64/Dockerfile +++ b/amd64/Dockerfile @@ -94,4 +94,4 @@ ENV DEBIAN_FRONTEND="teletype" \ # Run startup-script # ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] ENTRYPOINT ["/opt/scripts/iobroker_startup.sh"] -CMD ["gosu iobroker node node_modules/iobroker.js-controller/controller.js"] +CMD ["iob"] diff --git a/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh index 6227836..5b335a3 100644 --- a/amd64/scripts/iobroker_startup.sh +++ b/amd64/scripts/iobroker_startup.sh @@ -1,5 +1,8 @@ #!/bin/bash +set -e +if [ "$1" = 'iob' ]; +then # Reading ENV adminport=$IOB_ADMINPORT avahi=$AVAHI @@ -451,7 +454,11 @@ echo ' ' echo "Starting ioBroker..." echo ' ' -# gosu iobroker node node_modules/iobroker.js-controller/controller.js +exec gosu iobroker node node_modules/iobroker.js-controller/controller.js "$@" + +fi + +exec "$@" # Preventing container restart by keeping a process alive even if iobroker will be stopped # tail -f /dev/null From 4b3f57b06314ab016025792a5f3626b85c46c2d5 Mon Sep 17 00:00:00 2001 From: andre <> Date: Sun, 21 Jun 2020 23:55:51 +0200 Subject: [PATCH 5/8] some testing --- amd64/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/amd64/Dockerfile b/amd64/Dockerfile index 39d1f2b..ddb8699 100644 --- a/amd64/Dockerfile +++ b/amd64/Dockerfile @@ -79,7 +79,9 @@ RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ # Setting up iobroker-user (shell and home directory) RUN chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker + && usermod --home /opt/iobroker iobroker \ + && usermod -u 901 iobroker \ + && groupmod -g 901 iobroker # Setting up ENVs ENV DEBIAN_FRONTEND="teletype" \ @@ -87,8 +89,8 @@ ENV DEBIAN_FRONTEND="teletype" \ LANGUAGE="de_DE:de" \ LC_ALL="de_DE.UTF-8" \ PACKAGES="vi" \ - SETGID=1000 \ - SETUID=1000 \ + SETGID=901 \ + SETUID=901 \ TZ="Europe/Berlin" # Run startup-script From 397b4ea536fa0264f8e1172df0a7e14247b04cdd Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 22 Jun 2020 16:24:30 +0200 Subject: [PATCH 6/8] some testing --- amd64/Dockerfile | 13 +++--- amd64/scripts/iobroker_startup.sh | 72 ++++++++++++++----------------- 2 files changed, 38 insertions(+), 47 deletions(-) diff --git a/amd64/Dockerfile b/amd64/Dockerfile index ddb8699..597c0f0 100644 --- a/amd64/Dockerfile +++ b/amd64/Dockerfile @@ -80,20 +80,17 @@ RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ # Setting up iobroker-user (shell and home directory) RUN chsh -s /bin/bash iobroker \ && usermod --home /opt/iobroker iobroker \ - && usermod -u 901 iobroker \ - && groupmod -g 901 iobroker + && usermod -u 1000 iobroker \ + && groupmod -g 1000 iobroker # Setting up ENVs ENV DEBIAN_FRONTEND="teletype" \ LANG="de_DE.UTF-8" \ LANGUAGE="de_DE:de" \ LC_ALL="de_DE.UTF-8" \ - PACKAGES="vi" \ - SETGID=901 \ - SETUID=901 \ + SETGID=1000 \ + SETUID=1000 \ TZ="Europe/Berlin" # Run startup-script -# ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] -ENTRYPOINT ["/opt/scripts/iobroker_startup.sh"] -CMD ["iob"] +ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh index 5b335a3..9916a81 100644 --- a/amd64/scripts/iobroker_startup.sh +++ b/amd64/scripts/iobroker_startup.sh @@ -1,8 +1,5 @@ #!/bin/bash -set -e -if [ "$1" = 'iob' ]; -then # Reading ENV adminport=$IOB_ADMINPORT avahi=$AVAHI @@ -79,7 +76,7 @@ then echo "Installing additional packages is set by ENV." echo "The following packages will be installed:" $packages"..." echo $packages > /opt/scripts/.packages - bash /opt/scripts/setup_packages.sh + bash /opt/scripts/setup_packages.sh echo "Done." echo ' ' fi @@ -87,13 +84,14 @@ then then echo "Different UID and/ or GID is set by ENV." echo "Changing UID to "$setuid" and GID to "$setgid"..." - usermod -u $setuid iobroker - groupmod -g $setgid iobroker + usermod -u $setuid iobroker + groupmod -g $setgid iobroker echo "Done." echo ' ' fi else echo "Nothing to do here." + echo ' ' fi # Change directory for next steps @@ -111,7 +109,7 @@ echo ' ' if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] then echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." - tar -xf /opt/initial_iobroker.tar -C / + tar -xf /opt/initial_iobroker.tar -C / echo "Done." elif [ -f /opt/iobroker/iobroker ] then @@ -119,11 +117,11 @@ then elif [ $(ls iobroker_20* 2> /dev/null | wc -l) != "0" ] && [ $(tar -ztvf /opt/iobroker/iobroker_20*.tar.gz "backup/backup.json" 2> /dev/null | wc -l) != "0" ] then echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..." - mv /opt/iobroker/*.tar.gz /opt/ - tar -xf /opt/initial_iobroker.tar -C / - mkdir /opt/iobroker/backups - mv /opt/*.tar.gz /opt/iobroker/backups/ - iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 + mv /opt/iobroker/*.tar.gz /opt/ + tar -xf /opt/initial_iobroker.tar -C / + mkdir /opt/iobroker/backups + mv /opt/*.tar.gz /opt/iobroker/backups/ + iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 echo "Done." echo ' ' echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @@ -204,7 +202,7 @@ then then echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Setting Adminport to \""$adminport"\"..." - bash iobroker set admin.0 --port $adminport + bash iobroker set admin.0 --port $adminport echo "Done." echo ' ' fi @@ -217,8 +215,8 @@ then if [ "$avahi" = "true" ] then echo "Avahi-daemon is activated by ENV." - chmod 755 /opt/scripts/setup_avahi.sh - bash /opt/scripts/setup_avahi.sh + chmod 755 /opt/scripts/setup_avahi.sh + bash /opt/scripts/setup_avahi.sh echo "Done." echo ' ' fi @@ -231,8 +229,8 @@ then if [ "$zwave" = "true" ] then echo "Z-Wave is activated by ENV." - chmod 755 /opt/scripts/setup_zwave.sh - bash /opt/scripts/setup_zwave.sh + chmod 755 /opt/scripts/setup_zwave.sh + bash /opt/scripts/setup_zwave.sh echo "Done." echo ' ' fi @@ -264,7 +262,7 @@ if [ "$multihost" = "master" ] && [ "$objectsdbtype" = "" ] && [ "$objectsdbhost then echo "Multihost is set as \"master\" by ENV and no external objects db is set." echo "Setting host of objects db to \"0.0.0.0\" to allow external communication..." - jq --arg objectsdbhost "0.0.0.0" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbhost "0.0.0.0" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." echo ' ' elif [ "$multihost" = "master" ] && [ "$objectsdbhost" = "127.0.0.1" ] @@ -304,7 +302,7 @@ if [ "$multihost" = "master" ] && [ "$statesdbtype" = "" ] && [ "$statesdbhost" then echo "Multihost is set as \"master\" by ENV and no external states db is set." echo "Setting host of states db to \"0.0.0.0\" to allow external communication..." - jq --arg statesdbhost "0.0.0.0" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbhost "0.0.0.0" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." echo ' ' elif [ "$multihost" = "master" ] && [ "$statesdbhost" = "127.0.0.1" ] @@ -348,7 +346,7 @@ then then echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." echo "Setting type of objects db to \""$objectsdbtype"\"..." - jq --arg objectsdbtype "$objectsdbtype" '.objects.type = $objectsdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbtype "$objectsdbtype" '.objects.type = $objectsdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." @@ -357,7 +355,7 @@ then then echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." echo "Setting host of objects db to \""$objectsdbhost"\"..." - jq --arg objectsdbhost "$objectsdbhost" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbhost "$objectsdbhost" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." @@ -366,7 +364,7 @@ then then echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." echo "Setting port of objects db to \""$objectsdbport"\"..." - jq --arg objectsdbport "$objectsdbport" '.objects.port = $objectsdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbport "$objectsdbport" '.objects.port = $objectsdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." @@ -382,7 +380,7 @@ then then echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." echo "Setting type of states db to \""$statesdbtype"\"..." - jq --arg statesdbtype "$statesdbtype" '.states.type = $statesdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbtype "$statesdbtype" '.states.type = $statesdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." @@ -391,7 +389,7 @@ then then echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." echo "Setting host of states db to \""$statesdbhost"\"..." - jq --arg statesdbhost "$statesdbhost" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbhost "$statesdbhost" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." @@ -400,7 +398,7 @@ then then echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." echo "Setting port of states db to \""$statesdbport"\"..." - jq --arg statesdbport "$statesdbport" '.states.port = $statesdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbport "$statesdbport" '.states.port = $statesdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." @@ -413,9 +411,9 @@ fi if [ `find /opt/userscripts -type f | wc -l` -lt 1 ] then echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." - tar -xf /opt/initial_userscripts.tar -C / - chmod 755 /opt/userscripts/userscript_firststart_example.sh - chmod 755 /opt/userscripts/userscript_everystart_example.sh + tar -xf /opt/initial_userscripts.tar -C / + chmod 755 /opt/userscripts/userscript_firststart_example.sh + chmod 755 /opt/userscripts/userscript_everystart_example.sh echo "Done." echo ' ' elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] @@ -424,17 +422,17 @@ then then echo "Userscript for first start detected and this is the first start of a new container." echo "Running userscript_firststart.sh..." - chmod 755 /opt/userscripts/userscript_firststart.sh - bash /opt/userscripts/userscript_firststart.sh - rm -f /opt/.firstrun + chmod 755 /opt/userscripts/userscript_firststart.sh + bash /opt/userscripts/userscript_firststart.sh + rm -f /opt/.firstrun echo "Done." echo ' ' fi if [ -f /opt/userscripts/userscript_everystart.sh ] then echo "Userscript for every start detected. Running userscript_everystart.sh..." - chmod 755 /opt/userscripts/userscript_everystart.sh - bash /opt/userscripts/userscript_everystart.sh + chmod 755 /opt/userscripts/userscript_everystart.sh + bash /opt/userscripts/userscript_everystart.sh echo "Done." echo ' ' fi @@ -454,11 +452,7 @@ echo ' ' echo "Starting ioBroker..." echo ' ' -exec gosu iobroker node node_modules/iobroker.js-controller/controller.js "$@" - -fi - -exec "$@" +exec gosu iobroker node node_modules/iobroker.js-controller/controller.js # Preventing container restart by keeping a process alive even if iobroker will be stopped -# tail -f /dev/null +tail -f /dev/null From 314590d97f51d76086af9be3741ac44dc0680ed7 Mon Sep 17 00:00:00 2001 From: buanet Date: Tue, 23 Jun 2020 00:23:42 +0200 Subject: [PATCH 7/8] some testing --- amd64/scripts/iobroker_startup.sh | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh index 9916a81..0d0fb0d 100644 --- a/amd64/scripts/iobroker_startup.sh +++ b/amd64/scripts/iobroker_startup.sh @@ -439,9 +439,6 @@ then fi -sleep 5 - - ##### # Starting ioBroker ##### @@ -452,7 +449,19 @@ echo ' ' echo "Starting ioBroker..." echo ' ' -exec gosu iobroker node node_modules/iobroker.js-controller/controller.js +# Function for graceful shutdown by SIGTERM signal +shut_down() { + echo ' ' + echo "Recived termination signal (SIGTERM)." + echo "Shutting down ioBroker..." + pid=$(ps -ef | awk '/[j]s.controller/{print $2}') + kill -SIGTERM "$pid" + exit +} + +trap 'shut_down' SIGTERM + +gosu iobroker node node_modules/iobroker.js-controller/controller.js & wait # Preventing container restart by keeping a process alive even if iobroker will be stopped tail -f /dev/null From 71076baae3c15d128938f5979f1f3c73227deb58 Mon Sep 17 00:00:00 2001 From: buanet Date: Tue, 23 Jun 2020 08:19:19 +0200 Subject: [PATCH 8/8] prepare new beta --- .VERSION | 2 +- README.md | 14 ++- aarch64/Dockerfile | 5 +- aarch64/scripts/iobroker_startup.sh | 162 ++++++++++++++++++++++------ amd64/scripts/iobroker_startup.sh | 4 +- armv7hf/Dockerfile | 5 +- armv7hf/scripts/iobroker_startup.sh | 162 ++++++++++++++++++++++------ 7 files changed, 280 insertions(+), 74 deletions(-) diff --git a/.VERSION b/.VERSION index 58d9f45..536a94d 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v4.2.3beta +v4.2.4beta diff --git a/README.md b/README.md index 82adb8a..e9143d6 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ You do not have to declare every single variable when setting up your container. |---|---|---| |AVAHI|false|Installs and activates avahi-daemon for supporting yahka-adapter, can be "true" or "false"| |IOB_ADMINPORT|8081|Sets ioBroker adminport on startup| +|IOB_MULTIHOST|master|Sets ioBroker instance as "master" or "slave" for multihost (additional config for objectsdb and statesdb needed)| |IOB_OBJECTSDB_HOST|127.0.0.1|Sets hostname for ioBroker objects db| |IOB_OBJECTSDB_PORT|9001|Sets port for ioBroker objects db| |IOB_OBJECTSDB_TYPE|file|Sets type of ioBroker objects db, cloud be "file", "redis" or "couch"| @@ -119,6 +120,10 @@ Basically there are two different scripts which will be read and called by the s Hint: To get familiar with that feature try the following: Create a Container, mount an empty folder to /opt/userscripts, start your container. Two scripts will be restored into the empty folder. Rename the example scripts by simply removing "\_example". Restart your container and take a look at the Log. In "Step 4 of 5: Applying special settings" you will see the messages generated by the example userscripts. +### Multihost + +Details will follow soon. + ## Best practices ### Avoid using "latest" tag @@ -157,8 +162,13 @@ Thank you! ## Changelog -### v4.2.3beta (2020-06-05) -* updating js-controller to not stable version 3.1.5 to fix renaming issue +### v4.2.4beta (2020-06-23) +* added graceful shutdown +* small fix for GID/UID handling +* adding new ENV "IOB_MULTIHOST" for multihost support +* small syntax fixes in iobroker_startup.sh +* v4.2.3beta (2020-06-05) + * updating js-controller to not stable version 3.1.5 to fix renaming issue * v4.2.2beta (2020-06-03) * ~~workaround for renaming issues on startup~~ (fixed in js-controller) * v4.2.1beta (2020-05-10) diff --git a/aarch64/Dockerfile b/aarch64/Dockerfile index d4e3e90..85f6760 100644 --- a/aarch64/Dockerfile +++ b/aarch64/Dockerfile @@ -79,14 +79,15 @@ RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ # Setting up iobroker-user (shell and home directory) RUN chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker + && usermod --home /opt/iobroker iobroker \ + && usermod -u 1000 iobroker \ + && groupmod -g 1000 iobroker # Setting up ENVs ENV DEBIAN_FRONTEND="teletype" \ LANG="de_DE.UTF-8" \ LANGUAGE="de_DE:de" \ LC_ALL="de_DE.UTF-8" \ - PACKAGES="vi" \ SETGID=1000 \ SETUID=1000 \ TZ="Europe/Berlin" diff --git a/aarch64/scripts/iobroker_startup.sh b/aarch64/scripts/iobroker_startup.sh index 4c2b690..63c4e89 100644 --- a/aarch64/scripts/iobroker_startup.sh +++ b/aarch64/scripts/iobroker_startup.sh @@ -3,6 +3,7 @@ # Reading ENV adminport=$IOB_ADMINPORT avahi=$AVAHI +multihost=$IOB_MULTIHOST objectsdbhost=$IOB_OBJECTSDB_HOST objectsdbport=$IOB_OBJECTSDB_PORT objectsdbtype=$IOB_OBJECTSDB_TYPE @@ -75,7 +76,7 @@ then echo "Installing additional packages is set by ENV." echo "The following packages will be installed:" $packages"..." echo $packages > /opt/scripts/.packages - bash /opt/scripts/setup_packages.sh + bash /opt/scripts/setup_packages.sh echo "Done." echo ' ' fi @@ -83,13 +84,14 @@ then then echo "Different UID and/ or GID is set by ENV." echo "Changing UID to "$setuid" and GID to "$setgid"..." - usermod -u $setuid iobroker - groupmod -g $setgid iobroker + usermod -u $setuid iobroker + groupmod -g $setgid iobroker echo "Done." echo ' ' fi else echo "Nothing to do here." + echo ' ' fi # Change directory for next steps @@ -107,7 +109,7 @@ echo ' ' if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] then echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." - tar -xf /opt/initial_iobroker.tar -C / + tar -xf /opt/initial_iobroker.tar -C / echo "Done." elif [ -f /opt/iobroker/iobroker ] then @@ -115,11 +117,11 @@ then elif [ $(ls iobroker_20* 2> /dev/null | wc -l) != "0" ] && [ $(tar -ztvf /opt/iobroker/iobroker_20*.tar.gz "backup/backup.json" 2> /dev/null | wc -l) != "0" ] then echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..." - mv /opt/iobroker/*.tar.gz /opt/ - tar -xf /opt/initial_iobroker.tar -C / - mkdir /opt/iobroker/backups - mv /opt/*.tar.gz /opt/iobroker/backups/ - iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 + mv /opt/iobroker/*.tar.gz /opt/ + tar -xf /opt/initial_iobroker.tar -C / + mkdir /opt/iobroker/backups + mv /opt/*.tar.gz /opt/iobroker/backups/ + iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 echo "Done." echo ' ' echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @@ -200,7 +202,7 @@ then then echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Setting Adminport to \""$adminport"\"..." - bash iobroker set admin.0 --port $adminport + bash iobroker set admin.0 --port $adminport echo "Done." echo ' ' fi @@ -213,8 +215,8 @@ then if [ "$avahi" = "true" ] then echo "Avahi-daemon is activated by ENV." - chmod 755 /opt/scripts/setup_avahi.sh - bash /opt/scripts/setup_avahi.sh + chmod 755 /opt/scripts/setup_avahi.sh + bash /opt/scripts/setup_avahi.sh echo "Done." echo ' ' fi @@ -227,8 +229,8 @@ then if [ "$zwave" = "true" ] then echo "Z-Wave is activated by ENV." - chmod 755 /opt/scripts/setup_zwave.sh - bash /opt/scripts/setup_zwave.sh + chmod 755 /opt/scripts/setup_zwave.sh + bash /opt/scripts/setup_zwave.sh echo "Done." echo ' ' fi @@ -254,6 +256,89 @@ then fi +# Checking ENV for multihost setup +# Configuring objects db host +if [ "$multihost" = "master" ] && [ "$objectsdbtype" = "" ] && [ "$objectsdbhost" = "" ] && [ "$objectsdbport" = "" ] +then + echo "Multihost is set as \"master\" by ENV and no external objects db is set." + echo "Setting host of objects db to \"0.0.0.0\" to allow external communication..." + jq --arg objectsdbhost "0.0.0.0" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + echo "Done." + echo ' ' +elif [ "$multihost" = "master" ] && [ "$objectsdbhost" = "127.0.0.1" ] +then + echo "Multihost is set as \"master\" by ENV. But objects db host is set to \"127.0.0.1\" by ENV too." + echo "This configuration will not work! Please change or remove ENV \"IOB_OBJECTSDB_HOST\" and start over!" + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "master" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] +then + echo "Multihost is set as \"master\" by ENV and external objects db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif ([ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]) +then + echo "Multihost is set as \"slave\" by ENV. But no external objects db is set." + echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a maser objects db." + echo "Please check your settings and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "slave" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] +then + echo "Multihost is set as \"slave\" by ENV and external objects db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif [ "$multihost" != "" ] +then + echo "Multihost is set but it seems like some configuration is missing." + echo "Please checke if you have configured the ENVs \"MULTIHOST\", \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" correctly and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +fi +#Configuring states db host +if [ "$multihost" = "master" ] && [ "$statesdbtype" = "" ] && [ "$statesdbhost" = "" ] && [ "$statesdbport" = "" ] +then + echo "Multihost is set as \"master\" by ENV and no external states db is set." + echo "Setting host of states db to \"0.0.0.0\" to allow external communication..." + jq --arg statesdbhost "0.0.0.0" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + echo "Done." + echo ' ' +elif [ "$multihost" = "master" ] && [ "$statesdbhost" = "127.0.0.1" ] +then + echo "Multihost is set as \"master\" by ENV. But states db host is set to \"127.0.0.1\" by ENV too." + echo "This configuration will not work! Please change or remove ENV \"IOB_STATESDB_HOST\" and start over!" + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "master" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] +then + echo "Multihost is set as \"master\" by ENV and external states db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif ([ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]) +then + echo "Multihost is set as \"slave\" by ENV. But no external states db is set." + echo "You have to configure ENVs \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESDB_PORT\" to connect to a maser states db." + echo "Please check your settings and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "slave" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] +then + echo "Multihost is set as \"slave\" by ENV and external states db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif [ "$multihost" != "" ] +then + echo "Multihost is set but it seems like some configuration is missing." + echo "Please checke if you have configured the ENVs \"MULTIHOST\", \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESTDB_PORT\" correctly and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +fi + + # Checking ENVs for custom setup of objects db if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] then @@ -261,7 +346,7 @@ then then echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." echo "Setting type of objects db to \""$objectsdbtype"\"..." - jq --arg objectsdbtype "$objectsdbtype" '.objects.type = $objectsdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbtype "$objectsdbtype" '.objects.type = $objectsdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." @@ -270,7 +355,7 @@ then then echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." echo "Setting host of objects db to \""$objectsdbhost"\"..." - jq --arg objectsdbhost "$objectsdbhost" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbhost "$objectsdbhost" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." @@ -279,7 +364,7 @@ then then echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." echo "Setting port of objects db to \""$objectsdbport"\"..." - jq --arg objectsdbport "$objectsdbport" '.objects.port = $objectsdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbport "$objectsdbport" '.objects.port = $objectsdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." @@ -295,7 +380,7 @@ then then echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." echo "Setting type of states db to \""$statesdbtype"\"..." - jq --arg statesdbtype "$statesdbtype" '.states.type = $statesdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbtype "$statesdbtype" '.states.type = $statesdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." @@ -304,7 +389,7 @@ then then echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." echo "Setting host of states db to \""$statesdbhost"\"..." - jq --arg statesdbhost "$statesdbhost" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbhost "$statesdbhost" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." @@ -313,7 +398,7 @@ then then echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." echo "Setting port of states db to \""$statesdbport"\"..." - jq --arg statesdbport "$statesdbport" '.states.port = $statesdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbport "$statesdbport" '.states.port = $statesdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." @@ -326,9 +411,9 @@ fi if [ `find /opt/userscripts -type f | wc -l` -lt 1 ] then echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." - tar -xf /opt/initial_userscripts.tar -C / - chmod 755 /opt/userscripts/userscript_firststart_example.sh - chmod 755 /opt/userscripts/userscript_everystart_example.sh + tar -xf /opt/initial_userscripts.tar -C / + chmod 755 /opt/userscripts/userscript_firststart_example.sh + chmod 755 /opt/userscripts/userscript_everystart_example.sh echo "Done." echo ' ' elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] @@ -337,26 +422,23 @@ then then echo "Userscript for first start detected and this is the first start of a new container." echo "Running userscript_firststart.sh..." - chmod 755 /opt/userscripts/userscript_firststart.sh - bash /opt/userscripts/userscript_firststart.sh - rm -f /opt/.firstrun + chmod 755 /opt/userscripts/userscript_firststart.sh + bash /opt/userscripts/userscript_firststart.sh + rm -f /opt/.firstrun echo "Done." echo ' ' fi if [ -f /opt/userscripts/userscript_everystart.sh ] then echo "Userscript for every start detected. Running userscript_everystart.sh..." - chmod 755 /opt/userscripts/userscript_everystart.sh - bash /opt/userscripts/userscript_everystart.sh + chmod 755 /opt/userscripts/userscript_everystart.sh + bash /opt/userscripts/userscript_everystart.sh echo "Done." echo ' ' fi fi -sleep 5 - - ##### # Starting ioBroker ##### @@ -367,7 +449,21 @@ echo ' ' echo "Starting ioBroker..." echo ' ' -gosu iobroker node node_modules/iobroker.js-controller/controller.js +# Function for graceful shutdown by SIGTERM signal +shut_down() { + echo ' ' + echo "Recived termination signal (SIGTERM)." + echo "Shutting down ioBroker..." + pid=$(ps -ef | awk '/[j]s.controller/{print $2}') + kill -SIGTERM "$pid" + exit +} -# Preventing container restart by keeping a process alive even if iobroker will be stopped +# Trap to get signal for graceful shutdown +trap 'shut_down' SIGTERM + +# IoBroker start +gosu iobroker node node_modules/iobroker.js-controller/controller.js & wait + +# Fallback process for keeping container running when ioBroker is stopped for maintenance (e.g. js-controller update) tail -f /dev/null diff --git a/amd64/scripts/iobroker_startup.sh b/amd64/scripts/iobroker_startup.sh index 0d0fb0d..63c4e89 100644 --- a/amd64/scripts/iobroker_startup.sh +++ b/amd64/scripts/iobroker_startup.sh @@ -459,9 +459,11 @@ shut_down() { exit } +# Trap to get signal for graceful shutdown trap 'shut_down' SIGTERM +# IoBroker start gosu iobroker node node_modules/iobroker.js-controller/controller.js & wait -# Preventing container restart by keeping a process alive even if iobroker will be stopped +# Fallback process for keeping container running when ioBroker is stopped for maintenance (e.g. js-controller update) tail -f /dev/null diff --git a/armv7hf/Dockerfile b/armv7hf/Dockerfile index ce66351..63f217f 100644 --- a/armv7hf/Dockerfile +++ b/armv7hf/Dockerfile @@ -79,14 +79,15 @@ RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \ # Setting up iobroker-user (shell and home directory) RUN chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker + && usermod --home /opt/iobroker iobroker \ + && usermod -u 1000 iobroker \ + && groupmod -g 1000 iobroker # Setting up ENVs ENV DEBIAN_FRONTEND="teletype" \ LANG="de_DE.UTF-8" \ LANGUAGE="de_DE:de" \ LC_ALL="de_DE.UTF-8" \ - PACKAGES="vim" \ SETGID=1000 \ SETUID=1000 \ TZ="Europe/Berlin" diff --git a/armv7hf/scripts/iobroker_startup.sh b/armv7hf/scripts/iobroker_startup.sh index 4c2b690..63c4e89 100644 --- a/armv7hf/scripts/iobroker_startup.sh +++ b/armv7hf/scripts/iobroker_startup.sh @@ -3,6 +3,7 @@ # Reading ENV adminport=$IOB_ADMINPORT avahi=$AVAHI +multihost=$IOB_MULTIHOST objectsdbhost=$IOB_OBJECTSDB_HOST objectsdbport=$IOB_OBJECTSDB_PORT objectsdbtype=$IOB_OBJECTSDB_TYPE @@ -75,7 +76,7 @@ then echo "Installing additional packages is set by ENV." echo "The following packages will be installed:" $packages"..." echo $packages > /opt/scripts/.packages - bash /opt/scripts/setup_packages.sh + bash /opt/scripts/setup_packages.sh echo "Done." echo ' ' fi @@ -83,13 +84,14 @@ then then echo "Different UID and/ or GID is set by ENV." echo "Changing UID to "$setuid" and GID to "$setgid"..." - usermod -u $setuid iobroker - groupmod -g $setgid iobroker + usermod -u $setuid iobroker + groupmod -g $setgid iobroker echo "Done." echo ' ' fi else echo "Nothing to do here." + echo ' ' fi # Change directory for next steps @@ -107,7 +109,7 @@ echo ' ' if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] then echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." - tar -xf /opt/initial_iobroker.tar -C / + tar -xf /opt/initial_iobroker.tar -C / echo "Done." elif [ -f /opt/iobroker/iobroker ] then @@ -115,11 +117,11 @@ then elif [ $(ls iobroker_20* 2> /dev/null | wc -l) != "0" ] && [ $(tar -ztvf /opt/iobroker/iobroker_20*.tar.gz "backup/backup.json" 2> /dev/null | wc -l) != "0" ] then echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..." - mv /opt/iobroker/*.tar.gz /opt/ - tar -xf /opt/initial_iobroker.tar -C / - mkdir /opt/iobroker/backups - mv /opt/*.tar.gz /opt/iobroker/backups/ - iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 + mv /opt/iobroker/*.tar.gz /opt/ + tar -xf /opt/initial_iobroker.tar -C / + mkdir /opt/iobroker/backups + mv /opt/*.tar.gz /opt/iobroker/backups/ + iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 echo "Done." echo ' ' echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" @@ -200,7 +202,7 @@ then then echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Setting Adminport to \""$adminport"\"..." - bash iobroker set admin.0 --port $adminport + bash iobroker set admin.0 --port $adminport echo "Done." echo ' ' fi @@ -213,8 +215,8 @@ then if [ "$avahi" = "true" ] then echo "Avahi-daemon is activated by ENV." - chmod 755 /opt/scripts/setup_avahi.sh - bash /opt/scripts/setup_avahi.sh + chmod 755 /opt/scripts/setup_avahi.sh + bash /opt/scripts/setup_avahi.sh echo "Done." echo ' ' fi @@ -227,8 +229,8 @@ then if [ "$zwave" = "true" ] then echo "Z-Wave is activated by ENV." - chmod 755 /opt/scripts/setup_zwave.sh - bash /opt/scripts/setup_zwave.sh + chmod 755 /opt/scripts/setup_zwave.sh + bash /opt/scripts/setup_zwave.sh echo "Done." echo ' ' fi @@ -254,6 +256,89 @@ then fi +# Checking ENV for multihost setup +# Configuring objects db host +if [ "$multihost" = "master" ] && [ "$objectsdbtype" = "" ] && [ "$objectsdbhost" = "" ] && [ "$objectsdbport" = "" ] +then + echo "Multihost is set as \"master\" by ENV and no external objects db is set." + echo "Setting host of objects db to \"0.0.0.0\" to allow external communication..." + jq --arg objectsdbhost "0.0.0.0" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + echo "Done." + echo ' ' +elif [ "$multihost" = "master" ] && [ "$objectsdbhost" = "127.0.0.1" ] +then + echo "Multihost is set as \"master\" by ENV. But objects db host is set to \"127.0.0.1\" by ENV too." + echo "This configuration will not work! Please change or remove ENV \"IOB_OBJECTSDB_HOST\" and start over!" + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "master" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] +then + echo "Multihost is set as \"master\" by ENV and external objects db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif ([ "$multihost" = "slave" ] && [ "$objectsdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$objectsdbport" = "" ]) +then + echo "Multihost is set as \"slave\" by ENV. But no external objects db is set." + echo "You have to configure ENVs \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" to connect to a maser objects db." + echo "Please check your settings and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "slave" ] && [ "$objectsdbtype" != "" ] && [ "$objectsdbhost" != "" ] && [ "$objectsdbport" != "" ] +then + echo "Multihost is set as \"slave\" by ENV and external objects db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif [ "$multihost" != "" ] +then + echo "Multihost is set but it seems like some configuration is missing." + echo "Please checke if you have configured the ENVs \"MULTIHOST\", \"IOB_OBJECTSDB_TYPE\", \"IOB_OBJECTSDB_HOST\" and \"IOB_OBJECTSDB_PORT\" correctly and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +fi +#Configuring states db host +if [ "$multihost" = "master" ] && [ "$statesdbtype" = "" ] && [ "$statesdbhost" = "" ] && [ "$statesdbport" = "" ] +then + echo "Multihost is set as \"master\" by ENV and no external states db is set." + echo "Setting host of states db to \"0.0.0.0\" to allow external communication..." + jq --arg statesdbhost "0.0.0.0" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + echo "Done." + echo ' ' +elif [ "$multihost" = "master" ] && [ "$statesdbhost" = "127.0.0.1" ] +then + echo "Multihost is set as \"master\" by ENV. But states db host is set to \"127.0.0.1\" by ENV too." + echo "This configuration will not work! Please change or remove ENV \"IOB_STATESDB_HOST\" and start over!" + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "master" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] +then + echo "Multihost is set as \"master\" by ENV and external states db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif ([ "$multihost" = "slave" ] && [ "$statesdbtype" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbhost" = "" ]) || ([ "$multihost" = "slave" ] && [ "$statesdbport" = "" ]) +then + echo "Multihost is set as \"slave\" by ENV. But no external states db is set." + echo "You have to configure ENVs \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESDB_PORT\" to connect to a maser states db." + echo "Please check your settings and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +elif [ "$multihost" = "slave" ] && [ "$statesdbtype" != "" ] && [ "$statesdbhost" != "" ] && [ "$statesdbport" != "" ] +then + echo "Multihost is set as \"slave\" by ENV and external states db is set." + echo "Skipping this step..." + echo "Done." + echo ' ' +elif [ "$multihost" != "" ] +then + echo "Multihost is set but it seems like some configuration is missing." + echo "Please checke if you have configured the ENVs \"MULTIHOST\", \"IOB_STATESDB_TYPE\", \"IOB_STATESDB_HOST\" and \"IOB_STATESTDB_PORT\" correctly and start over." + echo "For more information see readme.md on Github (https://github.com/buanet/docker-iobroker)." + exit 1 +fi + + # Checking ENVs for custom setup of objects db if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] then @@ -261,7 +346,7 @@ then then echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." echo "Setting type of objects db to \""$objectsdbtype"\"..." - jq --arg objectsdbtype "$objectsdbtype" '.objects.type = $objectsdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbtype "$objectsdbtype" '.objects.type = $objectsdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." @@ -270,7 +355,7 @@ then then echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." echo "Setting host of objects db to \""$objectsdbhost"\"..." - jq --arg objectsdbhost "$objectsdbhost" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbhost "$objectsdbhost" '.objects.host = $objectsdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." @@ -279,7 +364,7 @@ then then echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." echo "Setting port of objects db to \""$objectsdbport"\"..." - jq --arg objectsdbport "$objectsdbport" '.objects.port = $objectsdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg objectsdbport "$objectsdbport" '.objects.port = $objectsdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." @@ -295,7 +380,7 @@ then then echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." echo "Setting type of states db to \""$statesdbtype"\"..." - jq --arg statesdbtype "$statesdbtype" '.states.type = $statesdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbtype "$statesdbtype" '.states.type = $statesdbtype' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." @@ -304,7 +389,7 @@ then then echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." echo "Setting host of states db to \""$statesdbhost"\"..." - jq --arg statesdbhost "$statesdbhost" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbhost "$statesdbhost" '.states.host = $statesdbhost' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." @@ -313,7 +398,7 @@ then then echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." echo "Setting port of states db to \""$statesdbport"\"..." - jq --arg statesdbport "$statesdbport" '.states.port = $statesdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + jq --arg statesdbport "$statesdbport" '.states.port = $statesdbport' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp && mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json echo "Done." else echo "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." @@ -326,9 +411,9 @@ fi if [ `find /opt/userscripts -type f | wc -l` -lt 1 ] then echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." - tar -xf /opt/initial_userscripts.tar -C / - chmod 755 /opt/userscripts/userscript_firststart_example.sh - chmod 755 /opt/userscripts/userscript_everystart_example.sh + tar -xf /opt/initial_userscripts.tar -C / + chmod 755 /opt/userscripts/userscript_firststart_example.sh + chmod 755 /opt/userscripts/userscript_everystart_example.sh echo "Done." echo ' ' elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] @@ -337,26 +422,23 @@ then then echo "Userscript for first start detected and this is the first start of a new container." echo "Running userscript_firststart.sh..." - chmod 755 /opt/userscripts/userscript_firststart.sh - bash /opt/userscripts/userscript_firststart.sh - rm -f /opt/.firstrun + chmod 755 /opt/userscripts/userscript_firststart.sh + bash /opt/userscripts/userscript_firststart.sh + rm -f /opt/.firstrun echo "Done." echo ' ' fi if [ -f /opt/userscripts/userscript_everystart.sh ] then echo "Userscript for every start detected. Running userscript_everystart.sh..." - chmod 755 /opt/userscripts/userscript_everystart.sh - bash /opt/userscripts/userscript_everystart.sh + chmod 755 /opt/userscripts/userscript_everystart.sh + bash /opt/userscripts/userscript_everystart.sh echo "Done." echo ' ' fi fi -sleep 5 - - ##### # Starting ioBroker ##### @@ -367,7 +449,21 @@ echo ' ' echo "Starting ioBroker..." echo ' ' -gosu iobroker node node_modules/iobroker.js-controller/controller.js +# Function for graceful shutdown by SIGTERM signal +shut_down() { + echo ' ' + echo "Recived termination signal (SIGTERM)." + echo "Shutting down ioBroker..." + pid=$(ps -ef | awk '/[j]s.controller/{print $2}') + kill -SIGTERM "$pid" + exit +} -# Preventing container restart by keeping a process alive even if iobroker will be stopped +# Trap to get signal for graceful shutdown +trap 'shut_down' SIGTERM + +# IoBroker start +gosu iobroker node node_modules/iobroker.js-controller/controller.js & wait + +# Fallback process for keeping container running when ioBroker is stopped for maintenance (e.g. js-controller update) tail -f /dev/null