Nextcloud 16 へのアップデート方法について

# はじめに
[Nextcloud](https://nextcloud.com/)は、自前のサーバを使って手軽にセキュアなファイル共有環境を実現できるオンラインストレージです。
2019年4月25日に最新メジャーアップデートとして Nextcloud 16 がリリースされました。
今回は、Nextcloud 16 へのアップデートの手順をまとめます。

# おおまかな手順
1. データベースのバックアップ。
2. Nextcloud 15 の最新版にアップデート。
3. Nextcloud 16 をダウンロードし配備。
4. アップグレードコマンド実施。

# サーバ環境
今回の手順は、以下の環境で実施しております。

* Nextcloud 15.0.5
* CentOS7
* Nginx
* PHP 7.2
* MariaDB 10.3
* Redis 3.2

# 細かい手順
## 1. データベースのバックアップ
データベースの変更を伴うため、作業前にデータベースのバックアップをおすすめします。
今回の環境は MariaDB となりますので、以下のようなコマンドでバックアップを取得します。

```
$ mysqldump -u root -p nextcloud > backup.sql
```

* `nextcloud` は Nextcloud で利用しているデータベース名を指定します。
* `backup.sql` は バックアップデータの出力パス／ファイル名を指定します。

## 2. Nextcloud 15 の最新版にアップデート
Nextcloud 16 にアップデートするには、アップデートしようとする Nextcloud を Nextcloud 15 の最新版にアップデートしておく必要があります。
今回の環境は Nextcloud 15.0.5 なので、現時点(2019年4月28日)の最新版である 15.0.7 にアップデートします。

※もし現在の Nextcloud のバージョンが 14 以下の場合は、メジャーバージョンを一つずつ上げていく必要があります(例: Nextcloud 13 からアップデートするには、 13 → 13の最新版 → 14の最新版 → 15の最新版というように順番にあげていきます)。手順としてはこの手順を繰り返す形となります。

まず、最新版のアップデートが取得できる状態か確認します。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ update:check
Nextcloud 15.0.7 is available. Get more information on how to update at https://docs.nextcloud.com/server/15/admin_manual/maintenance/upgrade.html.
1 update available
```
`1 update available` のような表示があればアップデートが可能です。

引き続いてアップデートを実行します。

```
$ sudo -u nginx php /var/www/html/nextcloud/updater/updater.phar 
Nextcloud Updater - version: v14.0.2RC2-7-g57268cb

Current version is 15.0.5.

Update to Nextcloud 15.0.7 available. (channel: "stable")
Following file will be downloaded automatically: https://download.nextcloud.com/server/releases/nextcloud-15.0.7.zip

Steps that will be executed:
[ ] Check for expected files
[ ] Check for write permissions
[ ] Create backup
[ ] Downloading
[ ] Verify integrity
[ ] Extracting
[ ] Enable maintenance mode
[ ] Replace entry points
[ ] Delete old files
[ ] Move new files in place
[ ] Done

Start update? [y/N] 
```
`y` を入力し、しばらく待ちます。

```
Start update? [y/N] y

Info: Pressing Ctrl-C will finish the currently running step and then stops the updater.

[✔] Check for expected files
[✔] Check for write permissions
[✔] Create backup
[✔] Downloading
[✔] Verify integrity
[✔] Extracting
[✔] Enable maintenance mode
[✔] Replace entry points
[✔] Delete old files
[✔] Move new files in place
[✔] Done

Update of code successful.

Should the "occ upgrade" command be executed? [Y/n] 
```
`Y` を入力します。

```
Should the "occ upgrade" command be executed? [Y/n] Y
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 log level to debug
Updating database schema
Updated database
Checking for update of app accessibility in appstore
Checked for update of app "accessibility" in appstore 
〜〜〜 (中略) 〜〜〜
Checking for update of app workflowengine in appstore
Checked for update of app "workflowengine" in appstore 
Starting code integrity check...
Finished code integrity check
Update successful
Maintenance mode is kept active
Reset log level

Keep maintenance mode active? [y/N] 
```
`N` を入力して、メンテナンスモードを抜けます。

アップデート後のバージョンを確認します。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ status
  - installed: true
  - version: 15.0.7.0
  - versionstring: 15.0.7
  - edition: 
```
あとは Nextcloud にアクセスできるかどうかを確認します。

## 3. Nextcloud 16 をダウンロードし配備。
Nextcloud 16 のアップデートについては少しずつ展開されてきますが、すぐにアップデートがおりてきません。このため、手動でアップデートを行います。

まず、Nextcloud 16 のパッケージをダウンロードしてきます。チェックサムも確認します。

```
$ wget https://download.nextcloud.com/server/releases/nextcloud-16.0.0.tar.bz2
--2019-04-28 16:30:43--  https://download.nextcloud.com/server/releases/nextcloud-16.0.0.tar.bz2
Resolving download.nextcloud.com (download.nextcloud.com)... 176.9.217.52
Connecting to download.nextcloud.com (download.nextcloud.com)|176.9.217.52|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 61731904 (59M) [application/x-bzip2]
Saving to: ‘nextcloud-16.0.0.tar.bz2’

100%[==============================================================>] 61,731,904  6.77MB/s   in 27s    

2019-04-28 16:31:11 (2.22 MB/s) - ‘nextcloud-16.0.0.tar.bz2’ saved [61731904/61731904]
```

```
$ wget https://download.nextcloud.com/server/releases/nextcloud-16.0.0.tar.bz2.md5
--2019-04-28 16:31:13--  https://download.nextcloud.com/server/releases/nextcloud-16.0.0.tar.bz2.md5
Resolving download.nextcloud.com (download.nextcloud.com)... 176.9.217.52
Connecting to download.nextcloud.com (download.nextcloud.com)|176.9.217.52|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 59 [application/x-bzip2]
Saving to: ‘nextcloud-16.0.0.tar.bz2.md5’

100%[==============================================================>] 59          --.-K/s   in 0s      

2019-04-28 16:31:15 (3.41 MB/s) - ‘nextcloud-16.0.0.tar.bz2.md5’ saved [59/59]
```

```
$ md5sum -c nextcloud-16.0.0.tar.bz2.md5 < nextcloud-16.0.0.tar.bz2
nextcloud-16.0.0.tar.bz2: OK
```

ダウンロードした Nextcloud 16 パッケージを展開します。

```
$ tar xf nextcloud-16.0.0.tar.bz2
```

アップデート作業中に Nextcloud にアクセスが来ないように一時的にメンテナンスモードにします。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ maintenance:mode --on
Maintenance mode enabled
```

現在の Nextcloud をバックアップしておきます。

```
$ sudo mv /var/www/html/nextcloud/ /var/www/html/nextcloud15
```

取得した Nextcloud 16 を配備します。

```
$ sudo mv nextcloud /var/www/html/
```

先にバックアップした Nextcloud から `config.php` をコピーします。

```
$ sudo cp -pi /var/www/html/nextcloud15/config/config.php /var/www/html/nextcloud/config/
$ ll /var/www/html/nextcloud/config/config.php 
-rw-r-----. 1 nginx nginx 946  4月 28 16:55 /var/www/html/nextcloud/config/config.php
```

Nextcloud システムディレクトリの所有者情報を変更します。

```
$ sudo chown -R nginx. /var/www/html/nextcloud/
```

## 4. アップグレードコマンド実施。
Nextcloud 16 に移行する準備が整いましたので、Nextcloud 16 へのアップデートを実行します。

```
$ sudo -u nginx php /var/www/html/nextcloud/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
Set log level to debug
Updating database schema
Updated database

〜〜〜 (中略) 〜〜〜

Starting code integrity check...
Finished code integrity check
Update successful
Maintenance mode is kept active
Reset log level
```

現在のバージョンを確認します。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ status
  - installed: true
  - version: 16.0.0.9
  - versionstring: 16.0.0
  - edition: 
```

メンテナンスモードを元に戻します。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ maintenance:mode --off
```

# あとがき
Nextcloud 16 では様々な新機能が盛り込まれております。Nextcloud のメジャーアップデートを実施するには、直前の最新バージョンにアップデートをしておく必要があるため、メジャーバージョンがかなり古いものの場合、一つずつアップデートしていく手間はありますが、手順はそれほど難しくないので、参考にしてみてください。

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**