get latest snapshot
[mediawiki-setup] / Mediawiki_Setup_Guide
1 == Introduction ==
2
3 '''tldr''': For GNU/Linux (with a bit of Debian bias), a more concise, holistic and automated install than the official Mediawiki docs. Do some initial configuration then download this page and run it, or execute it as you read.
4
5 ''' Goals / Why use this guide? '''
6
7 * Good recommendations. Official docs mostly avoid recommendations among a myriad of possibilities
8 * Closely references & supplements official documentation
9 * Automatic security updates
10 * Explicit automation support wherever practical
11 * Used to setup this site (style is optional)
12 * Support for multiple gnu/linux distros
13 * Holistic scope (backups, server setup), but sections are independent
14 * Code blocks are [https://en.wikipedia.org/wiki/Idempotent idempotent]
15 * Edits to this page are tested on this site and reviewed by the main author.
16
17 '''Assumptions'''
18
19 * Self hosting, single GNU/Linux system with root Bash shell
20
21
22 '''Version Support'''
23
24 Very minor adjustments needed for other distros. Help expand this list.
25 * Mediawiki 1.28, updated as new versions are released
26 * Debian 8 + backports
27 * Debian 8
28 * Debian testing (last tested Aug 7, 2016)
29
30 Pre 5/2016 revisions ran Mediawiki 1.23, tested on Fedora 20 and Ubuntu 14.04.
31
32 == Prerequisites ==
33
34 '''Getting a Server & a Domain'''
35
36 The most common route and the one taken by this site is buying a domain name from a site like namecheap, and a cheap vps from companies like linode or digital ocean. They have good getting started guides which mostly apply beyond their own sites.
37
38 '''Email Setup'''
39
40 Setting up email can be an involved process, and this guide assumes that a some program (usually postfix or exim) is implementing a functional sendmail interface. Mediawiki uses email with to send password reminders or notifications, and this guide includes cronjobs for updating mediawiki and doing backups which will send mail in the case of an error. Email is also the recommended way to get notifications of package updates which require manual steps such as restarting of services.
41
42 If you are not setting up your server to send mail with a program that uses the default sendmail interface, see these pages when you are configuring mediawiki: [[mediawikiwiki:Manual:$wgEnableEmail|Manual:$wgEnableEmail]], [https://www.mediawiki.org/wiki/Configuration_settings#Email_settings Manual:Email_settings], [[mediawikiwiki:Manual:$wgSMTP|Manual:$wgSMTP]]
43
44 == Setup Guide Configuration ==
45
46 # Set variables below
47 # Save the code in this section to a file (~/mw_vars is suggested)
48 # Source it at the beginning of scripts containing later commands
49 # Source it from your .bashrc file while you are setting up Mediawiki
50
51 '''Requires customization:'''
52 <source lang="bash" type="example">
53 # Replace REPLACE_ME as appropriate
54
55 export mwdescription="REPLACE_ME" # eg. Opinionated Free Software Wiki
56
57 # username/pass of the first wiki admin user
58 export wikiuser="REPLACE_ME"
59 export wikipass=REPLACE_ME
60
61 # root password for the mysql database
62 export dbpass=REPLACE_ME
63
64 export mwdomain=REPLACE_ME # domain name. for this site, it's ofswiki.org
65
66 # customize these questions. Try not to have the answer be a word in the question.
67 captchaArray() {
68 if ! grep -Fx '$localSettingsQuestyQuestions = array (' $mwc; then
69 tee -a $mwc <<'EOF'
70 $localSettingsQuestyQuestions = array (
71 "What is the name of the wiki software this site (and wikipedia) uses?" => "Mediawiki",
72 "REPLACE_ME with a question" => "REPLACE_ME with an answer"
73 );
74 EOF
75 fi
76 }
77
78 # The rest of this section will work fine with no changes.
79
80 # git branch for mediawiki + extensions. See intro for supported versions.
81 # branch names: https://git.wikimedia.org/branches/mediawiki%2Fcore.git
82 export mw_branch=REL1_28
83
84 # As set by gui installer when choosing cc by sa.
85 export mw_RightsUrl='https://creativecommons.org/licenses/by-sa/4.0/'
86 export mw_RightsText='Creative Commons Attribution-ShareAlike'
87 export mw_RightsIcon='$wgScriptPath/resources/assets/licenses/cc-by-sa.png'
88
89 # Alphanumeric site name for pywikibot.
90 # Here we use the domain minus the dots, which should work fine without changing.
91 export mwfamily=${mwdomain//./}
92 # install path for mediawiki. This should work fine.
93 export mw=/var/www/$mwdomain/html/w
94
95
96 # wiki sender address / wiki & wiki server contact email.
97 # see email section for more info on email
98 export mw_email="admin@$mwdomain"
99
100 # Leave as is:
101 mwc="$mw/LocalSettings.php"
102 </source>
103
104 == Download this page and run it ==
105
106 This is an option to do automated setup. Optional code blocks are skipped (they have a bold warning just before them and a tag on the source block). The only important things left after running this are running the automated backup setup code on another machine.
107
108 ''' Requires manual step: inspect output file: /tmp/mw-setup, then run it'''
109 <source lang="bash" type="example">
110 start=' *<source lang="bash"> *'
111 end=' *<\/source> *'
112 ruby <<'EOF' | sed -rn "/^$start$/,/^$end$/{s/^$start|$end$/# \0/;p} > /tmp/mw-setup"
113 require 'json'
114 puts JSON.parse(`curl 'https://ofswiki.org/w/api.php?\
115 action=query&titles=Mediawiki_Setup_Guide&prop=revisions&rvprop=content&\
116 format=json'`.chomp)['query']['pages'].values[0]['revisions'][0]['*']
117 EOF
118 chmod +x /tmp/mw-setup
119 </source>
120
121 == Required Bash Functions ==
122
123 Here we define some small useful bash functions. This should be part of the same ~/mw_vars file if you are running the code step by step.
124
125 <source lang="bash">
126 # identify if this is a debian based distro
127 isdeb() { command -v apt &>/dev/null; }
128 # tee unique. append each stdin line if it does not exist in the file
129 teeu () {
130 local MAPFILE
131 mapfile -t
132 for line in "${MAPFILE[@]}"; do
133 grep -xFq "$line" "$1" &>/dev/null || tee -a "$1" <<<"$line"
134 done
135 }
136
137 # get and reset an extension/skin repository, and enable it
138 mw-clone() {
139 local url=$1
140 local original_pwd="$PWD"
141 local name
142 local re='[^/]*/[^/]*$'
143 [[ $url =~ $re ]] ||:
144 target=$mw/${BASH_REMATCH[0]}
145 if [[ ! -e $target/.git ]]; then
146 git clone $url $target
147 fi
148 if ! cd $target; then
149 echo "mw-ext error: failed cd $target";
150 exit 1
151 fi
152 git fetch
153 git checkout -qf origin/$mw_branch || git checkout -qf origin/master
154 git clean -xffd
155 cd "$original_pwd"
156
157 }
158 mw-ext () {
159 local ext
160 for ext in "$@"; do
161 mw-clone https://gerrit.wikimedia.org/r/p/mediawiki/extensions/$ext
162 if [[ -e $mw/ext/$ext/extension.json ]]; then
163 # new style extension. remove old style declaration
164 sed -i --follow-symlinks '#^require_once( "\\\$IP/extensions/\$ext/\$ext\.php" );#d' $mwc
165 teeu $mwc <<EOF
166 wfLoadExtension( '$ext' );
167 EOF
168 else
169 teeu $mwc <<EOF
170 require_once( "\$IP/extensions/$ext/$ext.php" );
171 EOF
172 fi
173 done
174 # --quick is quicker than default flags,
175 # but still add a sleep to make sure everything works right
176 sudo -u $apache_user php $mw/maintenance/update.php -q --quick; sleep 1
177 }
178 mw-skin() {
179 local skin=$1
180 mw-clone https://gerrit.wikimedia.org/r/p/mediawiki/skins/$skin
181 sed -i --follow-symlinks '/^wfLoadSkin/d' $mwc
182 sed -i --follow-symlinks '/^\$wgDefaultSkin/d' $mwc
183 teeu $mwc <<EOF
184 \$wgDefaultSkin = "${skin,,*}";
185 wfLoadSkin( '$skin' );
186 EOF
187 sudo -u $apache_user php $mw/maintenance/update.php -q --quick; sleep 1
188 }
189
190 if command -v apt &>/dev/null; then
191 apache_user=www-data
192 else
193 apache_user=apache
194 fi
195
196 </source>
197
198 == Install Mediawiki Dependencies ==
199
200 The best way to get core dependencies is to install the mediawiki package itself. Nothing about it will get in the way of using a version from upstream.
201
202 [[mediawikiwiki:Main Page|Mediawiki Main Page]]: the beginning of the official docs.
203
204 [[mediawikiwiki:Manual:Installation_requirements|Manual:Installation_requirements]]: Overview of installation requirements.
205
206 Note, this guide needs a little adjustment before it will work with php7.0: make sure settings are still valid, update ini path.
207
208
209
210 <source lang="bash">
211 # From here on out, exit if a command fails.
212 # This will prevent us from not noticing an important failure.
213 # We recommend setting this for the entire installation session.
214 # If you are running commands interactively, it might be best to
215 # put it in your ~/.bashrc temporarily.
216 set -eE -o pipefail
217 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
218 source ~/mw_vars
219
220 if isdeb; then
221 # main reference:
222 # https://www.mediawiki.org/wiki/Manual:Running_MediaWiki_on_Ubuntu
223 apt-get update
224 DEBIAN_FRONTEND=noninteractive apt-get install -y imagemagick curl
225 if apt-get install -s mediawiki &>/dev/null; then
226 # mediawiki is packaged in jessie backports.
227 DEBIAN_FRONTEND=noninteractive apt-get -y install php5-apcu mediawiki
228 else
229 # https://www.mediawiki.org/wiki/Manual:Installation_requirements
230 if apt-get install -s php7.0 &>/dev/null; then
231 # note, 7.0 is untested by the editor here, since it's not
232 # available in debian 8. it's listed as supported
233 # in the mediawiki page.
234 # noninteractive to avoid mysql password prompt.
235 DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 \
236 default-mysql-server \
237 php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-xml \
238 php7.0-apcu php7.0-mbstring
239 else
240 # note: mbstring is recommended, but it's not available for php5 in
241 # debian jessie.
242 DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 \
243 default-mysql-server \
244 php5 php5-mysql libapache2-mod-php5 php5-apcu
245 fi
246 fi
247 service apache2 restart
248 else
249 # note
250 # fedora deps are missing a database, so some is translated from debian packages
251 yum -y install mediawiki ImageMagick php-mysqlnd php-pecl-apcu mariadb-server
252
253 systemctl restart mariadb.service
254 systemctl enable mariadb.service
255 systemctl enable httpd.service
256 systemctl restart httpd.service
257 fi
258
259
260 # slightly different depending on if we already set the root pass
261 if echo exit|mysql -u root -p"$dbpass"; then
262 # answer interactive prompts:
263 # mysql root pass, change pass? no, remove anon users? (default, yes)
264 # disallow remote root (default, yes), reload? (default, yes)
265 echo -e "$dbpass\nn\n\n\n\n" | mysql_secure_installation
266 else
267 # I had 1 less newline at the start when doing ubuntu 14.04,
268 # compared to debian 8, so can't say this is especially portable.
269 # It won't hurt if it fails.
270 echo -e "\n\n$dbpass\n$dbpass\n\n\n\n\n" | mysql_secure_installation
271 fi
272 </source>
273
274
275 '''Skippable notes'''
276
277
278 php[5]-mysqlnd is a faster mysql driver package, but the default in debian php-mysql, appparently because some non-mediawiki packages are not compatible with it. If you run into this issue, simply use the php-mysql package.
279
280
281 Additional packages rational
282 * ImageMagick is [https://www.mediawiki.org/wiki/Manual:Image_administration#Image_thumbnailing recommended].
283 * Gui install and [[mediawikiwiki:Manual:Cache]] recomend the apc package.
284 * Clamav for virus scanning of uploads is mentioned in the mediawiki manual. However, wikipedia doesn't seem to do it, so it doesn't seem like it's worth bothering. It also makes uploading a set of images take twice as long on broadband.
285
286 == Install Mediawiki ==
287
288
289 Here, we [[mediawikiwiki:Download_from_Git]], or reset our installation if it is already there, and create the wiki database. [[mediawikiwiki:Manual:Installing_MediaWiki]]
290
291 <source lang="bash">
292 mkdir -p $mw
293 cd $mw
294 # this will just fail if it already exists which is fine
295 if [[ ! -e .git ]]; then
296 git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git .
297 fi
298 # to see available branches: https://www.mediawiki.org/wiki/Version_lifecycle
299 # and
300 # git branch -r
301 git checkout -f origin/$mw_branch
302 git clean -ffxd
303 # add some librejs support:
304 curl "https://iankelling.org/git/?p=mediawiki-librejs-patch;a=blob_plain;f=mediawiki-librejs-patch;hb=HEAD" | bash
305 # Get the php libraries wmf uses. Based on:
306 # https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
307 if [[ ! -e vendor/.git ]]; then
308 git clone https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git
309 fi
310 cd vendor
311 git checkout -f origin/$mw_branch
312 cd ..
313
314 # Drop any previous database which may have been installed while testing.
315 # If upgrading, we should have a db backup which will get restored.
316 # https://www.mediawiki.org/wiki/Manual:Upgrading
317 mysql -u root -p$dbpass <<'EOF' ||:
318 drop database my_wiki;
319 exit
320 EOF
321 php $mw/maintenance/install.php --pass $wikipass --scriptpath /w \
322 --dbuser root --dbpass $dbpass "$mwdescription" "$wikiuser"
323 teeu $mwc <<'EOF'
324 # lock down the wiki to only the initial owner until anti-spam measures are put in place
325 # limit edits to registered users
326 $wgGroupPermissions['*']['edit'] = false;
327 # don't allow any account creation
328 $wgGroupPermissions['*']['createaccount'] = false;
329 EOF
330 </source>
331
332
333 Note: When testing, you may need to clear the apc cache to see changes take effect in the browser. Simplest solution is
334 just restart apache. http://stackoverflow.com/questions/911158/how-to-clear-apc-cache-entries
335
336 ''' Skippable Notes'''
337
338 If we wanted to reset our installation, but leave the extension repositories alone, alter the command above to be <code>git clean -fxd</code>
339
340 '''Rational for choosing git sources'''
341
342 Upstream vs distro packages. Upstream is responsive, and it's distributed within a single directory, so packaging does not integrate with the distro's filesystem. The only potential value would be less bugs by using stable versions, but we choose not to make that tradeoff.
343
344 Why use git over zip file releases? Mediawiki supports git usage through release branches which get post-release fixes. This means we can auto-update, get more granular fixes, easier to manage updates, and rollbacks.
345
346 == Configure Apache ==
347
348 Note, non-debian based installs: modify instructions below to use /etc/httpd/conf.d/$mwdomain.conf, and don't run a2ensite.
349
350 I use scripts I maintains separately to setup Let's Encrypt certificates and apache config: (url pending).
351
352 If you are doing a test setup on your local machine, you can make your domain resolve to your local test installation, then remove it later when you are done. Note, you will need non-local site to get Let's Encrypt certificates, and then transfer them locally, or disable ssl from the apache config (neither is covered here) and replace all instances of https in these instructions with http. Another option is to get a cheap 2 dollar domain for your test site.
353
354 '''Not for production:'''
355 <source lang="bash" type="example">
356 teeu /etc/hosts<<<"127.0.0.1 $mwdomain"
357 </source>
358
359 To not use my scripts, and still use Let's Encrypt: follow this doc page: https://letsencrypt.org/getting-started/. It's a little long winded, so I would boil it down to this:
360
361 '''Optional & requires additional steps:'''
362 <source lang="bash" type="example">
363 git clone https://github.com/certbot/certbot
364 cd certbot
365 ./certbot-auto apache
366 cd /etc/apache/sites-available
367 mv 000-default-le-ssl.conf $mwdomain.conf
368 rm ../sites-enabled/000-default-le-ssl.conf
369 # edit $mwdomain.conf, so documentroot is /var/www/$mwdomain/html
370 # and ServerName is $mwdomain
371 a2ensite $mwdomain.conf
372 </source>
373 Then, copy the input to apache-site below and insert it into the apache config.
374
375 Here, we use some scripts automate setting up the Let 's Encrypt cert and
376 the apache config.
377
378 <source lang="bash">
379 temp=$(mktemp -d)
380 cd $temp
381 git_site=https://iankelling.org/git
382 git clone $git_site/acme-tiny-wrapper
383 l=$mw/../../logs
384 mkdir -p $l
385
386 acme-tiny-wrapper/acme-tiny-wrapper -t $mwdomain
387
388 git clone $git_site/basic-https-conf
389 { cat <<EOF
390 ServerAdmin $mw_email
391 RewriteEngine On
392 # make the site's root url go to our main page
393 RewriteRule ^/?wiki(/.*)?\$ %{DOCUMENT_ROOT}/w/index.php [L]
394 # use short urls https://www.mediawiki.org/wiki/Manual:Short_URL
395 RewriteRule ^/*\$ %{DOCUMENT_ROOT}/w/index.php [L]
396 EOF
397 find -L $(readlink -f $mw) -name .htaccess \
398 | while read line; do
399 echo -e "<Directory ${line%/.htaccess}>\n $(< $line)\n</Directory>";
400 done
401 } | basic-https-conf/apache-site -r ${mw%/*} - $mwdomain
402 cd
403 rm -rf $temp
404 </source>
405
406 Now mediawiki should load in your browser at $mwdomain .
407
408 Allow proper search bots and internet archiver bots, via [[Mediawiki:Robots.txt]],
409 and install the default skin.
410
411 <source lang="bash">
412 dd of=$mw/../robots.txt <<'EOF'
413 User-agent: *
414 Disallow: /w/
415 User-agent: ia_archiver
416 Allow: /*&action=raw
417 EOF
418 mw-skin Vector
419 </source>
420
421 '''Skippable Notes'''
422
423 This section assumes we are redirecting www to a url without www.
424
425 [http://httpd.apache.org/docs/current/howto/htaccess.html Apache recommends] moving .htaccess rules into it's config for performance. So we look for .htaccess files from mediawiki and copy their contents into this config. In modern apache versions, we would have to explicitly set options like AllowOverride to allow .htaccess files to take effect.
426
427 == Mediawiki Settings ==
428
429 Overall reference: [[mediawikiwiki:Manual:Configuration_settings]].
430
431 Settings which the gui setup prompts for but aren't set by the automated install script.
432 <source lang="bash">
433 teeu $mwc<<EOF
434 \$wgServer = "https://$mwdomain";
435 \$wgDBserver = "localhost";
436 \$wgRightsUrl = "$mw_RightsUrl";
437 \$wgRightsText = "$mw_RightsText";
438 \$wgRightsIcon = "$mw_RightsIcon";
439 EOF
440 </source>
441 Settings asked by the gui setup which are different than the install script defaults. They different because the defaults are the most compatible and unobtrusive.
442 <source lang="bash">
443 teeu $mwc<<EOF
444 \$wgPasswordSender = "$mw_email";
445 \$wgEmergencyContact = "$mw_email";
446 \$wgEnotifUserTalk = true; # UPO
447 \$wgEnotifWatchlist = true; # UPO
448 \$wgMainCacheType = CACHE_ACCEL;
449 \$wgEnableUploads = true;
450 \$wgUseInstantCommons = true;
451 \$wgPingback = true;
452 EOF
453 </source>
454
455 Other misc settings
456 <source lang="bash">
457 teeu $mwc <<'EOF'
458 # from https://www.mediawiki.org/wiki/Manual:Short_URL
459 $wgArticlePath = "/wiki/$1";
460
461 # https://www.mediawiki.org/wiki/Manual:Combating_spam
462 # check that url if our precautions don't work
463 # not using nofollow is good practice, as long as we avoid spam.
464 $wgNoFollowLinks = false;
465 # Allow user customization.
466 $wgAllowUserCss = true;
467 # use imagemagick over GD
468 $wgUseImageMagick = true;
469 # manual says this is not production ready, I think that is mostly
470 # because they are using MobileFrontend extension instead, which gives
471 # an even cleaner more minimal view, I plan to try setting it up
472 # sometime but this seems like a very nice improvement for now.
473 $wgVectorResponsive = true;
474 EOF
475
476
477 # https://www.mediawiki.org/wiki/Manual:Configuring_file_uploads
478 # Increase from default of 2M to 100M.
479 # This will at least allow high res pics etc.
480 php_ini=$(php -r 'echo(php_ini_loaded_file());')
481 sed -i --follow-symlinks 's/^\(upload_max_filesize\|post_max_size\)\b.*/\1 = 100M/' $php_ini
482 if isdeb; then
483 service apache2 restart
484 else
485 systemctl restart httpd.service
486 fi
487
488 # if you were to install as a normal user, you would need this for images
489 # sudo usermod -aG $apache_user $USER
490
491 # this doesn't propogate right away
492 chgrp -R $apache_user $mw/images
493 chmod -R g+w $mw/images
494 </source>
495
496 Style settings. Omit to use a different style.
497 <source lang="bash">
498 teeu $mwc <<'EOF'
499 $wgLogo = null;
500 #$wgFooterIcons = null;
501 EOF
502 # Make the toolbox go into the drop down.
503 cd $mw/skins/Vector
504 if ! git remote show ian-kelling &>/dev/null; then
505 git remote add ian-kelling https://iankelling.org/git/forks/Vector
506 fi
507 git fetch ian-kelling
508 git checkout ian-kelling/${mw_branch}-toolbox-in-dropdown
509 </source>
510
511 == Install and Configure Mediawiki Extensions ==
512
513 When installing extensions on a wiki with important content, backup first as a precaution.
514
515 ''' Extensions with no configuration needed '''
516
517 {| class="writable"
518 ! Name
519 ! Description
520 |-
521 | [[mediawikiwiki:Extension:Cite|Extension:Cite]]
522 | Have references in footnotes*
523 |-
524 | [[mediawikiwiki:Extension:CiteThisPage|Extension:CiteThisPage]]
525 | Ability to generate citations to pages in a variety of styles*
526 |-
527 | [[mediawikiwiki:CheckUser|Extension:CheckUser]]
528 | Get ip addresses from inside mediawiki so you can ban users''
529 |-
530 | [[mediawikiwiki:Extension:CSS|Extension:CSS]]
531 | Allows CSS stylesheets to be included in specific articles
532 |-
533 | [[mediawikiwiki:Extension:Echo|Extension:Echo]]
534 | Notification subsystem for usage by other extensions
535 |-
536 | [[mediawikiwiki:Extension:Gadgets|Extension:Gadgets]]
537 | UI extension system for users*
538 |-
539 | [[mediawikiwiki:Extension:ImageMap|Extension:ImageMap]]
540 | Links for a region of an image*
541 |-
542 | [[mediawikiwiki:Extension:Interwiki|Extension:Interwiki]]
543 | Tool for nice links to other wikis*
544 |-
545 | [[mediawikiwiki:Extension:News|Extension:News]]
546 | Embed or rss recent changes
547 |-
548 | [[mediawikiwiki:Extension:Nuke|Extension:Nuke]]
549 | Mass delete of pages, in the case of spam*
550 |-
551 | [[mediawikiwiki:Extension:ParserFunctions|Extension:ParserFunctions]]
552 | Useful for templates*
553 |-
554 | [[mediawikiwiki:Extension:Poem|Extension:Poem]]
555 | Useful for formatting things various ways*
556 |-
557 | [[mediawikiwiki:Extension:Renameuser|Extension:Renameuser]]
558 | Allows bureaucrats to rename user accounts*
559 |-
560 | [[mediawikiwiki:Extension:SyntaxHighlight_GeSHi|Extension:SyntaxHighlight_GeSHi]]
561 | Source code highlighting*
562 |-
563 | [[mediawikiwiki:Extension:Variables|Extension:Variables]]
564 | Define per-page variables
565 |}
566
567 <nowiki>*</nowiki> = Comes with the MediaWiki default download.
568
569 <source lang="bash">
570 mw-ext Cite CiteThisPage CheckUser CSS Echo Gadgets ImageMap Interwiki News \
571 Nuke ParserFunctions Poem Renameuser SyntaxHighlight_GeSHi Variables
572 </source>
573
574
575 ''' [[mediawikiwiki:Extension:AntiSpoof|Extension:AntiSpoof]]: Disallow usernames with unicode trickery to look like existing names'''
576
577 <source lang="bash">
578 mw-ext AntiSpoof
579 # recommended setup script to account for existing users
580 sudo -u $apache_user php $mw/extensions/AntiSpoof/maintenance/batchAntiSpoof.php
581 </source>
582
583
584 '''[[mediawikiwiki:Extension:Wikidiff2|Extension:Wikidiff2]]: Faster and international character supported page diffs'''
585
586 I used packaged version since this is a c++ and probably not very tied to the Mediawiki version. This isn't packaged in fedora, haven't gotten around to testing and adding the code to compile it for fedora.
587 <source lang="bash">
588 if isdeb; then
589 apt-get -y install php-wikidiff2
590 teeu $mwc <<'EOF'
591 $wgExternalDiffEngine = 'wikidiff2';
592 EOF
593 dir=$(dirname $(php -r 'echo(php_ini_loaded_file());'))/../apache2/conf.d
594 ln -sf ../../mods-available/wikidiff2.ini $dir
595 service apache2 restart
596 fi
597 </source>
598
599
600 ''' [[mediawikiwiki:Extension:Math|Extension:Math]] Display equations'''
601
602 <source lang="bash">
603 mw-ext Math
604 # php5-curl according to Math readme
605 if isdeb; then
606 curl_pkg=php7.0-curl
607 if ! apt-get -s install $curl_pkg &>/dev/null; then
608 curl_pkg=php5-curl
609 fi
610 apt-get -y install latex-cjk-all texlive-latex-extra texlive-latex-base \
611 ghostscript imagemagick ocaml $curl_pkg make
612 else
613 # todo, php5-curl equivalent on fedora
614 yum -y install texlive-cjk ghostscript ImageMagick texlive ocaml
615 fi
616 service apache2 restart
617
618 cd $mw/extensions/Math/math; make # makes texvc
619 cd $mw/extensions/Math/texvccheck; make
620
621 teeu $mwc <<'EOF'
622 # Enable MathJax as rendering option
623 $wgUseMathJax = true;
624 # Enable LaTeXML as rendering option
625 $wgMathValidModes[] = 'latexml';
626 # Set LaTeXML as default rendering option, because it is nicest
627 $wgDefaultUserOptions['math'] = 'latexml';
628 EOF
629 </source>
630
631 '''Skippable notes'''
632
633 There is no current list of package depencies so I took dependencies from mediawiki-math package in Debian 7. Fedora didn't have a mediawik math package, so I just translated from debian. Ocaml is for math png rendering, as backup option to the nicer looking LatexML and MathJax. Debian has texvc package, but it didn't work right for me, plus it required additional configuration in mediawiki settings.
634
635
636 ''' [[mediawikiwiki:Extension:SpamBlacklist|Extension:SpamBlacklist]]: Import/create IP blacklists, mainly for spam'''
637
638 Comes with MediaWiki.
639
640 <source lang="bash">
641 mw-ext SpamBlacklist
642 if ! grep -F '$wgSpamBlacklistFiles = array(' $mwc &>/dev/null; then
643 tee -a $mwc <<'EOF'
644 $wgEnableDnsBlacklist = true;
645 $wgDnsBlacklistUrls = array( 'xbl.spamhaus.org', 'dnsbl.tornevall.org' );
646
647 ini_set( 'pcre.backtrack_limit', '10M' );
648 $wgSpamBlacklistFiles = array(
649 "[[m:Spam blacklist]]",
650 "http://en.wikipedia.org/wiki/MediaWiki:Spam-blacklist"
651 );
652 EOF
653 fi
654 </source>
655
656 ''' [[mediawikiwiki:Extension:TitleBlacklist|Extension:TitleBlacklist]]: Anti-spam '''
657
658 Comes with Mediawiki.
659
660 <source lang="bash">
661 mw-ext TitleBlacklist
662 if ! grep -F '$wgTitleBlacklistSources = array(' $mwc &>/dev/null; then
663 tee -a $mwc <<'EOF'
664 $wgTitleBlacklistSources = array(
665 array(
666 'type' => 'local',
667 'src' => 'MediaWiki:Titleblacklist',
668 ),
669 array(
670 'type' => 'url',
671 'src' => 'http://meta.wikimedia.org/w/index.php?title=Title_blacklist&action=raw',
672 ),
673 );
674 EOF
675 fi
676 </source>
677
678 ''' [[mediawikiwiki:Extension:WikiEditor|Extension:WikiEditor]]: Editing box extras and a fast preview tab '''
679
680 Comes with MediaWiki.
681
682 <source lang="bash">
683 mw-ext WikiEditor
684 teeu $mwc <<'EOF'
685 # Enable Wikieditor by default
686 $wgDefaultUserOptions['usebetatoolbar'] = 1;
687 $wgDefaultUserOptions['usebetatoolbar-cgd'] = 1;
688
689 # Display the Preview and Changes tabs
690 $wgDefaultUserOptions['wikieditor-preview'] = 1;
691 EOF
692 </source>
693
694 ''' [[mediawikiwiki:CategoryTree|Extension:CategoryTree]]: Enables making nice outlines of pages in a category'''
695 <source lang="bash">
696 mw-ext CategoryTree
697 teeu $mwc <<'EOF'
698 # Mediawiki setting dependency for CategoryTree
699 $wgUseAjax = true;
700 EOF
701 </source>
702
703 ''' [[mediawikiwiki:Extension:AbuseFilter|Extension:AbuseFilter]]: Complex abilities to stop abuse '''
704
705 Used by big wiki sites. As a smaller site, we won't use it much, but it's good to have. It's page suggests a few defaults:
706 <source lang="bash">
707 mw-ext AbuseFilter
708 teeu $mwc<<'EOF'
709 $wgGroupPermissions['sysop']['abusefilter-modify'] = true;
710 $wgGroupPermissions['*']['abusefilter-log-detail'] = true;
711 $wgGroupPermissions['*']['abusefilter-view'] = true;
712 $wgGroupPermissions['*']['abusefilter-log'] = true;
713 $wgGroupPermissions['sysop']['abusefilter-private'] = true;
714 $wgGroupPermissions['sysop']['abusefilter-modify-restricted'] = true;
715 $wgGroupPermissions['sysop']['abusefilter-revert'] = true;
716 EOF
717 </source>
718
719 '''[[mediawikiwiki:Extension:ConfirmEdit|Extension:ConfirmEdit]]: Custom Captcha.'''
720
721 Uses captchaArray defined in mw_vars. Comes with MediaWiki.
722
723 <source lang="bash">
724 mw-ext ConfirmEdit
725 captchaArray
726 teeu $mwc <<'EOF'
727 wfLoadExtension( 'ConfirmEdit/QuestyCaptcha' );
728 $wgCaptchaClass = 'QuestyCaptcha';
729 # only captcha on registration
730 $wgGroupPermissions['user' ]['skipcaptcha'] = true;
731 $wgGroupPermissions['autoconfirmed']['skipcaptcha'] = true;
732 EOF
733 if ! grep -Fx 'foreach ( $localSettingsQuestyQuestions as $key => $value ) {' $mwc; then
734 tee -a $mwc <<'EOF'
735 foreach ( $localSettingsQuestyQuestions as $key => $value ) {
736 $wgCaptchaQuestions[] = array( 'question' => $key, 'answer' => $value );
737 }
738 EOF
739 fi
740 </source>
741
742 Enable account creation that we initially disabled.
743 <source lang="bash">
744 sed -i --follow-symlinks "/\\\$wgGroupPermissions\\['\\*'\\]\\['createaccount'\\] = false;/d" $mwc
745 </source>
746
747 == Additional Configuration with Pywikibot ==
748
749 There are quite a few [[mediawikiwiki:Help:Namespaces|special pages]] which act like variables to configure special wiki content and style. A big part of this wiki's style is configured in this section. We use Pywikibot to automate editing those pages.
750
751
752 '''Pywikibot Install'''
753
754 [[mediawikiwiki:Manual:Pywikibot/Installation|Manual:Pywikibot/Installation]]
755
756 <source lang="bash">
757 # get repo
758 if [[ ! -e ~/pywikibot/.git ]]; then
759 git clone --recursive \
760 https://gerrit.wikimedia.org/r/pywikibot/core.git ~/pywikibot
761 fi
762 cd ~/pywikibot
763 #updating
764 git pull --all
765 git submodule update
766 </source>
767
768
769 '''Pywikibot Configuration'''
770
771 Relevent docs: [[mediawikiwiki:Manual:Pywikibot/Use_on_non-WMF_wikis|Manual:Pywikibot/Use_on_non-WMF_wikis]], [[mediawikiwiki:Manual:Pywikibot/Quick_Start_Guide|Manual:Pywikibot/Quick_Start_Guide]]
772
773
774 <source lang="bash">
775 cd $HOME/pywikibot
776 dd of=user-config.py <<EOF
777 mylang = 'en'
778 usernames["$mwfamily"]['en'] = u'$wikiuser'
779 family = "$mwfamily"
780 console_encoding = 'utf-8'
781 password_file = "secretsfile"
782 EOF
783
784 dd of=secretsfile <<EOF
785 ("$wikiuser", "$wikipass")
786 EOF
787
788 # it won't overrwrite an existing file. Remove if if one exists
789 rm -f pywikibot/families/${mwfamily}_family.py
790 if isdeb; then
791 apt-get install -y python-requests
792 else
793 yum -y install python-requests
794 fi
795
796 python generate_family_file.py https://$mwdomain/wiki/Main_Page "$mwfamily"
797
798 # Note, this needed only for ssl site
799 tee -a pywikibot/families/${mwfamily}_family.py<<'EOF'
800 def protocol(self, code):
801 return 'https'
802 EOF
803 </source>
804
805
806 '''Pywikibot Script'''
807
808 This will take a full minute or so because the bot waits a few seconds between edits. Useful doc: [[mediawikiwiki:Pywikipediabot/Create_your_own_script]].
809
810 <source lang="bash">
811 cd "$HOME/pywikibot"
812
813 dd of=scripts/${mwfamily}_setup.py<<EOF
814 import pywikibot
815 import time
816 import sys
817 site = pywikibot.Site()
818 def x(p, t=""):
819 page = pywikibot.Page(site, p)
820 page.text = t
821 #force is for some anti-bot thing, not necessary in my testing, but might as well include it
822 page.save(force=True)
823
824 # Small/medium noncommercial wiki should be fine with no privacy policy
825 # based on https://www.mediawiki.org/wiki/Manual:Footer
826 x("MediaWiki:Privacy")
827
828 # licenses for uploads. Modified from the mediawiki's wiki
829 x("MediaWiki:Licenses", u"""* Same as this wiki's text (preferred)
830 ** CC BY-SA or GFDL| Creative Commons Attribution ShareAlike or GNU Free Documentation License
831 * Others:
832 ** Unknown_copyright|I don't know exactly
833 ** PD|PD: public domain
834 ** CC BY|Creative Commons Attribution
835 ** CC BY-SA|Creative Commons Attribution ShareAlike
836 ** GFDL|GFDL: GNU Free Documentation License
837 ** GPL|GPL: GNU General Public License
838 ** LGPL|LGPL: GNU Lesser General Public License""")
839 x("MediaWiki:Copyright", '$mw_license')
840 x("MediaWiki:Mainpage-description", "$mwdescription")
841
842
843
844 # The rest of the settings are for the site style
845
846 # Remove various clutter
847 x("MediaWiki:Lastmodifiedat")
848 x("MediaWiki:Disclaimers")
849 x("MediaWiki:Viewcount")
850 x("MediaWiki:Aboutsite")
851 # remove these lines from sidebar
852 # ** recentchanges-url|recentchanges
853 # ** randompage-url|randompage
854 # ** helppage|help
855 x("MediaWiki:Sidebar", """* navigation
856 ** mainpage|mainpage-description
857 * SEARCH
858 * TOOLBOX
859 * LANGUAGES""")
860
861 # remove side panel
862 # helpfull doc: https://www.mediawiki.org/wiki/Manual:Interface/Sidebar
863 x("mediawiki:Common.css", """/* adjust sidebar to just be home link and up top */
864 /* panel width increased to fit full wiki name. */
865 div#mw-panel { top: 10px; padding-top: 0em; width: 20em }
866 div#footer, #mw-head-base, div#content { margin-left: 1em; }
867 #left-navigation { margin-left: 1em; }
868
869
870 /* logo, and toolbar hidden */
871 #p-logo, #p-tb.portal {
872 display:none;
873 }
874
875 /* make the font size smaller for the misc stuff */
876 #p-personal {
877 font-size: 0.8em;
878 }
879
880 #footer-info {
881 font-size: 0.8em;
882 }
883 div#mw-content-text {
884 max-width: 720px;
885 }
886 """)
887 EOF
888
889 # this can spam a warning, so uniq it
890 python pwb.py ${mwfamily}_setup |& uniq
891 </source>
892
893
894 ''' Skippable Notes '''
895
896 The docs suggest manually entering the pass with python pwb.py login.py, then it should stay logged in. That didn't work for me, and anyways, we automation, so we use secrets file method.
897
898 Family name, and all its duplicattions documented as supposed to be $wgSitename, but it works fine using any name.
899
900 == Automatic Backups ==
901
902 Here we will have a daily cronjob where a backup host sshs to the mediawiki host, makes a backup then copies it back. Copy ~/mw_vars to the backup host at /root/mw_vars. Setup passwordless ssh from the backup host to the mediawiki host. Then run this code on the backup host. This will make a versioned backup of the wiki to ~/backup.
903
904 <source lang="bash" type="backup">
905 backup_script=/etc/cron.daily/mediawiki_backup
906 sudo dd of=$backup_script <<'EOFOUTER'
907 #!/bin/bash
908 # if we get an error, keep going but return it at the end
909 last_error=0
910 trap 'last_error=$?' ERR
911 source ~/mw_vars
912 # No strict because the host is likely not named the same as
913 # the domain.
914 ssh="ssh -oStrictHostKeyChecking=no"
915 logfile=/var/log/${mwdomain}_backup.log
916 {
917 echo "#### starting backup at $(date) ####"
918 $ssh root@$mwdomain <<ENDSSH
919 set -x
920 tee -a $mwc<<'EOF'
921 \$wgReadOnly = 'Dumping Database, Access will be restored shortly';
922 EOF
923 mkdir -p ~/wiki_backups
924 mysqldump -p$dbpass --default-character-set=binary my_wiki > ~/wiki_backups/wiki_db_backup
925 sed -i '\$ d' $mwc # delete read only setting
926 ENDSSH
927 # add no strict option to the defaults
928
929 rdiff() { rdiff-backup --remote-schema "$ssh -C %s rdiff-backup --server" "$@"; }
930 set -x
931 rdiff root@$mwdomain::/root/wiki_backups ~/backup/${mwdomain}_wiki_db_backup
932 rdiff root@$mwdomain::$mw ~/backup/${mwdomain}_wiki_file_backup
933 set +x
934 echo "=== ending backup at $(date) ===="
935 } &>>$logfile
936 if [[ $last_error != 0 ]]; then
937 echo "backup for $mwdomain failed. See $logfile"
938 fi
939 exit $last_error
940 EOFOUTER
941
942 sudo chmod +x $backup_script
943 </source>
944
945 '''Optional & requires additional steps'''
946
947 If you are like most people and don't use the old-school mail spool, setup the backup system to send mail externally so you are notified if it fails. For examples of how to do this, [http://unix.stackexchange.com/questions/36982/can-i-set-up-system-mail-to-use-an-external-smtp-server stackoverflow], [https://iankelling.org/git/?p=ian-specific/distro-setup;a=blob;f=mail-setup;hb=HEAD script I use].
948
949 == Restoring Backups ==
950
951 '''Whenever you implement a backup system, you should test that restoring the backup works.'''
952
953 You ''should'' be able to restore your wiki to a new machine by repeating all install steps, then restoring the database and the images directory. I've done this many times. However, we backup the entire Mediawiki directory in case you forget to record a step or some corner case happens. Since most people don't record the steps they took to setup Mediawiki, this is also the officially recommended method. In the code below we restore only the database and images folder from the full backup. You can try this after setting up a wiki from scratch. If it doesn't work, you know your fresh setup is not replicating your backed up wiki correctly. In that case, you can fall back to doing a full restore by copying the full directory instead of just the images. See [[mediawikiwiki:Manual:Restoring a wiki from backup]] if you run into any problems.
954
955 To test a backup restore:
956 # Do a backup of your wiki with some content in it, as described in the previous section
957 # Move your mediawiki install directory, or setup Mediawiki on a new machine
958 # Re-execute the mediawiki install steps
959 # Change REPLACE_ME in the code below (as in the backup section so you get the right variables),
960 # Execute the code on the backup machine.
961
962 '''Optional'''
963 <source lang="bash" type="example">
964 #!/bin/bash
965 source ~/mw_vars
966 restore="rdiff-backup --force -r now"
967 $restore ~/backup/${mwdomain}_wiki_file_backup /tmp/wiki_file_restore
968 $restore ~/backup/${mwdomain}_wiki_db_backup /tmp/wiki_db_restore
969 o=-oStrictHostKeyChecking=no
970 scp $o -r /tmp/wiki_file_restore/images/* root@$mwdomain:$mw/images
971 scp $o -r /tmp/wiki_db_restore root@$mwdomain:/tmp
972 ssh $o root@$mwdomain <<EOF
973 set -e
974 chmod -R g+w $mw/images
975 chgrp -R www-data $mw/images
976 mysql -u root -p$dbpass my_wiki < /tmp/wiki_db_restore/wiki_db_backup
977 php $mw/maintenance/update.php
978 EOF
979 </source>
980
981 Then browse to your wiki and see if everything appears to work.
982
983 == Updates ==
984
985 Subscribe to get release and security announcements [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-announce].
986
987 For updates, we simply git pull all the repos, then run the maintenance script. This should be done after a backup. We recommend automatic updates to get security fixes and since not much is changing on the release branch. In this example, we update at 5 am daily (1 hour after the automatic backup example).
988
989 Major version upgrades should be done manually, and it is recommended to use a new installation directory and the same procedure as for backup & restore. Official reference: [[mediawikiwiki:Manual:Upgrading|Manual:Upgrading]]
990
991 Minor updates script:
992 <source lang="bash">
993 s=/etc/cron.daily/mediawiki_update
994 dd of=$s<<'EOF'
995 #!/bin/bash
996 source ~/mw_vars
997 update() {
998 dir=$1
999 cd $mw
1000 [[ -d $dir ]] || return 1
1001 cd $dir
1002 branch=$(git describe --all)
1003 branch=${branch#remotes/}
1004 git fetch --all -q
1005 new_head=$(git rev-parse $branch)
1006 log=$(git log HEAD..$new_head)
1007 if [[ ! $log ]]; then
1008 return 1
1009 fi
1010 pwd
1011 echo "$log"
1012 git checkout -qf $new_head
1013 cd $mw
1014 return 0
1015 }
1016 for dir in extensions/* skins/* vendor; do
1017 update "$dir" ||:
1018 done
1019 if update .; then
1020 curl "https://iankelling.org/git/?p=mediawiki-librejs-patch;a=blob_plain;f=mediawiki-librejs-patch;hb=HEAD" | bash
1021 fi
1022 php $mw/maintenance/update.php -q --quick
1023 EOF
1024
1025 </source>
1026
1027 == Upgrading Major Versions ==
1028
1029 Reference documentation is at [[mediawikiwiki:Manual:Upgrading]]
1030
1031 My strategy is:
1032
1033 # Read the "Upgrade notices for MediaWiki administrators" on the upgrade version and any skipped versions at [[mediawikiwiki:Version_lifecycle]].
1034 # Setup a blank test wiki with the new version.
1035 # Backup the old database, restore it to the new wiki, run php maintenance/update.php.
1036 # If everything looks good, repeat and replace the old wiki with the new one.
1037
1038 == Stopping Spam ==
1039
1040 There is a balance between effective anti-spam measures and blocking/annoying contributors. Mediawiki documentation on how to combat spam, is not very good, but it has improved over time: [https://www.mediawiki.org/wiki/Manual:Combating_spam manual: Combating Spam]. It's possible for a spammer to quickly make thousands of edits, and there is no good documentation on purging lots of spam, so you should have a good strategy up front. My current strategy is 3 fold, and is limited to small/medium wiki's:
1041
1042 * Find new spam quickly, revert it & ban the user.
1043 ** Watch, and get notified of changes on all primary content pages: Special:Preferences, Bottom of the page, set an email address, then turn on "Email me also for minor edits of pages and files."
1044 ** Use a rss/atom feed reader, and subscribe to recent changes across the wiki. Newer browsers have an rss feed subscribe button, you can click after going to Special:RecentChanges. If that is not available, you can construct the proper url based on [https://meta.wikimedia.org/wiki/Help:Recent_changes#Web_feed these instructions].
1045 * Require registration to edit, and a custom captcha question on registration.
1046 * Install all non-user inhibiting anti-spam extensions / settings that take a reasonable amount of time to figure out.
1047
1048 == Choosing Extensions ==
1049
1050 Mediawiki.org has pages for ~5200 extensions. Mediawiki maintains ~700 extensions [http://git.wikimedia.org/tree/mediawiki%2Fextensions.git in it's git repo]. Wikipedia uses [https://en.wikipedia.org/wiki/Special:Version over 100 extensions]. Major distributors package [[mediawikiwiki:Comparison_of_extensions_in_distributions| ~36 extensions]]. We looked closely at the distributor's and briefly at the Mediawiki repo extensions. We haven't found any other useful list or recommendations.
1051
1052 Here are brief descriptions of extensions that are part of distributions and why they were rejected for this wiki.
1053
1054 {| class="wikitable"
1055 |+
1056 | '''Footnote''' || deprecated in newer versions
1057 |+
1058 | '''InputBox''' || Add html forms to pages. Can't imagine using it. Would install if I did.
1059 |+
1060 | '''LocalisationUpdate'''|| update localization only. I'm fine updating all of mediawiki, there aren't many updates.
1061 |+
1062 | '''NewestPages''' || A page creation history that doesn't expire like recent-changes. Meh
1063 |+
1064 | '''NewUserNotif''' || Send me a notification when a user registers. Seems like an excessive notification.
1065 |+
1066 | '''Openid''' || Poor UI. 2 pages & 2 links <login> <login with openid> which is confusing & ugly.
1067 |+
1068 | '''Pdfhandler''' || Gallery of pages from a pdf file. Can't imagine using it. Would install if I did.
1069 |+
1070 | '''RSSReader''' || Embed an rss feed. Can't imagine using it. Would install if I did.
1071 |+
1072 | '''Semantic''' || Seems like a lot of trouble around analyzing kinds of data which my wiki will not have.
1073 |+
1074 | '''Validator''' || dependency of of semantic
1075 |+
1076 |}
1077
1078 == Misc Notes ==
1079
1080 ''' Web Analytics Software '''
1081
1082 I do not recommend using google analytics: it's proprietary software and gives private information of your website visitors to google for them to make money. Piwik has the best features and I recommend it, but I use goaccess because it is simpler to manage and good enough.
1083
1084 ''' Mediawiki Documentation Quality '''
1085
1086 Overall the documentation is good, but like wikipedia, it depends.
1087
1088 The closer a topic is to core functionality and commonly used features, the better the documentation is likely to be. Wikimedia Foundation (WMF) has a competing priority of being a good upstream to mediawiki users and being good for their own sites. That, plus the multitude of unconnected extension developers, and official documentation is sometimes neglected in favor of bug reports, readme files, comments, code, and unpublished knowledge. User's documentation edits vary in quality, and often aren't reviewed by anyone. If you run into an issue, try viewing/diffing the most recent version of a page by the last few editors.
1089
1090 One issue is that mediawiki.org needs a lot of organizing, deleting, and verifying of material, and that is relatively unpopular, tedious, and sometimes difficult work. The discussion pages of mediawiki.org are a wasteland of unanswered questions and outdated conversations, which is [https://www.mediawiki.org/wiki/Help:Talk_pages poor form] for a wiki. However, if you communicate well, you can get great help from their [https://www.mediawiki.org/wiki/Communication support forum, irc, and mailing list].
1091
1092
1093 '''Bash here documents, EOF vs 'EOF' '''
1094
1095 Here documents are used throughout this page, some people may not be aware of a small but important syntax. When the delimiter is quoted, as in <<'EOF', then the contents of the here document are exactly verbatim. Otherwise $ and ` are expanded as in bash, and must be escaped by prefixing them with \, which itself must then also be escaped to be used literally.
1096
1097
1098 ''' Mediawiki automation tools survey 7/2014 '''
1099
1100 Barely maintained:
1101 * https://github.com/ianweller/mw
1102 * http://search.cpan.org/~markj/WWW-Mediawiki-Client/bin/mvs
1103 * https://github.com/alexz-enwp/wikitools 3000 lines of code, no response to a bug reports in 2/2014
1104
1105 Getting basic maintenance
1106 * https://github.com/mwclient/mwclient 2000 lines of code
1107
1108 Actively developed, used by wikimedia foundation a lot.
1109 * [[mediawikiwiki:Manual:Pywikibot]]
1110
1111
1112 ''' Troubleshooting Errors '''
1113
1114 If mediawiki fails to load, or shows an error in the browser, enable some settings and it will print much more useful information. [[mediawikiwiki:Manual:How to debug]]
1115
1116 ''' License '''
1117
1118 This page and this wiki is licensed under cc-by-sa 4.0.
1119 This means the code is compatible with gplv3.
1120
1121 == todo list for this page ==
1122
1123 * Get Visual editor extension.
1124 * Don't require registration for edits