diff --git a/.VERSION b/.VERSION index 2bd9dba..4cf2aaf 100644 --- a/.VERSION +++ b/.VERSION @@ -1 +1 @@ -v8.1.0 \ No newline at end of file +v9.0.0 \ No newline at end of file diff --git a/.github/workflows/build-debian12-dev.yml b/.github/workflows/build-debian12-dev.yml index 9672ec0..0ee713e 100644 --- a/.github/workflows/build-debian12-dev.yml +++ b/.github/workflows/build-debian12-dev.yml @@ -3,9 +3,19 @@ name: Build Debian 12 Image (dev) on: 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-dev-image: + build-with-recommended-node: + 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 @@ -15,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" @@ -32,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 @@ -63,15 +71,85 @@ jobs: push: true platforms: | linux/amd64 + linux/arm64 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) + buanet/iobroker:dev-node${{ vars.RECOMMENDED_NODE_VERSION }}, + ghcr.io/buanet/iobroker:dev-node${{ vars.RECOMMENDED_NODE_VERSION }} - - name: Delete untagged images from GitHub Container Registry + build-with-experimental-node: + 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 + uses: actions/checkout@v4.0.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@v3.0.0 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3.0.0 + + - name: Login to DockerHub + 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: false + 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 }} + + 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 }} 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/check-iobroker-versions.yml b/.github/workflows/version-checks.yml similarity index 72% rename from .github/workflows/check-iobroker-versions.yml rename to .github/workflows/version-checks.yml index b56071d..b6edb23 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: @@ -15,7 +15,21 @@ jobs: 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:bookworm-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 @@ -45,18 +59,10 @@ jobs: git commit -am "new ioBroker versions" git push - - name: Trigger build debian latest (buanet) - if: steps.git-check.outputs.modified == 'true' + - 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.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 }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 87536c6..10a42f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ ## Changelog +### 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 + * 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 (except startup script itself) + * restrict iobroker command line commands (start/ stop/ node fix) + * integrate maintenance script into iobroker command + * move container config files location + ### v8.1.0 (15.08.2023) * repo cleanup * v8.1.0-beta.4 (29.07.2023) @@ -109,7 +126,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 @@ -135,10 +152,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 @@ -165,7 +182,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) @@ -185,7 +202,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) @@ -280,7 +297,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/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 160d59a..64a3b3f 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,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 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/debian/node20/Dockerfile b/debian12/Dockerfile similarity index 61% rename from debian/node20/Dockerfile rename to debian12/Dockerfile index 08c0f1a..4069a41 100644 --- a/debian/node20/Dockerfile +++ b/debian12/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye-slim +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)" \ @@ -6,54 +6,58 @@ LABEL org.opencontainers.image.title="Official ioBroker Docker Image" \ 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.base.name="debian:bookworm-slim" \ 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 -RUN apt-get update && apt-get install -y \ +# Set up ioBroker +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 \ + libatomic1 \ locales \ nfs-common \ procps \ python3 \ python3-dev \ - sudo \ tar \ tzdata \ udev \ wget \ # Install node - && curl -sL https://deb.nodesource.com/setup_20.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 -g 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 \ - # 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 \ + # Prepare .docker_config + && mkdir /opt/.docker_config \ + && echo "starting" > /opt/.docker_config/.healthcheck \ + && 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 "${VERSION}" > /opt/scripts/.docker_config/.thisisdocker \ - && echo "true" > /opt/.first_run \ - # Run installer + # Run iobroker installer && curl -sL https://iobroker.net/install.sh | bash - \ # Deleting UUID from build && iobroker unsetup -y \ @@ -61,22 +65,24 @@ RUN apt-get update && apt-get install -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) + # 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/* \ - && rm -rf /root/.cache/* /root/.npm/* \ - && rm -rf /var/lib/apt/lists/* + && 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" \ @@ -85,7 +91,7 @@ ENV DEBIAN_FRONTEND="teletype" \ SETUID=1000 \ TZ="Europe/Berlin" -# Expose default admin ui port +# Default admin ui port EXPOSE 8081 # Change work dir @@ -95,7 +101,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 diff --git a/debian12/scripts/healthcheck.sh b/debian12/scripts/healthcheck.sh new file mode 100644 index 0000000..5c95005 --- /dev/null +++ b/debian12/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/debian12/scripts/iobroker.sh b/debian12/scripts/iobroker.sh new file mode 100644 index 0000000..fdc55c2 --- /dev/null +++ b/debian12/scripts/iobroker.sh @@ -0,0 +1,65 @@ +#!/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" = "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 + 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/debian12/scripts/iobroker_startup.sh b/debian12/scripts/iobroker_startup.sh new file mode 100644 index 0000000..efe0957 --- /dev/null +++ b/debian12/scripts/iobroker_startup.sh @@ -0,0 +1,573 @@ +#!/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 +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 +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 [[ -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 + 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... " + 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=$? + 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 "true" > /opt/scripts/.docker_config/.backitup # old path, needed until changed in 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 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/debian12/scripts/maintenance.sh b/debian12/scripts/maintenance.sh new file mode 100644 index 0000000..a3b2774 --- /dev/null +++ b/debian12/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 user "iobroker"! Please switch 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/debian12/scripts/setup_avahi.sh b/debian12/scripts/setup_avahi.sh new file mode 100644 index 0000000..46d5873 --- /dev/null +++ b/debian12/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/debian12/scripts/setup_iob_db.sh b/debian12/scripts/setup_iob_db.sh new file mode 100644 index 0000000..df1d679 --- /dev/null +++ b/debian12/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/debian12/scripts/setup_packages.sh b/debian12/scripts/setup_packages.sh new file mode 100644 index 0000000..cdaa589 --- /dev/null +++ b/debian12/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/* || true + +exit 0 \ No newline at end of file diff --git a/debian12/userscripts/userscript_everystart_example.sh b/debian12/userscripts/userscript_everystart_example.sh new file mode 100644 index 0000000..320e6a9 --- /dev/null +++ b/debian12/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/debian12/userscripts/userscript_firststart_example.sh b/debian12/userscripts/userscript_firststart_example.sh new file mode 100644 index 0000000..1e25e34 --- /dev/null +++ b/debian12/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 diff --git a/docs/README_docker_hub_buanet.md b/docs/README_docker_hub_buanet.md index d4e9f08..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/5jGWNKnpZ8), [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) @@ -47,7 +48,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? @@ -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: @@ -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 e3b21b6..45dc449 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/5jGWNKnpZ8), [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) @@ -49,7 +50,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? @@ -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: @@ -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