From 44712fafcec81eae9e1908d004054e54b3b5b523 Mon Sep 17 00:00:00 2001 From: Ian Kelling Date: Wed, 22 Jun 2016 10:44:33 -0700 Subject: [PATCH] major update, working fully for mw 1.27 --- Mediawiki_Setup_Guide | 481 ++++++++++++++++++++++-------------------- mw-setup-script | 295 ++++++++++++-------------- 2 files changed, 397 insertions(+), 379 deletions(-) diff --git a/Mediawiki_Setup_Guide b/Mediawiki_Setup_Guide index b410697..440beaf 100644 --- a/Mediawiki_Setup_Guide +++ b/Mediawiki_Setup_Guide @@ -1,8 +1,5 @@ == Introduction == -'''Currently undergoing revisions to upgrade from mediawiki version 1.23 to 1.27. -Should be done on 5/30/2016''' - '''tldr''': Automated setup on gnu/linux after you set options in [[#Dependent Variables and Functions]], except email. Any code which is not ready to be run has bold text saying so immediately before it. ''' Goals / Why use this guide? ''' @@ -21,15 +18,15 @@ Should be done on 5/30/2016''' * Self hosting, single Linux system with Bash shell * Root shell is assumed throughout -* Code blocks are [https://en.wikipedia.org/wiki/Idempotent idempotent] unless stated otherwise +* Code blocks are [https://en.wikipedia.org/wiki/Idempotent idempotent] '''Version Support''' Very minor adjustments needed for other distros. Help expand this list. -* Mediawiki 1.23 -* Fedora 20 (tested) -* Ubuntu 14.04 (tested) -* Debian 7 +* Mediawiki 1.27 +* Debian 8 (tested) + +Pre 5/2016 revisions ran Mediawiki 1.23, tested on Fedora 20 and Ubuntu 14.04. == Production Server Prerequisites == @@ -98,8 +95,8 @@ export mw_branch=REL1_27 # customize these questions to something your contributors would know, # is not super common / scriptable, and doesn't have the answer in the question captchaArray() { - if ! grep -Fx '$localSettingsQuestyQuestions = array (' $mwc - tee -a $mwc <<'EOF' + 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", "What does f in ofswiki.org stand for?" => "Free" @@ -124,47 +121,47 @@ export mw=/var/www/$mwdomain/html/w export mw_email="admin@$mwdomain" -Here we define some small useful bash functions. This should be part of the same file. +Here we define some small useful bash functions. This can be part of the same file. # for convenience, Mediawiki config file mwc="$mw/LocalSettings.php" -if isdeb; then - apache_user=www-data -else - apache_user=apache -fi +# 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-ext () { mw-extra extension $@; } -mw-skin() { mw-extra skin $@; } +mw-ext () { mw-extra extensions $@; } +mw-skin() { mw-extra skins $@; } mw-extra() { - local type=${1}s # extension or skin + local type=$1 # extension or skin shift - local clone=true - if [[ $1 == -g ]]; then - clone=false - shift - fi local ext for ext in "$@"; do - if $clone; then - local original_pwd="$PWD" - # it's ok that this fails if we already have it - url=https://git.wikimedia.org/git/mediawiki - target=$mw/$type/$ext + local original_pwd="$PWD" + # it's ok that this fails if we already have it + url=https://git.wikimedia.org/git/mediawiki + target=$mw/$type/$ext + if [[ ! -e $target/.git ]]; then git clone $url/$type/$ext.git $target - if ! cd $target; then - echo "mw-ext error: failed cd $mw/extensions/$ext"; - exit 1 - fi - git fetch - git checkout -qf origin/$mw_branch || git checkout -qf origin/master - git clean -xffd - cd "$original_pwd" fi + if ! cd $target; then + echo "mw-ext error: failed cd $mw/extensions/$ext"; + exit 1 + fi + git fetch + git checkout -qf origin/$mw_branch || git checkout -qf origin/master + git clean -xffd + cd "$original_pwd" case $type in extensions) if [[ -e $target/extension.json ]]; then @@ -183,8 +180,8 @@ EOF sed -i '/^wfLoadSkin/d' $mwc sed -i '/^\$wgDefaultSkin/d' $mwc teeu $mwc </dev/null; then + apache_user=www-data +else + apache_user=apache +fi + == Install Mediawiki Dependencies == @@ -203,15 +207,46 @@ The best way to get core dependencies is to install the mediawiki package itself [[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 - # noninteractive to avoid mysql password prompt - DEBIAN_FRONTEND=noninteractive apt-get -y install mediawiki ImageMagick php5-mysqlnd php-apc + apt-get install -y ImageMagick + if apt-get install -s mediawiki &>/dev/null; then + # in debian wheezy time-frame distros, mediawiki was packaged. + apt-get -y install php-apc 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 mysql-server \ + php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-xml \ + php7.0-apcu + else + DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 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 @@ -257,7 +292,9 @@ Here, we [[mediawikiwiki:Download_from_Git]], or reset our installation if it is mkdir -p $mw cd $mw # this will just fail if it already exists which is fine -git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git . +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 @@ -265,7 +302,9 @@ git checkout -f origin/$mw_branch git clean -ffxd # Get the php libraries wmf uses. Based on: # https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries -git clone https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git +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 .. @@ -273,7 +312,7 @@ 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 -u root -p$dbpass <<'EOF' +mysql -u root -p$dbpass <<'EOF' ||: drop database my_wiki; exit EOF @@ -323,6 +362,7 @@ fi # remove any existing directory rm -rf $mw/../analytics mv piwik $mw/../analytics +cd $mw rm -rf $tmpdir @@ -356,48 +396,39 @@ a2ensite $mwdomain.conf Then, copy the input to apache-site below and insert it into the apache config. -Here, I use my scripts to setup apache. It's behind nginx because the same server hosts other sites which are not convenient to use the same apache instance. +Here, we use some scripts automate setting up the Let 's Encrypt cert and +the apache config. + +temp=$(mktemp -d) +cd $temp +git_site=https://iankelling.org/git +git clone $git_site/acme-tiny-wrapper l=$mw/../../logs -mkdir $l +mkdir -p $l -acme-tiny-wrapper $mwdomain -dd of=/etc/apache2/ports.conf <<'EOF' -Listen 8082 -EOF +acme-tiny-wrapper/acme-tiny-wrapper $mwdomain + +git clone $git_site/basic-https-conf { cat <\n $(< $line)\n"; - done -} | apache-site -i -p 127.0.0.1:8082 -- - $mwdomain -nginx-site -p 8082 $mwdomain - - - -Turn on the new configuration - -if isdeb; then - a2ensite $mwdomain.conf - # for short urls - a2enmod rewrite - # We restart rather than reload because of the module - service apache2 restart -else - systemctl reload httpd.service -fi +find -L $(readlink -f $mw/..) -name .htaccess \ + | while read line; do + echo -e "\n $(< $line)\n"; +done +} | basic-https-conf/apache-site -r ${mw%/*} - $mwdomain Now mediawiki should load in your browser at $mwdomain . -Allow proper search bots and internet archiver bots, via [[Mediawiki:Robots.txt]] +Allow proper search bots and internet archiver bots, via [[Mediawiki:Robots.txt]], +and install the default skin. dd of=$mw/../robots.txt <<'EOF' @@ -406,6 +437,7 @@ Disallow: /w/ User-agent: ia_archiver Allow: /*&action=raw EOF +mw-skin Vector '''Skippable Notes''' @@ -426,7 +458,6 @@ teeu $mwc< Settings I recommend which are different than the defaults. @@ -465,8 +496,7 @@ EOF # Increase from default of 2M to 100M. # This will at least allow high res pics etc. php_ini=$(isdeb && echo /etc/php5/apache2/php.ini || echo /etc/php.ini) -sed -i 's/^\(upload_max_filesize\)\b.*/\1 = 100M/' -sed -i 's/^\(post_max_size\)\b.*/\1 = 100M/' +sed -i 's/^\(upload_max_filesize\|post_max_size\)\b.*/\1 = 100M/' $php_ini if isdeb; then service apache2 restart else @@ -485,14 +515,15 @@ Style settings. Omit to use a different style. teeu $mwc <<'EOF' $wgLogo = null; -$wgShowIPinHeader = false; -$wgFooterIcons = null; +#$wgFooterIcons = null; EOF # Make the toolbox go into the drop down. -cd $mw -git remote add ian git@gitorious.org:mediawiki-toolbox-patch/mediawiki-toolbox-patch.git -git fetch ian -git rebase ian/REL1_23-toolbox-in-dropdown +cd $mw/skins/Vector +if ! git remote show ian-kelling &>/dev/null; then + git remote add ian-kelling https://iankelling.org/git/Vector +fi +git fetch ian-kelling +git checkout ian-kelling/REL1_27-toolbox-in-dropdown == Install and Configure Mediawiki Extensions == @@ -502,54 +533,51 @@ When installing extensions on a wiki with important content, backup first as a p ''' Extensions with no configuration needed ''' {| class="wikitable" -! 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:Extension:CSS|Extension:CSS]] -| Allows CSS stylesheets to be included in specific articles -|- -| [[mediawikiwiki:Extension:DynamicPageList|Extension:DynamicPageList]] -| Embed page lists from categories & combinations of categories -|- -| [[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:SyntaxHighlight_GeSHi|Extension:SyntaxHighlight_GeSHi]] -| Source code highlighting -|- -| [[mediawikiwiki:Extension:Variables|Extension:Variables]] -| Define per-page variables -|} + ! 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: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:SyntaxHighlight_GeSHi|Extension:SyntaxHighlight_GeSHi]] + | Source code highlighting + |- + | [[mediawikiwiki:Extension:Variables|Extension:Variables]] + | Define per-page variables + |} -mw-ext Cite CiteThisPage CSS DynamicPageList Echo Gadgets ImageMap Interwiki News \ +mw-ext Cite CiteThisPage CSS Echo Gadgets ImageMap Interwiki News \ Nuke ParserFunctions Poem SyntaxHighlight_GeSHi Variables @@ -593,7 +621,12 @@ fi mw-ext Math # php5-curl according to Math readme if isdeb; then - apt-get -y install latex-cjk-all texlive-latex-extra texlive-latex-base ghostscript imagemagick ocaml php5-curl + 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 @@ -735,9 +768,11 @@ There are quite a few [[mediawikiwiki:Help:Namespaces|special pages]] which act # get repo -mkdir ~/opt -git clone --recursive https://gerrit.wikimedia.org/r/pywikibot/core.git ~/opt/pywikibot -cd ~/opt/pywikibot +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 @@ -750,7 +785,7 @@ Relevent docs: [[mediawikiwiki:Manual:Pywikibot/Use_on_non-WMF_wikis|Manual:Pywi -cd $HOME/opt/pywikibot +cd $HOME/pywikibot dd of=user-config.py < -pw="$HOME/opt/pywikibot" +cd "$HOME/pywikibot" -dd of=$pw/scripts/${mwfamily}_setup.py< @@ -871,39 +911,41 @@ Family name, and all its duplicattions documented as supposed to be $wgSitename, == Automatic Backups == -Copy this to a file (the next block assumes ~/bin/remote_wiki_backup) on a different machine than the one hosting mediawiki. Also copy ~/mw_vars to the same machine. Setup passwordless sudo to the mediawiki host (specifically, name the host $mwdomain). This will make a versioned backup of the wiki to ~/backup/wiki_file_backup and ~/backup/wiki_db_backup. +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. - + +backup_script=/etc/cron.daily/mediawiki_backup +sudo dd of=$backup_script <<'EOFOUTER' #!/bin/bash -source ~/mw_vars - # if we get an error, keep going but return it at the end last_error=0 trap 'last_error=$?' ERR - +source ~/mw_vars +logfile=/var/log/${mwdomain}_backup.log +{ +echo "#### starting backup at $(date) ####" ssh root@$mwdomain < ~/wiki_backup/wikidump -sed -i '$ d' $mwc # delete last line +mkdir -p ~/wiki_backups +mysqldump -p$dbpass --default-character-set=binary my_wiki > ~/wiki_backups/wiki_db_backup +sed -i '\$ d' $mwc # delete read only setting ENDSSH -rdiff-backup root@$mwdomain::/root/wiki_db_backup ~/backup/wiki_db_backup -rdiff-backup root@$mwdomain::$mw ~/backup/wiki_file_backup - +set -x +rdiff-backup root@$mwdomain::/root/wiki_backups ~/backup/${mwdomain}_wiki_db_backup +rdiff-backup root@$mwdomain::$mw ~/backup/${mwdomain}_wiki_file_backup +set +x +echo "=== ending backup at $(date) ====" +} &>>$logfile +if [[ $last_error != 0 ]]; then + echo "backup for $mwdomain failed. See $logfile" +fi exit $last_error - - -Run this script on the backup machine to setup daily backups at 4 am. +EOFOUTER - -chmod +x $HOME/bin/remote_wiki_backup -x="$(mktemp)" -crontab -l > "$x" -teeu "$x" <<'EOF' -0 4 * * * x=$($HOME/bin/remote_wiki_backup 2>&1); [[ $? != 0 ]] && echo "$x" -EOF -crontab "$x" +sudo chmod +x $backup_script If you are like most people and don't use the old-school mail spool, setup the backup system to send mail externally. Some ways to do that are on this [http://unix.stackexchange.com/questions/36982/can-i-set-up-system-mail-to-use-an-external-smtp-server stackoverflow answer]. Then make local mail to your user get forwarded to an address you will read: @@ -928,14 +970,19 @@ To test a backup restore: # Change REPLACE_ME in the code below (as in the backup section so you get the right variables), # Execute the code on the backup machine. - + +#!/bin/bash source ~/mw_vars HOSTNAME=REPLACE_ME source ~/mw_vars -rdiff-backup -r now ~/backup/wiki_file_backup /tmp/wiki_file_restore +rdiff-backup -r now ~/backup/${mwdomain}_wiki_file_backup /tmp/wiki_file_restore scp -r /tmp/wiki_file_restore/images root@$mwdomain:$mw/images -rdiff-backup -r now ~/backup/wiki_db_backup /tmp/wiki_db_restore +rdiff-backup -r now ~/backup/${mwdomain}_wiki_db_backup /tmp/wiki_db_restore scp -r /tmp/wiki_db_restore root@$mwdomain:/tmp -ssh root@$mwdomain "mysql -u root -p$dbpass my_wiki < /tmp/wiki_db_restore/wiki_db_dump" +ssh root@$mwdomain < Then browse to your wiki and see if everything appears to work. @@ -950,7 +997,7 @@ Major version upgrades should be done manually, and it is recommended to use a n Minor updates script: -s=$HOME/bin/mediawiki_update +s=/etc/cron.daily/mediawiki_update dd of=$s<<'EOF' #!/bin/bash source ~/mw_vars @@ -970,13 +1017,6 @@ done php $mw/maintenance/update.php -q EOF chmod +x $s - -x="$(mktemp)" -crontab -l > "$x" -teeu "$x" < == Upgrading Major Versions == @@ -992,15 +1032,25 @@ My strategy is: == Setup Piwik == +Note, -# docs suggests using separate database user, google lead me here for how -# https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql +# based on recommendation from install page +if ! dpkg -s php5-gd &>/dev/null; then + apt-get install -y php5-gd + service apache2 restart +fi + +# docs suggests using separate database user mysql -u root -p$dbpass < @@ -1008,7 +1058,7 @@ EOF Unfortunately, Piwik does not document how to do a fully automated install, and although it certainly seems possible, my first glance at the config file after doing manual steps showed a lot of noise, so we are sticking with the manual steps for now. -In a browser, navigate to your_domain/analytics. Follow these steps [http://piwik.org/docs/installation/#the-5-minute-piwik-installation the-5-minute-piwik-installation], using the database password from the previous section. +In a browser, navigate to your_domain/analytics. Follow these steps [http://piwik.org/docs/installation/#the-5-minute-piwik-installation the-5-minute-piwik-installation]. Use the user/db/pass from the previous section. We are going to use an extension to handle the javaScript tracking tag part. @@ -1020,7 +1070,7 @@ Under settings -> user settings, click the cookie to exclude your current browse git clone https://github.com/DaSchTour/piwik-mediawiki-extension.git $mw/extensions/Piwik -mw-ext -g Piwik +mw-ext Piwik teeu $mwc <_paq.push(['setSiteId', 2]); -'''Automatic Updates''' +'''Updates''' -Automatically update on tuesday, 3 am server time. This code will create an update script at ~/bin/piwik-remote-update. Based on [http://piwik.org/docs/update/ piwik.org/docs/update]. +Based on [http://piwik.org/docs/update/ piwik.org/docs/update]. Previously it's been seen to require manual steps, so it is not recommended to put in a cron script. - -s=~/bin/piwik-update + mkdir -p ${s%/*} -dd of=$s < "$x" -teeu "$x" <<< "0 3 * * tue $s" -crontab "$x" +$piwik_path/console core:update @@ -1080,26 +1117,26 @@ Mediawiki.org has pages for ~5200 extensions. Mediawiki maintains ~700 extension Here are brief descriptions of extensions that are part of distributions and why they were rejected for this wiki. {| class="wikitable" -|+ -| '''InputBox''' || Add html forms to pages. Can't imagine using it. Would install if I did. -|+ -| '''Pdfhandler''' || Gallery of pages from a pdf file. Can't imagine using it. Would install if I did. -|+ -| '''Footnote''' || deprecated in newer versions -|+ -| '''NewUserNotif''' || Send me a notification when a user registers. Seems like an excessive notification. -|+ -| '''NewestPages''' || A page creation history that doesn't expire like recent-changes. Meh -|+ -| '''RSSReader''' || Embed an rss feed. Can't imagine using it. Would install if I did. -|+ -| '''Openid''' || Poor UI. 2 pages & 2 links which is confusing & ugly. -|+ -| '''Validator''' || dependency of of semantic -|+ -| '''Semantic''' || Seems like a lot of trouble around analyzing kinds of data which my wiki will not have. -|+ -| '''wikicalendar''' || Make a calendar of events etc. Can't imagine using it. Would install if I did. + |+ + | '''InputBox''' || Add html forms to pages. Can't imagine using it. Would install if I did. + |+ + | '''Pdfhandler''' || Gallery of pages from a pdf file. Can't imagine using it. Would install if I did. + |+ + | '''Footnote''' || deprecated in newer versions + |+ + | '''NewUserNotif''' || Send me a notification when a user registers. Seems like an excessive notification. + |+ + | '''NewestPages''' || A page creation history that doesn't expire like recent-changes. Meh + |+ + | '''RSSReader''' || Embed an rss feed. Can't imagine using it. Would install if I did. + |+ + | '''Openid''' || Poor UI. 2 pages & 2 links which is confusing & ugly. + |+ + | '''Validator''' || dependency of of semantic + |+ + | '''Semantic''' || Seems like a lot of trouble around analyzing kinds of data which my wiki will not have. + |+ + | '''wikicalendar''' || Make a calendar of events etc. Can't imagine using it. Would install if I did. |} == Misc Notes == @@ -1144,7 +1181,5 @@ This means the code is compatible with gplv3. == todo list for this page == * Evaluate any extensions bundled in 27 which I haven't checked out before. -* Update style patch link. * Visual editor -* Upgrade instructions -* Consider changing default signature to not have talk link +* Don't require registration for edits diff --git a/mw-setup-script b/mw-setup-script index 151d949..7aca959 100755 --- a/mw-setup-script +++ b/mw-setup-script @@ -5,41 +5,41 @@ # for convenience, Mediawiki config file mwc="$mw/LocalSettings.php" -if isdeb; then - apache_user=www-data -else - apache_user=apache -fi +# 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-ext () { mw-extra extension $@; } -mw-skin() { mw-extra skin $@; } +mw-ext () { mw-extra extensions $@; } +mw-skin() { mw-extra skins $@; } mw-extra() { - local type=${1}s # extension or skin + local type=$1 # extension or skin shift - local clone=true - if [[ $1 == -g ]]; then - clone=false - shift - fi local ext for ext in "$@"; do - if $clone; then - local original_pwd="$PWD" - # it's ok that this fails if we already have it - url=https://git.wikimedia.org/git/mediawiki - target=$mw/$type/$ext + local original_pwd="$PWD" + # it's ok that this fails if we already have it + url=https://git.wikimedia.org/git/mediawiki + target=$mw/$type/$ext + if [[ ! -e $target/.git ]]; then git clone $url/$type/$ext.git $target - if ! cd $target; then - echo "mw-ext error: failed cd $mw/extensions/$ext"; - exit 1 - fi - git fetch - git checkout -qf origin/$mw_branch || git checkout -qf origin/master - git clean -xffd - cd "$original_pwd" fi + if ! cd $target; then + echo "mw-ext error: failed cd $mw/extensions/$ext"; + exit 1 + fi + git fetch + git checkout -qf origin/$mw_branch || git checkout -qf origin/master + git clean -xffd + cd "$original_pwd" case $type in extensions) if [[ -e $target/extension.json ]]; then @@ -58,8 +58,8 @@ EOF sed -i '/^wfLoadSkin/d' $mwc sed -i '/^\$wgDefaultSkin/d' $mwc teeu $mwc </dev/null; then + apache_user=www-data +else + apache_user=apache +fi + # # +# 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 - # noninteractive to avoid mysql password prompt - DEBIAN_FRONTEND=noninteractive apt-get -y install mediawiki ImageMagick php5-mysqlnd php-apc + apt-get install -y ImageMagick + if apt-get install -s mediawiki &>/dev/null; then + # in debian wheezy time-frame distros, mediawiki was packaged. + apt-get -y install php-apc 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 mysql-server \ + php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-xml \ + php7.0-apcu + else + DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 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 @@ -103,7 +139,9 @@ fi mkdir -p $mw cd $mw # this will just fail if it already exists which is fine -git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git . +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 @@ -111,7 +149,9 @@ git checkout -f origin/$mw_branch git clean -ffxd # Get the php libraries wmf uses. Based on: # https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries -git clone https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git +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 .. @@ -119,7 +159,7 @@ 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 -u root -p$dbpass <<'EOF' +mysql -u root -p$dbpass <<'EOF' ||: drop database my_wiki; exit EOF @@ -148,42 +188,34 @@ fi # remove any existing directory rm -rf $mw/../analytics mv piwik $mw/../analytics +cd $mw rm -rf $tmpdir # # +temp=$(mktemp -d) +cd $temp +git_site=https://iankelling.org/git +git clone $git_site/acme-tiny-wrapper l=$mw/../../logs -mkdir $l +mkdir -p $l -acme-tiny-wrapper $mwdomain -dd of=/etc/apache2/ports.conf <<'EOF' -Listen 8082 -EOF +acme-tiny-wrapper/acme-tiny-wrapper $mwdomain + +git clone $git_site/basic-https-conf { cat <\n $(< $line)\n"; - done -} | apache-site -i -p 127.0.0.1:8082 -- - $mwdomain -nginx-site -p 8082 $mwdomain -# -# -if isdeb; then - a2ensite $mwdomain.conf - # for short urls - a2enmod rewrite - # We restart rather than reload because of the module - service apache2 restart -else - systemctl reload httpd.service -fi +ServerAdmin $mw_email +RewriteEngine On +# make the site's root url go to our main page +RewriteRule ^/?wiki(/.*)?\$ %{DOCUMENT_ROOT}/w/index.php [L] +# use short urls https://www.mediawiki.org/wiki/Manual:Short_URL +RewriteRule ^/*\$ %{DOCUMENT_ROOT}/w/index.php [L] +EOF +find -L $(readlink -f $mw/..) -name .htaccess \ + | while read line; do + echo -e "\n $(< $line)\n"; +done +} | basic-https-conf/apache-site -r ${mw%/*} - $mwdomain # # dd of=$mw/../robots.txt <<'EOF' @@ -192,6 +224,7 @@ Disallow: /w/ User-agent: ia_archiver Allow: /*&action=raw EOF +mw-skin Vector # # teeu $mwc< # @@ -236,8 +268,7 @@ EOF # Increase from default of 2M to 100M. # This will at least allow high res pics etc. php_ini=$(isdeb && echo /etc/php5/apache2/php.ini || echo /etc/php.ini) -sed -i 's/^\(upload_max_filesize\)\b.*/\1 = 100M/' -sed -i 's/^\(post_max_size\)\b.*/\1 = 100M/' +sed -i 's/^\(upload_max_filesize\|post_max_size\)\b.*/\1 = 100M/' $php_ini if isdeb; then service apache2 restart else @@ -254,17 +285,18 @@ chmod -R g+w $mw/images # teeu $mwc <<'EOF' $wgLogo = null; -$wgShowIPinHeader = false; -$wgFooterIcons = null; +#$wgFooterIcons = null; EOF # Make the toolbox go into the drop down. -cd $mw -git remote add ian git@gitorious.org:mediawiki-toolbox-patch/mediawiki-toolbox-patch.git -git fetch ian -git rebase ian/REL1_23-toolbox-in-dropdown +cd $mw/skins/Vector +if ! git remote show ian-kelling &>/dev/null; then + git remote add ian-kelling https://iankelling.org/git/Vector +fi +git fetch ian-kelling +git checkout ian-kelling/REL1_27-toolbox-in-dropdown # # -mw-ext Cite CiteThisPage CSS DynamicPageList Echo Gadgets ImageMap Interwiki News \ +mw-ext Cite CiteThisPage CSS Echo Gadgets ImageMap Interwiki News \ Nuke ParserFunctions Poem SyntaxHighlight_GeSHi Variables # # @@ -290,7 +322,12 @@ fi mw-ext Math # php5-curl according to Math readme if isdeb; then - apt-get -y install latex-cjk-all texlive-latex-extra texlive-latex-base ghostscript imagemagick ocaml php5-curl + 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 @@ -395,15 +432,17 @@ sed -i "/\\\$wgGroupPermissions\\['\\*'\\]\\['createaccount'\\] = false;/d" $mwc # # # get repo -mkdir ~/opt -git clone --recursive https://gerrit.wikimedia.org/r/pywikibot/core.git ~/opt/pywikibot -cd ~/opt/pywikibot +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 # # -cd $HOME/opt/pywikibot +cd $HOME/pywikibot dd of=user-config.py < # -pw="$HOME/opt/pywikibot" +cd "$HOME/pywikibot" -dd of=$pw/scripts/${mwfamily}_setup.py< # -#!/bin/bash -source ~/mw_vars - -# if we get an error, keep going but return it at the end -last_error=0 -trap 'last_error=$?' ERR - -ssh root@$mwdomain < ~/wiki_backup/wikidump -sed -i '$ d' $mwc # delete last line -ENDSSH -rdiff-backup root@$mwdomain::/root/wiki_db_backup ~/backup/wiki_db_backup -rdiff-backup root@$mwdomain::$mw ~/backup/wiki_file_backup - -exit $last_error -# -# -chmod +x $HOME/bin/remote_wiki_backup -x="$(mktemp)" -crontab -l > "$x" -teeu "$x" <<'EOF' -0 4 * * * x=$($HOME/bin/remote_wiki_backup 2>&1); [[ $? != 0 ]] && echo "$x" -EOF -crontab "$x" -# -# -source ~/mw_vars -HOSTNAME=REPLACE_ME source ~/mw_vars -rdiff-backup -r now ~/backup/wiki_file_backup /tmp/wiki_file_restore -scp -r /tmp/wiki_file_restore/images root@$mwdomain:$mw/images -rdiff-backup -r now ~/backup/wiki_db_backup /tmp/wiki_db_restore -scp -r /tmp/wiki_db_restore root@$mwdomain:/tmp -ssh root@$mwdomain "mysql -u root -p$dbpass my_wiki < /tmp/wiki_db_restore/wiki_db_dump" -# -# -s=$HOME/bin/mediawiki_update +s=/etc/cron.daily/mediawiki_update dd of=$s<<'EOF' #!/bin/bash source ~/mw_vars @@ -567,54 +573,31 @@ done php $mw/maintenance/update.php -q EOF chmod +x $s - -x="$(mktemp)" -crontab -l > "$x" -teeu "$x" < # -# docs suggests using separate database user, google lead me here for how -# https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql +# based on recommendation from install page +if ! dpkg -s php5-gd &>/dev/null; then + apt-get install -y php5-gd + service apache2 restart +fi + +# docs suggests using separate database user mysql -u root -p$dbpass < # git clone https://github.com/DaSchTour/piwik-mediawiki-extension.git $mw/extensions/Piwik -mw-ext -g Piwik +mw-ext Piwik teeu $mwc < -# -s=~/bin/piwik-update -mkdir -p ${s%/*} -dd of=$s < "$x" -teeu "$x" <<< "0 3 * * tue $s" -crontab "$x" -# -- 2.30.2