MediaWiki-Docker/Configuration recipes/Alternative databases

Alternative databases

edit

The default configuration uses SQLite for the database backend, but you can use MySQL (with replication or without) or Postgres instead.

MariaDB (single database server)

edit

These instruction assume a new installation (no LocalSettings.php).

docker-compose.override.yml
services:
  mariadb:
    image: 'bitnami/mariadb:latest'
    volumes:
      - mariadbdata:/bitnami/mariadb
    environment:
      - MARIADB_ROOT_PASSWORD=root_password
      - MARIADB_USER=my_user
      - MARIADB_PASSWORD=my_password
      - MARIADB_DATABASE=my_database
    ports:
      - 3306:3306
volumes:
  mariadbdata:
    driver: local

To install MediaWiki, open a bash shell in the container:

docker compose exec mediawiki /bin/bash

In this bash shell, install MediaWiki with the following command:

php maintenance/run.php install --dbname=my_database --dbuser=my_user --dbpass=my_password --dbserver=mariadb --server="${MW_SERVER}" --scriptpath="${MW_SCRIPT_PATH}" --lang en --pass ${MEDIAWIKI_PASSWORD} mediawiki ${MEDIAWIKI_USER}

MariaDB (database replication)

edit

This is the configuration recipe that is most like Wikimedia production.

These instruction assume a new installation (no LocalSettings.php).

docker-compose.override.yml
services:
  mariadb-main:
    image: 'bitnami/mariadb:latest'
    volumes:
      - mariadbdata:/bitnami/mariadb
    environment:
      - MARIADB_REPLICATION_MODE=master
      - MARIADB_REPLICATION_USER=repl_user
      - MARIADB_REPLICATION_PASSWORD=repl_password
      - MARIADB_ROOT_PASSWORD=main_root_password
      - MARIADB_USER=my_user
      - MARIADB_PASSWORD=my_password
      - MARIADB_DATABASE=my_database
  mariadb-replica:
    image: 'bitnami/mariadb:latest'
    depends_on:
      - mariadb-main
    environment:
      - MARIADB_REPLICATION_MODE=slave
      - MARIADB_REPLICATION_USER=repl_user
      - MARIADB_REPLICATION_PASSWORD=repl_password
      - MARIADB_MASTER_HOST=mariadb-main
      - MARIADB_MASTER_PORT_NUMBER=3306
      - MARIADB_MASTER_ROOT_PASSWORD=main_root_password
volumes:
  mariadbdata:
    driver: local

To install MediaWiki, open a bash shell in the container:

docker compose exec mediawiki /bin/bash

In this bash shell, install MediaWiki with the following command:

php maintenance/install.php --dbname=my_database --dbuser=my_user --dbpass=my_password --dbserver=mariadb-main \
--server="${MW_SERVER}" --scriptpath="${MW_SCRIPT_PATH}" --lang en \
--pass ${MEDIAWIKI_PASSWORD} mediawiki ${MEDIAWIKI_USER}

After installing, add these snippets so that MediaWiki knows to read from the replica but write to the main database.

LocalSettings.php
$wgDBname = 'my_database';
$dockerMainDb = [
	'host' => "mariadb-main",
	'dbname' => 'my_database',
	'user' => 'root',
	'password' => 'main_root_password',
	'type' => "mysql",
	'flags' => DBO_DEFAULT,
	'load' => 0,
];
$dockerReplicaDb = [
	'host' => "mariadb-replica",
	'dbname' => 'my_database',
	'user' => 'root',
	'password' => 'main_root_password',
	'type' => "mysql",
	'flags' => DBO_DEFAULT,
	'max lag' => 60,
	'load' => 1,
];
// Integration tests fail when run with replication, due to not having the temporary tables.
if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
	$wgDBservers = [ $dockerMainDb, $dockerReplicaDb ];
} else {
	$wgDBserver = $dockerMainDb['host'];
	$wgDBuser = $dockerMainDb['user'];
	$wgDBpassword = $dockerMainDb['password'];
	$wgDBtype = $dockerMainDb['type'];
}

Simulating replication lag

edit

On the replica database (e.g. docker compose exec mariadb-replica mariadb -u root -p):

STOP REPLICA;
CHANGE MASTER TO MASTER_DELAY=$n;
START REPLICA;

where $n is the number of seconds to delay. Set this to 0 to remove the lag.

You can check the amount of lag by running SHOW REPLICA STATUS\G; and looking for the row SQL_Delay.

Postgres (single database server)

edit

These instruction assume a new installation (no LocalSettings.php).

docker-compose.override.yml
services:
  database:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - dbdata:/var/lib/postgresql/data
volumes:
  dbdata:
    driver: local

To install the MediaWiki database tables, use:

docker compose exec mediawiki php maintenance/install.php --dbuser postgres --dbpass example --dbserver database --dbtype postgres --server="${MW_SERVER}" --scriptpath="${MW_SCRIPT_PATH}" --lang en --pass ${MEDIAWIKI_PASSWORD} mediawiki ${MEDIAWIKI_USER}