From 9fc074611faa856c7cefc91e102b8dc19a1c2721 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 31 Jul 2023 17:43:01 +0200 Subject: [PATCH 01/39] testing with debian 12 --- debian/Dockerfile | 102 +++ testing/Dockerfile | 104 ++++ testing/scripts/healthcheck.sh | 20 + testing/scripts/iobroker.sh | 24 + testing/scripts/iobroker_startup.sh | 584 ++++++++++++++++++ testing/scripts/maintenance.sh | 318 ++++++++++ testing/scripts/setup_avahi.sh | 38 ++ testing/scripts/setup_iob_db.sh | 357 +++++++++++ testing/scripts/setup_packages.sh | 83 +++ testing/scripts/setup_zwave.sh | 17 + testing/test_stack.yml | 15 + .../userscript_everystart_example.sh | 13 + .../userscript_firststart_example.sh | 12 + 13 files changed, 1687 insertions(+) create mode 100644 debian/Dockerfile create mode 100644 testing/Dockerfile create mode 100644 testing/scripts/healthcheck.sh create mode 100644 testing/scripts/iobroker.sh create mode 100644 testing/scripts/iobroker_startup.sh create mode 100644 testing/scripts/maintenance.sh create mode 100644 testing/scripts/setup_avahi.sh create mode 100644 testing/scripts/setup_iob_db.sh create mode 100644 testing/scripts/setup_packages.sh create mode 100644 testing/scripts/setup_zwave.sh create mode 100644 testing/test_stack.yml create mode 100644 testing/userscripts/userscript_everystart_example.sh create mode 100644 testing/userscripts/userscript_firststart_example.sh diff --git a/debian/Dockerfile b/debian/Dockerfile new file mode 100644 index 0000000..fe96e42 --- /dev/null +++ b/debian/Dockerfile @@ -0,0 +1,102 @@ +FROM ${BASE_IMAGE} + +LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ + org.opencontainers.image.description="Official Docker image for ioBroker smarthome software (https://www.iobroker.net)" \ + org.opencontainers.image.documentation="https://github.com/buanet/ioBroker.docker#readme" \ + org.opencontainers.image.authors="André Germann " \ + org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ + org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ + org.opencontainers.image.base.name="${BASE_IMAGE}" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.created="${DATI}" + +ENV DEBIAN_FRONTEND noninteractive + +# Install prerequisites (including node) and generating locales +RUN apt-get update && apt-get install -y \ + apt-utils \ + cifs-utils \ + curl \ + gosu \ + iputils-ping \ + jq \ + locales \ + nfs-common \ + procps \ + python3 \ + python3-dev \ + sudo \ + tar \ + tzdata \ + udev \ + wget \ + # Install node + && curl -sL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash \ + && apt-get update && apt-get install -y nodejs \ + # Install node-gyp + && npm install -g node-gyp \ + # Generating locales + && sed -i 's/^# *\(de_DE.UTF-8\)/\1/' /etc/locale.gen \ + && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ + && locale-gen \ + # Change permissions for scripts + #&& chmod 777 /opt/scripts/ \ + #&& chmod 777 /opt/userscripts/ \ + #&& chmod +x /opt/scripts/*.sh \ + #&& chmod +x /opt/userscripts/*.sh \ + # Prepare + && mkdir -p /opt/.docker_config/ \ + && echo "starting" > /opt/.docker_config/.healthcheck \ + && echo "${VERSION}" > /opt/.docker_config/.thisisdocker \ + && echo "true" > /opt/.docker_config/.first_run \ + # Run installer + && curl -sL https://iobroker.net/install.sh | bash - \ + # Deleting UUID from build + && iobroker unsetup -y \ + && echo "true" > /opt/iobroker/.fresh_install \ + # Backup initial ioBroker and userscript folder + && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ + && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ + # Setting up iobroker-user (shell, home dir and rights) + && chsh -s /bin/bash iobroker \ + && usermod --home /opt/iobroker iobroker \ + && usermod -u 1000 iobroker \ + && groupmod -g 1000 iobroker \ + && chown root:iobroker /usr/sbin/gosu \ + && chmod +s /usr/sbin/gosu \ + # Clean up installation cache + && apt-get autoclean -y \ + && apt-get autoremove \ + && apt-get clean \ + && rm -rf /tmp/* /var/tmp/* \ + && rm -rf /root/.cache/* /root/.npm/* \ + && rm -rf /var/lib/apt/lists/* + +# Copy scripts +COPY --chown iobroker:iobroker --chmod 544 scripts /opt/scripts +COPY --chown iobroker:iobroker --chmod 544 userscripts /opt/userscripts + +# Setting up default ENVs +ENV DEBIAN_FRONTEND="teletype" \ + LANG="de_DE.UTF-8" \ + LANGUAGE="de_DE:de" \ + LC_ALL="de_DE.UTF-8" \ + SETGID=1000 \ + SETUID=1000 \ + TZ="Europe/Berlin" + +# Expose default admin ui port +EXPOSE 8081 + +# Change work dir +WORKDIR /opt/iobroker/ + +# Healthcheck +HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ + CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] + +# Volumes for persistent data +VOLUME ["/opt/iobroker"] + +# Run startup-script +ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/testing/Dockerfile b/testing/Dockerfile new file mode 100644 index 0000000..26e3fa2 --- /dev/null +++ b/testing/Dockerfile @@ -0,0 +1,104 @@ +FROM debian:bookworm-slim + +LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ + org.opencontainers.image.description="Official Docker image for ioBroker smarthome software (https://www.iobroker.net)" \ + org.opencontainers.image.documentation="https://github.com/buanet/ioBroker.docker#readme" \ + org.opencontainers.image.authors="André Germann " \ + org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ + org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ + org.opencontainers.image.base.name="debian:bookworm-slim" \ + org.opencontainers.image.version="v9.0.0-testing" \ + org.opencontainers.image.created="00-00-00" + +ENV DEBIAN_FRONTEND noninteractive + +# Copy scripts +COPY scripts /opt/scripts +COPY userscripts /opt/userscripts + +# Install prerequisites (including node) and generating locales +RUN apt-get update && apt-get upgrade -y \ + && apt-get install -y \ + apt-utils \ + cifs-utils \ + curl \ + gosu \ + iputils-ping \ + jq \ + locales \ + nfs-common \ + procps \ + python3 \ + python3-dev \ + #sudo \ + tar \ + tzdata \ + udev \ + wget \ + # Install node + && curl -sL https://deb.nodesource.com/setup_18.x | bash - \ + && apt-get update && apt-get install -y nodejs \ + # Install node-gyp + && npm install --production -g node-gyp \ + # Generating locales + && sed -i 's/^# *\(de_DE.UTF-8\)/\1/' /etc/locale.gen \ + && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ + && locale-gen \ + # Prepare .docker_config + && mkdir /opt/.docker_config \ + && echo "starting" > /opt/.docker_config/.healthcheck \ + && echo "v9.0.0-testing" > /opt/.docker_config/.thisisdocker \ + && echo "true" > /opt/.docker_config/.first_run \ + # Prepare old .docker_config (needed until changed in iobroker) + && mkdir /opt/scripts/.docker_config \ + && echo "v9.0.0-testing" > /opt/scripts/.docker_config/.thisisdocker \ + # Run installer + && curl -sL https://iobroker.net/install.sh | bash - \ + # Deleting UUID from build + && iobroker unsetup -y \ + && echo "true" > /opt/iobroker/.fresh_install \ + # Backup initial ioBroker and userscript folder + && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ + && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ + # Setting up iobroker-user + && chsh -s /bin/bash iobroker \ + && usermod --home /opt/iobroker iobroker \ + && usermod -u 1000 iobroker \ + && groupmod -g 1000 iobroker \ + && chown root:iobroker /usr/sbin/gosu \ + #&& chmod +s /usr/sbin/gosu \ + # Set permissions and ownership + && chown -R iobroker:iobroker /opt/scripts /opt/userscripts \ + && chmod 755 /opt/scripts/*.sh \ + && chmod 755 /opt/userscripts/*.sh \ + # Clean up installation cache + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ + && apt-get autoclean -y \ + && apt-get autoremove \ + && apt-get clean \ + && rm -rf /tmp/* /var/tmp/* /root/.cache/* /root/.npm/* /var/lib/apt/lists/* + +# Setting up default ENVs +ENV DEBIAN_FRONTEND="teletype" \ + LANG="de_DE.UTF-8" \ + LANGUAGE="de_DE:de" \ + LC_ALL="de_DE.UTF-8" \ + SETGID=1000 \ + SETUID=1000 \ + TZ="Europe/Berlin" + +# Expose default admin ui port +EXPOSE 8081 + +# Change work dir +WORKDIR /opt/iobroker/ + +# Healthcheck +HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ + CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] + +# Volumes for persistent data +VOLUME ["/opt/iobroker"] + +# Run startup-script +ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/testing/scripts/healthcheck.sh b/testing/scripts/healthcheck.sh new file mode 100644 index 0000000..5c95005 --- /dev/null +++ b/testing/scripts/healthcheck.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Script checks health of running container + +if [ "$(cat /opt/.docker_config/.healthcheck)" == "starting" ] +then + echo "Health status: OK - Startup script is still running." + exit 0 +elif [ "$(cat /opt/.docker_config/.healthcheck)" == "maintenance" ] +then + echo "Health status: OK - Container is running in maintenance mode." + exit 0 +elif [ "$(ps -fe|grep "[i]obroker.js-controller"|awk '{print $2}')" != "" ] +then + echo "Health status: OK - Main process (js-controller) is running." + exit 0 +fi + +echo "Health status: !!! NOT OK !!! - Something went wrong. Please see container logs for more details and/or try restarting the container." +exit 1 diff --git a/testing/scripts/iobroker.sh b/testing/scripts/iobroker.sh new file mode 100644 index 0000000..0a88e77 --- /dev/null +++ b/testing/scripts/iobroker.sh @@ -0,0 +1,24 @@ +#!/usr/bin/bash + +if [ "$(id -u)" -eq 0 ]; then + echo "WARNING! IoBroker should not be executed as root!" +fi + +if [ "$1" = "fix" ]; then # call iobroker fixer + curl -sL https://iobroker.net/fix.sh | bash - +elif [ "$1" = "diag" ]; then # call iobroker diag script + if [ "$(id -u)" -eq 0 ]; then # check for execution as root + gosu iobroker curl -sLf https://iobroker.net/diag.sh --output /home/iobroker/.diag.sh && bash /home/iobroker/.diag.sh | gosu iobroker tee /home/iobroker/iob_diag.log + else + curl -sLf https://iobroker.net/diag.sh --output /home/iobroker/.diag.sh && bash /home/iobroker/.diag.sh | tee /home/iobroker/iob_diag.log + fi +elif [ "$1" = "start" ] || [ "$1" = "stop" ] || [ "$1" = "restart" ]; then # block execution of iobroker start | stop | restart + echo "The execution of this command is blocked as your ioBroker is running inside a Docker container!" + echo "Please check ioBroker Docker image docs (https://docs.buanet.de) for the proper way to perform this action!" +else # passing all other parameters to iobroker.js + if [ "$(id -u)" -eq 0 ]; then # check for execution as root + gosu iobroker node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@" + else + node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@" + fi +fi diff --git a/testing/scripts/iobroker_startup.sh b/testing/scripts/iobroker_startup.sh new file mode 100644 index 0000000..2c04cda --- /dev/null +++ b/testing/scripts/iobroker_startup.sh @@ -0,0 +1,584 @@ +#!/usr/bin/env bash + +# bash strict mode +set -euo pipefail + +# Setting healthcheck status to "starting" +echo "starting" > /opt/.docker_config/.healthcheck + +# Reading ENV +set +u +adminport=$IOB_ADMINPORT +avahi=$AVAHI +backitup=$IOB_BACKITUP_EXTDB +debug=$DEBUG +multihost=$IOB_MULTIHOST +offlinemode=$OFFLINE_MODE +objectsdbhost=$IOB_OBJECTSDB_HOST +objectsdbport=$IOB_OBJECTSDB_PORT +objectsdbtype=$IOB_OBJECTSDB_TYPE +objectsdbname=$IOB_OBJECTSDB_NAME # new for sentinel support +objectsdbpass=$IOB_OBJECTSDB_PASS # new for auth support +packages=$PACKAGES +permissioncheck=$PERMISSION_CHECK +setgid=$SETGID +setuid=$SETUID +statesdbhost=$IOB_STATESDB_HOST +statesdbport=$IOB_STATESDB_PORT +statesdbtype=$IOB_STATESDB_TYPE +statesdbname=$IOB_STATESDB_NAME # new for sentinel support +statesdbpass=$IOB_STATESDB_PASS # new for auth support +usbdevices=$USBDEVICES +zwave=$ZWAVE +set -u + +pkill_timeout=10 # timeout for iobroker shutdown in seconds + +# Stop on error function +stop_on_error() { + if [[ "$debug" == "true" ]]; then + echo " " + echo "[DEBUG] Debug mode prevents the container from exiting on errors." + echo "[DEBUG] This enables you to investigate or fix your issue on the command line." + echo "[DEBUG] If you want to stop or restart your container you have to do it manually." + echo "[DEBUG] IoBroker is not running!" + tail -f /dev/null + else + echo " " + echo "This Script will exit now." + exit 1 + fi +} + +# Getting date and time for logging +dati=$(date '+%Y-%m-%d %H:%M:%S') + +# Logging header +echo " " +echo "$(printf -- '-%.0s' {1..80})" +echo -n "$(printf -- '-%.0s' {1..25})" && echo -n " ""$dati"" " && echo "$(printf -- '-%.0s' {1..25})" +echo "$(printf -- '-%.0s' {1..80})" +echo "----- -----" +echo "----- ██╗ ██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗ ███████╗ ██████╗ -----" +echo "----- ██║ ██╔═══██╗ ██╔══██╗ ██╔══██╗ ██╔═══██╗ ██║ ██╔╝ ██╔════╝ ██╔══██╗ -----" +echo "----- ██║ ██║ ██║ ██████╔╝ ██████╔╝ ██║ ██║ █████╔╝ █████╗ ██████╔╝ -----" +echo "----- ██║ ██║ ██║ ██╔══██╗ ██╔══██╗ ██║ ██║ ██╔═██╗ ██╔══╝ ██╔══██╗ -----" +echo "----- ██║ ╚██████╔╝ ██████╔╝ ██║ ██║ ╚██████╔╝ ██║ ██╗ ███████╗ ██║ ██║ -----" +echo "----- ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ -----" +echo "----- -----" +echo "----- Welcome to your ioBroker Docker container! -----" +echo "----- Startupscript is now running! -----" +echo "----- Please be patient! -----" +echo "$(printf -- '-%.0s' {1..80})" +echo " " +echo "$(printf -- '-%.0s' {1..80})" +echo "----- System Information -----" +echo -n "----- " && echo -n "$(printf "%-20s %-28s" arch: "$(uname -m)")" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-20s %-28s" hostname: "$(hostname)")" && echo " -----" +echo "----- -----" +echo "----- Version Information -----" +echo -n "----- " && echo -n "$(printf "%-20s %-28s" image: "${VERSION}")" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-20s %-28s" build: "${BUILD}")" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-20s %-28s" node: "$(node -v)")" && echo " -----" +echo -n "----- " && echo -n "$(printf "%-20s %-28s" npm: "$(npm -v)")" && echo " -----" +echo "----- -----" +echo "----- Environment Variables -----" +if [[ "$adminport" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_ADMINPORT: "$adminport")" && echo " -----"; fi +if [[ "$avahi" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" AVAHI: "$avahi")" && echo " -----"; fi +if [[ "$debug" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" DEBUG: "$debug")" && echo " -----"; fi +if [[ "$backitup" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_BACKITUP_EXTDB: "$backitup")" && echo " -----"; fi +if [[ "$multihost" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_MULTIHOST: "$multihost")" && echo " -----"; fi +if [[ "$objectsdbtype" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_TYPE: "$objectsdbtype")" && echo " -----"; fi +if [[ "$objectsdbhost" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_HOST: "$objectsdbhost")" && echo " -----"; fi +if [[ "$objectsdbport" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_PORT: "$objectsdbport")" && echo " -----"; fi +if [[ "$objectsdbname" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_NAME: "$objectsdbname")" && echo " -----"; fi +if [[ "$objectsdbpass" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_OBJECTSDB_PASS: "***")" && echo " -----"; fi +if [[ "$statesdbtype" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_TYPE: "$statesdbtype")" && echo " -----"; fi +if [[ "$statesdbhost" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_HOST: "$statesdbhost")" && echo " -----"; fi +if [[ "$statesdbport" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_PORT: "$statesdbport")" && echo " -----"; fi +if [[ "$statesdbname" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_NAME: "$statesdbname")" && echo " -----"; fi +if [[ "$statesdbpass" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" IOB_STATESDB_PASS: "***")" && echo " -----"; fi +if [[ "$offlinemode" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" OFFLINE_MODE: "$offlinemode")" && echo " -----"; fi +if [[ "$packages" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" PACKAGES: "$packages")" && echo " -----"; fi +if [[ "$permissioncheck" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" PERMISSION_CHECK: "$permissioncheck")" && echo " -----"; fi +if [[ "$setgid" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" SETGID: "$setgid")" && echo " -----"; fi +if [[ "$setuid" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" SETUID: "$setuid")" && echo " -----"; fi +if [[ "$usbdevices" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" USBDEVICES: "$usbdevices")" && echo " -----"; fi +if [[ "$zwave" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" ZWAVE: "$zwave")" && echo " -----"; fi +echo "$(printf -- '-%.0s' {1..80})" +echo " " + +# Debug logging notice +if [[ "$debug" == "true" ]]; then + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + echo "!!!! DEBUG LOG ACTIVE !!!!" + echo "!!!! Environment variable DEBUG is set to true. !!!!" + echo "!!!! This will extend the logging output and may slow down container start. !!!!" + echo "!!!! Please make sure to deactivate if no longer needed. !!!!" + echo "!!!! For more information see ioBroker Docker image documentation: !!!!" + echo "!!!! https://docs.buanet.de/iobroker-docker-image/docs/ !!!!" + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + echo " " +fi + +##### +# STEP 1 - Preparing container +##### +echo "$(printf -- '-%.0s' {1..80})" +echo "----- Step 1 of 5: Preparing container -----" +echo "$(printf -- '-%.0s' {1..80})" +echo " " + +# Actions running on first start only +if [[ -f /opt/.docker_config/.first_run ]]; then + # Updating Linux packages + if [[ "$offlinemode" = "true" ]]; then + echo "OFFLINE_MODE is \"true\". Skipping Linux package updates on first run." + else + bash /opt/scripts/setup_packages.sh -update + fi + echo " " + # Installing packages from ENV + if [[ "$packages" != "" && "$offlinemode" = "true" ]]; then + echo "PACKAGES is set, but OFFLINE_MODE is \"true\". Skipping Linux package installation." + elif [[ "$packages" != "" ]]; then + echo "PACKAGES is set. Installing the following additional Linux packages: ""$packages" + bash /opt/scripts/setup_packages.sh -install + fi + echo " " + # Register maintenance script + echo -n "Registering maintenance script as command... " + echo "alias maintenance='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc + echo "alias maint='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc + echo "alias m='/opt/scripts/maintenance.sh'" >> /etc/bash.bashrc + echo "Done." +else + echo "This is not the first run of this container. Skipping first run preparation." +fi +echo " " + +# Setting UID and/ or GID +if [[ "$setgid" != "$(cat /etc/group | grep 'iobroker:' | cut -d':' -f3)" || "$setuid" != "$(cat /etc/passwd | grep 'iobroker:' | cut -d':' -f3)" ]]; then + echo "SETUID and/ or SETGID are set to custom values." + echo -n "Changing UID to \"""$setuid""\" and GID to \"""$setgid""\"... " + usermod -u "$setuid" iobroker + groupmod -og "$setgid" iobroker + echo "Done." + echo " " +fi + +# Change directory for next steps +cd /opt/iobroker + +##### +# STEP 2 - Detecting ioBroker-Installation +##### +echo "$(printf -- '-%.0s' {1..80})" +echo "----- Step 2 of 5: Detecting ioBroker installation -----" +echo "$(printf -- '-%.0s' {1..80})" +echo " " + +if [[ `find /opt/iobroker -type f | wc -l` -lt 1 ]]; then + echo "There is no data detected in /opt/iobroker." + echo -n "Restoring initial ioBroker installation... " + tar -xf /opt/initial_iobroker.tar -C / + echo "Done." +elif [[ -f /opt/iobroker/iobroker ]]; then + echo "Existing installation of ioBroker detected in \"/opt/iobroker\"." +elif [[ "$(ls *_backupiobroker.tar.gz 2> /dev/null | wc -l)" != "0" && "$(tar -ztvf /opt/iobroker/*_backupiobroker.tar.gz "backup/backup.json" 2> /dev/null | wc -l)" != "0" ]]; then + echo "IoBroker backup file detected in /opt/iobroker." + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Backup file name: " "$(ls *_backupiobroker.tar.gz)"; fi + echo "Since Docker Image v8, automatic initial restore is no longer supported!" + echo "IoBroker will start with a fresh installation, while your backup file will be copied into the backup directory." + echo "You will be able to restore your backup file manually by using the backitup adapter or the containers maintenance script." + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." + echo " " + echo -n "Copying backup file and restoring initial ioBroker installation... " + mv /opt/iobroker/*.tar.gz /opt/ + tar -xf /opt/initial_iobroker.tar -C / + mkdir /opt/iobroker/backups + mv /opt/*.tar.gz /opt/iobroker/backups/ + # fixing permission errors during restore + chown -R "$setuid":"$setgid" /opt/iobroker + echo "Done." +else + echo "There is data detected in /opt/iobroker but it looks like it is no instance of ioBroker!" + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Detected files:" + ls -al + fi + echo "Please check/ recreate mounted folder or volume and try again." + stop_on_error +fi +echo " " + +##### +# STEP 3 - Checking ioBroker-Installation +##### +echo "$(printf -- '-%.0s' {1..80})" +echo "----- Step 3 of 5: Checking ioBroker installation -----" +echo "$(printf -- '-%.0s' {1..80})" +echo " " + +# Backing up original iobroker executable to fix sudo bug with gosu +if [[ ! -f /opt/iobroker/iobroker.bak ]]; then + echo -n "Replacing ioBroker executable to fix sudo bug... " + cp -a /opt/iobroker/iobroker /opt/iobroker/iobroker.bak + cp -f /opt/scripts/iobroker.sh /opt/iobroker/iobroker + chmod 755 /opt/iobroker/iobroker + echo "Done." + echo " " +fi + +# (Re)Setting permissions to "/opt/iobroker" and "/opt/scripts" +if [[ "$permissioncheck" == "false" ]]; then + echo "PERMISSION_CHECK is set to false. Use this at your own risk!" +else + echo -n "(Re)setting permissions (This might take a while! Please be patient!)... " + chown -R "$setuid":"$setgid" /opt/iobroker + chown -R "$setuid":"$setgid" /opt/scripts + chown -R "$setuid":"$setgid" /opt/.docker_config + echo "Done." +fi +echo " " + +# Checking multihost and db setup +if [[ "$multihost" == "master" || "$multihost" == "slave" ]]; then + # multihost enabled + if [[ "$multihost" == "master" ]]; then + set +e + bash /opt/scripts/setup_iob_db.sh -master + return=$? + set -e + if [[ "$return" -ne 0 ]]; then stop_on_error; fi + elif [[ "$multihost" == "slave" ]]; then + set +e + bash /opt/scripts/setup_iob_db.sh -slave + return=$? + set -e + if [[ "$return" -ne 0 ]]; then stop_on_error; fi + fi +elif [[ "$multihost" == "" || "$multihost" == "false" ]]; then + # no multihost, only debug output + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Checking multihost settings... " + echo "[DEBUG] No multihost settings detected." + echo "[DEBUG] Done." + echo " " + fi + # checking custom objects db settings + if [[ "$objectsdbtype" != "" || "$objectsdbhost" != "" || "$objectsdbport" != "" ]]; then + set +e + bash /opt/scripts/setup_iob_db.sh -objectsdb + return=$? + set -e + if [[ "$return" -ne 0 ]]; then stop_on_error; fi + else + #no custom objects db settings, only debug output + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Checking custom objects db settings... " + echo "[DEBUG] No custom objects db settings detected." + echo "[DEBUG] Done." + echo " " + fi + fi + # checking custom states db settings + if [[ "$statesdbtype" != "" || "$statesdbhost" != "" || "$statesdbport" != "" ]]; then + set +e + bash /opt/scripts/setup_iob_db.sh -statesdb + return=$? + set -e + if [[ "$return" -ne 0 ]]; then stop_on_error; fi + else + #no custom states db settings, only debug output + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Checking custom states db settings... " + echo "[DEBUG] No custom states db settings detected." + echo "[DEBUG] Done." + echo " " + fi + fi +else + echo "IOB_MULTIHOST is set, but the value is not valid. Please check your configuration." + if [[ "$debug" == "true" ]]; then echo "[DEBUG] IOB_MULTIHOST = ""$multihost"; fi + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/#environment-variables-env)." + stop_on_error +fi + +# if restored a fresh install, running "iob setup first" for database init (but not on slaves!), otherwise check database connection +if [[ -f /opt/iobroker/.fresh_install && "$multihost" != "slave" ]]; then + echo -n "Initializing a fresh installation of ioBroker... " + set +e + bash iob setup first > /opt/iobroker/log/iob_setup_first.log 2>&1 + return=$? + set -e + rm -f /opt/iobroker/.fresh_install + if [[ "$return" -ne 0 ]]; then + echo "Failed." + echo "For more details see \"/opt/iobroker/log/iob_setup_first.log\"." + echo "Please check your configuration and try again." + stop_on_error + fi + echo "Done." + echo " " +else + echo -n "Checking Database connection... " + set +e + if iob uuid &> /dev/null; then + echo "Done." + echo " " + else + errormsg=$(iob uuid 2>&1 | sed 's/^/[DEBUG] /') + echo "Failed." + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] Error message: " + echo "$errormsg" + fi + echo "Please check your configuration and try again." + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs)." + stop_on_error + fi + set -e +fi + +# hostname check +if [[ "$multihost" == "slave" ]]; then + echo "IOB_MULTIHOST is set to \"slave\". Hostname check will be skipped." + echo " " +else + # get admin instance and hostname + set +e + admininstance=$(bash iobroker list instances | grep 'enabled' | grep -m 1 -o 'system.adapter.admin..') + set -e + if [[ "$admininstance" != "" ]]; then + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin instance is:" "$admininstance"; fi + adminhostname=$(bash iobroker object get "$admininstance" --pretty | grep -oP '(?<="host": ")[^"]*') + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin hostname is:" "$adminhostname"; fi + else + set +e + admininstance=$(bash iobroker list instances | grep 'disabled' | grep -m 1 -o 'system.adapter.admin..') + set -e + if [[ "$admininstance" != "" ]]; then + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin instance is disabled."; fi + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin instance is:" "$admininstance"; fi + adminhostname=$(bash iobroker object get "$admininstance" --pretty | grep -oP '(?<="host": ")[^"]*') + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected admin hostname is:" "$adminhostname"; fi + else + echo "There was a problem detecting the admin instance of your iobroker." + echo "Make sure the ioBroker installation you use has an admin instance or try again with a fresh installation and restore your configuration." + echo "For more details see https://docs.buanet.de/iobroker-docker-image/docs/#restore" + stop_on_error + fi + fi + # check hostname + if [[ "$adminhostname" != "" && "$adminhostname" != "$(hostname)" ]]; then + echo "Hostname in ioBroker does not match the hostname of this container." + echo -n "Updating hostname to \"""$(hostname)""\"... " + bash iobroker host "$adminhostname" + echo "Done." + echo " " + elif [[ "$adminhostname" = "$(hostname)" ]]; then + echo "Hostname in ioBroker matches the hostname of this container." + echo "No action required." + echo " " + else + echo "There was a problem checking the hostname." + stop_on_error + fi +fi + +# extended debug output +if [[ "$debug" == "true" && "$multihost" != "slave" ]]; then + echo "[DEBUG] Collecting some more ioBroker debug information... " + echo " " + # get information and send to array + IFS=$'\n' + instances_array=("$(gosu iobroker iob list instances)") + repos_array=("$(gosu iobroker iob repo list)") + updates_array=("$(gosu iobroker iob update)") + # list iob instances + echo "[DEBUG] ##### iobroker list instances #####" + for i in "${instances_array[@]}" + do + echo "$i" + done + echo " " + echo "[DEBUG] ##### iobroker repo list #####" + for i in "${repos_array[@]}" + do + echo "$i" + done + echo " " + echo "[DEBUG] ##### iobroker update #####" + for i in "${updates_array[@]}" + do + echo "$i" + done + echo " " + unset IFS +fi + +##### +# STEP 4 - Setting up special sessting for ioBroker-adapters +##### +echo "$(printf -- '-%.0s' {1..80})" +echo "----- Step 4 of 5: Applying special settings -----" +echo "$(printf -- '-%.0s' {1..80})" +echo " " + +echo "Some adapters have special requirements/ settings which can be activated by the use of environment variables." +echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." +echo " " + +# Checking ENV for Adminport +if [[ "$adminport" != "" && "$multihost" != "slave" ]]; then + adminportold=$(bash iobroker object get "$admininstance" --pretty | grep -oP '(?<="port": )[^,]*') + admininstanceshort=$(echo "$admininstance" | grep -m 1 -o 'admin..') + if [[ "$adminport" != "$adminportold" ]]; then + echo "IOB_ADMINPORT is set and does not match port configured in ioBroker." + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Detected Admin Port in ioBroker: " "$adminportold"; fi + echo "Setting Adminport to \"""$adminport""\"... " + bash iobroker set "$admininstanceshort" --port "$adminport" + echo "Done." + echo " " + fi +fi + +# Checking ENV for Backitup (external database backups) +if [[ "$backitup" == "true" ]]; then + echo -n "IOB_BACKITUP_EXTDB is \"true\". Unlocking features..." + echo "true" > /opt/.docker_config/.backitup + echo "Done." + echo " " +fi + +# Checking ENV for AVAHI +if [[ "$avahi" = "true" && "$offlinemode" = "true" ]]; then + echo "AVAHI is \"true\", but OFFLINE_MODE is also \"true\". Skipping Avahi daemon setup." +elif [[ "$avahi" = "true" ]]; then + echo "AVAHI is \"true\". Running setup script... " + chmod 755 /opt/scripts/setup_avahi.sh + bash /opt/scripts/setup_avahi.sh + echo "Done." + echo " " +fi + +# Checking ENV for Z-WAVE +if [[ "$zwave" = "true" && "$offlinemode" = "true" ]]; then + echo "ZWAVE is \"true\", but OFFLINE_MODE is also \"true\". Skipping Z-Wave setup." +elif [[ "$zwave" = "true" ]]; then + echo "ZWAVE is \"true\". Running setup script... " + chmod 755 /opt/scripts/setup_zwave.sh + bash /opt/scripts/setup_zwave.sh + echo "Done." + echo " " +fi + +# checking ENV for USBDEVICES +if [[ "$usbdevices" != "" && "$usbdevices" != "none" ]]; then + echo "USBDEVICES is set." + IFS=';' read -ra devicearray <<< "$usbdevices" + for i in "${devicearray[@]}" + do + if [[ -e "$i" ]]; then + echo -n "Setting permissions for \"""$i""\"... " + chown root:dialout "$i" + chmod g+rw "$i" + echo "Done." + if [[ "$debug" == "true" ]]; then echo "[DEBUG] Permissions set: " "$(ls -al "$i")"; fi + else + echo "Looks like the device \"""$i""\" does not exist." + echo "Did you mount it correctly by using the \"--device\" option?" + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/#mounting-usb-devices)." + stop_on_error + fi + done + echo " " +fi + +# Checking for Userscripts in /opt/userscripts +if [[ $(find /opt/userscripts -type f | wc -l) -lt 1 ]]; then + echo -n "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 + echo "Done." +elif [[ -f /opt/userscripts/userscript_firststart.sh || -f /opt/userscripts/userscript_everystart.sh ]]; then + if [[ -f /opt/userscripts/userscript_firststart.sh && -f /opt/.docker_config/.first_run ]]; 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 + echo "Done." + 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 + echo "Done." + fi +fi +echo " " + +# Removing first run an fresh install markers when exists +if [[ -f /opt/.docker_config/.first_run ]]; then rm -f /opt/.docker_config/.first_run; fi +if [[ -f /opt/iobroker/.fresh_install ]]; then rm -f /opt/iobroker/.fresh_install; fi + +##### +# STEP 5 - Starting ioBroker +##### +echo "$(printf -- '-%.0s' {1..80})" +echo "----- Step 5 of 5: ioBroker startup -----" +echo "$(printf -- '-%.0s' {1..80})" +echo " " +echo "Starting ioBroker... " +echo " " +echo "##### #### ### ## # iobroker.js-controller log output # ## ### #### #####" + +# Setting healthcheck status to "running" +echo "running" > /opt/.docker_config/.healthcheck + +# Function for graceful shutdown by SIGTERM signal +shut_down() { + echo " " + echo "Recived termination signal (SIGTERM)." + echo "Shutting down ioBroker... " + + local status timeout + + timeout="$(date --date="now + ""$pkill_timeout"" sec" +%s)" + pkill -u iobroker -f iobroker.js-controller + status=$? + if (( status >= 2 )); then # syntax error or fatal error + return 1 + fi + + if (( status == 1 )); then # no processes matched + return + fi + + # pgrep exits with status 1 when there are no matches + while pgrep -u iobroker > /dev/null; (( $? != 1 )); do + if (($(date +%s) > timeout)); then + echo -e "\nTimeout reached. Killing remaining processes... " + pkill --signal SIGKILL -u iobroker + echo "Done. Have a nice day!" + exit + fi + + echo -n "." + sleep 1 + done + + echo -e '\nDone. Have a nice day!' + 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 + +# Fallback process for keeping container running when ioBroker is stopped for maintenance (e.g. js-controller update) +gosu iobroker tail -f /dev/null diff --git a/testing/scripts/maintenance.sh b/testing/scripts/maintenance.sh new file mode 100644 index 0000000..0b64499 --- /dev/null +++ b/testing/scripts/maintenance.sh @@ -0,0 +1,318 @@ +#!/usr/bin/env bash + +# bash strict mode +set -euo pipefail + +autoconfirm= # can be set to 'yes' by command line option +killbyname= # can be set to 'yes' by command line option (undocumented, only for use with backitup restore scripts) +healthcheck=/opt/.docker_config/.healthcheck # path of healthcheck file +pkill_timeout=10 # timeout for stopping iobroker in seconds + +# check for user root +if [ "$(id -u)" -eq 0 ]; then + echo "WARNING! This script should be executed as iobroker user! Please change user and try again." + exit 1 +fi + +# display help text +display_help() { + echo "This script helps you manage your ioBroker container!" + echo " " + echo "Usage: maintenance [ COMMAND ] [ OPTION ]" + echo " maint [ COMMAND ] [ OPTION ]" + echo " m [ COMMAND ] [ OPTION ]" + echo " " + echo "COMMANDS" + echo "------------------" + echo " status > reports the current state of maintenance mode" + echo " on > switches mantenance mode ON" + echo " off > switches mantenance mode OFF and stops or restarts the container" + echo " upgrade > puts the container to maintenance mode and upgrades ioBroker" + echo " restart > stops iobroker and stops or restarts the container" + echo " restore > stops iobroker and restores the last backup" + echo " help > shows this help" + echo " " + echo "OPTIONS" + echo "------------------" + echo " -y|--yes > confirms the used command without asking" + echo " -h|--help > shows this help" + echo " " +} + +# check maintenance enabled +maintenance_enabled() { + [[ -f "$healthcheck" && "$(cat "$healthcheck")" == maintenance ]] +} + +# check status starting +check_starting() { + [[ -f "$healthcheck" && "$(cat "$healthcheck")" == starting ]] +} + +# display maintenance status +maintenance_status() { + if maintenance_enabled; then + echo "Maintenance mode is turned ON." + else + echo "Maintenance mode is turned OFF." + fi +} + +# enable maintenance mode +enable_maintenance() { + if maintenance_enabled; then + echo "Maintenance mode is already turned ON." + return + fi + + echo "You are now going to stop ioBroker and activate maintenance mode for this container." + + if [[ "$killbyname" != yes ]]; then + if [[ "$autoconfirm" != yes ]]; then + local reply + + read -rp 'Do you want to continue [yes/no]? ' reply + if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then + : # continue + else + return 1 + fi + fi + fi + + echo "Activating maintenance mode..." + echo "maintenance" > "$healthcheck" + sleep 1 + echo -n "Stopping ioBroker..." + stop_iob +} + +# disable maintenance mode +disable_maintenance() { + if ! maintenance_enabled; then + echo "Maintenance mode is already turned OFF." + return + fi + + echo "You are now going to deactivate maintenance mode for this container." + echo "Depending on the restart policy, your container will be stopped or restarted immediately." + + if [[ "$autoconfirm" != yes ]]; then + local reply + + read -rp 'Do you want to continue [yes/no]? ' reply + if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then + : # continue + else + return 1 + fi + fi + + echo "Deactivating maintenance mode and forcing container to stop or restart..." + echo "stopping" > "$healthcheck" + pkill -u iobroker + echo "Done." +} + +# upgrade js-controller +upgrade_jscontroller() { + echo "You are now going to upgrade your js-controller." + echo "As this will change data in /opt/iobroker, make sure you have a backup!" + echo "During the upgrade process, the container will automatically switch into maintenance mode and stop ioBroker." + echo "Depending on the restart policy, your container will be stopped or restarted automatically after the upgrade." + + if [[ "$autoconfirm" != yes ]]; then + local reply + + read -rp 'Do you want to continue [yes/no]? ' reply + if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then + : # continue + else + return 1 + fi + fi + + if ! maintenance_enabled > /dev/null; then + autoconfirm=yes + enable_maintenance + fi + + echo "Upgrading js-controller..." + iobroker update + sleep 1 + iobroker upgrade self + sleep 1 + echo "Done." + + echo "Container will be stopped or restarted in 5 seconds..." + sleep 5 + echo "stopping" > "$healthcheck" + pkill -u iobroker +} + +# stop iobroker and wait until all processes stopped or pkill_timeout is reached +stop_iob() { + local status timeout + + timeout="$(date --date="now + $pkill_timeout sec" +%s)" + pkill -u iobroker -f 'iobroker.js-controller[^/]*$' + status=$? + if (( status >= 2 )); then # syntax error or fatal error + return 1 + elif (( status == 1 )); then # no processes matched + return + fi + + if [[ "$killbyname" != yes ]]; then + # pgrep exits with status 1 when there are no matches + while pgrep -u iobroker -f 'io.' > /dev/null; (( $? != 1 )); do + if (($(date +%s) > timeout)); then + echo -e "\nTimeout reached. Killing remaining processes..." + pgrep --list-full -u iobroker + pkill --signal SIGKILL -u iobroker -f 'io.' + echo "\nDone." + return + fi + sleep 1 + echo -n "." + done + else + for ((i=0; i<3; i++)); do + sleep 1 + echo -n "." + done + fi + + echo -e "Done." +} + +# restart container +restart_container() { + echo "You are now going to call a restart of your container." + echo "Restarting will work depending on the configured restart policy." + + if [[ "$autoconfirm" != yes ]]; then + local reply + + read -rp 'Do you want to continue [yes/no]? ' reply + if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then + : # continue + else + return 1 + fi + fi + + if ! maintenance_enabled > /dev/null; then + echo -n "Stopping ioBroker..." + stop_iob + fi + + echo "Container will be stopped or restarted in 5 seconds..." + sleep 5 + echo "stopping" > "$healthcheck" + pkill -u iobroker +} + +# restore iobroker +restore_iobroker() { + echo "You are now going to perform a restore of your iobroker." + echo "During the restore process, the container will automatically switch into maintenance mode and stop ioBroker." + echo "Depending on the restart policy, your container will be stopped or restarted automatically after the restore." + + if [[ "$autoconfirm" != yes ]]; then + local reply + + read -rp 'Do you want to continue [yes/no]? ' reply + if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then + : # continue + else + return 1 + fi + fi + + if check_starting > /dev/null; then + echo "Startup script is still running." + echo "Please check container log and wait until ioBroker is sucessfully started." + echo "Then try again." + return 1 + fi + + if ! maintenance_enabled > /dev/null; then + autoconfirm=yes + enable_maintenance + fi + + echo -n "Restoring ioBroker... " + set +e + bash iobroker restore 0 > /opt/iobroker/log/restore.log 2>&1 + return=$? + set -e + if [[ "$return" -ne 0 ]]; then + echo "Failed." + echo "For more details see \"/opt/iobroker/log/restore.log\"." + echo "Please check backup file location and permissions and try again." + return 1 + fi + echo "Done." + echo " " + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + echo "!!!! IMPORTANT NOTE !!!!" + echo "!!!! The maintenance script restored iobroker from a backup file. !!!!" + echo "!!!! Check /opt/iobroker/log/restore.log to see if restore was successful. !!!!" + echo "!!!! When ioBroker starts it will reinstall all Adapters automatically. !!!!" + echo "!!!! This might be take a looooong time! Please be patient! !!!!" + echo "!!!! You can view installation process by taking a look at ioBroker log. !!!!" + echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + sleep 10 + echo "Container will be stopped or restarted in 10 seconds..." + sleep 10 + echo "stopping" > "$healthcheck" + pkill -u iobroker +} + +# parsing commands and options + +# default command to run unless another was given +run=(display_help) + +for arg in "$@"; do + case $arg in + help|-h|--help) + run=(display_help) + ;; + status|stat|s) + run=(maintenance_status) + ;; + on) + run=(enable_maintenance) + ;; + off) + run=(disable_maintenance) + ;; + upgrade|upgr|u) + run=(upgrade_jscontroller) + ;; + restart|rest|r) + run=(restart_container) + ;; + restore) + run=(restore_iobroker) + ;; + -y|--yes) + autoconfirm=yes + ;; + -kbn|--killbyname) + killbyname=yes + ;; + --) + break + ;; + *) + >&2 echo "Unknown parameter: $arg" + >&2 echo "Please try again or see help (help|-h|--help)." + exit 1 + ;; + esac +done + +"${run[@]}" \ No newline at end of file diff --git a/testing/scripts/setup_avahi.sh b/testing/scripts/setup_avahi.sh new file mode 100644 index 0000000..46d5873 --- /dev/null +++ b/testing/scripts/setup_avahi.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +if [ -e /usr/sbin/avahi-daemon ] && [ -e /var/run/dbus ] +then + echo "[setup_avahi.sh] Avahi is already installed. Nothing to do here." +else + echo -n "[setup_avahi.sh] Avahi-daemon is NOT installed. Going to install it now... " + apt-get update > /opt/scripts/avahi_startup.log 2>&1 + apt-get install -y --no-install-recommends libavahi-compat-libdnssd-dev avahi-daemon >> /opt/scripts/avahi_startup.log 2>&1 + rm -rf /var/lib/apt/lists/* >> /opt/scripts/avahi_startup.log 2>&1 + echo "Done." + echo -n "[setup_avahi.sh] Configuring avahi-daemon... " + sed -i '/^rlimit-nproc/s/^\(.*\)/#\1/g' /etc/avahi/avahi-daemon.conf + echo "Done." + echo -n "[setup_avahi.sh] Configuring dbus... " + mkdir /var/run/dbus/ + echo "Done." +fi + +if [ -f /var/run/dbus/pid ]; +then + rm -f /var/run/dbus/pid +fi + +if [ -f /var/run/avahi-daemon//pid ]; +then + rm -f /var/run/avahi-daemon//pid +fi + +echo -n "[setup_avahi.sh] Starting dbus... " + dbus-daemon --system >> /opt/scripts/avahi_startup.log 2>&1 +echo "Done." + +echo -n "[setup_avahi.sh] Starting avahi-daemon... " + /etc/init.d/avahi-daemon start >> /opt/scripts/avahi_startup.log 2>&1 +echo "Done." + +exit 0 diff --git a/testing/scripts/setup_iob_db.sh b/testing/scripts/setup_iob_db.sh new file mode 100644 index 0000000..df1d679 --- /dev/null +++ b/testing/scripts/setup_iob_db.sh @@ -0,0 +1,357 @@ +#!/bin/bash + +# reading env +debug=$DEBUG +objectsdbhost=$IOB_OBJECTSDB_HOST +objectsdbport=$IOB_OBJECTSDB_PORT +objectsdbtype=$IOB_OBJECTSDB_TYPE +objectsdbname=$IOB_OBJECTSDB_NAME # new for sentinel support +objectsdbpass=$IOB_OBJECTSDB_PASS # new for auth support +setgid=$SETGID +setuid=$SETUID +statesdbhost=$IOB_STATESDB_HOST +statesdbport=$IOB_STATESDB_PORT +statesdbtype=$IOB_STATESDB_TYPE +statesdbname=$IOB_STATESDB_NAME # new for sentinel support +statesdbpass=$IOB_STATESDB_PASS # new for auth support + +# functions +write_iobroker_json() { + mv /opt/iobroker/iobroker-data/iobroker.json.tmp /opt/iobroker/iobroker-data/iobroker.json + chown -R "$setuid":"$setgid" /opt/iobroker/iobroker-data/iobroker.json && chmod 674 /opt/iobroker/iobroker-data/iobroker.json +} +set_objectsdb_type() { + if [[ "$objectsdbtype" != "$(jq -r '.objects.type' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_TYPE is available but value is different from detected ioBroker installation." + echo -n "Setting type of objects db to \"""$objectsdbtype""\"... " + jq --arg value "$objectsdbtype" '.objects.type = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_OBJECTSDB_TYPE is available and value meets detected ioBroker installation." + fi +} +set_objectsdb_host() { + if [[ $objectsdbhost == *","* ]]; then + if [[ "$(jq -c -n --arg value "$objectsdbhost" '$value|split(",")')" != "$(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_HOST is available but value is different from detected ioBroker installation." + echo -n "Setting host of objects db to \"""$objectsdbhost""\"... " + jq --arg value "$objectsdbhost" '.objects.host = ($value|split(","))' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_OBJECTSDB_HOST is available and value meets detected ioBroker installation." + fi + if [[ $objectsdbname != "" ]]; then + if [[ "$objectsdbname" != "$(jq -r '.objects.sentinelName' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_NAME is available but value is different from detected ioBroker installation." + echo -n "Setting name of objects db to \"""$objectsdbname""\"... " + jq --arg value "$objectsdbname" '.objects.sentinelName = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_OBJECTSDB_NAME is available and value meets detected ioBroker installation." + fi + else + if [[ "$(jq -r '.objects.sentinelName' /opt/iobroker/iobroker-data/iobroker.json)" != "mymaster" ]]; then + echo "IOB_OBJECTSDB_NAME is not available. Using default value \"mymaster\" instead." + echo -n "Setting name of objects db to \"mymaster\"... " + jq --arg value "mymaster" '.objects.sentinelName = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_OBJECTSDB_NAME is not available but default value \"mymaster\" meets detected ioBroker installation.." + fi + fi + else + if [[ "$objectsdbhost" != "$(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_HOST is available but value is different from detected ioBroker installation." + echo -n "Setting host of objects db to \"""$objectsdbhost""\"... " + jq --arg value "$objectsdbhost" '.objects.host = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_OBJECTSDB_HOST is available and value meets detected ioBroker installation." + fi + fi +} +set_objectsdb_port() { + if [[ $objectsdbport == *","* ]]; then + if [[ "$(jq -c -n --arg value "$objectsdbport" '$value|split(",")')" != "$(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_PORT is available but value is different from detected ioBroker installation." + echo -n "Setting port of objects db to \"""$objectsdbport""\"... " + jq --arg value "$objectsdbport" '.objects.port = ($value|split(","))' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_OBJECTSDB_PORT is available and value meets detected ioBroker installation." + fi + else + if [[ "$objectsdbport" != "$(jq -r '.objects.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_PORT is available but value is different from detected ioBroker installation." + echo -n "Setting port of objects db to \"""$objectsdbport""\"... " + jq --arg value "$objectsdbport" '.objects.port = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_OBJECTSDB_PORT is available and value meets detected ioBroker installation." + fi + fi +} +set_objectsdb_pass() { + if [[ "$objectsdbpass" == "none" ]]; then + echo "IOB_OBJECTSDB_PASS is available but value is set to \"none\"." + echo -n "Removing password of objects db... " + jq '.objects.options.auth_pass = null' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + elif [[ "$objectsdbpass" != "$(jq -r '.objects.options.auth_pass' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_OBJECTSDB_PASS is available but value is different from detected ioBroker installation." + echo -n "Setting password of objects db... " + jq --arg value "$objectsdbpass" '.objects.options.auth_pass = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_OBJECTSDB_PASS is available and value meets detected ioBroker installation." + fi +} +set_statesdb_type() { + if [[ "$statesdbtype" != "$(jq -r '.states.type' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_TYPE is available but value is different from detected ioBroker installation." + echo -n "Setting type of states db to \"""$statesdbtype""\"... " + jq --arg value "$statesdbtype" '.states.type = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_STATESDB_TYPE is available and value meets detected ioBroker installation." + fi +} +set_statesdb_host() { + if [[ $statesdbhost == *","* ]]; then + if [[ "$(jq -c -n --arg parm "$statesdbhost" '$parm|split(",")')" != "$(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_HOST is available but value is different from detected ioBroker installation." + echo -n "Setting host of states db to \"""$statesdbhost""\"... " + jq --arg value "$statesdbhost" '.states.host = ($value|split(","))' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_STATESDB_HOST is available and value meets detected ioBroker installation." + fi + if [[ $statesdbname != "" ]]; then + if [[ "$statesdbname" != "$(jq -r '.states.sentinelName' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_NAME is available but value is different from detected ioBroker installation." + echo -n "Setting name of states db to \"""$statesdbname""\"... " + jq --arg value "$statesdbname" '.states.sentinelName = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_STATESDB_NAME is available and value meets detected ioBroker installation." + fi + else + if [[ "$(jq -r '.states.sentinelName' /opt/iobroker/iobroker-data/iobroker.json)" != "mymaster" ]]; then + echo "IOB_STATESDB_NAME is not available. Using default value \"mymaster\" instead." + echo -n "Setting name of states db to \"mymaster\"... " + jq --arg value "mymaster" '.states.sentinelName = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_STATESDB_NAME is not available but default value \"mymaster\" meets detected ioBroker installation.." + fi + fi + else + if [[ "$statesdbhost" != "$(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_HOST is available but value is different from detected ioBroker installation." + echo -n "Setting host of states db to \"""$statesdbhost""\"... " + jq --arg value "$statesdbhost" '.states.host = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_STATESDB_HOST is available and value meets detected ioBroker installation." + fi + fi +} +set_statesdb_port() { + if [[ $statesdbport == *","* ]]; then + if [[ "$(jq -c -n --arg value "$statesdbport" '$value|split(",")')" != "$(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_PORT is available but value is different from detected ioBroker installation." + echo -n "Setting port of states db to \"""$statesdbport""\"... " + jq --arg value "$statesdbport" '.states.port = ($value|split(","))' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_STATESDB_PORT is available and value meets detected ioBroker installation." + fi + else + if [[ "$statesdbport" != "$(jq -r '.states.port' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_PORT is available but value is different from detected ioBroker installation." + echo -n "Setting port of states db to \"""$statesdbport""\"... " + jq --arg value "$statesdbport" '.states.port = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_STATESDB_PORT is available and value meets detected ioBroker installation." + fi + fi +} +set_statesdb_pass() { + if [[ "$statesdbpass" == "none" ]]; then + echo "IOB_STATESDB_PASS is available but value is set to \"none\"." + echo -n "Removing password of states db... " + jq '.states.options.auth_pass = null' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + elif [[ "$statesdbpass" != "$(jq -r '.states.options.auth_pass' /opt/iobroker/iobroker-data/iobroker.json)" ]]; then + echo "IOB_STATESDB_PASS is available but value is different from detected ioBroker installation." + echo -n "Setting password of states db... " + jq --arg value "$statesdbpass" '.states.options.auth_pass = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "IOB_STATESDB_PASS is available and value meets detected ioBroker installation." + fi +} +config_error_output() { + echo " " + echo "Something went wrong. Looks like at least one parameter defining the custom db connection was not set properly or is missing." + echo "Please check your configuration and try again." + echo "For more information see ioBroker Docker Image Docs (https://docs.buanet.de/iobroker-docker-image/docs/)." +} + +# parameter check +if [[ "$1" == "-master" ]]; then # setup master + echo "IOB_MULTIHOST is available and set to \"master\"." + echo "Done." + echo " " + # multihost objects db + if [[ "$objectsdbtype" != "" && "$objectsdbhost" != "" && "$objectsdbport" != "" ]]; then + echo "Configuring custom objects db..." + set_objectsdb_type + set_objectsdb_host + set_objectsdb_port + if [[ "$objectsdbpass" != "" ]]; then set_objectsdb_pass; fi + echo "Done." + echo " " + elif [[ "$objectsdbtype" == "" && "$objectsdbhost" == "" && "$objectsdbport" == "" ]]; then + echo "No custom objects db is set." + if [[ "$(jq -r '.objects.host' /opt/iobroker/iobroker-data/iobroker.json)" != "0.0.0.0" ]]; then + echo -n "Configuring default objects db to accept external connections... " + jq --arg value "0.0.0.0" '.objects.host = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "Default objects db is accepting external connections." + fi + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_OBJECTSDB_TYPE = ""$objectsdbtype" + echo "[DEBUG] IOB_OBJECTSDB_HOST = ""$objectsdbhost" + echo "[DEBUG] IOB_OBJECTSDB_PORT = ""$objectsdbport" + fi + config_error_output + exit 1 + fi + # multihost states db + if [[ "$statesdbtype" != "" && "$statesdbhost" != "" && "$statesdbport" != "" ]]; then + echo "Configuring custom states db..." + set_statesdb_type + set_statesdb_host + set_statesdb_port + if [[ "$statesdbpass" != "" ]]; then set_statesdb_pass; fi + echo "Done." + echo " " + elif [[ "$statesdbtype" == "" && "$statesdbhost" == "" && "$statesdbport" == "" ]]; then + echo "No custom states db is set." + if [[ "$(jq -r '.states.host' /opt/iobroker/iobroker-data/iobroker.json)" != "0.0.0.0" ]]; then + echo -n "Configuring default states db to accept external connections... " + jq --arg value "0.0.0.0" '.states.host = $value' /opt/iobroker/iobroker-data/iobroker.json > /opt/iobroker/iobroker-data/iobroker.json.tmp + write_iobroker_json + echo "Done." + else + echo "Default states db is accepting external connections." + fi + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_STATESDB_TYPE = ""$statesdbtype" + echo "[DEBUG] IOB_STATESDB_HOST = ""$statesdbhost" + echo "[DEBUG] IOB_STATESDB_PORT = ""$statesdbport" + fi + config_error_output + exit 1 + fi +elif [[ "$1" == "-slave" ]]; then # setup slave + echo "IOB_MULTIHOST is available and set to \"slave\"." + echo "Done." + echo " " + # multihost slave objects db connection + if [[ "$objectsdbtype" != "" && "$objectsdbhost" != "" && "$objectsdbport" != "" ]]; then + echo "Configuring objects db connection..." + set_objectsdb_type + set_objectsdb_host + set_objectsdb_port + if [[ "$objectsdbpass" != "" ]]; then set_objectsdb_pass; fi + echo "Done." + echo " " + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_OBJECTSDB_TYPE = ""$objectsdbtype" + echo "[DEBUG] IOB_OBJECTSDB_HOST = ""$objectsdbhost" + echo "[DEBUG] IOB_OBJECTSDB_PORT = ""$objectsdbport" + fi + config_error_output + exit 1 + fi + # multihost slave states db connection + if [[ "$statesdbtype" != "" && "$statesdbhost" != "" && "$statesdbport" != "" ]]; then + echo "Configuring states db connection..." + set_statesdb_type + set_statesdb_host + set_statesdb_port + if [[ "$statesdbpass" != "" ]]; then set_statesdb_pass; fi + echo "Done." + echo " " + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_STATESDB_TYPE = ""$statesdbtype" + echo "[DEBUG] IOB_STATESDB_HOST = ""$statesdbhost" + echo "[DEBUG] IOB_STATESDB_PORT = ""$statesdbport" + fi + config_error_output + exit 1 + fi +elif [[ "$1" == "-objectsdb" ]]; then # setup objects db standalone + if [[ "$objectsdbtype" != "" && "$objectsdbhost" != "" && "$objectsdbport" != "" ]]; then + echo "Configuring custom objects db..." + set_objectsdb_type + set_objectsdb_host + set_objectsdb_port + if [[ "$objectsdbpass" != "" ]]; then set_objectsdb_pass; fi + echo "Done." + echo " " + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_OBJECTSDB_TYPE = ""$objectsdbtype" + echo "[DEBUG] IOB_OBJECTSDB_HOST = ""$objectsdbhost" + echo "[DEBUG] IOB_OBJECTSDB_PORT = ""$objectsdbport" + fi + config_error_output + exit 1 + fi +elif [[ "$1" == "-statesdb" ]]; then # setup states db standalone + if [[ "$statesdbtype" != "" && "$statesdbhost" != "" && "$statesdbport" != "" ]]; then + echo "Configuring custom states db..." + set_statesdb_type + set_statesdb_host + set_statesdb_port + if [[ "$statesdbpass" != "" ]]; then set_statesdb_pass; fi + echo "Done." + echo " " + else + if [[ "$debug" == "true" ]]; then + echo "[DEBUG] IOB_STATESDB_TYPE = ""$statesdbtype" + echo "[DEBUG] IOB_STATESDB_HOST = ""$statesdbhost" + echo "[DEBUG] IOB_STATESDB_PORT = ""$statesdbport" + fi + config_error_output + exit 1 + fi +fi diff --git a/testing/scripts/setup_packages.sh b/testing/scripts/setup_packages.sh new file mode 100644 index 0000000..75f0d28 --- /dev/null +++ b/testing/scripts/setup_packages.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# bash strict mode +set -euo pipefail + +# Reading ENV +set +u +packages=$PACKAGES +debug=$DEBUG +set -u + +export DEBIAN_FRONTEND=noninteractive + +check_package_preq() { + # check for influx packages + if [[ "$i" == "influxdb" || "$i" == "influxdb2-cli" ]]; then + # add influxdata repo keys + wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null + echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main" | sudo tee /etc/apt/sources.list.d/influxdata.list + apt-get -q update >> /opt/scripts/setup_packages.log 2>&1 + fi +} +check_package_validity() { + # check string for double spaces + while echo "$packages" | grep -q ' '; do + packages=$(echo "$packages" | sed 's/ / /g') + done + # remove packages when "influxdb" AND "influxdb2-cli" + if echo "$packages" | grep -qw "influxdb" && echo "$packages" | grep -qw "influxdb2-cli"; then + echo "PACKAGES includes influxdb AND influxdb2-cli." + echo "As installing both packages together is not possible, they will be skipped." + packages=$(echo "$packages" | sed 's/influxdb2-cli//g;s/influxdb//g') + # check string for double spaces again + while echo "$packages" | grep -q ' '; do + packages=$(echo "$packages" | sed 's/ / /g') + done + if [[ $debug == "true" ]]; then echo "[DEBUG] New list of packages: ""$packages"; fi + echo " " + fi +} + +if [[ "$1" == "-install" ]]; then + echo " " + apt-get -q update >> /opt/scripts/setup_packages.log 2>&1 + check_package_validity + for i in $packages; do + if ! dpkg -s "$i" >/dev/null 2>&1; then + echo -n "$i is not installed. Installing... " + check_package_preq >> /opt/scripts/setup_packages.log 2>&1 + if ! apt-get -q -y --no-install-recommends install "$i" >> /opt/scripts/setup_packages.log 2>&1; then + echo "Failed." + echo "For more details see \"/opt/scripts/setup_packages.log\"." + else + echo "Done." + fi + else + echo "$i is already installed." + fi + done +elif [[ "$1" == "-update" ]]; then + echo -n "Updating Linux packages on first run... " + apt-get -q update >> /opt/scripts/setup_packages.log 2>&1 + return1=$? + apt-get -q -y upgrade >> /opt/scripts/setup_packages.log 2>&1 + return2=$? + if [[ "$return1" -ne 0 || "$return2" -ne 0 ]]; then + echo "Failed." + echo "For more details see \"/opt/scripts/setup_packages.log\"." + echo "Make sure the container has internet access to get the latest package updates." + echo "This has no impact to the setup process. The script will continue." + else + echo "Done." + fi +else + echo "No paramerter found!" + exit 1 +fi + +# Silent Cleanup +apt-get -qq autoclean -y && apt-get -qq autoremove && apt-get -qq clean +rm -rf /tmp/* /var/tmp/* /root/.cache/* /var/lib/apt/lists/* + +exit 0 \ No newline at end of file diff --git a/testing/scripts/setup_zwave.sh b/testing/scripts/setup_zwave.sh new file mode 100644 index 0000000..8efd62e --- /dev/null +++ b/testing/scripts/setup_zwave.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -e /usr/local/lib64 ] +then + echo "[setup_zwave.sh] Openzwave is already installed. Nothing to do here." +else + echo -n "[setup_zwave.sh] Openzwave is NOT installed. Going to install it now... " + cd /opt || exit + curl -s -L -O http://old.openzwave.com/downloads/openzwave-1.6.1007.tar.gz + tar -xf openzwave-1.6.1007.tar.gz && rm openzwave-1.6.1007.tar.gz + cd openzwave-1.6.1007 && make > /dev/null 2>&1 && make install > /dev/null 2>&1 + ldconfig /usr/local/lib64 + cd /opt/iobroker || exit + echo "Done." +fi + +exit 0 diff --git a/testing/test_stack.yml b/testing/test_stack.yml new file mode 100644 index 0000000..6b6def0 --- /dev/null +++ b/testing/test_stack.yml @@ -0,0 +1,15 @@ +version: "3" +services: + ##### IOBROKER ##### + iobrokertest: + container_name: iobrokertest + image: buanet/iobroker:testing + hostname: iobrokertest + restart: always + ports: + - 8081:8081 + environment: + - PACKAGES=nano + - DEBUG=true + volumes: + - /home/andre/tmp/docker/iobrokertest_data:/opt/iobroker \ No newline at end of file diff --git a/testing/userscripts/userscript_everystart_example.sh b/testing/userscripts/userscript_everystart_example.sh new file mode 100644 index 0000000..320e6a9 --- /dev/null +++ b/testing/userscripts/userscript_everystart_example.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# This is an example script file. +# To run the Script on every start of the container you have to rename it to userscript_everystart.sh. + +# You can add your advanced script code here! + +echo " " +echo "I'm your startscript userscript_everystart.sh. I will run on EVERY container startup." +echo " " + + +exit 0 diff --git a/testing/userscripts/userscript_firststart_example.sh b/testing/userscripts/userscript_firststart_example.sh new file mode 100644 index 0000000..1e25e34 --- /dev/null +++ b/testing/userscripts/userscript_firststart_example.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# This is an example script file. +# To run the Script on the first start of a new container you have to rename it to userscript_firststart.sh. + +# You can add your advanced script code here! + +echo " " +echo "I'm your startscript userscript_firststart.sh. I will run only on the FIRST startup of the container." +echo " " + +exit 0 From c4e8b87bc149095813e0ab535668bb101fc7669d Mon Sep 17 00:00:00 2001 From: buanet Date: Tue, 29 Aug 2023 23:06:47 +0200 Subject: [PATCH 02/39] moving files and testing new iob executable --- {testing => debian12}/Dockerfile | 0 {testing => debian12}/scripts/healthcheck.sh | 0 debian12/scripts/iobroker.sh | 62 +++++++++++++++++++ .../scripts/iobroker_startup.sh | 2 +- {testing => debian12}/scripts/maintenance.sh | 0 {testing => debian12}/scripts/setup_avahi.sh | 0 {testing => debian12}/scripts/setup_iob_db.sh | 0 .../scripts/setup_packages.sh | 0 {testing => debian12}/scripts/setup_zwave.sh | 0 {testing => debian12}/test_stack.yml | 0 .../userscript_everystart_example.sh | 0 .../userscript_firststart_example.sh | 0 testing/scripts/iobroker.sh | 24 ------- 13 files changed, 63 insertions(+), 25 deletions(-) rename {testing => debian12}/Dockerfile (100%) rename {testing => debian12}/scripts/healthcheck.sh (100%) create mode 100644 debian12/scripts/iobroker.sh rename {testing => debian12}/scripts/iobroker_startup.sh (99%) rename {testing => debian12}/scripts/maintenance.sh (100%) rename {testing => debian12}/scripts/setup_avahi.sh (100%) rename {testing => debian12}/scripts/setup_iob_db.sh (100%) rename {testing => debian12}/scripts/setup_packages.sh (100%) rename {testing => debian12}/scripts/setup_zwave.sh (100%) rename {testing => debian12}/test_stack.yml (100%) rename {testing => debian12}/userscripts/userscript_everystart_example.sh (100%) rename {testing => debian12}/userscripts/userscript_firststart_example.sh (100%) delete mode 100644 testing/scripts/iobroker.sh diff --git a/testing/Dockerfile b/debian12/Dockerfile similarity index 100% rename from testing/Dockerfile rename to debian12/Dockerfile diff --git a/testing/scripts/healthcheck.sh b/debian12/scripts/healthcheck.sh similarity index 100% rename from testing/scripts/healthcheck.sh rename to debian12/scripts/healthcheck.sh diff --git a/debian12/scripts/iobroker.sh b/debian12/scripts/iobroker.sh new file mode 100644 index 0000000..96ee5f4 --- /dev/null +++ b/debian12/scripts/iobroker.sh @@ -0,0 +1,62 @@ +#!/usr/bin/bash + +# run iob fix +iob_fix () { + if [ "$(id -u)" -eq 0 ]; then + echo "The ioBroker fixer script is not specifically designed to run in Docker." + echo "Although it is generally safe to use, use it at your own risk and make sure to restart your container immediately after execution!" + + local reply + read -rp 'Do you want to continue? [yes/no] ' reply + if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then + : # continue + else + return 1 + fi + curl -sL https://iobroker.net/fix.sh | bash - + else + echo "Due to some limitations in Docker, you need to run the ioBroker fixer script as root." + echo "Please connect as root user and try again." + fi +} + +# run iob diag +iob_diag () { + if [ "$(id -u)" -eq 0 ]; then + echo "The ioBroker diag script is not specifically designed to run in Docker." + echo "Although it is generally safe to use, use it at your own risk." + local reply + read -rp 'Do you want to continue? [yes/no] ' reply + if [[ "$reply" == y || "$reply" == Y || "$reply" == yes ]]; then + : # continue + else + return 1 + fi + curl -sLf https://iobroker.net/diag.sh --output /home/iobroker/.diag.sh && bash /home/iobroker/.diag.sh | gosu iobroker tee /home/iobroker/iob_diag.log + else + echo "Due to some limitations in Docker, you need to run the ioBroker fixer script as root." + echo "Please connect as root user and try again." + fi +} + +if [ "$1" = "fix" ]; then # call iobroker fixer + iob_fix +elif [ "$1" = "diag" ]; then # call iobroker diag script + iob_diag +elif [ "$1" = "start" ] || [ "$1" = "stop" ] || [ "$1" = "restart" ]; then # block execution of iobroker start | stop | restart + echo "The execution of this command is blocked as your ioBroker is running inside a Docker container!" + echo "For more details see ioBroker Docker image docs (https://docs.buanet.de/iobroker-docker-image/docs/) or use the maintenance script 'maintenance --help'." +elif [ "$1" = "m" ] || [ "$1" = "maint" ] || [ "$1" = "maintenance" ]; then # call iobroker maintenance script + shift + if [ "$(id -u)" -eq 0 ]; then # check for execution as root + gosu iobroker bash /opt/scripts/maintenance.sh "$@" + else + bash /opt/scripts/maintenance.sh "$@" + fi +else # passing all other parameters to iobroker.js + if [ "$(id -u)" -eq 0 ]; then # check for execution as root + gosu iobroker node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@" + else + node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@" + fi +fi diff --git a/testing/scripts/iobroker_startup.sh b/debian12/scripts/iobroker_startup.sh similarity index 99% rename from testing/scripts/iobroker_startup.sh rename to debian12/scripts/iobroker_startup.sh index 2c04cda..e4f96e2 100644 --- a/testing/scripts/iobroker_startup.sh +++ b/debian12/scripts/iobroker_startup.sh @@ -221,7 +221,7 @@ echo "$(printf -- '-%.0s' {1..80})" echo " " # Backing up original iobroker executable to fix sudo bug with gosu -if [[ ! -f /opt/iobroker/iobroker.bak ]]; then +if [[ -n $(cmp /opt/scripts/iobroker.sh /opt/iobroker/iobroker) ]]; then echo -n "Replacing ioBroker executable to fix sudo bug... " cp -a /opt/iobroker/iobroker /opt/iobroker/iobroker.bak cp -f /opt/scripts/iobroker.sh /opt/iobroker/iobroker diff --git a/testing/scripts/maintenance.sh b/debian12/scripts/maintenance.sh similarity index 100% rename from testing/scripts/maintenance.sh rename to debian12/scripts/maintenance.sh diff --git a/testing/scripts/setup_avahi.sh b/debian12/scripts/setup_avahi.sh similarity index 100% rename from testing/scripts/setup_avahi.sh rename to debian12/scripts/setup_avahi.sh diff --git a/testing/scripts/setup_iob_db.sh b/debian12/scripts/setup_iob_db.sh similarity index 100% rename from testing/scripts/setup_iob_db.sh rename to debian12/scripts/setup_iob_db.sh diff --git a/testing/scripts/setup_packages.sh b/debian12/scripts/setup_packages.sh similarity index 100% rename from testing/scripts/setup_packages.sh rename to debian12/scripts/setup_packages.sh diff --git a/testing/scripts/setup_zwave.sh b/debian12/scripts/setup_zwave.sh similarity index 100% rename from testing/scripts/setup_zwave.sh rename to debian12/scripts/setup_zwave.sh diff --git a/testing/test_stack.yml b/debian12/test_stack.yml similarity index 100% rename from testing/test_stack.yml rename to debian12/test_stack.yml diff --git a/testing/userscripts/userscript_everystart_example.sh b/debian12/userscripts/userscript_everystart_example.sh similarity index 100% rename from testing/userscripts/userscript_everystart_example.sh rename to debian12/userscripts/userscript_everystart_example.sh diff --git a/testing/userscripts/userscript_firststart_example.sh b/debian12/userscripts/userscript_firststart_example.sh similarity index 100% rename from testing/userscripts/userscript_firststart_example.sh rename to debian12/userscripts/userscript_firststart_example.sh diff --git a/testing/scripts/iobroker.sh b/testing/scripts/iobroker.sh deleted file mode 100644 index 0a88e77..0000000 --- a/testing/scripts/iobroker.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/bash - -if [ "$(id -u)" -eq 0 ]; then - echo "WARNING! IoBroker should not be executed as root!" -fi - -if [ "$1" = "fix" ]; then # call iobroker fixer - curl -sL https://iobroker.net/fix.sh | bash - -elif [ "$1" = "diag" ]; then # call iobroker diag script - if [ "$(id -u)" -eq 0 ]; then # check for execution as root - gosu iobroker curl -sLf https://iobroker.net/diag.sh --output /home/iobroker/.diag.sh && bash /home/iobroker/.diag.sh | gosu iobroker tee /home/iobroker/iob_diag.log - else - curl -sLf https://iobroker.net/diag.sh --output /home/iobroker/.diag.sh && bash /home/iobroker/.diag.sh | tee /home/iobroker/iob_diag.log - fi -elif [ "$1" = "start" ] || [ "$1" = "stop" ] || [ "$1" = "restart" ]; then # block execution of iobroker start | stop | restart - echo "The execution of this command is blocked as your ioBroker is running inside a Docker container!" - echo "Please check ioBroker Docker image docs (https://docs.buanet.de) for the proper way to perform this action!" -else # passing all other parameters to iobroker.js - if [ "$(id -u)" -eq 0 ]; then # check for execution as root - gosu iobroker node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@" - else - node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js "$@" - fi -fi From bbe6c2763e4f41c8a40178736a89aaec31438ae3 Mon Sep 17 00:00:00 2001 From: buanet Date: Sat, 2 Sep 2023 00:03:31 +0200 Subject: [PATCH 03/39] prepare first build --- .VERSION | 2 +- CHANGELOG.md | 6 ++++++ debian12/Dockerfile | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.VERSION b/.VERSION index 7bc0d81..07aa000 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v8.1.0-beta.4 \ No newline at end of file +v9.0.0-beta.1 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 3860a11..fb5478e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ ## Changelog +### v9.0.0-beta.1 (coming soon) +* updating base image to debian 12 (bookworm) +* improve security by avoiding running commands as root +* integrate calling maintenance script into iobroker command +* move container config files location + ### v8.1.0-beta.4 (29.07.2023) * fix container restart in maintenance script * fix running maintenance script as iobroker diff --git a/debian12/Dockerfile b/debian12/Dockerfile index 26e3fa2..c9049e4 100644 --- a/debian12/Dockerfile +++ b/debian12/Dockerfile @@ -7,17 +7,18 @@ LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ org.opencontainers.image.base.name="debian:bookworm-slim" \ - org.opencontainers.image.version="v9.0.0-testing" \ - org.opencontainers.image.created="00-00-00" + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.created="${DATI}" ENV DEBIAN_FRONTEND noninteractive -# Copy scripts +# Copy files COPY scripts /opt/scripts COPY userscripts /opt/userscripts -# Install prerequisites (including node) and generating locales +# Set up ioBroker RUN apt-get update && apt-get upgrade -y \ + # Install prerequisites && apt-get install -y \ apt-utils \ cifs-utils \ @@ -30,13 +31,12 @@ RUN apt-get update && apt-get upgrade -y \ procps \ python3 \ python3-dev \ - #sudo \ tar \ tzdata \ udev \ wget \ # Install node - && curl -sL https://deb.nodesource.com/setup_18.x | bash - \ + && curl -sL https://deb.nodesource.com/setup_${NODE}.x | bash - \ && apt-get update && apt-get install -y nodejs \ # Install node-gyp && npm install --production -g node-gyp \ @@ -52,7 +52,7 @@ RUN apt-get update && apt-get upgrade -y \ # Prepare old .docker_config (needed until changed in iobroker) && mkdir /opt/scripts/.docker_config \ && echo "v9.0.0-testing" > /opt/scripts/.docker_config/.thisisdocker \ - # Run installer + # Run iobroker installer && curl -sL https://iobroker.net/install.sh | bash - \ # Deleting UUID from build && iobroker unsetup -y \ @@ -78,7 +78,7 @@ RUN apt-get update && apt-get upgrade -y \ && apt-get clean \ && rm -rf /tmp/* /var/tmp/* /root/.cache/* /root/.npm/* /var/lib/apt/lists/* -# Setting up default ENVs +# Default environment variables ENV DEBIAN_FRONTEND="teletype" \ LANG="de_DE.UTF-8" \ LANGUAGE="de_DE:de" \ @@ -87,7 +87,7 @@ ENV DEBIAN_FRONTEND="teletype" \ SETUID=1000 \ TZ="Europe/Berlin" -# Expose default admin ui port +# Default admin ui port EXPOSE 8081 # Change work dir @@ -97,7 +97,7 @@ WORKDIR /opt/iobroker/ HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] -# Volumes for persistent data +# Volume for persistent data VOLUME ["/opt/iobroker"] # Run startup-script From 21cf38611cb22a3db79712dc87c11b8ffe9c10f5 Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 3 Sep 2023 22:31:41 +0200 Subject: [PATCH 04/39] update node setup in dockerfile --- CHANGELOG.md | 3 ++- debian12/Dockerfile | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb5478e..9dada72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ## Changelog ### v9.0.0-beta.1 (coming soon) -* updating base image to debian 12 (bookworm) +* update nodejs setup process +* update base image to debian 12 (bookworm) * improve security by avoiding running commands as root * integrate calling maintenance script into iobroker command * move container config files location diff --git a/debian12/Dockerfile b/debian12/Dockerfile index c9049e4..19ad9d4 100644 --- a/debian12/Dockerfile +++ b/debian12/Dockerfile @@ -21,8 +21,10 @@ RUN apt-get update && apt-get upgrade -y \ # Install prerequisites && apt-get install -y \ apt-utils \ + ca-certificates \ cifs-utils \ curl \ + gnupg \ gosu \ iputils-ping \ jq \ @@ -36,7 +38,9 @@ RUN apt-get update && apt-get upgrade -y \ udev \ wget \ # Install node - && curl -sL https://deb.nodesource.com/setup_${NODE}.x | bash - \ + && mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODE}.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ && apt-get update && apt-get install -y nodejs \ # Install node-gyp && npm install --production -g node-gyp \ From 82a88370d63747e12c4a7aae5826fab6a100631a Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 3 Sep 2023 22:33:50 +0200 Subject: [PATCH 05/39] add workflow --- .github/workflows/build-debian12-dev.yml | 92 ++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 .github/workflows/build-debian12-dev.yml diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml new file mode 100644 index 0000000..3eb0015 --- /dev/null +++ b/.github/workflows/build-debian12-dev.yml @@ -0,0 +1,92 @@ +# Github action to build Debian12 image (Tag: dev) +name: Build Debian 12 Image (dev) + +on: + workflow_dispatch: + +jobs: + build-dev-image: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3.6.0 + with: + repository: 'buanet/ioBroker.docker' + + - name: Set job variables + run: | + NODE="18" + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + # Log output and export as Github environment variable + echo "[LOG] Nodejs Version: $NODE" + echo "node=$NODE" >> $GITHUB_ENV + echo "[LOG] Image Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "[LOG] Major Image Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "[LOG] Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # Set values in iobroker_startup.sh + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp + mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh + # Set values in Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/$NODE/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp + mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2.2.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2.10.0 + + - name: Login to DockerHub + uses: docker/login-action@v2.2.0 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2.2.0 + with: + registry: ghcr.io + username: ${{ secrets.PACKAGES_USER }} + password: ${{ secrets.PACKAGES_PASS }} + + - name: Build and push Docker image + uses: docker/build-push-action@v4.1.1 + with: + context: ./debian12 + file: ./debian12/Dockerfile + push: true + platforms: | + linux/amd64 + linux/arm/v7 + linux/arm64/v8 + tags: | + buanet/iobroker:dev, + ghcr.io/buanet/iobroker:dev + provenance: false + outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) + + - name: Delete untagged images from GitHub Container Registry + uses: actions/github-script@v6.4.1 + with: + github-token: ${{ secrets.PACKAGES_PASS }} + script: | + const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", + { per_page: ${{ env.PER_PAGE }} + }); + for(version of response.data) { + if (version.metadata.container.tags.length == 0) { + console.log("delete " + version.id) + const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); + console.log("status " + deleteResponse.status) + } + } + env: + OWNER: buanet + PACKAGE_NAME: iobroker + PER_PAGE: 100 From 71ece920f0c08ec122aec968455af0b0defbf830 Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 3 Sep 2023 22:55:08 +0200 Subject: [PATCH 06/39] add libatomic1 --- debian12/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/debian12/Dockerfile b/debian12/Dockerfile index 19ad9d4..d44b32e 100644 --- a/debian12/Dockerfile +++ b/debian12/Dockerfile @@ -28,6 +28,7 @@ RUN apt-get update && apt-get upgrade -y \ gosu \ iputils-ping \ jq \ + libatomic1 \ locales \ nfs-common \ procps \ From af512869542b74582476b0be90ee123744fde12e Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 08:06:25 +0200 Subject: [PATCH 07/39] update version detection --- debian12/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian12/Dockerfile b/debian12/Dockerfile index d44b32e..fb27fe1 100644 --- a/debian12/Dockerfile +++ b/debian12/Dockerfile @@ -52,11 +52,11 @@ RUN apt-get update && apt-get upgrade -y \ # Prepare .docker_config && mkdir /opt/.docker_config \ && echo "starting" > /opt/.docker_config/.healthcheck \ - && echo "v9.0.0-testing" > /opt/.docker_config/.thisisdocker \ + && echo "${VERSION}" > /opt/.docker_config/.thisisdocker \ && echo "true" > /opt/.docker_config/.first_run \ # Prepare old .docker_config (needed until changed in iobroker) && mkdir /opt/scripts/.docker_config \ - && echo "v9.0.0-testing" > /opt/scripts/.docker_config/.thisisdocker \ + && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ # Run iobroker installer && curl -sL https://iobroker.net/install.sh | bash - \ # Deleting UUID from build From 82c98eb90603b4750c0e031ac88eb0e06b89d2a4 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 09:22:04 +0200 Subject: [PATCH 08/39] cleanup/ restructure repo --- .github/workflows/build-debian-image-dev.yml | 89 --------------- ...de20.yml => build-debian12-dev-node20.yml} | 39 +++---- CHANGELOG.md | 1 + debian/Dockerfile | 102 ------------------ debian/node12/Dockerfile | 97 ----------------- debian/node14/Dockerfile | 97 ----------------- debian/node20/Dockerfile | 102 ------------------ {debian => debian11}/node16/Dockerfile | 0 {debian => debian11}/node18/Dockerfile | 0 {debian => debian11}/scripts/healthcheck.sh | 0 .../scripts/iobroker_startup.sh | 0 {debian => debian11}/scripts/maintenance.sh | 0 {debian => debian11}/scripts/setup_avahi.sh | 0 {debian => debian11}/scripts/setup_iob_db.sh | 0 .../scripts/setup_packages.sh | 0 {debian => debian11}/scripts/setup_zwave.sh | 0 .../userscript_everystart_example.sh | 0 .../userscript_firststart_example.sh | 0 debian12/test_stack.yml | 15 --- 19 files changed, 22 insertions(+), 520 deletions(-) delete mode 100644 .github/workflows/build-debian-image-dev.yml rename .github/workflows/{build-debian-image-dev-node20.yml => build-debian12-dev-node20.yml} (70%) delete mode 100644 debian/Dockerfile delete mode 100644 debian/node12/Dockerfile delete mode 100644 debian/node14/Dockerfile delete mode 100644 debian/node20/Dockerfile rename {debian => debian11}/node16/Dockerfile (100%) rename {debian => debian11}/node18/Dockerfile (100%) rename {debian => debian11}/scripts/healthcheck.sh (100%) rename {debian => debian11}/scripts/iobroker_startup.sh (100%) rename {debian => debian11}/scripts/maintenance.sh (100%) rename {debian => debian11}/scripts/setup_avahi.sh (100%) rename {debian => debian11}/scripts/setup_iob_db.sh (100%) rename {debian => debian11}/scripts/setup_packages.sh (100%) rename {debian => debian11}/scripts/setup_zwave.sh (100%) rename {debian => debian11}/userscripts/userscript_everystart_example.sh (100%) rename {debian => debian11}/userscripts/userscript_firststart_example.sh (100%) delete mode 100644 debian12/test_stack.yml diff --git a/.github/workflows/build-debian-image-dev.yml b/.github/workflows/build-debian-image-dev.yml deleted file mode 100644 index 209d63a..0000000 --- a/.github/workflows/build-debian-image-dev.yml +++ /dev/null @@ -1,89 +0,0 @@ -# Github action to build Docker image from dev branch (tag: dev) -name: Build debian dev - -on: - workflow_dispatch: - -jobs: - build-dev-image: - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v3.5.3 - with: - repository: 'buanet/ioBroker.docker' - - - name: Fetch version tag and date - id: version - run: | - VERSION="$(cat .VERSION)" - MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" - DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" - echo "This is the Version: $VERSION" - echo "version=$VERSION" >> $GITHUB_ENV - echo "This is the Major Version: $MAJORVERSION" - echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV - echo "This is the Buildnumber/Timestamp: $DATI" - echo "dati=$DATI" >> $GITHUB_ENV - # startup script - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp - mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh - # amd64 - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" ./debian/node18/Dockerfile > ./debian/node18/Dockerfile.tmp - mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2.9.1 - - - name: Login to DockerHub - uses: docker/login-action@v2.2.0 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASS }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 - with: - registry: ghcr.io - username: ${{ secrets.PACKAGES_USER }} - password: ${{ secrets.PACKAGES_PASS }} - - - name: Build and push Docker image - uses: docker/build-push-action@v4.1.1 - with: - context: ./debian - file: ./debian/node18/Dockerfile - push: true - platforms: | - linux/amd64 - linux/arm/v7 - linux/arm64/v8 - tags: | - buanet/iobroker:dev, - ghcr.io/buanet/iobroker:dev - provenance: false - outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) - - - name: Delete untagged images from GitHub Container Registry - uses: actions/github-script@v6.4.1 - with: - github-token: ${{ secrets.PACKAGES_PASS }} - script: | - const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", - { per_page: ${{ env.PER_PAGE }} - }); - for(version of response.data) { - if (version.metadata.container.tags.length == 0) { - console.log("delete " + version.id) - const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); - console.log("status " + deleteResponse.status) - } - } - env: - OWNER: buanet - PACKAGE_NAME: iobroker - PER_PAGE: 100 diff --git a/.github/workflows/build-debian-image-dev-node20.yml b/.github/workflows/build-debian12-dev-node20.yml similarity index 70% rename from .github/workflows/build-debian-image-dev-node20.yml rename to .github/workflows/build-debian12-dev-node20.yml index 6baccb2..c07a814 100644 --- a/.github/workflows/build-debian-image-dev-node20.yml +++ b/.github/workflows/build-debian12-dev-node20.yml @@ -1,5 +1,5 @@ -# Github action to build Docker image from dev branch (tag: dev) -name: Build debian dev-node20 +# Github action to build Debian12 image (Tag: dev-node20) +name: Build Debian 12 Image (dev-node20) on: workflow_dispatch: @@ -9,35 +9,38 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v3.6.0 with: repository: 'buanet/ioBroker.docker' - - name: Fetch version tag and date - id: version + - name: Set job variables run: | + NODE="20" VERSION="$(cat .VERSION)" MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" - echo "This is the Version: $VERSION" + # Log output and export as Github environment variable + echo "[LOG] Nodejs Version: $NODE" + echo "node=$NODE" >> $GITHUB_ENV + echo "[LOG] Image Version: $VERSION" echo "version=$VERSION" >> $GITHUB_ENV - echo "This is the Major Version: $MAJORVERSION" + echo "[LOG] Major Image Version: $MAJORVERSION" echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV - echo "This is the Buildnumber/Timestamp: $DATI" + echo "[LOG] Buildnumber/Timestamp: $DATI" echo "dati=$DATI" >> $GITHUB_ENV - # startup script - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp - mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh - # amd64 - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" ./debian/node20/Dockerfile > ./debian/node20/Dockerfile.tmp - mv -f ./debian/node20/Dockerfile.tmp ./debian/node20/Dockerfile + # Set values in iobroker_startup.sh + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp + mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh + # Set values in Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/$NODE/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp + mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile - name: Set up QEMU uses: docker/setup-qemu-action@v2.2.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2.9.1 + uses: docker/setup-buildx-action@v2.10.0 - name: Login to DockerHub uses: docker/login-action@v2.2.0 @@ -52,11 +55,11 @@ jobs: username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - - name: Build Docker image (node20) + - name: Build and push Docker image uses: docker/build-push-action@v4.1.1 with: - context: ./debian - file: ./debian/node20/Dockerfile + context: ./debian12 + file: ./debian12/Dockerfile push: true platforms: | linux/amd64 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dada72..9c82a00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## Changelog ### v9.0.0-beta.1 (coming soon) +* cleanup/ restructure repo * update nodejs setup process * update base image to debian 12 (bookworm) * improve security by avoiding running commands as root diff --git a/debian/Dockerfile b/debian/Dockerfile deleted file mode 100644 index fe96e42..0000000 --- a/debian/Dockerfile +++ /dev/null @@ -1,102 +0,0 @@ -FROM ${BASE_IMAGE} - -LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ - org.opencontainers.image.description="Official Docker image for ioBroker smarthome software (https://www.iobroker.net)" \ - org.opencontainers.image.documentation="https://github.com/buanet/ioBroker.docker#readme" \ - org.opencontainers.image.authors="André Germann " \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.base.name="${BASE_IMAGE}" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - -ENV DEBIAN_FRONTEND noninteractive - -# Install prerequisites (including node) and generating locales -RUN apt-get update && apt-get install -y \ - apt-utils \ - cifs-utils \ - curl \ - gosu \ - iputils-ping \ - jq \ - locales \ - nfs-common \ - procps \ - python3 \ - python3-dev \ - sudo \ - tar \ - tzdata \ - udev \ - wget \ - # Install node - && curl -sL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash \ - && apt-get update && apt-get install -y nodejs \ - # Install node-gyp - && npm install -g node-gyp \ - # Generating locales - && sed -i 's/^# *\(de_DE.UTF-8\)/\1/' /etc/locale.gen \ - && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ - && locale-gen \ - # Change permissions for scripts - #&& chmod 777 /opt/scripts/ \ - #&& chmod 777 /opt/userscripts/ \ - #&& chmod +x /opt/scripts/*.sh \ - #&& chmod +x /opt/userscripts/*.sh \ - # Prepare - && mkdir -p /opt/.docker_config/ \ - && echo "starting" > /opt/.docker_config/.healthcheck \ - && echo "${VERSION}" > /opt/.docker_config/.thisisdocker \ - && echo "true" > /opt/.docker_config/.first_run \ - # Run installer - && curl -sL https://iobroker.net/install.sh | bash - \ - # Deleting UUID from build - && iobroker unsetup -y \ - && echo "true" > /opt/iobroker/.fresh_install \ - # Backup initial ioBroker and userscript folder - && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ - # Setting up iobroker-user (shell, home dir and rights) - && chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker \ - && chown root:iobroker /usr/sbin/gosu \ - && chmod +s /usr/sbin/gosu \ - # Clean up installation cache - && apt-get autoclean -y \ - && apt-get autoremove \ - && apt-get clean \ - && rm -rf /tmp/* /var/tmp/* \ - && rm -rf /root/.cache/* /root/.npm/* \ - && rm -rf /var/lib/apt/lists/* - -# Copy scripts -COPY --chown iobroker:iobroker --chmod 544 scripts /opt/scripts -COPY --chown iobroker:iobroker --chmod 544 userscripts /opt/userscripts - -# Setting up default ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - SETGID=1000 \ - SETUID=1000 \ - TZ="Europe/Berlin" - -# Expose default admin ui port -EXPOSE 8081 - -# Change work dir -WORKDIR /opt/iobroker/ - -# Healthcheck -HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ - CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] - -# Volumes for persistent data -VOLUME ["/opt/iobroker"] - -# Run startup-script -ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/debian/node12/Dockerfile b/debian/node12/Dockerfile deleted file mode 100644 index fe2edfd..0000000 --- a/debian/node12/Dockerfile +++ /dev/null @@ -1,97 +0,0 @@ -FROM debian:bullseye-slim - -LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ - org.opencontainers.image.description="Officical Docker image for ioBroker smarthome software (https://www.iobroker.net)" \ - org.opencontainers.image.documentation="https://github.com/buanet/ioBroker.docker#readme" \ - org.opencontainers.image.authors="André Germann " \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.base.name="docker.io/library/debian:bullseye-slim" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - -ENV DEBIAN_FRONTEND noninteractive - -# Install prerequisites (including node) and generating locales -RUN apt-get update && apt-get install -y \ - apt-utils \ - cifs-utils \ - curl \ - gosu \ - iputils-ping \ - jq \ - locales \ - nfs-common \ - procps \ - python3 \ - python3-dev \ - sudo \ - tar \ - tzdata \ - udev \ - wget \ - # Install node - && curl -sL https://deb.nodesource.com/setup_12.x | bash \ - && apt-get update && apt-get install -y nodejs \ - # Install node-gyp - && npm install -g node-gyp \ - # Generating locales - && sed -i 's/^# *\(de_DE.UTF-8\)/\1/' /etc/locale.gen \ - && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ - && locale-gen - -# Create directorys and copy scripts -COPY scripts /opt/scripts -COPY userscripts /opt/userscripts -RUN chmod 777 /opt/scripts/ \ - && chmod 777 /opt/userscripts/ \ - && chmod +x /opt/scripts/*.sh \ - && chmod +x /opt/userscripts/*.sh - -# Install ioBroker -RUN curl -sL https://iobroker.net/install.sh | bash - \ - && mkdir -p /opt/scripts/.docker_config/ \ - && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ - && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ - && echo $(hostname) > /opt/.firstrun \ - # Deleting UUID from build - && iobroker unsetup -y \ - # Backup initial ioBroker and userscript folder - && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ - # Setting up iobroker-user (shell, home dir and rights) - && chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker \ - && chown root:iobroker /usr/sbin/gosu \ - && chmod +s /usr/sbin/gosu \ - # Clean up installation cache - && apt-get autoclean -y \ - && apt-get autoremove \ - && apt-get clean \ - && rm -rf /tmp/* /var/tmp/* \ - && rm -rf /root/.cache/* /root/.npm/* \ - && rm -rf /var/lib/apt/lists/* - -# Setting up default ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - SETGID=1000 \ - SETUID=1000 \ - TZ="Europe/Berlin" - -# Expose default admin ui port -EXPOSE 8081 - -# Change work dir -WORKDIR /opt/iobroker/ - -# Healthcheck -HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ - CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] - -# Run startup-script -ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/debian/node14/Dockerfile b/debian/node14/Dockerfile deleted file mode 100644 index 694bfb0..0000000 --- a/debian/node14/Dockerfile +++ /dev/null @@ -1,97 +0,0 @@ -FROM debian:bullseye-slim - -LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ - org.opencontainers.image.description="Officical Docker image for ioBroker smarthome software (https://www.iobroker.net)" \ - org.opencontainers.image.documentation="https://github.com/buanet/ioBroker.docker#readme" \ - org.opencontainers.image.authors="André Germann " \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.base.name="docker.io/library/debian:bullseye-slim" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - -ENV DEBIAN_FRONTEND noninteractive - -# Install prerequisites (including node) and generating locales -RUN apt-get update && apt-get install -y \ - apt-utils \ - cifs-utils \ - curl \ - gosu \ - iputils-ping \ - jq \ - locales \ - nfs-common \ - procps \ - python3 \ - python3-dev \ - sudo \ - tar \ - tzdata \ - udev \ - wget \ - # Install node - && curl -sL https://deb.nodesource.com/setup_14.x | bash \ - && apt-get update && apt-get install -y nodejs \ - # Install node-gyp - && npm install -g node-gyp \ - # Generating locales - && sed -i 's/^# *\(de_DE.UTF-8\)/\1/' /etc/locale.gen \ - && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ - && locale-gen - -# Create directorys and copy scripts -COPY scripts /opt/scripts -COPY userscripts /opt/userscripts -RUN chmod 777 /opt/scripts/ \ - && chmod 777 /opt/userscripts/ \ - && chmod +x /opt/scripts/*.sh \ - && chmod +x /opt/userscripts/*.sh - -# Install ioBroker -RUN curl -sL https://iobroker.net/install.sh | bash - \ - && mkdir -p /opt/scripts/.docker_config/ \ - && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ - && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ - && echo $(hostname) > /opt/.firstrun \ - # Deleting UUID from build - && iobroker unsetup -y \ - # Backup initial ioBroker and userscript folder - && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ - # Setting up iobroker-user (shell, home dir and rights) - && chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker \ - && chown root:iobroker /usr/sbin/gosu \ - && chmod +s /usr/sbin/gosu \ - # Clean up installation cache - && apt-get autoclean -y \ - && apt-get autoremove \ - && apt-get clean \ - && rm -rf /tmp/* /var/tmp/* \ - && rm -rf /root/.cache/* /root/.npm/* \ - && rm -rf /var/lib/apt/lists/* - -# Setting up default ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - SETGID=1000 \ - SETUID=1000 \ - TZ="Europe/Berlin" - -# Expose default admin ui port -EXPOSE 8081 - -# Change work dir -WORKDIR /opt/iobroker/ - -# Healthcheck -HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ - CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] - -# Run startup-script -ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/debian/node20/Dockerfile b/debian/node20/Dockerfile deleted file mode 100644 index 08c0f1a..0000000 --- a/debian/node20/Dockerfile +++ /dev/null @@ -1,102 +0,0 @@ -FROM debian:bullseye-slim - -LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ - org.opencontainers.image.description="Official Docker image for ioBroker smarthome software (https://www.iobroker.net)" \ - org.opencontainers.image.documentation="https://github.com/buanet/ioBroker.docker#readme" \ - org.opencontainers.image.authors="André Germann " \ - org.opencontainers.image.url="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.source="https://github.com/buanet/ioBroker.docker" \ - org.opencontainers.image.base.name="docker.io/library/debian:bullseye-slim" \ - org.opencontainers.image.version="${VERSION}" \ - org.opencontainers.image.created="${DATI}" - -ENV DEBIAN_FRONTEND noninteractive - -# Copy scripts -COPY scripts /opt/scripts -COPY userscripts /opt/userscripts - -# Install prerequisites (including node) and generating locales -RUN apt-get update && apt-get install -y \ - apt-utils \ - cifs-utils \ - curl \ - gosu \ - iputils-ping \ - jq \ - locales \ - nfs-common \ - procps \ - python3 \ - python3-dev \ - sudo \ - tar \ - tzdata \ - udev \ - wget \ - # Install node - && curl -sL https://deb.nodesource.com/setup_20.x | bash \ - && apt-get update && apt-get install -y nodejs \ - # Install node-gyp - && npm install -g node-gyp \ - # Generating locales - && sed -i 's/^# *\(de_DE.UTF-8\)/\1/' /etc/locale.gen \ - && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ - && locale-gen \ - # Change permissions for scripts - && chmod 777 /opt/scripts/ \ - && chmod 777 /opt/userscripts/ \ - && chmod +x /opt/scripts/*.sh \ - && chmod +x /opt/userscripts/*.sh \ - # Prepare - && mkdir -p /opt/scripts/.docker_config/ \ - && echo "starting" > /opt/scripts/.docker_config/.healthcheck \ - && echo "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ - && echo "true" > /opt/.first_run \ - # Run installer - && curl -sL https://iobroker.net/install.sh | bash - \ - # Deleting UUID from build - && iobroker unsetup -y \ - && echo "true" > /opt/iobroker/.fresh_install \ - # Backup initial ioBroker and userscript folder - && tar -cf /opt/initial_iobroker.tar /opt/iobroker \ - && tar -cf /opt/initial_userscripts.tar /opt/userscripts \ - # Setting up iobroker-user (shell, home dir and rights) - && chsh -s /bin/bash iobroker \ - && usermod --home /opt/iobroker iobroker \ - && usermod -u 1000 iobroker \ - && groupmod -g 1000 iobroker \ - && chown root:iobroker /usr/sbin/gosu \ - && chmod +s /usr/sbin/gosu \ - # Clean up installation cache - && apt-get autoclean -y \ - && apt-get autoremove \ - && apt-get clean \ - && rm -rf /tmp/* /var/tmp/* \ - && rm -rf /root/.cache/* /root/.npm/* \ - && rm -rf /var/lib/apt/lists/* - -# Setting up default ENVs -ENV DEBIAN_FRONTEND="teletype" \ - LANG="de_DE.UTF-8" \ - LANGUAGE="de_DE:de" \ - LC_ALL="de_DE.UTF-8" \ - SETGID=1000 \ - SETUID=1000 \ - TZ="Europe/Berlin" - -# Expose default admin ui port -EXPOSE 8081 - -# Change work dir -WORKDIR /opt/iobroker/ - -# Healthcheck -HEALTHCHECK --interval=15s --timeout=5s --retries=5 \ - CMD ["/bin/bash", "-c", "/opt/scripts/healthcheck.sh"] - -# Volumes for persistent data -VOLUME ["/opt/iobroker"] - -# Run startup-script -ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/iobroker_startup.sh"] diff --git a/debian/node16/Dockerfile b/debian11/node16/Dockerfile similarity index 100% rename from debian/node16/Dockerfile rename to debian11/node16/Dockerfile diff --git a/debian/node18/Dockerfile b/debian11/node18/Dockerfile similarity index 100% rename from debian/node18/Dockerfile rename to debian11/node18/Dockerfile diff --git a/debian/scripts/healthcheck.sh b/debian11/scripts/healthcheck.sh similarity index 100% rename from debian/scripts/healthcheck.sh rename to debian11/scripts/healthcheck.sh diff --git a/debian/scripts/iobroker_startup.sh b/debian11/scripts/iobroker_startup.sh similarity index 100% rename from debian/scripts/iobroker_startup.sh rename to debian11/scripts/iobroker_startup.sh diff --git a/debian/scripts/maintenance.sh b/debian11/scripts/maintenance.sh similarity index 100% rename from debian/scripts/maintenance.sh rename to debian11/scripts/maintenance.sh diff --git a/debian/scripts/setup_avahi.sh b/debian11/scripts/setup_avahi.sh similarity index 100% rename from debian/scripts/setup_avahi.sh rename to debian11/scripts/setup_avahi.sh diff --git a/debian/scripts/setup_iob_db.sh b/debian11/scripts/setup_iob_db.sh similarity index 100% rename from debian/scripts/setup_iob_db.sh rename to debian11/scripts/setup_iob_db.sh diff --git a/debian/scripts/setup_packages.sh b/debian11/scripts/setup_packages.sh similarity index 100% rename from debian/scripts/setup_packages.sh rename to debian11/scripts/setup_packages.sh diff --git a/debian/scripts/setup_zwave.sh b/debian11/scripts/setup_zwave.sh similarity index 100% rename from debian/scripts/setup_zwave.sh rename to debian11/scripts/setup_zwave.sh diff --git a/debian/userscripts/userscript_everystart_example.sh b/debian11/userscripts/userscript_everystart_example.sh similarity index 100% rename from debian/userscripts/userscript_everystart_example.sh rename to debian11/userscripts/userscript_everystart_example.sh diff --git a/debian/userscripts/userscript_firststart_example.sh b/debian11/userscripts/userscript_firststart_example.sh similarity index 100% rename from debian/userscripts/userscript_firststart_example.sh rename to debian11/userscripts/userscript_firststart_example.sh diff --git a/debian12/test_stack.yml b/debian12/test_stack.yml deleted file mode 100644 index 6b6def0..0000000 --- a/debian12/test_stack.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: "3" -services: - ##### IOBROKER ##### - iobrokertest: - container_name: iobrokertest - image: buanet/iobroker:testing - hostname: iobrokertest - restart: always - ports: - - 8081:8081 - environment: - - PACKAGES=nano - - DEBUG=true - volumes: - - /home/andre/tmp/docker/iobrokertest_data:/opt/iobroker \ No newline at end of file From 4c32a3fc67c44d2b7c11defa99aa89f79d495019 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 10:03:18 +0200 Subject: [PATCH 09/39] ignore errors in silent cleanup --- CHANGELOG.md | 6 ++++-- debian12/scripts/setup_packages.sh | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c82a00..56b9c38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,13 @@ ## Changelog ### v9.0.0-beta.1 (coming soon) +* ignore errors in "silent cleanup" on first start ([#369](https://github.com/buanet/ioBroker.docker/issues/369)) * cleanup/ restructure repo * update nodejs setup process * update base image to debian 12 (bookworm) -* improve security by avoiding running commands as root -* integrate calling maintenance script into iobroker command +* improve security by avoiding root (exept startup script itself) +* restrict iobroker commanline commands (start/ stop) +* integrate maintenance script into iobroker command * move container config files location ### v8.1.0-beta.4 (29.07.2023) diff --git a/debian12/scripts/setup_packages.sh b/debian12/scripts/setup_packages.sh index 75f0d28..cdaa589 100644 --- a/debian12/scripts/setup_packages.sh +++ b/debian12/scripts/setup_packages.sh @@ -78,6 +78,6 @@ fi # Silent Cleanup apt-get -qq autoclean -y && apt-get -qq autoremove && apt-get -qq clean -rm -rf /tmp/* /var/tmp/* /root/.cache/* /var/lib/apt/lists/* +rm -rf /tmp/* /var/tmp/* /root/.cache/* /var/lib/apt/lists/* || true exit 0 \ No newline at end of file From 60b2ab1b56f9e4e20bdc9b4b4837cdc0f5f835fa Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 11:37:03 +0200 Subject: [PATCH 10/39] testing actions variables --- .github/workflows/build-debian12-dev.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 3eb0015..a6e8b5b 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -3,6 +3,11 @@ name: Build Debian 12 Image (dev) on: workflow_dispatch: + inputs: + node_version: + description: 'Node Version' + required: true + default: '${{ env.RECOMMENDED_NODE_VERSION }}' jobs: build-dev-image: From e228229ec31d91b76481a03936df83516cd321b7 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 11:38:02 +0200 Subject: [PATCH 11/39] testing --- .github/workflows/build-debian12-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index a6e8b5b..4dfcc41 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -7,7 +7,7 @@ on: node_version: description: 'Node Version' required: true - default: '${{ env.RECOMMENDED_NODE_VERSION }}' + default: ${{ env.RECOMMENDED_NODE_VERSION }} jobs: build-dev-image: From 2da5640f9fa0f61ee1ec28e25834bfa66a85a9d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Germann?= Date: Mon, 4 Sep 2023 11:45:06 +0200 Subject: [PATCH 12/39] Update build-debian12-dev.yml --- .github/workflows/build-debian12-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 4dfcc41..335ab8f 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -7,7 +7,7 @@ on: node_version: description: 'Node Version' required: true - default: ${{ env.RECOMMENDED_NODE_VERSION }} + default: ${{ vars.RECOMMENDED_NODE_VERSION }} jobs: build-dev-image: From 58f4ac9d4784e0a2fbfe6b16bcd0af0fc85bc024 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 11:51:03 +0200 Subject: [PATCH 13/39] testing --- .github/workflows/build-debian12-dev.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 335ab8f..5628f84 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -7,7 +7,10 @@ on: node_version: description: 'Node Version' required: true - default: ${{ vars.RECOMMENDED_NODE_VERSION }} + default: '' + +env: + TAG: ${{ inputs.node_version || env.RECOMMENDED_NODE_VERSION }} jobs: build-dev-image: From 0dd20773ec04ea602d3c4c8bf6041b2cac466304 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 12:02:12 +0200 Subject: [PATCH 14/39] testing --- .github/workflows/build-debian12-dev.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 5628f84..b01797d 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -4,10 +4,16 @@ name: Build Debian 12 Image (dev) on: workflow_dispatch: inputs: - node_version: + recoomended: + type: boolean + description: 'Use recommended Node version?' + recommended_choice: + type: choice description: 'Node Version' required: true - default: '' + options: + - true + - false env: TAG: ${{ inputs.node_version || env.RECOMMENDED_NODE_VERSION }} From 65ee39875319d9ff50442692b6d9cb57cae711b5 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 13:00:42 +0200 Subject: [PATCH 15/39] testing --- .github/workflows/build-debian12-dev.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index b01797d..d4ecb2c 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -7,13 +7,13 @@ on: recoomended: type: boolean description: 'Use recommended Node version?' + default: true recommended_choice: type: choice - description: 'Node Version' - required: true + description: 'Use recommended Node version?' options: - - true - - false + - yes + - no env: TAG: ${{ inputs.node_version || env.RECOMMENDED_NODE_VERSION }} From 55c3fc5951b3659a00b4c566aaca5fb9304ff038 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 13:04:41 +0200 Subject: [PATCH 16/39] testing checkbox --- .github/workflows/build-debian12-dev.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index d4ecb2c..287c4ca 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -6,17 +6,8 @@ on: inputs: recoomended: type: boolean - description: 'Use recommended Node version?' + description: 'Use recommended Node version for ioBroker?' default: true - recommended_choice: - type: choice - description: 'Use recommended Node version?' - options: - - yes - - no - -env: - TAG: ${{ inputs.node_version || env.RECOMMENDED_NODE_VERSION }} jobs: build-dev-image: From 40d22d0540da75be71241a59081aec3d494e6327 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 13:15:28 +0200 Subject: [PATCH 17/39] testing choice --- .github/workflows/build-debian12-dev.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 287c4ca..0962a67 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -4,10 +4,12 @@ name: Build Debian 12 Image (dev) on: workflow_dispatch: inputs: - recoomended: - type: boolean - description: 'Use recommended Node version for ioBroker?' - default: true + chose_node_version: + type: choice + description: 'Which Node version should be used?' + options: + - 'Recommended Node version (default)' + - 'Experimental Node version' jobs: build-dev-image: From 9ee0738a23c1786f538d6ff352e14c2abedb1958 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 20:53:03 +0200 Subject: [PATCH 18/39] testing --- .github/workflows/build-debian12-dev.yml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 0962a67..8a502c4 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -9,10 +9,13 @@ on: description: 'Which Node version should be used?' options: - 'Recommended Node version (default)' - - 'Experimental Node version' + - 'Experimental Node version' + - 'Both Node versions' jobs: - build-dev-image: + build-with-recommended-node: + if: inputs.chose_node_version == 'Recommended Node version (default)' || inputs.chose_node_version == 'Both Node versions' + name: Build image with recommended Node version runs-on: ubuntu-latest steps: - name: Checkout repo @@ -22,13 +25,11 @@ jobs: - name: Set job variables run: | - NODE="18" VERSION="$(cat .VERSION)" MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" # Log output and export as Github environment variable - echo "[LOG] Nodejs Version: $NODE" - echo "node=$NODE" >> $GITHUB_ENV + echo "[LOG] Nodejs Version: ${{ vars.RECOMMENDED_NODE_VERSION }}" echo "[LOG] Image Version: $VERSION" echo "version=$VERSION" >> $GITHUB_ENV echo "[LOG] Major Image Version: $MAJORVERSION" @@ -39,7 +40,7 @@ jobs: sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh # Set values in Dockerfile - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/$NODE/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/${{ vars.RECOMMENDED_NODE_VERSION }}/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile - name: Set up QEMU @@ -75,10 +76,18 @@ jobs: tags: | buanet/iobroker:dev, ghcr.io/buanet/iobroker:dev + buanet/iobroker:dev-node${{ vars.RECOMMENDED_NODE_VERSION }}, + ghcr.io/buanet/iobroker:dev-node${{ vars.RECOMMENDED_NODE_VERSION }} provenance: false outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) - - name: Delete untagged images from GitHub Container Registry + delete-untagged-images: + if: ${{ always() }} + needs: build-with-recommended-node + name: Delete untagged images from GitHub Container Registry + runs-on: ubuntu-latest + steps: + - name: Delete images uses: actions/github-script@v6.4.1 with: github-token: ${{ secrets.PACKAGES_PASS }} From 7027d3b3b9ed411a08c1058aad7939268e72d6cf Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 21:01:12 +0200 Subject: [PATCH 19/39] test combined jobs --- .github/workflows/build-debian12-dev.yml | 68 +++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 8a502c4..82acd44 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -81,9 +81,75 @@ jobs: provenance: false outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) + build-with-experimental-node: + if: inputs.chose_node_version == 'Experimental Node version' || inputs.chose_node_version == 'Both Node versions' + name: Build image with experimental Node version + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3.6.0 + with: + repository: 'buanet/ioBroker.docker' + + - name: Set job variables + run: | + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + # Log output and export as Github environment variable + echo "[LOG] Nodejs Version: ${{ vars.EXPERIMENTAL_NODE_VERSION }}" + echo "[LOG] Image Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "[LOG] Major Image Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "[LOG] Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # Set values in iobroker_startup.sh + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp + mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh + # Set values in Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/${{ vars.EXPERIMENTAL_NODE_VERSION }}/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp + mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2.2.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2.10.0 + + - name: Login to DockerHub + uses: docker/login-action@v2.2.0 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2.2.0 + with: + registry: ghcr.io + username: ${{ secrets.PACKAGES_USER }} + password: ${{ secrets.PACKAGES_PASS }} + + - name: Build and push Docker image + uses: docker/build-push-action@v4.1.1 + with: + context: ./debian12 + file: ./debian12/Dockerfile + push: true + platforms: | + linux/amd64 + linux/arm/v7 + linux/arm64/v8 + tags: | + buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, + ghcr.io/buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }} + provenance: false + outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) + delete-untagged-images: if: ${{ always() }} - needs: build-with-recommended-node + needs: [build-with-recommended-node, build-with-experimental-node] name: Delete untagged images from GitHub Container Registry runs-on: ubuntu-latest steps: From 57d1dd3bb09fdc5848ca35eadb74811a67fd3656 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 4 Sep 2023 21:56:28 +0200 Subject: [PATCH 20/39] simplify ci/ reduce gh actions --- .../build-debian-image-beta-node20.yml | 97 --------- .github/workflows/build-debian-image-beta.yml | 97 --------- .github/workflows/build-debian12-beta.yml | 186 ++++++++++++++++++ .../workflows/build-debian12-dev-node20.yml | 92 --------- .github/workflows/build-debian12-dev.yml | 8 +- CHANGELOG.md | 1 + 6 files changed, 191 insertions(+), 290 deletions(-) delete mode 100644 .github/workflows/build-debian-image-beta-node20.yml delete mode 100644 .github/workflows/build-debian-image-beta.yml create mode 100644 .github/workflows/build-debian12-beta.yml delete mode 100644 .github/workflows/build-debian12-dev-node20.yml diff --git a/.github/workflows/build-debian-image-beta-node20.yml b/.github/workflows/build-debian-image-beta-node20.yml deleted file mode 100644 index ede0388..0000000 --- a/.github/workflows/build-debian-image-beta-node20.yml +++ /dev/null @@ -1,97 +0,0 @@ -# Github action to build Docker image from beta branch (tag: beta) -name: Build debian beta-node20 - -on: - release: - types: [prereleased] - workflow_dispatch: - -jobs: - build-beta-node20-image: - runs-on: ubuntu-latest - steps: - - name: Fetching latest prerelease tag - run: echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - - name: Checkout repo - uses: actions/checkout@v3.5.3 - with: - repository: 'buanet/ioBroker.docker' - ref: ${{ env.RELEASE_TAG }} - - - name: Fetching version tag and date - id: version - run: | - VERSION="$(cat .VERSION)" - MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" - DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" - echo "This is the Version: $VERSION" - echo "version=$VERSION" >> $GITHUB_ENV - echo "This is the Major Version: $MAJORVERSION" - echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV - echo "This is the Buildnumber/Timestamp: $DATI" - echo "dati=$DATI" >> $GITHUB_ENV - # startup script - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp - mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh - # amd64 - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node20/Dockerfile > ./debian/node20/Dockerfile.tmp - mv -f ./debian/node20/Dockerfile.tmp ./debian/node20/Dockerfile - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2.9.1 - - - name: Login to DockerHub - uses: docker/login-action@v2.2.0 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASS }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 - with: - registry: ghcr.io - username: ${{ secrets.PACKAGES_USER }} - password: ${{ secrets.PACKAGES_PASS }} - - - name: Build Docker image (node20) - uses: docker/build-push-action@v4.1.1 - with: - context: ./debian - file: ./debian/node20/Dockerfile - push: true - platforms: | - linux/amd64 - linux/arm/v7 - linux/arm64/v8 - tags: | - buanet/iobroker:beta-node20, - buanet/iobroker:${{ env.version }}-node20, - ghcr.io/buanet/iobroker:beta-node20, - ghcr.io/buanet/iobroker:${{ env.version }}-node20 - provenance: false - outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) - - - name: Delete untagged images from GitHub packages - uses: actions/github-script@v6 - with: - github-token: ${{ secrets.PACKAGES_PASS }} - script: | - const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", - { per_page: ${{ env.PER_PAGE }} - }); - for(version of response.data) { - if (version.metadata.container.tags.length == 0) { - console.log("delete " + version.id) - const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); - console.log("status " + deleteResponse.status) - } - } - env: - OWNER: buanet - PACKAGE_NAME: iobroker - PER_PAGE: 100 diff --git a/.github/workflows/build-debian-image-beta.yml b/.github/workflows/build-debian-image-beta.yml deleted file mode 100644 index 5db6121..0000000 --- a/.github/workflows/build-debian-image-beta.yml +++ /dev/null @@ -1,97 +0,0 @@ -# Github action to build Docker image from beta branch (tag: beta) -name: Build debian beta - -on: - release: - types: [prereleased] - workflow_dispatch: - -jobs: - build-beta-image: - runs-on: ubuntu-latest - steps: - - name: Fetching latest prerelease tag - run: echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - - - name: Checkout repo - uses: actions/checkout@v3.5.3 - with: - repository: 'buanet/ioBroker.docker' - ref: ${{ env.RELEASE_TAG }} - - - name: Fetching version tag and date - id: version - run: | - VERSION="$(cat .VERSION)" - MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" - DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" - echo "This is the Version: $VERSION" - echo "version=$VERSION" >> $GITHUB_ENV - echo "This is the Major Version: $MAJORVERSION" - echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV - echo "This is the Buildnumber/Timestamp: $DATI" - echo "dati=$DATI" >> $GITHUB_ENV - # startup script - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp - mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh - # amd64 - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node18/Dockerfile > ./debian/node18/Dockerfile.tmp - mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2.9.1 - - - name: Login to DockerHub - uses: docker/login-action@v2.2.0 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASS }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 - with: - registry: ghcr.io - username: ${{ secrets.PACKAGES_USER }} - password: ${{ secrets.PACKAGES_PASS }} - - - name: Build Docker image - uses: docker/build-push-action@v4.1.1 - with: - context: ./debian - file: ./debian/node18/Dockerfile - push: true - platforms: | - linux/amd64 - linux/arm/v7 - linux/arm64/v8 - tags: | - buanet/iobroker:beta, - buanet/iobroker:${{ env.version }}, - ghcr.io/buanet/iobroker:beta, - ghcr.io/buanet/iobroker:${{ env.version }} - provenance: false - outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) - - - name: Delete untagged images from GitHub packages - uses: actions/github-script@v6 - with: - github-token: ${{ secrets.PACKAGES_PASS }} - script: | - const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", - { per_page: ${{ env.PER_PAGE }} - }); - for(version of response.data) { - if (version.metadata.container.tags.length == 0) { - console.log("delete " + version.id) - const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); - console.log("status " + deleteResponse.status) - } - } - env: - OWNER: buanet - PACKAGE_NAME: iobroker - PER_PAGE: 100 diff --git a/.github/workflows/build-debian12-beta.yml b/.github/workflows/build-debian12-beta.yml new file mode 100644 index 0000000..299c5ef --- /dev/null +++ b/.github/workflows/build-debian12-beta.yml @@ -0,0 +1,186 @@ +# Github action to build Debian12 image (Tag: beta) +name: Build Debian 12 Image (beta) + +on: + release: + types: [prereleased] + workflow_dispatch: + inputs: + chose_node_version: + type: choice + description: 'Which Node version should be used?' + options: + - 'Recommended Node version (default)' + - 'Experimental Node version' + - 'Both Node versions' + +jobs: + build-with-recommended-node: + if: inputs.chose_node_version == 'Recommended Node version (default)' || inputs.chose_node_version == 'Both Node versions' || github.event_name == 'release' + name: Build with recommended Node version + runs-on: ubuntu-latest + steps: + - name: Fetch latest prerelease tag + run: echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + + - name: Checkout repo + uses: actions/checkout@v3.6.0 + with: + repository: 'buanet/ioBroker.docker' + ref: ${{ env.RELEASE_TAG }} + + - name: Set job variables + run: | + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + # Log output and export as Github environment variable + echo "[LOG] Nodejs Version: ${{ vars.RECOMMENDED_NODE_VERSION }}" + echo "[LOG] Image Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "[LOG] Major Image Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "[LOG] Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # Set values in iobroker_startup.sh + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp + mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh + # Set values in Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/${{ vars.RECOMMENDED_NODE_VERSION }}/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp + mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2.2.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2.10.0 + + - name: Login to DockerHub + uses: docker/login-action@v2.2.0 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2.2.0 + with: + registry: ghcr.io + username: ${{ secrets.PACKAGES_USER }} + password: ${{ secrets.PACKAGES_PASS }} + + - name: Build and push Docker image + uses: docker/build-push-action@v4.1.1 + with: + context: ./debian12 + file: ./debian12/Dockerfile + push: true + platforms: | + linux/amd64 + linux/arm/v7 + linux/arm64/v8 + tags: | + buanet/iobroker:beta, + buanet/iobroker:${{ env.version }}, + ghcr.io/buanet/iobroker:beta, + ghcr.io/buanet/iobroker:${{ env.version }} + provenance: false + outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) + + build-with-experimental-node: + if: inputs.chose_node_version == 'Experimental Node version' || inputs.chose_node_version == 'Both Node versions' || github.event_name == 'release' + name: Build with experimental Node version + runs-on: ubuntu-latest + steps: + - name: Fetch latest prerelease tag + run: echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + + - name: Checkout repo + uses: actions/checkout@v3.6.0 + with: + repository: 'buanet/ioBroker.docker' + ref: ${{ env.RELEASE_TAG }} + + - name: Set job variables + run: | + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + # Log output and export as Github environment variable + echo "[LOG] Nodejs Version: ${{ vars.EXPERIMENTAL_NODE_VERSION }}" + echo "[LOG] Image Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "[LOG] Major Image Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "[LOG] Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # Set values in iobroker_startup.sh + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp + mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh + # Set values in Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/${{ vars.EXPERIMENTAL_NODE_VERSION }}/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp + mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2.2.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2.10.0 + + - name: Login to DockerHub + uses: docker/login-action@v2.2.0 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2.2.0 + with: + registry: ghcr.io + username: ${{ secrets.PACKAGES_USER }} + password: ${{ secrets.PACKAGES_PASS }} + + - name: Build and push Docker image + uses: docker/build-push-action@v4.1.1 + with: + context: ./debian12 + file: ./debian12/Dockerfile + push: true + platforms: | + linux/amd64 + linux/arm/v7 + linux/arm64/v8 + tags: | + buanet/iobroker:beta-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, + buanet/iobroker:${{ env.version }}-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, + ghcr.io/buanet/iobroker:beta-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, + ghcr.io/buanet/iobroker:${{ env.version }}-node${{ vars.EXPERIMENTAL_NODE_VERSION }} + provenance: false + outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) + + delete-untagged-images: + if: ${{ always() }} + needs: [build-with-recommended-node, build-with-experimental-node] + name: Delete untagged images from GitHub Container Registry + runs-on: ubuntu-latest + steps: + - name: Delete images + uses: actions/github-script@v6.4.1 + with: + github-token: ${{ secrets.PACKAGES_PASS }} + script: | + const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", + { per_page: ${{ env.PER_PAGE }} + }); + for(version of response.data) { + if (version.metadata.container.tags.length == 0) { + console.log("delete " + version.id) + const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); + console.log("status " + deleteResponse.status) + } + } + env: + OWNER: buanet + PACKAGE_NAME: iobroker + PER_PAGE: 100 diff --git a/.github/workflows/build-debian12-dev-node20.yml b/.github/workflows/build-debian12-dev-node20.yml deleted file mode 100644 index c07a814..0000000 --- a/.github/workflows/build-debian12-dev-node20.yml +++ /dev/null @@ -1,92 +0,0 @@ -# Github action to build Debian12 image (Tag: dev-node20) -name: Build Debian 12 Image (dev-node20) - -on: - workflow_dispatch: - -jobs: - build-dev-node20-image: - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v3.6.0 - with: - repository: 'buanet/ioBroker.docker' - - - name: Set job variables - run: | - NODE="20" - VERSION="$(cat .VERSION)" - MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" - DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" - # Log output and export as Github environment variable - echo "[LOG] Nodejs Version: $NODE" - echo "node=$NODE" >> $GITHUB_ENV - echo "[LOG] Image Version: $VERSION" - echo "version=$VERSION" >> $GITHUB_ENV - echo "[LOG] Major Image Version: $MAJORVERSION" - echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV - echo "[LOG] Buildnumber/Timestamp: $DATI" - echo "dati=$DATI" >> $GITHUB_ENV - # Set values in iobroker_startup.sh - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp - mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh - # Set values in Dockerfile - sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/$NODE/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp - mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2.10.0 - - - name: Login to DockerHub - uses: docker/login-action@v2.2.0 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASS }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 - with: - registry: ghcr.io - username: ${{ secrets.PACKAGES_USER }} - password: ${{ secrets.PACKAGES_PASS }} - - - name: Build and push Docker image - uses: docker/build-push-action@v4.1.1 - with: - context: ./debian12 - file: ./debian12/Dockerfile - push: true - platforms: | - linux/amd64 - linux/arm/v7 - linux/arm64/v8 - tags: | - buanet/iobroker:dev-node20, - ghcr.io/buanet/iobroker:dev-node20 - provenance: false - outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) - - - name: Delete untagged images from GitHub Container Registry - uses: actions/github-script@v6.4.1 - with: - github-token: ${{ secrets.PACKAGES_PASS }} - script: | - const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", - { per_page: ${{ env.PER_PAGE }} - }); - for(version of response.data) { - if (version.metadata.container.tags.length == 0) { - console.log("delete " + version.id) - const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); - console.log("status " + deleteResponse.status) - } - } - env: - OWNER: buanet - PACKAGE_NAME: iobroker - PER_PAGE: 100 diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 82acd44..d7b1980 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -14,8 +14,8 @@ on: jobs: build-with-recommended-node: - if: inputs.chose_node_version == 'Recommended Node version (default)' || inputs.chose_node_version == 'Both Node versions' - name: Build image with recommended Node version + if: inputs.chose_node_version == 'Recommended Node version (default)' || inputs.chose_node_version == 'Both Node versions' + name: Build with recommended Node version runs-on: ubuntu-latest steps: - name: Checkout repo @@ -82,8 +82,8 @@ jobs: outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) build-with-experimental-node: - if: inputs.chose_node_version == 'Experimental Node version' || inputs.chose_node_version == 'Both Node versions' - name: Build image with experimental Node version + if: inputs.chose_node_version == 'Experimental Node version' || inputs.chose_node_version == 'Both Node versions' + name: Build with experimental Node version runs-on: ubuntu-latest steps: - name: Checkout repo diff --git a/CHANGELOG.md b/CHANGELOG.md index 56b9c38..767b69b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## Changelog ### v9.0.0-beta.1 (coming soon) +* simplify ci/ reduce gh actions * ignore errors in "silent cleanup" on first start ([#369](https://github.com/buanet/ioBroker.docker/issues/369)) * cleanup/ restructure repo * update nodejs setup process From 96f8fe6a84c9efb3e707e84e0c3462744e88f060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Germann?= Date: Tue, 5 Sep 2023 11:19:42 +0200 Subject: [PATCH 21/39] Update build-debian12-dev.yml --- .github/workflows/build-debian12-dev.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index d7b1980..b14e9a8 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -139,8 +139,8 @@ jobs: push: true platforms: | linux/amd64 - linux/arm/v7 - linux/arm64/v8 + # linux/arm/v7 + # linux/arm64/v8 tags: | buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, ghcr.io/buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }} From a0ba10a02f3f94abd239798a7bfbb0b05db274e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Germann?= Date: Tue, 5 Sep 2023 11:21:48 +0200 Subject: [PATCH 22/39] Update build-debian12-dev.yml --- .github/workflows/build-debian12-dev.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index b14e9a8..51054f6 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -139,8 +139,6 @@ jobs: push: true platforms: | linux/amd64 - # linux/arm/v7 - # linux/arm64/v8 tags: | buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, ghcr.io/buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }} From 7779f985d2e3f6dbbdf5f8c8f0804de90c209a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Germann?= Date: Tue, 5 Sep 2023 12:31:21 +0200 Subject: [PATCH 23/39] testing --- .github/workflows/build-debian12-dev.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 51054f6..d2808f2 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -78,8 +78,6 @@ jobs: ghcr.io/buanet/iobroker:dev buanet/iobroker:dev-node${{ vars.RECOMMENDED_NODE_VERSION }}, ghcr.io/buanet/iobroker:dev-node${{ vars.RECOMMENDED_NODE_VERSION }} - provenance: false - outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) build-with-experimental-node: if: inputs.chose_node_version == 'Experimental Node version' || inputs.chose_node_version == 'Both Node versions' @@ -137,13 +135,13 @@ jobs: context: ./debian12 file: ./debian12/Dockerfile push: true - platforms: | - linux/amd64 +# platforms: | +# linux/amd64 +# linux/arm/v7 +# linux/arm64/v8 tags: | buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, ghcr.io/buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }} - provenance: false - outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) delete-untagged-images: if: ${{ always() }} From e6662f78c5c06f1f89eb1887b4f599104c4b9cb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Germann?= Date: Tue, 5 Sep 2023 13:02:09 +0200 Subject: [PATCH 24/39] Update build-debian12-dev.yml --- .github/workflows/build-debian12-dev.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index d2808f2..6685ad0 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -135,10 +135,9 @@ jobs: context: ./debian12 file: ./debian12/Dockerfile push: true -# platforms: | -# linux/amd64 -# linux/arm/v7 -# linux/arm64/v8 + platforms: | + linux/amd64 + linux/arm64 tags: | buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, ghcr.io/buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }} From 165b3595c1977c7814d9d64cb93114af9425ed97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Germann?= Date: Tue, 5 Sep 2023 13:36:05 +0200 Subject: [PATCH 25/39] Update build-debian12-dev.yml --- .github/workflows/build-debian12-dev.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 6685ad0..71c3eb2 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -71,8 +71,8 @@ jobs: push: true platforms: | linux/amd64 + linux/arm64 linux/arm/v7 - linux/arm64/v8 tags: | buanet/iobroker:dev, ghcr.io/buanet/iobroker:dev @@ -138,6 +138,7 @@ jobs: platforms: | linux/amd64 linux/arm64 + linux/arm/v7 tags: | buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, ghcr.io/buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }} From 50f2f9c5d1cbe2d54cee44452330b60ea8405f6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Germann?= Date: Tue, 5 Sep 2023 22:27:53 +0200 Subject: [PATCH 26/39] Update build-debian12-dev.yml --- .github/workflows/build-debian12-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 71c3eb2..241afde 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -134,7 +134,7 @@ jobs: with: context: ./debian12 file: ./debian12/Dockerfile - push: true + push: false platforms: | linux/amd64 linux/arm64 From b794e0b7d4502e560d845aabf08896beb6df90a3 Mon Sep 17 00:00:00 2001 From: buanet Date: Wed, 20 Sep 2023 21:26:58 +0200 Subject: [PATCH 27/39] block iob node fix command --- debian12/scripts/iobroker.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/debian12/scripts/iobroker.sh b/debian12/scripts/iobroker.sh index 96ee5f4..fdc55c2 100644 --- a/debian12/scripts/iobroker.sh +++ b/debian12/scripts/iobroker.sh @@ -41,6 +41,9 @@ iob_diag () { if [ "$1" = "fix" ]; then # call iobroker fixer iob_fix +elif [ "$1" = "node fix" ]; then # call iobroker node fixer + echo "The execution of this command is blocked as your ioBroker is running inside a Docker container!" + echo "To fix any issues with nodejs, please pull the latest version of the Docker image and recreate your container." elif [ "$1" = "diag" ]; then # call iobroker diag script iob_diag elif [ "$1" = "start" ] || [ "$1" = "stop" ] || [ "$1" = "restart" ]; then # block execution of iobroker start | stop | restart From 837064f86b07a8f4ef329cbf7b367479f298d239 Mon Sep 17 00:00:00 2001 From: buanet Date: Sat, 23 Sep 2023 23:57:57 +0200 Subject: [PATCH 28/39] node 20 arm/v7 build not working --- .github/workflows/build-debian12-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 241afde..1309290 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -138,7 +138,7 @@ jobs: platforms: | linux/amd64 linux/arm64 - linux/arm/v7 +# linux/arm/v7 tags: | buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, ghcr.io/buanet/iobroker:dev-node${{ vars.EXPERIMENTAL_NODE_VERSION }} From 4adafbdb0096e3cee7c01a6871657d4ea34485a8 Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 24 Sep 2023 00:24:37 +0200 Subject: [PATCH 29/39] removed special settings for zwave #377 --- .github/workflows/build-debian12-beta.yml | 2 +- debian12/scripts/iobroker_startup.sh | 13 ------------- debian12/scripts/setup_zwave.sh | 17 ----------------- 3 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 debian12/scripts/setup_zwave.sh diff --git a/.github/workflows/build-debian12-beta.yml b/.github/workflows/build-debian12-beta.yml index 299c5ef..0e4b5fd 100644 --- a/.github/workflows/build-debian12-beta.yml +++ b/.github/workflows/build-debian12-beta.yml @@ -149,8 +149,8 @@ jobs: push: true platforms: | linux/amd64 - linux/arm/v7 linux/arm64/v8 +# linux/arm/v7 tags: | buanet/iobroker:beta-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, buanet/iobroker:${{ env.version }}-node${{ vars.EXPERIMENTAL_NODE_VERSION }}, diff --git a/debian12/scripts/iobroker_startup.sh b/debian12/scripts/iobroker_startup.sh index e4f96e2..c8c9842 100644 --- a/debian12/scripts/iobroker_startup.sh +++ b/debian12/scripts/iobroker_startup.sh @@ -29,7 +29,6 @@ statesdbtype=$IOB_STATESDB_TYPE statesdbname=$IOB_STATESDB_NAME # new for sentinel support statesdbpass=$IOB_STATESDB_PASS # new for auth support usbdevices=$USBDEVICES -zwave=$ZWAVE set -u pkill_timeout=10 # timeout for iobroker shutdown in seconds @@ -104,7 +103,6 @@ if [[ "$permissioncheck" != "" ]]; then echo -n "----- " && e if [[ "$setgid" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" SETGID: "$setgid")" && echo " -----"; fi if [[ "$setuid" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" SETUID: "$setuid")" && echo " -----"; fi if [[ "$usbdevices" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" USBDEVICES: "$usbdevices")" && echo " -----"; fi -if [[ "$zwave" != "" ]]; then echo -n "----- " && echo -n "$(printf "%-20s %-28s" ZWAVE: "$zwave")" && echo " -----"; fi echo "$(printf -- '-%.0s' {1..80})" echo " " @@ -463,17 +461,6 @@ elif [[ "$avahi" = "true" ]]; then echo " " fi -# Checking ENV for Z-WAVE -if [[ "$zwave" = "true" && "$offlinemode" = "true" ]]; then - echo "ZWAVE is \"true\", but OFFLINE_MODE is also \"true\". Skipping Z-Wave setup." -elif [[ "$zwave" = "true" ]]; then - echo "ZWAVE is \"true\". Running setup script... " - chmod 755 /opt/scripts/setup_zwave.sh - bash /opt/scripts/setup_zwave.sh - echo "Done." - echo " " -fi - # checking ENV for USBDEVICES if [[ "$usbdevices" != "" && "$usbdevices" != "none" ]]; then echo "USBDEVICES is set." diff --git a/debian12/scripts/setup_zwave.sh b/debian12/scripts/setup_zwave.sh deleted file mode 100644 index 8efd62e..0000000 --- a/debian12/scripts/setup_zwave.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -if [ -e /usr/local/lib64 ] -then - echo "[setup_zwave.sh] Openzwave is already installed. Nothing to do here." -else - echo -n "[setup_zwave.sh] Openzwave is NOT installed. Going to install it now... " - cd /opt || exit - curl -s -L -O http://old.openzwave.com/downloads/openzwave-1.6.1007.tar.gz - tar -xf openzwave-1.6.1007.tar.gz && rm openzwave-1.6.1007.tar.gz - cd openzwave-1.6.1007 && make > /dev/null 2>&1 && make install > /dev/null 2>&1 - ldconfig /usr/local/lib64 - cd /opt/iobroker || exit - echo "Done." -fi - -exit 0 From 89a52b8eb3c14d27fd0f7902b65e5f61ba90cb83 Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 24 Sep 2023 00:34:26 +0200 Subject: [PATCH 30/39] update changelog --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 767b69b..cca6066 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,14 @@ ## Changelog -### v9.0.0-beta.1 (coming soon) +### v9.0.0-beta.1 (24.09.2023) +* remove special settings script and env for zwave ([#377](https://github.com/buanet/ioBroker.docker/issues/377)) * simplify ci/ reduce gh actions * ignore errors in "silent cleanup" on first start ([#369](https://github.com/buanet/ioBroker.docker/issues/369)) * cleanup/ restructure repo * update nodejs setup process * update base image to debian 12 (bookworm) * improve security by avoiding root (exept startup script itself) -* restrict iobroker commanline commands (start/ stop) +* restrict iobroker commanline commands (start/ stop/ node fix) * integrate maintenance script into iobroker command * move container config files location From 63974a37800789adbadfda3d6def187cbb47c787 Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 24 Sep 2023 00:44:07 +0200 Subject: [PATCH 31/39] update actions versions for ci --- .github/workflows/build-debian12-beta.yml | 24 +++++++++---------- .github/workflows/build-debian12-dev.yml | 24 +++++++++---------- .github/workflows/check-iobroker-versions.yml | 2 +- .github/workflows/update-docker-readme.yml | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build-debian12-beta.yml b/.github/workflows/build-debian12-beta.yml index 0e4b5fd..05a73bb 100644 --- a/.github/workflows/build-debian12-beta.yml +++ b/.github/workflows/build-debian12-beta.yml @@ -24,7 +24,7 @@ jobs: run: echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Checkout repo - uses: actions/checkout@v3.6.0 + uses: actions/checkout@v4.0.0 with: repository: 'buanet/ioBroker.docker' ref: ${{ env.RELEASE_TAG }} @@ -50,27 +50,27 @@ jobs: mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2.10.0 + uses: docker/setup-buildx-action@v3.0.0 - name: Login to DockerHub - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: registry: ghcr.io username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - name: Build and push Docker image - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: context: ./debian12 file: ./debian12/Dockerfile @@ -96,7 +96,7 @@ jobs: run: echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Checkout repo - uses: actions/checkout@v3.6.0 + uses: actions/checkout@v4.0.0 with: repository: 'buanet/ioBroker.docker' ref: ${{ env.RELEASE_TAG }} @@ -122,27 +122,27 @@ jobs: mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2.10.0 + uses: docker/setup-buildx-action@v3.0.0 - name: Login to DockerHub - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: registry: ghcr.io username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - name: Build and push Docker image - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: context: ./debian12 file: ./debian12/Dockerfile diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 1309290..af87f68 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3.6.0 + uses: actions/checkout@v4.0.0 with: repository: 'buanet/ioBroker.docker' @@ -44,27 +44,27 @@ jobs: mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2.10.0 + uses: docker/setup-buildx-action@v3.0.0 - name: Login to DockerHub - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: registry: ghcr.io username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - name: Build and push Docker image - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: context: ./debian12 file: ./debian12/Dockerfile @@ -85,7 +85,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3.6.0 + uses: actions/checkout@v4.0.0 with: repository: 'buanet/ioBroker.docker' @@ -110,27 +110,27 @@ jobs: mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2.10.0 + uses: docker/setup-buildx-action@v3.0.0 - name: Login to DockerHub - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: registry: ghcr.io username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - name: Build and push Docker image - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: context: ./debian12 file: ./debian12/Dockerfile diff --git a/.github/workflows/check-iobroker-versions.yml b/.github/workflows/check-iobroker-versions.yml index e6c287d..79f182f 100644 --- a/.github/workflows/check-iobroker-versions.yml +++ b/.github/workflows/check-iobroker-versions.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.0.0 with: repository: 'buanet/ioBroker.docker' token: ${{ secrets.ACTIONS_PAT }} diff --git a/.github/workflows/update-docker-readme.yml b/.github/workflows/update-docker-readme.yml index ecd8ffc..47302eb 100644 --- a/.github/workflows/update-docker-readme.yml +++ b/.github/workflows/update-docker-readme.yml @@ -12,7 +12,7 @@ jobs: update-docker-readme: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.5.3 + - uses: actions/checkout@v4.0.0 - name: Update Docker Hub Readme (buanet) uses: peter-evans/dockerhub-description@v3.4.2 From 6bbdd0572a7a575ee7d5d5952964843cf274590e Mon Sep 17 00:00:00 2001 From: dontobi Date: Sun, 24 Sep 2023 13:21:22 +0200 Subject: [PATCH 32/39] Add BaseImage Check --- .../build-debian-image-latest-iob.yml | 10 ++++---- .../workflows/build-debian-image-latest.yml | 13 +++++----- .github/workflows/build-debian12-beta.yml | 2 +- .github/workflows/build-debian12-dev.yml | 2 +- .github/workflows/update-docker-readme.yml | 2 +- ...broker-versions.yml => version-checks.yml} | 24 +++++++++++++++---- 6 files changed, 34 insertions(+), 19 deletions(-) rename .github/workflows/{check-iobroker-versions.yml => version-checks.yml} (74%) diff --git a/.github/workflows/build-debian-image-latest-iob.yml b/.github/workflows/build-debian-image-latest-iob.yml index 6f07a7f..4b3e5c6 100644 --- a/.github/workflows/build-debian-image-latest-iob.yml +++ b/.github/workflows/build-debian-image-latest-iob.yml @@ -17,7 +17,7 @@ jobs: echo "RELEASE_TAG=$LATESTRELEASE" >> $GITHUB_ENV - name: Checkout repo - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.1.0 with: repository: 'buanet/ioBroker.docker' ref: ${{ env.RELEASE_TAG }} @@ -42,20 +42,20 @@ jobs: mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2.9.1 + uses: docker/setup-buildx-action@v3.0.0 - name: Login to DockerHub (iobroker) - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: username: ${{ secrets.DOCKER_USER_IOB }} password: ${{ secrets.DOCKER_PASS_IOB }} - name: Build Docker image - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: context: ./debian file: ./debian/node18/Dockerfile diff --git a/.github/workflows/build-debian-image-latest.yml b/.github/workflows/build-debian-image-latest.yml index c677a89..c38b2c9 100644 --- a/.github/workflows/build-debian-image-latest.yml +++ b/.github/workflows/build-debian-image-latest.yml @@ -17,7 +17,7 @@ jobs: echo "RELEASE_TAG=$LATESTRELEASE" >> $GITHUB_ENV - name: Checkout repo - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4.1.0 with: repository: 'buanet/ioBroker.docker' ref: ${{ env.RELEASE_TAG }} @@ -42,26 +42,27 @@ jobs: mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2.9.1 + uses: docker/setup-buildx-action@v3.0.0 + - name: Login to DockerHub (buanet) - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2.2.0 + uses: docker/login-action@v3.0.0 with: registry: ghcr.io username: ${{ secrets.PACKAGES_USER }} password: ${{ secrets.PACKAGES_PASS }} - name: Build Docker image - uses: docker/build-push-action@v4.1.1 + uses: docker/build-push-action@v5.0.0 with: context: ./debian file: ./debian/node18/Dockerfile diff --git a/.github/workflows/build-debian12-beta.yml b/.github/workflows/build-debian12-beta.yml index 05a73bb..2362f22 100644 --- a/.github/workflows/build-debian12-beta.yml +++ b/.github/workflows/build-debian12-beta.yml @@ -24,7 +24,7 @@ jobs: run: echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Checkout repo - uses: actions/checkout@v4.0.0 + uses: actions/checkout@v4.1.0 with: repository: 'buanet/ioBroker.docker' ref: ${{ env.RELEASE_TAG }} diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index af87f68..0ee713e 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v4.0.0 + uses: actions/checkout@v4.1.0 with: repository: 'buanet/ioBroker.docker' diff --git a/.github/workflows/update-docker-readme.yml b/.github/workflows/update-docker-readme.yml index 47302eb..16e6160 100644 --- a/.github/workflows/update-docker-readme.yml +++ b/.github/workflows/update-docker-readme.yml @@ -12,7 +12,7 @@ jobs: update-docker-readme: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.0.0 + - uses: actions/checkout@v4.1.0 - name: Update Docker Hub Readme (buanet) uses: peter-evans/dockerhub-description@v3.4.2 diff --git a/.github/workflows/check-iobroker-versions.yml b/.github/workflows/version-checks.yml similarity index 74% rename from .github/workflows/check-iobroker-versions.yml rename to .github/workflows/version-checks.yml index 79f182f..5709a88 100644 --- a/.github/workflows/check-iobroker-versions.yml +++ b/.github/workflows/version-checks.yml @@ -1,4 +1,4 @@ -name: Check ioBroker versions +name: Version Checks on: schedule: @@ -10,12 +10,26 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v4.0.0 + uses: actions/checkout@v4.1.0 with: repository: 'buanet/ioBroker.docker' token: ${{ secrets.ACTIONS_PAT }} - - name: Fetch ioBroker versions + - name: Get and write version + id: version + run: | + LATESTRELEASE="$(curl -sL https://api.github.com/repos/buanet/ioBroker.docker/releases/latest | jq -r '.tag_name')" + echo "iobroker=iobroker/iobroker:$LATESTRELEASE" >> $GITHUB_ENV + echo "baseimage=library/debian:bullseye-slim" >> $GITHUB_ENV + + - name: Docker Baseimage Checker + id: baseimage + uses: mkumatag/container-image-updater-action@v1.0.5 + with: + base-image: '${{ env.baseimage }}' + image: '${{ env.iobroker }}' + + - name: Fetch ioBroker and nodejs versions run: | curl -sL https://repo.iobroker.live/sources-dist.json | \ jq -r '."js-controller".version' > .github/dependencies/.js-controller-version @@ -46,7 +60,7 @@ jobs: git push - name: Trigger build debian latest (buanet) - if: steps.git-check.outputs.modified == 'true' + if: steps.baseimage.outputs.needs-update == 'true' || steps.git-check.outputs.modified == 'true' uses: benc-uk/workflow-dispatch@v1.2 with: workflow: Build debian latest (buanet) @@ -54,7 +68,7 @@ jobs: token: ${{ secrets.ACTIONS_PAT }} - name: Trigger build debian latest (iobroker) - if: steps.git-check.outputs.modified == 'true' + if: steps.baseimage.outputs.needs-update == 'true' || steps.git-check.outputs.modified == 'true' uses: benc-uk/workflow-dispatch@v1.2 with: workflow: Build debian latest (iobroker) From f3f5df48196f8bdc9fec908c9553bc56f975d781 Mon Sep 17 00:00:00 2001 From: buanet Date: Mon, 25 Sep 2023 22:24:35 +0200 Subject: [PATCH 33/39] update license --- LICENSE.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index f0db1d6..4e5a865 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017-2022 André Germann +Copyright (c) 2017-2023 André Germann Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 070e147..e321d74 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ Moved to [CHANGELOG.md](CHANGELOG.md). MIT License -Copyright (c) 2017-2022 André Germann +Copyright (c) 2017-2023 André Germann Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 49f9f9ad8b0a46d47fa1313ae9baa4b98dc257d9 Mon Sep 17 00:00:00 2001 From: buanet Date: Thu, 28 Sep 2023 16:03:02 +0200 Subject: [PATCH 34/39] small fixes in beta --- CHANGELOG.md | 25 ++++++++++++++----------- debian12/Dockerfile | 1 - debian12/scripts/iobroker_startup.sh | 2 ++ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc1f331..12ea0c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,19 @@ ## Changelog -### v9.0.0-beta.1 (24.09.2023) -* remove special settings script and env for zwave ([#377](https://github.com/buanet/ioBroker.docker/issues/377)) -* simplify ci/ reduce gh actions -* ignore errors in "silent cleanup" on first start ([#369](https://github.com/buanet/ioBroker.docker/issues/369)) -* cleanup/ restructure repo -* update nodejs setup process -* update base image to debian 12 (bookworm) -* improve security by avoiding root (exept startup script itself) -* restrict iobroker commanline commands (start/ stop/ node fix) -* integrate maintenance script into iobroker command -* move container config files location +### v9.0.0-beta.2 (coming soon) +* fix issue with unlocking features in backitup ([#381](https://github.com/buanet/ioBroker.docker/issues/381)) +* fix issue with fresh initializing iobroker +* v9.0.0-beta.1 (24.09.2023) + * remove special settings script and env for zwave ([#377](https://github.com/buanet/ioBroker.docker/issues/377)) + * simplify ci/ reduce gh actions + * ignore errors in "silent cleanup" on first start ([#369](https://github.com/buanet/ioBroker.docker/issues/369)) + * cleanup/ restructure repo + * update nodejs setup process + * update base image to debian 12 (bookworm) + * improve security by avoiding root (exept startup script itself) + * restrict iobroker commanline commands (start/ stop/ node fix) + * integrate maintenance script into iobroker command + * move container config files location ### v8.1.0 (15.08.2023) * repo cleanup diff --git a/debian12/Dockerfile b/debian12/Dockerfile index fb27fe1..4069a41 100644 --- a/debian12/Dockerfile +++ b/debian12/Dockerfile @@ -71,7 +71,6 @@ RUN apt-get update && apt-get upgrade -y \ && usermod -u 1000 iobroker \ && groupmod -g 1000 iobroker \ && chown root:iobroker /usr/sbin/gosu \ - #&& chmod +s /usr/sbin/gosu \ # Set permissions and ownership && chown -R iobroker:iobroker /opt/scripts /opt/userscripts \ && chmod 755 /opt/scripts/*.sh \ diff --git a/debian12/scripts/iobroker_startup.sh b/debian12/scripts/iobroker_startup.sh index c8c9842..efe0957 100644 --- a/debian12/scripts/iobroker_startup.sh +++ b/debian12/scripts/iobroker_startup.sh @@ -306,6 +306,7 @@ fi # if restored a fresh install, running "iob setup first" for database init (but not on slaves!), otherwise check database connection if [[ -f /opt/iobroker/.fresh_install && "$multihost" != "slave" ]]; then echo -n "Initializing a fresh installation of ioBroker... " + if [[ ! -d "/opt/iobroker/log" ]]; then gosu iobroker mkdir "/opt/iobroker/log"; fi set +e bash iob setup first > /opt/iobroker/log/iob_setup_first.log 2>&1 return=$? @@ -446,6 +447,7 @@ fi if [[ "$backitup" == "true" ]]; then echo -n "IOB_BACKITUP_EXTDB is \"true\". Unlocking features..." echo "true" > /opt/.docker_config/.backitup + echo "true" > /opt/scripts/.docker_config/.backitup # old path, needed until changed in backitup echo "Done." echo " " fi From 117f57aa3ed0f186c286c17a00f10f0a4e711cea Mon Sep 17 00:00:00 2001 From: buanet Date: Thu, 28 Sep 2023 20:41:36 +0200 Subject: [PATCH 35/39] fix typos --- CHANGELOG.md | 18 +++++++++--------- docs/README_docker_hub_buanet.md | 4 ++-- docs/README_docker_hub_iobroker.md | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12ea0c0..33cb891 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,8 @@ * cleanup/ restructure repo * update nodejs setup process * update base image to debian 12 (bookworm) - * improve security by avoiding root (exept startup script itself) - * restrict iobroker commanline commands (start/ stop/ node fix) + * improve security by avoiding root (except startup script itself) + * restrict iobroker command line commands (start/ stop/ node fix) * integrate maintenance script into iobroker command * move container config files location @@ -124,7 +124,7 @@ * v5.2.0-beta4 (2021-09-10) * adding iobroker user rights for "gosu" * adding more labels in OCI standard format - * fixing workdir bug + * fixing work dir bug * adding backitup compatibility * v5.2.0-beta3 (2021-09-04) * reducing layers in dockerfile @@ -150,10 +150,10 @@ ### v5.1.0 (2020-11-05) * v5.0.2-beta (2020-07-28) - * added docker tag for majorversion latest - * extend readme.md docu + * added docker tag for major version latest + * extend readme.md docs * added maintenance script - * added container healthcheck + * added container health check * fixed configuration procedure and logging for objects and states db setup * v5.0.1-beta (2020-07-01) * fixing backup detection in startup script @@ -180,7 +180,7 @@ * switching base image to buster * optimizing installation of packages defined by ENV "PACKAGES" * v4.1.3-beta (2020-02-08) - * renamed ENV for adminport (new "IOB_ADMINPORT)") + * renamed ENV for admin port (new "IOB_ADMINPORT)") * added new ENVs for "iobroker setup custom" (replacing "REDIS") * enhancements in startup script logging * v4.1.2-beta (2020-02-02) @@ -200,7 +200,7 @@ * v4.0.1-beta (2019-11-25) * added env for iobroker admin port * added env for usb-devices (setting permissions) - * updateing prerequisites for iobroker installation + * updating prerequisites for iobroker installation * some small code fixes ### v4.0.0 (2019-10-25) @@ -295,7 +295,7 @@ * added git package ### v0.1.0 (2017-03-08) -* moved avahi-start.sh to seperate directory +* moved avahi-start.sh to separate directory * fixed timezone issue (sets now timezone to Europe/Berlin) ### v0.0.2 (2017-03-06) diff --git a/docs/README_docker_hub_buanet.md b/docs/README_docker_hub_buanet.md index 691df4c..2acc6cb 100644 --- a/docs/README_docker_hub_buanet.md +++ b/docs/README_docker_hub_buanet.md @@ -47,7 +47,7 @@ It is highly recommended not to use the `latest` tag for production, especially # What is ioBroker? IoBroker is a open source IoT platform written in JavaScript that easily connects smarthome components from different manufactures. With the help of plugins (called: "adapters") ioBroker is able to communicate with a big variety of IoT hardware and services using different protocols and APIs.
-All data is stored in a central database that all adapters can access. With this it is very easy to build up logical connections, automation scripts and beautiful visualisations.
+All data is stored in a central database that all adapters can access. With this it is very easy to build up logical connections, automation scripts and beautiful visualizations.
For further details please check out [iobroker.net](https://www.iobroker.net). # How to use this image? @@ -123,7 +123,7 @@ You could use environment variables to auto configure your ioBroker container on * `LANGUAGE` (optional, default: de_DE:de) The following locales are pre-generated: de_DE:de, en_US:en * `LC_ALL` (optional, default: de_DE.UTF-8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 * `OFFLINE_MODE` (optional) Set `true` if your container has no or limited internet connection -* `PACKAGES` (optional) Install additional linux packages to your container, packages should be separated by whitespace like this: `package1 package2 package3`. +* `PACKAGES` (optional) Install additional Linux packages to your container, packages should be separated by whitespace like this: `package1 package2 package3`. * `PERMISSION_CHECK` (optional, default: true) Set "false" to skip checking and correcting all relevant permissions on container startup (Use at own risk!!!) * `SETGID` (default: 1000) In some cases it might be useful to specify the gid of the containers iobroker user to match an existing group on the docker host * `SETUID` (default: 1000) In some cases it might be useful to specify the uid of the containers iobroker user to match an existing user on the docker host diff --git a/docs/README_docker_hub_iobroker.md b/docs/README_docker_hub_iobroker.md index 3a5bb4a..9b71bf7 100644 --- a/docs/README_docker_hub_iobroker.md +++ b/docs/README_docker_hub_iobroker.md @@ -49,7 +49,7 @@ It is highly recommended not to use the `latest` tag for production, especially # What is ioBroker? IoBroker is a open source IoT platform written in JavaScript that easily connects smarthome components from different manufactures. With the help of plugins (called: "adapters") ioBroker is able to communicate with a big variety of IoT hardware and services using different protocols and APIs.
-All data is stored in a central database that all adapters can access. With this it is very easy to build up logical connections, automation scripts and beautiful visualisations.
+All data is stored in a central database that all adapters can access. With this it is very easy to build up logical connections, automation scripts and beautiful visualizations.
For further details please check out [iobroker.net](https://www.iobroker.net). # How to use this image? @@ -125,7 +125,7 @@ You could use environment variables to auto configure your ioBroker container on * `LANGUAGE` (optional, default: de_DE:de) The following locales are pre-generated: de_DE:de, en_US:en * `LC_ALL` (optional, default: de_DE.UTF-8) The following locales are pre-generated: de_DE.UTF-8, en_US.UTF-8 * `OFFLINE_MODE` (optional) Set `true` if your container has no or limited internet connection -* `PACKAGES` (optional) Install additional linux packages to your container, packages should be separated by whitespace like this: `package1 package2 package3`. +* `PACKAGES` (optional) Install additional Linux packages to your container, packages should be separated by whitespace like this: `package1 package2 package3`. * `PERMISSION_CHECK` (optional, default: true) Set "false" to skip checking and correcting all relevant permissions on container startup (Use at own risk!!!) * `SETGID` (default: 1000) In some cases it might be useful to specify the gid of the containers iobroker user to match an existing group on the docker host * `SETUID` (default: 1000) In some cases it might be useful to specify the uid of the containers iobroker user to match an existing user on the docker host From 3b3dc39bc87c9ee04523df5f9eeda4f680d105a1 Mon Sep 17 00:00:00 2001 From: buanet Date: Thu, 28 Sep 2023 21:48:47 +0200 Subject: [PATCH 36/39] prepare v9.0.0-beta.2 --- .VERSION | 2 +- CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.VERSION b/.VERSION index 07aa000..d914d26 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v9.0.0-beta.1 \ No newline at end of file +v9.0.0-beta.2 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 33cb891..493b2f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## Changelog -### v9.0.0-beta.2 (coming soon) +### v9.0.0-beta.2 (28.09.2023) * fix issue with unlocking features in backitup ([#381](https://github.com/buanet/ioBroker.docker/issues/381)) * fix issue with fresh initializing iobroker * v9.0.0-beta.1 (24.09.2023) From e305053c26a048d71ed3462ab2f87d8ed46a9214 Mon Sep 17 00:00:00 2001 From: buanet Date: Tue, 3 Oct 2023 21:42:24 +0200 Subject: [PATCH 37/39] clarify warning message --- debian12/scripts/maintenance.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian12/scripts/maintenance.sh b/debian12/scripts/maintenance.sh index 0b64499..a3b2774 100644 --- a/debian12/scripts/maintenance.sh +++ b/debian12/scripts/maintenance.sh @@ -10,7 +10,7 @@ pkill_timeout=10 # timeout for stopping iobroker in seconds # check for user root if [ "$(id -u)" -eq 0 ]; then - echo "WARNING! This script should be executed as iobroker user! Please change user and try again." + echo "WARNING! This script should be executed as user "iobroker"! Please switch user and try again." exit 1 fi From 88979d48b19748f2b514463005fa642a8b5af78f Mon Sep 17 00:00:00 2001 From: buanet Date: Tue, 3 Oct 2023 22:11:19 +0200 Subject: [PATCH 38/39] prepare ci for latest release --- .../build-debian-image-latest-iob.yml | 68 ------- .../workflows/build-debian-image-latest.yml | 98 ---------- .github/workflows/build-debian12-latest.yml | 176 ++++++++++++++++++ .github/workflows/version-checks.yml | 14 +- 4 files changed, 179 insertions(+), 177 deletions(-) delete mode 100644 .github/workflows/build-debian-image-latest-iob.yml delete mode 100644 .github/workflows/build-debian-image-latest.yml create mode 100644 .github/workflows/build-debian12-latest.yml diff --git a/.github/workflows/build-debian-image-latest-iob.yml b/.github/workflows/build-debian-image-latest-iob.yml deleted file mode 100644 index 4b3e5c6..0000000 --- a/.github/workflows/build-debian-image-latest-iob.yml +++ /dev/null @@ -1,68 +0,0 @@ -# Github action to build Docker image from main branch for iobroker/iobroker (tag: latest) -name: Build debian latest (iobroker) - -on: - release: - types: [released] - workflow_dispatch: - -jobs: - build-latest-image: - runs-on: ubuntu-latest - steps: - - name: Fetching latest release tag - run: | - LATESTRELEASE="$(curl -sL https://api.github.com/repos/buanet/ioBroker.docker/releases/latest | jq -r '.tag_name')" - echo "Latest release tag : $LATESTRELEASE" - echo "RELEASE_TAG=$LATESTRELEASE" >> $GITHUB_ENV - - - name: Checkout repo - uses: actions/checkout@v4.1.0 - with: - repository: 'buanet/ioBroker.docker' - ref: ${{ env.RELEASE_TAG }} - - - name: Fetching version tag and date - id: version - run: | - VERSION="$(cat .VERSION)" - MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" - DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" - echo "This is the Version: $VERSION" - echo "version=$VERSION" >> $GITHUB_ENV - echo "This is the Major Version: $MAJORVERSION" - echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV - echo "This is the Buildnumber/Timestamp: $DATI" - echo "dati=$DATI" >> $GITHUB_ENV - # startup script - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp - mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh - # amd64 - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node18/Dockerfile > ./debian/node18/Dockerfile.tmp - mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3.0.0 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3.0.0 - - - name: Login to DockerHub (iobroker) - uses: docker/login-action@v3.0.0 - with: - username: ${{ secrets.DOCKER_USER_IOB }} - password: ${{ secrets.DOCKER_PASS_IOB }} - - - name: Build Docker image - uses: docker/build-push-action@v5.0.0 - with: - context: ./debian - file: ./debian/node18/Dockerfile - push: true - platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 - tags: | - iobroker/iobroker:latest, - iobroker/iobroker:${{ env.majorversion }}, - iobroker/iobroker:${{ env.version }} - diff --git a/.github/workflows/build-debian-image-latest.yml b/.github/workflows/build-debian-image-latest.yml deleted file mode 100644 index c38b2c9..0000000 --- a/.github/workflows/build-debian-image-latest.yml +++ /dev/null @@ -1,98 +0,0 @@ -# Github action to build Docker image from main branch (tag: latest) -name: Build debian latest (buanet) - -on: - release: - types: [released] - workflow_dispatch: - -jobs: - build-latest-image: - runs-on: ubuntu-latest - steps: - - name: Fetching latest release tag - run: | - LATESTRELEASE="$(curl -sL https://api.github.com/repos/buanet/ioBroker.docker/releases/latest | jq -r '.tag_name')" - echo "Latest release tag : $LATESTRELEASE" - echo "RELEASE_TAG=$LATESTRELEASE" >> $GITHUB_ENV - - - name: Checkout repo - uses: actions/checkout@v4.1.0 - with: - repository: 'buanet/ioBroker.docker' - ref: ${{ env.RELEASE_TAG }} - - - name: Fetching version tag and date - id: version - run: | - VERSION="$(cat .VERSION)" - MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" - DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" - echo "This is the Version: $VERSION" - echo "version=$VERSION" >> $GITHUB_ENV - echo "This is the Major Version: $MAJORVERSION" - echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV - echo "This is the Buildnumber/Timestamp: $DATI" - echo "dati=$DATI" >> $GITHUB_ENV - # startup script - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${BUILD}/$DATI/" ./debian/scripts/iobroker_startup.sh > ./debian/scripts/iobroker_startup.tmp - mv -f ./debian/scripts/iobroker_startup.tmp ./debian/scripts/iobroker_startup.sh - # amd64 - sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATI}/$DATI/" ./debian/node18/Dockerfile > ./debian/node18/Dockerfile.tmp - mv -f ./debian/node18/Dockerfile.tmp ./debian/node18/Dockerfile - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3.0.0 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3.0.0 - - - name: Login to DockerHub (buanet) - uses: docker/login-action@v3.0.0 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASS }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3.0.0 - with: - registry: ghcr.io - username: ${{ secrets.PACKAGES_USER }} - password: ${{ secrets.PACKAGES_PASS }} - - - name: Build Docker image - uses: docker/build-push-action@v5.0.0 - with: - context: ./debian - file: ./debian/node18/Dockerfile - #provenance: false - push: true - platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 - tags: | - buanet/iobroker:latest, - buanet/iobroker:${{ env.majorversion }}, - buanet/iobroker:${{ env.version }}, - ghcr.io/buanet/iobroker:latest, - ghcr.io/buanet/iobroker:${{ env.majorversion }}, - ghcr.io/buanet/iobroker:${{ env.version }} - - - name: Delete untagged images from GitHub packages - uses: actions/github-script@v6 - with: - github-token: ${{ secrets.PACKAGES_PASS }} - script: | - const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", - { per_page: ${{ env.PER_PAGE }} - }); - for(version of response.data) { - if (version.metadata.container.tags.length == 0) { - console.log("delete " + version.id) - const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); - console.log("status " + deleteResponse.status) - } - } - env: - OWNER: buanet - PACKAGE_NAME: iobroker - PER_PAGE: 100 diff --git a/.github/workflows/build-debian12-latest.yml b/.github/workflows/build-debian12-latest.yml new file mode 100644 index 0000000..9a037df --- /dev/null +++ b/.github/workflows/build-debian12-latest.yml @@ -0,0 +1,176 @@ +# Github action to build Debian12 image (Tag: latest) +name: Build Debian 12 Image (latest) + +on: + release: + types: [released] + workflow_dispatch: + +jobs: + build-latest-for-buanet: + name: Build latest image for buanet + runs-on: ubuntu-latest + steps: + - name: Fetch latest release tag + run: | + LATESTRELEASE="$(curl -sL https://api.github.com/repos/buanet/ioBroker.docker/releases/latest | jq -r '.tag_name')" + echo "Latest release tag : $LATESTRELEASE" + echo "RELEASE_TAG=$LATESTRELEASE" >> $GITHUB_ENV + + - name: Checkout repo + uses: actions/checkout@v4.1.0 + with: + repository: 'buanet/ioBroker.docker' + ref: ${{ env.RELEASE_TAG }} + + - name: Set job variables + run: | + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + # Log output and export as Github environment variable + echo "[LOG] Nodejs Version: ${{ vars.RECOMMENDED_NODE_VERSION }}" + echo "[LOG] Image Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "[LOG] Major Image Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "[LOG] Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # Set values in iobroker_startup.sh + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp + mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh + # Set values in Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/${{ vars.RECOMMENDED_NODE_VERSION }}/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp + mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3.0.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3.0.0 + + - name: Login to DockerHub (buanet) + uses: docker/login-action@v3.0.0 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3.0.0 + with: + registry: ghcr.io + username: ${{ secrets.PACKAGES_USER }} + password: ${{ secrets.PACKAGES_PASS }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5.0.0 + with: + context: ./debian12 + file: ./debian12/Dockerfile + push: true + platforms: | + linux/amd64 + linux/arm/v7 + linux/arm64/v8 + tags: | + buanet/iobroker:latest, + buanet/iobroker:${{ env.majorversion }}, + buanet/iobroker:${{ env.version }}, + ghcr.io/buanet/iobroker:latest, + ghcr.io/buanet/iobroker:${{ env.majorversion }}, + ghcr.io/buanet/iobroker:${{ env.version }} + provenance: false + outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) + + build-latest-for-iobroker: + name: Build latest image for iobroker + runs-on: ubuntu-latest + steps: + - name: Fetch latest release tag + run: | + LATESTRELEASE="$(curl -sL https://api.github.com/repos/buanet/ioBroker.docker/releases/latest | jq -r '.tag_name')" + echo "Latest release tag : $LATESTRELEASE" + echo "RELEASE_TAG=$LATESTRELEASE" >> $GITHUB_ENV + + - name: Checkout repo + uses: actions/checkout@v4.1.0 + with: + repository: 'buanet/ioBroker.docker' + ref: ${{ env.RELEASE_TAG }} + + - name: Set job variables + run: | + VERSION="$(cat .VERSION)" + MAJORVERSION="$(cat .VERSION | cut -c 1-2 | sed -r 's#^(.{0})#\1latest-#')" + DATI="$(date --rfc-3339=seconds | sed 's/ /T/')" + # Log output and export as Github environment variable + echo "[LOG] Nodejs Version: ${{ vars.RECOMMENDED_NODE_VERSION }}" + echo "[LOG] Image Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_ENV + echo "[LOG] Major Image Version: $MAJORVERSION" + echo "majorversion=$MAJORVERSION" >> $GITHUB_ENV + echo "[LOG] Buildnumber/Timestamp: $DATI" + echo "dati=$DATI" >> $GITHUB_ENV + # Set values in iobroker_startup.sh + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${BUILD}/$DATI/" ./debian12/scripts/iobroker_startup.sh > ./debian12/scripts/iobroker_startup.tmp + mv -f ./debian12/scripts/iobroker_startup.tmp ./debian12/scripts/iobroker_startup.sh + # Set values in Dockerfile + sed -e "s/\${VERSION}/$VERSION-dev/" -e "s/\${DATI}/$DATI/" -e "s/\${NODE}/${{ vars.RECOMMENDED_NODE_VERSION }}/" ./debian12/Dockerfile > ./debian12/Dockerfile.tmp + mv -f ./debian12/Dockerfile.tmp ./debian12/Dockerfile + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3.0.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3.0.0 + + - name: Login to DockerHub (buanet) + uses: docker/login-action@v3.0.0 + with: + username: ${{ secrets.DOCKER_USER_IOB }} + password: ${{ secrets.DOCKER_PASS_IOB }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5.0.0 + with: + context: ./debian12 + file: ./debian12/Dockerfile + push: false ##### For first test of new workflow + platforms: | + linux/amd64 + linux/arm/v7 + linux/arm64/v8 + tags: | + iobroker/iobroker:latest, + iobroker/iobroker:${{ env.majorversion }}, + iobroker/iobroker:${{ env.version }}, + provenance: false + outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Official Docker image for ioBroker smarthome software (https://www.iobroker.net) + + delete-untagged-images: + if: ${{ always() }} + needs: [build-latest-for-buanet, build-latest-for-iobroker] + name: Delete untagged images from GitHub Container Registry + runs-on: ubuntu-latest + steps: + - name: Delete images + uses: actions/github-script@v6.4.1 + with: + github-token: ${{ secrets.PACKAGES_PASS }} + script: | + const response = await github.request("GET /users/${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions", + { per_page: ${{ env.PER_PAGE }} + }); + for(version of response.data) { + if (version.metadata.container.tags.length == 0) { + console.log("delete " + version.id) + const deleteResponse = await github.request("DELETE /user/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { }); + console.log("status " + deleteResponse.status) + } + } + env: + OWNER: buanet + PACKAGE_NAME: iobroker + PER_PAGE: 100 diff --git a/.github/workflows/version-checks.yml b/.github/workflows/version-checks.yml index 5709a88..b6edb23 100644 --- a/.github/workflows/version-checks.yml +++ b/.github/workflows/version-checks.yml @@ -20,7 +20,7 @@ jobs: run: | LATESTRELEASE="$(curl -sL https://api.github.com/repos/buanet/ioBroker.docker/releases/latest | jq -r '.tag_name')" echo "iobroker=iobroker/iobroker:$LATESTRELEASE" >> $GITHUB_ENV - echo "baseimage=library/debian:bullseye-slim" >> $GITHUB_ENV + echo "baseimage=library/debian:bookworm-slim" >> $GITHUB_ENV - name: Docker Baseimage Checker id: baseimage @@ -59,18 +59,10 @@ jobs: git commit -am "new ioBroker versions" git push - - name: Trigger build debian latest (buanet) + - name: Trigger Build Debian 12 Image (latest) if: steps.baseimage.outputs.needs-update == 'true' || steps.git-check.outputs.modified == 'true' uses: benc-uk/workflow-dispatch@v1.2 with: - workflow: Build debian latest (buanet) - repo: buanet/ioBroker.docker - token: ${{ secrets.ACTIONS_PAT }} - - - name: Trigger build debian latest (iobroker) - if: steps.baseimage.outputs.needs-update == 'true' || steps.git-check.outputs.modified == 'true' - uses: benc-uk/workflow-dispatch@v1.2 - with: - workflow: Build debian latest (iobroker) + workflow: Build Debian 12 Image (latest) repo: buanet/ioBroker.docker token: ${{ secrets.ACTIONS_PAT }} From 77831a2edd52a62ae7ff0091cb5baedc8d2d9413 Mon Sep 17 00:00:00 2001 From: buanet Date: Sun, 8 Oct 2023 22:37:46 +0200 Subject: [PATCH 39/39] prepare v9 release --- .VERSION | 2 +- CHANGELOG.md | 8 +++++--- docs/README_docker_hub_buanet.md | 4 ++-- docs/README_docker_hub_iobroker.md | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.VERSION b/.VERSION index d914d26..4cf2aaf 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v9.0.0-beta.2 \ No newline at end of file +v9.0.0 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 493b2f4..10a42f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,10 @@ ## Changelog -### v9.0.0-beta.2 (28.09.2023) -* fix issue with unlocking features in backitup ([#381](https://github.com/buanet/ioBroker.docker/issues/381)) -* fix issue with fresh initializing iobroker +### v9.0.0 (09.10.2023) +* update official docs +* v9.0.0-beta.2 (28.09.2023) + * fix issue with unlocking features in backitup ([#381](https://github.com/buanet/ioBroker.docker/issues/381)) + * fix issue with fresh initializing iobroker * v9.0.0-beta.1 (24.09.2023) * remove special settings script and env for zwave ([#377](https://github.com/buanet/ioBroker.docker/issues/377)) * simplify ci/ reduce gh actions diff --git a/docs/README_docker_hub_buanet.md b/docs/README_docker_hub_buanet.md index 2acc6cb..8ae4712 100644 --- a/docs/README_docker_hub_buanet.md +++ b/docs/README_docker_hub_buanet.md @@ -23,7 +23,7 @@ New major image versions (e.g. v6, v7, v8) always include a new major version of # Quick reference * Maintained by: [buanet](https://github.com/buanet) and [ioBroker](https://github.com/ioBroker) -* Where to get support: [ioBroker forum](https://forum.iobroker.net/), [Discord channel](https://discord.gg/HwUCwsH), [Telegram channel](https://t.me/+Xfjuou6-LztkOTBi), [Facebook group](https://www.facebook.com/groups/440499112958264) +* Where to get support: [ioBroker forum](https://forum.iobroker.net/), [Discord channel](https://discord.gg/5jGWNKnpZ8), [Facebook group](https://www.facebook.com/groups/440499112958264) * Where to report issues: [Github Repository Issues](https://github.com/buanet/ioBroker.docker/issues) * Supported architectures: amd64, arm32v7, arm64v8 * Changelog: [Github Repository Changelog](https://github.com/buanet/ioBroker.docker/blob/main/CHANGELOG.md) @@ -35,6 +35,7 @@ New major image versions (e.g. v6, v7, v8) always include a new major version of It is highly recommended not to use the `latest` tag for production, especially when using any kind of automated update procedure like watchtower. Please use the `latest-v[major_version]` tag instead. ### Node 18 versions +* [`v9.0.0`](https://github.com/buanet/ioBroker.docker/blob/v9.0.0/debian12/Dockerfile), [`latest-v9`](https://github.com/buanet/ioBroker.docker/blob/v9.0.0/debian12/Dockerfile), * [`v8.1.0`](https://github.com/buanet/ioBroker.docker/blob/v8.1.0/debian/node18/Dockerfile), [`latest-v8`](https://github.com/buanet/ioBroker.docker/blob/v8.1.0/debian/node18/Dockerfile), [`latest`](https://github.com/buanet/ioBroker.docker/blob/v8.1.0/debian/node18/Dockerfile) * [`v8.0.1`](https://github.com/buanet/ioBroker.docker/blob/v8.0.1/debian/node18/Dockerfile) * [`v8.0.0`](https://github.com/buanet/ioBroker.docker/blob/v8.0.0/debian/node18/Dockerfile) @@ -114,7 +115,6 @@ You could use environment variables to auto configure your ioBroker container on ### Activate special features: * `AVAHI` (optional) Set `true` to install and activate avahi-daemon for supporting yahka adapter -* `ZWAVE` (optional) Set `true` to install openzwave to support zwave adapter ### Configure environment: diff --git a/docs/README_docker_hub_iobroker.md b/docs/README_docker_hub_iobroker.md index 9b71bf7..9889e1e 100644 --- a/docs/README_docker_hub_iobroker.md +++ b/docs/README_docker_hub_iobroker.md @@ -25,7 +25,7 @@ New major image versions (e.g. v6, v7, v8) always include a new major version of # Quick reference * Maintained by: [buanet](https://github.com/buanet) and [ioBroker](https://github.com/ioBroker) -* Where to get support: [ioBroker forum](https://forum.iobroker.net/), [Discord channel](https://discord.gg/HwUCwsH), [Telegram channel](https://t.me/+Xfjuou6-LztkOTBi), [Facebook group](https://www.facebook.com/groups/440499112958264) +* Where to get support: [ioBroker forum](https://forum.iobroker.net/), [Discord channel](https://discord.gg/5jGWNKnpZ8), [Facebook group](https://www.facebook.com/groups/440499112958264) * Where to report issues: [Github Repository Issues](https://github.com/buanet/ioBroker.docker/issues) * Supported architectures: amd64, arm32v7, arm64v8 * Changelog: [Github Repository Changelog](https://github.com/buanet/ioBroker.docker/blob/main/CHANGELOG.md) @@ -37,6 +37,7 @@ New major image versions (e.g. v6, v7, v8) always include a new major version of It is highly recommended not to use the `latest` tag for production, especially when using any kind of automated update procedure like watchtower. Please use the `latest-v[major_version]` tag instead. ### Node 18 versions +* [`v9.0.0`](https://github.com/buanet/ioBroker.docker/blob/v9.0.0/debian12/Dockerfile), [`latest-v9`](https://github.com/buanet/ioBroker.docker/blob/v9.0.0/debian12/Dockerfile), * [`v8.1.0`](https://github.com/buanet/ioBroker.docker/blob/v8.1.0/debian/node18/Dockerfile), [`latest-v8`](https://github.com/buanet/ioBroker.docker/blob/v8.1.0/debian/node18/Dockerfile), [`latest`](https://github.com/buanet/ioBroker.docker/blob/v8.1.0/debian/node18/Dockerfile) * [`v8.0.1`](https://github.com/buanet/ioBroker.docker/blob/v8.0.1/debian/node18/Dockerfile) * [`v8.0.0`](https://github.com/buanet/ioBroker.docker/blob/v8.0.0/debian/node18/Dockerfile) @@ -116,7 +117,6 @@ You could use environment variables to auto configure your ioBroker container on ### Activate special features: * `AVAHI` (optional) Set `true` to install and activate avahi-daemon for supporting yahka adapter -* `ZWAVE` (optional) Set `true` to install openzwave to support zwave adapter ### Configure environment: