MediaWiki-Docker/Configuration recipes/Alternative databases

Alternative databasesEdit

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

MySQL (database replication)Edit

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

docker-compose.override.yml
version: '3.7'
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

Install MediaWiki with the following command:

docker compose exec mediawiki php maintenance/install.php  --server=http://localhost:8080 --scriptpath="/w" --dbname=my_database --dbuser=my_user --dbpass=my_password --dbserver=mariadb-main --lang en --pass dockerpass mediawiki admin

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'];
}

MySQL (single database server)Edit

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

docker-compose.override.yml
version: '3.7'
services:
  database:
    image: mariadb
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
    volumes:
      - ./cache/dbdata:/var/lib/mysql
volumes:
  dbdata:
    driver: local

Install MediaWiki with the following command:

docker compose exec mediawiki /bin/bash -c 'php maintenance/install.php --server="${MW_SERVER}" --scriptpath="${MW_SCRIPT_PATH}" --dbuser root --dbserver database --lang en --skins=Vector --with-extensions --pass ${MEDIAWIKI_PASSWORD} my_wiki ${MEDIAWIKI_USER}'

Postgres (single database server)Edit

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

docker-compose.override.yml
version: '3.7'
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 --lang en --pass dockerpass mediawiki admin