Installing mediawiki

From Newroco Tech Docs
Jump to navigationJump to search

mediawiki install Ubuntu 16.04 notes, needs tidying and formatting

Basics

(https://www.mediawiki.org/wiki/Manual:Upgrading need mediawiki upgrade page but could just link to official)

apt-get install screen software-properties-common

Enable universe (for some of the php libraries)

add-apt-repository universe && apt-get update

Install base software

apt-get install apache2 mysql-server mysql-client php php-mysql php-gd php-curl php7.0-intl php7.0-json imagemagick unzip php-mcrypt libapache2-mod-php7.0 php-xml php-mbstring

Configure a password for mysql root and store securely.

Extended search

If you want extended search capability in your wiki, also install Sphinx Search

apt-get install sphinxsearch

edit php.ini to set longer timeouts inline with a working day

vi /etc/php/7.0/apache2/php.ini

and set session.gc_maxlifetime to 43200

If making a VM to be a slave, jump to replication section now

Testing DB

If you want to test connection to your MySQL DB try:

vi /var/www/html/phpinfo.php

<?php phpinfo(); ?>

vi /var/www/html/phpmysql.php

add:

<?php
        $con = mysql_connect("localhost","root","yourMySQLrootPassword");
        if (!$con)
        {
         die('Could not connect: ' . mysql_error());
        }
        else
        {
         echo "Congrats! connection established successfully";
        }
        mysql_close($con);
        ?>

Installing mediawiki files

Download latest version of mediawiki (1.28 at time of writing) from https://www.mediawiki.org/wiki/Download

wget <link>

Then untar it

tar -xzf mediawiki-<version>.tar.gz

Assuming the server will only be serving a wiki, copy the contents of expanded archive to web root (otherwise move the whole directory)

cp -r mediawiki-<version>/* /var/www/html/

Remove Ubuntu's default index page

rm /var/www/html/index.html

Configuration and setup

Visit server via web browser and follow installation steps. Ignore warning regarding cache as is built in to PHP 5.5 and later and will work regardless. Leave at defaults if not clear which option to use.

Configured admin user/password to suit

configured user email to suit (maybe should be a systems one or wikiadmin group depending on IS team setup)

follow steps in later configuration pages as desired, setting default license to CC-BY-SA(Creative Commons Attribution-ShareAlike)

Copied generated LocalSettings.php to /var/www/html

If wanted, place copy of organisation logo (square) in /var/www/html, then

vi LocalSettings.php

and set

$wgLogo="$wgResourceBasePath/<logoname>.png"

$wgServer = "https://<whatever the FQDN will be>" 

(can use something temporary if this will be a migration and change once the DB and image content is migrated over)

CAS (SSO) Authentication

Using https://github.com/CWRUChielLab/CASAuth for CAS

Create folder $WIKI/extensions/CASAuth/

mkdir /var/www/html/extensions/CASAuth/
mv /var/www/html/extensions/CASAuth/

Download CASAuth and phpCAS

wget https://github.com/CWRUChielLab/CASAuth/archive/master.zip
wget https://developer.jasig.org/cas-clients/php/current/CAS-1.3.4.tgz

(latest version of phpCAS can be found here: https://wiki.jasig.org/display/CASC/phpCAS)

Extract and install

tar -xzf CAS-1.3.3.tgz
mv CAS-1.3.3 CAS
unzip master.zip
mv CASAuth-master/* ./
cp CASAuthSettings.php.template CASAuthSettings.php

Edit file CASAuthSettings.php

$CASAuth["Server"]="cas.example.com";
$CASAuth["Url"]="/cas/";    (or the path that cas can be found at)

And replace other example.com config lines to oxfordarchaeology.com

$CASAuth["CreateAccounts"]=true;     (set to false by default)

And would normally set

$CASAuth["RestrictUsers"]=false;

Although you may want to set this to true and enable individual users in some cases, for example where the content should be readable by anyone but only editable by some.

Add following line to LocalSettings.php

require_once( "$IP/extensions/CASAuth/CASAuth.php" );

Enabling SphinxSearch

Create directory under $wiki/extensions/ and download the extension to it

mkdir SphinxSearch
cd SphinxSearch

Download

wget https://github.com/wikimedia/mediawiki-extensions-SphinxSearch/archive/master.tar.gz

unzip resulting file, then delete it.

tar -xzf master.tar.gz
rm master.tar.gz

move the resulting sphinx.conf to place where it will be readable

cp sphinx.conf /etc/sphinxsearch/

Edit sphinx.conf to suit e.g. database name, login details, log file location and create a data directory for sphinx to create indexes in as per the conf file entries. Ensure you change ownership of the data directory to sphinxsearch:sphinxsearch

mkdir -p /var/data/sphinx
chown sphinxsearch:sphinxsearch /var/data/sphinx
mkdir /var/log/sphinx
chown sphinxsearch:sphinxsearch /var/log/sphinx

Edit /etc/default/sphinxsearch

START=yes

Run indexer first run:

indexer --config /etc/sphinxsearch/sphinx.conf --all

Then start sphinxsearch

To keep it updated, create a file in cron.daily and add

indexer --quiet --config /etc/spinxsearch/sphinx.conf wiki_main --rotate >/dev/null  2>&1
indexer --quiet --config /path/to/sphinx.conf wiki_incremental --rotate >/dev/null 2>&1

And if your wiki is active, also create a file in cron.hourly

indexer --quiet --config /path/to/sphinx.conf wiki_incremental --rotate >/dev/null 2>&1

Download a copy of sphinxapi.php and place in extensions/SphinxSearch/

https://raw.githubusercontent.com/romainneutron/Sphinx-Search-API-PHP-Client/master/sphinxapi.php

In the file LocalSettings.php append the following lines:

$wgSearchType = 'SphinxMWSearch';
require_once "$IP/extensions/SphinxSearch/SphinxSearch.php";

Adding extended <code> tag support

Download geshi:

wget https://github.com/GeSHi/geshi-1.0/archive/master.zip
unzip master.zip
cp -r geshi-1.0-master /var/www/html/extensions/SyntaxHighlight_GeSHi/

Create a file and copy the code below in it:

mkdir /var/www/html/extensions/Code
vi /var/www/html/extensions/Code/Code.php
<?php
if( !defined( 'MEDIAWIKI' ) ) {
        echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );
        die( -1 );
}
$wgExtensionCredits['other'][] = array(
        'path'           => __FILE__,
        'name'           => 'Code',
        'version'        => '0.9',
        'author'         => 'Paul Grinberg',
        'url'            => 'https://www.mediawiki.org/wiki/Extension:Code',
        'description'    => 'Allows syntax highlighting using GeSHi'
);

$wgHooks['ParserFirstCallInit'][] = 'efCodeExtensionInit';

function efCodeExtensionInit(Parser &$parser) {
    $parser->setHook( "Code", "efCodeExtensionRenderCode" );
    return true;
}

function efCodeExtensionRenderCode($input, $argv, $parser) {
    global $wgShowHideDivi, $wgOut;

    // default values
    $language = 'text';
    $showLineNumbers = false;
    $showDownloadLink = false;
    $source = $input;
    $tabwidth = 4;

    foreach ($argv as $key => $value) {
        switch ($key) {
 case 'lang':
                $language = $value;
                break;
            case 'linenumbers':
                $showLineNumbers = true;
                break;
            case 'tabwidth':
                $tabwidth = $value;
                break;
            case 'download':
                $showDownloadLink = true;
                break;
            case 'fileurl':
                $html = $parser->unstrip($parser->recursiveTagParse($value),$parser->mStripState);
                $i = preg_match('/<a.*?>(.*?)<\/a>/', $html, $matches);
                $url = $matches[1];
                //print("URL is '$url'");
                #$source = "file_get_contents disabled! Contact your wiki admin with questions.";
                $source =  file_get_contents($url);
                break;
            default :
                wfDebug( __METHOD__.": Requested '$key ==> $value'\n" );
                break;
        }
    }
        if (!defined('GESHI_VERSION')) {
        include('extensions/SyntaxHighlight_GeSHi/geshi-1.0-master/src/geshi.php'); // include only once or else wiki dies
    }
    $geshi = new GeSHi($source, $language);
    $error = $geshi->error();           // die gracefully if errors found
    if ($error) {
        return "Code Extension Error: $error";
 }
    $geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS); // always display line numbers
    $geshi->set_tab_width($tabwidth);
    $code = $geshi->parse_code();
    $code_pieces = preg_split('/\<ol/', $code );

    $output = '';
    $ol_tag = '<ol';
    if (!$showLineNumbers) {
        // if not asked to show line numbers, then we should hide them. This is the preferred method
        // because this allows for a means of a block of code in the middle of a numbered list
        $output .= "<style type='text/css'><!-- ol.codelinenumbers { list-style: none; margin-left: 0; padding-left: 0em;} --></style>";
        $ol_tag = "<ol class='codelinenumbers'";
    }
    $output .= $code_pieces[0];
    if ($showDownloadLink) {
        $output .= "<a href=\"javascript:win3 = window.open('', 'code', 'width=320,height=210,scrollbars=yes');win3.document.writeln('$source');\"  style=\"float:right\">Download Code</a>\n";
    }
    $output .= $ol_tag . $code_pieces[1];

    return $output;
}

Add the following line to /var/www/html/LocalSettings.php:

require_once "$IP/extensions/Code/Code.php";

Apache vhost example for a reverse proxy

NB in virtual host declaration on proxy, use 301 redirect to force SSL - this prevents problems with CAS URL redirects e.g.

<VirtualHost *:80>

       ServerName blahwiki.oxfordarchaeology.com
       ServerAlias blahwiki.thehumanjourney.net

Redirect 301 / https://blahwiki.oxfordarchaeology.com

       ProxyPass / http://192.168.98.45/
       ProxyPassReverse / http://192.168.98.45/
       CustomLog /var/log/apache2/blahwiki.oxfordarchaeology.com.access.log combined
       ErrorLog /var/log/apache2/blahwiki.oxfordarchaeology.com.error.log

</VirtualHost>

<VirtualHost *:443>
       ServerName blahwiki.oxfordarchaeology.com
       SSLEngine on
       SSLCertificateFile /etc/apache2/ssl/oxfordarchaeology.crt
       SSLCertificateKeyFile /etc/apache2/ssl/oxfordarchaeology.com.key
       SSLCertificateChainFile /etc/apache2/ssl/oxfordarchaeology.intermediate.crt
       ProxyPass / http://192.168.98.45/
       ProxyPassReverse / http://blahwiki.oxfordarchaeology.com/
       ProxyPassReverse / http://192.168.98.45/
      CustomLog /var/log/apache2/blahwiki.oxfordarchaeology.com.access.log combined
      ErrorLog /var/log/apache2/blahwiki.oxfordarchaeology.com.error.log
</VirtualHost>


Replication

Following wikipedia with master/slave DB replication and then using rysnc wih --delete flag to keep mediawiki dir synched

On the master:

vi /etc/mysql/my.cnf

set bind-address to the LAN IP of the server

set server-id to something unique for the replication group. Easiest choice is LAN IP (without the dots)

uncomment log_bin

set binlog_do_db to the name of the wiki DB (as per LocalSettings.php)

Restart mysql

service mysql restart

Enter mysql root

mysql -u root -p

Create slave user (username/password as you want)and grant access

GRANT REPLICATION SLAVE ON *.* TO 'username'@'%' IDENTIFIED BY 'password';

FLUSH PRIVILEGES;

Switch to the wikiDB (name as per LocalSettings.php

USE wikiDB

Lock the database to prevent any new changes during setup:

FLUSH TABLES WITH READ LOCK;

Then enter

SHOW MASTER STATUS;

Copy the outcome into text file for reference (as in on your PC)

+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 428 | itwiki | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)


In a new console start a new shell into the master wiki and dump the DB

mysqldump -u root -p --opt nameofwikiDB > /tmp/nameofwikiDB.sql

Now return to original console and unlock the DB


UNLOCK TABLES; EXIT;

On the slave

Goto mysql root

mysql -u root -p

and create the DB to be replicated (name as per previous)

CREATE DATABASE wikiDB;

EXIT;

Copy the SQL file dumped earlier to the slave VM, then import it

mysql -u root -p wikiDB < wikiDB.sql

vi /etc/mysql/my.cnf

set server-id to something unique for the replication group. Easiest choice is LAN IP (without the dots)

uncomment log_bin

set binlog_do_db to the name of the wiki DB (as per LocalSettings.php)

Add line below log_bin

relay-log = /var/log/mysql/mysql-relay-bin.log

Restart mysql

service mysql restart

Goto mysql root

mysql -u root -p

Enter the following command, changing values as appropriate

CHANGE MASTER TO MASTER_HOST='ip.ad.re.ss', MASTER_USER='usernamefromabove',MASTER_PASSWORD='passwordfromabove',MASTER_LOG_FILE='mysql-bin.xxxx',MASTER_LOG_POS=xxx;

Replication (files)

Create user for replication on slave

adduser --disabled-password <username>

su <username>

Create key as per sshauth pages but without a passphrase

change to master server, create account and add key auth as per sshauth page, but prepend key (all one line still) with


from="slave.ip.addr.ess",no-X11-forwarding,no-agent-forwarding,no-port-forwarding

chown html dir on slave to <username>:root

chown -R <username>:root /var/www/html

on slave server change to wiki replication user

su <username>

and run

rsync -a --delete <master.ip.addr.ess>:/var/www/html/ /var/www/html/|more

checking output for errors. NB this command will recursively copy from source to target, deleting any files on target that do not exist on the host

Assuming no errors, create a cron.daily script to keep it up to date and log output (exit from <username> shell)

vi /etc/cron.daily/

  1. !/bin/bash

FULLDATE=`date +%Y-%m-%d:%H:%M:%S` DATE=`date +%Y%m%d` echo $FULLDATE > /tmp/rsynclog chmod +w /tmp/rsynclog sudo -i -u wikisync rsync -av --delete 192.168.98.46:/var/www/html/ /var/www/html/ >> /tmp/rsynclog mv /tmp/rsynclog /var/log/rsynclog-$DATE


Making the slave into the master copy of the wiki may (a) require changing permissions on the web dir, (b) changing master/slave settings in mysql (though should work without, just no write access) and (c) removing the cron.daily script (though it should just mark an error in the log)

---need notes on adding '<code>' tag




Troubleshooting CAS

Enable debug by editting CASAuth.php and adding the line

phpCAS::setDebug()

after

// Load phpCAS
                       require_once($CASAuth["phpCAS"]."/CAS.php");

This creates a logfile in /tmp of the server attempting CAS authentication with detailed information about the CAS attempt and failures.

Remember to comment out or delete the line once the issue has been resolved.

Migration

On the old server dump all pages into an xml file

php /var/www/html/maintenance/dumpBackup.php --full > wikidump.xml

Copy the file to the new server and import it

php /var/www/html/maintenance/importDump.php < wikifile.xml
php /var/www/html/maintenance/rebuildrecentchanges.php

If you also have images, copy the directory /var/www/html/images from the old server to the new one(not in the same location) and import the images. The command will need to run as www-data user so the images will be imported with the right ownership.

sudo -u www-data php /var/www/html/maintenance/importImages.php --search-recursively /path/to/import/images