MediaWikiで家庭内ナレッジを集約(docker-compose)

Posted by 雅楽斎 on Thursday, September 1, 2022

TOC

MediaWikiとは(ざっくり)

おそらくみなさんご存知のWikipediaを構築するために開発されているwikiエンジンで、プログラミング言語としてはPHP、ライセンスはGPLv2+で公開されています。

目的がWikipediaを構築するために開発されているというあたり、フェラーリがF1をやるために車を売っているというのと同じパターンに見えます。

デプロイ環境・運用指針

今回MediaWikiを構築する環境は以下の通りです。

  • Raspberry Pi 4(RAM8GB) いつも使っている環境です
  • Ubuntu 22.04 LTS いつも使っている環境です
  • rootless docker
  • docker-compose

rootless dockerについては弊blogの以下のエントリを踏襲します。

Dockerをrootlessに変更してrootユーザーの呪縛から開放される

また、運用については以下のポリシーとします。

  • 標準機能からはみ出すもの(プラグイン)は使わない。実現したい場合は別のサービスを追加して使う→実質的にDockerコンテナのファイルを変更すると自分でその部分をメンテナンスしないといけない、将来的なバージョンアップにプラグインが追随しないことが多々あるため
  • オフィシャルのDockerイメージを使う
  • DBはMariaDBを使う

MediaWikiのバージョン

MediaWikiは活発に機能拡張が行われているとともに、メンテナンスも頻繁に行われているので、極力安定版(長くメンテナンスされているバージョン)を使いたいところです。

Version lifecycle - MediaWiki

MediaWikiはリリースから1年間がメンテナンス期間、4回に1回はLTSリリースとしてメンテナンス期間が3年になるようです。

どのバージョンが良いかというと、2022年8月時点でリリースされているLTSは1.35で来年の9月まではサポートが続きます。ただし、11月には次のLTSとなる1.39がリリースされる予定なので、その頃にインストールするなら1.39を使うのが良いでしょう。

gantt title MediaWiki dateFormat YYYY-MM-DD section 1.39(LTS) LTS Support :2022-11-01, 2025-11-30 section 1.38(stable) Support :2022-06-02, 2023-06-30 section 1.37(legacy) Support :2021-11-18, 2022-11-30 section 1.35(LTS) LTS Support :2020-09-25, 2023-09-30

MediaWikiのDockerイメージ

mediawiki - Official Image | Docker Hub

MediaWikiのDockerイメージは以下のバージョンが用意されています

  • latest
  • stable
  • lts
  • legacy
  • legacylts
  • 1.38
  • 1.37
  • 1.35

このうち、lateststableは1.38、legacyは1.37、ltslegacyltsは1.35に対応しているようです。

また、それぞれのバージョンにfpmの有無とfpmの場合はalpineの有無があります。fpmはFastCGIのPHP実装なので、phpプロセスをリクエストのたびに生成せずに使いまわすことで性能を重視する場合は選択すると良いと思います。今回は実行リソース節約のため、fpmのついていないものを使います。alpineはベースにAlpine Linuxを使っているため、イメージサイズがコンパクトになっているという特徴があります。MediaWiki自体の開発に使うのでなければ実行自体には問題はないと思いますが、今回はfpmを使わないので必然的にltsを使います。

対応アーキテクチャはamd64 arm32v5 arm32v6 arm32v7 arm64v8 i386 ppc64leがあるので大抵のDocker環境で実行可能でしょう。今回はRPi4で動かすのでarm64v8が選ばれます。

docker-compose.ymlは初回起動後に変更する

MediaWikiをセットアップしたことがある人には周知の事実ですが、MediaWikiは初回起動時に初期設定が必要で、これが終わるとphpファイル(LocalSettings.php)を吐き出します。2回目の起動以降は吐き出したphpファイルを読み込んでMediaWikiを実行します。

DockerでMediaWikiをやるとコンテナ外で管理するべきファイルが2回目以降に必要(外に出さないとコンテナの破棄でファイルが消えてしまう)で、外部ボリュームとして定義する必要があるので、docker-compose.ymlは初回起動時と2回目移行起動時で分ける必要があります。

docker-compose.yml(初回)

基本的にはオフィシャルに書かれているサンプルに倣って、必要なところを変更します。

初回起動時のdocker-compose.ymlは以下。

# MediaWiki with MariaDB
#
# Access via "http://localhost:8080"
#   (or "http://$(docker-machine ip):8080" if using docker-machine)
version: '3'
services:
  mediawiki:
    image: mediawiki:lts
    restart: always
    ports:
      - 18080:80
    links:
      - database
    volumes:
      - /mnt/usbhdd1/var/mediawiki-docker-images/images:/var/www/html/images
  # This key also defines the name of the database host used during setup instead of the default "localhost"
  database:
    image: mariadb
    restart: always
    environment:
      # @see https://phabricator.wikimedia.org/source/mediawiki/browse/master/includes/DefaultSettings.php
      MYSQL_DATABASE: my_wiki
      MYSQL_USER: wikiuser
      MYSQL_PASSWORD: example
      MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
    volumes:
      - /mnt/usbhdd1/var/mediawiki-docker-db/db:/var/lib/mysql

変更しているのは以下の通り

  • 使用イメージをmediawikiからmediawiki:ltsに変更(services - mediawiki - images)
  • 待受ポートを8080から18080に変更(services - mediawiki - ports)
  • volumesのローカル側のパスをフルパスに変更
    • imagesから/mnt/usbhdd1/var/mediawiki-docker-images/imagesに変更(services - mediawiki - volumes)
    • dbから/mnt/usbhdd1/var/mediawiki-docker-db/dbに変更(services - database - volumes)

docker-compose.yml(セットアップ完了後)

# MediaWiki with MariaDB
#
# Access via "http://localhost:8080"
#   (or "http://$(docker-machine ip):8080" if using docker-machine)
version: '3'
services:
  mediawiki:
    image: mediawiki:lts
    restart: always
    ports:
      - 18080:80
    links:
      - database
    volumes:
      - /mnt/usbhdd1/var/mediawiki-docker-images/images:/var/www/html/images
      - /mnt/usbhdd1/var/mediawiki-docker-LocalSettingsPhp/LocalSettings.php:/var/www/html/LocalSettings.php
  # This key also defines the name of the database host used during setup instead of the default "localhost"
  database:
    image: mariadb
    restart: always
    environment:
      # @see https://phabricator.wikimedia.org/source/mediawiki/browse/master/includes/DefaultSettings.php
      MYSQL_DATABASE: my_wiki
      MYSQL_USER: wikiuser
      MYSQL_PASSWORD: example
      MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
    volumes:
      - /mnt/usbhdd1/var/mediawiki-docker-db/db:/var/lib/mysql

初回分から追加しているのは以下の通り

  • /mnt/usbhdd1/var/mediawiki-docker-LocalSettingsPhp/LocalSettings.php:/var/www/html/LocalSettings.phpを追加(services - mediawiki-volumes)

MediaWikiのインストール

volumesに書いたディレクトリを作成する(rootless docker用)

今回もrootless dockerを使用するので、docker-composeに書いたvolumes用のディレクトリを謎のオーナーで作成します。

# mkdir /mnt/usbhdd1/var/mediawiki-docker-{images,db}
# chown 166535:166535 /mnt/usbhdd1/var/mediawiki-docker-{images,db}
# ls -ld /mnt/usbhdd1/var/mediawiki-docker-{images,db}
drwxr-xr-x 1 166535 166535 0  8月 30 20:34 /mnt/usbhdd1/var/mediawiki-docker-db
drwxr-xr-x 1 166535 166535 0  8月 30 20:34 /mnt/usbhdd1/var/mediawiki-docker-images

docker-compose.ymlを配置する

いつも通り一般ユーザーの任意のディレクトリにdocker-compose.ymlを格納するディレクトリを作成して移動します。

$ mkdircd docker-mediawiki

mkdircdはmkdirした後にそのディレクトリに移動するエイリアスです。

【小ネタ】mkdirした後にそのディレクトリにcdするエイリアスを作る

まず、ここに初回用のdocker-compose.ymlを作成します。(省略)

docker-compose実行(1回目)

docker-compose.ymlを作成したディレクトリで1回目のdocker-compose up -dをします。

$ docker-compose up -d

コンソールが戻ってきたら、ブラウザからMediaWikiを開きます。

http://rpi4.internal:18080/

セットアップ実行

「set up the wiki」のリンクをクリックします。

ここから初期設定をしますが、必要なところだけ設定します。画像内の右上の設定ページがあります。

データベースの設定はdocker-compose.ymlに記載した内容で設定する必要があります。

  • データベースのホストはdatabase(services - databaseのdatabase)
  • データベース名はmy_wiki(services - database - environmentのMYSQL_DATABASEのmy_wiki)
  • データベースのユーザー名はwikiuser(services - database - environmentのMYSQL_USERのwikiuser)
  • データベースのパスワードはexample(services - database - environmentのMYSQL_PASSWORDのexample)

この後、データベースの設定としてウェブアクセスのためのデータベースアカウントの設定がありますが、「インストール作業と同じアカウントを使用する」にチェックを付けたまま進みます。

全部終わるとこの画面になるので続行します。

ここで生成されたLocalSettings.phpのダウンロード画面になるので、自動でダウンロードが始まらない場合はリンクをクリックしてダウンロードします。

docker-compose終了

docker-compose.ymlのあるディレクトリで以下のコマンドを実行します。

$ docker-compose down

ダウンロードした LocalSettings.php を /var/www/html/LocalSettings.php に対応するパスに移動する

MediaWikiのセットアップの最後にダウンロードしたLocalSettings.phpをdocker-compose.ymlで指定したvolumeのパスに移動します。

私の場合rootless dockerを使っているので、例によってファイルとディレクトリのオーナーを謎の数値に設定しています。

# mkdir /mnt/usbhdd1/var/mediawiki-docker-LocalSettingsPhp
# mv LocalSettings.php /mnt/usbhdd1/var/mediawiki-docker-LocalSettingsPhp/
# chown -R 166535:166535 /mnt/usbhdd1/var/mediawiki-docker-LocalSettingsPhp/

docker-compose.ymlを変更する

前記したようにdocker-compose.ymlを変更します。(省略)

docker-compose実行(2回目)→作業終了

改めてdocker-compose.ymlを変更したディレクトリでdocker-compose up -dをします。コマンドは1回目と同じです。

ターミナルが返ってきたら、もう一度ブラウザでMediaWikiを開きます。

無事にMediaWikiが起動しました。あとはこのWikiを好きな様に編集していきます。

スポンサーリンク


comments powered by Disqus