MediaWiki
Warning: | This page is a work in progress and is not completed. Important informations might be missing or wrong. |
Warning: | These instructions were only tested on Debian. It will probably work for other Linux distributions, but you might need to adapt the provided instructions. |
Install MediaWiki
Warning: | Debian packages are currently unmaintained and outdated. This guide will install MediaWiki from source. For your security, don't forget to follow upstream releases and update your installation. |
Prerequisite
DNS
This guide assume that you are using a dedicated subdomain for your wiki like https://wiki.example.com. Don't forget to point that domain to your webserver.
Database
You will need a database server store all dynamic data (users, articles…). You can check the MariaDB installation guide.
Nginx
In this guide, we will use Nginx as a web server. Please check the Nginx installation guide.
Get source
# cd /var/www
# curl https://releases.wikimedia.org/mediawiki/1.26/mediawiki-1.26.2.tar.gz | tar xz
# chown -R www-data: mediawiki*
Configure PHP
Edit file /etc/php5/mods-available/local-common.ini
and add folder /var/www/mediawiki-1.26.2/
to the open_basedir
setting.
Configure Nginx
- Create the config file
/etc/nginx/sites-available/wiki.example.org
server { include snippets/listen-http.conf; server_name wiki.example.org; access_log /var/log/nginx/wiki.access.log; error_log /var/log/nginx/wiki.error.log info; include snippets/acme-challenge.conf; include snippets/https-permanent-redirect.conf; } server { include snippets/listen-https.conf; server_name wiki.example.org; access_log /var/log/nginx/wiki.access.log; error_log /var/log/nginx/wiki.error.log info; include snippets/acme-challenge.conf; #include snippets/ssl.conf; #ssl_certificate /etc/letsencrypt/live/wiki.example.org/fullchain.pem; #ssl_certificate_key /etc/letsencrypt/live/wiki.example.org/privkey.pem; #include snippets/hsts.conf; root /var/www/mediawiki-1.26.2; index index.php; client_max_body_size 5m; client_body_timeout 60; location / { try_files $uri /index.php?$args; } location /images { location ~ \.php$ {return 403;} } location ~ \.php$ { try_files $uri =404; include fastcgi.conf; fastcgi_pass php5; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { try_files $uri /index.php; expires max; log_not_found off; } location = /_.gif { expires max; empty_gif; } location /dumps { root /var/www/mediawiki-1.26.2/local; autoindex on; } # Mark all of these directories as "internal", which means that they cannot # be explicitly accessed by clients. However, the web server can still use # and serve the files inside of them. This keeps people from poking around # in the wiki's internals. location ^~ /cache/ { internal; } location ^~ /docs/ { internal; } location ^~ /extensions/ { internal; } location ^~ /includes/ { internal; } location ^~ /languages/ { internal; } location ^~ /maintenance/ { internal; } #location ^~ /mw-config/ { internal; } #Uncomment after installation location ^~ /tests/ { internal; } }
- Activate the configuration with
$ sudo nginx_modsite -e wiki.example.org Would you like to reload the Nginx configuration now? (Y/n) Y
- Edit file
/usr/local/etc/certmanage/main.json
and add the following to the list{ "domains": ["wiki.example.org"], "reload": [["/bin/systemctl", "reload", "nginx.service"]] }
- Get your certificate
$ sudo /usr/local/sbin/certmanage Renewing certificate for wiki.example.org that will expire on 0001-01-01 Saving debug log to /var/log/letsencrypt/letsencrypt.log Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org Obtaining a new certificate Performing the following challenges: http-01 challenge for wiki.example.org Using the webroot path /var/www/acme-challenge for all unmatched domains. Waiting for verification... Cleaning up challenges Generating key (2048 bits): /etc/letsencrypt/keys/1764_key-certbot.pem Creating CSR: /etc/letsencrypt/csr/1764_csr-certbot.pem IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/wiki.example.org/fullchain.pem. Your cert will expire on 2025-02-20. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le Restarting services: systemctl reload nginx.service
- Uncomment the ssl related lines in
/etc/nginx/sites-available/wiki.example.org
and run$ sudo systemctl reload nginx.service
Configure
/mw-config
Install Extensions
ParserFunctions
This extension is bundled by default with MediaWiki. You just need to activate it.
Add the line wfLoadExtension( 'ParserFunctions' );
to the file /var/www/mediawiki*/LocalSettings.php
SyntaxHighlight
This extension is bundled by default with MediaWiki. You just need to activate it.
Add the line wfLoadExtension( 'SyntaxHighlight_GeSHi' );
to the file /var/www/mediawiki*/LocalSettings.php
TemplateData
Allows you to describe your templates using structured data for a better experience with the VisualEditor.
https://www.mediawiki.org/wiki/Extension:TemplateData
VisualEditor
Parsoid
The VisualEditor extension require Parsoid to be installed.
Install
The project is still you and instruction might change. See mediawiki instructions.
Configuration
Connect to MediaWiki
Edit configuration in /etc/mediawiki/parsoid/settings.js
parsoidConfig.setMwApi({ uri: 'https://wiki.example.com:443/api.php', prefix: 'localhost', domain: 'wiki.example.com' });
Warning: If you have changed the listening port of your webserver (you are using sslh), you might need to change the 443
in the line above.
You can check your ports using
# netstat -plnt |grep nginx
tcp 0 0 203.0.113.23:4433 0.0.0.0:* LISTEN 1462/nginx: worker
tcp 0 0 203.0.113.23:80 0.0.0.0:* LISTEN 1462/nginx: worker
tcp6 0 0 2001:db8:3:47d0::2e:7::443 :::* LISTEN 1462/nginx: worker
tcp6 0 0 2001:db8:3:47d0::2e:7::80 :::* LISTEN 1462/nginx: worker
Parsoid seems to pick the IPV4 port. 4433 in this case
Logging
If you have issue with making Parsoid work, you can enable debug logging. Just add the line debug: true,
in /etc/mediawiki/parsoid/settings.js
exports.setup = function(parsoidConfig) {
debug: true,
...
Logs are written in /var/log/parsoid/parsoid.log
Restarting
After changing the config, you need to restart Parsoid.
# service parsoid restart
php-curl
VisualEditor require the curl PHP extension
# apt install php5-curl
MobileFrontend
Because a lot of your traffic will come from mobile devices.
- Download MobileFrontend
- Extract it in
/var/www/mediawiki*/extensions/
- Add the following to
/var/www/mediawiki*/LocalSettings.php
require_once "$IP/extensions/MobileFrontend/MobileFrontend.php"; $wgMFAutodetectMobileView = true; # disable talk and watch features $wgMFPageActions = array( 'edit', 'upload' );
For more information, check the extension documentation
Cite
This extension is bundled by default with MediaWiki. You just need to activate it.
Add the line wfLoadExtension( 'Cite' );
to the file /var/www/mediawiki*/LocalSettings.php
Speedup
By default the MediaWiki installation is pretty slow.
Localisation cache
Uncomment the line about $wgCacheDirectory
in /var/www/mediawiki*/LocalSettings.php
.
## Set $wgCacheDirectory to a writable directory on the web server
## to make your wiki go slightly faster. The directory should not
## be publically accessible from the web.
$wgCacheDirectory = "$IP/cache";
Page cache
# Enable generated page cache
$wgUseFileCache = true;
$wgFileCacheDirectory = "$IP/cache";
Enable CronJob
First create the log file
# touch /var/log/mediawiki-runJobs.log
# chown www-data:adm /var/log/mediawiki-runJobs.log
# chmod 640 /var/log/mediawiki-runJobs.log
Then add the following line in /etc/crontab
0 0 * * * www-data /usr/bin/php /var/www/mediawiki-1.26.2/maintenance/runJobs.php > /var/log/mediawiki-runJobs.log
Finally you can disable jobs running on user visits in /var/www/mediawiki*/LocalSettings.php
# Jobs are run by the cronjob. No need to run them on use visits
# https://www.mediawiki.org/wiki/Manual:$wgJobRunRate
$wgJobRunRate = 0;
You can check the number of jobs in the queue at https://wiki.example.com/api.php?action=query&meta=siteinfo&siprop=statistics&format=jsonfm
Other Settings
Canonical links
Page in MediaWiki can be accessed by several URLs. For example the main page of this wiki can be accessed with
- https://wiki.meurisse.org/
- https://wiki.meurisse.org/wiki/Main_Page
- https://wiki.meurisse.org/index.php?title=Main_Page
- https://wiki.meurisse.org/index.php?title=Main_Page&mobileaction=toggle_view_desktop
To avoid issues with duplicated content, it is possible to add a canonical link to all pages
$wgEnableCanonicalServerLink = true;
Capital Links
By default, MediaWiki forces the first letter of a page title to be upper case. The advantage of it is that you can omit the first capital in links,
Eg. You have a page named Test
. You can link to it like This is a [[test]]
.
The drawback is that you can't create a page with lower case title.
Change that in /var/www/mediawiki*/LocalSettings.php
.
$wgCapitalLinks = false;
By default the footer contain several links that we want to configure.
Licence
The license is controlled by these parameters
$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
$wgRightsUrl = "https://creativecommons.org/licenses/by-sa/4.0/";
$wgRightsText = "Creative Commons Attribution-ShareAlike";
$wgRightsIcon = "$wgResourceBasePath/resources/assets/licenses/cc-by-sa.png";
The text of the link itself is the content of the page https://wiki.example.com/wiki/MediaWiki:Copyright
About / Disclaimers / Privacy
The three other default links in the footer are controlled by this pages:
https://wiki.example.com/wiki/MediaWiki:Aboutsite
https://wiki.example.com/wiki/MediaWiki:Disclaimers
https://wiki.example.com/wiki/MediaWiki:Privacy
To remove one of the link set the content of the page to -
.
No-nofollow
By default MediaWiki adds rel="nofollow"
to all external links. While it's usage for real wikis is discussed, it is counterproductive for a personal wiki. It can be disabled in LocalSettings.php
.
$wgNoFollowLinks = false;
Subpages
Subpages are only enabled for some namespaces. Others can be enabled in LocalSettings.php
.
$wgNamespacesWithSubpages[NS_MAIN] = true;
Sitemap
SItemaps are good for SEO as they allow search engines to find pages faster on your site.
Mediawiki comes included with a script that can generate the sitemaps files; but it requires a bit of setup before using it.
- In
/var/www/mediawiki*/LocalSettings.php
add the following lines# Only generate Sitemap for Main(0) and Category(14) namespaces $wgSitemapNamespaces = array(0, 14);
- Create a folder named
sitemap
at the root of your installation - Add this line to
/etc/crontab
You can also force an initial generation of the sitemap files using this command15 0 * * * www-data /usr/bin/php /var/www/mediawiki-1.26.2/maintenance/generateSitemap.php --fspath=/var/www/mediawiki-1.26.2/sitemap --urlpath=https://wiki.example.com/sitemap/ --server=https://wiki.example.com --skip-redirects
$ sudo -u www-data /usr/bin/php /var/www/mediawiki-1.26.2/maintenance/generateSitemap.php --fspath=/var/www/mediawiki-1.26.2/sitemap --urlpath=https://wiki.example.com/sitemap/ --server=https://wiki.example.com --skip-redirects
- Your sitemap will then be accessible at https://wiki.example.com/sitemap/sitemap-index-wiki.xml
- Add this sitemap in the webmaster tools of the targeted search engines