== Introduction == '''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. ''' Goals / Why use this guide? ''' * Good recommendations. Official docs mostly avoid recommendations among a myriad of possibilities * Closely references & supplements official documentation * Automatic security updates * Explicit automation support wherever practical * Used to setup this site (style is optional) * Support for multiple gnu/linux distros * Holistic scope (backups, server setup), but sections are independent * Code blocks are [https://en.wikipedia.org/wiki/Idempotent idempotent] * Edits to this page are tested on this site and reviewed by the main author. '''Assumptions''' * Self hosting, single GNU/Linux system with root Bash shell '''Version Support''' Very minor adjustments needed for other distros. Help expand this list. * Mediawiki 1.28, 1.27 support is planned to be re-added. * Debian 8 + backports * Debian 8 * Debian stretch Pre 5/2016 revisions ran Mediawiki 1.23, tested on Fedora 20 and Ubuntu 14.04. == Prerequisites == '''Getting a Server & a Domain''' 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. '''Install Certbot''' For debian jessie with backports: # if we have jessie-backports, we need to use it. if ! apt-get install -t jessie-backports certbot python-certbot-apache; then apt-get install certbot python-certbot-apache fi For other distros, follow instructions at [https://certbot.eff.org/ certbot.eff.org]. '''Email Setup''' 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. 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]] == Setup Guide Configuration == # Set variables below # Save the code in this section to a file (~/mw_vars is suggested) # Source it at the beginning of scripts containing later commands # Source it from your .bashrc file while you are setting up Mediawiki '''Requires customization:''' # Replace REPLACE_ME as appropriate export mwdescription="REPLACE_ME" # eg. Opinionated Free Software Wiki # username/pass of the first wiki admin user export wikiuser="REPLACE_ME" export wikipass=REPLACE_ME # root & user password for the mysql database export dbpass=REPLACE_ME export mwdomain=REPLACE_ME # domain name. for this site, it's ofswiki.org # customize these questions. Try not to have the answer be a word in the question. captchaArray() { if ! grep -Fx '$localSettingsQuestyQuestions = array (' $mwc; then tee -a $mwc <<'EOF' $localSettingsQuestyQuestions = array ( "What is the name of the wiki software this site (and wikipedia) uses?" => "Mediawiki", "REPLACE_ME with a question" => "REPLACE_ME with an answer" ); EOF fi } # The rest of this section will work fine with no changes. # git branch for mediawiki + extensions. See intro for supported versions. # branch names: https://git.wikimedia.org/branches/mediawiki%2Fcore.git export mw_branch=REL1_28 # As set by gui installer when choosing cc by sa. export mw_RightsUrl='https://creativecommons.org/licenses/by-sa/4.0/' export mw_RightsText='Creative Commons Attribution-ShareAlike' export mw_RightsIcon='$wgScriptPath/resources/assets/licenses/cc-by-sa.png' # Alphanumeric site name for pywikibot. # Here we use the domain minus the dots, which should work fine without changing. export mwfamily=${mwdomain//./} # install path for mediawiki. This should work fine. export mw=/var/www/$mwdomain/html/w # wiki sender address / wiki & wiki server contact email. # see email section for more info on email export mw_email="admin@$mwdomain" # Leave as is: mwc="$mw/LocalSettings.php" == Download this page and run it == 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. ''' Requires manual step: inspect output file: /tmp/mw-setup, then run it''' start=' * *' end=' *<\/source> *' ruby <<'EOF' | sed -rn "/^$start$/,/^$end$/{s/^$start|$end$/# \0/;p} > /tmp/mw-setup" require 'json' puts JSON.parse(`curl 'https://ofswiki.org/w/api.php?\ action=query&titles=Mediawiki_Setup_Guide&prop=revisions&rvprop=content&\ format=json'`.chomp)['query']['pages'].values[0]['revisions'][0]['*'] EOF chmod +x /tmp/mw-setup == Required Bash Functions == 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. # identify if this is a debian based distro isdeb() { command -v apt &>/dev/null; } # tee unique. append each stdin line if it does not exist in the file teeu () { local MAPFILE mapfile -t for line in "${MAPFILE[@]}"; do grep -xFq "$line" "$1" &>/dev/null || tee -a "$1" <<<"$line" done } # get and reset an extension/skin repository, and enable it mw-clone() { local url=$1 local original_pwd="$PWD" local name local re='[^/]*/[^/]*$' # last 2 parts of path [[ $url =~ $re ]] ||: target=$mw/${BASH_REMATCH[0]} if [[ ! -e $target/.git ]]; then git clone $url $target fi if ! cd $target; then echo "mw-ext error: failed cd $target"; exit 1 fi git fetch git checkout -qf origin/$mw_branch || git checkout -qf origin/master git clean -xffd cd "$original_pwd" } mw-ext () { local ext for ext; do mw-clone https://gerrit.wikimedia.org/r/p/mediawiki/extensions/$ext if [[ -e $mw/extensions/$ext/extension.json ]]; then # new style extension teeu $mwc </dev/null; then apache_user=www-data else apache_user=apache fi == Install Mediawiki Dependencies == 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. [[mediawikiwiki:Main Page|Mediawiki Main Page]]: the beginning of the official docs. [[mediawikiwiki:Manual:Installation_requirements|Manual:Installation_requirements]]: Overview of installation requirements. Note, this guide needs a little adjustment before it will work with php7.0: make sure settings are still valid, update ini path. # From here on out, exit if a command fails. # This will prevent us from not noticing an important failure. # We recommend setting this for the entire installation session. # If you are running commands interactively, it might be best to # put it in your ~/.bashrc temporarily. set -eE -o pipefail trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR source ~/mw_vars if isdeb; then # main reference: # https://www.mediawiki.org/wiki/Manual:Running_MediaWiki_on_Ubuntu apt-get update DEBIAN_FRONTEND=noninteractive apt-get install -y imagemagick curl if apt-get install -s mediawiki &>/dev/null; then apcu=php5-apcu if apt-get install -s php7.0-apcu &>/dev/null; then apcu=php7.0-apcu fi # mediawiki is packaged in jessie backports & stretch DEBIAN_FRONTEND=noninteractive apt-get -y install $apcu mediawiki else # https://www.mediawiki.org/wiki/Manual:Installation_requirements if apt-get install -s php7.0 &>/dev/null; then # note, 7.0 is untested by the editor here, since it's not # available in debian 8. it's listed as supported # in the mediawiki page. # noninteractive to avoid mysql password prompt. DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 \ default-mysql-server \ php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-xml \ php7.0-apcu php7.0-mbstring else # note: mbstring is recommended, but it's not available for php5 in # debian jessie. DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 \ default-mysql-server \ php5 php5-mysql libapache2-mod-php5 php5-apcu fi fi service apache2 restart else # note # fedora deps are missing a database, so some is translated from debian packages yum -y install mediawiki ImageMagick php-mysqlnd php-pecl-apcu mariadb-server systemctl restart mariadb.service systemctl enable mariadb.service systemctl enable httpd.service systemctl restart httpd.service fi # skip if we already set the root pass and are on pre-debian 9. if ! echo exit|mysql -uroot "-p$dbpass"; then # Note: we set a root password here, but in debian 9+, it is ignored; # only the local user root can login, and any password is accepted. # We answer these interactive prompts: # Enter current password for root (enter for none): # Set root password? [Y/n] # New password: # Re-enter new password: # Remove anonymous users? [Y/n] # Disallow root login remotely? [Y/n] # Remove test database and access to it? [Y/n] # Reload privilege tables now? [Y/n] # Note, I had 1 less newline at the start when doing ubuntu 14.04, # compared to debian 8, so can't say this is especially portable. echo -e "\n\n$dbpass\n$dbpass\n\n\n\n\n" | mysql_secure_installation fi mysql -uroot "-p$dbpass" < '''Skippable notes''' 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. Additional packages rational * ImageMagick is [https://www.mediawiki.org/wiki/Manual:Image_administration#Image_thumbnailing recommended]. * Gui install and [[mediawikiwiki:Manual:Cache]] recomend the apc package. * 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. == Install Mediawiki == Here, we [[mediawikiwiki:Download_from_Git]], or reset our installation if it is already there, and create the wiki database. [[mediawikiwiki:Manual:Installing_MediaWiki]] mkdir -p $mw cd $mw # this will just fail if it already exists which is fine if [[ ! -e .git ]]; then git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git . fi # to see available branches: https://www.mediawiki.org/wiki/Version_lifecycle # and # git branch -r git checkout -f origin/$mw_branch git clean -ffxd # apply librejs patch curl "https://iankelling.org/git/?p=mediawiki-librejs-patch;a=blob_plain;f=mediawiki-1.28-librejs.patch;hb=HEAD" | patch -r - -N -p1 # Get the php libraries wmf uses. Based on: # https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries if [[ ! -e vendor/.git ]]; then git clone https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git fi cd vendor git checkout -f origin/$mw_branch cd .. # Drop any previous database which may have been installed while testing. # If upgrading, we should have a db backup which will get restored. # https://www.mediawiki.org/wiki/Manual:Upgrading mysql -uroot "-p$dbpass" <<'EOF' ||: drop database my_wiki; exit EOF php $mw/maintenance/install.php --pass $wikipass --scriptpath /w \ --dbuser wikiuser --dbpass $dbpass "$mwdescription" "$wikiuser" teeu $mwc <<'EOF' # lock down the wiki to only the initial owner until anti-spam measures are put in place # limit edits to registered users $wgGroupPermissions['*']['edit'] = false; # don't allow any account creation $wgGroupPermissions['*']['createaccount'] = false; EOF Note: When testing, you may need to clear the apc cache to see changes take effect in the browser. Simplest solution is just restart apache. http://stackoverflow.com/questions/911158/how-to-clear-apc-cache-entries ''' Skippable Notes''' If we wanted to reset our installation, but leave the extension repositories alone, alter the command above to be git clean -fxd '''Rational for choosing git sources''' 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. 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. == Configure Apache == Note, non-debian based installs: modify instructions below to use /etc/httpd/conf.d/$mwdomain.conf, and don't run a2ensite. I use scripts I maintains separately to setup Let's Encrypt certificates and apache config: (url pending). 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. '''Not for production:''' teeu /etc/hosts<<<"127.0.0.1 $mwdomain" 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: '''Optional & requires additional steps:''' git clone https://github.com/certbot/certbot cd certbot ./certbot-auto apache cd /etc/apache/sites-available mv 000-default-le-ssl.conf $mwdomain.conf rm ../sites-enabled/000-default-le-ssl.conf # edit $mwdomain.conf, so documentroot is /var/www/$mwdomain/html # and ServerName is $mwdomain a2ensite $mwdomain.conf Then, copy the input to apache-site below and insert it into the apache config. Here, we use some scripts automate setting up the Let 's Encrypt cert and the apache config. l=$mw/../../logs mkdir -p $l temp=$(mktemp -d) cd $temp # for me, this repo is on the same server and apache needs a sec after restarting sleep 1 git clone https://iankelling.org/git/basic-https-conf { cat <\n $(< $line)\n"; done } | basic-https-conf/web-conf -r ${mw%/*} - apache2 $mwdomain cd rm -rf $temp Now mediawiki should load in your browser at $mwdomain . Allow proper search bots and internet archiver bots, via [[Mediawiki:Robots.txt]], and install the default skin. dd of=$mw/../robots.txt <<'EOF' User-agent: * Disallow: /w/ User-agent: ia_archiver Allow: /*&action=raw EOF mw-skin Vector '''Skippable Notes''' This section assumes we are redirecting www to a url without www. [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. == Mediawiki Settings == Overall reference: [[mediawikiwiki:Manual:Configuration_settings]]. Settings which the gui setup prompts for but aren't set by the automated install script. teeu $mwc< 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. teeu $mwc< Other misc settings teeu $mwc <<'EOF' # from https://www.mediawiki.org/wiki/Manual:Short_URL $wgArticlePath = "/wiki/$1"; # https://www.mediawiki.org/wiki/Manual:Combating_spam # check that url if our precautions don't work # not using nofollow is good practice, as long as we avoid spam. $wgNoFollowLinks = false; # Allow user customization. $wgAllowUserCss = true; # use imagemagick over GD $wgUseImageMagick = true; # manual says this is not production ready, I think that is mostly # because they are using MobileFrontend extension instead, which gives # an even cleaner more minimal view, I plan to try setting it up # sometime but this seems like a very nice improvement for now. $wgVectorResponsive = true; EOF # https://www.mediawiki.org/wiki/Manual:Configuring_file_uploads # Increase from default of 2M to 100M. # This will at least allow high res pics etc. php_ini=$(php -r 'echo(php_ini_loaded_file());') sed -i --follow-symlinks 's/^\(upload_max_filesize\|post_max_size\)\b.*/\1 = 100M/' $php_ini if isdeb; then service apache2 restart else systemctl restart httpd.service fi # if you were to install as a normal user, you would need this for images # sudo usermod -aG $apache_user $USER # this doesn't propogate right away chgrp -R $apache_user $mw/images chmod -R g+w $mw/images Style settings. Omit to use a different style. teeu $mwc <<'EOF' $wgLogo = null; #$wgFooterIcons = null; EOF # Make the toolbox go into the drop down. cd $mw/skins/Vector if ! git remote show ian-kelling &>/dev/null; then git remote add ian-kelling https://iankelling.org/git/mediawiki-sidebar-patch fi git fetch ian-kelling git checkout ian-kelling/${mw_branch}-toolbox-in-dropdown == Install and Configure Mediawiki Extensions == When installing extensions on a wiki with important content, backup first as a precaution. ''' Extensions with no configuration needed ''' {| class="writable" ! Name ! Description |- | [[mediawikiwiki:Extension:Cite|Extension:Cite]] | Have references in footnotes* |- | [[mediawikiwiki:Extension:CiteThisPage|Extension:CiteThisPage]] | Ability to generate citations to pages in a variety of styles* |- | [[mediawikiwiki:CheckUser|Extension:CheckUser]] | Get ip addresses from inside mediawiki so you can ban users'' |- | [[mediawikiwiki:Extension:CSS|Extension:CSS]] | Allows CSS stylesheets to be included in specific articles |- | [[mediawikiwiki:Extension:Echo|Extension:Echo]] | Notification subsystem for usage by other extensions |- | [[mediawikiwiki:Extension:Gadgets|Extension:Gadgets]] | UI extension system for users* |- | [[mediawikiwiki:Extension:ImageMap|Extension:ImageMap]] | Links for a region of an image* |- | [[mediawikiwiki:Extension:Interwiki|Extension:Interwiki]] | Tool for nice links to other wikis* |- | [[mediawikiwiki:Extension:News|Extension:News]] | Embed or rss recent changes |- | [[mediawikiwiki:Extension:Nuke|Extension:Nuke]] | Mass delete of pages, in the case of spam* |- | [[mediawikiwiki:Extension:ParserFunctions|Extension:ParserFunctions]] | Useful for templates* |- | [[mediawikiwiki:Extension:Poem|Extension:Poem]] | Useful for formatting things various ways* |- | [[mediawikiwiki:Extension:Renameuser|Extension:Renameuser]] | Allows bureaucrats to rename user accounts* |- | [[mediawikiwiki:Extension:SyntaxHighlight_GeSHi|Extension:SyntaxHighlight_GeSHi]] | Source code highlighting* |- | [[mediawikiwiki:Extension:Variables|Extension:Variables]] | Define per-page variables |} * = Comes with the MediaWiki default download. mw-ext Cite CiteThisPage CheckUser CSS Echo Gadgets ImageMap Interwiki News \ Nuke ParserFunctions Poem Renameuser SyntaxHighlight_GeSHi Variables ''' [[mediawikiwiki:Extension:AntiSpoof|Extension:AntiSpoof]]: Disallow usernames with unicode trickery to look like existing names''' mw-ext AntiSpoof # recommended setup script to account for existing users sudo -u $apache_user php $mw/extensions/AntiSpoof/maintenance/batchAntiSpoof.php '''[[mediawikiwiki:Extension:Wikidiff2|Extension:Wikidiff2]]: Faster and international character supported page diffs''' 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. if isdeb; then apt-get -y install php-wikidiff2 teeu $mwc <<'EOF' $wgExternalDiffEngine = 'wikidiff2'; EOF dir=$(dirname $(php -r 'echo(php_ini_loaded_file());'))/../apache2/conf.d ln -sf ../../mods-available/wikidiff2.ini $dir service apache2 restart fi ''' [[mediawikiwiki:Extension:Math|Extension:Math]] Display equations''' mw-ext Math # php5-curl according to Math readme if isdeb; then curl_pkg=php7.0-curl if ! apt-get -s install $curl_pkg &>/dev/null; then curl_pkg=php5-curl fi apt-get -y install latex-cjk-all texlive-latex-extra texlive-latex-base \ ghostscript imagemagick ocaml $curl_pkg make else # todo, php5-curl equivalent on fedora yum -y install texlive-cjk ghostscript ImageMagick texlive ocaml fi service apache2 restart cd $mw/extensions/Math/math; make # makes texvc cd $mw/extensions/Math/texvccheck; make teeu $mwc <<'EOF' # Enable MathJax as rendering option $wgUseMathJax = true; # Enable LaTeXML as rendering option $wgMathValidModes[] = 'latexml'; # Set LaTeXML as default rendering option, because it is nicest $wgDefaultUserOptions['math'] = 'latexml'; EOF '''Skippable notes''' 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. ''' [[mediawikiwiki:Extension:SpamBlacklist|Extension:SpamBlacklist]]: Import/create IP blacklists, mainly for spam''' Comes with MediaWiki. mw-ext SpamBlacklist if ! grep -F '$wgSpamBlacklistFiles = array(' $mwc &>/dev/null; then tee -a $mwc <<'EOF' $wgEnableDnsBlacklist = true; $wgDnsBlacklistUrls = array( 'xbl.spamhaus.org', 'dnsbl.tornevall.org' ); ini_set( 'pcre.backtrack_limit', '10M' ); $wgSpamBlacklistFiles = array( "[[m:Spam blacklist]]", "http://en.wikipedia.org/wiki/MediaWiki:Spam-blacklist" ); EOF fi ''' [[mediawikiwiki:Extension:TitleBlacklist|Extension:TitleBlacklist]]: Anti-spam ''' Comes with Mediawiki. mw-ext TitleBlacklist if ! grep -F '$wgTitleBlacklistSources = array(' $mwc &>/dev/null; then tee -a $mwc <<'EOF' $wgTitleBlacklistSources = array( array( 'type' => 'local', 'src' => 'MediaWiki:Titleblacklist', ), array( 'type' => 'url', 'src' => 'http://meta.wikimedia.org/w/index.php?title=Title_blacklist&action=raw', ), ); EOF fi ''' [[mediawikiwiki:Extension:WikiEditor|Extension:WikiEditor]]: Editing box extras and a fast preview tab ''' Comes with MediaWiki. mw-ext WikiEditor teeu $mwc <<'EOF' # Enable Wikieditor by default $wgDefaultUserOptions['usebetatoolbar'] = 1; $wgDefaultUserOptions['usebetatoolbar-cgd'] = 1; # Display the Preview and Changes tabs $wgDefaultUserOptions['wikieditor-preview'] = 1; EOF ''' [[mediawikiwiki:CategoryTree|Extension:CategoryTree]]: Enables making nice outlines of pages in a category''' mw-ext CategoryTree teeu $mwc <<'EOF' # Mediawiki setting dependency for CategoryTree $wgUseAjax = true; EOF ''' [[mediawikiwiki:Extension:AbuseFilter|Extension:AbuseFilter]]: Complex abilities to stop abuse ''' 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: mw-ext AbuseFilter teeu $mwc<<'EOF' $wgGroupPermissions['sysop']['abusefilter-modify'] = true; $wgGroupPermissions['*']['abusefilter-log-detail'] = true; $wgGroupPermissions['*']['abusefilter-view'] = true; $wgGroupPermissions['*']['abusefilter-log'] = true; $wgGroupPermissions['sysop']['abusefilter-private'] = true; $wgGroupPermissions['sysop']['abusefilter-modify-restricted'] = true; $wgGroupPermissions['sysop']['abusefilter-revert'] = true; EOF '''[[mediawikiwiki:Extension:ConfirmEdit|Extension:ConfirmEdit]]: Custom Captcha.''' Uses captchaArray defined in mw_vars. Comes with MediaWiki. mw-ext ConfirmEdit captchaArray teeu $mwc <<'EOF' wfLoadExtension( 'ConfirmEdit/QuestyCaptcha' ); $wgCaptchaClass = 'QuestyCaptcha'; # only captcha on registration $wgGroupPermissions['user' ]['skipcaptcha'] = true; $wgGroupPermissions['autoconfirmed']['skipcaptcha'] = true; EOF if ! grep -Fx 'foreach ( $localSettingsQuestyQuestions as $key => $value ) {' $mwc; then tee -a $mwc <<'EOF' foreach ( $localSettingsQuestyQuestions as $key => $value ) { $wgCaptchaQuestions[] = array( 'question' => $key, 'answer' => $value ); } EOF fi Enable account creation that we initially disabled. sed -i --follow-symlinks "/\\\$wgGroupPermissions\\['\\*'\\]\\['createaccount'\\] = false;/d" $mwc == Additional Configuration with Pywikibot == 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. '''Pywikibot Install''' [[mediawikiwiki:Manual:Pywikibot/Installation|Manual:Pywikibot/Installation]] # get repo if [[ ! -e ~/pywikibot/.git ]]; then git clone --recursive \ https://gerrit.wikimedia.org/r/pywikibot/core.git ~/pywikibot fi cd ~/pywikibot #updating git pull --all git submodule update '''Pywikibot Configuration''' 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]] cd $HOME/pywikibot dd of=user-config.py < '''Pywikibot Script''' 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]]. cd "$HOME/pywikibot" dd of=scripts/${mwfamily}_setup.py<