Manual:ウィキファミリー

This page is a translated version of the page Manual:Wiki family and the translation is 90% complete.

ウィキファミリーとは、同一サーバー上で稼働し、親インストレーションから共通のリソースを共有する一方で、それぞれが独立性を保つ 2 つ以上のウィキの集合体です。 This setup is an alternative to running fully separate installations of MediaWiki. サイト管理者が複数のウィキを管理する作業を軽減したり、inode 使用量を削減したい場合には、これが好ましい選択肢となる可能性があります。 そのため、いくつかのウィキ ホスティング サービスはウィキ ファミリー モデルを選択しています。

The best known implementation of a wiki family is the wiki farm, although other approaches are possible. A list of known wiki farms is available on WikiApiary .

以下は、複数のウィキを立ち上げるためにMediaWikiをセットアップする方法の説明です。

手法

ウィキファーム

以下の手順は、同じバージョンのMediaWikiで複数のウィキを動作させるためのものです。

  1. 最初のウィキを通常通りインストールします。 詳細はManual:インストール ガイド を参照してください。
  2. MediaWikiのインストールをすべてのwikiと共有するために、ウェブサーバを有効にします。 複数の (サブ) ドメインの場合、ウェブ サーバーはすべての関連するドメインからの接続を受け入れるようにしてください。 複数の下位ディレクトリの場合、リライト ルール、別名、シンボリック リンクのいずれかを使用できます。
  3. 現在のウィキを検出するためのコードをLocalSettings.phpの先頭に追加する。 --wiki への引数にハイフンが含まれている場合、その引数はハイフンで分割され、結果として得られる2つの値がそれぞれ MW_DBMW_PREFIX に割り当てられることにご注意ください。 ドメイン名によるウィキの場合:
    $wikis = [
        'example.org' => 'examplewiki',
        'one.example.org' => 'onewiki',
    ];
    if ( defined( 'MW_DB' ) ) {
        // メンテナンススクリプトに--wikiオプションから自動的に設定されます。
        $wikiID = MW_DB;
    } else {
        // 環境変数MW_DBを使うか、ドメイン名をマッピングする
        $wikiID = $_SERVER['MW_DB'] ?? $wikis[ $_SERVER['SERVER_NAME'] ?? '' ] ?? null;
        if ( !$wikiID ) {
            die( 'Unknown wiki.' );
        }
    }
    
    $wgLocalDatabases = $wgConf->wikis = array_values( $wikis );
    $wgDBname = $wikiID;
    $wgDBuser = 'mediawiki';
    
  4. すべてのウィキで異なる必要がある設定を行う例:
    $wgCacheDirectory = "/tmp/mediawiki_cache/$wgDBname";
    $wgUploadDirectory = "$IP/images/$wgDBname";
    $wgUploadPath = "/w/images/$wgDBname";
    
  5. ウィキごとのオーバーライドを設定する。 これは少なくとも $wgServer$wgArticlePath を含むべきです。
    $wgConf->settings = [
        'wgServer' => [
            'examplewiki' => 'https://example.org',
            'onewiki' => 'https://one.example.org',
        ],
        'wgArticlePath' => [
            'default' => '/wiki',
        ],
        'wgSitename' => [
            'default' => 'Example',
            'onewiki' => 'One',
        ],
        'wgLogo' => [
            'default' => '/images/examplewiki/Example_logo.png',
        ],
        'wgLanguageCode' => [
            'default' => 'en',
            'onewiki' => 'pt',
        ],
    ];
    extract( $wgConf->getAll( $wgDBname  ) );
    
    これは、例えば別のファイルから行うことができます:
    # LocalSettings.php
    $wgConf->settings = require __DIR__ . '/LocalSettings_overrides.php';
    
    # LocalSettings_overrides.php
    <?php
    return [
        'wgServer' => ..,
        ..,
    ];
    

To add a new wiki to the family:

設定ファイルの分割

この方法は、完全に独立したWikiを運用しながらも、同じウェブサーバーとMediaWikiのソースコードを共有するためのものです。

  1. 最初のウィキを通常通り、ウェブもしくはCLIインストーラ経由でインストールします。データベースをセットアップして、LocalSettings.php ファイルを生成します。
  2. インストール後、生成されたLocalSettings.phpファイルの名前をLocalSettings_mywiki.phpのようにウィキID(データベース名など)を含むように変更します。
  3. 作成したいウィキごとに、上記のステップ1と2を繰り返します。
  4. 正しいファイルを読み込むLocalSettings.phpファイルを新規に作成します。 上記のウィキファームの例と同様に、--wiki 引数にハイフンが含まれている場合、その引数はハイフンで分割され、結果として得られる 2 つの値がそれぞれ MW_DBMW_PREFIX に割り当てられます。
    <?php
    $wikis = [
        'example.org' => 'examplewiki',
        'one.example.org' => 'onewiki',
    ];
    if ( defined( 'MW_DB' ) ) {
        // メンテナンススクリプトに--wikiオプションから自動的に設定されます。
        $wikiID = MW_DB;
    } else {
        // 環境変数MW_DBを使うか、ドメイン名をマッピングする
        $wikiID = $_SERVER['MW_DB'] ?? $wikis[ $_SERVER['SERVER_NAME'] ?? '' ] ?? null;
    }
    
    if ( $wikiID ) {
        require_once "LocalSettings_$wikiID.php";
    } else {
        die( 'Unknown wiki.' );
    }
    
    // この行の下に、すべてのウィキに適用されるべき設定を追加します。
    // -------
    
    もしウィキが同じドメインにありながら、異なるパス(例:example.org/wiki1example.org/wiki2など)にある場合は、次のような使い方ができます。
    <?php
    $wikis = [
        'example' => 'examplewiki',
        'w_example' => 'examplewiki',
        'one' => 'onewiki',
        'w_one' => 'onewiki',
    ];
    if ( defined( 'MW_DB' ) ) {
        // メンテナンススクリプトに--wikiオプションから自動的に設定されます。
        $wikiID = MW_DB;
    } else {
        $wikiID = $_SERVER['MW_DB'] ?? $wikis[ explode( '/', $_SERVER['REQUEST_URI'], 3 )[1] ] ?? null;
    }
    
    if ( $wikiID ) {
        require_once "LocalSettings_$wikiID.php";
    } else {
        die( 'Unknown wiki.' );
    }
    
Short URLを使用する場合、$wgArticlePath$wgScriptPathの両方を追加する必要があります。

Drupalスタイルのサイト

このセットアップは、利用者に対して完全に透過的であり、画像ディレクトリの点でもそれなりに安全であるという利点があります。

  1. すべてのMediaWikiファイルを格納する基底ディレクトリを作成する。例:mkdir /home/web/mediawiki
  2. MediaWikiと追加ツールを通常通り、バージョンを宣言するサブディレクトリ(例:/home/web/mediawiki/mediawiki-1.10.0)にインストールします。
  3. バージョンを宣言するディレクトリをコードディレクトリにリンクする。 ln -s /home/web/mediawiki/mediawiki-1.10.0 /home/web/mediawiki/code
  4. 画像と設定を含むsitesディレクトリを作成: mkdir /home/web/mediawiki/sites
  5. 通常通り「/code」ディレクトリからウィキをセットアップします。
  6. インストール成功後に、LocalSettings.php をサイトチェック時に適合する /site ディレクトリに移動します。 例えば、http://example.com/mywikiをキャプチャするために、example.com.mywikiというディレクトリを作成する。 mkdir /home/web/mediawiki/sites/example.com.mywiki これについては、Drupalのsettings.phpファイルを参照してください。
  7. メディアファイルを使用する場合は、サイトディレクトリにimagesディレクトリを作成してください。 mkdir /home/web/mediawiki/sites/example.com.wiki/images 必要に応じて書き込み可能に設定。
  8. Drupal スタイルの LocalSettings.php ファイルをメインディレクトリに設置: cp DrupalLocalSettings.php /home/web/mediawiki/code/LocalSettings.php
  9. 各サブサイトのLocalSettings.phpを修正し、適切な場所を指すようにします:
    1. まず、$IPに関するコード(1.15.3の16-20行目)をコメントアウトします。これは、index.phpによってcodeディレクトリに設定されるためです。
    2. 次に、画像ファイルにアクセスできるように、次の2行を挿入します。:$wgUploadDirectory = "/home/web/mediawiki/sites/wiki.example.com/images";$wgUploadPath = "/images"; 変数のリセットを防ぐため、2行の挿入位置はDefaultSettings.php (1.15.3の25行目)呼び出しより以降にする。
    3. 必要に応じて、さらに修正を加えてください。
  10. Apache 2のインストールを準備します。サンプルサイト: wiki.example.com
    1. 必要であれば、codeディレクトリへのリンクを作成。 ln -s /home/web/mediawiki/code /home/web/wiki.example.com
    2. 適切なVHost構成を作成:
      <VirtualHost *:80>
          ServerAdmin me@example.com
          DocumentRoot /home/web/wiki.example.com
          ServerName wiki.example.com
          CustomLog /var/log/apache2/wiki.mysite.log common
          # アクセス可能なサイトのエイリアス
            Alias /mediawiki/code /home/web/mediawiki/code
          # ウィキのエイリアスで画像が使えるようにする
            Alias /images /home/web/mediawiki/sites/wiki.example.com/images
          # パスワードで保護したい場合
          #  <Directory /home/web/wiki.example.com>
          #    AuthType Basic
          #    AuthName "My protected wiki"
          #    AuthUserFile /etc/apache2/htpasswd/users-mywiki
          #   require valid-user
          #  </Directory>
      </VirtualHost>
      
11. サイトをローカルに設置する場合は、hostsファイルをサイト名に更新してください。 これでサイトは正常に動作するはずです。

私の場合、LocalSettings.phpやデータベースのインストールや更新をするために、そこからコードの別のコピーを作成しました。 なお、コマンドラインからメンテナンススクリプトを実行する場合、付属のDrupalコードの$_SERVER['HTTP_HOST']は未定義であるため、この解決策では、何らかの修正なしにメンテナンススクリプトを使用することはできません。

Ubuntu用に修正されたDrupalスタイル方式

Ubuntu/Kubuntuで複数のウィキと複数の(あるいはネストした)サブウィキを作成するための簡略な方法は、上記の方法と基本同じであり、以下のサイトに掲載されています。

How wiki farms are handled in maintenance scripts

MediaWiki maintenance scripts (e.g. update.php) accept a --wiki argument that is passed to your LocalSettings.php file as the constants MW_DB, MW_PREFIX, and MW_WIKI_NAME. The entire value of the --wiki argument is the value of MW_WIKI_NAME.

If there is a dash in the --wiki argument, then the part before the dash is assigned to MW_DB and the part after the dash is assigned to MW_PREFIX.

This table demonstrates how this works:

How the --wiki argument is parsed.
--wiki MW_WIKI_NAME MW_DB MW_PREFIX
enwiki enwiki enwiki empty
enwiki-one enwiki-one enwiki one
enwiki-one-two enwiki-one-two enwiki one-two

ウェブ リクエストには --wiki の引数がないため、それらは異なる方法で処理する必要があります。 通常、ドメイン名および/または URL パスがウィキを選択するために使用されます。

ウィキ間の共有のコツ

アップロードされたメディアファイルをウィキ間で共有するために$wgForeignFileRepos を利用することができます。これは、ウィキペディアのためのウィキメディアコモンズに似ています。

例:

  • en.example.org - 英語
  • fr.example.org - フランス語
  • de.example.org - ドイツ語
  • pool.example.org - すべてのウィキで共有されるメディアファイル。
上記の例では、「pool」という名前を使用しています。ウィキメディアコモンズcommonsという名前のウィキ間リンクと競合する可能性があるため、「commons」という名前の使用は避けてください。 また、"media"という名前(例:media.example.org)は、インターウィキとローカルメディアファイル(例:[[media:File.png]])にアクセスするための内部名前空間Media:との間で衝突を引き起こす可能性があるため、使用しないようにしてください。

データベーステーブルの共有

利用者アカウントに共有データベースを使用することを検討してください。 共有データベーステーブルの設定方法については、Manual:共有データベース を参照してください。

インターウィキ

Extension:Interwiki を利用することで、すべてのウィキ間でウィキ間リンクを作成することができます。 ウィキが言語版である場合、インターウィキの接頭辞に正確な言語コードの名前を付けることをお勧めします。例えば、あなたの家族のドイツ語版ウィキには"de"とします。 こうすることで、同じテーマに関するページを言語リンクでつなげることができます。

英語版のメインページに[[de:Hauptseite]] を追加すると、言語サイドバーに「ドイツ語版」というリンクが作成されます。 詳細情報は Help:Interwiki linking を参照してください。

ファイル用のセントラルウィキがある場合は、それ用のプレフィックスも作成してください。 例:pool→https://pool.example.org/wiki/$1、「転送」チェックボックスを有効にすると、同系列のローカルウィキとして認識されます。

アップロード

pool-wikiの「images」フォルダが書き込み可能であることを確認します。

言語版ウィキの「ファイルのアップロード」リンクを、poolwikiのアップロードサイトに変更するのが便利です。 各言語版ウィキのLocalSettings.phpを開き、以下のコードを追加。

$wgUploadNavigationUrl = "https://pool.example.org/index.php/Special:Upload";

1.17では、赤リンクでpool-wikiにリダイレクトされるように$wgUploadMissingFileUrlも設定する必要があります。

$wgUploadMissingFileUrl= "https://pool.example.org/index.php/Special:Upload";

プールウィキにのみアップロードを許可したい場合は、以下のような使い方をします。

if ( $wgDBname === 'pool' ) {
	$wgEnableUploads = true;
} else {
	$wgEnableUploads = false;
}

共有ファイルを利用

言語版ウィキで poolwiki のファイルを使用するには、それぞれの言語版ウィキの「LocalSettings.php」を開き、以下の行を追加します。

$wgUseSharedUploads = true;
$wgSharedUploadPath = 'https://pool.example.org/images';
$wgSharedUploadDirectory = '/(LOCALPATH)/POOL-FOLDER/images/';
$wgHashedSharedUploadDirectory = true;

これで多言語ウィキにおいて pool ディレクトリから複数のファイルを呼び出そうとした時、例えば [[File:MyLogo.png]] というメディアに統一できます。

画像の説明

各言語版ウィキで、メッセージMediaWiki:Sharedupload-desc-hereを(管理者として)開いてください。

次のようにテキストを変更します。

このファイルはここでのデータプールに保存されます。
情報と説明については、[[:pool:File:{{PAGENAME}}|こちらの説明]]を参照してください。

(ここで英文の先頭の「:」に注目。これを書くとページ左側のウィキ間リンクの一覧で「pool」を読み込まなくなります。)

共有ディレクトリの poolwiki に保存したメディアの説明文を出力したい場合、それぞれの言語版ウィキの「LocalSettings.php」に以下のコードを追加します:

$wgFetchCommonsDescriptions = true;
$wgSharedUploadDBname = 'pool';  # DB-Name of PoolWiki
$wgSharedUploadDBprefix = 'wiki_'; # Table name prefix for PoolWiki
$wgRepositoryBaseUrl = "https://pool.example.org/index.php/Image:";

ウィキファームの拡張機能

1つのコードベースを使って複数のWikiのホスティングを簡素化しようとするMediaWikiの拡張機能がいくつかありますが、現在注目すべきは1つだけです。

関連項目