diff --git a/Containers/nextcloud/config/aio.config.php b/Containers/nextcloud/config/aio.config.php index 7c80b6ba..497b2cf0 100644 --- a/Containers/nextcloud/config/aio.config.php +++ b/Containers/nextcloud/config/aio.config.php @@ -2,4 +2,5 @@ $CONFIG = array ( 'one-click-instance' => true, 'one-click-instance.user-limit' => 100, + 'update_channel' => 'stable', ); diff --git a/Containers/nextcloud/entrypoint.sh b/Containers/nextcloud/entrypoint.sh index 07e0ae24..61692a28 100644 --- a/Containers/nextcloud/entrypoint.sh +++ b/Containers/nextcloud/entrypoint.sh @@ -419,41 +419,12 @@ EOF # AIO update to latest start # Do not remove or change this line! if [ "$INSTALL_LATEST_MAJOR" = yes ]; then - php /var/www/html/occ config:system:set updatedirectory --value="/nc-updater" - INSTALLED_AT="$(php /var/www/html/occ config:app:get core installedat)" - if [ -n "${INSTALLED_AT}" ]; then - # Set the installdat to 00 which will allow to skip staging and install the next major directly - # shellcheck disable=SC2001 - INSTALLED_AT="$(echo "${INSTALLED_AT}" | sed "s|[0-9][0-9]$|00|")" - php /var/www/html/occ config:app:set core installedat --value="${INSTALLED_AT}" - fi - php /var/www/html/updater/updater.phar --no-interaction --no-backup - if ! php /var/www/html/occ -V || php /var/www/html/occ status | grep maintenance | grep -q 'true'; then - echo "Installation of Nextcloud failed!" - touch "$NEXTCLOUD_DATA_DIR/install.failed" + if ! bash /upgrade-latest-major.sh; then + echo "Upgrade to latest major version failed! Check the output above for details." exit 1 fi # shellcheck disable=SC2016 installed_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')" - INSTALLED_MAJOR="${installed_version%%.*}" - IMAGE_MAJOR="${image_version%%.*}" - # If a valid upgrade path, trigger the Nextcloud built-in Updater - if ! [ "$INSTALLED_MAJOR" -gt "$IMAGE_MAJOR" ]; then - php /var/www/html/updater/updater.phar --no-interaction --no-backup - if ! php /var/www/html/occ -V || php /var/www/html/occ status | grep maintenance | grep -q 'true'; then - echo "Installation of Nextcloud failed!" - # TODO: Add a hint here about what to do / where to look / updater.log? - touch "$NEXTCLOUD_DATA_DIR/install.failed" - exit 1 - fi - # shellcheck disable=SC2016 - installed_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')" - fi - php /var/www/html/occ config:system:set updatechecker --type=bool --value=true - php /var/www/html/occ app:enable nextcloud-aio --force - php /var/www/html/occ db:add-missing-columns - php /var/www/html/occ db:add-missing-primary-keys - yes | php /var/www/html/occ db:convert-filecache-bigint fi # AIO update to latest end # Do not remove or change this line! diff --git a/Containers/nextcloud/upgrade-latest-major.sh b/Containers/nextcloud/upgrade-latest-major.sh new file mode 100644 index 00000000..20fceb89 --- /dev/null +++ b/Containers/nextcloud/upgrade-latest-major.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# shellcheck disable=SC2016 +image_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')" +IMAGE_MAJOR="${image_version%%.*}" + +php /var/www/html/occ config:system:set updatedirectory --value="/nc-updater" +INSTALLED_AT="$(php /var/www/html/occ config:app:get core installedat)" +if [ -n "${INSTALLED_AT}" ]; then + # Set the installedat to 00 which will allow to skip staging and install the next major directly + # shellcheck disable=SC2001 + INSTALLED_AT="$(echo "${INSTALLED_AT}" | sed "s|[0-9][0-9]$|00|")" + php /var/www/html/occ config:app:set core installedat --value="${INSTALLED_AT}" +fi +php /var/www/html/updater/updater.phar --no-interaction --no-backup +if ! php /var/www/html/occ -V || php /var/www/html/occ status | grep maintenance | grep -q 'true'; then + echo "Installation of Nextcloud failed!" + touch "$NEXTCLOUD_DATA_DIR/install.failed" + exit 1 +fi +# shellcheck disable=SC2016 +installed_version="$(php -r 'require "/var/www/html/version.php"; echo implode(".", $OC_Version);')" +INSTALLED_MAJOR="${installed_version%%.*}" +# If a valid upgrade path, trigger the Nextcloud built-in Updater +if ! [ "$INSTALLED_MAJOR" -gt "$IMAGE_MAJOR" ]; then + php /var/www/html/updater/updater.phar --no-interaction --no-backup + if ! php /var/www/html/occ -V || php /var/www/html/occ status | grep maintenance | grep -q 'true'; then + echo "Installation of Nextcloud failed!" + # TODO: Add a hint here about what to do / where to look / updater.log? + touch "$NEXTCLOUD_DATA_DIR/install.failed" + exit 1 + fi +fi +php /var/www/html/occ config:system:set updatechecker --type=bool --value=true +php /var/www/html/occ app:enable nextcloud-aio --force +php /var/www/html/occ db:add-missing-columns +php /var/www/html/occ db:add-missing-primary-keys +yes | php /var/www/html/occ db:convert-filecache-bigint diff --git a/php/public/index.php b/php/public/index.php index 8d109a7f..84819a68 100644 --- a/php/public/index.php +++ b/php/public/index.php @@ -104,6 +104,7 @@ $app->post('/api/docker/backup-test', AIO\Controller\DockerController::class . ' $app->post('/api/docker/restore', AIO\Controller\DockerController::class . ':StartBackupContainerRestore'); $app->post('/api/docker/stop', AIO\Controller\DockerController::class . ':StopContainer'); $app->post('/api/docker/backup-reset-location', AIO\Controller\DockerController::class . ':DeleteBorgBackupConfig'); +$app->post('/api/docker/nextcloud-upgrade-to-latest-major', AIO\Controller\DockerController::class . ':RunNextcloudUpgradeToLatestMajor'); $app->post('/api/docker/prune', AIO\Controller\DockerController::class . ':SystemPrune'); $app->get('/api/docker/logs', AIO\Controller\DockerController::class . ':GetLogs'); $app->post('/api/auth/login', AIO\Controller\LoginController::class . ':TryLogin'); diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php index 66e8a3e2..bae9bfd6 100644 --- a/php/src/Controller/DockerController.php +++ b/php/src/Controller/DockerController.php @@ -14,6 +14,7 @@ use Slim\Psr7\NonBufferedBody; readonly class DockerController { private const string TOP_CONTAINER = 'nextcloud-aio-apache'; + private const string LATEST_MAJOR_VERSION = '33'; public function __construct( private DockerActionManager $dockerActionManager, @@ -221,7 +222,7 @@ readonly class DockerController { } if (isset($request->getParsedBody()['install_latest_major'])) { - $installLatestMajor = '33'; + $installLatestMajor = self::LATEST_MAJOR_VERSION; } else { $installLatestMajor = ''; } @@ -333,6 +334,20 @@ readonly class DockerController { return $response->withStatus(201)->withHeader('Location', '.'); } + public function RunNextcloudUpgradeToLatestMajor(Request $request, Response $response, array $args) : Response { + $this->configurationManager->installLatestMajor = self::LATEST_MAJOR_VERSION; + + // Get streaming response start and closure + $nonbufResp = $this->startStreamingResponse($response); + $addToStreamingResponseBody = $this->getPlainStreamingCallback($nonbufResp); + + $this->dockerActionManager->RunNextcloudUpgradeToLatestMajor($addToStreamingResponseBody); + + // End streaming response + $this->finalizeStreamingResponse($nonbufResp); + return $nonbufResp; + } + public function SystemPrune(Request $request, Response $response, array $args) : Response { // Get streaming response start and closure $nonbufResp = $this->startStreamingResponse($response); @@ -430,12 +445,18 @@ readonly class DockerController { // if it'll actually pull an image), but which should not need to know anything about the // wanted markup or formatting. $addToStreamingResponseBody = function (Container $container, string $message) use ($nonbufResp) : void { - $nonbufResp->getBody()->write("
If you haven't upgraded to Nextcloud Hub {{ newMajorVersionString }} yet and want to do that now, feel free to follow this documentation
+If you haven't upgraded to Nextcloud Hub {{ newMajorVersionString }} yet and want to do that now, feel free to click the button below. ⚠️ Warning: make sure to create a backup before clicking the button as the update can go wrong and will leave your instance in a broken state!
+