Difference between revisions of "Pymediawikidocker"

From BITPlan Wiki
Jump to navigation Jump to search
 
(221 intermediate revisions by the same user not shown)
Line 3: Line 3:
 
{{OsProject
 
{{OsProject
 
|id=pymediawikidocker
 
|id=pymediawikidocker
 +
|state=active
 
|owner=WolfgangFahl
 
|owner=WolfgangFahl
|title=Python controlled mediawiki docker image installation
+
|title=pymediawikidocker
 
|url=https://github.com/WolfgangFahl/pymediawikidocker
 
|url=https://github.com/WolfgangFahl/pymediawikidocker
|version=0.0.13
+
|version=0.22.1
|date=2021-06-23
+
|description=Python controlled mediawiki docker image installation
 +
|date=2025-11-19
 +
|since=2021-06-08
 
|storemode=property
 
|storemode=property
 
}}
 
}}
  
 +
=tickets=
 
= Motivation =
 
= Motivation =
 
[https://hub.docker.com/_/mediawiki Official Mediawiki docker images] are available for the different Mediawiki versions.
 
[https://hub.docker.com/_/mediawiki Official Mediawiki docker images] are available for the different Mediawiki versions.
  
These images need additional infrastructure to create useable Mediawiki environments. The goal of this project is to semi-automatically create
+
These images need additional infrastructure to create useable Mediawiki environments.
 +
<source lang='bash'>
 +
docker run --name local-mediawiki -p 8080:80 -d mediawiki
 +
</source>
 +
 
 +
will only install part of a LAMP environment to install Mediawiki and make it available via http://localhost:8080/. E.g. the database needs to be installed separately.
 +
 +
The goal of this project is to semi-automatically create
 
such environments and test the functionality. Python was choosen as a development environment for the [https://github.com/WolfgangFahl/pymediawikidocker/blob/main/requirements.txt libraries that are needed and available] to perform the tasks:
 
such environments and test the functionality. Python was choosen as a development environment for the [https://github.com/WolfgangFahl/pymediawikidocker/blob/main/requirements.txt libraries that are needed and available] to perform the tasks:
 
* https://github.com/gabrieldemarmiesse/python-on-whales - to automate the docker configuration and start
 
* https://github.com/gabrieldemarmiesse/python-on-whales - to automate the docker configuration and start
Line 23: Line 34:
 
= How it works =
 
= How it works =
 
The core concept is a "MediawikiCluster" that is a set of docker applications that run MediaWiki instances with varying versions of MediaWiki and the underlying database.
 
The core concept is a "MediawikiCluster" that is a set of docker applications that run MediaWiki instances with varying versions of MediaWiki and the underlying database.
 +
The graphic belows shows the docker containers which are created for different versions of Mediawiki
  
 
<graphviz>
 
<graphviz>
 +
// generated by /Users/wf/py-workspace/pymediawikidocker/tests/test_install.py on 2025-11-18T11:42:35.172993
 
digraph mwcluster {
 
digraph mwcluster {
   mw127 [ label="Mediawiki 1.27.7 \nport 9080" ]
+
   rankdir="RL"
   mw131 [ label="Mediawiki 1.31.14\nport 9081" ]
+
   mew0 [ label="mw-135-mw\nMediaWiki 1.35.13\nport 9080" ]
  mw135 [ label="Mediawiki 1.35.2 \nport 9082" ]
+
   mdb0 [ label="mw-135-db\nMariaDB 11.4\nport 9306" ]
   mdb1  [ label="MariaDB 10.5\nport 9306" ]
+
   subgraph cluster_0{
  mdb2  [ label="MariaDB 10.5\nport 9307" ]
+
     label="mw-135"
  mdb3  [ label="MariaDB 10.5\nport 9308" ]
+
    mew0->mdb0
   subgraph cluster_1 {
 
     label="mw1_27_7"
 
    mw127 -> mdb1
 
 
   }
 
   }
   subgraph cluster_2 {
+
  mew1 [ label="mw-139-mw\nMediaWiki 1.39.15\nport 9081" ]
     label="mw1_31_14"
+
  mdb1 [ label="mw-139-db\nMariaDB 11.4\nport 9307" ]
     mw131 -> mdb2
+
   subgraph cluster_1{
 +
     label="mw-139"
 +
     mew1->mdb1
 
   }
 
   }
   subgraph cluster_3 {
+
  mew2 [ label="mw-143-mw\nMediaWiki 1.43.5\nport 9082" ]
     label="mw1_35_2"
+
  mdb2 [ label="mw-143-db\nMariaDB 11.4\nport 9308" ]
     mw135 -> mdb3
+
  subgraph cluster_2{
 +
    label="mw-143"
 +
    mew2->mdb2
 +
  }
 +
  mew3 [ label="mw-144-mw\nMediaWiki 1.44.2\nport 9083" ]
 +
  mdb3 [ label="mw-144-db\nMariaDB 11.4\nport 9309" ]
 +
   subgraph cluster_3{
 +
     label="mw-144"
 +
     mew3->mdb3
 
   }
 
   }
 
}
 
}
Line 50: Line 70:
 
== Prerequisites ==
 
== Prerequisites ==
 
Docker on Windows, Mac or Linux suppporting "docker compose up" using the Docker composer V2 CLI
 
Docker on Windows, Mac or Linux suppporting "docker compose up" using the Docker composer V2 CLI
 +
=== Ubuntu 24.04 LTS installation ===
 +
see https://docs.docker.com/engine/install/ubuntu/ on how to setup the docker repository
 +
 +
<source lang='bash' highlight='1-12,15,17-18'>
 +
sudo apt-get install ca-certificates curl gnupg
 +
sudo install -m 0755 -d /etc/apt/keyrings
 +
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
 +
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
 +
sudo chmod a+r /etc/apt/keyrings/docker.gpg
 +
echo \
 +
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
 +
  https://download.docker.com/linux/ubuntu noble stable" | \
 +
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 +
sudo apt-get update
 +
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
 +
docker --version
 +
Docker version 29.0.2, build 8108357
 +
# Create the docker group if it does not exist
 +
sudo groupadd docker 2>/dev/null || true
 +
# Add your current user to the docker group
 +
sudo usermod -aG docker "$USER"
 +
docker run hello-world
 +
Hello from Docker!
 +
</source>
 +
The <nowiki>"Hello from Docker"</nowiki> message shows that your installation appears to be working correctly.
 +
 
=== Compatibility test ===
 
=== Compatibility test ===
 
<source lang='bash' highlight='1'>
 
<source lang='bash' highlight='1'>
 +
# test on a Mac OS machine 2022-07-02
 +
docker 2>&1 | grep compose
 +
  compose*    Docker Compose (Docker Inc., v2.4.1)
 +
# test on an Ubuntu machine 2023-04-07
 
docker 2>&1 | grep compose
 
docker 2>&1 | grep compose
  compose*    Docker Compose (Docker Inc., 2.0.0-beta.1)
+
compose*    Docker Compose (Docker Inc., v2.17.2)
 +
</source>
 +
 
 +
=== Test of docker compose ===
 +
<source lang='bash' highlight='1'>
 +
No LSB modules are available.
 +
Distributor ID: Ubuntu
 +
Description: Ubuntu 24.04.3 LTS
 +
Release: 24.04
 +
Codename: noble
 
</source>
 
</source>
=== Installation of Docker Compose V2 CLI ===
 
see https://github.com/WolfgangFahl/pymediawikidocker/blob/main/scripts/install
 
<source lang='bash'>
 
  docker --version
 
  cliplugindir=$HOME/.docker/cli-plugins
 
  mkdir -p $cliplugindir
 
  cd $cliplugindir
 
  wget https://github.com/docker/compose-cli/releases/download/v2.0.0-beta.3/docker-compose-linux-amd64
 
  mv  docker-compose-linux-amd64 docker-compose
 
  
  chmod +x docker-compose
+
==== docker compose (not docker-compose) ====
# check result
+
<source lang='bash' highlight='1'>
  ls -l
+
docker compose version
  docker
+
Docker Compose version v2.40.3
  docker  2>&1 | grep compose
 
 
</source>
 
</source>
  
== via pip ==
+
== pymediawikidocker installation via pip ==
 
<source lang='bash'>
 
<source lang='bash'>
 
pip install pymediawikidocker
 
pip install pymediawikidocker
Line 83: Line 132:
 
# alternatively if your pip is not a python3 pip
 
# alternatively if your pip is not a python3 pip
 
pip3 install pymediawikidocker -U
 
pip3 install pymediawikidocker -U
 +
</source>
 +
=== check version ===
 +
<source lang='bash' highlight='1'>
 +
mwcluster -V
 +
pymediawikidocker 0.22.1 2025-11-18
 
</source>
 
</source>
  
 
= Usage =
 
= Usage =
<source lang='bash'>
+
<source lang='bash' highlight='1'>
usage: mwcluster [-h] [-d] [-V] [-vl [VERSIONS ...]] [-wl [WIKIIDLIST ...]]
+
usage: mwcluster [-h] [-a] [-d] [--debugLocalPath DEBUGLOCALPATH]
                 [-u USER] [-p PASSWORD] [-bp BASEPORT] [-sp SQLPORT]
+
                [--debugPort DEBUGPORT] [--debugRemotePath DEBUGREMOTEPATH]
                 [-smw SMWVERSION] [-mv MARIADBVERSION] [-f]
+
                [--debugServer DEBUGSERVER] [-f] [-q] [-v] [-V]
 +
                [--article_path ARTICLE_PATH] [-bm] [-cn CONTAINER_NAME]
 +
                [-dcn DB_CONTAINER_NAME] [-el [EXTENSIONNAMELIST ...]]
 +
                [-ej EXTENSIONJSONFILE] [--forceRebuild] [-fu] [--host HOST]
 +
                [-dp DOCKER_PATH] [--lenient] [--logo LOGO]
 +
                [-mv MARIADBVERSION] [--mysqlRootPassword MYSQLROOTPASSWORD]
 +
                 [--mysqlPassword MYSQLPASSWORD] [-rp] [-p PASSWORD]
 +
                [-pl PASSWORD_LENGTH] [--prefix PREFIX] [--prot PROT]
 +
                [--script_path SCRIPT_PATH] [--url URL] [-sp SQL_PORT]
 +
                 [-smw SMW_VERSION] [-u USER] [--uid UID] [--gid GID]
 +
                [-bp BASE_PORT] [-vl [VERSIONS ...]] [--create] [--down]
 +
                [--check] [--list]
  
mwcluster Created by Wolfgang Fahl on 2021-06-21. Copyright 2021 Wolfgang
+
Python controlled (semantic) mediawiki docker application cluster installation
Fahl. All rights reserved. Licensed under the Apache License 2.0
 
http://www.apache.org/licenses/LICENSE-2.0 Distributed on an "AS IS" basis
 
without warranties or conditions of any kind, either express or implied.
 
  
optional arguments:
+
options:
 
   -h, --help            show this help message and exit
 
   -h, --help            show this help message and exit
   -d, --debug          set debug level [default: False]
+
  -a, --about          show version info and open documentation
   -V, --version        show program s version number and exit
+
   -d, --debug          enable debug output
   -vl [VERSIONS ...], --versionList [VERSIONS ...]
+
  --debugLocalPath DEBUGLOCALPATH
                         mediawiki versions to create docker applications for
+
                        remote debug Server path mapping - localPath - path on
                        [default: ['1.27.7', '1.31.14', '1.35.2', '1.36.0']]
+
                        machine where python runs
   -wl [WIKIIDLIST ...], --wikiIdList [WIKIIDLIST ...]
+
  --debugPort DEBUGPORT
                         list of wikiIDs to be used for for py-3rdparty-
+
                        remote debug Port [default: 5678]
                         mediawiki wikiuser quick access (default: None)
+
  --debugRemotePath DEBUGREMOTEPATH
   -u USER, --user USER  set username of initial user with sysop rights
+
                        remote debug Server path mapping - remotePath - path
                        [default: Sysop]
+
                        on debug server
 +
  --debugServer DEBUGSERVER
 +
                        remote debug Server
 +
  -f, --force          force overwrite or unsafe actions
 +
  -q, --quiet          suppress all output
 +
  -v, --verbose        increase output verbosity
 +
   -V, --version        show program's version number and exit
 +
   --article_path ARTICLE_PATH
 +
                        change to any article_path you might need to set
 +
                        [default: ]
 +
  -bm, --bind-mount    use bind mounts instead of volumes
 +
  -cn CONTAINER_NAME, --container_name CONTAINER_NAME
 +
                        set container name (only valid and recommended for
 +
                        single version call)
 +
  -dcn DB_CONTAINER_NAME, --db_container_name DB_CONTAINER_NAME
 +
                        set database container name [default: None]
 +
  -el [EXTENSIONNAMELIST ...], --extensionList [EXTENSIONNAMELIST ...]
 +
                         list of extensions to be installed [default: ['Admin
 +
                        Links', 'Header Tabs', 'ParserFunctions',
 +
                        'SyntaxHighlight', 'Variables']]
 +
   -ej EXTENSIONJSONFILE, --extensionJson EXTENSIONJSONFILE
 +
                        additional extension descriptions default: [default:
 +
                        None]
 +
  --forceRebuild        force rebuilding [default: False]
 +
  -fu, --force_user    force overwrite of wikiuser
 +
  --host HOST          the host to serve / listen from [default:
 +
                        noah.bitplan.com]
 +
  -dp DOCKER_PATH, --docker_path DOCKER_PATH
 +
                        the base directory to store docker and jinja template
 +
                        files [default: /home/wf/.pymediawikidocker]
 +
  --lenient            do not throw error on wikiuser difference
 +
  --logo LOGO          set Logo [default:
 +
                        $wgResourceBasePath/resources/assets/wiki.png]
 +
  -mv MARIADBVERSION, --mariaDBVersion MARIADBVERSION
 +
                         mariaDB Version to be installed [default: 11.4]
 +
  --mysqlRootPassword MYSQLROOTPASSWORD
 +
                         set sql root Password [default: None] - random
 +
                        password if None
 +
   --mysqlPassword MYSQLPASSWORD
 +
                        set sql user Password [default: None] - random
 +
                        password if None
 +
  -rp, --random_password
 +
                        create random password and create wikiuser while at it
 
   -p PASSWORD, --password PASSWORD
 
   -p PASSWORD, --password PASSWORD
 
                         set password for initial user [default: sysop-1234!]
 
                         set password for initial user [default: sysop-1234!]
   -bp BASEPORT, --basePort BASEPORT
+
   -pl PASSWORD_LENGTH, --password_length PASSWORD_LENGTH
                         set how base html port 80 to be exposed - incrementing
+
                         set the password length for random passwords[default:
                         by one for each version [default: 9080]
+
                        15]
   -sp SQLPORT, --sqlBasePort SQLPORT
+
  --prefix PREFIX      the container name prefix to use [default: mw]
 +
  --prot PROT          change to https in case [default: http]
 +
  --script_path SCRIPT_PATH
 +
                        change to any script_path you might need to set
 +
                        [default: ]
 +
  --url URL            will set prot host,script_path, and optionally port
 +
                         based on the url given [default: None]
 +
   -sp SQL_PORT, --sql_base_port SQL_PORT
 
                         set base mySql port 3306 to be exposed - incrementing
 
                         set base mySql port 3306 to be exposed - incrementing
 
                         by one for each version [default: 9306]
 
                         by one for each version [default: 9306]
   -smw SMWVERSION, --smwVersion SMWVERSION
+
   -smw SMW_VERSION, --smw_version SMW_VERSION
 
                         set SemanticMediaWiki Version to be installed default
 
                         set SemanticMediaWiki Version to be installed default
                         is None - no installation of SMW (default: None)
+
                         is None - no installation of SMW
   -mv MARIADBVERSION, --mariaDBVersion MARIADBVERSION
+
  -u USER, --user USER  set username of initial user with sysop rights
                         mariaDB Version to be installed [default: 10.5]
+
                        [default: Sysop]
   -f, --forceRebuild    shall the applications rebuild be forced (with stop
+
  --uid UID            User ID (default: 33 for www-data)
                         and remove of existing containers) (default: False)
+
   --gid GID            Group ID (default: 33 for www-data)
 +
  -bp BASE_PORT, --base_port BASE_PORT
 +
                         set how base html port 80 to be exposed - incrementing
 +
                        by one for each version [default: 9080]
 +
   -vl [VERSIONS ...], --version_list [VERSIONS ...]
 +
                        mediawiki versions to create docker applications for
 +
                         [default: ['1.35.13', '1.39.15', '1.43.5', '1.44.2']]
 +
  --create
 +
  --down
 +
  --check
 +
  --list
 
</source>
 
</source>
  
 
= Examples =
 
= Examples =
== Default settings ==
+
{{Link|target=Pymediawikidocker_example_2022-10-26}}
Starts a cluster with versions 1.27.7, 1.31.14 and 1.35.2 using MariaDB 10.5
+
== create with default settings ==
 +
Starts a cluster with versions 1.35.13,1.39.13, 1.43.2, and 1.44.0 using MariaDB 10.11.
 +
Essentially this is automatic generation of the configuration with a docker compose up for all versions asked for.
 +
<source lang='bash' highlight='2'>
 +
# force new user and random password
 +
mwcluster --create -f -fu -rp
 +
starting mw-135 1.35.13 docker application ...
 +
...
 +
starting mw-139 1.39.15 docker application ...
 +
...
 +
starting mw-143 1.43.5 docker application ...
 +
...
 +
starting mw-144 1.44.2 docker application ...
 +
✔ Network mw-144_default    Created                                      0.1s
 +
✔ Volume mw-144_mysql-data  Created                                      0.0s
 +
✔ Volume mw-144_wiki-sites  Created                                      0.0s
 +
✔ Volume mw-144_wiki-etc    Created                                      0.0s
 +
✔ Volume mw-144_wiki-html  Created                                      0.0s
 +
✔ Container mw-144-db      Started                                      5.4s
 +
✔ Container mw-144-mw      Started                                      4.1s
 +
mw-144-mw 🟢 started in 0.01s
 +
mw-144-db 🟢 started in 0.01s
 +
Initializing MediaWiki SQL tables ...
 +
...
 +
Starting periodic command scheduler: cron.
 +
MediaWiki setup complete!
 +
MediaWiki mw-144 is ready at ...
 +
</source>
 +
Mediawiki applications will be available at
 +
# {{mwlink|port=9080}}
 +
# {{mwlink|port=9081}}
 +
# {{mwlink|port=9082}}
 +
# {{mwlink|port=9083}}
 +
 
 +
=== check ===
 +
<source lang='bash' highlight='1'>
 +
mwcluster --check -f
 +
1:checking 1.35.13 ...
 +
mediawiki webserver container mw-135-mw:✅
 +
mediawiki database container mw-135-db:✅
 +
port binding 9080= expected  port 9080?:✅
 +
Checking http://noah.bitplan.com:9080/index.php?title=Special:Version ...
 +
Special Version accessible ...:✅
 +
Mediawiki Version 1.35.13= expected  1.35.13?:✅
 +
Maria DB Version 11.4 fitting expected 11.4?:✅
 +
2:checking 1.39.15 ...
 +
mediawiki webserver container mw-139-mw:✅
 +
mediawiki database container mw-139-db:✅
 +
port binding 9081= expected  port 9081?:✅
 +
Checking http://noah.bitplan.com:9081/index.php?title=Special:Version ...
 +
Special Version accessible ...:✅
 +
Mediawiki Version 1.39.15= expected  1.39.15?:✅
 +
Maria DB Version 11.4 fitting expected 11.4?:✅
 +
3:checking 1.43.5 ...
 +
mediawiki webserver container mw-143-mw:✅
 +
mediawiki database container mw-143-db:✅
 +
port binding 9082= expected  port 9082?:✅
 +
Checking http://noah.bitplan.com:9082/index.php?title=Special:Version ...
 +
Special Version accessible ...:✅
 +
Mediawiki Version 1.43.5= expected  1.43.5?:✅
 +
Maria DB Version 11.4 fitting expected 11.4?:✅
 +
4:checking 1.44.2 ...
 +
mediawiki webserver container mw-144-mw:✅
 +
mediawiki database container mw-144-db:✅
 +
port binding 9083= expected  port 9083?:✅
 +
Checking http://noah.bitplan.com:9083/index.php?title=Special:Version ...
 +
Special Version accessible ...:✅
 +
Mediawiki Version 1.44.2= expected  1.44.2?:✅
 +
Maria DB Version 11.4 fitting expected 11.4?:✅
 +
</source>
 +
 
 +
== down ==
 
<source lang='bash' highlight='1'>
 
<source lang='bash' highlight='1'>
mwcluster -f
+
mwcluster --down -f
starting mediawiki 1.27.7 docker application ...
+
running docker compose down for mw-135 1.35.13 docker application ...
stopping and removing container mw1_27_7_db_1
+
[+] Running 7/7
stopping and removing container mw1_27_7_mw_1
+
  ✔ Container mw-135-mw      Removed                                      1.2s
[+] Building 0.5s (12/12) FINISHED                                                                                   
+
  ✔ Container mw-135-db      Removed                                      0.4s
  => [internal] load build definition from Dockerfile                                                              0.0s
+
  ✔ Volume mw-135_mysql-data Removed                                      0.0s  
=> => transferring dockerfile: 1.10kB                                                                            0.0s
+
  ✔ Volume mw-135_wiki-etc    Removed                                      0.0s  
  => [internal] load .dockerignore                                                                                0.0s
+
  ✔ Volume mw-135_wiki-sites Removed                                      0.0s  
  => => transferring context: 2B                                                                                  0.0s
+
  ✔ Volume mw-135_wiki-html   Removed                                      0.4s
  => [internal] load metadata for docker.io/library/mediawiki:1.27.7                                              0.0s
+
  ✔ Network mw-135_default    Removed                                      0.2s  
  => [1/7] FROM docker.io/library/mediawiki:1.27.7                                                                0.0s
+
running docker compose down for mw-139 1.39.15 docker application ...
  => [internal] load build context                                                                                0.0s
+
[+] Running 7/7
  => => transferring context: 61.98kB                                                                              0.0s
+
  ✔ Container mw-139-mw      Removed                                      1.2s
  => CACHED [2/7] RUN apt-get -y update &&    apt-get -y --no-install-recommends --fix-missing install    maria  0.0s
+
  ✔ Container mw-139-db      Removed                                      0.5s
=> [3/7] COPY LocalSettings.php /var/www/html                                                                   0.0s
+
  ✔ Volume mw-139_wiki-sites Removed                                      0.0s  
  => [4/7] COPY phpinfo.php /var/www/html                                                                          0.0s
+
  ✔ Volume mw-139_wiki-etc    Removed                                      0.0s  
=> [5/7] COPY wiki.sql /tmp                                                                                      0.0s
+
  ✔ Volume mw-139_wiki-html  Removed                                      0.5s
=> [6/7] COPY initdb.sh /tmp                                                                                    0.0s
+
  ✔ Volume mw-139_mysql-data Removed                                      0.5s
=> [7/7] RUN chmod +x /tmp/initdb.sh                                                                            0.2s
+
  ✔ Network mw-139_default    Removed                                      0.2s
=> exporting to image                                                                                            0.1s
+
running docker compose down for mw-143 1.43.5 docker application ...
=> => exporting layers                                                                                          0.0s
+
[+] Running 7/7
=> => writing image sha256:acee6c878b9a8dde738b38c8d73812ae92b175bd1ddefe1f2493d26af7e7bbdb                      0.0s
+
  ✔ Container mw-143-mw      Removed                                      1.4s
=> => naming to docker.io/library/mw1_27_7_mw                                                                    0.0s
+
  ✔ Container mw-143-db      Removed                                      0.6s
Initializing MediaWiki SQL tables
+
  ✔ Volume mw-143_wiki-etc    Removed                                      0.0s  
Trying DB-Connection to wiki on localhost port 9306 with user wikiuser with max 6 tries and 10s timeout per try - initial sleep 2.5s
+
  ✔ Volume mw-143_wiki-html  Removed                                      0.6s
Connection to wiki on localhost with user wikiuser established database returns: ('wiki',)
+
✔ Volume mw-143_wiki-sites Removed                                      0.6s
starting mediawiki 1.31.14 docker application ...
+
  ✔ Volume mw-143_mysql-data Removed                                      0.6s
stopping and removing container mw1_31_14_db_1
+
  ✔ Network mw-143_default    Removed                                      0.2s
stopping and removing container mw1_31_14_mw_1
+
running docker compose down for mw-144 1.44.2 docker application ...
[+] Building 0.5s (12/12) FINISHED                                                                                   
+
[+] Running 7/7
  => [internal] load build definition from Dockerfile                                                              0.0s
+
  ✔ Container mw-144-mw      Removed                                      1.4s
=> => transferring dockerfile: 1.10kB                                                                            0.0s
+
  ✔ Container mw-144-db      Removed                                      0.5s
  => [internal] load .dockerignore                                                                                0.0s
+
  ✔ Volume mw-144_wiki-html   Removed                                      0.6s
  => => transferring context: 2B                                                                                  0.0s
+
  ✔ Volume mw-144_wiki-sites Removed                                      0.0s  
  => [internal] load metadata for docker.io/library/mediawiki:1.31.14                                              0.0s
+
  ✔ Volume mw-144_mysql-data Removed                                      0.6s
  => [1/7] FROM docker.io/library/mediawiki:1.31.14                                                                0.0s
+
  ✔ Volume mw-144_wiki-etc    Removed                                      0.6s
  => [internal] load build context                                                                                0.0s
+
  ✔ Network mw-144_default    Removed                                      0.1s
  => => transferring context: 72.20kB                                                                              0.0s
 
=> CACHED [2/7] RUN apt-get -y update &&    apt-get -y --no-install-recommends --fix-missing install    maria 0.0s
 
  => [3/7] COPY LocalSettings.php /var/www/html                                                                    0.0s
 
=> [4/7] COPY phpinfo.php /var/www/html                                                                          0.0s
 
=> [5/7] COPY wiki.sql /tmp                                                                                      0.0s
 
=> [6/7] COPY initdb.sh /tmp                                                                                    0.0s
 
=> [7/7] RUN chmod +x /tmp/initdb.sh                                                                            0.2s
 
  => exporting to image                                                                                            0.1s
 
  => => exporting layers                                                                                          0.0s
 
  => => writing image sha256:a478ee76ef95f5c6eafc88828058a1d67f4033fcb110abc1b0085729d682c613                      0.0s
 
  => => naming to docker.io/library/mw1_31_14_mw                                                                  0.0s
 
Initializing MediaWiki SQL tables
 
Trying DB-Connection to wiki on localhost port 9307 with user wikiuser with max 6 tries and 10s timeout per try - initial sleep 2.5s
 
Connection to wiki on localhost with user wikiuser established database returns: ('wiki',)
 
starting mediawiki 1.35.2 docker application ...
 
stopping and removing container mw1_35_2_db_1
 
stopping and removing container mw1_35_2_mw_1
 
[+] Building 0.5s (12/12) FINISHED                                                                                   
 
  => [internal] load build definition from Dockerfile                                                              0.0s
 
  => => transferring dockerfile: 1.10kB                                                                            0.0s
 
  => [internal] load .dockerignore                                                                                0.0s
 
  => => transferring context: 2B                                                                                  0.0s
 
=> [internal] load metadata for docker.io/library/mediawiki:1.35.2                                               0.0s
 
=> [1/7] FROM docker.io/library/mediawiki:1.35.2                                                                0.0s
 
=> [internal] load build context                                                                                0.0s
 
  => => transferring context: 69.71kB                                                                              0.0s
 
  => CACHED [2/7] RUN apt-get -y update &&    apt-get -y --no-install-recommends --fix-missing install    maria  0.0s
 
  => [3/7] COPY LocalSettings.php /var/www/html                                                                   0.0s
 
  => [4/7] COPY phpinfo.php /var/www/html                                                                          0.0s
 
  => [5/7] COPY wiki.sql /tmp                                                                                      0.0s
 
  => [6/7] COPY initdb.sh /tmp                                                                                    0.0s
 
  => [7/7] RUN chmod +x /tmp/initdb.sh                                                                            0.2s
 
  => exporting to image                                                                                            0.1s
 
  => => exporting layers                                                                                          0.1s
 
=> => writing image sha256:a90cfd37ad0fc08329db5b499437f2539364c6b9d0c4a40cfbadcb9b51debd29                      0.0s
 
=> => naming to docker.io/library/mw1_35_2_mw                                                                    0.0s
 
Initializing MediaWiki SQL tables
 
Trying DB-Connection to wiki on localhost port 9308 with user wikiuser with max 6 tries and 10s timeout per try - initial sleep 2.5s
 
Connection to wiki on localhost with user wikiuser established database returns: ('wiki',)
 
 
</source>
 
</source>
Mediawiki applications will be available at
 
# http://localhost:9080
 
# http://localhost:9081
 
# http://localhost:9082
 
  
== Single 1.27.5 ==
+
== Single 1.39.15 LTS ==
<source lang='bash' highlight="1">
+
<source lang='bash' highlight="2">
python mwdocker/mwcluster.py --forceRebuild --versionList 1.27.5 --basePort 8480 --sqlBasePort 10306 --mariaDBVersion 10.5
+
# python mwdocker/mwcluster.py can be used instead of mwcluster if you test from your locally cloned environment
 +
mwcluster \
 +
  --create \
 +
  --forceRebuild\
 +
  --version_list 1.39.15\
 +
  --base_port 8480\
 +
  --sql_base_port 10308\
 +
  --mariaDBVersion 11.8\
 +
  --container_name mw139lts\
 +
  --logo https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Bigsmile_smiley_yellow_simple.svg/128px-Bigsmile_smiley_yellow_simple.svg.png
 +
creating docker compose applications for mediawiki versions ['1.39.10']
 +
starting mw139lts 1.39.15 docker application ...  
 
</source>
 
</source>
 
Mediawiki application will be available at
 
Mediawiki application will be available at
# http://localhost:8480
+
# {{Mwlink|port=8480}}
== Semantic MediaWiki cluster with WikiUser creation ==
+
[[File:pyMediaWikiDocker-ExampleMW135WithLogo.png|600px]]
<source lang='bash' highlight="1">
+
 
mwcluster -f -smw 3.2.3 -wl mw27test mw31test mw35test mw36test
+
== Single 1.35 with Semantic Mediawiki - deprecated ==
creating docker applications for mediawiki versions ['1.27.7', '1.31.14', '1.35.2', '1.36.0']
+
There might be more current versions of SMW available see https://www.semantic-mediawiki.org/wiki/Semantic_MediaWiki_Version_History and adapt
 +
the example below if you see the need to do so.
 +
=== Version 4.1.2 ===
 +
<source lang='bash' highlight='1-9'>
 +
mwcluster \
 +
  --create \
 +
  --container_name smw4\
 +
  --forceRebuild\
 +
  --version_list 1.35.13\
 +
  --base_port 8481\
 +
  --sql_base_port 10307\
 +
  --mariaDBVersion 10.11\
 +
  --smw_version 4.1.2
 +
creating docker compose applications for mediawiki versions ['1.35.13']
 +
starting smw4 1.35.13 docker application ...
 
</source>
 
</source>
  
 +
==== debug docker compose results - ports and other configuration parts ====
 +
<source lang='bash' highlight='1-2,4'>
 +
cd ~/.pymediawikidocker/smw4
 +
docker-compose up
 +
# in another terminal session:
 +
docker ps
 +
CONTAINER ID  IMAGE                  COMMAND                  CREATED              STATUS        PORTS                    NAMES
 +
87a795d444eb  smw4_mw                "docker-php-entrypoi…"  About a minute ago  Up 7 seconds  0.0.0.0:8481->80/tcp      smw4-mw
 +
7ca3a0434d31  mariadb:10.11          "docker-entrypoint.s…"  About a minute ago  Up 7 seconds  0.0.0.0:10307->3306/tcp  smw4-db
 +
</source>
 +
==== open bash in docker container ====
 +
<source lang='bash' highlight='1'>
 +
docker exec -it smw4-mw /bin/bash
 +
root@87a795d444eb:/var/www/html#
 +
</source>
 +
'''check installExtensions.sh script'''
 +
<source lang='bash' highlight='1'>
 +
cat /root/installExtensions.sh
 +
#!/bin/bash
 +
# install the required extensions
 +
# WF 2021-06-23
 +
cd /var/www/html/extensions
 +
 +
# Admin Links
 +
# https://www.mediawiki.org/wiki/Extension:Admin_Links
 +
git clone https://github.com/wikimedia/mediawiki-extensions-AdminLinks --single-branch --branch REL1_35 AdminLinks
 +
 +
# Header Tabs
 +
# https://www.mediawiki.org/wiki/Extension:Header_Tabs
 +
git clone https://github.com/wikimedia/mediawiki-extensions-HeaderTabs --single-branch --branch REL1_35 HeaderTabs
 +
 +
# SyntaxHighlight
 +
# https://www.mediawiki.org/wiki/Extension:SyntaxHighlight
 +
# no installation script command specified
 +
 +
# Variables
 +
# https://www.mediawiki.org/wiki/Extension:Variables
 +
git clone https://github.com/wikimedia/mediawiki-extensions-Variables --single-branch --branch REL1_35 Variables
 +
</source>
 +
'''check Semantic MediaWiki settings in LocalSettings.php'''
 +
<source lang='bash' highlight='1'>
 +
grep -i semantic LocalSettings.php
 +
# enable Support for Semantic MediaWiki
 +
# see https://www.semantic-mediawiki.org/wiki/Help:EnableSemantics
 +
# Version of SemanticMediaWiki at install time: 4.1.1
 +
wfLoadExtension( 'SemanticMediaWiki' );
 +
enableSemantics();
 +
# https://www.semantic-mediawiki.org/wiki/Help:$smwgQMaxInlineLimit
 +
</source>
 +
=== SMW Version 3.2.3 ===
 +
==== Installation ====
 +
<source lang='bash' highlight='1-10'>
 +
mwcluster \
 +
  --create \
 +
  --container_name smw3\
 +
  --forceRebuild\
 +
  --version_list 1.35.13\
 +
  --base_port 8482\
 +
  --sql_base_port 10308\
 +
  --mariaDBVersion 10.11\
 +
  --logo https://www.semantic-mediawiki.org/w/images/4/4e/SMW_logo_180.png\
 +
  --smw_version 3.2.3
 +
</source>
 +
 +
==== Check ====
 +
<source lang='bash' highlight='1'>
 +
mwcluster --check --container_name smw3 --version_list 1.35.13
 +
</source>
 +
 +
==== Down ====
 +
<source lang='bash' highlight='1'>
 +
mwcluster --down --container_name smw3 --version_list 1.35.13 -f
 +
running docker compose down for mediawiki versions ['1.35.13']
 +
running docker compose down for smw3 1.35.10 docker application ...
 +
[+] Running 3/3
 +
⠿ Volume smw3_wiki-etc    Removed                                0.0s
 +
⠿ Volume smw3_mysql-data  Removed                                0.1s
 +
⠿ Volume smw3_wiki-www    Removed                                1.2s
 +
</source>
 +
 +
= Extensions =
 +
see {{Link|target=Pymediawikidocker/Extensions}}
 
= Debugging =
 
= Debugging =
 
== Docker files ==
 
== Docker files ==
Line 228: Line 484:
 
<source lang='bash' higlight="1-3">
 
<source lang='bash' higlight="1-3">
 
pwd
 
pwd
/Users/***/.pymediawikidocker/mw1_35_2
+
/Users/***/.pymediawikidocker/mw-139
 
ls -l
 
ls -l
total 176
+
total 128
-rw-r--r-- 1 wf staff   1057 22 Jun 07:03 Dockerfile
+
-rwxrwxr-x 1 wf wf  349 Nov 18 12:40 addSysopUser.sh
-rw-r--r-- 1 wf  staff  4580 22 Jun 07:03 LocalSettings.php
+
-rw-rw-r-- 1 wf wf    23 Nov 18 12:40 composer.local.json
-rw-r--r-- 1 wf staff   1161 22 Jun 07:03 docker-compose.yml
+
-rwxrwxr-x 1 wf wf   465 Nov 18 12:40 disable_sudo.sh
-rw-r--r-- 1 wf  staff    317 22 Jun 07:03 initdb.sh
+
-rw-rw-r-- 1 wf wf  1952 Nov 18 12:40 docker-compose.yml
-rw-r--r--  1 wf staff    125 22 Jun 07:03 phpinfo.php
+
-rw-rw-r-- 1 wf wf  1410 Nov 18 12:40 Dockerfile
-rw-r--r-- 1 wf staff  64515 22 Jun 07:03 wiki.sql
+
-rwxrwxr-x 1 wf wf   153 Nov 18 12:40 install_djvu.sh
 +
-rwxrwxr-x 1 wf wf  1378 Nov 18 12:40 installExtensions.sh
 +
-rw-rw-r-- 1 wf wf  6905 Nov 18 12:40 LocalSettings.php
 +
-rw-rw-r-- 1 wf wf  1059 Nov 18 12:40 MwConfig.json
 +
-rw-rw-r-- 1 wf wf  267 Nov 18 12:40 phpinfo.php
 +
-rwxrwxr-x 1 wf wf 2339 Nov 18 12:40 plantuml.sh
 +
-rwxrwxr-x 1 wf wf 10491 Nov 18 12:40 setup-mediawiki.sh
 +
-rw-rw-r-- 1 wf wf  206 Nov 18 12:40 upload.ini
 +
-rw-rw-r-- 1 wf wf 64482 Nov 18 12:40 wiki.sql
 +
</source>
 +
== Check installed docker images ==
 +
<source lang='bash' highlight='1'>
 +
docker images | grep mw
 +
WARNING: This output is designed for human readability. For machine-readable output, please use --format.
 +
mw-135-mw:latest        f4fac7e4ab24      1.58GB          347MB  U   
 +
mw-139-mw:latest        998a1c08c2f0        1.9GB          411MB  U   
 +
mw-143-mw:latest        12f3e2ba4d4a        2.1GB          458MB  U   
 +
mw-144-mw:latest        4a6a421be704      2.13GB          462MB  U   
 +
mw139-10lts-mw:latest  35aa59eb9dd2        1.9GB          411MB  U   
 +
mw139-11lts-mw:latest  71b736a6acff        1.9GB          411MB       
 +
mw139lts-mw:latest      8e83e31a47e1        1.9GB          411MB  U   
 +
smw4-mw:latest          10a6e1911648        1.9GB          411MB  U   
 
</source>
 
</source>
 +
 
== Bash into docker containers ==
 
== Bash into docker containers ==
<source lang='bash' highlight='2,4'>
+
<source lang="bash" highlight='2-5,8-11'>
 
# Mediawiki container
 
# Mediawiki container
docker exec -it mw1_36_0_mw_1 /bin/bash
+
docker exec -it mw-144-mw /bin/bash
 +
docker exec -it mw-143-mw /bin/bash
 +
docker exec -it mw-139-mw /bin/bash
 +
docker exec -it mw-135-mw /bin/bash
 +
 
 
# MariaDB container
 
# MariaDB container
docker exec -it mw1_36_0_db_1 /bin/bash
+
docker exec -it mw-144-db /bin/bash
 +
docker exec -it mw-143-db /bin/bash
 +
docker exec -it mw-139-db /bin/bash
 +
docker exec -it mw-135-db /bin/bash
 +
</source>
 +
 
 +
</source>
 +
 
 +
== Monkey patching ==
 +
<source lang='bash' highlight='2'>
 +
# Enable raw html in for the wiki
 +
docker exec  mw1_35_8-mw sh -c "echo '\$wgRawHtml = true;\n' >> /var/www/html/LocalSettings.php"
 
</source>
 
</source>
 +
 +
== No space left on device issue ==
 +
e.g. when starting mariadb container
 +
see https://stackoverflow.com/questions/37645879/how-can-i-fix-docker-mac-no-space-left-on-device-error
 +
 
== Wiki Backup ==
 
== Wiki Backup ==
 
The passwords are available from the docker files e.g.
 
The passwords are available from the docker files e.g.
Line 260: Line 558:
 
docker cp mw1_36_0_db_1:/tmp/wiki.sql /tmp
 
docker cp mw1_36_0_db_1:/tmp/wiki.sql /tmp
 
</source>
 
</source>
== Stop and Remove all running containers ==
+
== Docker cleanup procedure ==
These commands will stop and remove '''all''' running docker containers (not only the ones created pymediawikidocker/the mwcluster command)
 
 
<source lang='bash'>
 
<source lang='bash'>
docker stop $(docker ps -aq)
+
#!/bin/bash
 +
# WF 2023-04-08
 +
#
 +
# ⚠️ ⚠️ ⚠️
 +
#
 +
#  kids  don't do this at home ...
 +
#
 +
# ⚠️ These commands will stop and remove all running docker containers (not only the ones created pymediawikidocker/the mwcluster command)
 +
# kill/stop all running containers
 +
docker kill $(docker ps -q)
 +
#docker stop $(docker ps -aq)
 +
# remove all docker containers
 
docker rm $(docker ps -aq)
 
docker rm $(docker ps -aq)
 +
# remove all images
 +
# ⚠️ This command will remove all your images not only the ones created by pymediawikidocker (docker will hopefully refuse to do this without the -f option)
 +
docker rmi $(docker images -q)
 +
# ⚠️ these commands will remove all your volumes - you might loose valuable data if you don't check what your volumes contain before starting this command
 +
# see https://stackoverflow.com/a/46091568/1497139
 +
docker volume rm $(docker volume ls -qf dangling=true | xargs)
 +
#⚠️ WARNING! This will remove:
 +
#  - all stopped containers
 +
#  - all networks not used by at least one container
 +
#  - all dangling images
 +
#  - all dangling build cache
 +
docker system prune --force
 
</source>
 
</source>
  
 
= Links =
 
= Links =
 
* [https://www.wikidata.org/wiki/Q83 Wikidata entry for Mediawiki software]
 
* [https://www.wikidata.org/wiki/Q83 Wikidata entry for Mediawiki software]

Latest revision as of 13:40, 19 November 2025

OsProject

OsProject
edit
id  pymediawikidocker
state  active
owner  WolfgangFahl
title  pymediawikidocker
url  https://github.com/WolfgangFahl/pymediawikidocker
version  0.22.1
description  Python controlled mediawiki docker image installation
date  2025-11-19
since  2021-06-08
until  

tickets

Motivation

Official Mediawiki docker images are available for the different Mediawiki versions.

These images need additional infrastructure to create useable Mediawiki environments.

docker run --name local-mediawiki -p 8080:80 -d mediawiki

will only install part of a LAMP environment to install Mediawiki and make it available via http://localhost:8080/. E.g. the database needs to be installed separately.

The goal of this project is to semi-automatically create such environments and test the functionality. Python was choosen as a development environment for the libraries that are needed and available to perform the tasks:

python on whales was chosen over:

Since it works on the command line interface and not via the SDK and supports docker compose.

How it works

The core concept is a "MediawikiCluster" that is a set of docker applications that run MediaWiki instances with varying versions of MediaWiki and the underlying database. The graphic belows shows the docker containers which are created for different versions of Mediawiki

Installation

Prerequisites

Docker on Windows, Mac or Linux suppporting "docker compose up" using the Docker composer V2 CLI

Ubuntu 24.04 LTS installation

see https://docs.docker.com/engine/install/ubuntu/ on how to setup the docker repository

sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu noble stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker --version
Docker version 29.0.2, build 8108357
# Create the docker group if it does not exist
sudo groupadd docker 2>/dev/null || true
# Add your current user to the docker group
sudo usermod -aG docker "$USER"
docker run hello-world
Hello from Docker!

The "Hello from Docker" message shows that your installation appears to be working correctly.

Compatibility test

# test on a Mac OS machine 2022-07-02
docker 2>&1 | grep compose
  compose*    Docker Compose (Docker Inc., v2.4.1)
# test on an Ubuntu machine 2023-04-07
docker 2>&1 | grep compose
 compose*    Docker Compose (Docker Inc., v2.17.2)

Test of docker compose

No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 24.04.3 LTS
Release:	24.04
Codename:	noble

docker compose (not docker-compose)

docker compose version
Docker Compose version v2.40.3

pymediawikidocker installation via pip

pip install pymediawikidocker
# alternatively if your pip is not a python3 pip
pip3 install pymediawikidocker

upgrade

pip install pymediawikidocker -U
# alternatively if your pip is not a python3 pip
pip3 install pymediawikidocker -U

check version

mwcluster -V
pymediawikidocker 0.22.1 2025-11-18

Usage

usage: mwcluster [-h] [-a] [-d] [--debugLocalPath DEBUGLOCALPATH]
                 [--debugPort DEBUGPORT] [--debugRemotePath DEBUGREMOTEPATH]
                 [--debugServer DEBUGSERVER] [-f] [-q] [-v] [-V]
                 [--article_path ARTICLE_PATH] [-bm] [-cn CONTAINER_NAME]
                 [-dcn DB_CONTAINER_NAME] [-el [EXTENSIONNAMELIST ...]]
                 [-ej EXTENSIONJSONFILE] [--forceRebuild] [-fu] [--host HOST]
                 [-dp DOCKER_PATH] [--lenient] [--logo LOGO]
                 [-mv MARIADBVERSION] [--mysqlRootPassword MYSQLROOTPASSWORD]
                 [--mysqlPassword MYSQLPASSWORD] [-rp] [-p PASSWORD]
                 [-pl PASSWORD_LENGTH] [--prefix PREFIX] [--prot PROT]
                 [--script_path SCRIPT_PATH] [--url URL] [-sp SQL_PORT]
                 [-smw SMW_VERSION] [-u USER] [--uid UID] [--gid GID]
                 [-bp BASE_PORT] [-vl [VERSIONS ...]] [--create] [--down]
                 [--check] [--list]

Python controlled (semantic) mediawiki docker application cluster installation

options:
  -h, --help            show this help message and exit
  -a, --about           show version info and open documentation
  -d, --debug           enable debug output
  --debugLocalPath DEBUGLOCALPATH
                        remote debug Server path mapping - localPath - path on
                        machine where python runs
  --debugPort DEBUGPORT
                        remote debug Port [default: 5678]
  --debugRemotePath DEBUGREMOTEPATH
                        remote debug Server path mapping - remotePath - path
                        on debug server
  --debugServer DEBUGSERVER
                        remote debug Server
  -f, --force           force overwrite or unsafe actions
  -q, --quiet           suppress all output
  -v, --verbose         increase output verbosity
  -V, --version         show program's version number and exit
  --article_path ARTICLE_PATH
                        change to any article_path you might need to set
                        [default: ]
  -bm, --bind-mount     use bind mounts instead of volumes
  -cn CONTAINER_NAME, --container_name CONTAINER_NAME
                        set container name (only valid and recommended for
                        single version call)
  -dcn DB_CONTAINER_NAME, --db_container_name DB_CONTAINER_NAME
                        set database container name [default: None]
  -el [EXTENSIONNAMELIST ...], --extensionList [EXTENSIONNAMELIST ...]
                        list of extensions to be installed [default: ['Admin
                        Links', 'Header Tabs', 'ParserFunctions',
                        'SyntaxHighlight', 'Variables']]
  -ej EXTENSIONJSONFILE, --extensionJson EXTENSIONJSONFILE
                        additional extension descriptions default: [default:
                        None]
  --forceRebuild        force rebuilding [default: False]
  -fu, --force_user     force overwrite of wikiuser
  --host HOST           the host to serve / listen from [default:
                        noah.bitplan.com]
  -dp DOCKER_PATH, --docker_path DOCKER_PATH
                        the base directory to store docker and jinja template
                        files [default: /home/wf/.pymediawikidocker]
  --lenient             do not throw error on wikiuser difference
  --logo LOGO           set Logo [default:
                        $wgResourceBasePath/resources/assets/wiki.png]
  -mv MARIADBVERSION, --mariaDBVersion MARIADBVERSION
                        mariaDB Version to be installed [default: 11.4]
  --mysqlRootPassword MYSQLROOTPASSWORD
                        set sql root Password [default: None] - random
                        password if None
  --mysqlPassword MYSQLPASSWORD
                        set sql user Password [default: None] - random
                        password if None
  -rp, --random_password
                        create random password and create wikiuser while at it
  -p PASSWORD, --password PASSWORD
                        set password for initial user [default: sysop-1234!]
  -pl PASSWORD_LENGTH, --password_length PASSWORD_LENGTH
                        set the password length for random passwords[default:
                        15]
  --prefix PREFIX       the container name prefix to use [default: mw]
  --prot PROT           change to https in case [default: http]
  --script_path SCRIPT_PATH
                        change to any script_path you might need to set
                        [default: ]
  --url URL             will set prot host,script_path, and optionally port
                        based on the url given [default: None]
  -sp SQL_PORT, --sql_base_port SQL_PORT
                        set base mySql port 3306 to be exposed - incrementing
                        by one for each version [default: 9306]
  -smw SMW_VERSION, --smw_version SMW_VERSION
                        set SemanticMediaWiki Version to be installed default
                        is None - no installation of SMW
  -u USER, --user USER  set username of initial user with sysop rights
                        [default: Sysop]
  --uid UID             User ID (default: 33 for www-data)
  --gid GID             Group ID (default: 33 for www-data)
  -bp BASE_PORT, --base_port BASE_PORT
                        set how base html port 80 to be exposed - incrementing
                        by one for each version [default: 9080]
  -vl [VERSIONS ...], --version_list [VERSIONS ...]
                        mediawiki versions to create docker applications for
                        [default: ['1.35.13', '1.39.15', '1.43.5', '1.44.2']]
  --create
  --down
  --check
  --list

Examples

Pymediawikidocker_example_2022-10-26

create with default settings

Starts a cluster with versions 1.35.13,1.39.13, 1.43.2, and 1.44.0 using MariaDB 10.11. Essentially this is automatic generation of the configuration with a docker compose up for all versions asked for.

# force new user and random password
mwcluster --create -f -fu -rp
starting mw-135 1.35.13 docker application ...
...
starting mw-139 1.39.15 docker application ...
...
starting mw-143 1.43.5 docker application ...
...
starting mw-144 1.44.2 docker application ...
✔ Network mw-144_default    Created                                       0.1s 
 ✔ Volume mw-144_mysql-data  Created                                       0.0s 
 ✔ Volume mw-144_wiki-sites  Created                                       0.0s 
 ✔ Volume mw-144_wiki-etc    Created                                       0.0s 
 ✔ Volume mw-144_wiki-html   Created                                       0.0s 
 ✔ Container mw-144-db       Started                                       5.4s 
 ✔ Container mw-144-mw       Started                                       4.1s 
mw-144-mw 🟢 started in 0.01s
mw-144-db 🟢 started in 0.01s
Initializing MediaWiki SQL tables ...
...
Starting periodic command scheduler: cron.
MediaWiki setup complete!
MediaWiki mw-144 is ready at ...

Mediawiki applications will be available at

http://localhost:9080 http://localhost:9080/index.php/Special:Version

http://localhost:9081 http://localhost:9081/index.php/Special:Version

http://localhost:9082 http://localhost:9082/index.php/Special:Version

http://localhost:9083 http://localhost:9083/index.php/Special:Version

check

mwcluster --check -f
1:checking 1.35.13 ...
mediawiki webserver container mw-135-mw:✅
mediawiki database container mw-135-db:✅
port binding 9080= expected  port 9080?:✅
Checking http://noah.bitplan.com:9080/index.php?title=Special:Version ...
Special Version accessible ...:✅
Mediawiki Version 1.35.13= expected  1.35.13?:✅
Maria DB Version 11.4 fitting expected 11.4?:✅
2:checking 1.39.15 ...
mediawiki webserver container mw-139-mw:✅
mediawiki database container mw-139-db:✅
port binding 9081= expected  port 9081?:✅
Checking http://noah.bitplan.com:9081/index.php?title=Special:Version ...
Special Version accessible ...:✅
Mediawiki Version 1.39.15= expected  1.39.15?:✅
Maria DB Version 11.4 fitting expected 11.4?:✅
3:checking 1.43.5 ...
mediawiki webserver container mw-143-mw:✅
mediawiki database container mw-143-db:✅
port binding 9082= expected  port 9082?:✅
Checking http://noah.bitplan.com:9082/index.php?title=Special:Version ...
Special Version accessible ...:✅
Mediawiki Version 1.43.5= expected  1.43.5?:✅
Maria DB Version 11.4 fitting expected 11.4?:✅
4:checking 1.44.2 ...
mediawiki webserver container mw-144-mw:✅
mediawiki database container mw-144-db:✅
port binding 9083= expected  port 9083?:✅
Checking http://noah.bitplan.com:9083/index.php?title=Special:Version ...
Special Version accessible ...:✅
Mediawiki Version 1.44.2= expected  1.44.2?:✅
Maria DB Version 11.4 fitting expected 11.4?:✅

down

mwcluster --down -f
running docker compose down for mw-135 1.35.13 docker application ...
[+] Running 7/7
 ✔ Container mw-135-mw       Removed                                       1.2s 
 ✔ Container mw-135-db       Removed                                       0.4s 
 ✔ Volume mw-135_mysql-data  Removed                                       0.0s 
 ✔ Volume mw-135_wiki-etc    Removed                                       0.0s 
 ✔ Volume mw-135_wiki-sites  Removed                                       0.0s 
 ✔ Volume mw-135_wiki-html   Removed                                       0.4s 
 ✔ Network mw-135_default    Removed                                       0.2s 
running docker compose down for mw-139 1.39.15 docker application ...
[+] Running 7/7
 ✔ Container mw-139-mw       Removed                                       1.2s 
 ✔ Container mw-139-db       Removed                                       0.5s 
 ✔ Volume mw-139_wiki-sites  Removed                                       0.0s 
 ✔ Volume mw-139_wiki-etc    Removed                                       0.0s 
 ✔ Volume mw-139_wiki-html   Removed                                       0.5s 
 ✔ Volume mw-139_mysql-data  Removed                                       0.5s 
 ✔ Network mw-139_default    Removed                                       0.2s 
running docker compose down for mw-143 1.43.5 docker application ...
[+] Running 7/7
 ✔ Container mw-143-mw       Removed                                       1.4s 
 ✔ Container mw-143-db       Removed                                       0.6s 
 ✔ Volume mw-143_wiki-etc    Removed                                       0.0s 
 ✔ Volume mw-143_wiki-html   Removed                                       0.6s 
 ✔ Volume mw-143_wiki-sites  Removed                                       0.6s 
 ✔ Volume mw-143_mysql-data  Removed                                       0.6s 
 ✔ Network mw-143_default    Removed                                       0.2s 
running docker compose down for mw-144 1.44.2 docker application ...
[+] Running 7/7
 ✔ Container mw-144-mw       Removed                                       1.4s 
 ✔ Container mw-144-db       Removed                                       0.5s 
 ✔ Volume mw-144_wiki-html   Removed                                       0.6s 
 ✔ Volume mw-144_wiki-sites  Removed                                       0.0s 
 ✔ Volume mw-144_mysql-data  Removed                                       0.6s 
 ✔ Volume mw-144_wiki-etc    Removed                                       0.6s 
 ✔ Network mw-144_default    Removed                                       0.1s

Single 1.39.15 LTS

# python mwdocker/mwcluster.py  can be used instead of mwcluster if you test from your locally cloned environment
mwcluster \
  --create \
  --forceRebuild\
  --version_list 1.39.15\
  --base_port 8480\
  --sql_base_port 10308\
  --mariaDBVersion 11.8\
  --container_name mw139lts\
  --logo https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Bigsmile_smiley_yellow_simple.svg/128px-Bigsmile_smiley_yellow_simple.svg.png
creating docker compose applications for mediawiki versions ['1.39.10']
starting mw139lts 1.39.15 docker application ...

Mediawiki application will be available at

http://localhost:8480 http://localhost:8480/index.php/Special:Version PyMediaWikiDocker-ExampleMW135WithLogo.png

Single 1.35 with Semantic Mediawiki - deprecated

There might be more current versions of SMW available see https://www.semantic-mediawiki.org/wiki/Semantic_MediaWiki_Version_History and adapt the example below if you see the need to do so.

Version 4.1.2

mwcluster \
  --create \
  --container_name smw4\
  --forceRebuild\
  --version_list 1.35.13\
  --base_port 8481\
  --sql_base_port 10307\
  --mariaDBVersion 10.11\
  --smw_version 4.1.2
creating docker compose applications for mediawiki versions ['1.35.13']
starting smw4 1.35.13 docker application ...

debug docker compose results - ports and other configuration parts

cd ~/.pymediawikidocker/smw4
docker-compose up
# in another terminal session:
docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED              STATUS         PORTS                     NAMES
87a795d444eb   smw4_mw                 "docker-php-entrypoi…"   About a minute ago   Up 7 seconds   0.0.0.0:8481->80/tcp      smw4-mw
7ca3a0434d31   mariadb:10.11           "docker-entrypoint.s…"   About a minute ago   Up 7 seconds   0.0.0.0:10307->3306/tcp   smw4-db

open bash in docker container

docker exec -it smw4-mw /bin/bash
root@87a795d444eb:/var/www/html#

check installExtensions.sh script

cat /root/installExtensions.sh 
#!/bin/bash
# install the required extensions
# WF 2021-06-23
cd /var/www/html/extensions

# Admin Links
# https://www.mediawiki.org/wiki/Extension:Admin_Links
git clone https://github.com/wikimedia/mediawiki-extensions-AdminLinks --single-branch --branch REL1_35 AdminLinks

# Header Tabs
# https://www.mediawiki.org/wiki/Extension:Header_Tabs
git clone https://github.com/wikimedia/mediawiki-extensions-HeaderTabs --single-branch --branch REL1_35 HeaderTabs

# SyntaxHighlight
# https://www.mediawiki.org/wiki/Extension:SyntaxHighlight
# no installation script command specified

# Variables
# https://www.mediawiki.org/wiki/Extension:Variables
git clone https://github.com/wikimedia/mediawiki-extensions-Variables --single-branch --branch REL1_35 Variables

check Semantic MediaWiki settings in LocalSettings.php

grep -i semantic LocalSettings.php 
# enable Support for Semantic MediaWiki
# see https://www.semantic-mediawiki.org/wiki/Help:EnableSemantics
# Version of SemanticMediaWiki at install time: 4.1.1
wfLoadExtension( 'SemanticMediaWiki' );
enableSemantics();
# https://www.semantic-mediawiki.org/wiki/Help:$smwgQMaxInlineLimit

SMW Version 3.2.3

Installation

mwcluster \
  --create \
  --container_name smw3\
  --forceRebuild\
  --version_list 1.35.13\
  --base_port 8482\
  --sql_base_port 10308\
  --mariaDBVersion 10.11\
  --logo https://www.semantic-mediawiki.org/w/images/4/4e/SMW_logo_180.png\
  --smw_version 3.2.3

Check

mwcluster --check --container_name smw3 --version_list 1.35.13

Down

mwcluster --down --container_name smw3 --version_list 1.35.13 -f
running docker compose down for mediawiki versions ['1.35.13']
running docker compose down for smw3 1.35.10 docker application ...
[+] Running 3/3
 ⠿ Volume smw3_wiki-etc    Removed                                0.0s
 ⠿ Volume smw3_mysql-data  Removed                                0.1s
 ⠿ Volume smw3_wiki-www    Removed                                1.2s

Extensions

see Pymediawikidocker/Extensions

Debugging

Docker files

You'll find the files created by pymediawikidocker in ".pymediawikidocker" in your homedirectory.

pwd
/Users/***/.pymediawikidocker/mw-139
ls -l
total 128
-rwxrwxr-x 1 wf wf   349 Nov 18 12:40 addSysopUser.sh
-rw-rw-r-- 1 wf wf    23 Nov 18 12:40 composer.local.json
-rwxrwxr-x 1 wf wf   465 Nov 18 12:40 disable_sudo.sh
-rw-rw-r-- 1 wf wf  1952 Nov 18 12:40 docker-compose.yml
-rw-rw-r-- 1 wf wf  1410 Nov 18 12:40 Dockerfile
-rwxrwxr-x 1 wf wf   153 Nov 18 12:40 install_djvu.sh
-rwxrwxr-x 1 wf wf  1378 Nov 18 12:40 installExtensions.sh
-rw-rw-r-- 1 wf wf  6905 Nov 18 12:40 LocalSettings.php
-rw-rw-r-- 1 wf wf  1059 Nov 18 12:40 MwConfig.json
-rw-rw-r-- 1 wf wf   267 Nov 18 12:40 phpinfo.php
-rwxrwxr-x 1 wf wf  2339 Nov 18 12:40 plantuml.sh
-rwxrwxr-x 1 wf wf 10491 Nov 18 12:40 setup-mediawiki.sh
-rw-rw-r-- 1 wf wf   206 Nov 18 12:40 upload.ini
-rw-rw-r-- 1 wf wf 64482 Nov 18 12:40 wiki.sql

Check installed docker images

 docker images | grep mw
WARNING: This output is designed for human readability. For machine-readable output, please use --format.
mw-135-mw:latest        f4fac7e4ab24       1.58GB          347MB   U    
mw-139-mw:latest        998a1c08c2f0        1.9GB          411MB   U    
mw-143-mw:latest        12f3e2ba4d4a        2.1GB          458MB   U    
mw-144-mw:latest        4a6a421be704       2.13GB          462MB   U    
mw139-10lts-mw:latest   35aa59eb9dd2        1.9GB          411MB   U    
mw139-11lts-mw:latest   71b736a6acff        1.9GB          411MB        
mw139lts-mw:latest      8e83e31a47e1        1.9GB          411MB   U    
smw4-mw:latest          10a6e1911648        1.9GB          411MB   U

Bash into docker containers

# Mediawiki container
docker exec -it mw-144-mw /bin/bash
docker exec -it mw-143-mw /bin/bash
docker exec -it mw-139-mw /bin/bash
docker exec -it mw-135-mw /bin/bash

# MariaDB container
docker exec -it mw-144-db /bin/bash
docker exec -it mw-143-db /bin/bash
docker exec -it mw-139-db /bin/bash
docker exec -it mw-135-db /bin/bash

</source>

Monkey patching

# Enable raw html in for the wiki
docker exec  mw1_35_8-mw sh -c "echo '\$wgRawHtml = true;\n' >> /var/www/html/LocalSettings.php"

No space left on device issue

e.g. when starting mariadb container see https://stackoverflow.com/questions/37645879/how-can-i-fix-docker-mac-no-space-left-on-device-error

Wiki Backup

The passwords are available from the docker files e.g.

grep PASS docker-compose.yml 
      MYSQL_PASSWORD: "TnbKf2zGRmZPjUvz7B"
      MYSQL_ROOT_PASSWORD: "QWehnR9yLMY7YAb9pw"

In a docker bash a dump can be created

mysqldump wiki -u wikiuser --password=TnbKf2zGRmZPjUvz7B > /tmp/wiki.sql

and then copied to your local machine

docker cp mw1_36_0_db_1:/tmp/wiki.sql /tmp

Docker cleanup procedure

#!/bin/bash
# WF 2023-04-08
# 
# ⚠️ ⚠️ ⚠️ 
#
#  kids  don't do this at home ...
#
# ⚠️ These commands will stop and remove all running docker containers (not only the ones created pymediawikidocker/the mwcluster command) 
# kill/stop all running containers
docker kill $(docker ps -q)
#docker stop $(docker ps -aq)
# remove all docker containers
docker rm $(docker ps -aq)
# remove all images
# ⚠️ This command will remove all your images not only the ones created by pymediawikidocker (docker will hopefully refuse to do this without the -f option) 
docker rmi $(docker images -q)
# ⚠️ these commands will remove all your volumes - you might loose valuable data if you don't check what your volumes contain before starting this command 
# see https://stackoverflow.com/a/46091568/1497139
docker volume rm $(docker volume ls -qf dangling=true | xargs)
#⚠️ WARNING! This will remove:
#  - all stopped containers
#  - all networks not used by at least one container
#  - all dangling images
#  - all dangling build cache
docker system prune --force

Links