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
ファイルが無いことを確認します。