MediaWikiをバージョンアップしてみた(1.22 -> 1.33)

# はじめに

当方のサイトでは、とある情報を収集するためにMediaWikiを使用しています。
5～6年前から運用していましたが、諸事情によりWikiを入れているVPSのOSをごっそり入れ替えたときにMediaWikiもバージョンアップしたので手順を共有しておきます。

# 背景

当方のVPS(某さくら)でOSを入れ替えた差分をリストアップすると…

**旧環境**

* Ubuntu14.04
* Apache2
* PHP 5.3
* MySQL5.X
* MediaWiki 1.22

**新環境**

* CentOS 7
* nginx + Let's Encrypt(https化済み)
* PHP 7.3(remi経由、PHP-FPM組み込み済み)
* MySQL8.0(mysql_native_password化済み -> [参考](https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917))
* MediaWiki 1.33

ほら、だいぶ変わってるでしょう(もともとは、WordPressの新バージョンでPHP5.3が使えなくなり、仕方なくPHP7.3に上げようとしたのが発端です)？
特に、MediaWikiのバージョンアップで、今までのDBの仕様に変更があったり、必要なPHPのバージョンが上がってしまったため、しっかりと手順を踏む必要がありました。

# 作業手順

MediaWikiのページにバージョンアップ方法が書かれているのでそれを参考にしました。

* [Manual:Upgrading](https://www.mediawiki.org/wiki/Manual:Upgrading)

## 0.前準備

WikiのソースやDBはバックアップしておいてローカルマシンに保存していましたので、ソースとDBダンプファイルを新環境に転送しておきます。

また、バージョンアップに必要な`git`や`wget`も準備しておきます。

## 1.DBを用意する

まずは、DBをリストアして、Wiki用のユーザを作り、権限を付与します(DB名・ユーザ名は前バージョンを踏襲します)。

```bash
mysql -u root -p -e 'create database hogewiki;'
mysql hogewiki -u root -p < hoge.sql
mysql -u root -p -e "create user `hogewikiuser`@`localhost` identified by '****************';"
mysql -u root -p -e "grant all on hogewiki.* to `hogewikiuser`@`localhost`;"
```

## 2.MediaWikiの新バージョンをDLする

MediaWikiはGitで管理していますので、MediaWikiの最新コアをCloneします([参考:Git からのダウンロード](https://www.mediawiki.org/wiki/Download_from_Git/ja))。
ついでに、オーナーをnginxにしています(ここらへんは任意)

```bash
cd /path/to/nginx/documentroot
git clone https://gerrit.wikimedia.org/r/mediawiki/core.git --branch REL1_33 hogewiki
chown -R nginx:nginx hogewiki
```

[2019.10.21追記]MediaWikiのtarballをDLすればSkinやExtensionがある程度揃っているそうです(rxyさんありがとうございます)

```
wget https://releases.wikimedia.org/mediawiki/1.33/mediawiki-1.33.1.tar.gz
tar zxvf mediawiki-1.33.1.tar.gz
mv mediawiki hogewiki
chown -R nginx:nginx hogewiki
```

## 3.LocalSettings.phpのコピー

旧バージョンの`LocalSettings.php`を新環境にコピーします。

```bash
cd hogewiki
cp /path/to/old/wiki/LocalSettings.php .
```

## 4.ロゴの差し替え

旧バージョンと新バージョンのロゴファイルを格納するディレクトリが変わっていましたので、新しい場所にコピーして、`LocalSettings.php`を修正しておきます。

```bash
cp /path/to/old/wiki/skins/common/logo.png ./resources/assets/
```

```(修正前)LocalSettings.php
$wgLogo             = "$wgStylePath/common/images/logo.png";
```

```(修正後)LocalSettings.php
$wgLogo             = "{$wgScriptPath}/resources/assets/logo.png";
```

## 5.APC/OPCacheのインストール

MediaWikiの新バージョンでは、キャッシュシステム導入を促されます。そのため、`apcu`と`opcache`をインストールします(設定値はお好みで)

```bash
sudo yum -y install --enablerepo=remi,remi-php73 php-pecl-apc php-opcache
```

インストールの反映のためにphp-fpmとnginxの再起動を忘れずに…

```bash
systemctl restart php-fpm.service
systemctl restart nginx.service
```

## 6. パッケージ依存関係解消

`Compose`でサクッと解消していきます。

```bash
compose --no-dev
```

## 7. スキンのインストール

後述の拡張機能でもそうなのですが、DLしたMediaWikiの状態では、まだスキンのファイルが取り込まれていないので手動で取り込みます。
もともと、Wikipediaみたいな見た目になるVectorを使用していましたので引き続き使用します。
`wfLoadSkin`関数はバージョン1.25から組み込まれたもののようですね

```(修正前)LocalSettings.php
$wgDefaultSkin = "vector";
```

```(修正後)LocalSettings.php
wfLoadSkin("Vector");
```

スキンをDLする際は、使用するMediaWikiのバージョンに合わせたものが必要になります。以下のリンク先から最適なDLリンクを取得します。

* [Download MediaWiki skin(Vector)](https://www.mediawiki.org/wiki/Special:SkinDistributor/Vector)

```bash
cd skins
wget https://extdist.wmflabs.org/dist/skins/Vector-REL1_33-878c1e8.tar.gz
tar zxvf Vector-REL1_33-878c1e8.tar.gz
cd ..
```

[2019.10.21追記]Gitからでも以下の方法で落とせるそうです(rxyさんありがとうございます)

```bash
cd skins
rm -rf Vector # 念の為
git clone "https://gerrit.wikimedia.org/r/mediawiki/skins/Vector" --branch REL1_33
```

## 8.拡張機能のインストール

続いて、拡張機能をインストールします。スキンとの違いは、GitでDLできる点が大きいです。

まずは`LocalSettings.php`の修正から。`wfLoadExtension`関数もバージョン1.25から準備されているようです。

```(修正前)LocalSettings.php
require_once "$IP/extensions/Cite/Cite.php";
require_once "$IP/extensions/ConfirmEdit/ConfirmEdit.php";
require_once "$IP/extensions/Interwiki/Interwiki.php";
require_once "$IP/extensions/Nuke/Nuke.php";
require_once "$IP/extensions/ParserFunctions/ParserFunctions.php";
require_once "$IP/extensions/SimpleAntiSpam/SimpleAntiSpam.php";
require_once "$IP/extensions/SpamBlacklist/SpamBlacklist.php";
require_once "$IP/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php";
require_once "$IP/extensions/WikiEditor/WikiEditor.php";
```

```(修正後)LocalSettings.php
wfLoadExtension( "Cite" );
wfLoadExtension( "ConfirmEdit" );
wfLoadExtension( "Interwiki" );
wfLoadExtension( "Nuke" );
wfLoadExtension( "ParserFunctions" );
wfLoadExtension( "SpamBlacklist" );
wfLoadExtension( "SyntaxHighlight_GeSHi" );
wfLoadExtension( "WikiEditor" );
```

修正前後を見て、「あれ？」と思われたかたもいらっしゃるかと思いますが、`SimpleAntiSpam`が消えています。これは、アンチスパム機能がMediaWikiに統合されたことからObsoluteになったためです。

続いて、拡張機能をDLしていきます。

```bash
cd extensions
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/Cite.git
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/ConfirmEdit.git
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/Interwiki.git
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/Nuke.git
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/ParserFunctions.git
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/SpamBlacklist.git
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/SyntaxHighlight_GeSHi.git
```

…あれ、WikiEditorは？ 実は、WikiEditorをgitで取り込むとバージョン1.34以降必須となってしまうため、1.33用にDLして適応します(今振り返ると、ブランチ指定すりゃよかったんじゃね？)

* [Download MediaWiki extension(WikiEditor)](https://www.mediawiki.org/wiki/Special:ExtensionDistributor/WikiEditor)

```bash
wget https://extdist.wmflabs.org/dist/extensions/WikiEditor-REL1_33-e051a4b.tar.gz
tar zxvf WikiEditor-REL1_33-e051a4b.tar.gz
cd ..
```

[2019.10.21追記]branchを指定すれば、Gitからでも対象バージョンのものが落とせるそうです(rxyさんありがとうございます)

```bash
cd extensions
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/Cite.git --branch=REL1_33
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/ConfirmEdit.git --branch=REL1_33
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/Interwiki.git --branch=REL1_33
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/Nuke.git --branch=REL1_33
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/ParserFunctions.git --branch=REL1_33
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/SpamBlacklist.git --branch=REL1_33
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/SyntaxHighlight_GeSHi.git --branch=REL1_33
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/WikiEditor.git --branch=REL1_33
```

## 9.update.phpの実行

最後に、DBのスキーマ更新などの総仕上げを行います。やりかたは非常に単純明快で、

```bash
cd maintenance
php update.php
```

特に問題なければ、DBのマイグレーション処理が画面にログとして出てくれば成功です。
なにか足りなければ、エラーメッセージが出てきますのでその都度対応してください(当方が試したところではこの文書内でカバーしています)。

特にエラーなく終了すればバージョンアップは完了です。
あとは、nginxの設定をして再起動です。

おまけとして、当方のnginxの設定(MediaWikiに特化した部分)を共有します。

```https.conf
        location /hogewiki {
                index index.php;
                autoindex off;
                client_max_body_size 5m;
                client_body_timeout 60;
                try_files $uri $uri/ /hogewiki/index.php?$args;
        }
```

```bash
systemctl restart php-fpm.service
systemctl restart nginx.service
```

ブラウザでWikiの画面が問題なく出てくればクリアです！　おめでとうございます！

# 最後に

作業自体は2時間で済んだのでかなり早いと思います。
逆に手こずったのはnginxの設定だったりします(rewriteの設定がうまいこといかなくていかなくて…結局切ったら動いたという)

キャッシュを導入したので、表示がキビキビしている(ように見える)という嬉しい副作用があり、バージョンアップしてよかったなぁと思います。

この文書がバージョンアップの参考になればということで、このへんで締めたいと思います。