Welcome to the MediaWiki community! Please see How to become a MediaWiki hacker for general information on contributing to MediaWiki.
MediaWiki provides an extendable local development environment based on Docker Compose. This environment provides PHP, Apache, Xdebug and a SQLite database.
Do not use the development environment to serve a public website! Bad things would happen!
More documentation, examples, and configuration recipes are available at mediawiki.org/wiki/Special:MyLanguage/MediaWiki-Docker.
Support is available on the Libera IRC network in the #mediawiki channel, and on Phabricator by creating tasks with the MediaWiki-Docker tag.
You'll need to have Docker installed:
- Docker Desktop for macOS or Windows.
- Docker engine for Linux.
The container images provided by Wikimedia use an AMD64 Debian runtime and are not currently available in ARM64 or any 32-bit processor variants. ARM64 MacOS computers have been reported to work with these images via Rosetta AMD64 emulation.
Linux users:
- We recommend installing
docker-ce,docker-ce-cli,containerd.io, anddocker-compose-pluginby downloading the server releases for your distribution rather than Docker Desktop. You can also install the binaries. - Follow the instructions to "Manage Docker as a non-root user"
Windows users:
Running Docker from a Windows terminal and using the Windows file system will result in MediaWiki being very slow. For Windows 10 and higher, we recommend configuring Docker and Windows to use the Windows Subsystem for Linux (WSL). Turn on WSL in your Windows settings, then run the following commands: wsl --install -d ubuntu and wsl --set-version ubuntu 2. Then go into Docker -> Settings -> General -> tick "Use the WSL 2 based engine", then go into Docker -> Settings -> Resources -> WSL Integration -> tick "Ubuntu". git clone the mediawiki repository into a WSL folder such as home/yourusername/mediawiki so that the files are inside WSL. Then you can run most of the commands in this tutorial outside of WSL, by opening PowerShell, navigating to the WSL directory with cd \\wsl.localhost\Ubuntu\home\yourusername\mediawiki, and executing shell commands as normal. To access WSL from PowerShell (rare but may be needed sometimes), you can use the command ubuntu to turn a PowerShell console into a WSL console. To navigate to WSL folders in File Explorer, show the Navigation Pane, then towards the bottom, look for "Linux" (it will be close to "This PC").
Download the latest MediaWiki files to your computer. One way to download the latest alpha version of MediaWiki is to
install git, open a shell, navigate to the directory where you want to save the files, then type
git clone https://gerrit.wikimedia.org/r/mediawiki/core.git mediawiki.
Optional: If you plan to submit patches to this repository, you will probably want to create a Gerrit account,
then type git remote set-url origin ssh://YOUR-GERRIT-USERNAME-HERE@gerrit.wikimedia.org:29418/mediawiki/core,
replacing YOUR-GERRIT-USERNAME-HERE with your Gerrit username. Please see the official
MediaWiki Gerrit tutorial for more information.
Using a text editor, create a .env file in the root of the MediaWiki core repository, and copy these contents into
that file:
MW_SCRIPT_PATH=/w
MW_SERVER=http://localhost:8080
MW_DOCKER_PORT=8080
MEDIAWIKI_USER=Admin
MEDIAWIKI_PASSWORD=dockerpass
XDEBUG_CONFIG=
XDEBUG_ENABLE=true
XHPROF_ENABLE=trueWindows users: Run the following command to add a blank user ID and group ID to your .env file:
echo "
MW_DOCKER_UID=
MW_DOCKER_GID=" >> .envNon-Windows users: Run the following command to add your user ID and group ID to your .env file:
echo "MW_DOCKER_UID=$(id -u)
MW_DOCKER_GID=$(id -g)" >> .envLinux users: If you'd like to use Xdebug features inside your IDE, then create a docker-compose.override.yml file as
well:
services:
mediawiki:
# For Linux: This extra_hosts section enables Xdebug-IDE communication:
extra_hosts:
- "host.docker.internal:host-gateway"-
Start the containers:
docker compose up -d
The "up" command makes sure that the PHP and webserver containers are running (and any others in the
docker-compose.ymlfile). It is safe to run at any time, and will do nothing if the containers are already running.The first time, it may take a few minutes to download new Docker images.
The
-dargument stands for "detached" mode, which run the services in the background. If you suspect a problem with one of the services, you can run it without-dto follow the server logs directly from your terminal. You don't have to stop the services first, if you ran it with-dand then without, you'll get connected to the already running containers including a decent back scroll of server logs.Note that MediaWiki debug logs go to
/cache/*.logfiles (not sent to docker). -
Install PHP dependencies from Composer:
docker compose exec mediawiki composer update -
Install MediaWiki:
docker compose exec mediawiki /bin/bash /docker/install.shWindows users: make sure you run the above command in PowerShell as it does not work in Bash.
-
Windows users: Make sure to set the SQLite directory to be writable.
docker compose exec mediawiki chmod -R o+rwx cache/sqlite
Done! The wiki should now be available for you at http://localhost:8080.
You can use docker compose exec mediawiki bash to open a Bash shell in the
MediaWiki container. You can then run one or more commands as needed and stay
within the container shell.
You can also run a single command in the container directly from your host
shell, for example: docker compose exec mediawiki php maintenance/run.php update.
Run a single PHPUnit file or directory:
docker compose exec mediawiki bash
instance:/w$ cd tests/phpunit
instance:/w/tests/phpunit$ composer phpunit -- path/to/my/test/See PHPUnit on mediawiki.org for more examples.
You can use Fresh to run Selenium in a dedicated container. Example usage:
fresh-node -env -net
npm ci
npm run selenium-testYou can use Fresh to run API tests in a dedicated container. Example usage:
export MW_SERVER=http://localhost:8080/
export MW_SCRIPT_PATH=/w
export MEDIAWIKI_USER=Admin
export MEDIAWIKI_PASSWORD=dockerpass
fresh-node -env -net
# Create .api-testing.config.json as documented on
# https://www.mediawiki.org/wiki/Special:MyLanguage/MediaWiki_API_integration_tests
npm ci
npm run api-testingYou can override the default services from a docker-compose.override.yml
file, and make use of those overrides by changing LocalSettings.php.
Example overrides and configurations can be found under MediaWiki-Docker on mediawiki.org.
After updating docker-compose.override.yml, run docker compose down
followed by docker compose up -d for changes to take effect.
If you need root on the container to install system packages with apt-get for
troubleshooting, you can open a shell as root with
docker compose exec --user root mediawiki bash.
To install an extension or skin, follow the instructions of the mediawiki.org page for the extension or skin in question, and look for any dependencies or additional steps that may be needed.
For most extensions, only two steps are needed: download the code to the
right directory, and then enable the component from LocalSettings.php.
To install the Vector skin:
-
Clone the skin:
cd skins/ git clone https://gerrit.wikimedia.org/r/mediawiki/skins/Vector -
Enable the skin, by adding the following to
LocalSettings.php:wfLoadSkin( 'Vector' );
To install the EventLogging extension:
-
Clone the extension repository:
cd extensions/ git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/EventLoggingAlternatively, if you have extension repositories elsewhere on disk, mount each one as an overlapping volume in
docker-compose.override.yml. This is comparable to a symlink, but those are not well-supported in Docker.services: mediawiki: volumes: - ~/Code/EventLogging:/var/www/html/w/extensions/EventLogging:cached mediawiki-jobrunner: volumes: - ~/Code/EventLogging:/var/www/html/w/extensions/EventLogging:cached
Note: If the extension serves static assets directly (e.g., images, fonts), you may also need to mount the volume to the
mediawiki-webservice:services: mediawiki-web: volumes: - ~/Code/EventLogging:/var/www/html/w/extensions/EventLogging:cached
-
Enable the extension, by adding the following to
LocalSettings.php:wfLoadExtension( 'EventLogging' );
By default, you will need to set XDEBUG_TRIGGER=1 in the GET/POST, or as an
environment variable, to turn on Xdebug for a request.
You can also install a browser extension for controlling whether Xdebug is active. See the official Xdebug Step Debugging, particularly the "Activating Step Debugging" section, for more details.
If you wish to run Xdebug on every request, you can set
start_with_request=yes in XDEBUG_CONFIG in your .env file:
XDEBUG_CONFIG=start_with_request=yes
You can pass any of Xdebug's configuration values in this variable. For example:
XDEBUG_CONFIG=client_host=192.168.42.34 client_port=9000 log=/tmp/xdebug.log
This shouldn't be necessary for basic use cases, but see the Xdebug settings documentation for available settings.
You can use your local version of Codex instead of the one bundled with MediaWiki. This is useful when testing how changes in Codex affect Codex-based features in MediaWiki.
-
Clone the Codex repository and build Codex, if you haven't done this already:
cd ../ git clone https://gerrit.wikimedia.org/r/design/codex cd codex npm run build-all
-
If your clone of the Codex repository is outside of the MediaWiki directory (this is common), add the following to your
docker-compose.override.yml. Replace~/git/codexwith the path to your Codex clone.services: mediawiki: volumes: - ~/git/codex:/var/www/html/w/codex:cached
-
To apply the change to
docker-compose.override.yml, you have to recreate the environment:docker compose down docker compose up -d
-
Enable Codex development mode by adding the following to the bottom of
LocalSettings.php:$wgCodexDevelopmentDir = MW_INSTALL_PATH . '/codex';
To disable Codex development mode and use the regular version of Codex, delete or comment out this line.
-
Every time you make a change to your local copy of Codex (or download a Gerrit change), you have to rerun Codex's build process for these changes to take effect. To do this, run
npm run build-allin the Codex directory.
Note: if your local changes only affect .vue or .ts files, you can run npm run quick-build
instead of the full build, which will be much faster. This won't rebuild TypeScript definitions or
design token values, icons or i18n messages but can be handy for re-building small changes. If it
is the first time you build Codex locally, running npm run build-all is still necessary.
Stop the environment, perhaps to reduce the load when working on something
else. This preserves the containers, to be restarted later quickly with
the docker compose up -d command.
docker compose stopDestroy and re-create the environment. This will delete the containers, including any logs, caches, and other modifications you may have made via the shell.
docker compose down
docker compose up -dTo empty the wiki database and re-install it:
- Remove or rename the
LocalSettings.phpfile. - Delete the
cache/sqlitedirectory. - Re-run the "Install MediaWiki database" command.
You can now restore or copy over any modifications you had in your previous LocalSettings.php file.
And if you have any additional extensions installed that required a database table, then also run:
docker compose exec mediawiki php maintenance/run.php update.
If you suspect a change is not applying due to caching, start by hard refreshing the browser.
If that doesn't work, you can narrow it down by disabling various server-side
caching layers in LocalSettings.php, as follows:
$wgMainCacheType = CACHE_NONE;
$wgMessageCacheType = CACHE_NONE;
$wgParserCacheType = CACHE_NONE;
$wgResourceLoaderMaxage = [
'versioned' => 0,
'unversioned' => 0
];The default settings of MediaWiki are such that caching is smart and changes propagate immediately. Using the above settings may slow down your wiki significantly. Especially on macOS and Windows, where Docker Desktop uses a VM internally and thus has longer file access times.
See Manual:Caching on mediawiki.org for more information.
Older versions of Xdebug used port 9000, which could conflict with php-fpm
running on the host. This document used to recommend a workaround of telling
your IDE to listen on a different port (e.g., 9009) and setting
XDEBUG_CONFIG=remote_port=9009 in your .env.
Xdebug 3.x now uses the client_port value, which defaults to 9003. This
should no longer conflict with local php-fpm installations, but you may need
to change the settings in your IDE or debugger.
The image uses host.docker.internal as the client_host value which
should allow Xdebug work for Docker for Mac/Windows.
On Linux, you need to create a docker-compose.override.yml file with the following
contents:
services:
mediawiki:
extra_hosts:
- "host.docker.internal:host-gateway"With the latest version of Docker on Linux hosts, this should work
transparently as long as you're using the recommended
docker-compose.override.yml. If it doesn't, first check docker version to
make sure you're running Docker 20.10.2 or above, and docker compose version
to make sure it's 1.27.4 or above.
If Xdebug still doesn't work, try specifying the hostname or IP address of your
host. The IP address works more reliably. You can obtain it by running e.g.
ip -4 addr show docker0 and copying the IP address into the config in .env,
like XDEBUG_CONFIG=remote_host=172.17.0.1
Switching on the remote log for Xdebug comes at a performance cost so only
use it while troubleshooting. You can enable it like so: XDEBUG_CONFIG=remote_log=/tmp/xdebug.log
See if you're able to run any docker commands to start with. Try running
docker container ls, which should also throw a permission error. If not,
go through the following steps to get access to the socket that the docker
client uses to talk to the daemon.
sudo usermod -aG docker $USER
And then relogin (or newgrp docker) to re-login with the new group membership.
The environment's working directory has recently changed to /var/www/html/w.
Reconfigure this in your LocalSettings.php by ensuring that the following
values are set correctly:
$wgScriptPath = '/w';
$wgSQLiteDataDir = "/var/www/html/w/cache/sqlite";The permissions with the cache/sqlite directory have to be set manually on Windows:
docker compose exec mediawiki chmod -R o+rwx cache/sqliteMake sure you have the MW_DOCKER_UID and MW_DOCKER_GID set in your .env file (instructions above).