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

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

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

Contents

Содержимое

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

Лицензия на сборку — GNU GPLv3 или новее. Почему? Потому, что:

Соответственно, на сборку целиком распространяется наиболее жёсткая из этих свободных лицензий, а именно, GPLv3.

MediaWiki

Код доработанного ядра и расширений MediaWiki, а также расширений, созданных нами, живёт на Github у организации «mediawiki4intranet»: https://github.com/mediawiki4intranet/. Там есть репозиторий с ядром MediaWiki, репозиторий с конфигурациями и скриптами деплоя и обслуживания, а также по репозиторию на каждое расширение и тему оформления MediaWiki.

Код оригинальной MediaWiki, кстати, раньше жил в Subversion, а теперь живёт в rupedia:Git-репозиториях Wikimedia, по адресам вида:

Версия Mediawiki4Intranet несколько отстаёт от наиболее свежей стабильной, ибо внешние различия между версиями MediaWiki не так уж и велики, но при этом в новых могут вылезать баги (вроде Bug 37209), и на обновление всех доработок сборки приходится тратить некоторое время.

Историй версий MediaWiki в основе Mediawiki4Intranet:

Патчи

В виде патчей оформляются либо мелкие доработки расширений, либо любые доработки ядра MediaWiki. Сами патчи хранятся в Git-репозитории в виде обычных коммитов, организованных в серию, по принципу 1 коммит = 1 патч.

Attention niels epting.svg При внесении изменений в уже существующий патч вместо добавления новых коммитов происходит переписывание истории! Это приводит к некоторым неудобствам при обновлении веток (нужно руками делать git reset), но зато, по крайней мере, каждый патч достаточно легко выделить и отправить авторам.

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

Расширения

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

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

Список изменений

Изменения в версии Mediawiki4Intranet 1.26 (по сравнению с 1.21): Mediawiki4Intranet/1.26

Установка

Установка через Docker

Простейший способ установить Mediawiki4Intranet — использовать Docker. Наш репозиторий с образом Docker:

https://github.com/mediawiki4intranet/docker

Чтобы установить Mediawiki4Intranet через Docker, установите себе в систему Docker, склонируйте данный репозиторий, зайдите в склонированную директорию и запустите команду:

docker build -t mediawiki4intranet .

Это соберёт образ системы Mediawiki4Intranet. Чтобы запустить на основе этого образа контейнер, запустите:

docker run --name mw4i -p 8077:80 -v /home/wiki4intranet/data -t -d mediawiki4intranet

После чего откройте в браузере адрес http://localhost:8077 и заходите в wiki с логином-паролем WikiSysop/MediaWiki4Intranet.

Attention niels epting.svg В Docker образе не сконфигурирована отправка почты, так как она требует либо настроенного MTA, либо SMTP подключения, а это зависит от окружения, в котором вы запускаете контейнер. Чтобы это исправить, либо пропишите в LocalSettings.php конфигурацию $wgSMTP (для использования внешнего SMTP-сервера), либо установите внутрь контейнера sendmail/postfix и настройте его (это, к сожалению, пока надо делать вручную).

Сборка с VisualEditor

В репозитории есть два Dockerfile'а: базовый без VisualEditor и отдельный с оным. Соответственно, чтобы использовать сборку с VisualEditor, вместо одной команды build нужно запустить две:

docker build -t mediawiki4intranet .
docker build -t mediawiki4intranet/ve -f ve.Dockerfile .

После чего запускать полученный образ аналогично:

docker run --name mw4i -p 8077:80 -v /home/wiki4intranet/data -t -d mediawiki4intranet/ve

Ручная установка

Скачать код

Варианты:

  1. Можно скачать архив с исходниками (примерно 25 МБ)
  2. Можно использовать repo.php для автоматизированного скачивания с помощью системы контроля версий Git (что, разумеется, требует установленного git-клиента):
    git clone https://github.com/mediawiki4intranet/configs mediawiki/configs
    cd mediawiki/configs
    php repo.php install mediawiki4intranet

Установить зависимости

В Debian

В Debian почти всё (кроме UMLGraph и Tika) ставится 1 командой:

apt-get install zip unzip poppler-utils \
    netpbm librsvg2-bin djvulibre-bin texlive-base texlive-extra-utils ffmpeg \
    dia graphviz gnuplot plotutils umlet default-jre diffutils imagemagick sphinxsearch \
    nginx php7.0-fpm php7.0-cli php7.0-json php7.0-opcache php7.0-mbstring php7.0-curl php7.0-gd \
    php7.0-intl php7.0-mysql php7.0-xml php7.0-zip php-imagick php-apcu php-apcu-bc php-mail php-net-smtp

UMLGraph, если хочется, нужно скачать с сайта и подложить в системные пути.

Apache Tika — скачать отсюда: http://wiki.4intra.net/public/tika-app-1.2-fix-TIKA709-TIKA964.jar и добавить в /etc/rc.local:

start-stop-daemon -S -b --pidfile /var/run/tika.pid -m -x /usr/bin/java -- -jar /root/tika-app.jar -p 127.0.0.1:8072 -t -eutf-8

В других ОС

Минимальные требования:

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

Требования конфигурации PHP (директивы php.ini):

Дополнительно нужны сторонние программы — их список внушительный, но почти всё обычно ставится менеджером пакетов:

Создать папку images и пустую БД

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

Также нужно создать для вики MySQL базу данных и пользователя с полным доступом к ней.

Инициализировать БД

Сначала нужно создать структуру БД для «голой» MediaWiki:

  1. Либо просто накатить дамп maintenance/tables.sql:
  2. Либо запустить вики-установщик из папки mw-config — плюс в том, что он ещё проводит дополнительные проверки версии PHP, расширений и т. п.:

Потом нужно дополнить созданную БД таблицами расширений. Для этого нужно:

Создать минимальный конфиг

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

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

Старый Windows-образ

Для того, чтобы быстро попробовать MediaWiki4Intranet на локальной Windows-машине, также есть старая Windows-сборка. Фичи там есть не все, обновляться она скорее всего больше не будет (на данный момент версия 2015-09-04), настроена кривовато (ибо Windows) и не очень безопасно (ибо XAMPP). Раньше это был простейший способ попробовать Mediawiki4Intranet. Подробнее: Windows-сборка Mediawiki4Intranet.

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

$wgDiff3 = 'путь к diff3';

Дополнительная настройка

Отправка E-mail

Для отправки электронной почты нужна рабочая локальная команда sendmail.

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

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

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

Короткие URL

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

Настраиваются с помощью конфигурации вики + конфигурации веб-сервера.

LocalSettings.php

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

Если вы при этом хотите использовать 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.

nginx + php-fpm

    root /path/to/wiki;
    location ~ /\.svn\/|\.bzr\/|\.hg\/|\.git\// {
        deny all;
    }
    location / {
        index index.php;
        try_files $uri @index;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
    }
    location @index {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
    }

Apache 2

Через директивы 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]

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

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

Во-первых, нужно установить Sphinx.

Mediawiki4Intranet использует «realtime» индексы Sphinx, то есть, обновляемые индексы. Ответственное расширение - SphinxSearchEngine. Для конфигурирования есть авто-конфигуратор configs/maintenance/configure-sphinx.php. Использовать так:

$wikis = array('HOST' => array(
  array(
    'name' => 'wiki', // имя индекса - должны быть разные для сожительствующих в одном sphinx'е вик
    'user' => '', // имя пользователя БД
    'pass' => '', // пароль к БД
    'db'   => '', // имя БД
  ),
));

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

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

Attention niels epting.svg На самом деле старые версии документов при обновлениях в индексе остаются, просто прописываются в «Kill-List» — список ID устаревших документов, которые удаляются из результатов поиска. Поэтому при большом количестве обновлений страниц могут пойти тормоза. И хотя сфинкс очень быстрый и тормоза пойдут не скоро, это всё-таки может случиться. Поэтому время от времени полезно делать оптимизацию индекса, подсоединяясь к Sphinx MySQL-клиентом и отправляя ему SQL-запрос OPTIMIZE INDEX index_name.

TikaMW

Apache Tika - библиотека, позволяющая извлекать текст из бинарных файлов (pdf, офисных и т.п). Она используется для индексации содержимого загруженных файлов.

Тику нужно прописать в автозапуск на сервере как-то так:

java -jar tika-app-1.2-fix-TIKA709-TIKA964.jar -p 127.0.0.1:8072 -t -eutf-8

Более подробная информация в статье расширения: TikaMW.

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

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

Поэтому если ваша Wiki «смотрит» в Интернет и не закрыта от него ПОЛНОСТЬЮ (правами, например, или по IP, или базовой авторизацией), используйте наш конфиг ExternalServerSettings.php. В нём изначально включены ConfirmEdit и WikiKCaptcha, а также прописан 30-дневный срок жизни Cookie и необходимость подтверждения e-mail адреса перед редактированием.

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

// Время, в течение которого запрещено создавать статьи (например, 4 суток * 86400 секунд в сутках)
$wgAutoConfirmAge = 86400 * 4;

OpenID

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

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

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