NextcloudはWebからアップデートが行えますが、
等で失敗し、リトライをしてもまた同じところで詰まるというケースが非常に多いです。
 
(例ではDownloading)で失敗しています。
そこで、その回避策(というかより安定している手段)として、コマンドラインによるアップデートを実施します。
作業確認環境 
筆者環境です。マイナーバージョンなどは実施環境に合わせます。
Ubuntu 22.04 
Nextcloud 31.03 → 31.04へのアップグレード 
Apache (ユーザwww-dataで実行) 
MySQL 
php 8.2.28 
 
さっくりとした手順 
メンテナンスモードを有効化します。 
Nextcloud一式のバックアップを行います。 
Nextcloudで用いているDBのバックアップを取ります。 
コマンドラインでアップデートがあるかのチェックを行います。 
コマンドラインでNextcloudのアップグレードを行います。 
バージョンアップを確認します。 
 
メンテナンスモードを有効化 
cd /path/to/nextcloud/root/directory && pwd 
自分の環境に合わせます。(筆者環境/home/www-data/nextcloud)
sudo -u www-data php occ maintenance:mode --on 
運用中のNextcloudのURLにアクセスし、メンテナンスモードであることを確認します。
Nextcloudのバックアップ 
sudo -u www-data cp -pir /home/www-data/nextcloud /path/to/backup/directory/nextcloud.$(date +%Y%m%d) 
退避前、退避先、バックアップ先のアクセス権限などはそれぞれ自分の環境に合わせます。 
このバックアップ方法はあくまでも例です。 
※プログラムによっては非常に膨大なファイル数が予想されます。適切なバックアップ手段を考慮してください。 
vpsなどで動かしている場合は、スナップショットを撮っておいて、後から復元した方が確実です。 
 
ls -l /path/to/backup/directory/nextcloud.$(date +%Y%m%d) 
退避先にディレクトリファイル一式があることを確認します。
mysqldumpでバックアップを取得する 
cd /hoge && pwd 
任意のディレクトリを指定します。
mysqldump -h localhost -u nextcloud -p --no-tablespaces --single-transaction nextcloud > nextcloud_backup.$(date +%Y%m%d).sql 
DB名やユーザーは自分の環境に合わせます。 
ls -la nextcloud_backup.$(date +%Y%m%d).sql 
ファイルがあることを確認します。
Nextcloudのアップグレードチェック 
cd /path/to/nextcloud/root/directory && pwd 
自分の環境に合わせます。(筆者環境/home/www-data/nextcloud)
sudo -u www-data php occ update:check 
表示例
Nextcloud 31.0.4 is available. Get more information on how to update at https://docs.nextcloud.com/server/31/admin_manual/maintenance/upgrade.html.
Update for side_menu to version 5.1.0 is available.
Update for spreed to version 21.0.4 is available. 
と出たので、アップグレードはコマンドラインでも有効です。
コマンドラインによるアップグレード 
sudo -u www-data php occ upgrade 
新しいバージョンのダウンロード 
コードの展開 
データベーススキーマの更新 
アプリの更新 
 
を一括で行ってくれるコマンドです。
Keep maintenance mode active? [y/N]  
nでメンテナンス画面から抜けます。
Webでのアップグレード確認 
管理者権限でNextcloudにブラウザでアクセスし、
管理画面からアップグレードされていること 
他の機能が使えること 
 
を確認できれば成功です。
 
切り戻し 
失敗したときの手順です。再度、バックアップ一式があることを確認してください。なお、失敗したことを前提にしているため、再度の切り戻しは一切考慮しません。
sudo rm -rf /home/www-data/nextcloud  
sudo mv /path/to/backup/directory/nextcloud.$(date +%Y%m%d) /home/www-data/nextcloud 
mysql -u root -p 
SHOW DATABASES; 
nextcloudが動いているDBであることを再確認してください。 
SELECT COUNT(*) FROM nextcloud.oc_users; 
二回ほど深呼吸して、落ち着いて作業しましょう。 
DROP DATABASE nextcloud; 
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 
EXIT 
mysql -h localhost -u nextcloud -p nextcloud < /hoge/nextcloud_backup.$(date +%Y%m%d).sql 
この後、メンテナンスモードを解除して、以前と同じ状態か確認します。
sudo -u www-data php occ maintenance:mode --off 
作業後:バックアップDBの削除 
平文でSQLがサーバ上にあるのは危険な状態なので、以下の措置を執ります。
cd /hoge && pwd 
バックアップを行ったディレクトリを指定します。
ls -la nextcloud_backup.$(date +%Y%m%d).sql 
ファイルがあることを確認します。
shred -u nextcloud_backup.$(date +%Y%m%d).sql 
ls -la nextcloud_backup.$(date +%Y%m%d).sql 
ファイルが無いことを確認します。