MediaWiki Test Umgebung mit Docker Compose

Aus Laub-Home Wiki

Möchte man eine MediaWiki Installation zum testen neuer Features haben, kann man einfach das Compose Projekt dazu nutzen ein zweites MediaWiki hochzufahren, um hier ein wenig zu Spielen und neue Extensions auszuprobieren.

Dieses HowTo basiert auf der Anleitung der MediaWiki Docker Installation.

NGINX SSL Reverse Proxy Vorbereitung

Dieser Abschnitt konfiguriert das Frontend, oder besser gesagt den Reverse Proxy, der dafür sorgt, das Compose Projekt nach draußen freizugeben. Mehr Informationen, wie man diesen einrichtet findet ihr hier:

Als erstes können wir uns vom bestehenden MediaWiki die vhost Konfiguration kopieren und diese Anpassen.

cd /opt/nginxproxy
cp data/nginx/conf/www.example.tld.conf data/nginx/conf/test.example.tld.conf

test.example.tld.conf Dann die folgenden Änderungen vornehmen:

  • Servername auf die Test Domain ändern
  • SSL Zertifikate, die richtigen Pfade zu den Zertifikaten eintragen
  • Optional: Enable Basic Auth, damit nicht jeder Zugriff von außen auf das Test System bekommt
  • Proxy Pass Port auf zukünftigen Test MediaWiki Port ändern und merken ;-)
  • Nosniff Header, damit Suchmaschinen die Seiten nicht crawlen dürfen
  server_name test.example.tld;

  ssl_certificate /etc/letsencrypt/live/test.example.tld/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/test.example.tld/privkey.pem;

  # BASIC AUTH vor den gesamten vhost
  auth_basic 'Restricted Area';
  auth_basic_user_file /etc/nginx/conf.d/.htpasswd.pwd;

    proxy_pass http://127.0.0.1:8091;

  # no access for crawling robots 
  add_header X-Content-Type-Options nosniff;

die komplette Datei sieht dann in etwa so aus:

server {
  listen 80;
  listen [::]:80;
  server_name test.example.tld;

  return 301 https://$host$request_uri;
}
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name test.example.tld;
  if ($host != $server_name) {
      rewrite ^/(.*) $scheme://$server_name/$1 permanent;
  }

  ssl_certificate /etc/letsencrypt/live/test.example.tld/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/test.example.tld/privkey.pem;

  include /etc/nginx/conf.d/includes/site-defaults.conf;
  include /etc/nginx/conf.d/includes/cert_bot.conf;
  expires $expires;

  # BASIC AUTH infront of the complete vhost
  # Excluding the VisualEditor user agent
  satisfy any;
  auth_basic 'Restricted Area';
  auth_basic_user_file /etc/nginx/conf.d/.htpasswd.pwd;
  auth_request /auth;
  location = /auth {
      if ($http_user_agent ~ VisualEditor-MediaWiki/*) {
         return 200;
      }
         return 403;
      }

  location / {
      proxy_pass http://127.0.0.1:8091;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      client_max_body_size 0;
  }

  # no access for crawling robots 
  add_header X-Content-Type-Options nosniff;

  # Security Headers
  add_header Strict-Transport-Security "max-age=15768000;";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Download-Options noopen;
  add_header X-Frame-Options "sameorigin";
  add_header X-Permitted-Cross-Domain-Policies none;
  add_header Referrer-Policy strict-origin;
}

Als nächstes brauchen wir noch ein neues SSL Zertifikat, dafür einfach die domains.txt um die neue Domain erweitern:
domains.txt

www.example.tld,example.tld,wiki.example.tld
test.example.tld

Dann Starten wir das Generieren, was Wiederrum durch das Neustarten des NGINX auch unsere obenstehendes Konfiguration aktiviert.

./generate-certs.sh

Nun sollte man beim Aufruf von test.example.tld eine 502er Fehlerseite sehen, da das Backend noch nicht online ist.

MediaWiki Docker Compose Projekt klonen

Nun kopieren wir einfach das Komplette Bestende Compose Projekt in den zukünftigen Projekt Ordner:

cp -rp /opt/mediawiki /opt/mediawiki-test
cd /opt/mediawiki-test

Nun passen wir die neue Test MediaWiki Installation an, hierfür einfach das .env editieren und zumindest den im NGINX Proxy eingetragenen TCP Port ändern.

# Config File for MediaWiki Application
DB_ROOT_PASS=NennunabVitxibCatsxx
DB_NAME=wiki
DB_USER=wiki
DB_PASS=Prysantyxxhvuvjoolhx

# Port Configuration
INT_PORT=80
BIND_TO=127.0.0.1:8091

# Memcached Size
CACHE=16M

# Timezone
TZ=Europe/Berlin

Ansonsten müssen noch die Bridge Interface Namen geändert werden, da diese schon vom Live System verwendet werden. docker-compose.yml

...
    driver_opts:
      com.docker.network.bridge.name: br-tmediawikife
...
    driver_opts:
      com.docker.network.bridge.name: br-tmediawikibe
...

Initiales frisches Setup ohne Daten Migration

Dafür muss zuerst docker-compose.yml das mounten der LocalSettings.php auskommentiert werden, damit der Setup Assistent aufgerufen wird und die Datenbank initial eingerichtet wird.
docker-compose.yml

...
      # After initial setup, download LocalSettings.php to data/conf directory 
      # and uncomment the following line and use compose to restart
      # the mediawiki service
      #- ./data/conf/LocalSettings.php:/var/www/html/LocalSettings.php:ro
...

Nun kann unsere MediaWiki Test Umgebung hochgefahren werden.

docker-compose up -d

Unter https://test.example.tld sollte nun der bekannte Setup Assistent von MediaWiki erscheinen.

1 zu 1 Migration

Möchte man eine 1 zu 1 Migration, also inklusive aller Daten, dann müssen die Volume Daten und die MySQL Datenbank in das Neue Compose Projekt kopiert werden. Aber als erstes ändern wir den Hostname in der LocalSettings.php:

data/conf/LocalSettings.php

$wgServer = "https://test.example.tld";

Nun deployen wir das Projekt:

docker-compose up -d

Nun nutzen wir das Script clone-docker-volumes.sh um das "wiki" Volume von Live nach Test zu kopieren. Das Script findet ihr hier:

Die beiden Volumes sollten...

  • Source: mediawiki_data_mediawiki_wiki (Live)
  • Destination: mediawiki-test_data_mediawiki_wiki (Test)

sein.
Also das Script clone-docker-volumes.sh wie folgt aufrufen:

clone-docker-volumes.sh mediawiki_data_mw_images mediawiki-test_data_mw_images

Nun kopiert es die Daten von Source nach Destination.
Die Datenbank könnte man so auch kopieren, dafür muss diese aber auf beiden Seiten heruntergefahren werden. Der Saubere Weg führt uns über einen mysqldump und ein Einspielen von diesem im Zielsystem. Auch das kann man einfach mit dem kleinen clone-docker-mysql.sh Script machen:

clone-docker-mysql.sh mediawiki_database_1 mediawiki-test_database_1

Hier wird nun die Wiki DB vom Source MariaDB Container abgezogen und direkt in den Destination MariaDB Container gepipt.