TrueNASプラグインのNextcloud 23を24へアップグレード

2022-10-09
  • B!

Nextcloud TrueNAS

TrueNASのNextcloudプラグインのバージョンアップ版が出たので、アップグレードを実施してみる。ファイルや写真のプレビューデータを維持したままプラグインをアップグレードする作業なので面倒かもと躊躇したが、Nextcloudはv23からv24のメジャーバージョンアップでMySQL DBへの負荷が1/4へ軽くなったと公式発表されているため、やってみることにする。

環境はTrueNAS-12.0-U8.1で、Nextcloud 23.0を24.0.5へバージョンアップする。元々のNextcloudはTrueNAS 12をインストールした時に構築したもので、TruneNASが12.0-U8.1へマイナーアップデートした時にプラグインのプリセットも更新されたというのがきっかけである。

今回のプラグインアップデートではJailがFreeBSD 12.2-RELEASEから12.3-RELEASEにアップグレードされる。ところでホストのTrueNASは

% uname -a
FreeBSD freenas.local 12.2-RELEASE-p14 FreeBSD 12.2-RELEASE-p14 325282c09a5(HEAD) TRUENAS  amd64

ということで、ホストよりもJailの方がバージョンが上になるが、メジャーバージョンのv12が同一であれば、ホストとJail間でメイナーバージョンが異なることは問題にならない。

目次

準備

スナップショットを取る

Jailの環境を丸ごとアップグレードになるので念のためスナップショットをとる。インストール作業中にも自動でスナップショットは作成されるが、自分でわかっているタイミングで取っておけば万が一作業に失敗しても元通りにできる。以下の一連のコマンドを使う。
## jail名の確認
% iocage list

## snpshotを取る
% sudo snapshot <Jail名> -n <スナップショット名>

## 元に戻す
% sudo iocage rollback -n <スナップショット名> <Jail名>

Nextcloudをメンテナンスモードに変更する

アップグレード作業中にNextcloud内のデータベースが更新されないようにNextcloudの稼働を止める。

Nextcloudのシェルにログインし、www権限のcron設定をバックアップしてから、cronを止める。cronの設定はプラグインをアップグレードするとNextcloud用のデフォルト設定に上書きされてしまうので、設定をテキストファイルへバックアップしておく。nginx + PHPで動作しているNextcloudアプリの動作を補助するコマンドを打つため、シェルをwww権限に切り替えて実行する。
$ sudo su -m www	## シェルをwww権限に切り替える
% crontab -l > mycron.txt	## バックアップ

% crontab -e
(cronの設定をコメントアウトしておく)
% exit	## www権限から出る

nextcloudをメンテナンスモードにして外部アクセスを止める。これもwww権限でシェルを実行する。
% cd /usr/local/www/nextcloud
% php ./occ maintenance:mode --on

Nextcloudがメンテナンスモード画面へ移行して停止する。
メンテナンスモード

大きなデータの退避

Nextcloudのdataディレクトリの大きなファイルを退避する。

アップグレード処理に入る前に自動でNextcloudのディレクトリ全体に対してコピーバックアップが行われる。この時、ユーザーデータやサムネイル画像のデータが大量であるとコピーに時間がかかるしディスク領域を圧迫するため退避する。先にスナップショットをとっているのでコピーバックアップせずに退避で問題ない。 /usr/local/www/nextcloud/data/<ユーザー名> や Web表示用の各写真のプレビュー画像が入っている /usr/local/www/nextcloud/data/appdata_xxxxxxxxxx/preview を別の場所へ退避させる。
退避先はどこでも良いが、/usr/local/www/nextcloud/ の外へ退避する。ここで退避したディレクトリは、アップグレード作業終了後に手作業で元の場所に戻す。

アップグレード

アップグレード作業はTrueNASのWeb画面のプラグイン管理からできなくもないが、途中でエラーが出た時に状況がよくわからなくなる点と、長時間Web画面のセッションを保ちながらの作業は正直不安である。そのためシェルから作業を行う。

updateとupgradeの違い

今回はupgradeを行う。両者の違いは以下である。
  • update     Jail内のNextcloudのバージョンアップ
  • upgrade   JailのFreeBSDのバージョンも同時に上げる 

アップグレードコマンドの実行

アップグレードコマンドはTrueNAS内のシェルから次のように書く。
% sudo iocage upgrade -r <インストールするFreeBSDのバージョン> <Jail名>
それでは、意を決してアップグレードコマンドを打つ。ワーニングやエラーがたくさん出て不安になるが致命的なものでは無いので無視で良い。
% sudo iocage upgrade -r 12.3-RELEASE nextcloud
Password:
Snapshotting dev-nextcloud…  (スナップショットは自動で取ってくれる)
Updating plugin INDEX... 
Updating plugin artifact... 
Cloning git repository

Branch 12.2-RELEASE does not exist at https://github.com/freenas/iocage-plugin-nextcloud.git!
Using "master" branch for plugin, this may not work with your RELEASE
Running upgrade... 

・・・(略)
Number of packages to be removed: 213

(これがたくさん出るけれど無視)
lua script failed
lua script failed
lua script failed

pkg: warning: database version 36 is newer than libpkg(3) version 35, but still compatible
pkg: warning: database version 36 is newer than libpkg(3) version 35, but still compatible

nextcloud-php74-24.0.5: missing file /usr/local/www/nextcloud/config/CAN_INSTALL
nextcloud-php74-24.0.5: missing file /usr/local/www/nextcloud/config/CAN_INSTALL

・・・(略)
(必要に応じて指示に従う。セキュリティ上、気にするのであれば指示通りに不要になったユーザーを後で削除しておく)

[dev-nextcloud] [16/213] Deleting files for avahi-app-0.8: .......... done
pkg: lua script failed
==> You should manually remove the "avahi" user.
pkg: lua script failed
==> You should manually remove the "avahi" group
pkg: lua script failed

[dev-nextcloud] [19/213] Deleting files for mysql80-server-8.0.29: .......... done
pkg: lua script failed
==> You should manually remove the "mysql" user.
pkg: lua script failed
==> You should manually remove the "mysql” group


[dev-nextcloud] [31/218] Deleting files for dbus-1.12.20_5: .......... done
lua script failed
==> You should manually remove the "messagebus" user.
lua script failed
==> You should manually remove the "messagebus" group
lua script failed
さらにメッセージが続く。最後はMySQLサーバへ接続できずに終わるが問題ない。Nextcloudのインストールと設定前後でDBへのローカル接続方法が異なるのかもしれない。
[dev-nextcloud] [19/213] Deinstalling mysql80-server-8.0.29...
pkg: Failed to execute lua script: [string "-- args: etc/mysql/my.cnf.sample..."]:12: attempt to call a nil value (field 'filecmp’)


Installing plugin packages:
  - ffmpeg... 
  - nextcloud-php74... 
  - php74-pecl-imagick-im7... 
    - php74-pecl-imagick-im7 failed to install, retry #1
  - php74-bcmath... 
  - php74-gmp... 
  - php74-pcntl... 
  - php74-pecl-redis... 
    - php74-pecl-redis failed to install, retry #1
  - nginx... 
    - nginx failed to install, retry #1
  - mysql80-server... 
    - mysql80-server failed to install, retry #1
  - redis... 
  - py39-fail2ban... 
    - py39-fail2ban failed to install, retry #1
  - py39-certbot... 
    - py39-certbot failed to install, retry #1
Cloning git repository


* [migrate] Migrating from 0 to 1.
writing new private key to '/usr/local/etc/letsencrypt/live/truenas/server.key'
——

(エラーが出るが我慢して待つ)
Starting mysql.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
MariaDB is unavailable - sleeping
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
MariaDB is unavailable - sleeping
mysql: [Warning] Using a password on the command line interface can be insecure.

・・・(略)

Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
Set mode for background jobs to ‘cron'

You may use your browser or the occ upgrade command to do the upgrade
ERROR - Fail to run migrations.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
No certificates found.
Saving debug log to /var/log/letsencrypt/letsencrypt.log


nextcloud successfully upgraded!
MySQLのエラーにめげずにじっくり待つ。なぜかMyySQLがローカルソケット接続でやっている点がおかしい。25分ぐらいかかって作業が完了した。サービスの起動タイミングか単体インストール時の初期設定に問題があるのかも。全部揃うと正常に動作する。

完了チェック

% iocage list
+-----+-------------------+-------+--------------+------------------+
| JID |       NAME        | STATE |   RELEASE    |       IP4        |
+=====+===================+=======+==============+==================+
| 18  | nextcloud         | up    | 12.3-RELEASE | 192.168.0.123    |
JailがFreeBSD 12.3へバージョンアップした。

NextcloudのJailを再起動。
% sudo iocage stop nextcloud 
% sudo iocage start nextcloud
この後、Nextcloudのweb画面を開いてメンテナンスモードが出ていればOK。メンテナンスモード画面が出るということは、バージョンアップ前の設定が引き継がれているということである。なお、英語表記の画面になる場合がある。

Nextcloudを元の状態に戻す

sudoの再インストール

アップグレードするとJail内のsudoがアンインストールされてしまっているので、再インストールする。sudoの設定は残っているのでsudoのpkgを入れればすぐ元に戻る。

TrueNASやJailでsudoを使えるようにする

Nextcloudのデータファイルを元に戻す

アップグレード前に退避していた /usr/local/www/nextcloud/data/ 内のファイルを元の場所に戻す。

cronを一時的に止めておく

www権限のNextcloud用のcronが既に設定されているが、まだ勝手に動いてほしくないので止めておく。手順はアプグレード前に実行したcronの止め方と同じ。

Nextcloudのメンテナンスモードを解除

www権限で
% cd /usr/local/www/nextcloud
% php ./occ maintenance:mode —off

(データアップグレードが必要の旨メッセージが出る)
Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
Maintenance mode disabled
この後でWeb画面を開くと下のような画面が出る。この画面にはDBをv23からv24形式へ移行させる「Update」ボタンがあるが、これを押すと移行作業中にhttp通信が十中八九タイムアウトするのでここでは押さないこと!
この画面の一番下に書いている通りにスクリプトをコマンドラインから実行する。
コマンドからデータのアップデートを行う。
(Nextcoudのシェルに入りwww権限で)
% cd /usr/local/www/nextcloud
% php ./occ upgrade

Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
Setting log level to debug
Turned on maintenance mode
Updating database schema

・・・(略)

Update successful
Turned off maintenance mode
Resetting log level
DBスキーマのアップグレード作業が始まるので、じっくり待つ。また、各プラグインの最新版がダウンロードされ更新される。5分ぐらいかかった。
この後、Nextcloudの通常画面が表示できるようになればOK。ログインcookieも引き継がれているので、すぐ表示できるはず。

Nextcloudの設定画面 > 概要を見ると、DBのindexを生成するようにと指示が表示されている。指示通りのコマンドを打つ。
www権限で
% cd /usr/local/www/nextcloud
% php ./occ db:add-missing-indices
画像が数万枚ある環境では、前バージョンと比較して体感できるほど画面の表示が速くなった。

その他の設定を元に戻す

最後に仕上げ。Jailのアップグレードで消えた設定やソフトウェアを元に戻す作業を行う。

cronを元に戻す

www権限のcronを元通りに戻す。

その他、インストールや設定の再実行が必要な作業

各手順はリンク先に詳しく書いている。

作業完了と所感

NASに格納しているファイル本体はTrueNASのSMB用フォルダに格納されているのだが、Nextcloudには写真プレビュー用の画像ファイルが大量にあるため、データを残してアップグレードとなると長いが手順を踏む必要があった。
しかし、upgradeコマンド一発で大部分の環境が更新できて、データマイグレーションもできたのでまずまずの出来だろう。NextcloudはSQLのオーバーヘッドがかなり減ったようで、画面表示が速くなったことは体感でもわかるぐらいだ。