Mediawiki

Aus Mikiwiki
Version vom 14. August 2014, 14:23 Uhr von Michi (Diskussion | Beiträge) (Weblinks)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Die Wiki-Software Mediawiki (auch: MediaWiki) wird seit 2002 als Ersatz für Usemod für die freie Online-Enzyklopädie Wikipedia entwickelt. Inzwischen laufen auch die Wikipedia-Ableger Wikisource (freie Quellen zur Wikipedia), Wiktionary (Wörterbuch), Wikiquote (Zitatensammlung) und Wikibooks (Sachbücher) sowie eine Vielzahl anderer Projekte im Internet oder in Intranets mit dieser Software. Sie ist unter der GPL lizenziert und in der Programmiersprache PHP geschrieben. Zum Speichern der Inhalte wird die relationale Datenbank Mysql genutzt. Wahlweise können inzwischen auch Postgresql und Sqllite als Datenbankserver verwendet werden.

Zur Installation dient ein kleines PHP-Skript. Im Verzeichnis "maintenance/archives" finden sich SQL-Skripte zum Anlegen der Tabellen, Indizes und Benutzer. Nach Anpassung der Datei "LocalSettings.php" müssen alle PHP-Dateien (auch die in den Unterverzeichnissen) in das gewünschte Serververzeichnis kopiert werden. Der Aufruf der Datei "wiki.phtml" im Browser startet das Wiki, wobei "phtml" als PHP-Endung in der Apache-Konfiguration eingetragen sein muss.

Produkte

Ich liste hier nur die von mir selber verwendeten Versionen.

Konzepte

Installation

Das Installationsskript legt drei MySQL-Benutzer an und setzt deren Rechte in der Datenbank.

  • Der Benutzer "$wgDBuser" führt alle normalen Datenbankoperationen durch
  • Der SQL-Benutzer "$wgDBsqluser" hat nur Lesezugriff und wird für die Spezialseite verwendet, auf welcher der Systemverwalter SQL-Abfragen ausführen kann. Dammit können z. B. neue Benutzer gefunden und begrüsst werden.
  • Der Benutzer "$wgDBadminuser" und sein Passwort werden zusätzlich in der Datei "AdminSettings.php" eingetragen. Dieser Benutzer mit Schreibrecht auf die Wiki-Datenbank wird bei der Installation und von den Wartungsskripten verwendet.

Das Installationsskript (früher "install.php") fragt u. a. nach dem MySQL-Root-Passwort und legt die Datenbank, Tabellen und MySQL-Benutzer an. Zuletzt wird angeboten, zwei Wiki-Benutzerkonten (Sysop, Developer) anzulegen. Die Konfiguration des Webservers beschränkt sich darauf, die Dateiendung ".phtml" als PHP-Erweiterung einzutragen.

AddType application/x-httpd-php .php .phtml

Im bei der Installation erzeugten Verzeichnis "upload", in dem Mediawiki hochgeladene Dateien speichert, sollte die Ausführung von PHP und die Darstellung von HTML verboten sein:

<Directory "/path/to/upload/directory">
  AllowOverride None
  AddType text/plain .html .htm .shtml
  php_admin_flag engine off
</Directory>

Konfiguration

Die Konfiguration von Mediawiki findet in der Datei "LocalSettings.php" statt.

Grundkonfiguration
$IP Lokaler Pfad, auf dem Rechner, in den das Wiki kopiert werden soll, z. B. "/srv/www/htdocs"
$wgServer Teil der Rechneradresse vor dem ersten Schrägstrich, z. B. "http://www.meinwiki.ch/"
$wgScriptPath Unterverzeichnis mit den PHP-Dateien, z. B. "wiki"; diese Variable wird leergelassen (""), wenn diese im Hauptverzeichnis liegen.
$wgEmergencyContact E-Mail-Adresse des Systemverwalters, die bei Problemen angezeigt wird.
$wgDBserver Name der Mysql-Datenbank.
$wgDBuser
$wgDBpassword
Mysql-Benutzer für den normalen Datenbankzugriff.
$wgDBsqluser
$wgDBsqlpassword
Mysql-Benutzer für SQL-Abfragen über den Webbrowser, hat nur Leserechte.
$wgLanguageCode Zwei-Buchstaben-Code der verwendeten Sprache, z. B. "de" für Deutsch.

Für ein schnelleres Laden der Inhalte sowie weniger Bandbreitenverbrauch können häufig geladene Dateien wie "main.css" oder "wikibits.js" von überflüssigen Kommentaren und Leerzeichen befreit werden.

FAQ

Änderung des Icons im Webbrowser

Das sogenannte Favicon im Webbrowser links vom URL kann in der Datei "DefaultSettings.php" mit folgender Variable bestimmt werden. Im Beispiel befindet sich die Datei "favicon.ico" im Apache-Wurzelverzeichnis.

$wgFavicon = '/favicon.ico';

Ausblenden der Sidebar auf linker Seite

Folgender Code muss in der Datei "skins/vector/vecor.js" vor dem abschliessenden "});" eingebaut werden.

  • Danach kann durch Drücken der Taste "F3" der Bereich der Sidebar auf der linken Seite ausgeblendet werden.
  • Ein Neuladen der Seite über die Taste "F5" zeigt wieder den normalen Zustand.
        $('document').ready(function() {
                $("body").keydown(function (e) {
                        if (e.keyCode == 114) { //F3 to collapse
                          $("#mw-panel").toggle();
                          $("div#mw-panel").css('display', 'none');
                          $("#left-navigation").css('left', '1em');
                          $("#mw-head-base").css('margin-left', '1em');
                          $("div#content").css('margin-left', '1em');
                          $("div#footer").css('margin-left', '1em');
                        }
                });
        });

Ein- und ausklappbare Tabellen

Folgender Code muss in "MediaWiki:Common.js" eingebaut werden.

/*<source lang="javascript">*/
 
/** Collapsible tables *********************************************************
  *
  *  Description: Allows tables to be collapsed, showing only the header. See
  *               [[Wikipedia:NavFrame]].
  *  Maintainer on Wikipedia: [[User:R. Koot]]
  */
 
var autoCollapse = 2;
var collapseCaption = "hide";
var expandCaption = "show";
 
function hasClass( element, className ) {
  var Classes = element.className.split( " " );
  for ( var i = 0; i < Classes.length; i++ ) {
    if ( Classes[i] == className ) {
      return ( true );
    }
  }
  return ( false );
}
 
function collapseTable( tableIndex )
{
     var Button = document.getElementById( "collapseButton" + tableIndex );
     var Table = document.getElementById( "collapsibleTable" + tableIndex );
 
     if ( !Table || !Button ) {
         return false;
     }
 
     var Rows = Table.getElementsByTagName( "tr" ); 
 
     if ( Button.firstChild.data == collapseCaption ) {
         for ( var i = 1; i < Rows.length; i++ ) {
             Rows[i].style.display = "none";
         }
         Button.firstChild.data = expandCaption;
     } else {
         for ( var i = 1; i < Rows.length; i++ ) {
             Rows[i].style.display = Rows[0].style.display;
         }
         Button.firstChild.data = collapseCaption;
     }
}
 
function createCollapseButtons()
{
     var tableIndex = 0;
     var NavigationBoxes = new Object();
     var Tables = document.getElementsByTagName( "table" );
 
     for ( var i = 0; i < Tables.length; i++ ) {
         if ( hasClass( Tables[i], "collapsible" ) ) {
             NavigationBoxes[ tableIndex ] = Tables[i];
             Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
 
             var Button     = document.createElement( "span" );
             var ButtonLink = document.createElement( "a" );
             var ButtonText = document.createTextNode( collapseCaption );
 
             Button.style.styleFloat = "right";
             Button.style.cssFloat = "right";
             Button.style.fontWeight = "normal";
             Button.style.textAlign = "right";
             Button.style.width = "6em";
 
             ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
             ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
             ButtonLink.appendChild( ButtonText );
 
             Button.appendChild( document.createTextNode( "[" ) );
             Button.appendChild( ButtonLink );
             Button.appendChild( document.createTextNode( "]" ) );
 
             var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
             /* only add button and increment count if there is a header row to work with */
             if (Header) {
                 Header.insertBefore( Button, Header.childNodes[0] );
                 tableIndex++;
             }
         }
     }
 
     for ( var i = 0;  i < tableIndex; i++ ) {
         if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
             collapseTable( i );
         }
     }
}
 
addOnloadHook( createCollapseButtons );

Fehlersuche

Lokale Links

Performanceverbesserung

Benutzeranpassungen

Sicherung

Eine Sicherung von Mediawiki besteht aus folgenden Teilen:

  • der Wiki-Inhalt aus der Mysql-Datenbank, der auf zwei Arten erstellt werden kann:
    • ein SQL-Datenbankdump mit "mysqldump"
    • ein XML-Datenbankdump mit dem Skript "dumpBackup.php" (dafür muss die Datei "AdminSettings.php" konfiguriert sein)
  • die Bilder und sonstigen Dateien mit tar
  • Konfigurationsdateien wie "LocalSettings.php" oder "AdminSettings.php"
  • Mediawiki-Programmdateien, einschliesslich aller Skins und Erweiterungen

Ich nutze für die tägliche Sicherung das Skript "MEDIAWIKIbackup-kuhn.sh".

$ mkdir /home/mik/bin && cd /home/mik/bin
$ vi MEDIAWIKIbackup-kuhn.sh
$ chmod 744 MEDIAWIKIbackup-kuhn.sh

Die crontab von Benutzer "mik" ruft das Skript wie folgt auf.

30 5 * * * /home/mik/bin/MEDIAWIKIbackup-kuhn.sh database /var/www/directory emailaddress

Das Skript "MEDIAWIKIbackup-kuhn.sh" hat folgenden Inhalt:

#!/bin/bash
#
# Name         MEDIAWIKIbackup-kuhn.sh
# Author       Michael Kuhn
# Date         28 December 2008
# Description  Basic backup script for a Mediawiki installation

# set -x

##### CONFIGURATION #####
 
# The database the wiki stores data in
DATABASE="$1"
#
USER="root"
#
PASSWORD=
#
# The directory Mediawiki is installed in 
MEDIAWIKIPATH="$2"
#
# The directory to write the backup to
BACKUPPATH="~/backup/mediawiki"
#
# File system where the BACKUPPATH resides (according to "df -k")
BACKUPFILESYSTEM="/dev/hdv1"
#
# An e-mail address to notify
EMAILTO="$3"

##### MAIN #####

     TIMESTAMP=$(date -I)
  DATABASEDUMP=${BACKUPPATH}/DBSAVE${DATABASE}-${TIMESTAMP}.sql.bz2
   XMLFULLDUMP=${BACKUPPATH}/DBSAVE${DATABASE}-full-${TIMESTAMP}.xml.bz2
XMLCURRENTDUMP=${BACKUPPATH}/DBSAVE${DATABASE}-current-${TIMESTAMP}.xml.bz2
      FILEDUMP=${BACKUPPATH}/${DATABASE}-${TIMESTAMP}.files.bz2
   DISKSEIZURE=$(df -k | grep ^$BACKUPFILESYSTEM | awk '{ print $5 }' | awk 'BEGIN { FS = "" } { print $1 $2 }')

if [ $DISKSEIZURE -gt 90 ]; then
  ( printf "To: ${EMAILTO}\n" ;
    printf "Subject: ALARM!!! $(uname -n) ($1) ";
    printf "${DISKSEIZURE}%% Disk nearly full!!! "
    printf "(hosttime $(date -I))\n";
    printf "\n" ) | /usr/sbin/sendmail -f ${EMAILTO} -t
else
  echo 
  echo "Mediawiki backup"
  echo "  Database : ${DATABASE}"
  echo "  Directory: ${MEDIAWIKIPATH}"
  echo "  Backup to: ${BACKUPPATH}"
  echo
  echo "Creating database dump ${DATABASEDUMP}..."
  /usr/bin/mysqldump -u ${USER} --password=${PASSWORD} --quick ${DATABASE} |\
    bzip2 -c > ${DATABASEDUMP}          || exit $?
  if [ $? = 0 ]
    then
    ( printf "To: ${EMAILTO}\n" ;
      printf "Subject: SUCCESS: $(uname -n) ";
      printf "$(df -k | grep ${BACKUPFILESYSTEM} | awk '{print $5}')% ";
      printf "dump ${DATABASE} (hosttime $(date -I))\n";
      printf "\n" ) | /usr/sbin/sendmail -f ${EMAILTO} -t
  elif [ $? != 0 ]
    then
    ( printf "To: ${EMAILTO}\n" ;
      printf "Subject: ALARM!!! $(uname -n) ";
      printf "Creating dump ${DATABASEDUMP} NOT successful! ";
      printf "(hosttime $(date -I))\n";
      printf "\n" ) | /usr/sbin/sendmail -f ${EMAILTO} -t
  fi
  echo
  echo "Creating XML full dump ${XMLFULLDUMP}..."
  cd ${MEDIAWIKIPATH}/maintenance
  php -d error_reporting=E_ERROR dumpBackup.php --full | \
    bzip2 -c > ${XMLFULLDUMP}           || exit $?

  echo
  echo "Creating XML current dump ${XMLCURRENTDUMP}..."
  cd ${MEDIAWIKIPATH}/maintenance
  php -d error_reporting=E_ERROR dumpBackup.php --current | \
    bzip2 -c > ${XMLCURRENTDUMP}        || exit $?

  echo
  echo "Creating file archive ${FILEDUMP}..."
  cd "${MEDIAWIKIPATH}"
  tar --exclude .svn -zcf ${FILEDUMP} . || exit $?

  echo
  echo "Done!"
  echo
  echo "Files to copy to a safe place:"
  echo "- ${DATABASEDUMP}"
  echo "- ${XMLFULLDUMP}"
  echo "- ${XMLCURRENTDUMP}"
  echo "- ${FILEDUMP}"
fi

##### END #####

Unterstrich im Seitentitel

Zur Anzeige des Unterstrichs (engl. underline, underscore) in einem Mediawiki-Seitentitel kann folgende Variable verwendet werden:

{{DISPLAYTITLE:Titel_mit_Unterstrichen}}

Weblinks

Folgende Weblinks behandeln Mediawiki-Themen:

Siehe die Dokumentation zur Anpassung der Benutzeroberfläche und das Benutzerhandbuch für Hilfe zur Benutzung und Konfiguration.