Jump to content

Manual:Wiki农场

本頁使用了標題或全文手工轉換
本頁使用了標題或全文手工轉換
From mediawiki.org
This page is a translated version of the page Manual:Wiki family and the translation is 100% complete.

維基家族是指兩個或多個wiki在同一伺服器上運行,並共享父安裝的一組公共資源,然而每個wiki在其他方面卻能保持獨立。 這種設定是運行完全獨立的 MediaWiki 安裝的替代方案。 如果網站管理員想要減少管理多個維基的工作量,或減少inode的使用,這可能是個不錯的選擇。 因此,一些維基託管服務選擇採用維基家族模式。

維基家族最著名的實現方式是“維基農場”,儘管還有其他方法。 在WikiApiary 上有提供了一個已知維基農場列表

下面是设置MediaWiki的各個指示,說明如何托管多个wiki

方法

维基农场

以下步骤是在相同版本的MediaWiki中运行多个wiki

  1. 正常安装第一个wiki。 更多资料,請看Manual:安装指南
  2. 請確保您未來的維基網站可以存取同一台網頁伺服器和 MediaWiki 安裝。 使用(子)網域名稱時,請確保您的 Web 伺服器接受所有虛擬主機的連線(例如在 Apache 或 nginx 中)。 如果你使用Quickstart 和本地运营时,这不需要任何更改。 當使用子目录時,你可以使用重写规则、别名、或符号链接。
  3. LocalSettings.php顶部添加如下代码,以偵測当前的wiki。 請注意,MediaWiki會自動解析 --wiki 參數以支援可選的連字符,其中前半部份分配給 MW_DB,可選的後半部份分配給 MW_PREFIX。 使用網域名稱時的範例:
    // Wiki family
    // https://www.mediawiki.org/wiki/Manual:Wiki_family
    $wikis = [
        'central.localhost:4000' => 'centralwiki',
        'foo.localhost:4000' => 'foowiki',
        'bar.localhost:4000' => 'barwiki',
    ];
    $wgConf->suffixes = [ 'wiki' ];
    $wgLocalDatabases = $wgConf->wikis = array_values( $wikis );
    if ( defined( 'MW_DB' ) ) {
        // 自动引用传给维护脚本的--wiki选项
        $wgDBname = MW_DB;
    } else {
        // 使用MW_DB环境变量或映射域名
        $wgDBname = $_SERVER['MW_DB'] ?? $wikis[ $_SERVER['HTTP_HOST'] ?? '' ] ?? null;
        if ( !$wgDBname ) {
            die( 'Unknown wiki.' );
        }
    }
    
  4. 設定所有wiki必要的不同的设置。例如:
    $wgCacheDirectory = "/tmp/mediawiki_cache/$wgDBname";
    $wgUploadDirectory = "$IP/images/$wgDBname";
    $wgUploadPath = "/w/images/$wgDBname";
    
  5. 設定前一個维基的改写。 这应该包括至少$wgServer$wgArticlePath
    $wgConf->settings = [
        'wgServer' => [
            'centralwiki' => 'http://central.localhost:4000',
            'foowiki' => 'http://foo.localhost:4000',
            'barwiki' => 'http://bar.localhost:4000',
        ],
        'wgArticlePath' => [
            'default' => '/index.php/$1',
        ],
        'wgSitename' => [
            'default' => $wgDBname,
            // 'foowiki' => 'Foo',
        ],
        'wgLogo' => [
            // 'foowiki' => '/images/foowiki/Logo.png',
        ],
        'wgLanguageCode' => [
            // 'foowiki' => 'pt',
        ],
    ];
    extract( $wgConf->getAll( $wgDBname ) );
    
    这可以从单独的文件完成,例如:
    # LocalSettings.php
    $wgConf->settings = require __DIR__ . '/LocalSettings_overrides.php';
    
    # LocalSettings_overrides.php
    <?php
    return [
        'wgServer' => ..,
        ..,
    ];
    

要為家族添加新的維基:

  • 為wiki建立一個空資料庫 ,然後在 LocalSettings.php 中配置wiki(至少 $wikis 映射和一個在$wgConf中的wgServer下的鍵)。 Then use the web installer to install the database. Settings you specify here will not be saved and you can discard the LocalSettings.php file it generates. 請避免使用命令列中的 install.php 來安裝資料庫,因為這要不是會拒絕啟動、就是會覆蓋掉你的 LocalSettings.php 檔案。
  • 运行php maintenance/run.php update --wiki=mywiki

单独的设置文件

这种方法是用于操作完全独立的wiki們,但仍共享相同的Web服务器和MediaWiki源代码。

  1. 像往常一样,通过Web或CLI安装程序安装第一个wiki,这会设置您的数据库并生成一个LocalSettings.php 文件。
  2. 安装后,重命名生成的LocalSettings.php文件以包含wiki ID(例如数据库名称),如LocalSettings_mywiki.php
  3. 对要创建的每个wiki重复上述步骤1和2。
  4. 创建一个新的LocalSettings.php文件,该文件将加载正确的文件。 与上面的维基农场示例一样,包含连字符的 --wiki 参数将被分割成两个值,分别分配给 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.' );
    }
    
    // 添加需要应用于此行以下所有wiki的所有设置
    // -------
    
    如果你的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.' );
    }
    
如果您使用短 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到网站目录中,在检查网站时就会匹配。 例如,要捕获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. 接下来插入以下两行,以确保可以访问图像文件,"'示例'":$wgUploadDirectory = "/home/web/mediawiki/sites/wiki.example.com/images";$wgUploadPath = "/images";。 这些变量需要放在调用 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. 创建适当的虚拟主机配置:
      <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 "我的受保护的维基"
          #    AuthUserFile /etc/apache2/htpasswd/users-mywiki
          #   require valid-user
          #  </Directory>
      </VirtualHost>
      
11. 如果在本地设置网站,请用网站名称更新 hosts 文件。 现在网站应该可以正常运行了。

就我而言,我制作了另一份代码副本,用于安装和更新我的LocalSettings.php和数据库。 注意从命令行运行维护脚本时,配套 Drupal 代码中的 $_SERVER['HTTP_HOST'] 未定义,因此此解决方案不能够在不做修改的情况下使用维护脚本。

Ubuntu 的 Drupal 样式设置方法

在 Ubuntu/Kubuntu 上使用多个维基和多个(或嵌套的)子维基的简化方法,大致基于上述方法,可在以下网址找到:

维护脚本如何处理wiki农场

MediaWiki维护脚本(例如update.php)接受一个--wiki参数,该参数将作为常数MW_DBMW_PREFIX、和MW_WIKI_NAME传递给你的LocalSettings.php 文件。 --wiki参数的全部值是MW_WIKI_NAME的值。

如果--wiki参数中有一个破折号,那么破折号之前的部分被分配给MW_DB,破折号之后的部分被分配给MW_PREFIX

本表展示了这如何工作:

--wiki的参数是如何被解析的。
--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路径被用来选择一个wiki。

维基之间共享的技巧

您可以使用$wgForeignFileRepos 在维基中共享上传的媒体文件。这与维基百科的维基共享资源类似。

例如:

  • en.example.org – 英语
  • fr.example.org – 法语
  • de.example.org – 德语
  • pool.example.org – 所有wiki的共享媒体文件。
上面的示例使用名称“pool”。 請避免使用名称“commons”,因为这可能會与同樣称为commons來表示维基共享资源跨维基链接冲突。 还要避免使用名称“media”(例如media.example.org),因为这可能会导致您的跨维基与用于访问本地媒体文件的内部命名空间Media:之间的冲突,例如[[media:File.png]]。

共享数据表

请考虑对用户帐户使用共享数据库。 有关设置共享数据库表的说明,请参阅 手册:共享数据库

跨Wiki

您可以使用Extension:跨wiki 在所有wiki之间创建跨维基链接。 如果wiki是语言编辑版本,建议在确切的语言代码之后命名跨维基前缀。例如,“de”代表您农场中的德语wiki。 这样,您可以使用语言链接连接有关同一主题的页面。

在英文“主页”上添加[[de:Hauptseite]]将在语言侧边栏中创建一个链接“Deutsch”。 更多信息请参见Help:Interwiki linking

如果你有一个用于文件的中央wiki,也要为此创建一个前缀。 例如,pool 到 https://pool.example.org/wiki/$1,并启用“转发”复选框以将其识别为同一系列中的本地 wiki。

上传

首先确认 pool-wiki 文件夹的“images”权限是可写的。

将language-wikis的"Upload file"链接更改为指向 poolwiki 的上传站点很重要。 打开每种语言维基的“LocalSettings.php”,然后添加:

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

在1.17中,您还必须设置$wgUploadMissingFileUrl才能重定向到红色链接上的pool-wiki。

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

如果想要只允许pool wiki上传,使用以下内容:

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

共享文件

要在语言维基中使用poolwiki的文件,请为每个语言wiki打开“LocalSettings.php”并添加:

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

现在,您可以将池的文件与语言维基中的文件(例如[[File:MyLogo.png]])集成。

图像描述

在每个languagewiki中打开(以管理员身份)消息 MediaWiki:Sharedupload-desc-here

将文本更改为:

该文件存储在数据池中(data-pool)。
有关信息和说明,请访问[[: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:";

wiki農場擴充功能

有几个 MediaWiki 扩展试图通过仅使用一个代码库来简化多个 wiki 的托管,但目前只有一个值得参考:

参阅