Merge pull request #113 from buanet/dev

Dev to beta
This commit is contained in:
Andre Germann
2020-06-23 09:55:08 +02:00
committed by GitHub
8 changed files with 409 additions and 108 deletions

View File

@@ -1 +1 @@
v4.2.3beta v4.2.4beta

View File

@@ -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"| |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_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_HOST|127.0.0.1|Sets hostname for ioBroker objects db|
|IOB_OBJECTSDB_PORT|9001|Sets port 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"| |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: 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. 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 ## Best practices
### Avoid using "latest" tag ### Avoid using "latest" tag
@@ -157,8 +162,13 @@ Thank you!
## Changelog ## Changelog
### v4.2.3beta (2020-06-05) ### v4.2.4beta (2020-06-23)
* updating js-controller to not stable version 3.1.5 to fix renaming issue * 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) * v4.2.2beta (2020-06-03)
* ~~workaround for renaming issues on startup~~ (fixed in js-controller) * ~~workaround for renaming issues on startup~~ (fixed in js-controller)
* v4.2.1beta (2020-05-10) * v4.2.1beta (2020-05-10)

View File

@@ -79,14 +79,15 @@ RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \
# Setting up iobroker-user (shell and home directory) # Setting up iobroker-user (shell and home directory)
RUN chsh -s /bin/bash iobroker \ 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 # Setting up ENVs
ENV DEBIAN_FRONTEND="teletype" \ ENV DEBIAN_FRONTEND="teletype" \
LANG="de_DE.UTF-8" \ LANG="de_DE.UTF-8" \
LANGUAGE="de_DE:de" \ LANGUAGE="de_DE:de" \
LC_ALL="de_DE.UTF-8" \ LC_ALL="de_DE.UTF-8" \
PACKAGES="vi" \
SETGID=1000 \ SETGID=1000 \
SETUID=1000 \ SETUID=1000 \
TZ="Europe/Berlin" TZ="Europe/Berlin"

View File

@@ -3,6 +3,7 @@
# Reading ENV # Reading ENV
adminport=$IOB_ADMINPORT adminport=$IOB_ADMINPORT
avahi=$AVAHI avahi=$AVAHI
multihost=$IOB_MULTIHOST
objectsdbhost=$IOB_OBJECTSDB_HOST objectsdbhost=$IOB_OBJECTSDB_HOST
objectsdbport=$IOB_OBJECTSDB_PORT objectsdbport=$IOB_OBJECTSDB_PORT
objectsdbtype=$IOB_OBJECTSDB_TYPE objectsdbtype=$IOB_OBJECTSDB_TYPE
@@ -75,7 +76,7 @@ then
echo "Installing additional packages is set by ENV." echo "Installing additional packages is set by ENV."
echo "The following packages will be installed:" $packages"..." echo "The following packages will be installed:" $packages"..."
echo $packages > /opt/scripts/.packages echo $packages > /opt/scripts/.packages
bash /opt/scripts/setup_packages.sh bash /opt/scripts/setup_packages.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -83,13 +84,14 @@ then
then then
echo "Different UID and/ or GID is set by ENV." echo "Different UID and/ or GID is set by ENV."
echo "Changing UID to "$setuid" and GID to "$setgid"..." echo "Changing UID to "$setuid" and GID to "$setgid"..."
usermod -u $setuid iobroker usermod -u $setuid iobroker
groupmod -g $setgid iobroker groupmod -g $setgid iobroker
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
else else
echo "Nothing to do here." echo "Nothing to do here."
echo ' '
fi fi
# Change directory for next steps # Change directory for next steps
@@ -107,7 +109,7 @@ echo ' '
if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] if [ `find /opt/iobroker -type f | wc -l` -lt 1 ]
then then
echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." 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." echo "Done."
elif [ -f /opt/iobroker/iobroker ] elif [ -f /opt/iobroker/iobroker ]
then 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" ] 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 then
echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..." echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..."
mv /opt/iobroker/*.tar.gz /opt/ mv /opt/iobroker/*.tar.gz /opt/
tar -xf /opt/initial_iobroker.tar -C / tar -xf /opt/initial_iobroker.tar -C /
mkdir /opt/iobroker/backups mkdir /opt/iobroker/backups
mv /opt/*.tar.gz /opt/iobroker/backups/ mv /opt/*.tar.gz /opt/iobroker/backups/
iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1
echo "Done." echo "Done."
echo ' ' echo ' '
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
@@ -200,7 +202,7 @@ then
then then
echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Adminport set by ENV does not match port configured in ioBroker installation."
echo "Setting Adminport to \""$adminport"\"..." echo "Setting Adminport to \""$adminport"\"..."
bash iobroker set admin.0 --port $adminport bash iobroker set admin.0 --port $adminport
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -213,8 +215,8 @@ then
if [ "$avahi" = "true" ] if [ "$avahi" = "true" ]
then then
echo "Avahi-daemon is activated by ENV." echo "Avahi-daemon is activated by ENV."
chmod 755 /opt/scripts/setup_avahi.sh chmod 755 /opt/scripts/setup_avahi.sh
bash /opt/scripts/setup_avahi.sh bash /opt/scripts/setup_avahi.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -227,8 +229,8 @@ then
if [ "$zwave" = "true" ] if [ "$zwave" = "true" ]
then then
echo "Z-Wave is activated by ENV." echo "Z-Wave is activated by ENV."
chmod 755 /opt/scripts/setup_zwave.sh chmod 755 /opt/scripts/setup_zwave.sh
bash /opt/scripts/setup_zwave.sh bash /opt/scripts/setup_zwave.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -254,6 +256,89 @@ then
fi 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 # Checking ENVs for custom setup of objects db
if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ]
then then
@@ -261,7 +346,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation."
echo "Setting type of objects db to \""$objectsdbtype"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here."
@@ -270,7 +355,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation."
echo "Setting host of objects db to \""$objectsdbhost"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here."
@@ -279,7 +364,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation."
echo "Setting port of objects db to \""$objectsdbport"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here."
@@ -295,7 +380,7 @@ then
then then
echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation."
echo "Setting type of states db to \""$statesdbtype"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here."
@@ -304,7 +389,7 @@ then
then then
echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation."
echo "Setting host of states db to \""$statesdbhost"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here."
@@ -313,7 +398,7 @@ then
then then
echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation."
echo "Setting port of states db to \""$statesdbport"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." 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 ] if [ `find /opt/userscripts -type f | wc -l` -lt 1 ]
then then
echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..."
tar -xf /opt/initial_userscripts.tar -C / tar -xf /opt/initial_userscripts.tar -C /
chmod 755 /opt/userscripts/userscript_firststart_example.sh chmod 755 /opt/userscripts/userscript_firststart_example.sh
chmod 755 /opt/userscripts/userscript_everystart_example.sh chmod 755 /opt/userscripts/userscript_everystart_example.sh
echo "Done." echo "Done."
echo ' ' echo ' '
elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ]
@@ -337,26 +422,23 @@ then
then then
echo "Userscript for first start detected and this is the first start of a new container." echo "Userscript for first start detected and this is the first start of a new container."
echo "Running userscript_firststart.sh..." echo "Running userscript_firststart.sh..."
chmod 755 /opt/userscripts/userscript_firststart.sh chmod 755 /opt/userscripts/userscript_firststart.sh
bash /opt/userscripts/userscript_firststart.sh bash /opt/userscripts/userscript_firststart.sh
rm -f /opt/.firstrun rm -f /opt/.firstrun
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
if [ -f /opt/userscripts/userscript_everystart.sh ] if [ -f /opt/userscripts/userscript_everystart.sh ]
then then
echo "Userscript for every start detected. Running userscript_everystart.sh..." echo "Userscript for every start detected. Running userscript_everystart.sh..."
chmod 755 /opt/userscripts/userscript_everystart.sh chmod 755 /opt/userscripts/userscript_everystart.sh
bash /opt/userscripts/userscript_everystart.sh bash /opt/userscripts/userscript_everystart.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
fi fi
sleep 5
##### #####
# Starting ioBroker # Starting ioBroker
##### #####
@@ -367,7 +449,21 @@ echo ' '
echo "Starting ioBroker..." echo "Starting ioBroker..."
echo ' ' 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 tail -f /dev/null

View File

@@ -79,14 +79,15 @@ RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \
# Setting up iobroker-user (shell and home directory) # Setting up iobroker-user (shell and home directory)
RUN chsh -s /bin/bash iobroker \ 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 # Setting up ENVs
ENV DEBIAN_FRONTEND="teletype" \ ENV DEBIAN_FRONTEND="teletype" \
LANG="de_DE.UTF-8" \ LANG="de_DE.UTF-8" \
LANGUAGE="de_DE:de" \ LANGUAGE="de_DE:de" \
LC_ALL="de_DE.UTF-8" \ LC_ALL="de_DE.UTF-8" \
PACKAGES="vi" \
SETGID=1000 \ SETGID=1000 \
SETUID=1000 \ SETUID=1000 \
TZ="Europe/Berlin" TZ="Europe/Berlin"

View File

@@ -3,6 +3,7 @@
# Reading ENV # Reading ENV
adminport=$IOB_ADMINPORT adminport=$IOB_ADMINPORT
avahi=$AVAHI avahi=$AVAHI
multihost=$IOB_MULTIHOST
objectsdbhost=$IOB_OBJECTSDB_HOST objectsdbhost=$IOB_OBJECTSDB_HOST
objectsdbport=$IOB_OBJECTSDB_PORT objectsdbport=$IOB_OBJECTSDB_PORT
objectsdbtype=$IOB_OBJECTSDB_TYPE objectsdbtype=$IOB_OBJECTSDB_TYPE
@@ -75,7 +76,7 @@ then
echo "Installing additional packages is set by ENV." echo "Installing additional packages is set by ENV."
echo "The following packages will be installed:" $packages"..." echo "The following packages will be installed:" $packages"..."
echo $packages > /opt/scripts/.packages echo $packages > /opt/scripts/.packages
bash /opt/scripts/setup_packages.sh bash /opt/scripts/setup_packages.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -83,13 +84,14 @@ then
then then
echo "Different UID and/ or GID is set by ENV." echo "Different UID and/ or GID is set by ENV."
echo "Changing UID to "$setuid" and GID to "$setgid"..." echo "Changing UID to "$setuid" and GID to "$setgid"..."
usermod -u $setuid iobroker usermod -u $setuid iobroker
groupmod -g $setgid iobroker groupmod -g $setgid iobroker
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
else else
echo "Nothing to do here." echo "Nothing to do here."
echo ' '
fi fi
# Change directory for next steps # Change directory for next steps
@@ -107,7 +109,7 @@ echo ' '
if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] if [ `find /opt/iobroker -type f | wc -l` -lt 1 ]
then then
echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." 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." echo "Done."
elif [ -f /opt/iobroker/iobroker ] elif [ -f /opt/iobroker/iobroker ]
then 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" ] 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 then
echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..." echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..."
mv /opt/iobroker/*.tar.gz /opt/ mv /opt/iobroker/*.tar.gz /opt/
tar -xf /opt/initial_iobroker.tar -C / tar -xf /opt/initial_iobroker.tar -C /
mkdir /opt/iobroker/backups mkdir /opt/iobroker/backups
mv /opt/*.tar.gz /opt/iobroker/backups/ mv /opt/*.tar.gz /opt/iobroker/backups/
iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1
echo "Done." echo "Done."
echo ' ' echo ' '
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
@@ -200,7 +202,7 @@ then
then then
echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Adminport set by ENV does not match port configured in ioBroker installation."
echo "Setting Adminport to \""$adminport"\"..." echo "Setting Adminport to \""$adminport"\"..."
bash iobroker set admin.0 --port $adminport bash iobroker set admin.0 --port $adminport
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -213,8 +215,8 @@ then
if [ "$avahi" = "true" ] if [ "$avahi" = "true" ]
then then
echo "Avahi-daemon is activated by ENV." echo "Avahi-daemon is activated by ENV."
chmod 755 /opt/scripts/setup_avahi.sh chmod 755 /opt/scripts/setup_avahi.sh
bash /opt/scripts/setup_avahi.sh bash /opt/scripts/setup_avahi.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -227,8 +229,8 @@ then
if [ "$zwave" = "true" ] if [ "$zwave" = "true" ]
then then
echo "Z-Wave is activated by ENV." echo "Z-Wave is activated by ENV."
chmod 755 /opt/scripts/setup_zwave.sh chmod 755 /opt/scripts/setup_zwave.sh
bash /opt/scripts/setup_zwave.sh bash /opt/scripts/setup_zwave.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -254,6 +256,89 @@ then
fi 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 # Checking ENVs for custom setup of objects db
if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ]
then then
@@ -261,7 +346,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation."
echo "Setting type of objects db to \""$objectsdbtype"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here."
@@ -270,7 +355,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation."
echo "Setting host of objects db to \""$objectsdbhost"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here."
@@ -279,7 +364,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation."
echo "Setting port of objects db to \""$objectsdbport"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here."
@@ -295,7 +380,7 @@ then
then then
echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation."
echo "Setting type of states db to \""$statesdbtype"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here."
@@ -304,7 +389,7 @@ then
then then
echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation."
echo "Setting host of states db to \""$statesdbhost"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here."
@@ -313,7 +398,7 @@ then
then then
echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation."
echo "Setting port of states db to \""$statesdbport"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." 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 ] if [ `find /opt/userscripts -type f | wc -l` -lt 1 ]
then then
echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..."
tar -xf /opt/initial_userscripts.tar -C / tar -xf /opt/initial_userscripts.tar -C /
chmod 755 /opt/userscripts/userscript_firststart_example.sh chmod 755 /opt/userscripts/userscript_firststart_example.sh
chmod 755 /opt/userscripts/userscript_everystart_example.sh chmod 755 /opt/userscripts/userscript_everystart_example.sh
echo "Done." echo "Done."
echo ' ' echo ' '
elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ]
@@ -337,26 +422,23 @@ then
then then
echo "Userscript for first start detected and this is the first start of a new container." echo "Userscript for first start detected and this is the first start of a new container."
echo "Running userscript_firststart.sh..." echo "Running userscript_firststart.sh..."
chmod 755 /opt/userscripts/userscript_firststart.sh chmod 755 /opt/userscripts/userscript_firststart.sh
bash /opt/userscripts/userscript_firststart.sh bash /opt/userscripts/userscript_firststart.sh
rm -f /opt/.firstrun rm -f /opt/.firstrun
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
if [ -f /opt/userscripts/userscript_everystart.sh ] if [ -f /opt/userscripts/userscript_everystart.sh ]
then then
echo "Userscript for every start detected. Running userscript_everystart.sh..." echo "Userscript for every start detected. Running userscript_everystart.sh..."
chmod 755 /opt/userscripts/userscript_everystart.sh chmod 755 /opt/userscripts/userscript_everystart.sh
bash /opt/userscripts/userscript_everystart.sh bash /opt/userscripts/userscript_everystart.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
fi fi
sleep 5
##### #####
# Starting ioBroker # Starting ioBroker
##### #####
@@ -367,7 +449,21 @@ echo ' '
echo "Starting ioBroker..." echo "Starting ioBroker..."
echo ' ' 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 tail -f /dev/null

View File

@@ -79,14 +79,15 @@ RUN tar -cf /opt/initial_iobroker.tar /opt/iobroker \
# Setting up iobroker-user (shell and home directory) # Setting up iobroker-user (shell and home directory)
RUN chsh -s /bin/bash iobroker \ 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 # Setting up ENVs
ENV DEBIAN_FRONTEND="teletype" \ ENV DEBIAN_FRONTEND="teletype" \
LANG="de_DE.UTF-8" \ LANG="de_DE.UTF-8" \
LANGUAGE="de_DE:de" \ LANGUAGE="de_DE:de" \
LC_ALL="de_DE.UTF-8" \ LC_ALL="de_DE.UTF-8" \
PACKAGES="vim" \
SETGID=1000 \ SETGID=1000 \
SETUID=1000 \ SETUID=1000 \
TZ="Europe/Berlin" TZ="Europe/Berlin"

View File

@@ -3,6 +3,7 @@
# Reading ENV # Reading ENV
adminport=$IOB_ADMINPORT adminport=$IOB_ADMINPORT
avahi=$AVAHI avahi=$AVAHI
multihost=$IOB_MULTIHOST
objectsdbhost=$IOB_OBJECTSDB_HOST objectsdbhost=$IOB_OBJECTSDB_HOST
objectsdbport=$IOB_OBJECTSDB_PORT objectsdbport=$IOB_OBJECTSDB_PORT
objectsdbtype=$IOB_OBJECTSDB_TYPE objectsdbtype=$IOB_OBJECTSDB_TYPE
@@ -75,7 +76,7 @@ then
echo "Installing additional packages is set by ENV." echo "Installing additional packages is set by ENV."
echo "The following packages will be installed:" $packages"..." echo "The following packages will be installed:" $packages"..."
echo $packages > /opt/scripts/.packages echo $packages > /opt/scripts/.packages
bash /opt/scripts/setup_packages.sh bash /opt/scripts/setup_packages.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -83,13 +84,14 @@ then
then then
echo "Different UID and/ or GID is set by ENV." echo "Different UID and/ or GID is set by ENV."
echo "Changing UID to "$setuid" and GID to "$setgid"..." echo "Changing UID to "$setuid" and GID to "$setgid"..."
usermod -u $setuid iobroker usermod -u $setuid iobroker
groupmod -g $setgid iobroker groupmod -g $setgid iobroker
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
else else
echo "Nothing to do here." echo "Nothing to do here."
echo ' '
fi fi
# Change directory for next steps # Change directory for next steps
@@ -107,7 +109,7 @@ echo ' '
if [ `find /opt/iobroker -type f | wc -l` -lt 1 ] if [ `find /opt/iobroker -type f | wc -l` -lt 1 ]
then then
echo "There is no data detected in /opt/iobroker. Restoring initial ioBroker installation..." 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." echo "Done."
elif [ -f /opt/iobroker/iobroker ] elif [ -f /opt/iobroker/iobroker ]
then 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" ] 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 then
echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..." echo "ioBroker backup file detected in /opt/iobroker. Restoring ioBroker..."
mv /opt/iobroker/*.tar.gz /opt/ mv /opt/iobroker/*.tar.gz /opt/
tar -xf /opt/initial_iobroker.tar -C / tar -xf /opt/initial_iobroker.tar -C /
mkdir /opt/iobroker/backups mkdir /opt/iobroker/backups
mv /opt/*.tar.gz /opt/iobroker/backups/ mv /opt/*.tar.gz /opt/iobroker/backups/
iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1
echo "Done." echo "Done."
echo ' ' echo ' '
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
@@ -200,7 +202,7 @@ then
then then
echo "Adminport set by ENV does not match port configured in ioBroker installation." echo "Adminport set by ENV does not match port configured in ioBroker installation."
echo "Setting Adminport to \""$adminport"\"..." echo "Setting Adminport to \""$adminport"\"..."
bash iobroker set admin.0 --port $adminport bash iobroker set admin.0 --port $adminport
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -213,8 +215,8 @@ then
if [ "$avahi" = "true" ] if [ "$avahi" = "true" ]
then then
echo "Avahi-daemon is activated by ENV." echo "Avahi-daemon is activated by ENV."
chmod 755 /opt/scripts/setup_avahi.sh chmod 755 /opt/scripts/setup_avahi.sh
bash /opt/scripts/setup_avahi.sh bash /opt/scripts/setup_avahi.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -227,8 +229,8 @@ then
if [ "$zwave" = "true" ] if [ "$zwave" = "true" ]
then then
echo "Z-Wave is activated by ENV." echo "Z-Wave is activated by ENV."
chmod 755 /opt/scripts/setup_zwave.sh chmod 755 /opt/scripts/setup_zwave.sh
bash /opt/scripts/setup_zwave.sh bash /opt/scripts/setup_zwave.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
@@ -254,6 +256,89 @@ then
fi 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 # Checking ENVs for custom setup of objects db
if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ] if [ "$objectsdbtype" != "" ] || [ "$objectsdbhost" != "" ] || [ "$objectsdbport" != "" ]
then then
@@ -261,7 +346,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_TYPE is set and value is different from detected ioBroker installation."
echo "Setting type of objects db to \""$objectsdbtype"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here."
@@ -270,7 +355,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_HOST is set and value is different from detected ioBroker installation."
echo "Setting host of objects db to \""$objectsdbhost"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_HOST is set and value meets detected ioBroker installation. Nothing to do here."
@@ -279,7 +364,7 @@ then
then then
echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation." echo "ENV IOB_OBJECTSDB_PORT is set and value is different from detected ioBroker installation."
echo "Setting port of objects db to \""$objectsdbport"\"..." 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." echo "Done."
else else
echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_OBJECTSDB_PORT is set and value meets detected ioBroker installation. Nothing to do here."
@@ -295,7 +380,7 @@ then
then then
echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_TYPE is set and value is different from detected ioBroker installation."
echo "Setting type of states db to \""$statesdbtype"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_STATESDB_TYPE is set and value meets detected ioBroker installation. Nothing to do here."
@@ -304,7 +389,7 @@ then
then then
echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_HOST is set and value is different from detected ioBroker installation."
echo "Setting host of states db to \""$statesdbhost"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here." echo "ENV IOB_STATESDB_HOST is set and value meets detected ioBroker installation. Nothing to do here."
@@ -313,7 +398,7 @@ then
then then
echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation." echo "ENV IOB_STATESDB_PORT is set and value is different from detected ioBroker installation."
echo "Setting port of states db to \""$statesdbport"\"..." 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." echo "Done."
else else
echo "ENV IOB_STATESDB_PORT is set and value meets detected ioBroker installation. Nothing to do here." 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 ] if [ `find /opt/userscripts -type f | wc -l` -lt 1 ]
then then
echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..." echo "There is no data detected in /opt/userscripts. Restoring exapmple userscripts..."
tar -xf /opt/initial_userscripts.tar -C / tar -xf /opt/initial_userscripts.tar -C /
chmod 755 /opt/userscripts/userscript_firststart_example.sh chmod 755 /opt/userscripts/userscript_firststart_example.sh
chmod 755 /opt/userscripts/userscript_everystart_example.sh chmod 755 /opt/userscripts/userscript_everystart_example.sh
echo "Done." echo "Done."
echo ' ' echo ' '
elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ] elif [ -f /opt/userscripts/userscript_firststart.sh ] || [ -f /opt/userscripts/userscript_everystart.sh ]
@@ -337,26 +422,23 @@ then
then then
echo "Userscript for first start detected and this is the first start of a new container." echo "Userscript for first start detected and this is the first start of a new container."
echo "Running userscript_firststart.sh..." echo "Running userscript_firststart.sh..."
chmod 755 /opt/userscripts/userscript_firststart.sh chmod 755 /opt/userscripts/userscript_firststart.sh
bash /opt/userscripts/userscript_firststart.sh bash /opt/userscripts/userscript_firststart.sh
rm -f /opt/.firstrun rm -f /opt/.firstrun
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
if [ -f /opt/userscripts/userscript_everystart.sh ] if [ -f /opt/userscripts/userscript_everystart.sh ]
then then
echo "Userscript for every start detected. Running userscript_everystart.sh..." echo "Userscript for every start detected. Running userscript_everystart.sh..."
chmod 755 /opt/userscripts/userscript_everystart.sh chmod 755 /opt/userscripts/userscript_everystart.sh
bash /opt/userscripts/userscript_everystart.sh bash /opt/userscripts/userscript_everystart.sh
echo "Done." echo "Done."
echo ' ' echo ' '
fi fi
fi fi
sleep 5
##### #####
# Starting ioBroker # Starting ioBroker
##### #####
@@ -367,7 +449,21 @@ echo ' '
echo "Starting ioBroker..." echo "Starting ioBroker..."
echo ' ' 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 tail -f /dev/null