diff --git a/14/solr-tomcat/.env b/14/solr-tomcat/.env new file mode 100644 index 00000000..893f1e01 --- /dev/null +++ b/14/solr-tomcat/.env @@ -0,0 +1,6 @@ +# Default environment values +XWIKI_VERSION=14.10.14 +DB_USER=xwiki +DB_PASSWORD=xwiki +DB_DATABASE=xwiki + diff --git a/14/solr-tomcat/Dockerfile b/14/solr-tomcat/Dockerfile new file mode 100644 index 00000000..10945a7a --- /dev/null +++ b/14/solr-tomcat/Dockerfile @@ -0,0 +1,107 @@ +# --------------------------------------------------------------------------- +# 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:9-jre11 + +# ____ ____ ____ ____ _ __ _ +# |_ _||_ _||_ _| |_ _|(_) [ | _ (_) +# \ \ / / \ \ /\ / / __ | | / ] __ +# > `' < \ \/ \/ / [ | | '' < [ | +# _/ /'`\ \_ \ /\ / | | | |`\ \ | | +# |____||____| \/ \/ [___][__| \_][___] + +LABEL org.opencontainers.image.authors='XWiki Development Team ' +LABEL org.opencontainers.image.url='https://hub.docker.com/_/xwiki' +LABEL org.opencontainers.image.documentation='https://hub.docker.com/_/xwiki' +LABEL org.opencontainers.image.source='https://github.com/xwiki/xwiki-docker.git' +LABEL org.opencontainers.image.vendor='xwiki.org' +LABEL org.opencontainers.image.licenses='LGPL-2.1' + +# 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 && \ + 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="14.10.14" +ENV XWIKI_URL_PREFIX "https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-distribution-war/${XWIKI_VERSION}" +ENV XWIKI_DOWNLOAD_SHA256 db20de131a847c8d9e52cc410db35216c494179dd2ac85dcf3cee9a35703bcb0 +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 + + +# 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/org.xwiki.platform:xwiki-platform-distribution-war/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" + +# 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/14/solr-tomcat/docker-compose.yml b/14/solr-tomcat/docker-compose.yml new file mode 100644 index 00000000..bbc935bb --- /dev/null +++ b/14/solr-tomcat/docker-compose.yml @@ -0,0 +1,54 @@ +# --------------------------------------------------------------------------- +# 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-solr-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-solr-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 (solr) + db: + + networks: + - bridge +volumes: + solr-data: {} + xwiki-data: {} diff --git a/14/solr-tomcat/solr/Dockerfile b/14/solr-tomcat/solr/Dockerfile new file mode 100644 index 00000000..5311be96 --- /dev/null +++ b/14/solr-tomcat/solr/Dockerfile @@ -0,0 +1,56 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +# Use the curl image to download required Solr cores +FROM curlimages/curl:8.2.0 AS downloader +WORKDIR /home/curl_user +ENV solrCoreUrl="https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-search-solr-server-core/14.10.14/xwiki-platform-search-solr-server-core-14.10.14.jar" +ENV solrMinimalCoreUrl="https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-search-solr-server-core-minimal/14.10.14/xwiki-platform-search-solr-server-core-minimal-14.10.14.zip" + +# Downloading the Solr cores +RUN curl https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-search-solr-server-core/14.10.14/xwiki-platform-search-solr-server-core-14.10.14.jar -o ./xwiki-server-core.zip && curl https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-search-solr-server-core-minimal/14.10.14/xwiki-platform-search-solr-server-core-minimal-14.10.14.zip -o ./xwiki-minimal-core.zip + +# Unzipping the downloaded Solr cores +FROM dockerqa/unzip:latest AS builder +COPY --from=downloader /home/curl_user/*.zip /unzip/ +RUN unzip -qq /unzip/xwiki-server-core.zip -d /home/xwiki && unzip -qq /unzip/xwiki-minimal-core.zip -d /home/xwiki_events && unzip -qq /unzip/xwiki-minimal-core.zip -d /home/xwiki_extension_index && unzip -qq /unzip/xwiki-minimal-core.zip -d /home/xwiki_ratings + +# Final image using the official Solr 8 image as the base +FROM solr:8 + +# ____ ____ ____ ____ _ __ _ +# |_ _||_ _||_ _| |_ _|(_) [ | _ (_) +# \ \ / / \ \ /\ / / __ | | / ] __ +# > `' < \ \/ \/ / [ | | '' < [ | +# _/ /'`\ \_ \ /\ / | | | |`\ \ | | +# |____||____| \/ \/ [___][__| \_][___] + +LABEL org.opencontainers.image.authors='XWiki Development Team ' +LABEL org.opencontainers.image.url='https://hub.docker.com/_/xwiki' +LABEL org.opencontainers.image.documentation='https://hub.docker.com/_/xwiki' +LABEL org.opencontainers.image.source='https://github.com/xwiki/xwiki-docker.git' +LABEL org.opencontainers.image.vendor='xwiki.org' +LABEL org.opencontainers.image.licenses='LGPL-2.1' + +# Copy Solr cores configuration to their respective locations +COPY --from=builder --chown=8983 /home /var/solr/data + +# Start Solr server +CMD ["solr-foreground"] \ No newline at end of file diff --git a/14/solr-tomcat/tomcat/setenv.sh b/14/solr-tomcat/tomcat/setenv.sh new file mode 100755 index 00000000..755f260e --- /dev/null +++ b/14/solr-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/14/solr-tomcat/xwiki/docker-entrypoint.sh b/14/solr-tomcat/xwiki/docker-entrypoint.sh new file mode 100755 index 00000000..e8de6d12 --- /dev/null +++ b/14/solr-tomcat/xwiki/docker-entrypoint.sh @@ -0,0 +1,179 @@ +#!/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 + + # Set any non-default main wiki database name in the xwiki.cfg file. + if [ "$DB_DATABASE" != "xwiki" ]; then + xwiki_set_cfg "xwiki.db" $DB_DATABASE + fi + + 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/14/solr-tomcat/xwiki/hibernate.cfg.xml b/14/solr-tomcat/xwiki/hibernate.cfg.xml new file mode 100644 index 00000000..79de6daf --- /dev/null +++ b/14/solr-tomcat/xwiki/hibernate.cfg.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + false + true + + + false + + + false + 50 + 5 + 30000 + com.xpn.xwiki.store.DBCPConnectionProvider + + + + + + + + diff --git a/15/solr-tomcat/.env b/15/solr-tomcat/.env new file mode 100644 index 00000000..4a169f30 --- /dev/null +++ b/15/solr-tomcat/.env @@ -0,0 +1,6 @@ +# Default environment values +XWIKI_VERSION=15.5 +DB_USER=xwiki +DB_PASSWORD=xwiki +DB_DATABASE=xwiki + diff --git a/15/solr-tomcat/Dockerfile b/15/solr-tomcat/Dockerfile new file mode 100644 index 00000000..5d8e1fe7 --- /dev/null +++ b/15/solr-tomcat/Dockerfile @@ -0,0 +1,107 @@ +# --------------------------------------------------------------------------- +# 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:9-jre11 + +# ____ ____ ____ ____ _ __ _ +# |_ _||_ _||_ _| |_ _|(_) [ | _ (_) +# \ \ / / \ \ /\ / / __ | | / ] __ +# > `' < \ \/ \/ / [ | | '' < [ | +# _/ /'`\ \_ \ /\ / | | | |`\ \ | | +# |____||____| \/ \/ [___][__| \_][___] + +LABEL org.opencontainers.image.authors='XWiki Development Team ' +LABEL org.opencontainers.image.url='https://hub.docker.com/_/xwiki' +LABEL org.opencontainers.image.documentation='https://hub.docker.com/_/xwiki' +LABEL org.opencontainers.image.source='https://github.com/xwiki/xwiki-docker.git' +LABEL org.opencontainers.image.vendor='xwiki.org' +LABEL org.opencontainers.image.licenses='LGPL-2.1' + +# 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 && \ + 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="15.5" +ENV XWIKI_URL_PREFIX "https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-distribution-war/${XWIKI_VERSION}" +ENV XWIKI_DOWNLOAD_SHA256 e552586d371da33b012cfbd974b3ba80d1b147a5c892ad6cf989960212cdaa02 +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 + + +# 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/org.xwiki.platform:xwiki-platform-distribution-war/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" + +# 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/15/solr-tomcat/docker-compose.yml b/15/solr-tomcat/docker-compose.yml new file mode 100644 index 00000000..bbc935bb --- /dev/null +++ b/15/solr-tomcat/docker-compose.yml @@ -0,0 +1,54 @@ +# --------------------------------------------------------------------------- +# 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-solr-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-solr-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 (solr) + db: + + networks: + - bridge +volumes: + solr-data: {} + xwiki-data: {} diff --git a/15/solr-tomcat/solr/Dockerfile b/15/solr-tomcat/solr/Dockerfile new file mode 100644 index 00000000..041b0c40 --- /dev/null +++ b/15/solr-tomcat/solr/Dockerfile @@ -0,0 +1,56 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +# Use the curl image to download required Solr cores +FROM curlimages/curl:8.2.0 AS downloader +WORKDIR /home/curl_user +ENV solrCoreUrl="https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-search-solr-server-core/15.5/xwiki-platform-search-solr-server-core-15.5.jar" +ENV solrMinimalCoreUrl="https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-search-solr-server-core-minimal/15.5/xwiki-platform-search-solr-server-core-minimal-15.5.zip" + +# Downloading the Solr cores +RUN curl https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-search-solr-server-core/15.5/xwiki-platform-search-solr-server-core-15.5.jar -o ./xwiki-server-core.zip && curl https://maven.xwiki.org/releases/org/xwiki/platform/xwiki-platform-search-solr-server-core-minimal/15.5/xwiki-platform-search-solr-server-core-minimal-15.5.zip -o ./xwiki-minimal-core.zip + +# Unzipping the downloaded Solr cores +FROM dockerqa/unzip:latest AS builder +COPY --from=downloader /home/curl_user/*.zip /unzip/ +RUN unzip -qq /unzip/xwiki-server-core.zip -d /home/xwiki && unzip -qq /unzip/xwiki-minimal-core.zip -d /home/xwiki_events && unzip -qq /unzip/xwiki-minimal-core.zip -d /home/xwiki_extension_index && unzip -qq /unzip/xwiki-minimal-core.zip -d /home/xwiki_ratings + +# Final image using the official Solr 8 image as the base +FROM solr:8 + +# ____ ____ ____ ____ _ __ _ +# |_ _||_ _||_ _| |_ _|(_) [ | _ (_) +# \ \ / / \ \ /\ / / __ | | / ] __ +# > `' < \ \/ \/ / [ | | '' < [ | +# _/ /'`\ \_ \ /\ / | | | |`\ \ | | +# |____||____| \/ \/ [___][__| \_][___] + +LABEL org.opencontainers.image.authors='XWiki Development Team ' +LABEL org.opencontainers.image.url='https://hub.docker.com/_/xwiki' +LABEL org.opencontainers.image.documentation='https://hub.docker.com/_/xwiki' +LABEL org.opencontainers.image.source='https://github.com/xwiki/xwiki-docker.git' +LABEL org.opencontainers.image.vendor='xwiki.org' +LABEL org.opencontainers.image.licenses='LGPL-2.1' + +# Copy Solr cores configuration to their respective locations +COPY --from=builder --chown=8983 /home /var/solr/data + +# Start Solr server +CMD ["solr-foreground"] \ No newline at end of file diff --git a/15/solr-tomcat/tomcat/setenv.sh b/15/solr-tomcat/tomcat/setenv.sh new file mode 100755 index 00000000..755f260e --- /dev/null +++ b/15/solr-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/15/solr-tomcat/xwiki/docker-entrypoint.sh b/15/solr-tomcat/xwiki/docker-entrypoint.sh new file mode 100755 index 00000000..e8de6d12 --- /dev/null +++ b/15/solr-tomcat/xwiki/docker-entrypoint.sh @@ -0,0 +1,179 @@ +#!/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 + + # Set any non-default main wiki database name in the xwiki.cfg file. + if [ "$DB_DATABASE" != "xwiki" ]; then + xwiki_set_cfg "xwiki.db" $DB_DATABASE + fi + + 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/15/solr-tomcat/xwiki/hibernate.cfg.xml b/15/solr-tomcat/xwiki/hibernate.cfg.xml new file mode 100644 index 00000000..79de6daf --- /dev/null +++ b/15/solr-tomcat/xwiki/hibernate.cfg.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + false + true + + + false + + + false + 50 + 5 + 30000 + com.xpn.xwiki.store.DBCPConnectionProvider + + + + + + + + diff --git a/template/solr/Dockerfile b/template/solr/Dockerfile index 7bcdf4de..3e1ee7b3 100644 --- a/template/solr/Dockerfile +++ b/template/solr/Dockerfile @@ -54,8 +54,7 @@ LABEL org.opencontainers.image.vendor='xwiki.org' LABEL org.opencontainers.image.licenses='LGPL-2.1' # Copy Solr cores configuration to their respective locations -COPY --from=builder --chown=8983 /home /opt/solr/server/solr/ +COPY --from=builder --chown=8983 /home /var/solr/data -# Precreate Solr cores and start Solr server -ENTRYPOINT ["bash"] -CMD ["-c", "precreate-core xwiki; precreate-core xwiki_events; precreate-core xwiki_extension_index; precreate-core xwiki_ratings; exec solr -f"] +# Start Solr server +CMD ["solr-foreground"] \ No newline at end of file