MediaWiki/Wiki family (farm)/Способ 1
Вводная часть
Читайте также:
- MediaWiki - общая статья об установке и настройке MediaWiki
- MediaWiki/Wiki family (farm) - основная статья о создании фермы вики на движке MediaWiki.
Алгоритм:
- Создаём пустой каталог (w-WikiName) для новой вики на том же уровне, что и главная вики (w).
- Создаём в этом каталоге ссылки на все файлы и каталоги из главной вики.
- добавляем в .htaccess правило формирования короткого URL новой вики.
- Настраиваем новую вики через веб-интерфейс.
- Меняем настройки в LocalSettings.php новой вики
Настройка
Теперь выполним эти шаги:
- Создадим скрипт create_wiki.sh, который автоматизирует часть алгоритма:
код скрипта create_wiki.sh
# This script will create all links for a new wiki. # # Public Domain license # # Pavel Malakhov 2011.06.01 24pm@mail.ru, http://sysadminwiki.ru/wiki/MediaWiki/Wiki_family_(farm)/Способ_1 # 2013.01.05 + show config and pause before make any changes # - wiki configuration to wiki manager dir # * dir names are changed according MW >= 1.19.x #-------------- # Variables #-------------- # where to create links for Mediawiki files base=/home/user/www/public_html # where MediaWiki real files are mw=../w # prefix delimiter in table names. We'll use it in config file dbprefix_delimiter="__" #-------------- # Main code #-------------- if [ $# -ne 0 ] then # check if any parameters were passed if [ $# -eq 2 ] then wiki=$1 mw=$2 else wiki=$1 fi wiki_dir=w-$wiki dest=$base/$wiki_dir echo "The new wiki path: $dest" echo “Press Ctrl+C to abort or any key go on. Waiting 7 seconds... ” read -n1 -t7 any_key # create wiki dir and enter it mkdir -p $dest cd $dest # create links to PHP files exept LocalSettings.php for file in `ls $mw | grep .php` do if [ "file" != "LocalSettings.php" ] then ln -s $mw/$file fi done # create links for dirs with common files ln -s $mw/bin ln -s $mw/docs ln -s $mw/extensions ln -s $mw/images ln -s $mw/includes ln -s $mw/languages ln -s $mw/maintenance ln -s $mw/mw-config ln -s $mw/resources ln -s $mw/serialized ln -s $mw/skins ln -s $mw/tests # create dirs with individual files if needed (skins, extensions...) #mkdir skins #-------.htaccess------- # add a new wiki to the redirect rules echo " RewriteRule ^$wiki/(.*)\$ /$wiki_dir/index.php?title=\$1 [PT,L,QSA] RewriteRule ^$wiki/*\$ /$wiki_dir/index.php [L,QSA]" >> $base/.htaccess #-------LocalSettings.php------- # create an individual wiki configuration echo "<?php require_once( \"LS_common_ru.php\" ); require_once( \"LS_access_all.php\" ); \$wgSitename = \"Wiki ($wiki)\"; \$wgScriptPath = '/$wiki_dir'; \$wgArticlePath = '/$wiki/\$1'; \$wgDBprefix = '$wiki$dbprefix_delimiter';" >> $dest/LocalSettings.php echo "DONE!" else echo "Usage: $0 <wiki-name>" echo " or: $0 <wiki-name> [<dir-MW-source>]" echo "" echo "<dir-MW-source> is optional, the default value: '$mw'" echo "" echo "Wiki path: $base/w-<wiki-name>" fi
Определим в нём переменные, согласно тому, что имеем на самом деле.
Этот скрипт создаст каталог новой вики (добавив приставку "w-", разместит в нём ссылки на движок и внесёт правила перенаправления в .htaccess. Далее мы чуть улучшим этот скрипт, чтобы ещё упростить добавление новой вики.
- сделаем скрипт исполняемым и создадим с его помощью каталог w-pool
chmod +x ./create_wiki.sh create_wiki.sh pool
- Заходим в браузере на testwiki.org/w-pool/mw-config/ и выполняем настройку аналогично первой вики, только здесь указываем префикс для таблиц "pool__".
- Копируем созданный файл LocalSettings.php из w-pool/mw-config/ в w-pool/ и добавляем строку:
$wgArticlePath = "/pool/$1";
- Проверяем в testwiki.org/pool/ навигацию, авторизацию и редактирование статьи.
- Пробуем авторизироваться на обоих сайтах, проверяем навигацию и редактирование, обращаем внимание на то, что редактируются статьи на тех вики, где и положено, т.е. правильно работает доступ к таблицам.
- Для соблюдения единообразия, настроим доступ к главной вики также как и ко всем остальным. Для этого создадим с помощью create_wiki.sh ещё один каталог w-main c мягкими ссылками на файлы в "w" и перенесём в него LocalSettings.php, отразив изменения в переменной $wgScriptPath:
$wgScriptPath = "/w-main";
Теперь файл .htaccess примет такой вид:
Options -Indexes RewriteEngine On RewriteRule ^/*$ /w-main/index.php [L,QSA] RewriteRule ^main/(.*)$ /w-main/index.php?title=$1 [PT,L,QSA] RewriteRule ^main/*$ /w-main/index.php [L,QSA] RewriteRule ^pool/(.*)$ /w-pool/index.php?title=$1 [PT,L,QSA] RewriteRule ^pool/*$ /w-pool/index.php [L,QSA]
- Проверяем, что вики testwiki.org/main/ нормально работает
Упрощаем конфигурационные файлы
Вынесем общие для всех вики конфигурационные параметры в файл w/LS_common.php и подключим этот файл в LocalSettings.php каждой вики.
- Оставляем в настройках всех вики только специфичные для них параметры. Вот, например, LocalSettings.php для вики общих ресурсов (pool):
<?php require_once( "LS_common.php" ); $wgSitename = "TestWiki pool"; $wgScriptPath = "/w-pool"; $wgArticlePath = "/pool/$1"; $wgDBprefix = "pool__"; $wgLogo = "$wgStylePath/common/images/wiki.png";
Последний параметр может также быть общим для всех вики и тогда убран отсюда.
Из приведённого кода видно, что сначала мы применяем всё, что в LS_common.php, а затем некоторые переменные переопределяем (поэтому LS_common.php, где хранятся начальные настройки, можно вообще не трогать).
- Аналогично настраиваем LocalSettings.php в остальных вики, включая main для единообразия.
- Проверяем работоспособность проекта
- На этом этапе можно немного донастроить проект, изменив LS_common.php и убедившись, что изменения применились ко всем вики. Например добавим ограничение на редактирование статей только зарегистрированными пользователями:
$wgGroupPermissions['*']['createaccount'] = true; $wgGroupPermissions['*']['read'] = true; $wgGroupPermissions['*']['edit'] = false; $wgGroupPermissions['*']['createpage'] = false; $wgGroupPermissions['*']['createtalk'] = false;
Единый центр авторизации
Теперь настроим единый центр авторизации для всех вики нашего проекта, чтобы пользователь, зарегистрировавшись только в одном месте, получил доступ ко всем вики, причём в разных вики у него могут быть разные права. Чтобы это было возможно, все вики должны использовать единую таблицу пользователей. Мы будем использовать таблицу в вики main.
- Завершим сеанс в каждой вики, если заходили.
- Добавим в LS_common.php строки:
$wgSharedDB = 'mainwiki'; $wgSharedPrefix = 'main__';
Имя базы данных и префикс в таблицах измените на свои.
- Проверяем работает ли.
Единое хранилище файлов
Все вики нашего проекта будут использовать единое хранилище файлов в вики pool.
- Разрешаем загрузку файлов:
# Позволяем загружать файлы $wgEnableUploads = true; # Определяем макс. размер файла $wgMaxUploadSize = 5000000; # Разрешаем загружать только указанные типы файлов $wgFileExtensions = array('png','gif','jpg','jpeg','svg','pdf','doc','docx','xls','xlsx','ods','odg','odt','xml');
- Честно говоря, мне не удалось настроить загрузку файлов в каталог w-pool/images/, и храниться они будут в w/images/, а все операции с файлами будем делать на страницах вики pool. Но может быть это и к лучшему, так как при таком подходе в каталоге w у нас будут храниться все реальный файлы, а в остальных вики только ссылки (кроме LocalSettings.php).
Итак, Добавим в LocalSettings_common.php строки:
# Файлы для всех вики храним в одном месте $wgUseSharedUploads = true; $wgHashedSharedUploadDirectory = true; $wgUploadNavigationUrl = 'http://testwiki.org/pool/Special:Upload'; $wgUploadPath = '/w/images'; $wgSharedUploadPath = $wgUploadPath; $wgUploadDirectory = "/local_path_to_site". $wgUploadPath; $wgSharedUploadDirectory = $wgUploadDirectory;
- Проверям, что всё работает как мы и ожидаем:
- попытка загрузить файл с любой вики переправляет нас на вики pool.
- добавление ссылки на изображение [[Image:Filename.jpg]] в статьях любой вики корректно отображает изображение.
Индивидуальные хранилища
Если же хотим хранить для каждой вики файлы отдельно, то в LocalSettings.php каждой вики добавим строки:
$wgUploadPath = $wgScriptPath ."/images"; $wgUploadDirectory = "local_path_to_site". $wgUploadPath;
Создаём несколько языков для каждой вики
- Создаём на том же уровне, что и каталог w каталог ru и переносим туда все каталоги вики (w-lib, w-main, w-pool), кроме w, на который создаём в ru мягкую ссылку:
cd ru ln -s ../w
- Редактируем LS_common.php:
$wgUploadNavigationUrl = 'http://ru.testwiki.org/pool/Special:Upload';
- Файлы .htaccess будут теперь свои для каждого языка и также создадим один общий уровнем выше
RewriteEngine On #Привязка домена ru.testwiki.org к подкаталогу ru RewriteCond %{HTTP_HOST} (www\.)?ru\.testwiki\.org$ RewriteCond %{REQUEST_URI} !^(/)?ru/ RewriteRule ^(.*)$ ru/$1 RewriteCond %{HTTP_HOST} (www\.)?en\.testwiki\.org$ RewriteCond %{REQUEST_URI} !^(/)?en/ RewriteRule ^(.*)$ en/$1
Разграничиваем доступ к разным вики
см. статью MediaWiki/Ограничение доступа
Добавляем вики в проект
Вики состоит из
1) php файлов (движок), которые предоставляют пользователям интерфейс и выполняют различные действия и
2) базы дынных, где хранится информация
Подготовка файлов
- подготовим файлы (мягкие ссылки) для новой вики:
create_wiki_ru.sh w-WikiName
Создание таблиц в БД
Всё что нам нужно, чтобы создать новую пустую вики - это создать в существующей базе данных пустые таблицы. Для этого:
- проверяем, чтобы в каталоге w не было файла LocalSettings.php;
- заходим на веб страницу testwiki.org/w/ и следуем обычному процессу создания вики;
- файл w/confi/LocalSettings.php переносим в какой-нибудь архив - в проекте он не нужен.
Перенос существующей вики
Если мы хотем добавить в ферму уже существующую вики, то необходимо учесть что у всех таблиц в БД должен быть префикс отличный от уже используемых. Если это не так, то нужно переименовать таблицы, для чего можно использовать специальный php скрипт.
- Создаём дамп существующей базы данных на старом месте в виде sql выражений.
- На новом месте добавляем таблицы в БД.
Все действия можно выполнить либо из командной строки командой mysqldump, либо через веб-интерфейс с помощью phpMyAdmin.
Если по какому-то пункту возникнет вопрос, то см. статью MySQL.