diff --git a/12/mysql-tomcat/.env b/12/mysql-tomcat/.env
new file mode 100644
index 0000000000000000000000000000000000000000..5c2df1456453d4baa23fb4fcd6ad3a0cace568d1
--- /dev/null
+++ b/12/mysql-tomcat/.env
@@ -0,0 +1,6 @@
+# Default environment values
+XWIKI_VERSION=12.0
+DB_USER=xwiki
+DB_PASSWORD=xwiki
+DB_DATABASE=xwiki
+MYSQL_ROOT_PASSWORD=xwiki
diff --git a/12/mysql-tomcat/Dockerfile b/12/mysql-tomcat/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..34e4408440563af97ba2a475059e220932ae8539
--- /dev/null
+++ b/12/mysql-tomcat/Dockerfile
@@ -0,0 +1,103 @@
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+FROM tomcat:8-jdk11-adoptopenjdk-hotspot
+
+#    ____  ____  ____      ____  _   __        _
+#   |_  _||_  _||_  _|    |_  _|(_) [  |  _   (_)
+#     \ \  / /    \ \  /\  / /  __   | | / ]  __
+#      > `' <      \ \/  \/ /  [  |  | '' <  [  |
+#    _/ /'`\ \_     \  /\  /    | |  | |`\ \  | |
+#   |____||____|     \/  \/    [___][__|  \_][___]
+
+MAINTAINER Vincent Massol <vincent@massol.net>
+
+# Note: when using docker-compose, the ENV values below are overridden from the .env file.
+
+# Install LibreOffice + other tools
+# Note that procps is required to get ps which is used by JODConverter to start LibreOffice
+RUN apt-get update && \
+  apt-get --no-install-recommends -y install \
+    curl \
+    libreoffice \
+    unzip \
+    procps \
+    libmysql-java && \
+  rm -rf /var/lib/apt/lists/*
+
+# Install XWiki as the ROOT webapp context in Tomcat
+# Create the Tomcat temporary directory
+# Configure the XWiki permanent directory
+ENV XWIKI_VERSION=12.0
+ENV XWIKI_URL_PREFIX "https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-distribution-war/${XWIKI_VERSION}"
+ENV XWIKI_DOWNLOAD_SHA256 da57110002c76001dc9ca16eb217ea0d6c81a2b4bd3d8ad26a6fc5efe96c776d
+RUN rm -rf /usr/local/tomcat/webapps/* && \
+  mkdir -p /usr/local/tomcat/temp && \
+  mkdir -p /usr/local/xwiki/data && \
+  curl -fSL "${XWIKI_URL_PREFIX}/xwiki-platform-distribution-war-${XWIKI_VERSION}.war" -o xwiki.war && \
+  echo "$XWIKI_DOWNLOAD_SHA256 xwiki.war" | sha256sum -c - && \
+  unzip -d /usr/local/tomcat/webapps/ROOT xwiki.war && \
+  rm -f xwiki.war
+
+# Copy the JDBC driver in the XWiki webapp
+RUN cp /usr/share/java/mysql-connector-java-*.jar /usr/local/tomcat/webapps/ROOT/WEB-INF/lib/
+
+# Configure Tomcat. For example set the memory for the Tomcat JVM since the default value is too small for XWiki
+COPY tomcat/setenv.sh /usr/local/tomcat/bin/
+
+# Setup the XWiki Hibernate configuration
+COPY xwiki/hibernate.cfg.xml /usr/local/tomcat/webapps/ROOT/WEB-INF/hibernate.cfg.xml
+
+# Set a specific distribution id in XWiki for this docker packaging.
+RUN sed -i 's/<id>org.xwiki.platform:xwiki-platform-distribution-war/<id>org.xwiki.platform:xwiki-platform-distribution-docker/' \
+  /usr/local/tomcat/webapps/ROOT/META-INF/extension.xed
+
+# Add scripts required to make changes to XWiki configuration files at execution time
+# Note: we don't run CHMOD since 1) it's not required since the executabe bit is already set in git and 2) running
+# CHMOD after a COPY will sometimes fail, depending on different host-specific factors (especially on AUFS).
+COPY xwiki/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
+
+# Make the XWiki directory (the permanent directory is included in it) persist on the host (so that it's not recreated
+# across runs)
+VOLUME /usr/local/xwiki
+
+# At this point the image is done and what remains below are the runtime configuration used by the user to configure
+# the container that will be created out of the image. Namely the user can override some environment variables with
+#   docker run -e "var1=val1" -e "var2=val2" ...
+# The supported environment variables that can be overridden are:
+# - DB_USER: the name of the user configured for XWiki in the DB. Default is "xwiki". This is used to configure
+#            xwiki's hibernate.cfg.xml file.
+# - DB_PASSWORD: the password for the user configured for XWiki in the DB. Default is "xwiki". This is used to
+#                configure xwiki's hibernate.cfg.xml file.
+# - DB_DATABASE: the name of the database to use. Default is "xwiki". This is used to configure xwiki's
+#                hibernate.cfg.xml file.
+# - DB_HOST: The name of the host (or docker container) containing the database. Default is "db". This is used to
+#            configure xwiki's hibernate.cfg.xml file.
+# - CONTEXT_PATH: The name of the context path under which XWiki will be deployed in Tomcat. If not specified then it'll
+#                 be deployed as ROOT.
+
+# Example:
+#   docker run -it -e "DB_USER=xwiki" -e "DB_PASSWORD=xwiki" <imagename>
+
+# Starts XWiki by starting Tomcat. All options passed to "docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]"
+# are also passed to docker-entrypoint.sh. If "xwiki" is passed then XWiki will be configured the first time the
+# container executes and Tomcat will be started. If some other parameter is passed then it'll be executed to comply
+# with best practices defined at https://github.com/docker-library/official-images#consistency.
+ENTRYPOINT ["docker-entrypoint.sh"]
+CMD ["xwiki"]
diff --git a/12/mysql-tomcat/docker-compose.yml b/12/mysql-tomcat/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..61c9748af8707be831e8ef2e5d04078c4797bb58
--- /dev/null
+++ b/12/mysql-tomcat/docker-compose.yml
@@ -0,0 +1,73 @@
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+version: '2'
+networks:
+  bridge:
+    driver: bridge
+services:
+  # The container that runs XWiki + Tomcat
+  web:
+    build: .
+    container_name: xwiki-mysql-tomcat-web
+    depends_on:
+      - db
+    ports:
+      - "8080:8080"
+    # Default values defined in .env file.
+    # The DB_USER/DB_PASSWORD/DB_DATABASE/DB_HOST variables are used in the hibernate.cfg.xml file.
+    environment:
+      - XWIKI_VERSION=${XWIKI_VERSION}
+      - DB_USER=${DB_USER}
+      - DB_PASSWORD=${DB_PASSWORD}
+      - DB_DATABASE=${DB_DATABASE}
+      - DB_HOST=xwiki-mysql-db
+    # Provide a name instead of an auto-generated id for xwiki data (the permanent directory in included in it)
+    # configured in the Dockerfile, to make it simpler to identify in 'docker volume ls'.
+    volumes:
+      - xwiki-data:/usr/local/xwiki
+    networks:
+      - bridge
+  # The container that runs the database (mysql)
+  db:
+    image: "mysql:5.7"
+    container_name: xwiki-mysql-db
+    # - We provide a xwiki.cnf file in order to configure the mysql db to support UTF8 and be case-insensitive
+    # We have to do it here since we use an existing image and that's how this image allows customizations.
+    # See https://hub.docker.com/_/mysql/ for more details.
+    # - Provide a name instead of an auto-generated id for the mysql data, to make it simpler to identify in
+    # 'docker volume ls'
+    volumes:
+      - ./mysql/xwiki.cnf:/etc/mysql/conf.d/xwiki.cnf
+      - mysql-data:/var/lib/mysql
+      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
+
+    # Configure the MySQL database and create a user with provided name/password.
+    # See https://hub.docker.com/_/mysql/ for more details.
+    # Default values defined in .env file.
+    environment:
+      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
+      - MYSQL_USER=${DB_USER}
+      - MYSQL_PASSWORD=${DB_PASSWORD}
+      - MYSQL_DATABASE=${DB_DATABASE}
+    networks:
+      - bridge
+volumes:
+  mysql-data: {}
+  xwiki-data: {}
diff --git a/12/mysql-tomcat/mysql/init.sql b/12/mysql-tomcat/mysql/init.sql
new file mode 100644
index 0000000000000000000000000000000000000000..a72a02c66dca79fe7be06a8aef179a381fcbf8f3
--- /dev/null
+++ b/12/mysql-tomcat/mysql/init.sql
@@ -0,0 +1 @@
+grant all privileges on *.* to xwiki@'%' identified by 'xwiki'
\ No newline at end of file
diff --git a/12/mysql-tomcat/mysql/xwiki.cnf b/12/mysql-tomcat/mysql/xwiki.cnf
new file mode 100644
index 0000000000000000000000000000000000000000..9c14b16285ad030ffb8b0db6ca85728d1486410d
--- /dev/null
+++ b/12/mysql-tomcat/mysql/xwiki.cnf
@@ -0,0 +1,31 @@
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+
+[client]
+default-character-set = utf8
+
+[mysqld]
+character-set-server = utf8
+collation-server = utf8_bin
+explicit_defaults_for_timestamp = 1
+
+[mysql]
+default-character-set = utf8
+
diff --git a/12/mysql-tomcat/tomcat/setenv.sh b/12/mysql-tomcat/tomcat/setenv.sh
new file mode 100755
index 0000000000000000000000000000000000000000..755f260ef22e6b02f80c92ae6a07d47610cec7b4
--- /dev/null
+++ b/12/mysql-tomcat/tomcat/setenv.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+
+# We're making the following changes to the default:
+# * Adding more memory (default is 512MB which is not enough for XWiki)
+# * By default, Tomcat does not allow the usage of encoded slash '%2F' and backslash '%5C' in URLs, as noted in
+#   https://tomcat.apache.org/security-6.html#Fixed_in_Apache_Tomcat_6.0.10. We want to allow for them as it's useful to
+#   be able to have '/' and '' in wiki page names.
+# * On some system /dev/random is slow to init leading to a slow Tomcat and thus Xwiki startup.
+
+# Users can override these values by setting the JAVA_OPTS environment variable. For example:
+# -e JAVA_OPTS="-Xmx2048m"
+
+XMX="-Xmx1024m"
+ALLOW_ENCODED_SLASH="-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true"
+ALLOW_BACKSLASH="-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true"
+SECURERANDOM="-Djava.security.egd=file:/dev/./urandom"
+
+if [[ ! -z "$JAVA_OPTS" ]]; then
+  if [[ ! $JAVA_OPTS =~ .*-Xmx[0-9]+.* ]]; then
+    JAVA_OPTS="$JAVA_OPTS $XMX"
+  fi
+  if [[ ! $JAVA_OPTS =~ .*ALLOW_ENCODED_SLASH.* ]]; then
+    JAVA_OPTS="$JAVA_OPTS $ALLOW_ENCODED_SLASH"
+  fi
+  if [[ ! $JAVA_OPTS =~ .*ALLOW_BACKSLASH.* ]]; then
+    JAVA_OPTS="$JAVA_OPTS $ALLOW_BACKSLASH"
+  fi
+  if [[ ! $JAVA_OPTS =~ .*java\.security\.egd.* ]]; then
+    JAVA_OPTS="$JAVA_OPTS $SECURERANDOM"
+  fi
+else
+  JAVA_OPTS="$XMX $ALLOW_ENCODED_SLASH $ALLOW_BACKSLASH $SECURERANDOM"
+fi
+
+export JAVA_OPTS
diff --git a/12/mysql-tomcat/xwiki/docker-entrypoint.sh b/12/mysql-tomcat/xwiki/docker-entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8f8685abb67724b9d16cadb18cf4ab7dc7006ce4
--- /dev/null
+++ b/12/mysql-tomcat/xwiki/docker-entrypoint.sh
@@ -0,0 +1,174 @@
+#!/bin/bash
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+
+set -e
+
+function first_start() {
+  configure
+  touch /usr/local/tomcat/webapps/$CONTEXT_PATH/.first_start_completed
+}
+
+function other_starts() {
+  mkdir -p /usr/local/xwiki/data
+  restoreConfigurationFile 'hibernate.cfg.xml'
+  restoreConfigurationFile 'xwiki.cfg'
+  restoreConfigurationFile 'xwiki.properties'
+}
+
+# $1 - the path to xwiki.[cfg|properties]
+# $2 - the setting/property to set
+# $3 - the new value
+function xwiki_replace() {
+  sed -i s~"\#\? \?$2 \?=.*"~"$2=$3"~g "$1"
+}
+
+# $1 - the setting/property to set
+# $2 - the new value
+function xwiki_set_cfg() {
+  xwiki_replace /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/xwiki.cfg "$1" "$2"
+}
+
+# $1 - the setting/property to set
+# $2 - the new value
+function xwiki_set_properties() {
+  xwiki_replace /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/xwiki.properties "$1" "$2"
+}
+
+# usage: file_env VAR [DEFAULT]
+#    ie: file_env 'XYZ_DB_PASSWORD' 'example'
+# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
+#  "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
+file_env() {
+  local var="$1"
+  local fileVar="${var}_FILE"
+  local def="${2:-}"
+  if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
+    echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
+    exit 1
+  fi
+  local val="$def"
+  if [ "${!var:-}" ]; then
+    val="${!var}"
+  elif [ "${!fileVar:-}" ]; then
+    val="$(< "${!fileVar}")"
+  fi
+  export "$var"="$val"
+  unset "$fileVar"
+}
+
+# Allows to use sed but with user input which can contain special sed characters such as \, / or &.
+# $1 - the text to search for
+# $2 - the replacement text
+# $3 - the file in which to do the search/replace
+function safesed {
+  sed -i "s/$(echo $1 | sed -e 's/\([[\/.*]\|\]\)/\\&/g')/$(echo $2 | sed -e 's/[\/&]/\\&/g')/g" $3
+}
+
+# $1 - the config file name found in WEB-INF (e.g. "xwiki.cfg")
+function saveConfigurationFile() {
+  if [ -f "/usr/local/xwiki/data/$1" ]; then
+     echo "  Reusing existing config file $1..."
+     cp "/usr/local/xwiki/data/$1" "/usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/$1"
+  else
+     echo "  Saving config file $1..."
+     cp "/usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/$1" "/usr/local/xwiki/data/$1"
+  fi
+}
+
+# $1 - the config file name to restore in WEB-INF (e.g. "xwiki.cfg")
+function restoreConfigurationFile() {
+  if [ -f "/usr/local/xwiki/data/$1" ]; then
+     echo "  Synchronizing config file $1..."
+     cp "/usr/local/xwiki/data/$1" "/usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/$1"
+  else
+     echo "  No config file $1 found, using default from container..."
+     cp "/usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/$1" "/usr/local/xwiki/data/$1"
+  fi
+}
+
+function configure() {
+  echo 'Configuring XWiki...'
+
+  echo 'Setting environment variables'
+  file_env 'DB_USER' 'xwiki'
+  file_env 'DB_PASSWORD' 'xwiki'
+  file_env 'DB_HOST' 'db'
+  file_env 'DB_DATABASE' 'xwiki'
+  file_env 'INDEX_HOST' 'localhost'
+  file_env 'INDEX_PORT' '8983'
+
+  echo "  Deploying XWiki in the '$CONTEXT_PATH' context"
+  if [ "$CONTEXT_PATH" == "ROOT" ]; then
+    xwiki_set_cfg 'xwiki.webapppath' ''
+  else
+    mv /usr/local/tomcat/webapps/ROOT /usr/local/tomcat/webapps/$CONTEXT_PATH
+  fi
+
+  echo 'Replacing environment variables in files'
+  safesed "replaceuser" $DB_USER /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/hibernate.cfg.xml
+  safesed "replacepassword" $DB_PASSWORD /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/hibernate.cfg.xml
+  safesed "replacecontainer" $DB_HOST /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/hibernate.cfg.xml
+  safesed "replacedatabase" $DB_DATABASE /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/hibernate.cfg.xml
+
+  echo '  Generating authentication validation and encryption keys...'
+  xwiki_set_cfg 'xwiki.authentication.validationKey' "$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)"
+  xwiki_set_cfg 'xwiki.authentication.encryptionKey' "$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)"
+
+  echo '  Setting permanent directory...'
+  xwiki_set_properties 'environment.permanentDirectory' '/usr/local/xwiki/data'
+  echo '  Configure libreoffice...'
+  xwiki_set_properties 'openoffice.autoStart' 'true'
+
+  if [ $INDEX_HOST != 'localhost' ]; then
+    echo '  Configuring remote Solr Index'
+    xwiki_set_properties 'solr.type' 'remote'
+    xwiki_set_properties 'solr.remote.url' "http://$INDEX_HOST:$INDEX_PORT/solr/xwiki"
+  fi
+
+  # If the files already exist then copy them to the XWiki's WEB-INF directory. Otherwise copy the default config
+  # files to the permanent directory so that they can be easily modified by the user. They'll be synced at the next
+  # start.
+  mkdir -p /usr/local/xwiki/data
+  saveConfigurationFile 'hibernate.cfg.xml'
+  saveConfigurationFile 'xwiki.cfg'
+  saveConfigurationFile 'xwiki.properties'
+}
+
+# This if will check if the first argument is a flag but only works if all arguments require a hyphenated flag
+# -v; -SL; -f arg; etc will work, but not arg1 arg2
+if [ "${1:0:1}" = '-' ]; then
+    set -- xwiki "$@"
+fi
+
+# Check for the expected command
+if [ "$1" = 'xwiki' ]; then
+  file_env 'CONTEXT_PATH' 'ROOT'
+  if [[ ! -f /usr/local/tomcat/webapps/$CONTEXT_PATH/.first_start_completed ]]; then
+    first_start
+  else
+    other_starts
+  fi
+  shift
+  set -- catalina.sh run "$@"
+fi
+
+# Else default to run whatever the user wanted like "bash"
+exec "$@"
diff --git a/12/mysql-tomcat/xwiki/hibernate.cfg.xml b/12/mysql-tomcat/xwiki/hibernate.cfg.xml
new file mode 100644
index 0000000000000000000000000000000000000000..880670af73590d71364a51c404b98277aeac79b9
--- /dev/null
+++ b/12/mysql-tomcat/xwiki/hibernate.cfg.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+-->
+
+<!DOCTYPE hibernate-configuration PUBLIC
+  "-//Hibernate/Hibernate Configuration DTD//EN"
+  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+  <session-factory>
+
+    <!-- Please refer to the installation guide on
+         https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Installation/ for configuring your
+         database. You'll need to do 2 things:
+         1) Copy your database driver JAR in WEB-INF/lib or in some shared lib directory
+         2) Uncomment the properties below for your specific DB (and comment the default
+            database configuration if it doesn't match your DB)
+    -->
+
+    <!-- Generic parameters common to all Databases -->
+
+    <property name="show_sql">false</property>
+    <property name="use_outer_join">true</property>
+
+    <!-- Without it, some queries fail in MS SQL. XWiki doesn't need scrollable result sets, anyway. -->
+    <property name="jdbc.use_scrollable_resultset">false</property>
+
+    <!-- DBCP Connection Pooling configuration. Only some properties are shown. All available properties can be found
+         at https://commons.apache.org/proper/commons-dbcp/configuration.html
+    -->
+    <property name="dbcp.defaultAutoCommit">false</property>
+    <property name="dbcp.maxTotal">50</property>
+    <property name="dbcp.maxIdle">5</property>
+    <property name="dbcp.maxWaitMillis">30000</property>
+    <property name="connection.provider_class">com.xpn.xwiki.store.DBCPConnectionProvider</property>
+
+    <!-- Setting "dbcp.poolPreparedStatements" to true and "dbcp.maxOpenPreparedStatements" will tell DBCP to cache
+         Prepared Statements (it's off by default). Note that for backward compatibility the "dbcp.ps.maxActive" is also
+         supported and when set it'll set "dbcp.poolPreparedStatements" to true and "dbcp.maxOpenPreparedStatements" to
+         value of "dbcp.ps.maxActive".
+
+         Note 1: When using HSQLDB for example, it's important to NOT cache prepared statements because HSQLDB
+         Prepared Statements (PS) contain the schema on which they were initially created and thus when switching
+         schema if the same PS is reused it'll execute on the wrong schema! Since HSQLDB does internally cache
+         prepared statement there's no performance loss by not caching Prepared Statements at the DBCP level.
+         See https://jira.xwiki.org/browse/XWIKI-1740.
+         Thus we recommend not turning on this configuration for HSQLDB unless you know what you're doing :)
+
+         Note 2: The same applies to PostGreSQL.
+    -->
+
+    <!-- BoneCP Connection Pooling configuration.
+    <property name="bonecp.idleMaxAgeInMinutes">240</property>
+    <property name="bonecp.idleConnectionTestPeriodInMinutes">60</property>
+    <property name="bonecp.partitionCount">3</property>
+    <property name="bonecp.acquireIncrement">10</property>
+    <property name="bonecp.maxConnectionsPerPartition">60</property>
+    <property name="bonecp.minConnectionsPerPartition">20</property>
+    <property name="bonecp.statementsCacheSize">50</property>
+    <property name="bonecp.releaseHelperThreads">3</property>
+    <property name="connection.provider_class">com.xpn.xwiki.store.DBCPConnectionProvider</property>
+    -->
+
+    <!-- MySQL configuration.
+         Notes:
+           - if you want the main wiki database to be different than "xwiki"
+             you will also have to set the property xwiki.db in xwiki.cfg file
+    -->
+    <property name="connection.url">jdbc:mysql://replacecontainer/replacedatabase?useSSL=false</property>
+    <property name="connection.username">replaceuser</property>
+    <property name="connection.password">replacepassword</property>
+    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
+    <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
+    <property name="dbcp.poolPreparedStatements">true</property>
+    <property name="dbcp.maxOpenPreparedStatements">20</property>
+
+    <property name="hibernate.connection.charSet">UTF-8</property>
+    <property name="hibernate.connection.useUnicode">true</property>
+    <property name="hibernate.connection.characterEncoding">utf8</property>
+
+    <mapping resource="xwiki.hbm.xml"/>
+    <mapping resource="feeds.hbm.xml"/>
+    <mapping resource="instance.hbm.xml"/>
+    <mapping resource="notification-filter-preferences.hbm.xml"/>
+    <mapping resource="mailsender.hbm.xml"/>
+    <mapping resource="activitystream.hbm.xml"/>
+  </session-factory>
+</hibernate-configuration>
diff --git a/12/postgres-tomcat/.env b/12/postgres-tomcat/.env
new file mode 100644
index 0000000000000000000000000000000000000000..5d172cf6258249527a75a10e3ae681cf68bfaca1
--- /dev/null
+++ b/12/postgres-tomcat/.env
@@ -0,0 +1,6 @@
+# Default environment values
+XWIKI_VERSION=12.0
+DB_USER=xwiki
+DB_PASSWORD=xwiki
+DB_DATABASE=xwiki
+POSTGRES_ROOT_PASSWORD=xwiki
diff --git a/12/postgres-tomcat/Dockerfile b/12/postgres-tomcat/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..a87a1bd202ea80c9d575b0e31d193234e0b3eee4
--- /dev/null
+++ b/12/postgres-tomcat/Dockerfile
@@ -0,0 +1,103 @@
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+FROM tomcat:8-jdk11-adoptopenjdk-hotspot
+
+#    ____  ____  ____      ____  _   __        _
+#   |_  _||_  _||_  _|    |_  _|(_) [  |  _   (_)
+#     \ \  / /    \ \  /\  / /  __   | | / ]  __
+#      > `' <      \ \/  \/ /  [  |  | '' <  [  |
+#    _/ /'`\ \_     \  /\  /    | |  | |`\ \  | |
+#   |____||____|     \/  \/    [___][__|  \_][___]
+
+MAINTAINER Vincent Massol <vincent@massol.net>
+
+# Note: when using docker-compose, the ENV values below are overridden from the .env file.
+
+# Install LibreOffice + other tools
+# Note that procps is required to get ps which is used by JODConverter to start LibreOffice
+RUN apt-get update && \
+  apt-get --no-install-recommends -y install \
+    curl \
+    libreoffice \
+    unzip \
+    procps \
+    libpostgresql-jdbc-java && \
+  rm -rf /var/lib/apt/lists/*
+
+# Install XWiki as the ROOT webapp context in Tomcat
+# Create the Tomcat temporary directory
+# Configure the XWiki permanent directory
+ENV XWIKI_VERSION=12.0
+ENV XWIKI_URL_PREFIX "https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-distribution-war/${XWIKI_VERSION}"
+ENV XWIKI_DOWNLOAD_SHA256 da57110002c76001dc9ca16eb217ea0d6c81a2b4bd3d8ad26a6fc5efe96c776d
+RUN rm -rf /usr/local/tomcat/webapps/* && \
+  mkdir -p /usr/local/tomcat/temp && \
+  mkdir -p /usr/local/xwiki/data && \
+  curl -fSL "${XWIKI_URL_PREFIX}/xwiki-platform-distribution-war-${XWIKI_VERSION}.war" -o xwiki.war && \
+  echo "$XWIKI_DOWNLOAD_SHA256 xwiki.war" | sha256sum -c - && \
+  unzip -d /usr/local/tomcat/webapps/ROOT xwiki.war && \
+  rm -f xwiki.war
+
+# Copy the JDBC driver in the XWiki webapp
+RUN cp /usr/share/java/postgresql-jdbc4.jar /usr/local/tomcat/webapps/ROOT/WEB-INF/lib/
+
+# Configure Tomcat. For example set the memory for the Tomcat JVM since the default value is too small for XWiki
+COPY tomcat/setenv.sh /usr/local/tomcat/bin/
+
+# Setup the XWiki Hibernate configuration
+COPY xwiki/hibernate.cfg.xml /usr/local/tomcat/webapps/ROOT/WEB-INF/hibernate.cfg.xml
+
+# Set a specific distribution id in XWiki for this docker packaging.
+RUN sed -i 's/<id>org.xwiki.platform:xwiki-platform-distribution-war/<id>org.xwiki.platform:xwiki-platform-distribution-docker/' \
+  /usr/local/tomcat/webapps/ROOT/META-INF/extension.xed
+
+# Add scripts required to make changes to XWiki configuration files at execution time
+# Note: we don't run CHMOD since 1) it's not required since the executabe bit is already set in git and 2) running
+# CHMOD after a COPY will sometimes fail, depending on different host-specific factors (especially on AUFS).
+COPY xwiki/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
+
+# Make the XWiki directory (the permanent directory is included in it) persist on the host (so that it's not recreated
+# across runs)
+VOLUME /usr/local/xwiki
+
+# At this point the image is done and what remains below are the runtime configuration used by the user to configure
+# the container that will be created out of the image. Namely the user can override some environment variables with
+#   docker run -e "var1=val1" -e "var2=val2" ...
+# The supported environment variables that can be overridden are:
+# - DB_USER: the name of the user configured for XWiki in the DB. Default is "xwiki". This is used to configure
+#            xwiki's hibernate.cfg.xml file.
+# - DB_PASSWORD: the password for the user configured for XWiki in the DB. Default is "xwiki". This is used to
+#                configure xwiki's hibernate.cfg.xml file.
+# - DB_DATABASE: the name of the database to use. Default is "xwiki". This is used to configure xwiki's
+#                hibernate.cfg.xml file.
+# - DB_HOST: The name of the host (or docker container) containing the database. Default is "db". This is used to
+#            configure xwiki's hibernate.cfg.xml file.
+# - CONTEXT_PATH: The name of the context path under which XWiki will be deployed in Tomcat. If not specified then it'll
+#                 be deployed as ROOT.
+
+# Example:
+#   docker run -it -e "DB_USER=xwiki" -e "DB_PASSWORD=xwiki" <imagename>
+
+# Starts XWiki by starting Tomcat. All options passed to "docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]"
+# are also passed to docker-entrypoint.sh. If "xwiki" is passed then XWiki will be configured the first time the
+# container executes and Tomcat will be started. If some other parameter is passed then it'll be executed to comply
+# with best practices defined at https://github.com/docker-library/official-images#consistency.
+ENTRYPOINT ["docker-entrypoint.sh"]
+CMD ["xwiki"]
diff --git a/12/postgres-tomcat/docker-compose.yml b/12/postgres-tomcat/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..65369cf889e2eb0ea5a68a48f43ce963e510f8c9
--- /dev/null
+++ b/12/postgres-tomcat/docker-compose.yml
@@ -0,0 +1,63 @@
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+version: '2'
+networks:
+  bridge:
+    driver: bridge
+services:
+  # The container that runs XWiki + Tomcat
+  web:
+    build: .
+    container_name: xwiki-postgres-tomcat-web
+    depends_on:
+      - db
+    ports:
+      - "8080:8080"
+    # Default values defined in .env file.
+    # The DB_USER/DB_PASSWORD/DB_DATABASE/DB_HOST variables are used in the hibernate.cfg.xml file.
+    environment:
+      - XWIKI_VERSION=${XWIKI_VERSION}
+      - DB_USER=${DB_USER}
+      - DB_PASSWORD=${DB_PASSWORD}
+      - DB_DATABASE=${DB_DATABASE}
+      - DB_HOST=xwiki-postgres-db
+    # Provide a name instead of an auto-generated id for xwiki data (the permanent directory in included in it)
+    # configured in the Dockerfile, to make it simpler to identify in 'docker volume ls'.
+    volumes:
+      - xwiki-data:/usr/local/xwiki
+    networks:
+      - bridge
+  # The container that runs the database (postgres)
+  db:
+    image: "postgres:12.1-alpine"
+    container_name: xwiki-postgres-db
+    volumes:
+      - postgres-data:/var/lib/postgresql/data
+    environment:
+      - POSTGRES_ROOT_PASSWORD=${POSTGRES_ROOT_PASSWORD}
+      - POSTGRES_PASSWORD=${DB_PASSWORD}
+      - POSTGRES_USER=${DB_USER}
+      - POSTGRES_DB=${DB_DATABASE}
+      - POSTGRES_INITDB_ARGS="--encoding=UTF8"
+    networks:
+      - bridge
+volumes:
+  postgres-data: {}
+  xwiki-data: {}
diff --git a/12/postgres-tomcat/tomcat/setenv.sh b/12/postgres-tomcat/tomcat/setenv.sh
new file mode 100755
index 0000000000000000000000000000000000000000..755f260ef22e6b02f80c92ae6a07d47610cec7b4
--- /dev/null
+++ b/12/postgres-tomcat/tomcat/setenv.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+
+# We're making the following changes to the default:
+# * Adding more memory (default is 512MB which is not enough for XWiki)
+# * By default, Tomcat does not allow the usage of encoded slash '%2F' and backslash '%5C' in URLs, as noted in
+#   https://tomcat.apache.org/security-6.html#Fixed_in_Apache_Tomcat_6.0.10. We want to allow for them as it's useful to
+#   be able to have '/' and '' in wiki page names.
+# * On some system /dev/random is slow to init leading to a slow Tomcat and thus Xwiki startup.
+
+# Users can override these values by setting the JAVA_OPTS environment variable. For example:
+# -e JAVA_OPTS="-Xmx2048m"
+
+XMX="-Xmx1024m"
+ALLOW_ENCODED_SLASH="-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true"
+ALLOW_BACKSLASH="-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true"
+SECURERANDOM="-Djava.security.egd=file:/dev/./urandom"
+
+if [[ ! -z "$JAVA_OPTS" ]]; then
+  if [[ ! $JAVA_OPTS =~ .*-Xmx[0-9]+.* ]]; then
+    JAVA_OPTS="$JAVA_OPTS $XMX"
+  fi
+  if [[ ! $JAVA_OPTS =~ .*ALLOW_ENCODED_SLASH.* ]]; then
+    JAVA_OPTS="$JAVA_OPTS $ALLOW_ENCODED_SLASH"
+  fi
+  if [[ ! $JAVA_OPTS =~ .*ALLOW_BACKSLASH.* ]]; then
+    JAVA_OPTS="$JAVA_OPTS $ALLOW_BACKSLASH"
+  fi
+  if [[ ! $JAVA_OPTS =~ .*java\.security\.egd.* ]]; then
+    JAVA_OPTS="$JAVA_OPTS $SECURERANDOM"
+  fi
+else
+  JAVA_OPTS="$XMX $ALLOW_ENCODED_SLASH $ALLOW_BACKSLASH $SECURERANDOM"
+fi
+
+export JAVA_OPTS
diff --git a/12/postgres-tomcat/xwiki/docker-entrypoint.sh b/12/postgres-tomcat/xwiki/docker-entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8f8685abb67724b9d16cadb18cf4ab7dc7006ce4
--- /dev/null
+++ b/12/postgres-tomcat/xwiki/docker-entrypoint.sh
@@ -0,0 +1,174 @@
+#!/bin/bash
+# ---------------------------------------------------------------------------
+# See the NOTICE file distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+# ---------------------------------------------------------------------------
+
+set -e
+
+function first_start() {
+  configure
+  touch /usr/local/tomcat/webapps/$CONTEXT_PATH/.first_start_completed
+}
+
+function other_starts() {
+  mkdir -p /usr/local/xwiki/data
+  restoreConfigurationFile 'hibernate.cfg.xml'
+  restoreConfigurationFile 'xwiki.cfg'
+  restoreConfigurationFile 'xwiki.properties'
+}
+
+# $1 - the path to xwiki.[cfg|properties]
+# $2 - the setting/property to set
+# $3 - the new value
+function xwiki_replace() {
+  sed -i s~"\#\? \?$2 \?=.*"~"$2=$3"~g "$1"
+}
+
+# $1 - the setting/property to set
+# $2 - the new value
+function xwiki_set_cfg() {
+  xwiki_replace /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/xwiki.cfg "$1" "$2"
+}
+
+# $1 - the setting/property to set
+# $2 - the new value
+function xwiki_set_properties() {
+  xwiki_replace /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/xwiki.properties "$1" "$2"
+}
+
+# usage: file_env VAR [DEFAULT]
+#    ie: file_env 'XYZ_DB_PASSWORD' 'example'
+# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
+#  "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
+file_env() {
+  local var="$1"
+  local fileVar="${var}_FILE"
+  local def="${2:-}"
+  if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
+    echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
+    exit 1
+  fi
+  local val="$def"
+  if [ "${!var:-}" ]; then
+    val="${!var}"
+  elif [ "${!fileVar:-}" ]; then
+    val="$(< "${!fileVar}")"
+  fi
+  export "$var"="$val"
+  unset "$fileVar"
+}
+
+# Allows to use sed but with user input which can contain special sed characters such as \, / or &.
+# $1 - the text to search for
+# $2 - the replacement text
+# $3 - the file in which to do the search/replace
+function safesed {
+  sed -i "s/$(echo $1 | sed -e 's/\([[\/.*]\|\]\)/\\&/g')/$(echo $2 | sed -e 's/[\/&]/\\&/g')/g" $3
+}
+
+# $1 - the config file name found in WEB-INF (e.g. "xwiki.cfg")
+function saveConfigurationFile() {
+  if [ -f "/usr/local/xwiki/data/$1" ]; then
+     echo "  Reusing existing config file $1..."
+     cp "/usr/local/xwiki/data/$1" "/usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/$1"
+  else
+     echo "  Saving config file $1..."
+     cp "/usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/$1" "/usr/local/xwiki/data/$1"
+  fi
+}
+
+# $1 - the config file name to restore in WEB-INF (e.g. "xwiki.cfg")
+function restoreConfigurationFile() {
+  if [ -f "/usr/local/xwiki/data/$1" ]; then
+     echo "  Synchronizing config file $1..."
+     cp "/usr/local/xwiki/data/$1" "/usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/$1"
+  else
+     echo "  No config file $1 found, using default from container..."
+     cp "/usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/$1" "/usr/local/xwiki/data/$1"
+  fi
+}
+
+function configure() {
+  echo 'Configuring XWiki...'
+
+  echo 'Setting environment variables'
+  file_env 'DB_USER' 'xwiki'
+  file_env 'DB_PASSWORD' 'xwiki'
+  file_env 'DB_HOST' 'db'
+  file_env 'DB_DATABASE' 'xwiki'
+  file_env 'INDEX_HOST' 'localhost'
+  file_env 'INDEX_PORT' '8983'
+
+  echo "  Deploying XWiki in the '$CONTEXT_PATH' context"
+  if [ "$CONTEXT_PATH" == "ROOT" ]; then
+    xwiki_set_cfg 'xwiki.webapppath' ''
+  else
+    mv /usr/local/tomcat/webapps/ROOT /usr/local/tomcat/webapps/$CONTEXT_PATH
+  fi
+
+  echo 'Replacing environment variables in files'
+  safesed "replaceuser" $DB_USER /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/hibernate.cfg.xml
+  safesed "replacepassword" $DB_PASSWORD /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/hibernate.cfg.xml
+  safesed "replacecontainer" $DB_HOST /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/hibernate.cfg.xml
+  safesed "replacedatabase" $DB_DATABASE /usr/local/tomcat/webapps/$CONTEXT_PATH/WEB-INF/hibernate.cfg.xml
+
+  echo '  Generating authentication validation and encryption keys...'
+  xwiki_set_cfg 'xwiki.authentication.validationKey' "$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)"
+  xwiki_set_cfg 'xwiki.authentication.encryptionKey' "$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)"
+
+  echo '  Setting permanent directory...'
+  xwiki_set_properties 'environment.permanentDirectory' '/usr/local/xwiki/data'
+  echo '  Configure libreoffice...'
+  xwiki_set_properties 'openoffice.autoStart' 'true'
+
+  if [ $INDEX_HOST != 'localhost' ]; then
+    echo '  Configuring remote Solr Index'
+    xwiki_set_properties 'solr.type' 'remote'
+    xwiki_set_properties 'solr.remote.url' "http://$INDEX_HOST:$INDEX_PORT/solr/xwiki"
+  fi
+
+  # If the files already exist then copy them to the XWiki's WEB-INF directory. Otherwise copy the default config
+  # files to the permanent directory so that they can be easily modified by the user. They'll be synced at the next
+  # start.
+  mkdir -p /usr/local/xwiki/data
+  saveConfigurationFile 'hibernate.cfg.xml'
+  saveConfigurationFile 'xwiki.cfg'
+  saveConfigurationFile 'xwiki.properties'
+}
+
+# This if will check if the first argument is a flag but only works if all arguments require a hyphenated flag
+# -v; -SL; -f arg; etc will work, but not arg1 arg2
+if [ "${1:0:1}" = '-' ]; then
+    set -- xwiki "$@"
+fi
+
+# Check for the expected command
+if [ "$1" = 'xwiki' ]; then
+  file_env 'CONTEXT_PATH' 'ROOT'
+  if [[ ! -f /usr/local/tomcat/webapps/$CONTEXT_PATH/.first_start_completed ]]; then
+    first_start
+  else
+    other_starts
+  fi
+  shift
+  set -- catalina.sh run "$@"
+fi
+
+# Else default to run whatever the user wanted like "bash"
+exec "$@"
diff --git a/12/postgres-tomcat/xwiki/hibernate.cfg.xml b/12/postgres-tomcat/xwiki/hibernate.cfg.xml
new file mode 100644
index 0000000000000000000000000000000000000000..348d39850be10a0c1e0f3c7cbce829ff4b7c4525
--- /dev/null
+++ b/12/postgres-tomcat/xwiki/hibernate.cfg.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+-->
+
+<!DOCTYPE hibernate-configuration PUBLIC
+  "-//Hibernate/Hibernate Configuration DTD//EN"
+  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+  <session-factory>
+
+    <!-- Please refer to the installation guide on
+         https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Installation/ for configuring your
+         database. You'll need to do 2 things:
+         1) Copy your database driver JAR in WEB-INF/lib or in some shared lib directory
+         2) Uncomment the properties below for your specific DB (and comment the default
+            database configuration if it doesn't match your DB)
+    -->
+
+    <!-- Generic parameters common to all Databases -->
+
+    <property name="show_sql">false</property>
+    <property name="use_outer_join">true</property>
+
+    <!-- Without it, some queries fail in MS SQL. XWiki doesn't need scrollable result sets, anyway. -->
+    <property name="jdbc.use_scrollable_resultset">false</property>
+
+    <!-- DBCP Connection Pooling configuration. Only some properties are shown. All available properties can be found
+         at https://commons.apache.org/proper/commons-dbcp/configuration.html
+    -->
+    <property name="dbcp.defaultAutoCommit">false</property>
+    <property name="dbcp.maxTotal">50</property>
+    <property name="dbcp.maxIdle">5</property>
+    <property name="dbcp.maxWaitMillis">30000</property>
+    <property name="connection.provider_class">com.xpn.xwiki.store.DBCPConnectionProvider</property>
+
+    <!-- Setting "dbcp.poolPreparedStatements" to true and "dbcp.maxOpenPreparedStatements" will tell DBCP to cache
+         Prepared Statements (it's off by default). Note that for backward compatibility the "dbcp.ps.maxActive" is also
+         supported and when set it'll set "dbcp.poolPreparedStatements" to true and "dbcp.maxOpenPreparedStatements" to
+         value of "dbcp.ps.maxActive".
+
+         Note 1: When using HSQLDB for example, it's important to NOT cache prepared statements because HSQLDB
+         Prepared Statements (PS) contain the schema on which they were initially created and thus when switching
+         schema if the same PS is reused it'll execute on the wrong schema! Since HSQLDB does internally cache
+         prepared statement there's no performance loss by not caching Prepared Statements at the DBCP level.
+         See https://jira.xwiki.org/browse/XWIKI-1740.
+         Thus we recommend not turning on this configuration for HSQLDB unless you know what you're doing :)
+
+         Note 2: The same applies to PostGreSQL.
+    -->
+
+    <!-- BoneCP Connection Pooling configuration.
+    <property name="bonecp.idleMaxAgeInMinutes">240</property>
+    <property name="bonecp.idleConnectionTestPeriodInMinutes">60</property>
+    <property name="bonecp.partitionCount">3</property>
+    <property name="bonecp.acquireIncrement">10</property>
+    <property name="bonecp.maxConnectionsPerPartition">60</property>
+    <property name="bonecp.minConnectionsPerPartition">20</property>
+    <property name="bonecp.statementsCacheSize">50</property>
+    <property name="bonecp.releaseHelperThreads">3</property>
+    <property name="connection.provider_class">com.xpn.xwiki.store.DBCPConnectionProvider</property>
+    -->
+
+    <!-- PostgreSQL configuration.
+         Notes:
+           - "jdbc.use_streams_for_binary" needs to be set to "false",
+             see https://community.jboss.org/wiki/HibernateCoreMigrationGuide36
+           - "xwiki.virtual_mode" can be set to either "schema" or "database". Note that currently the database mode
+             doesn't support database creation (see https://jira.xwiki.org/browse/XWIKI-8753)
+           - if you want the main wiki database to be different than "xwiki" (or "public" in schema mode)
+             you will also have to set the property xwiki.db in xwiki.cfg file
+    -->
+    <property name="connection.url">jdbc:postgresql://replacecontainer:5432/replacedatabase</property>
+    <property name="connection.username">replaceuser</property>
+    <property name="connection.password">replacepassword</property>
+    <property name="connection.driver_class">org.postgresql.Driver</property>
+    <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
+    <property name="jdbc.use_streams_for_binary">false</property>
+    <property name="xwiki.virtual_mode">schema</property>
+
+    <property name="hibernate.connection.charSet">UTF-8</property>
+    <property name="hibernate.connection.useUnicode">true</property>
+    <property name="hibernate.connection.characterEncoding">utf8</property>
+
+    <mapping resource="xwiki.postgresql.hbm.xml"/>
+    <mapping resource="feeds.hbm.xml"/>
+    <mapping resource="instance.hbm.xml"/>
+    <mapping resource="notification-filter-preferences.hbm.xml"/>
+    <mapping resource="mailsender.hbm.xml"/>
+    <mapping resource="activitystream.hbm.xml"/>
+  </session-factory>
+</hibernate-configuration>
diff --git a/template/docker-compose.yml b/template/docker-compose.yml
index cb74678c621408ac9ed2aff150fd0a998a9c30c2..09c7cae1fd691455ff628a68a598715ea8c8c507 100644
--- a/template/docker-compose.yml
+++ b/template/docker-compose.yml
@@ -67,7 +67,7 @@ services:
       - MYSQL_PASSWORD=\${DB_PASSWORD}
       - MYSQL_DATABASE=\${DB_DATABASE}'''
 
-    else if (db == 'postgres') print '''image: "postgres:12.1-alpine"
+    else if (db == 'postgres') print '''image: "postgres:12-alpine"
     container_name: xwiki-postgres-db
     volumes:
       - postgres-data:/var/lib/postgresql/data