diff --git a/.github/ISSUE_TEMPLATE/Image_issue.md b/.github/ISSUE_TEMPLATE/01-Image_issue.md similarity index 84% rename from .github/ISSUE_TEMPLATE/Image_issue.md rename to .github/ISSUE_TEMPLATE/01-Image_issue.md index 725fca88..be8f7f22 100644 --- a/.github/ISSUE_TEMPLATE/Image_issue.md +++ b/.github/ISSUE_TEMPLATE/01-Image_issue.md @@ -1,6 +1,7 @@ --- -name: šŸ› Image issue -about: Issues related to the Nextcloud Docker image +name: šŸ› Report a bug in the image +about: Create a report to help us improve the image +labels: "bug, 0. Needs triage" --- diff --git a/29/apache/Dockerfile b/29/apache/Dockerfile index 476e3e9e..6aa4d6c0 100644 --- a/29/apache/Dockerfile +++ b/29/apache/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template FROM php:8.2-apache-bookworm -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -140,7 +124,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -166,7 +151,7 @@ RUN { \ } > /etc/apache2/conf-available/apache-limits.conf; \ a2enconf apache-limits -ENV NEXTCLOUD_VERSION 29.0.15 +ENV NEXTCLOUD_VERSION 29.0.16 RUN set -ex; \ fetchDeps=" \ @@ -176,8 +161,8 @@ RUN set -ex; \ apt-get update; \ apt-get install -y --no-install-recommends $fetchDeps; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-29.0.15.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-29.0.15.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-29.0.16.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-29.0.16.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/29/apache/entrypoint.sh b/29/apache/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/29/apache/entrypoint.sh +++ b/29/apache/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/29/fpm-alpine/Dockerfile b/29/fpm-alpine/Dockerfile index 822e0428..b3e72848 100644 --- a/29/fpm-alpine/Dockerfile +++ b/29/fpm-alpine/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-alpine.template FROM php:8.2-fpm-alpine3.21 -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -65,23 +62,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -135,7 +119,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -146,7 +131,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 29.0.15 +ENV NEXTCLOUD_VERSION 29.0.16 RUN set -ex; \ apk add --no-cache --virtual .fetch-deps \ @@ -154,8 +139,8 @@ RUN set -ex; \ gnupg \ ; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-29.0.15.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-29.0.15.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-29.0.16.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-29.0.16.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/29/fpm-alpine/entrypoint.sh b/29/fpm-alpine/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/29/fpm-alpine/entrypoint.sh +++ b/29/fpm-alpine/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/29/fpm/Dockerfile b/29/fpm/Dockerfile index 48dde6a8..ad1933ff 100644 --- a/29/fpm/Dockerfile +++ b/29/fpm/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template FROM php:8.2-fpm-bookworm -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -140,7 +124,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -151,7 +136,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 29.0.15 +ENV NEXTCLOUD_VERSION 29.0.16 RUN set -ex; \ fetchDeps=" \ @@ -161,8 +146,8 @@ RUN set -ex; \ apt-get update; \ apt-get install -y --no-install-recommends $fetchDeps; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-29.0.15.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-29.0.15.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-29.0.16.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-29.0.16.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/29/fpm/entrypoint.sh b/29/fpm/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/29/fpm/entrypoint.sh +++ b/29/fpm/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/30/apache/Dockerfile b/30/apache/Dockerfile index ec40778c..ce637572 100644 --- a/30/apache/Dockerfile +++ b/30/apache/Dockerfile @@ -1,8 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template -FROM php:8.2-apache-bookworm - -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b +FROM php:8.3-apache-bookworm # entrypoint.sh and cron.sh dependencies RUN set -ex; \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -140,7 +124,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -166,7 +151,7 @@ RUN { \ } > /etc/apache2/conf-available/apache-limits.conf; \ a2enconf apache-limits -ENV NEXTCLOUD_VERSION 30.0.9 +ENV NEXTCLOUD_VERSION 30.0.10 RUN set -ex; \ fetchDeps=" \ @@ -176,8 +161,8 @@ RUN set -ex; \ apt-get update; \ apt-get install -y --no-install-recommends $fetchDeps; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-30.0.9.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-30.0.9.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-30.0.10.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-30.0.10.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/30/apache/entrypoint.sh b/30/apache/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/30/apache/entrypoint.sh +++ b/30/apache/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/30/fpm-alpine/Dockerfile b/30/fpm-alpine/Dockerfile index 5259dc11..10584886 100644 --- a/30/fpm-alpine/Dockerfile +++ b/30/fpm-alpine/Dockerfile @@ -1,8 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-alpine.template -FROM php:8.2-fpm-alpine3.21 - -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b +FROM php:8.3-fpm-alpine3.21 # entrypoint.sh and cron.sh dependencies RUN set -ex; \ @@ -65,23 +62,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -135,7 +119,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -146,7 +131,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 30.0.9 +ENV NEXTCLOUD_VERSION 30.0.10 RUN set -ex; \ apk add --no-cache --virtual .fetch-deps \ @@ -154,8 +139,8 @@ RUN set -ex; \ gnupg \ ; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-30.0.9.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-30.0.9.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-30.0.10.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-30.0.10.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/30/fpm-alpine/entrypoint.sh b/30/fpm-alpine/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/30/fpm-alpine/entrypoint.sh +++ b/30/fpm-alpine/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/30/fpm/Dockerfile b/30/fpm/Dockerfile index cb4828a3..48c6d5d0 100644 --- a/30/fpm/Dockerfile +++ b/30/fpm/Dockerfile @@ -1,8 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template -FROM php:8.2-fpm-bookworm - -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b +FROM php:8.3-fpm-bookworm # entrypoint.sh and cron.sh dependencies RUN set -ex; \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -140,7 +124,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -151,7 +136,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 30.0.9 +ENV NEXTCLOUD_VERSION 30.0.10 RUN set -ex; \ fetchDeps=" \ @@ -161,8 +146,8 @@ RUN set -ex; \ apt-get update; \ apt-get install -y --no-install-recommends $fetchDeps; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-30.0.9.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-30.0.9.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-30.0.10.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-30.0.10.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/30/fpm/entrypoint.sh b/30/fpm/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/30/fpm/entrypoint.sh +++ b/30/fpm/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/31/apache/Dockerfile b/31/apache/Dockerfile index 3365bc32..23abebd9 100644 --- a/31/apache/Dockerfile +++ b/31/apache/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template FROM php:8.3-apache-bookworm -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -140,7 +124,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -166,7 +151,7 @@ RUN { \ } > /etc/apache2/conf-available/apache-limits.conf; \ a2enconf apache-limits -ENV NEXTCLOUD_VERSION 31.0.3 +ENV NEXTCLOUD_VERSION 31.0.4 RUN set -ex; \ fetchDeps=" \ @@ -176,8 +161,8 @@ RUN set -ex; \ apt-get update; \ apt-get install -y --no-install-recommends $fetchDeps; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-31.0.3.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-31.0.3.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-31.0.4.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-31.0.4.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/31/apache/entrypoint.sh b/31/apache/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/31/apache/entrypoint.sh +++ b/31/apache/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/31/fpm-alpine/Dockerfile b/31/fpm-alpine/Dockerfile index 97b06ac0..b590b88e 100644 --- a/31/fpm-alpine/Dockerfile +++ b/31/fpm-alpine/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-alpine.template FROM php:8.3-fpm-alpine3.21 -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -65,23 +62,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -135,7 +119,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -146,7 +131,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 31.0.3 +ENV NEXTCLOUD_VERSION 31.0.4 RUN set -ex; \ apk add --no-cache --virtual .fetch-deps \ @@ -154,8 +139,8 @@ RUN set -ex; \ gnupg \ ; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-31.0.3.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-31.0.3.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-31.0.4.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-31.0.4.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/31/fpm-alpine/entrypoint.sh b/31/fpm-alpine/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/31/fpm-alpine/entrypoint.sh +++ b/31/fpm-alpine/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/31/fpm/Dockerfile b/31/fpm/Dockerfile index 251db349..9f6f73db 100644 --- a/31/fpm/Dockerfile +++ b/31/fpm/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template FROM php:8.3-fpm-bookworm -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ @@ -140,7 +124,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ @@ -151,7 +136,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 31.0.3 +ENV NEXTCLOUD_VERSION 31.0.4 RUN set -ex; \ fetchDeps=" \ @@ -161,8 +146,8 @@ RUN set -ex; \ apt-get update; \ apt-get install -y --no-install-recommends $fetchDeps; \ \ - curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-31.0.3.tar.bz2"; \ - curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-31.0.3.tar.bz2.asc"; \ + curl -fsSL -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-31.0.4.tar.bz2"; \ + curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/nextcloud-31.0.4.tar.bz2.asc"; \ export GNUPGHOME="$(mktemp -d)"; \ # gpg key from https://nextcloud.com/nextcloud.asc gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ diff --git a/31/fpm/entrypoint.sh b/31/fpm/entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/31/fpm/entrypoint.sh +++ b/31/fpm/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/Dockerfile-alpine.template b/Dockerfile-alpine.template index 2295bddf..c345920f 100644 --- a/Dockerfile-alpine.template +++ b/Dockerfile-alpine.template @@ -1,8 +1,5 @@ FROM php:%%PHP_VERSION%%-%%VARIANT%%%%ALPINE_VERSION%% -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -64,23 +61,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-%%APCU_VERSION%%; \ pecl install igbinary-%%IGBINARY_VERSION%%; \ + pecl install imagick-%%IMAGICK_VERSION%%; \ pecl install memcached-%%MEMCACHED_VERSION%% \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-%%REDIS_VERSION%% \ @@ -134,7 +118,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ diff --git a/Dockerfile-debian.template b/Dockerfile-debian.template index 8734caa9..72779c50 100644 --- a/Dockerfile-debian.template +++ b/Dockerfile-debian.template @@ -1,8 +1,5 @@ FROM php:%%PHP_VERSION%%-%%VARIANT%%-%%DEBIAN_VERSION%% -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -67,23 +64,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-%%APCU_VERSION%%; \ pecl install igbinary-%%IGBINARY_VERSION%%; \ + pecl install imagick-%%IMAGICK_VERSION%%; \ pecl install memcached-%%MEMCACHED_VERSION%% \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-%%REDIS_VERSION%% \ @@ -139,7 +123,8 @@ RUN { \ } > "${PHP_INI_DIR}/conf.d/nextcloud.ini"; \ \ mkdir /var/www/data; \ - mkdir -p /docker-entrypoint-hooks.d/pre-installation \ + mkdir -p /docker-entrypoint-hooks.d/pre-initialization \ + /docker-entrypoint-hooks.d/pre-installation \ /docker-entrypoint-hooks.d/post-installation \ /docker-entrypoint-hooks.d/pre-upgrade \ /docker-entrypoint-hooks.d/post-upgrade \ diff --git a/README.md b/README.md index 7de62124..45ca73a0 100644 --- a/README.md +++ b/README.md @@ -362,8 +362,9 @@ As long as you have not modified any of the provided config files in `/var/www/h ## Auto configuration via hook folders -There are 5 hooks +There are 6 hooks +- `pre-initialization` Executed before the need to update or install Nextcloud is determined - `pre-installation` Executed before the Nextcloud is installed/initiated - `post-installation` Executed after the Nextcloud is installed/initiated - `pre-upgrade` Executed before the Nextcloud is upgraded @@ -383,6 +384,7 @@ To use the hooks triggered by the `entrypoint` script, either image: nextcloud:stable volumes: + - ./app-hooks/pre-initialization:/docker-entrypoint-hooks.d/pre-initialization - ./app-hooks/pre-installation:/docker-entrypoint-hooks.d/pre-installation - ./app-hooks/post-installation:/docker-entrypoint-hooks.d/post-installation - ./app-hooks/pre-upgrade:/docker-entrypoint-hooks.d/pre-upgrade @@ -391,6 +393,16 @@ To use the hooks triggered by the `entrypoint` script, either ... ``` +## Forcing an upgrade run + +Sometimes you need to force an explicit upgrade run even when the bundled Nextcloud version did not change. +An example would be when you have custom apps bundled and you want to update those. + +To do this, you can simply create a file `/tmp/nextcloud-force-initialization` before the need for an upgrade is determined. +The content is irrelevant. +You can either create this file before starting the container, or you can use the `pre-initialization` hook to create it. +After the update has successfully run, the file is removed automatically. + # Running this image with `docker compose` The easiest way to get a fully featured and functional setup is using a `compose.yaml` file. There are too many different possibilities to setup your system, so here are only some examples of what you have to look for. diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 8e178f2e..5a30e868 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } @@ -114,13 +121,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi @@ -141,6 +156,8 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP flock 9 fi + run_path pre-initialization + installed_version="0.0.0.0" if [ -f /var/www/html/version.php ]; then # shellcheck disable=SC2016 @@ -154,7 +171,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP exit 1 fi + need_initialization=false + if version_greater "$image_version" "$installed_version"; then + need_initialization=true + fi + + if [ -f /tmp/nextcloud-force-initialization ]; then + echo Found /tmp/nextcloud-force-initialization, forcing initialization + need_initialization=true + fi + + if [ "true" = "$need_initialization" ]; then echo "Initializing nextcloud $image_version ..." if [ "$installed_version" != "0.0.0.0" ]; then if [ "${image_version%%.*}" -gt "$((${installed_version%%.*} + 1))" ]; then @@ -237,16 +265,18 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP fi if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then echo "Setting trusted domains…" + set -f # turn off glob NC_TRUSTED_DOMAIN_IDX=1 - for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do - DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') - run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=$DOMAIN" + for DOMAIN in ${NEXTCLOUD_TRUSTED_DOMAINS}; do + DOMAIN=$(echo "${DOMAIN}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + run_as "php /var/www/html/occ config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value=\"${DOMAIN}\"" NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX+1)) done + set +f # turn glob back on fi run_path post-installation - fi + fi fi # not enough specified to do a fully automated installation if [ "$install" = false ]; then @@ -267,6 +297,10 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP run_path post-upgrade fi + if [ -f /tmp/nextcloud-force-initialization ]; then + rm /tmp/nextcloud-force-initialization + fi + echo "Initializing finished" fi diff --git a/generate-stackbrew-library.sh b/generate-stackbrew-library.sh index 2b523c0e..14ea578f 100755 --- a/generate-stackbrew-library.sh +++ b/generate-stackbrew-library.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -Eeuo pipefail -stable_channel='30.0.9' +stable_channel='31.0.4' self="$(basename "$BASH_SOURCE")" cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" diff --git a/latest.txt b/latest.txt index ec15973e..02c72ff2 100644 --- a/latest.txt +++ b/latest.txt @@ -1 +1 @@ -31.0.3 +31.0.4 diff --git a/update.sh b/update.sh index 0f224b06..3128e4a3 100755 --- a/update.sh +++ b/update.sh @@ -10,8 +10,8 @@ declare -A debian_version=( ) declare -A php_version=( - [default]='8.2' - [31]='8.3' + [29]='8.2' + [default]='8.3' ) declare -A cmd=( @@ -55,7 +55,7 @@ igbinary_version="$( )" imagick_version="$( - git ls-remote --tags https://github.com/mkoppanen/imagick.git \ + git ls-remote --tags https://github.com/imagick/imagick.git \ | cut -d/ -f3 \ | grep -viE '[a-z]' \ | tr -d '^{}' \ diff --git a/versions.json b/versions.json index 36e04efe..daac9da6 100644 --- a/versions.json +++ b/versions.json @@ -1,9 +1,9 @@ { "31": { "branch": "31", - "version": "31.0.3", - "url": "https://download.nextcloud.com/server/releases/nextcloud-31.0.3.tar.bz2", - "ascUrl": "https://download.nextcloud.com/server/releases/nextcloud-31.0.3.tar.bz2.asc", + "version": "31.0.4", + "url": "https://download.nextcloud.com/server/releases/nextcloud-31.0.4.tar.bz2", + "ascUrl": "https://download.nextcloud.com/server/releases/nextcloud-31.0.4.tar.bz2.asc", "variants": { "apache": { "variant": "apache", @@ -27,35 +27,35 @@ }, "30": { "branch": "30", - "version": "30.0.9", - "url": "https://download.nextcloud.com/server/releases/nextcloud-30.0.9.tar.bz2", - "ascUrl": "https://download.nextcloud.com/server/releases/nextcloud-30.0.9.tar.bz2.asc", + "version": "30.0.10", + "url": "https://download.nextcloud.com/server/releases/nextcloud-30.0.10.tar.bz2", + "ascUrl": "https://download.nextcloud.com/server/releases/nextcloud-30.0.10.tar.bz2.asc", "variants": { "apache": { "variant": "apache", "base": "debian", "baseVersion": "bookworm", - "phpVersion": "8.2" + "phpVersion": "8.3" }, "fpm": { "variant": "fpm", "base": "debian", "baseVersion": "bookworm", - "phpVersion": "8.2" + "phpVersion": "8.3" }, "fpm-alpine": { "variant": "fpm-alpine", "base": "alpine", "baseVersion": "3.21", - "phpVersion": "8.2" + "phpVersion": "8.3" } } }, "29": { "branch": "29", - "version": "29.0.15", - "url": "https://download.nextcloud.com/server/releases/nextcloud-29.0.15.tar.bz2", - "ascUrl": "https://download.nextcloud.com/server/releases/nextcloud-29.0.15.tar.bz2.asc", + "version": "29.0.16", + "url": "https://download.nextcloud.com/server/releases/nextcloud-29.0.16.tar.bz2", + "ascUrl": "https://download.nextcloud.com/server/releases/nextcloud-29.0.16.tar.bz2.asc", "variants": { "apache": { "variant": "apache",