MediaWikiを使ったみる[Docker][docker-compose]

## MediaWiki

## はじめに

有識者の知恵を拝借する

1. MediaWikiの環境をdocker-composeで簡易的に構築する You_name_is_YU - Qiita
   https://qiita.com/You_name_is_YU/items/98ad1ee121067c1cdf85


## ディレクトリ構成

```bash
~/docker/mediawiki
├── db
│   └── mysql
│       └── var_lib_mysql
├── phpmyadmin
│   ├── images
│   ├── cache
│   ├── extensions
│   └── skins
├── mediawiki
│   ├── sessions
│   └── Dockerfile
└── docker-compose.yml
```

```bash
cd ~/docker/mediawiki
mkdir -p ./db/mysql/var_lib_mysql
mkdir -p ./mediawiki/images
mkdir -p ./mediawiki/cache
mkdir -p ./mediawiki/extensions
mkdir -p ./mediawiki/skins
mkdir -p ./phpmyadmin/sessions
```

## インストール
### メンテ用コマンド

```bash
docker compose up

# ---- メンテ用コマンド
docker build
docker images
docker ps

# CNAME=(docker ps 最終項目 NAMES)
export CNAME=mediawiki_wiki
docker exec -it -w "/work" ${CNAME} bash

docker compose exec -it mediawiki bash
docker run -it -p 4000:4000 -p 35729:35729 -v "$PWD:/work" -w "/work" ${CNAME} bash

docker compose build
docker compose build --no-cache
docker compose down
docker compose exec --service-ports mediawiki bash
docker compose run -it --service-ports mediawiki bash
docker compose up
docker compose up -d
docker compose up -d --force-reload
docker compose up -d --force-recreate
----
docker compose exec #{container} ${command}
docker compose exec mediawiki bash
docker compose cp mediawiki:/var/www/html/composer.local.json ./mediawiki/composer.local.json
docker compose ls mediawiki:/var/www/html/
docker compose stop $(`docker ps -q`)

docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -aq)
docker rmi $(docker images -aq) -f
```

### ~/docker/mediawiki/mediawiki/Dockerfile

mediawiki イメージに composer を追加したかったので Dockerfile でビルドした。
ついでに FDClone, lv, less, ng-cjk とそれらの設定ファイルも追加。

```Dockerfile
FROM mediawiki:1.43.1
RUN apt-get update && apt-get upgrade -y && \
    apt-get install --no-install-recommends --allow-unauthenticated -y \
    git locales curl zip unzip silversearcher-ag fdclone less lv ng-cjk

# multi-stage builds (マルチステージビルド) を使用するため，Docker のバージョンは >=17.05 が必須です。
# composerのインストール
COPY --from=composer/composer:latest-bin /composer /usr/local/bin/composer
# COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
# COPY --from=composer:2.1.8 /usr/bin/composer /usr/local/bin/composer

WORKDIR /root
VOLUME /root
EXPOSE 80

COPY .bashrc /root
COPY .bash_aliases /root
COPY .fd2rc /root
COPY .ng /root
COPY .profile /root

RUN echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen
RUN locale-gen ja_JP
RUN update-locale LANG=ja_JP.UTF-8
ENV LANG="ja_JP.UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8" \
    TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN curl -OL https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-1-amd64.deb && \
    apt-get install -y ./pandoc-3.7.0.1-1-amd64.deb 

# https://zenn.dev/ysmtegsr/articles/640809c07d983ea911d6
# COPY --from=composer /usr/bin/composer /usr/bin/composer
# ENV COMPOSER_ALLOW_SUPERUSER 1
# ENV COMPOSER_HOME /composer
# RUN composer config -g repos.packagist composer https://packagist.jp
# RUN composer global require hirak/prestissimo
# RUN docker-php-ext-install pdo_mysql opcache
```

### ~/docker/mediawiki/docker-compose.yml

```yaml:docker-compose.yml
services:
  mediawiki:
    depends_on:
      - database
    # depends_on:
    #   database:
    #     condition: service_healthy
    container_name: mediawiki_wiki
    # image: mediawiki:1.43.1
    build: ./mediawiki
    restart: always
    links:
      - database
    ports:
      - 8080:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./mediawiki/images:/var/www/html/images
      - ./mediawiki/cache:/var/www/html/cache
      - ./mediawiki/extensions:/var/www/html/extensions
      - ./mediawiki/skins:/var/www/html/skins
      - ./mediawiki/.htaccess:/var/www/html/.htaccess
      # 以下の行を編集して、LocalSettings.phpをホストマシンからコンテナにマウントします。
      # - ./mediawiki/LocalSettings.php:/var/www/html/LocalSettings.php

  database:
    container_name: mediawiki_db
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_DATABASE=my_wiki
      - MYSQL_USER=mysqluser
      - MYSQL_PASSWORD=mysqladmin
      - MYSQL_ROOT_PASSWORD=mysqladmin
      - TZ=Asia/Tokyo
    # command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data-db/data:/var/lib/mysql
      # - ./data-db/my.cnf:/etc/mysql/conf.d/my.cnf
      # - ./data-db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
      - 33060:33060
    # healthcheck:   # here
    #   test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$MYSQL_ROOT_PASSWORD"]
    #   interval: 30s
    #   timeout: 5s
    #   retries: 6
    #   start_period: 30s

  phpmyadmin:
    container_name: mediawiki_phpmyadmin
    image: phpmyadmin/phpmyadmin
    restart: always
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=database
      - PMA_USER=mysqluser
      - PMA_PASSWORD=mysqladmin
      - TZ=Asia/Tokyo
    links:
      - database
    ports:
      - 8082:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
```

### extensions, skins ディレクトリを上書き

https://www.mediawiki.org/wiki/Download/ja

空で上書きしたディレクトリは、本家gitから持ってきて上書きする事にした。

> ./vendor も追加しました！
> ./work もワークディレクトで追加しました！

圧縮ファイルをダウンロードしてコピペする

```bash
cd ~/docker/mediawiki/
wget https://releases.wikimedia.org/mediawiki/1.43/mediawiki-1.43.1.zip
unzip xxxx.zip
cp -rf ./mediawiki-1.43.1/extensions ./mediawiki/
cp -rf ./mediawiki-1.43.1/skins ./mediawiki/
cp -rf ./mediawiki-1.43.1/vendor ./mediawiki/
```

```docker compose up``` で色々起動している事を確認した後、本家gitから持ってきた extensions, skins 
ディレクトリで上書きコピーする。

※ docker-compose.yml の volumes で指定したディレクトリは、ホスト側が優先され、起動した側の
ディレクトリ内は上書きされる（空だった場合は空になる）

イメージ内のファイルをコピーしたかったけど docker cp コマンドがいまいちわからなかった。
今、試しにやってみたら出来た！だけどなかった事にする！した！

```bash
mkdir ~/docker/mediawiki/work
cd ~/docker/mediawiki
# コンテナ内ディレクトリを丸ごとコピーしてローカルに持ってくる
docker compose cp mediawiki:/var/www/html/vendor ./mediawiki/
docker compose cp mediawiki:/root ./mediawiki/work
# ↑ディレクトリの中に出来たので、適当にローカルPC側で直した
```

### 起動確認

色々と雑事をして落ち着く。

1. 失敗したイメージを削除したり
2. 撒き散らしたゴミを削除したり
3. 起動した環境がブラウザ表示できるか確認したり
4. 試行錯誤した結果、そこかしこに残る適当に付けた設定名を消し回ったり

MediaWiki   - http://localhost:8080
MysqlAdmin  - http://localhost:8082

### MediaWikiの初期設定をする

設定ファイルを変更したので再起動する。した。

```bash
cd ~/docker/mediawiki
docker compose up
```

### http://localhost:8080

アクセスすると `set up the wiki` リンクのあるページが表示される。

### set up the wikiリンクをクリックする
### 言語の選択画面で[続行]押下する

ja - 日本語
ja - 日本語

### MediaWikiへようこそ！[続行]押下する
### "データベースに接続"

- データベースのホスト:        database （docker-compose.ymlで定義したmysqlのコンテナ）
- データベースの接頭辞:        (なし)
- データベース名:              my_wiki
- データベースのユーザー名:    mysqluser
- データベースのパスワード:    mysqladmin

[続行] 押下

### データベースの設定画面で[続行]押下する

デフォルト内容に変更なし

```text
[x] インストール作業と同じアカウントを使用する

ストレージエンジン:
[x] InnoDB（推奨）
[ ] MyISAM
```

### 名前の画面で値を設定し、続行ボタンを押下する

ウィキ名:   LifeWiki
プロジェクト名前空間
    [x] ウィキ名と同じ LifeWiki

利用者名:   bash
パスワード: 0123456789
メールアドレス: bash@localhost.local

### インストールの画面で続行ボタンを押下する
### インストールの確認画面で続行ボタンを押下する
### LogalSettings.phpファイルのダウンロード

上記手順の続行ボタンを押下するとLocalSettings.phpファイルがダウンロードされるので、`./mediawiki/`配下にダウンロードする。

```shell-session
.
├── db
│   └── mysql
│       └── var_lib_mysql
├── mediawiki
│   └── images
│   └── LocalSettings.php  ←  ここに配置
└── docker-compose.yml
```

### 一度`docker-compose down`を実行してコンテナを停止する

```shell
$ docker-compose down
```

### docker-compose.ymlファイルにLocalSettings.phpのvolumes記述を追加する

```yaml
    volumes:
      - ./mediawiki/images:/var/www/html/images
      # 以下の行を編集して、LocalSettings.phpをホストマシンからコンテナにマウントします。
      - ./mediawiki/LocalSettings.php:/var/www/html/LocalSettings.php
```

### docker-compose up -d でコンテナを再度起動する

```shell
$ docker-compose up -d
```

### MediaWikiに再度アクセスする

http://localhost:8080


### 完了

以上の手順でMediaWikiをdocker-composeで簡易的に構築することができました。

## 拡張機能 pandoc-mediawiki-ext

https://github.com/bekker/pandoc-mediawiki-ext

ちょっと使ってみる（テスト）
pandoc ダウンロードとインストール
うごいたー

Dockerfile で pandoc をインストールするようにした。
debian系

~/docker/mediawiki/mediawiki/Dockerfile

pandocを追加した

```Dockerfile
RUN curl -OL https://github.com/jgm/pandoc/releases/download/3.7.0.1/pandoc-3.7.0.1-1-amd64.deb && \
    apt-get install -y ./pandoc-3.7.0.1-1-amd64.deb
```

MediaWiki用の Pandoc 拡張機能を本家からgitクローンする

Path:/var/www/html/extensions/Pandoc

```bash
[463925d8c4d3 vendor]# cd /var/www/html/extensions
[463925d8c4d3 extensions]# git clone https://github.com/bekker/pandoc-mediawiki-ext.git Pandoc
[463925d8c4d3 extensions]# ll Pandoc/
total 28
-rw-r--r-- 1 root root 12543  5月 23 16:02 Pandoc.php
-rw-r--r-- 1 root root  6673  5月 23 16:02 PandocTest.php
-rw-r--r-- 1 root root  4042  5月 23 16:02 README.md
[463925d8c4d3 extensions]#
```

LocalSettings.php 末尾に拡張機能のロード指示を追加する。

vi ~/docker/mediawiki/mediawiki/LocalSettings.php

```php
require_once("$IP/extensions/Pandoc/Pandoc.php");
$wgPandocDefaultFormat = 'gfm';
$wgPandocExecutableOption = '';
```

## 拡張機能 mw-markdown

MediaWiki 1.35 で使えなくなっているみたい。

MediaWiki拡張機能のインストール中、唐突に composer require コマンドをしろと言われ途方にくれた！
PHPよく知らないってんねん！

composer コマンドを実行する方法も検索してもわからなかった。自分でなんかとかした！
次、必要になった時のため残しておく！

https://github.com/bharley/mw-markdown/issues/17
Call to undefined method Parser::doDoubleUnderscore #17

This is because many calls from Markdown.php are deprecated or private now (see https://www.mediawiki.org/wiki/Release_notes/1.35):

- https://github.com/bharley/mw-markdown
- https://github.com/erusev/parsedown
- https://github.com/erusev/parsedown-extra

mw-markdown-v0.2.zip    https://github.com/bharley/mw-markdown/archive/refs/heads/master.zip
parsedown-master-x.zip      https://github.com/erusev/parsedown/archive/refs/heads/master.zip
parsedown-extra-v2.0.x.zip  https://github.com/erusev/parsedown-extra/archive/refs/heads/master.zip

アップデートとパッケージ追加。それと実行時コマンドログ。
※ Dockerfile を作成し、その中で composer コマンドを追加しています！

composer require erusev/parsedown
composer require erusev/parsedown-extra

```bash
[debian work]$ docker compose exec -it mediawiki bash
.bashrc
.bash_aliases
[463925d8c4d3 ~]# cd /var/www/html/vendor/
## ------------------------------------------------------------
## アップデート
## ------------------------------------------------------------
[463925d8c4d3 vendor]# composer update

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading wikimedia/wikipeg (4.0.0 => 4.0.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 1 update, 0 removals
  - Downloading php-parallel-lint/php-parallel-lint (v1.4.0)
  - Downloading wikimedia/wikipeg (4.0.2)
  - Installing php-parallel-lint/php-parallel-lint (v1.4.0): Extracting archive
  - Upgrading wikimedia/wikipeg (4.0.0 => 4.0.2): Extracting archive
Generating optimized autoload files
12 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.

## ------------------------------------------------------------
## パッケージ追加
## composer require erusev/parsedown
## ------------------------------------------------------------

[463925d8c4d3 vendor]# composer require erusev/parsedown

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
./composer.json has been updated
Running composer update erusev/parsedown
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking erusev/parsedown (1.7.4)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Downloading erusev/parsedown (1.7.4)
  - Installing erusev/parsedown (1.7.4): Extracting archive
Generating optimized autoload files
12 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^1.7 for erusev/parsedown


## ------------------------------------------------------------
## パッケージ追加
## composer require erusev/parsedown-extra
## ------------------------------------------------------------

[463925d8c4d3 vendor]# composer require erusev/parsedown-extra

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
./composer.json has been updated
Running composer update erusev/parsedown-extra
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking erusev/parsedown-extra (0.8.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Downloading erusev/parsedown-extra (0.8.1)
  - Installing erusev/parsedown-extra (0.8.1): Extracting archive
Generating optimized autoload files
12 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^0.8.1 for erusev/parsedown-extra
[463925d8c4d3 vendor]# 
```

LocalSettings.php ファイルの末尾に追記

```LocalSettings.php
# https://qiita.com/nanbuwks/items/9a1bd400fe89f15fdec4
# https://github.com/bharley/mw-markdown/blob/master/README.md
require_once("$IP/extensions/Markdown/Markdown.php");

$wgMarkdownExtra        = true;
$wgMarkdownHighlight    = true;
#$wgMarkdownHighlightJs  = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/highlight.min.js';
#$wgMarkdownHighlightCss = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/styles/default.min.css';
$wgMarkdownHighlightJs  = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/highlight.min.js';
$wgMarkdownHighlightCss = '//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/styles/default.min.css';
```

## MediaWiki設定

コピペしてきた大元どこだかわからなくなりました

### URLのindex.phpを表示しないようにする

https://localhost:8080/index.php/メインページ
URLアドレスに含まれる `index.php` を不要にする。

#### LocalSettings.php

LocalSettings.phpを編集し、末尾に下記のコードを追記します。

```php:LocalSettings.php
$wgScript           = "$wgScriptPath/index.php";
$wgRedirectScript   = "$wgScriptPath/redirect.php";
$wgArticlePath      = "$wgScriptPath/$1";
```

#### .htaccess

新たに ```.htaccess``` ファイルをMediaWikiルートフォルダに作成する。

```.htaccess:.htaccess
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?title=$1 [L,QSA]
```

ファイルが消えないように ```docker-compose.yml``` に追加する。

~/docker/mediawiki/docker-compose.yml

```Dockerfile:~/docker/mediawiki/docker-compose.yml
services:
  mediawiki:
    volumes:
      - ./mediawiki/.htaccess:/var/www/html/.htaccess
```

再起動して確認する

```bash
cd ~/docker/mediawiki/
docker compose up -d --force-recreate
```