Mediawiki4Intranet

From Wiki4Intranet
Revision as of 23:36, 21 November 2011 by VitaliyFilippov (Talk | contribs) (php5-xcache)

Jump to: navigation, search

MediaWiki — популярная «вики»-система, написанная на PHP и изначально создававшаяся в качестве «движка» Википедии. Отличается отличной расширяемостью — существует более 1700 расширений к ней.

Mediawiki4Intranet — сборка MediaWiki, содержащая в себе довольно большой набор расширений, полезных для внутрикорпоративной среды и, что очень важно, исправленных и «подруженных» между собой — большая часть ошибок, возникающих при интеграции, исправлена.

Об установке см. #Установка.

Содержимое

Сборка состоит из:

  • Кода оригинальной MediaWiki.
  • Установленных расширений.
  • Набора патчей.
  • Нескольких готовых конфигураций для простого создания LocalSettings.php.

Лицензия распространения большинства этого добра: GPLv2, как и у самой MediaWiki. /* Надеемся, что тивоизация нам всё-таки не грозит :) */ Но кое-где и GPLv3.

MediaWiki

Код MediaWiki берётся из SVN Wikimedia.

Версия Mediawiki4Intranet может отставать от стабильной, ибо различия между версиями MediaWiki не так уж и велики, а вот патчи менять приходится прилично.

Версия MediaWiki, лежащая в основе сборки:

  • 2011-02-08 → текущая: 1.16.2.
  • 2010-10-09 → 2011-02-08: 1.14.1.
  • → 2010-10-09: 1.13.1 (в Google Code отсутствует).

Патчи

Патчи содержат в себе изменения в код самой MediaWiki, а также небольшие изменения в расширениях, ради которых не хочется поддерживать отдельную версию этих расширений.

Описание всех патчей, входящих в сборку MediaWiki4Intranet, читайте на странице: Mediawiki4Intranet/Патчи.

Расширения

Отличная расширяемость без использования патчей — важнейшая фишка MediaWiki. Расширения используются заранее заданные в коде точки интеграции («Hooks») и добавляют в MediaWiki новый функционал без необходимости вносить изменения в ядро.

Описание всех расширений, входящих в сборку MediaWiki4Intranet, читайте на странице: Mediawiki4Intranet/Расширения.

Установка

Если вы хотите попробовать MediaWiki4Intranet на своей локальной Windows-машине — скачайте Windows-сборку (примерно 200 МБ). Обновляется она достаточно редко (на данный момент версия 2011-08-02), но зато полностью Standalone и включает в себя все необходимые дополнительные программы. Подробнее: Windows-сборка Mediawiki4Intranet.

Чтобы установить MediaWiki4Intranet к себе на сайт, нужно:

  • Скачать код:
  • В директории для установки создать папку images, читаемую и записываемую веб-сервером.
  • Создать для вики MySQL базу данных и пользователя с полным доступом к ней.
  • Для начального наполнения БД (альтернативы):
    • Либо просто накатить дамп maintenance/tables.sql:
      • Сначала создать минимальный конфиг MediaWiki4Intranet (LocalSettings.php)
      • Выполнить команду php maintenance/patchSql.php maintenance/tables.sql из директории установки вики.
    • Либо запустить вики-установщик из папки config — плюс в том, что он ещё проводит дополнительные проверки версии PHP, расширений и т. п.:
      • Зайти на http://server/wiki/config/, ответить на вопросы, исправить недоразумения (если таковые возникнут), выбрать базу MySQL, InnoDB, 4.1/5.0 utf8 binary. Установщик создаст пустую БД и конфиг.
      • Удалить конфиг, сгенерированный установщиком — в нём куча опций, которые все уже прописаны в правильные значения в конфигах MediaWiki4Intranet.
      • Потом создать минимальный конфиг MediaWiki4Intranet (LocalSettings.php)
  • Запустить php maintenance/update.php из директории установки вики.

Содержимое минимального конфига (LocalSettings.php):

<?php
require_once 'custisinstall/ServerSettings.php'; # это под UNIX, либо BaseSettings.php для винды
$wgDBname = 'wiki'; # имя БД
$wgDBuser = ''; # логин и пароль с полным доступом к этой БД
$wgDBpassword = '';
$wgDBadminuser = $wgDBuser;
$wgDBadminpassword = $wgDBpassword;
$wgScriptPath = '/wiki';

Системные требования

Минимальные требования — на случай, если кто-то забыл про стандартный веб-стек:

  • PHP версии 5 или выше.
  • Примечание: пока что Mediawiki4Intranet может в разных местах ругаться Notice’ами, поэтому пропишите error_reporting = E_ALL & ~E_NOTICE в php.ini. Да, в MediaWiki так не принято — скоро исправим, будет полная тишина и под E_STRICT’ом.
  • Веб-сервер. Проще всего использовать Apache, хотя теоретически должны поддерживаться и IIS, и nginx + php_fpm.
  • СУБД MySQL, желательно, версии 5 или выше.
  • Желательна UNIX-система.

Также нужны следующие расширения PHP:

  • php5-mysql обязательно! :-)
  • php5-gd для обработки картинок.
  • php5-curl для загрузки файлов по URL.

Опционально:

  • php5-xcache для ускорения работы MediaWiki.
  • php5-fss тоже для ускорения, см. подробнее #php5-fss.
  • Для отправки почты — PEAR-пакеты Mail и Net_SMTP, см. подробнее #Отправка E-mail.

Дополнительно могут понадобиться сторонние программы — их список внушительный, но под дистрибутивами Linux’а многое легко ставится менеджером пакетов, а для Windows есть готовая сборка. Здесь представлен общий вид, подробнее — смотрите ниже.

Под Windows не работает следующий функционал MediaWiki4Intranet:

  • Отправка почты в формате HTML
  • По умолчанию отключён Sphinx-поиск
  • По умолчанию отключена поддержка PDF и Djvu
  • По умолчанию отключено слияние при конфликтах редактирования — чтобы включить, нужно установить Windows-версию утилиты diff3, и прописать в LocalSettings.php:
$wgDiff3 = 'путь к diff3';
  • php5-fss собирать скорее всего задолбаетесь, а готовой виндовой версии нет.

Теперь для тех, кто считает, что MySQL — не база данных: сама-то MediaWiki поддерживает и PostgreSQL, и Sqlite, и Oracle, но, во-первых, не все расширения тоже их поддерживают, а во-вторых, при использовании MediaWiki никакого смысла в этих СУБД нет, потому что MediaWiki не генерирует сложные запросы. То есть, вообще.

Отправка E-mail

По умолчанию она включается только под UNIX’ами, потому что под виндой sendmail’а обычно нет. Однако когда включается, нужно поменять две следующие переменные в LocalSettings.php, иначе почта из вики так и будет приходить от Стаса Фомина:

$wgEmergencyContact = 'admin@your.wiki'; # e-mail
$wgPasswordSender = $wgEmergencyContact;

Также, для отправки почты в формате HTML (а не plaintext) нужны PEAR-пакеты Mail и Net_SMTP:

  • pear install Mail; pear install Net_SMTP, либо
  • apt-get install php-mail php-net-smtp (Debian, Ubuntu).

Короткие URL

Под «короткими URL» в вики понимаются адреса статей без index.php/ и тем более без index.php?title=, например, такой URL — «короткий»: http://wiki.4intra.net/Mediawiki4Intranet. Настраиваются с помощью конфигурации в LocalSettings.php:

$wgUsePathInfo = true;
$wgArticlePath = '/$1';

И дополнительно — директив mod_rewrite:

RewriteCond %{THE_REQUEST} ^\S+\s*/*index.php/
RewriteRule ^index.php/(.*)$ /$1 [R=301,L,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?title=$1 [L,B,QSA]

Всё относительно очевидно, но есть нюансы:

  • Если вы при этом хотите использовать API (api.php), то нужно исхитриться следующим образом: $wgUsePathInfo = substr($_SERVER['PHP_SELF'], 0, 10) == '/index.php';. Дело в том, что в MediaWiki принято обычно располагать Script Path в месте, отличном от Rewrite Path. То есть, скрипты класть в yourdomain.com/w/ (index.php, api.php и т. п.), а путь для статей делать yourdomain.com/wiki/. И API рассчитывает на это, и в итоге переданное значение параметра title= в случае равенства путей заменяется на «api.php», что мешает нормально использовать API.
  • В последней строчке обязательно писать именно index.php?title=$1, а не index.php/$1, так как во втором случае при использовании [B] подстраницы (страницы с / в названии) становятся недоступны.
  • Флаг [B] в последней строчке важен. Ибо без [B] mod_rewrite при переписи URL разэкранирует и не экранирует обратно спецсимволы (все, кроме латинских букв и цифр), из-за чего статьи с названиями, содержащими процент (%), становятся недоступны, потому что % в URL-кодировке — спецсимвол, и обязательно должен быть заменён на %25.
  • Флаг [QSA] тоже нужен, ибо без него к ?title=$1 не дописываются остальные параметры URL.
  • Первые две строчки нужны, чтобы с адресов, содержащих в себе index.php/, перенаправить пользователя на «короткие» — это убирает дублирование страниц, которое не любят поисковики.

php5-xcache

Рекомендуется установить и настроить XCache для PHP5. Это весьма неплохо ускоряет работу MediaWiki.

Ещё можно поругать авторов XCache в баге http://xcache.lighttpd.net/ticket/228 за некорректные сообщения об ошибках при запуске php со включённым xcache в CLI режиме :) на функционал не влияет, просто смущает. Обычно конфигурацию модулей для командной строки и апача прописывают общую, а XCache, типа, не работает под CLI, но сообщает об этом кучей предупреждений «PHP Warning: xcache_isset(): xcache.var_size is either 0 or too small to enable var data caching».

php5-fss

Замечательное расширение для PHP, позволяющее ускорить важнейшую для медиавики операцию — замену набора подстрок на набор других подстрок — примерно в 500 раз. «FSS» значит «Fast String Search» на основе алгоритмов Бойера-Мура и Комменца-Вальтера. Посмотреть доклад (мой, ага — VitaliyFilippov 16:21, 30 марта 2011 (MSD)) про это расширение можно здесь: lib:PHP-разгон: серебряная пуля из автомата Комменца-Вальтера (Commentz-Walter).

Реально это ускоряет работу MediaWiki в разы, особенно на больших статьях с большим количеством разметки (например, включений шаблонов, функций парсера…).

На зеркалах дебиана его нет, однако можно собрать из исходников вот отсюда:

Из исходников собирать нужно потому, что пакетов под i386 там нет, только под amd64. Сборка описана для тех, у кого есть под рукой Debian/Ubuntu.

Нужно скачать файлы:

Если нет пакетов php5-dev, debhelper, то поставить:

sudo apt-get install php5-dev
sudo apt-get install debhelper

И далее сказать:

dpkg-source -x php5-fss_0.0.1-3.dsc
cd php5-fss-0.0.1
debian/rules binary
dpkg -i ../php5-fss_0.0.1-3_i386.deb

Либо можно добавить в /etc/apt/sources.list зеркало http://apt.wikimedia.org/wikimedia/ (обязательно с deb-src), и дальше apt-get update; apt-get source php5-fss и дальше всё то же самое.

Для версий PHP >= 5.3 в коде расширения(fss.c, строка 243) также следует изменить строчку

ZVAL_ADDREF(*value);

На строчку

Z_ADDREF_P(*value);

PDF, DJVU, LaTeX

Поддержка постраничного просмотра PDF и DJVU по умолчанию включается только под UNIX-ами. Если вы хотите включить её под Windows, есть большая вероятность, что вы считаете свой Windows почти UNIX’ом — тогда просто используйте ServerSettings.php вместо BaseSettings.php + добавьте

Всё это должно быть прописано в системные пути.

Debian: apt-get install texlive-base djvulibre-bin netpbm ghostscript xpdf-utils

Ещё один специфический момент: в poppler-utils есть баг — команда pdfinfo не учитывает поворот страниц. Это приводит к убогому качеству и/или кривому соотношению сторон у картинок, сгенерированных из ландшафтных PDF’ок. Чтобы сие пофиксить, нужно, к сожалению, патчить pdfinfo: http://wiki.4intra.net/extensions/PdfHandler/poppler-utils.diff. На это нами поставлен баг 41867 авторам poppler’а — надеемся, что когда-нибудь поправят / примут патч.

Graphviz, GNUplot, UMLGraph, PlantUML, UMLEt

  • Graphviz желателен версии не меньше 2.27, так как в предыдущих есть различные мелкие баги.
  • GNUPlot.
  • UMLGraph.
  • UMLet.
  • PlantUML ставить необязательно, он есть в составе MediaWiki4Intranet.
  • UMLGraph, UMLet, PlantUML требуют наличия Java.

Всё это, опять-таки, должно быть в путях.

Поддержка MP4/FLV видео

Здесь требуется ffmpeg (для windows), прописанный в пути.

Sphinx-поиск по вики

Нужно установить и настроить Sphinx.

Вообще тут есть две возможности:

  • Монолитный (необновляемый) индекс. Расширение называется просто SphinxSearch. Работает так: держим два индекса — один полный, другой за последний день. Ночью полная переиндексация, а каждый час/полчаса/5 минут, кому как нравится — переиндексация данных за последний день. Минусы: не используется штатный интерфейс поиска MediaWiki, данные появляются в поиске не мгновенно, ночная переиндексация может занимать приличное время, если данных много.
  • Обновляемый дополняемый индекс. Расширение SphinxSearchEngine. Появляются документы в индексе мгновенно, интерфейс поиска остаётся штатный (только подменяется «движок»). Но — индекс именно дополняемый — по факту ничего удалять из индекса Sphinx (2.0.x) не умеет! То есть, он только делает вид, что умеет — на самом деле в индексе старые версии документов остаются, просто прописываются в «Kill-List» — список ID устаревших документов, которые удаляются из результатов поиска. Поэтому при большом количестве обновлений страниц могут пойти тормоза. И хотя сфинкс очень быстрый и тормоза пойдут не скоро, если пойдут, то время от времени всё равно будет нужно делать переиндексацию:
    1. Остановить демон сфинкса: /etc/init.d/sphinxsearch stop
    2. Удалить файлы индекса: rm /var/lib/sphinxsearch/data/yourwiki.*
    3. Запустить демон обратно: /etc/init.d/sphinxsearch start
    4. Запустить php extensions/SphinxSearchEngine/rebuild-sphinx.php

Для обоих способов есть авто-конфигуратор sphinxsearch/configure.sphinx.php. Использовать так:

  • Создаём рядом с ним файл sphinx.wikis.php, в который прописываем что-то вроде:
$wikis = array('HOST' => array(
  array(
    'name' => 'wiki', // имя индекса - должны быть разные для сожительствующих в одном sphinx'е вик
    'user' => '', // имя пользователя БД
    'pass' => '', // пароль к БД
    'db'   => '', // имя БД
  ),
));
  • Вызываем php configure.sphinx.php --hostname HOST --style STYLE, где STYLE = «rt» (обновляемый индекс) или «local» (обычный индекс). Под UNIX вместо HOST можно использовать имя из /etc/hostname, и тогда можно будет держать один конфиг на несколько серверов, и вызывать без опции --hostname.
  • Будет создан файл sphinx.conf, который нужно скормить Sphinx’у — под UNIX это обычно означает положить его в /etc/sphinxsearch/.
  • Если конфигуратор предложит инициализировать какие-то индексы и выведет для этого команды — делайте, что говорит.
  • Если конфигуратор предложит что-то добавить в /etc/crontab (команды на переиндексацию) — делайте, что говорит.

А в LocalSettings.php нужно включить нужное расширение и прописать его конфигурацию:

Обычный индекс (раскомментируйте и подставьте адрес и порт, если у вас он в итоге отличается):

require_once "$IP/extensions/SphinxSearch/SphinxSearch.php";
$wgSphinxSearch_index = 'main_wiki, inc_wiki';
//$wgSphinxSearch_host = 'localhost';
//$wgSphinxSearch_port = 3112;

Обновляемый индекс:

require_once "$IP/extensions/SphinxSearch/SphinxSearch.php";
$wgSphinxQL_index = 'wiki';
//$wgSphinxQL_host = '';
//$wgSphinxQL_port = '/var/run/searchd.sock'; // UNIX сокет, либо номер TCP-порта SphinxQL

Внимание: автогенерённые конфиги, скорее всего, непригодны для использования под виндами. Вообще, мы под виндами сфинкса не используем и гарантировать работу тоже не можем.

Антиспам для публичных Wiki

В публичных Wiki имеют свойство заводиться спамеры, потому что можно легко зарегистрироваться и создать статью.

Поэтому желательно включить расширение reCAPTCHA, распространяемое вместе с MediaWiki4Intranet, получить ключи для своего домена на http://recaptcha.net/api/getkey, и прописать это всё в LocalSettings.php:

require_once('extensions/recaptcha/ReCaptcha.php');
// Sign up for these at http://recaptcha.net/api/getkey
$recaptcha_public_key = '';
$recaptcha_private_key = '';

У спамеров есть ещё одно свойство — они регистрируются и сразу начинают создавать статьи. Поэтому, можно запретить создавать статьи после регистрации на какой-то период времени (в тяжёлых случаях можно, например, на 4 суток). Для этого нужно прописать следующие директивы в LocalSettings.php:

// Время, в течение которого запрещено создавать статьи (например, 4 суток * 86400 секунд в сутках)
$wgAutoConfirmAge = 86400 * 4;
 
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['delete'] = false;
$wgGroupPermissions['*']['undelete'] = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createtalk'] = false;
$wgGroupPermissions['user']['createpage'] = false;
$wgGroupPermissions['user']['createtalk'] = false;
$wgGroupPermissions['autoconfirmed']['createpage'] = true;
$wgGroupPermissions['autoconfirmed']['createtalk'] = true;
$wgGroupPermissions['sysop']['createpage'] = true;
$wgGroupPermissions['sysop']['createtalk'] = true;
$wgGroupPermissions['bureaucrat']['createpage'] = true;
$wgGroupPermissions['bureaucrat']['createtalk'] = true;

OpenID

В MediaWiki4Intranet есть поддержка OpenID, хотя и глючная, как и вообще любая реализация OpenID. Это не наша вина, и даже не вина авторов расширения OpenID — виноваты здесь авторы библиотеки OpenID для PHP.

Чтобы включить её, нужно прописать следующее в LocalSettings.php:

require_once("$IP/extensions/OpenID/OpenID.setup.php");

Также можно установить PEAR-пакет Auth_OpenID (apt-get install php-openid в Debian). Это необязательно — MediaWiki4Intranet уже включает копию этой библиотеки. Однако если у вас есть копия новее, чем у нас — ставьте… И удаляйте директорию extensions/OpenID/Auth.