LoginSignup
3
4

Mediawikiのメジャーアップグレードの作業メモ

Last updated at Posted at 2018-09-20

旧LTSバージョンの1.27系列から、1.31.0にアップグレードしたので手順を載せておきます。

【2020/09/27追記】
1.31.10から1.35.0への以降を検証した時のメモを追加し、全体を見直しています。

【2022/12/21追記】
1.35.8から1.39.0へアップグレード可能か検証した際のメモを追加し、全体を見直しています。

【2023/06/27追記】
1.35.9から1.39.3へアップグレードした時のメモを追加しています。

環境 & 注意事項

稼動している環境は、以下のとおりです。

OS

  • 1.27.x to 1.31.0
    • Ubuntu 16.04.5 LTS amd64版
  • 1.31.10 to 1.35.0
    • Ubuntu 20.04.1 LTS amd64版
  • 1.35.8 to 1.39.0
    • Ubuntu 20.04.5 LTS amd64版 (作業完了後に22.04.1 LTSに更新予定)
  • 1.35.9 to 1.39.3
    • Ubuntu 22.04.2 LTS amd64版

Ubuntu 22.04 では、パッケージで導入できるデフォルトのPHPのバージョンは8.1に更新されています。
PHP8のサポートは、1.38.4以降, 1.39.0以降が対象となっているため、1.39.0へのアップグレードは、Ubuntuのバージョンアップ前に実施しました。

1.39.0での検証ではLDAPAuthentication2がPluggableAuth 6.xに未対応だったため本番環境への適用は見送りました。LDAPAuthentication2がPluggableAuth 7.xに対応したため、1.39.3を本番環境へ適用しましたが、その際にはAnsibleのRoleを利用して本番環境を構築しています。

Mediawiki Extensions

1.31.xまでの環境で利用している拡張機能は以下のとおりです。

  • LdapAuthentication
  • GraphViz
  • MultiUpload

使用しているExtensionや設定ファイルの内容は環境依存ですので、適宜読み替えてください。
既存環境からアップグレードした実例としてみていただければと思います。

1.35以降ではこれらのExtensionsはテストされていないか、更新頻度が低下しているなどの理由から、推奨されなくなりました。
作業の中では、LDAPAuthenticaion2の利用も平行して進めています。

1.39以降では、利用している拡張機能は1.35と同様に提供されていますが、PluggableAuthがバージョン6になったことで大きく変更されており、LDAPAuthentication2が2022年12月時点では対応していない状況です。対応する意向は示されているので、しばらく待つか、OpenID Connectに移行するか検討しているところです。

検証結果からOIDCへの移行ではUXが大きく変化してしまうことを懸念し、2023年6月にPluggableAuth 7.0からLDAPAuthentication2が対応したことを受けて、1.35.xと同様のExtensionsを続けて利用しています。

1.39.3で利用しているExtensionsは次のとおりです。

  • LDAPAuthentication2-REL1_39-125b09a.tar.gz
  • LDAPAuthorization-REL1_39-7caf22c.tar.gz
  • LDAPProvider-REL1_39-12bd838.tar.gz
  • LDAPUserInfo-REL1_39-01a4b9e.tar.gz
  • PluggableAuth-REL1_39-8a48b65.tar.gz

Mediawiki LTSと最新バージョンについて

Mediawikiは長期サポートバージョンをLTSとしてリリースしています。
現在利用している1.27は2019年6月までのサポート期間が残っていますが、早めに1.31系列にアップグレードします。

1.35系列は2020/0926から2023/09までサポートされる予定の新しいLTSバージョンです。

1.39系列は2022/11/30から2025/11までサポートされる予定のLTSバージョンです。2023年6月に1.35.9からのアップグレードを実施しました。

メーリングリストに入るなどして、定期的に最新バージョンへ更新することをお勧めします。

アップグレードのテストについて

Mediawikiのアップグレード方法については、VMWare上でテストしています。
このテストには実機上でautomysqlbackupによって、定期的に保存されているMySQLのDBバックアップファイルを使用して稼動を確認しています。

詳細なテスト手順をまとめて、ansible roleとしてGithub上で公開しています。Ansible Galaxyにも登録しています。

ansibleのロールを取得する手順
$ ansible-galaxy install yasuhiroabe.mediawiki_restoredb

このansible roleを利用するとして、テストは概ね次のような手順になります。

  1. ansibleを導入し、$ ansible -m ping コマンドが正常に実行できるよう、ansible.cfg と hostsファイルを準備する
  2. ansibleや手動で、検証環境にPHPとMySQLサーバーを導入する
  3. 本番機からMySQLのバックアップファイルをコピーしてくる (files/dump.sql.gz, etc.)
  4. MediaWikiの拡張機能(extensions)の1.39対応版をfiles/にコピーする
  5. MySQLの管理ID、パスワード情報等をplaybookに記述する
  6. ansibleを実行
  7. 稼動確認

【テスト環境構築】1. ansible環境の設定

利用しているansible.cfgの設定は次のようになっています。

ansible.cfg
[defaults]
inventory = hosts

remote_user = user01

host_key_checking = True
private_key_file = /home/user01/.ssh/id_ed25519
roles_path = ./roles
log_path = ansible.log

[privilege_escalation]
become = True
hostsファイルの内容
[mediawiki]
mw139.example.org

正しく設定が終ると次のような手順で、検証環境から反応があります。

ansibleコマンドのテスト
$ ansible -m ping

【テスト環境構築】2. 検証環境にPHPとMySQLサーバーを導入する

Ubuntu 20.04の検証環境では、次の手順でパッケージを導入しています。

$ sudo apt install php php-db php-intl mysql-server

【テスト環境構築】3. 本番環境からファイルをコピーし、files/に配置する

次のようなファイルを本番環境からコピーしてきます。

  • MySQLのバックアップファイル
  • LocalSettings.php
  • ロゴなどのimagesファイル

本番環境のバックアップファイルを入手して、ansible.cfgを配置したディレクトリにfilesディレクトリを作成し、中に保存します。

MySQLについては、automysqlbackupコマンドを利用しているので、/var/lib/automysqlbackup/daily/my_wiki/my_wiki_2020-09-27_06h25m.Sunday.sql.gz にあるファイルを転送し、ファイル名を"dump.sql.gz"に変更して利用しています。

LocalSettings.phpやimageファイルは、files/にコピーし、後でplaybook.yamlに記述します。

【テスト環境構築】4. MediaWikiの拡張機能(extensions)の1.39対応版を入手する

Mediawikiの拡張機能は次のURLから検索して、1.39に対応するバージョンを入手します。

ダウンロードしたファイルは、dump.sql.gzと同様に、files/ディレクトリに配置します。

別途記載しているとおり、1.31から1.35への更新では、これまで利用していた3つのextensionsは1.35.xでは十分にテストされていなかったり、別のextensionが推奨されていたりする状況でした。アップグレードする場合には利用しているextensionの情報に注意してください。

【テスト環境構築】5.MySQLの管理ID、パスワード情報等をplaybook.yamlファイルを準備する

ansible-playbookコマンドの引数に指定するYAML景気のファイル(この例ではplaybook.yamlファイル)を準備します。

files/ディレクトリに配置したdump.sql.gzやextensionsファイルの情報を追記します。

files/ディレクトリの様子
$ $ ls -l files/
total 55968
-rw-r--r-- 1 yasu yasu  1058123 Dec 21 15:04 dump.sql.gz
-rw-rw-r-- 1 yasu yasu    93637 Dec  5 21:12 LDAPAuthentication2-REL1_39-2f16a35.tar.gz
-rw-rw-r-- 1 yasu yasu    98428 Dec  7 17:16 LDAPAuthorization-REL1_39-68d10f0.tar.gz
-rw-rw-r-- 1 yasu yasu      960 Mar 10  2021 ldapprovider.json
-rw-rw-r-- 1 yasu yasu   132369 Dec  4 19:12 LDAPProvider-REL1_39-63dc241.tar.gz
-rw-rw-r-- 1 yasu yasu    91501 Dec  4 19:13 LDAPUserInfo-REL1_39-492578d.tar.gz
-rw-rw-r-- 1 yasu yasu     5298 Dec 21 15:22 LocalSettings.php.j2
-rw-rw-r-- 1 yasu yasu 55728839 Dec  1 05:38 mediawiki-1.39.0.tar.gz
-rw-rw-r-- 1 yasu yasu     2935 Jan 22  2015 mylogo.png
-rw-rw-r-- 1 yasu yasu    74044 Dec  7 02:18 PluggableAuth-REL1_39-3a8142d.tar.gz

LocalSettings.php.j2はPythonのJinja2テンプレートエンジンに対応したスケルトンファイルで、memi_mysql_passなどを変数として展開できます。今回は単純に本番環境のLocalSettings.phpのファイル名を変更しています。

mylogo.pngはMediawikiの左上に表示されるロゴのイメージファイルで、本番環境からコピーしてきたものです。

これらの情報を反映したplaybook.yamlファイルの内容は次のようになりました。

playbook.yaml
---
- hosts: all
  vars:
    memi_mediawiki_filepath: "files/mediawiki-1.39.0.tar.gz"
    memi_restoredb_filepath: "files/dump.sql.gz"
    memi_restore_dbname: "my_wiki"
    memi_mysql_user: "wiki"
    memi_mysql_pass: "test"
    memi_mediawiki_extensions_filepath:
      - "files/LDAPAuthentication2-REL1_39-2f16a35.tar.gz"
      - "files/PluggableAuth-REL1_39-3a8142d.tar.gz"
      - "files/LDAPProvider-REL1_39-63dc241.tar.gz"
      - "files/LDAPAuthorization-REL1_39-68d10f0.tar.gz"
      - "files/LDAPUserInfo-REL1_39-492578d.tar.gz"
    memi_mediawiki_additional_files:
      - { src: "files/mylogo.png", dest: "{{ memi_mediawiki_destdir }}/images" }
      - { src: "files/ldapprovider.json", dest: "{{ memi_mediawiki_destdir }}" }
  roles:
    - yasuhiroabe.mediawiki_restoredb

2020/09/27に確認したところ、ansible galaxyに登録していた yasuhiroabe.mediawiki_restoredb は、roles/yasuhiroabe.mediawiki_restoredb/files/... を探しにいくようになっていたので、ansible.cfg等のファイルを配置しているディレクトリを起点として、./files/... を探しにいくように変更しました。

【テスト環境構築】6. ansibleを実行

準備したplaybook.yamlの実行
$ ansible-playbook playbook.yaml

MySQLに対しては、playbook.yamlに設定した memi_mysql_user, memi_mysql_pass が設定されます。
これと同じ内容がLocalSettings.phpに記述する必要があります。

php update.phpを実行するタイミングで、これらの設定が正しくないと、MySQLに接続しようとしたままansibleタスクがハングアップします。

この他、古いバージョンの記述が残っている場合にはエラーが表示されるので、適宜解決して、繰り返し ansible-playbookコマンドを実行してください。

【テスト環境構築】7. 稼動の確認

ansible-playbookが正常に終了すると、既にapache2, mysqldは稼動しているので、Webブラウザからアクセスできること、各拡張機能が正常に稼動していることを確認します。

この他に、GraphVizについてはmediawiki/images/ディレクトリの内容を本番環境からコピーして確認しています。

アップグレード手順 (本番機)

ansible-playbookを利用することもできますが、不要な作業が多いので、ここではコマンドレベルで作業の流れを記述します。

1.31.10から1.35.0へのアップグレードに合わせて内容を見直していますが、大きな変更点はないので、1.31を1.35と読み替えてください。

作業概要

まずapache2プロセスを停止します。

本番環境ではMySQLのバックアップを保全しておけばリストアする必要はないので、mediawiki-1.31.0のtargzballを展開し、LocalSettings.phpファイルを配置した上で、maintenanceディレクトリで"$ sudo php update.php"を実行します。

最後にパーミッションを適切に変更し、apache2プロセスのリスタートを実行します。

ファイルの準備

~/mediawiki-1.31.0/ の下に次のようにファイルを準備します。

-rw-rw-r--  1 user01 user01    84217 Sep 20 15:28 GraphViz-REL1_31-9abad17.tar.gz
-rw-rw-r--  1 user01 user01    33478 Sep 20 15:28 LdapAuthentication-REL1_31-b19888c.tar.gz
-rw-rw-r--  1 user01 user01 35210387 Sep 20 15:28 mediawiki-1.31.0.tar.gz
-rw-rw-r--  1 user01 user01    54051 Sep 20 15:28 MultiUpload-REL1_31-0a2cae4.tar.gz

apache2プロセスの停止

プロセスを停止します。

apache2の停止
$ /etc/init.d/apache2 stop

ファイルの展開

$ cd /var/www/html
$ ls -l    ## mediawiki-1.31.0 ディレクトリが存在しない事を確認する
$ tar xvzf ~/mediawiki1.31.0/mediawiki-1.31.0.tar.gz

LocalSettings.phpファイルの準備

"cp -i"の部分では、カレントディレクトリにLocalSettings.phpが存在するとエラーとなります。

$ cd /var/www/html/mediawiki-1.31.0
$ sudo cp -i ../mediawiki/LocalSettings.php .

Skin関連の設定を修正

同梱されているSkinはMonoBook, Vector, Timelessの3つだけなので、不要な設定を削除します。
$wgDefaultSkinの設定は、"monobook"となっているので、変更はしません。

## 修正前 (1.27.4で動いているバージョン)
$wgStylePath        = "$wgScriptPath/skins";
wfLoadSkin('CologneBlue');
wfLoadSkin('Modern');
wfLoadSkin('MonoBook');
wfLoadSkin('Vector');

## 修正後 (CologneBlueとModernを削除し、Timelessを追加)
$wgStylePath        = "$wgScriptPath/skins";
wfLoadSkin('MonoBook');
wfLoadSkin('Vector');
wfLoadSkin('Timeless');

Extensions関連の設定を修正

## 修正前 (1.27.4のバージョン)
wfLoadExtension('SyntaxHighlight_GeSHi');
wfLoadExtension('MultiUpload');
wfLoadExtension('WikiEditor');
require_once("$IP/extensions/GraphViz/GraphViz.php");
wfLoadExtension('ImageMap');
require_once("$IP/extensions/LdapAuthentication/LdapAuthentication.php");

## 修正後 (GraphVizの設定をwfLoadExtensionを使う方法に変更)
wfLoadExtension('SyntaxHighlight_GeSHi');
wfLoadExtension('MultiUpload');
wfLoadExtension('WikiEditor');
wfLoadExtension('GraphViz');
wfLoadExtension('ImageMap');
require_once("$IP/extensions/LdapAuthentication/LdapAuthentication.php");

extensionsディレクトリへのモジュールの展開

$ cd /var/www/html/mediawiki-1.31.0/extensions
$ sudo tar xvzf ~/mediawiki1.31.0/GraphViz-REL1_31-9abad17.tar.gz
$ sudo tar xvzf ~/mediawiki1.31.0/MultiUpload-REL1_31-0a2cae4.tar.gz
$ sudo tar xvzf ~/mediawiki1.31.0/LdapAuthentication-REL1_31-b19888c.tar.gz

imagesディレクトリのコピー

$ cd /var/www/html/mediawiki-1.31.0/images
$ sudo rsync -av ../../mediawiki/images/. .

本番ディレクトリへのプロモーション

$ cd /var/www/html
$ sudo mv mediawiki mediawiki-1.27.4
$ sudo mv mediawiki-1.31.0 mediawiki

php update.phpの実行

DBの構造を1.31系列に対応させるためにupdate.phpを実行します。

$ cd /var/www/html/mediawiki/maintenance
$ sudo php update.php

パーミッションの変更

自分以外はサーバーにログインできないため、apache2プロセスから最低限のファイルだけ書き換えられるように変更しています。

$ cd /var/www/html/mediawiki/
$ sudo chown -R root:www-data .
$ sudo chmod -R a+rX .
$ sudo chown -R www-data:root LocalSettings.php images
$ sudo chmod 0600 LocalSettings.php

apache2の起動

$ sudo /etc/init.d/apache2 start

マイナー更新作業手順の全体

メジャーアップグレードと違いマイナーアップグレードは頻繁に発生する作業です。
そのため実際に使用している手順を掲載しておきます。

Ubuntu 22.04.3で1.39.5を稼動していた環境で、最新の1.39.6に更新した際には次のような資料を作成してから作業を実施しました。

実際の作業手順書から抜粋
 $ sudo /etc/init.d/apache2 stop
 $ sudo /etc/init.d/mysql stop
 $ cd /var/www/html/
 ## バックアップの作成
 $ sudo mv mediawiki ../mediawiki-1.39.5
 $ ls -l   ## mediawikiディレクトリがない事を確認する
 ## 新しいmediawiki tarballの展開
 $ sudo tar xvzf ~/mediawiki-1.39.6/mediawiki-1.39.6.tar.gz
 $ sudo mv mediawiki-1.39.6 mediawiki
 $ cd mediawiki
 ## 必要なファイルのコピー
 $ sudo rsync -av ../../mediawiki-1.39.5/images/. images/.
 ## 手間を削減するため安定してきてパッケージが更新されなくなったら 1.39.5/extentions/ からファイルをコピーする手順を記述する (e.g. $ echo sudo rsync -av ../../mediawiki-1.39.x/extensions/PluggableAuth extensions/.)
 ## その他の設定ファイルをコピーする
 $ sudo cp -ip ../../mediawiki-1.39.5/LocalSettings.php .
 $ sudo cp -ip ../../mediawiki-1.39.5/ldapprovider.json .
 ## 更新されたextensionsを更新する
 $ sudo tar xvzf ~/mediawiki-1.39.6/PluggableAuth-REL1_39-*.tar.gz -C extensions/.
 $ sudo tar xvzf ~/mediawiki-1.39.6/LastUserLogin-REL1_39-*.tar.gz -C extensions/.
 $ sudo tar xvzf ~/mediawiki-1.39.6/LDAPUserInfo-REL1_39-*.tar.gz -C extensions/.
 $ sudo tar xvzf ~/mediawiki-1.39.6/LDAPProvider-REL1_39-*.tar.gz -C extensions/.
 $ sudo tar xvzf ~/mediawiki-1.39.6/LDAPAuthorization-REL1_39-*.tar.gz -C extensions/.
 $ sudo tar xvzf ~/mediawiki-1.39.6/LDAPAuthentication2-REL1_39-*.tar.gz -C extensions/.
 ## ファイル&ディレクトリパーミッションの変更
 $ sudo chmod -R a+rX,g-w,o-w ./
 $ sudo chown -R www-data:www-data ./
 $ sudo chmod 600 LocalSettings.php
 ## 作業完了後に、サービスを起動する
 $ sudo /etc/init.d/mysql start
 $ sudo /etc/init.d/apache2 start

メジャーアップグレードの際には、mysqlを起動してからさらに追加で次のような操作をしてからapache2を起動していますが、マイナーアップグレードの際には通常update.phpを実行する必要はないはずです。

## DB Schemaのアップデート
$ cd extensions/
$ sudo php update.php

テスト環境で利用したansible playbookではupdate.phpを必ず実行するようにしているため、本番環境を構築するためにも利用可能ですが、DBの内容がバックアップで上書きされてしまうので慎重に検討してください。

LocalSettings.phpの変更点

1.35.0への移行時

1.31.10から.1.35.0へのバージョンアップ時に内容を見直しましたが、LdapAuthentication用の設定で、1.27より古い記述が残っていたので最新のフォーマットに変更しました。

1.39.3への移行時

1.35.9から1.39.3へのアップグレードでは、LocalSettings.phpには大きな変更はありませんでした。
update.phpを必ず実施しなければいけない点に注意すれば移行自体はそれほど大変ではないと思います。

PluggableAuthの内部機構が大きく変更されたことを受けて関連するExtensionの設定の変更が必要でした。

主な変更点は以下のとおりです。

なお$wgPluggableAuth_Configで指定している'domain' => 'LDAP_ID' の LDAP_ID はldapprovider.jsonに記述している変数名です。

diff --git a/files/LocalSettings.php.j2 b/files/LocalSettings.php.j2
index e7b3565..5520a75 100644
--- a/files/LocalSettings.php.j2
+++ b/files/LocalSettings.php.j2
@@ -127,10 +127,10 @@ $wgDefaultSkin = "vector";
 
 # Enabled skins.
 # The following skins were automatically enabled:
-wfLoadSkin( 'MonoBook' );
-wfLoadSkin( 'Timeless' );
-wfLoadSkin( 'Vector' );
-
+wfLoadSkin('MinervaNeue');
+wfLoadSkin('MonoBook');
+wfLoadSkin('Timeless');
+wfLoadSkin('Vector');
 
 # End of automatically generated settings.
 # Add more configuration options below.
@@ -154,7 +154,12 @@ $LDAPProviderDefaultDomain = "LDAP_ID";
 
 ## -- Setting of PluggableAuth --
 $wgPluggableAuth_EnableAutoLogin = true; ## default: false
-$wgPluggableAuth_ButtonLabelMessage = "Login with your LDAP-ID";
+$wgPluggableAuth_Config['Log In (LDAP ID)'] = [
+    'plugin' => 'LDAPAuthentication2',
+    'data' => [
+        'domain' => 'LDAP_ID'
+    ]
+];
 
 ## -- Setting of LDAPAuthentication2 --
 $LDAPAuthentication2UsernameNormalizer = "strtolower";

1.39.3への移行は、ldapprovider.jsonなどの変更は必要なく、各Extensionの説明に記載されているとおりの軽微な変更で完了しました。

1.39.0へのアップグレードを検討した際の不具合について

LDAP - The supplied credentials could not be authenticated.

このメッセージは、機能拡張ではなく、mediawiki自体が表示するメッセージです。

"languages/i18n/en.json"を確認すると、"authmanager-authn-no-primary" がキーとなっていて、このメッセージは、./includes/auth/AuthManager.php が表示していると分かります。

この情報を元に検索すると、次のドキュメントが発見できて、LDAPAuthentication2を使っている以上は、ちょっと回避できなさそうな雰囲気を感じています。

引用
I'm having the same issue and I'm fiddling aroung with that for days within a Docker container. 
What I found out is that the PluggableAuth in version >6 seems to have breaking changes and doesn't support LDAPAuthentication2 anymore.

This is quite unfortunate since I already ran the database update. 
:-D I guess I will have to switch to SAML authentication to make it work again. 
Or does anyone know more about upcoming support of LDAPAuthentication2 on this?

ここで言及されているように、PluggableAuthのCompatibility Matrixを確認すると、バージョン6以降は、サポートする機能拡張の種類は大きく削減されています。

OpenID Connect基盤として、LDAPをバックエンドとするDexを運用しているので、移行はできるのですが、なかなか大きな変更が必要になります。

LDAPAuthentication2の方ではどうなっているか確認すると、次の記事が出てきます。

ここでは2023年以降に対応するかな、といった反応になっていて、すぐには解決しそうにありません。

認証基盤を変更することのデメリットは、ユーザー情報が引き継がれず、新規ユーザーとなる可能性があることです。
これは、OpenID Connectへの対応も行いながら、様子をみて対応を検討しようと思います。

Ubuntu 20.04 における、OpenID Connectへの対応

Ubuntu 20.04は、PHP7.4が標準のパッケートとして準備されていますが、Ubuntu 22.04では、PHP8.1になります。
現時点では1.35.xでのPHP8.1サポートも限定的ではありますが提供されていて、バックポートも検討されているようです。

とはいえ、1.39.0の時点での現実的な対応は、Ubuntu 20.04側で1.39にアップグレードしてから、OSをアップグレードすることになります。

これらを含めて、OpenID Connect(OIDC)を試した際の留意点は次のようになります。

  • Ubuntu 20.04のまま、Mediawikiを1.39.0に更新する
  • 付属パッケージのcomposerが古いため、手動で /usr/local/bin/ に composerをインストールする。
  • $wgLanguageCode = "ja";を指定すると、OIDCのRedirectURIが"/Special:PluggableAuth"から"/特別:PluggableAuth"になり、RedirectURIの内部検証でエラーとなる
    • wgLanguageCodeの変更("ja"から"en")は、メインページへのリダイレクトが正常に行われないなどの影響がある
    • メインページの変更は/mediawiki/index.php/MediaWiki:Mainpageの設定を変更することで対応可能
    • https://www.mediawiki.org/wiki/Manual:Language/jaでは、$wgLanguageCodeの設定値は、稼動期間内で不変であるべきという記述に留意すること

それぞれ対応は可能ですが、一番問題なのは、ローカライズされた特別ページのURLを利用すると正常に動作しない点です。

これはDex側の問題とみられたため、利用しているdexidp/dexにissuesとして報告しています。

OIDC用の設定

LocalSettings.phpには次のようなコードを追加しています。

OIDC認証用のLocalSettings.phpの追加部分(Mediawiki1.39.0)
wfLoadExtensions( [
  'PluggableAuth',
  'OpenIDConnect'
] );

## -- Setting of PluggableAuth --
$wgPluggableAuth_EnableAutoLogin = true; ## default: false
$wgPluggableAuth_ButtonLabelMessage = "Login with your LDAP-ID";

## Setting for OpenID Connect
$wgPluggableAuth_Config[] = [
    'plugin' => 'OpenIDConnect',
    'data' => [
        'providerURL' => 'https://dex.example.org/dex',
        'clientID' => 'mediawiki',
        'clientsecret' => '5f6f6e5fe62156d88783885143526621'
    ]
];
$wgOpenIDConnect_UseEmailNameAsUserName = true;

使用するExtensionsの数は減っていますし、かなり便利ですが、これまでLDAPで利用していたユーザーとのID統合は難しそうです。

1.39.3をデプロイする際に使用したAnsible-Playbook

1.35.9からの更新のタイミングで、ハードウェアをそれまでのPC Engines社製APUから、Protectli社製VP2420に変更しました。ハードウェアのコストが2倍になって、性能はPassmark値で6倍ほどになっています。SSDのIO性能にはほぼ変更がないので、体感できる性能差はそれほど大きくありません。やや反応が悪いくらいから、きびきび反応するようになったので変更した価値はありますが、6倍遅かったかというと、それほどではありませんでした。

同時にUbuntu 20.04だったOSは、22.04を新規にインストールしていて、大掛かりな変更作業が発生しています。interfacesファイルによるNIC定義からnetplanに変更していたり、様々な点が変わっています。

今後の事も考えて今回の作業内容はUbuntuのAutoInstallやAnsibleを利用してreplayableにしています。間違ってplaybookが動作するとMediawikiの内容をバックアップDBの内容まで戻ってしまうため、automysqlbackupパッケージを動作させて万が一の事故に備えています。

これらの変更を行うためのYAMLファイルは次のとおりです。

setup.yaml
---
- name: mediawiki setup script
  hosts: all
  vars:
    mfts_sshd_listen_ipaddr: 192.168.1.20
    mfts_hostname: "mediawiki"
    mfts_sysctl_rules:
      - { name: net.ipv4.ip_forward, value: 0 }
    mfts_additional_packages:
      - apache2
      - automysqlbackup
      - iptables-persistent
      - make
      - mysql-server
      - openntpd
      - php
      - php-db
      - php-intl
      - php-ldap
      - ufw
     mfts_lineinfile_after_packages:
      - { path: "/etc/default/ufw", regexp: "^IPV6=", line: "IPV6=no", state: "present", insertbefore: "" }
    mfts_setup_directory:
      - { path: "/etc/netplan/00-installer-config.yaml", state: "absent" }
      - { path: "/usr/share/ca-certificates/local", state: "directory", mode: "0755", owner: "root", group: "root" }
    mfts_copy_files:
      ## netplan
      - { src: "{{ inventory_dir }}/files/netplan/01-br0.yaml", dest: "/etc/netplan/01-br0.yaml", owner: "root", group: "root", mode: "0444" }
      ## check scripts
      - { src: "{{ inventory_dir }}/files/scripts/check-sshd", dest: "/usr/local/sbin", owner: "root", group: "root", mode: "0744" }
    mfts_copy_files_after_packages:
      ## openntpd
      - { src: "{{ inventory_dir }}/files/openntpd/ntpd.conf", dest: "/etc/openntpd/ntpd.conf", owner: "root", group: "root", mode: "0644" }
      - { src: "{{ inventory_dir }}/files/openntpd/default", dest: "/etc/default/openntpd", owner: "root", group: "root", mode: "0644" }
      ## apache2
      - { src: "{{ inventory_dir }}/files/apache2/nii-odca4g7rsa.cer", dest: "/usr/share/ca-certificates/local", owner: "root", group: "root", mode: "0644" }
      - { src: "{{ inventory_dir }}/files/apache2/mediawiki.example.com.cer", dest: "/usr/share/ca-certificates/local", owner: "root", group: "root", mode: "0644" }
      - { src: "{{ inventory_dir }}/files/apache2/mediawiki.example.com.nopass.key", dest: "/etc/ssl/private/", owner: "root", group: "root", mode: "0400" }
      - { src: "{{ inventory_dir }}/files/apache2/mediawiki.conf", dest: "/etc/apache2/sites-available/", owner: "root", group: "root", mode: "0644" }
      - { src: "{{ inventory_dir }}/files/apache2/mediawiki-ssl.conf", dest: "/etc/apache2/sites-available/", owner: "root", group: "root", mode: "0644" }
    mfts_command_after_copyfiles: []  ## - { command: "netplan apply", become: "yes" }
    mfts_command_after_packages:
      - { command: "/usr/sbin/a2dissite -q 000-default", become: "yes" }
      - { command: "/usr/sbin/a2enmod -q ssl", become: "yes" }
      - { command: "/usr/sbin/a2enmod -q rewrite", become: "yes" }
      - { command: "/usr/sbin/a2enmod -q ldap", become: "yes" }
      - { command: "/usr/sbin/a2ensite -q mediawiki", become: "yes" }
      - { command: "/usr/sbin/a2ensite -q mediawiki-ssl", become: "yes" }
    mfts_systemd_rules:
      - { name: "apache2.service", state: "started", enabled: "yes", daemon_reload: "yes" }
    ## ufw (firewall)
    mfts_ufw_enable: True
    mfts_ufw_enable_logging: True
    mfts_ufw_service_rules:
      - { type: "allow", port: "22", from_ip: "192.168.139.0/24", to_ip: "192.168.1.20/32" }
      - { type: "allow", port: "80", from_ip: "192.168.0.0/16", to_ip: "192.168.1.20/32" }
      - { type: "allow", port: "443", from_ip: "192.168.0.0/16", to_ip: "192.168.1.20/32" }
    mfts_cronjob_rules:
      - { name: "reboot", minute: "30", hour: "3", day: "1,15", job: "/sbin/shutdown -r now" }
      - { name: "check-sshd", minute: "5", job: "/usr/local/sbin/check-sshd" }
    mfts_command_atlast:
      - { command: "/usr/sbin/iptables-save | tee /etc/iptables/rules.v4", become: "yes" }
  roles:
    - YasuhiroABE.myfavorite-setting

1.35.9のバックアップDBから、1.39.3をセットアップした時のansible-playbook YAMLファイルは次のようになっています。

---
- hosts: all
  vars:
    memi_mediawiki_filepath: "files/mediawiki/mediawiki-1.39.3.tar.gz"
    memi_restoredb_filepath: "files/automysqlbackup/my_wiki_2023-06-25_06h25m.Sunday.sql.gz"
    memi_restore_dbname: "my_wiki"
    memi_mysql_user: "wikiuser"
    memi_mysql_pass: "0dfa29fa26"
    memi_mediawiki_extensions_filepath:
      - "files/mediawiki/LDAPAuthentication2-REL1_39-125b09a.tar.gz"
      - "files/mediawiki/LDAPAuthorization-REL1_39-7caf22c.tar.gz"
      - "files/mediawiki/LDAPProvider-REL1_39-12bd838.tar.gz"
      - "files/mediawiki/LDAPUserInfo-REL1_39-01a4b9e.tar.gz"
      - "files/mediawiki/PluggableAuth-REL1_39-8a48b65.tar.gz"
    memi_mediawiki_additional_files:
      - { src: "files/mediawiki/header.png", dest: "{{ memi_mediawiki_destdir }}/images" }
      - { src: "files/mediawiki/ldapprovider.json", dest: "{{ memi_mediawiki_destdir }}" }
  roles:
    - yasuhiroabe.mediawiki_restoredb

ただ mediawiki/images/ ディレクトリの内容は複雑なので、別途手動で展開しています。

以上

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4