diff --git a/.config/s3.config.php b/.config/s3.config.php index a17e4037..fa76667c 100644 --- a/.config/s3.config.php +++ b/.config/s3.config.php @@ -4,6 +4,15 @@ if (getenv('OBJECTSTORE_S3_BUCKET')) { $use_path = getenv('OBJECTSTORE_S3_USEPATH_STYLE'); $use_legacyauth = getenv('OBJECTSTORE_S3_LEGACYAUTH'); $autocreate = getenv('OBJECTSTORE_S3_AUTOCREATE'); + $proxy = getenv('OBJECTSTORE_S3_PROXY'); + $verify_bucket_exists = getenv('OBJECTSTORE_S3_VERIFY_BUCKET_EXISTS'); + $use_multipart_copy = getenv('OBJECTSTORE_S3_USEMULTIPARTCOPY'); + $concurrency = getenv('OBJECTSTORE_S3_CONCURRENCY'); + $timeout = getenv('OBJECTSTORE_S3_TIMEOUT'); + $upload_part_size = getenv('OBJECTSTORE_S3_UPLOADPARTSIZE'); + $put_size_limit = getenv('OBJECTSTORE_S3_PUTSIZELIMIT'); + $copy_size_limit = getenv('OBJECTSTORE_S3_COPYSIZELIMIT'); + $CONFIG = array( 'objectstore' => array( 'class' => '\OC\Files\ObjectStore\S3', @@ -19,11 +28,35 @@ if (getenv('OBJECTSTORE_S3_BUCKET')) { // required for some non Amazon S3 implementations 'use_path_style' => $use_path == true && strtolower($use_path) !== 'false', // required for older protocol versions - 'legacy_auth' => $use_legacyauth == true && strtolower($use_legacyauth) !== 'false' + 'useMultipartCopy' => strtolower($useMultipartCopy) !== 'true', + 'legacy_auth' => $use_legacyauth == true && strtolower($use_legacyauth) !== 'false', + 'proxy' => strtolower($proxy) !== 'false', + 'version' => getenv('OBJECTSTORE_S3_VERSION') ?: 'latest', + 'verify_bucket_exists' => strtolower($verify_bucket_exists) !== 'true' ) ) ); + if $concurrency { + $CONFIG['objectstore']['arguments']['concurrency'] = $concurrency; + } + + if $timeout { + $CONFIG['objectstore']['arguments']['timeout'] = $timeout; + } + + if $upload_part_size { + $CONFIG['objectstore']['arguments']['uploadPartSize'] = $upload_part_size; + } + + if $put_size_limit { + $CONFIG['objectstore']['arguments']['putSizeLimit'] = $put_size_limit; + } + + if $copy_size_limit { + $CONFIG['objectstore']['arguments']['copySizeLimit'] = $copy_size_limit; + } + if (getenv('OBJECTSTORE_S3_KEY_FILE')) { $CONFIG['objectstore']['arguments']['key'] = trim(file_get_contents(getenv('OBJECTSTORE_S3_KEY_FILE'))); } elseif (getenv('OBJECTSTORE_S3_KEY')) { diff --git a/.examples/docker-compose/insecure/mariadb/apache/compose.yaml b/.examples/docker-compose/insecure/mariadb/apache/compose.yaml index c765190c..c05d7d8e 100644 --- a/.examples/docker-compose/insecure/mariadb/apache/compose.yaml +++ b/.examples/docker-compose/insecure/mariadb/apache/compose.yaml @@ -1,6 +1,9 @@ services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: @@ -12,6 +15,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always diff --git a/.examples/docker-compose/insecure/mariadb/fpm/compose.yaml b/.examples/docker-compose/insecure/mariadb/fpm/compose.yaml index 90520e08..64faef6c 100644 --- a/.examples/docker-compose/insecure/mariadb/fpm/compose.yaml +++ b/.examples/docker-compose/insecure/mariadb/fpm/compose.yaml @@ -1,6 +1,9 @@ services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: @@ -12,6 +15,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -31,14 +36,18 @@ services: - db - redis + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - build: ./web + image: nginx:alpine-slim restart: always ports: - 127.0.0.1:8080:80 volumes: + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./web/nginx.conf:/etc/nginx/nginx.conf:ro + # NOTE: The `volumes` included below should match those of the `app` container (unless you know what you're doing) - nextcloud:/var/www/html:z,ro - # NOTE: The `volumes` included here should match those of the `app` container (unless you know what you're doing) depends_on: - app diff --git a/.examples/docker-compose/insecure/mariadb/fpm/web/Dockerfile b/.examples/docker-compose/insecure/mariadb/fpm/web/Dockerfile deleted file mode 100644 index 9e620aff..00000000 --- a/.examples/docker-compose/insecure/mariadb/fpm/web/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:alpine - -COPY nginx.conf /etc/nginx/nginx.conf diff --git a/.examples/docker-compose/insecure/postgres/apache/compose.yaml b/.examples/docker-compose/insecure/postgres/apache/compose.yaml index 19c75ba4..8ae34013 100644 --- a/.examples/docker-compose/insecure/postgres/apache/compose.yaml +++ b/.examples/docker-compose/insecure/postgres/apache/compose.yaml @@ -1,5 +1,8 @@ services: + # Note: PostgreSQL is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server image: postgres:alpine restart: always volumes: @@ -7,6 +10,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always diff --git a/.examples/docker-compose/insecure/postgres/fpm/compose.yaml b/.examples/docker-compose/insecure/postgres/fpm/compose.yaml index 4e268cab..8a88afd4 100644 --- a/.examples/docker-compose/insecure/postgres/fpm/compose.yaml +++ b/.examples/docker-compose/insecure/postgres/fpm/compose.yaml @@ -1,5 +1,8 @@ services: + # Note: PostgreSQL is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server image: postgres:alpine restart: always volumes: @@ -7,6 +10,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -26,14 +31,18 @@ services: - db - redis + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - build: ./web + image: nginx:alpine-slim restart: always ports: - 127.0.0.1:8080:80 volumes: + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./web/nginx.conf:/etc/nginx/nginx.conf:ro + # NOTE: The `volumes` included below should match those of the `app` container (unless you know what you're doing) - nextcloud:/var/www/html:z,ro - # NOTE: The `volumes` included here should match those of the `app` container (unless you know what you're doing) depends_on: - app diff --git a/.examples/docker-compose/insecure/postgres/fpm/web/Dockerfile b/.examples/docker-compose/insecure/postgres/fpm/web/Dockerfile deleted file mode 100644 index 9e620aff..00000000 --- a/.examples/docker-compose/insecure/postgres/fpm/web/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:alpine - -COPY nginx.conf /etc/nginx/nginx.conf diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/apache/compose.yaml b/.examples/docker-compose/with-nginx-proxy/mariadb/apache/compose.yaml index e1a461d2..e1132818 100644 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/apache/compose.yaml +++ b/.examples/docker-compose/with-nginx-proxy/mariadb/apache/compose.yaml @@ -1,6 +1,9 @@ services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: @@ -12,6 +15,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -33,9 +38,6 @@ services: depends_on: - db - redis - # Added proxy container dependency below. - # It is unclear on when or why it happens, but sometimes NC manages to start before the proxy - # and it breaks for whatever weird reason resulting in the need of manual proxy container restart. - proxy networks: - proxy-tier @@ -52,6 +54,9 @@ services: - db - redis + # Note: Nginx-proxy is an external service. You can find more information about the configuration here: + # Warning: Do not use :latest tags of nginx-proxy unless absolutely sure about the consequences. + # https://hub.docker.com/r/nginxproxy/nginx-proxy proxy: build: ./proxy restart: always @@ -69,6 +74,8 @@ services: networks: - proxy-tier + # Note: Letsencrypt companion is an external service. You can find more information about the configuration here: + # https://hub.docker.com/r/nginxproxy/acme-companion letsencrypt-companion: image: nginxproxy/acme-companion restart: always @@ -85,7 +92,7 @@ services: depends_on: - proxy -# self signed +# self signed,outdated # omgwtfssl: # image: paulczar/omgwtfssl # restart: "no" diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/apache/proxy/Dockerfile b/.examples/docker-compose/with-nginx-proxy/mariadb/apache/proxy/Dockerfile index 46fc7e26..6f449c7f 100644 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/apache/proxy/Dockerfile +++ b/.examples/docker-compose/with-nginx-proxy/mariadb/apache/proxy/Dockerfile @@ -1,3 +1,3 @@ -FROM nginxproxy/nginx-proxy:alpine +FROM nginxproxy/nginx-proxy:1.7-alpine COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/compose.yaml b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/compose.yaml index fa77198a..13d4a40b 100644 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/compose.yaml +++ b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/compose.yaml @@ -1,6 +1,9 @@ services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: @@ -12,6 +15,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -32,12 +37,16 @@ services: - redis - proxy + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - build: ./web + image: nginx:alpine-slim restart: always volumes: + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./web/nginx.conf:/etc/nginx/nginx.conf:ro + # NOTE: The `volumes` included below should match those of the `app` container (unless you know what you're doing) - nextcloud:/var/www/html:z,ro - # NOTE: The `volumes` included here should match those of the `app` container (unless you know what you're doing) environment: - VIRTUAL_HOST= - LETSENCRYPT_HOST= @@ -59,6 +68,9 @@ services: - db - redis + # Note: Nginx-proxy is an external service. You can find more information about the configuration here: + # Warning: Do not use :latest tags of nginx-proxy unless absolutely sure about the consequences. + # https://hub.docker.com/r/nginxproxy/nginx-proxy proxy: build: ./proxy restart: always @@ -75,6 +87,8 @@ services: networks: - proxy-tier + # Note: Letsencrypt companion is an external service. You can find more information about the configuration here: + # https://hub.docker.com/r/nginxproxy/acme-companion letsencrypt-companion: image: nginxproxy/acme-companion restart: always @@ -91,7 +105,7 @@ services: depends_on: - proxy -# self signed +# self signed, outdated. # omgwtfssl: # image: paulczar/omgwtfssl # restart: "no" diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/proxy/Dockerfile b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/proxy/Dockerfile index 46fc7e26..6f449c7f 100644 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/proxy/Dockerfile +++ b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/proxy/Dockerfile @@ -1,3 +1,3 @@ -FROM nginxproxy/nginx-proxy:alpine +FROM nginxproxy/nginx-proxy:1.7-alpine COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/web/Dockerfile b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/web/Dockerfile deleted file mode 100644 index 9e620aff..00000000 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/web/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:alpine - -COPY nginx.conf /etc/nginx/nginx.conf diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/apache/compose.yaml b/.examples/docker-compose/with-nginx-proxy/postgres/apache/compose.yaml index 2eb4f638..035359f0 100644 --- a/.examples/docker-compose/with-nginx-proxy/postgres/apache/compose.yaml +++ b/.examples/docker-compose/with-nginx-proxy/postgres/apache/compose.yaml @@ -1,5 +1,8 @@ services: + # Note: PostgreSQL is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server image: postgres:alpine restart: always volumes: @@ -7,6 +10,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -44,6 +49,9 @@ services: - db - redis + # Note: Nginx-proxy is an external service. You can find more information about the configuration here: + # Warning: Do not use :latest tags of nginx-proxy unless absolutely sure about the consequences. + # https://hub.docker.com/r/nginxproxy/nginx-proxy proxy: build: ./proxy restart: always @@ -60,6 +68,8 @@ services: networks: - proxy-tier + # Note: Letsencrypt companion is an external service. You can find more information about the configuration here: + # https://hub.docker.com/r/nginxproxy/acme-companion letsencrypt-companion: image: nginxproxy/acme-companion restart: always @@ -74,7 +84,7 @@ services: depends_on: - proxy -# self signed +# self signed, outdated # omgwtfssl: # image: paulczar/omgwtfssl # restart: "no" diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/apache/proxy/Dockerfile b/.examples/docker-compose/with-nginx-proxy/postgres/apache/proxy/Dockerfile index 46fc7e26..6f449c7f 100644 --- a/.examples/docker-compose/with-nginx-proxy/postgres/apache/proxy/Dockerfile +++ b/.examples/docker-compose/with-nginx-proxy/postgres/apache/proxy/Dockerfile @@ -1,3 +1,3 @@ -FROM nginxproxy/nginx-proxy:alpine +FROM nginxproxy/nginx-proxy:1.7-alpine COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/compose.yaml b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/compose.yaml index 80be65a6..78654edd 100644 --- a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/compose.yaml +++ b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/compose.yaml @@ -1,7 +1,8 @@ -version: '3' - services: + # Note: PostgreSQL is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server image: postgres:alpine restart: always volumes: @@ -9,6 +10,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -29,12 +32,16 @@ services: - redis - proxy + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - build: ./web + image: nginx:alpine-slim restart: always volumes: + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./web/nginx.conf:/etc/nginx/nginx.conf:ro + # NOTE: The `volumes` included below should match those of the `app` container (unless you know what you're doing) - nextcloud:/var/www/html:z,ro - # NOTE: The `volumes` included here should match those of the `app` container (unless you know what you're doing) environment: - VIRTUAL_HOST= - LETSENCRYPT_HOST= @@ -56,6 +63,9 @@ services: - db - redis + # Note: Nginx-proxy is an external service. You can find more information about the configuration here: + # Warning: Do not use :latest tags of nginx-proxy unless absolutely sure about the consequences. + # https://hub.docker.com/r/nginxproxy/nginx-proxy proxy: build: ./proxy restart: always @@ -72,6 +82,8 @@ services: networks: - proxy-tier + # Note: Letsencrypt companion is an external service. You can find more information about the configuration here: + # https://hub.docker.com/r/nginxproxy/acme-companion letsencrypt-companion: image: nginxproxy/acme-companion restart: always @@ -88,7 +100,7 @@ services: depends_on: - proxy -# self signed +# self signed, outdated # omgwtfssl: # image: paulczar/omgwtfssl # restart: "no" diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/proxy/Dockerfile b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/proxy/Dockerfile index 46fc7e26..6f449c7f 100644 --- a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/proxy/Dockerfile +++ b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/proxy/Dockerfile @@ -1,3 +1,3 @@ -FROM nginxproxy/nginx-proxy:alpine +FROM nginxproxy/nginx-proxy:1.7-alpine COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/web/Dockerfile b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/web/Dockerfile deleted file mode 100644 index 9e620aff..00000000 --- a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/web/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:alpine - -COPY nginx.conf /etc/nginx/nginx.conf 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..962f1bca 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 \ @@ -166,7 +150,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 +160,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/29/fpm-alpine/Dockerfile b/29/fpm-alpine/Dockerfile index 822e0428..937ae5dc 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 \ @@ -146,7 +130,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 +138,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/29/fpm/Dockerfile b/29/fpm/Dockerfile index 48dde6a8..2d5ff91a 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 \ @@ -151,7 +135,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 29.0.15 +ENV NEXTCLOUD_VERSION 29.0.16 RUN set -ex; \ fetchDeps=" \ @@ -161,8 +145,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/30/apache/Dockerfile b/30/apache/Dockerfile index ec40778c..31d62217 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 \ @@ -166,7 +150,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 +160,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/30/fpm-alpine/Dockerfile b/30/fpm-alpine/Dockerfile index 5259dc11..09e10d33 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 \ @@ -146,7 +130,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 +138,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/30/fpm/Dockerfile b/30/fpm/Dockerfile index cb4828a3..8cbb07d3 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 \ @@ -151,7 +135,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 30.0.9 +ENV NEXTCLOUD_VERSION 30.0.10 RUN set -ex; \ fetchDeps=" \ @@ -161,8 +145,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/31/apache/Dockerfile b/31/apache/Dockerfile index 3365bc32..6421c7b0 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 \ @@ -166,7 +150,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 +160,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/31/fpm-alpine/Dockerfile b/31/fpm-alpine/Dockerfile index 97b06ac0..a20a12e8 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 \ @@ -146,7 +130,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 +138,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/31/fpm/Dockerfile b/31/fpm/Dockerfile index 251db349..92f3935c 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 \ @@ -151,7 +135,7 @@ RUN { \ VOLUME /var/www/html -ENV NEXTCLOUD_VERSION 31.0.3 +ENV NEXTCLOUD_VERSION 31.0.4 RUN set -ex; \ fetchDeps=" \ @@ -161,8 +145,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..e3b88f14 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 @@ -237,12 +252,14 @@ 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 diff --git a/Dockerfile-alpine.template b/Dockerfile-alpine.template index 2295bddf..cf6af0ff 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%% \ diff --git a/Dockerfile-debian.template b/Dockerfile-debian.template index 8734caa9..cadae18a 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%% \ diff --git a/README.md b/README.md index 7de62124..6deac39e 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Most Nextcloud Server administrative matters are covered in the official [Nextcl [![Discourse Users](https://img.shields.io/discourse/users?server=https%3A%2F%2Fhelp.nextcloud.com&label=Community%20Forum&color=blue&link=https%3A%2F%2Fhelp.nextcloud.com%2F)](https://help.nextcloud.com/) [![Discourse Posts](https://img.shields.io/discourse/posts?server=https%3A%2F%2Fhelp.nextcloud.com&label=Community%20Forum&color=blue&link=https%3A%2F%2Fhelp.nextcloud.com%2F)](https://help.nextcloud.com/) -**If you have any problems or usage questions while using the image, please ask for assistance on the [Nextcloud Community Help Forum](https://help.nextcloud.com)** rather than reporting them as "bugs" (unless they are bugs of course). This helps the -maintainers (who are volunteers) remain focused on making the image better (rather than responding solely to one-on-one support issues). (Tip: Some of the maintainers are also regular responders to help requests +**If you have any problems or usage questions while using the image, please ask for assistance on the [Nextcloud Community Help Forum](https://help.nextcloud.com)** rather than reporting them as "bugs" (unless they are bugs of course). This helps the +maintainers (who are volunteers) remain focused on making the image better (rather than responding solely to one-on-one support issues). (Tip: Some of the maintainers are also regular responders to help requests on the [community help forum](https://help.nextcloud.com/).) For the image specifically, we provide [some simple deployment examples](https://github.com/nextcloud/docker/?tab=readme-ov-file#running-this-image-with-docker-compose) as well as some more extensive [deployment examples](https://github.com/nextcloud/docker/tree/master/.examples). In addition, the [community help forum](https://help.nextcloud.com/) has a "how-to" section with further examples of other peoples' container based Nextcloud stacks. @@ -82,7 +82,7 @@ Database: ```console $ docker run -d \ -v db:/var/lib/mysql \ -mariadb:10.11 +mariadb:lts ``` ### Additional volumes @@ -183,11 +183,11 @@ The `--private` flag can also be specified, in order to output all configuration ## Auto configuration via environment variables -The Nextcloud image supports auto configuration of the Nextcloud Server installation via environment variables. You can preconfigure everything that would otherwise be prompted for by the Nextcloud Installation Wizard (as well as a few other key parameters relevant to initial installation). +The Nextcloud image supports auto configuration of the Nextcloud Server installation via environment variables. You can preconfigure everything that would otherwise be prompted for by the Nextcloud Installation Wizard (as well as a few other key parameters relevant to initial installation). ### Database parameters -To enable auto configuration, define your database connection via the following environment variables. If you set any group of values (i.e. all of `MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD`, `MYSQL_HOST`), they will not be requested via the Installation Wizard on first run. +To enable auto configuration, define your database connection via the following environment variables. If you set any group of values (i.e. all of `MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD`, `MYSQL_HOST`), they will not be requested via the Installation Wizard on first run. You must specify all of the environment variables for a given database or the database environment variables defaults to SQLITE. ONLY use one database type! @@ -271,8 +271,8 @@ Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/adm ### Object Storage (Primary Storage) -By default, Nextcloud stores all files in `/var/www/html/data/` (or whatever custom data directory you've configured). Nextcloud also allows the use of object storages (like OpenStack -Swift or any Amazon S3-compatible implementation) as *Primary Storage*. This semi-replaces the default storage of files in the data directory. Note: This data directory might still be +By default, Nextcloud stores all files in `/var/www/html/data/` (or whatever custom data directory you've configured). Nextcloud also allows the use of object storages (like OpenStack +Swift or any Amazon S3-compatible implementation) as *Primary Storage*. This semi-replaces the default storage of files in the data directory. Note: This data directory might still be used for compatibility reasons and still needs to exist. Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html) for more information. To use an external S3 compatible object store as primary storage, set the following variables: @@ -289,6 +289,15 @@ To use an external S3 compatible object store as primary storage, set the follow - `OBJECTSTORE_S3_OBJECT_PREFIX` (default: `urn:oid:`): Prefix to prepend to the fileid - `OBJECTSTORE_S3_AUTOCREATE` (default: `true`): Create the container if it does not exist - `OBJECTSTORE_S3_SSE_C_KEY` (not set by default): Base64 encoded key with a maximum length of 32 bytes for server side encryption (SSE-C) +- `OBJECTSTORE_S3_CONCURRENCY` defines the maximum number of concurrent multipart uploads +- `OBJECTSTORE_S3_PROXY` (default: `false`) +- `OBJECTSTORE_S3_TIMEOUT` (not set by default) +- `OBJECTSTORE_S3_UPLOADPARTSIZE` (not set by default) +- `OBJECTSTORE_S3_PUTSIZELIMIT` (not set by default) +- `OBJECTSTORE_S3_USEMULTIPARTCOPY` (default: `false`) +- `OBJECTSTORE_S3_COPYSIZELIMIT` (not set by default) +- `OBJECTSTORE_S3_VERSION` (default: `latest`) +- `OBJECTSTORE_S3_VERIFY_BUCKET_EXISTS` (default: `true`) Setting this to `false` after confirming the bucket has been created may provide a performance benefit, but may not be possible in multibucket scenarios. Check the [Nextcloud documentation](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html#simple-storage-service-s3) for more information. @@ -403,8 +412,11 @@ Make sure to pass in values for `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` varia ```yaml services: + # Note: MariaDB is external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts restart: always command: --transaction-isolation=READ-COMMITTED volumes: @@ -415,6 +427,8 @@ services: - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -451,8 +465,11 @@ Make sure to pass in values for `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` varia ```yaml services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts restart: always command: --transaction-isolation=READ-COMMITTED volumes: @@ -463,6 +480,8 @@ services: - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -481,15 +500,18 @@ services: - MYSQL_USER=nextcloud - MYSQL_HOST=db + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - image: nginx + image: nginx:alpine-slim restart: always ports: - 8080:80 depends_on: - app volumes: - - ./nginx.conf:/etc/nginx/nginx.conf:ro + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./nginx.conf:/etc/nginx/nginx.conf:ro volumes_from: - app @@ -502,9 +524,9 @@ Then run `docker compose up -d`, now you can access Nextcloud at http://localhos # Docker Secrets -As an alternative to passing sensitive information via environment variables, `_FILE` may be appended to some the previously listed environment variables, causing the initialization script to load the values for those variables from files present in the container. In particular, this can be used to load passwords from Docker secrets stored in `/run/secrets/` files. +As an alternative to passing sensitive information via environment variables, `_FILE` may be appended to some the previously listed environment variables, causing the initialization script to load the values for those variables from files present in the container. In particular, this can be used to load passwords from Docker secrets stored in `/run/secrets/` files. -Currently, this is only supported for `NEXTCLOUD_ADMIN_PASSWORD`, `NEXTCLOUD_ADMIN_USER`, `MYSQL_DATABASE`, `MYSQL_PASSWORD`, `MYSQL_USER`, `POSTGRES_DB`, `POSTGRES_PASSWORD`, `POSTGRES_USER`, `REDIS_HOST_PASSWORD`, `SMTP_PASSWORD`, `OBJECTSTORE_S3_KEY`, and `OBJECTSTORE_S3_SECRET`. +Currently, this is only supported for `NEXTCLOUD_ADMIN_PASSWORD`, `NEXTCLOUD_ADMIN_USER`, `MYSQL_DATABASE`, `MYSQL_PASSWORD`, `MYSQL_USER`, `POSTGRES_DB`, `POSTGRES_PASSWORD`, `POSTGRES_USER`, `REDIS_HOST_PASSWORD`, `SMTP_PASSWORD`, `OBJECTSTORE_S3_KEY`, and `OBJECTSTORE_S3_SECRET`. If you set any group of `_FILE` based values (i.e. all of `MYSQL_DATABASE_FILE`, `MYSQL_USER_FILE`, `MYSQL_PASSWORD_FILE`), their non-`_FILE` counterparts will be ignored (`MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD`). @@ -514,8 +536,11 @@ Example: ```yaml services: + # Note: PostgreSQL is external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: - image: postgres + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: postgres:alpine restart: always volumes: - db:/var/lib/postgresql/data @@ -527,6 +552,8 @@ services: - postgres_db - postgres_password - postgres_user + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -583,7 +610,7 @@ We recommend using a reverse proxy in front of your Nextcloud installation. Your In our [examples](https://github.com/nextcloud/docker/tree/master/.examples) section we have an example for a fully automated setup using a reverse proxy, a container for [Let's Encrypt](https://letsencrypt.org/) certificate handling, database and Nextcloud. It uses the popular [nginx-proxy](https://github.com/nginx-proxy/nginx-proxy) and [acme-companion](https://github.com/nginx-proxy/acme-companion) containers. Please check the according documentations before using this setup. # First use -When you first access your Nextcloud, the setup wizard will appear and ask you to choose an administrator account username, password and the database connection (unless of course you've provided all the necessary auto-config config values ahead of time). +When you first access your Nextcloud, the setup wizard will appear and ask you to choose an administrator account username, password and the database connection (unless of course you've provided all the necessary auto-config config values ahead of time). For the database use `db` as host and `nextcloud` as table and user name. Also enter the password you chose in your `compose.yaml` file. @@ -740,7 +767,7 @@ You're already using Nextcloud and want to switch to docker? Great! Here are som ## Migrating from a non-Alpine image to an Alpine image -If you already use one of our non-Alpine images, but want to switch to an Alpine-based image, you may experience permissions problems with your existing volumes. This is because the Alpine images uses a different user ID for `www-data`. +If you already use one of our non-Alpine images, but want to switch to an Alpine-based image, you may experience permissions problems with your existing volumes. This is because the Alpine images uses a different user ID for `www-data`. So, you must change the ownership of the `/var/www/html` (or `$NEXTCLOUD_DATA_DIR`) folder to be compatible with Alpine: ```console @@ -751,9 +778,9 @@ After changing the permissions, restart the container and the permission errors # Reporting bugs or suggesting enhancements -If you believe you've found a bug in the image itself (or have an enhancement idea specific to the image), please [search for already reported bugs and enhancement ideas](https://github.com/nextcloud/docker/issues). +If you believe you've found a bug in the image itself (or have an enhancement idea specific to the image), please [search for already reported bugs and enhancement ideas](https://github.com/nextcloud/docker/issues). -If there is a relevant existing open issue, you can either add to the discussion there or upvote it to indicate you're impacted by (or interested in) the same issue. +If there is a relevant existing open issue, you can either add to the discussion there or upvote it to indicate you're impacted by (or interested in) the same issue. If you believe you've found a new bug, please create a new Issue so that others can try to reproduce it and remediation can be tracked. @@ -762,8 +789,8 @@ If you believe you've found a new bug, please create a new Issue so that others ![GitHub Issues or Pull Requests by label](https://img.shields.io/github/issues/nextcloud/docker/enhancement?style=flat&label=Enhancement%20Ideas&color=green) ![GitHub Issues or Pull Requests by label](https://img.shields.io/github/issues/nextcloud/docker/good%20first%20issue?style=flat&label=Good%20First%20Issues) -**If you have any problems or usage questions while using the image, please ask for assistance on the [Nextcloud Community Help Forum](https://help.nextcloud.com)** rather than reporting them as "bugs" (unless they really are bugs of course). This helps the -maintainers (who are volunteers) remain focused on making the image better (rather than responding solely to one-on-one support issues). (Tip: Some of the maintainers are also regular responders to help requests +**If you have any problems or usage questions while using the image, please ask for assistance on the [Nextcloud Community Help Forum](https://help.nextcloud.com)** rather than reporting them as "bugs" (unless they really are bugs of course). This helps the +maintainers (who are volunteers) remain focused on making the image better (rather than responding solely to one-on-one support issues). (Tip: Some of the maintainers are also regular responders to help requests on the [Nextcloud Community Help Forum](https://help.nextcloud.com).) [![Discourse Users](https://img.shields.io/discourse/users?server=https%3A%2F%2Fhelp.nextcloud.com&label=Community%20Forum&color=blue&link=https%3A%2F%2Fhelp.nextcloud.com%2F)](https://help.nextcloud.com/) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 8e178f2e..e3b88f14 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 @@ -237,12 +252,14 @@ 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 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",