MediaWiki/Wiki family (farm)/Способ 1

From SysadminWiki.ru
Jump to: navigation, search

Вводная часть

Читайте также:

  • 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;
  • Проверям, что всё работает как мы и ожидаем:
    1. попытка загрузить файл с любой вики переправляет нас на вики pool.
    2. добавление ссылки на изображение [[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.