diff --git a/README.md b/README.md index 8b4bf5b..bca5b0a 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The apache image comes with an Apache Webserver and PHP installed. # Apache Configuration -To change to Apache Webserver configuration mount a Volume into the Container at: +To change to Apache Webserver configuration, mount a Volume into the Container at: - /etc/apache2/sites-available/000-default.conf @@ -19,7 +19,7 @@ See the example configuration provided. # Using the fpm image -To use the fpm image you need an additional web server that can proxy http-request to the fpm-port of the container. +To use the fpm image, you need an additional web server that can proxy http-request to the fpm-port of the container. See *docker-compose.fpm.yml* for example # Using an external database @@ -27,15 +27,39 @@ LimeSurvey requires an external database (MySQL, PostgreSQL) to run. See *docker # Persistent data -To preserve the uploaded files assign the upload folder into a volume. See *docker-compose.yml* for details. +To preserve the uploaded files assign the upload folder into a volume. See *docker-compose.yml* for example. + +Path: */var/www/html/upload/* # LimeSurvey Configuration -To change to LimeSurvey configuration simply mount a Volume into the Container at: +The entrypoint will create a new config.php if none is provided and run the LimeSurvey command line interface for installation. + +To change to LimeSurvey configuration, you can mount a Volume into the Container at: - /my-data/config.php:/var/www/html/application/config/config.php -**Hint**: If this configuration is present, the LimeSurvey Installer will not run. +**Hint**: If this configuration is present before the installation, the LimeSurvey Web Installer will not run automatically. + +# Environment Variables + +| Parameter | Description | +| --------- | ----------- | +| DB_TYPE | Database Type to use. mysql or postgresql | +| DB_HOST | Database server hostname | +| DB_PORT | Database server port | +| DB_NAME | Database name | +| DB_TABLE_PREFIX | Database table prefix | +| DB_USERNAME | Database user | +| DB_PASSWORD | Database user's password | +| ADMIN_USER | LimeSurvey Admin User | +| ADMIN_NAME | LimeSurvey Admin Username | +| ADMIN_EMAIL | LimeSurvey Admin Email | +| ADMIN_PASSWORD | LimeSurvey Admin Password | +| PUBLIC_URL | Public URL for public scripts | +| URL_FORMAT | URL Format. path or get | + +For further details on the settings see: https://manual.limesurvey.org/Optional_settings#Advanced_Path_Settings # References diff --git a/apache/Dockerfile b/apache/Dockerfile index 66eb0fc..84bc355 100644 --- a/apache/Dockerfile +++ b/apache/Dockerfile @@ -12,6 +12,7 @@ RUN apt-get update && \ libkrb5-dev \ libpng-dev \ libpq-dev \ + netcat \ && apt-get autoclean; apt-get autoremove && \ rm -rf /var/lib/apt/lists/* @@ -38,3 +39,7 @@ ADD "https://github.com/LimeSurvey/LimeSurvey/archive/${version}.tar.gz" /tmp RUN tar xzvf "/tmp/${version}.tar.gz" --strip-components=1 -C /var/www/html/ && \ rm "/tmp/${version}.tar.gz" && \ chown -R www-data:www-data /var/www/html + +COPY entrypoint.sh entrypoint.sh +ENTRYPOINT ["/var/www/html/entrypoint.sh"] +CMD ["apache2-foreground"] diff --git a/apache/entrypoint.sh b/apache/entrypoint.sh new file mode 120000 index 0000000..219ebb2 --- /dev/null +++ b/apache/entrypoint.sh @@ -0,0 +1 @@ +../entrypoint.sh \ No newline at end of file diff --git a/docker-compose.fpm.yml b/docker-compose.fpm.yml new file mode 100644 index 0000000..7e65e90 --- /dev/null +++ b/docker-compose.fpm.yml @@ -0,0 +1,35 @@ +version: "3.0" +services: + limesurvey: + build: + context: . + dockerfile: fpm/Dockerfile + volumes: + - /tmp/upload/:/var/www/html/upload/ + - lime:/var/www/html + links: + - lime-db + depends_on: + - lime-db + environment: + - "DB_HOST=docker-limesurvey_lime-db_1" + - "DB_PASSWORD=secret" + - "ADMIN_PASSWORD=foobar" + lime-web: + image: nginx + links: + - limesurvey + ports: + - "8080:80" + volumes: + - ./examples/nginx.conf:/etc/nginx/nginx.conf:ro + - lime:/var/www/html + lime-db: + image: mysql:5.7 + environment: + - "MYSQL_USER=limesurvey" + - "MYSQL_DATABASE=limesurvey" + - "MYSQL_PASSWORD=secret" + - "MYSQL_ROOT_PASSWORD=secret" +volumes: + lime: diff --git a/docker-compose.yml b/docker-compose.yml index d25b7e5..fd560b4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,10 @@ services: - lime-db ports: - "8080:80" + environment: + - "DB_HOST=docker-limesurvey_lime-db_1" + - "DB_PASSWORD=secret" + - "ADMIN_PASSWORD=foobar" lime-db: image: mysql:5.7 environment: diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..2449d1e --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +set -e + +DB_TYPE=${DB_TYPE:-'mysql'} +DB_HOST=${DB_HOST:-'mysql'} +DB_PORT=${DB_PORT:-'3306'} +DB_NAME=${DB_NAME:-'limesurvey'} +DB_TABLE_PREFIX=${DB_TABLE_PREFIX:-'lime_'} +DB_USERNAME=${DB_USERNAME:-'limesurvey'} +DB_PASSWORD=${DB_PASSWORD:-} + +ADMIN_USER=${ADMIN_USER:-'admin'} +ADMIN_NAME=${ADMIN_NAME:-'admin'} +ADMIN_EMAIL=${ADMIN_EMAIL:-'foobar@example.com'} +ADMIN_PASSWORD=${ADMIN_PASSWORD:-'-'} + +PUBLIC_URL=${PUBLIC_URL:-} +URL_FORMAT=${URL_FORMAT:-'path'} + + +# Check if DB_PASSWORD is set +if [ -z "$DB_PASSWORD" ]; then + echo >&2 'Error: Missing DB_PASSWORD' + exit 1 +fi + +# Check if DB_PASSWORD is set +if [ -z "$ADMIN_PASSWORD" ]; then + echo >&2 'Error: Missing ADMIN_PASSWORD' + exit 1 +fi + +# Check if already provisioned +if [ -f application/config/config.php ]; then + echo 'Info: config.php already provisioned' +else + echo 'Info: Generating config.php' + + if [ "$DB_TYPE" = 'mysql' ]; then + echo 'Info: Using MySQL configuration' + DB_CHARSET=${DB_CHARSET:-'utf8mb4'} + cp application/config/config-sample-mysql.php application/config/config.php + fi + + if [ "$DB_TYPE" = 'postgresql' ]; then + echo 'Info: Using PostgreSQL configuration' + DB_CHARSET=${DB_CHARSET:-'utf8'} + cp application/config/config-sample-pgsql.php application/config/config.php + fi + + # Set Database config + sed -i "s#\('connectionString' => \).*,\$#\\1'${DB_TYPE}:host=${DB_HOST};port=${DB_PORT};dbname=${DB_NAME};',#g" application/config/config.php + sed -i "s#\('username' => \).*,\$#\\1'${DB_USERNAME}',#g" application/config/config.php + sed -i "s#\('password' => \).*,\$#\\1'${DB_PASSWORD}',#g" application/config/config.php + sed -i "s#\('charset' => \).*,\$#\\1'${DB_CHARSET}',#g" application/config/config.php + sed -i "s#\('tablePrefix' => \).*,\$#\\1'${DB_TABLE_PREFIX}',#g" application/config/config.php + + # Set URL config + sed -i "s#\('urlFormat' => \).*,\$#\\1'${URL_FORMAT}',#g" application/config/config.php + + # Set Public URL + if [ -z "$PUBLIC_URL" ]; then + echo 'Info: Setting PublicURL' + sed -i "s#\('debug'=>0,\)\$#'publicurl'=>'${PUBLIC_URL}',\n\t\t\\1 #g" application/config/config.php + fi +fi + +until nc -z -v -w30 $DB_HOST $DB_PORT +do + echo "Info: Waiting for database connection..." + sleep 5 +done + +echo 'Running console.php install' +# Hint: The console.php script seems to always exit with 1, so that is why +php application/commands/console.php install $ADMIN_USER $ADMIN_PASSWORD $ADMIN_NAME $ADMIN_EMAIL || true + +exec "$@" diff --git a/apache-example.conf b/examples/apache-example.conf similarity index 100% rename from apache-example.conf rename to examples/apache-example.conf diff --git a/examples/nginx.conf b/examples/nginx.conf new file mode 100644 index 0000000..8ec070e --- /dev/null +++ b/examples/nginx.conf @@ -0,0 +1,37 @@ +worker_processes 1; + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + server { + listen 80; + index index.php; + set $host_path "/var/www/html"; + root /var/www/html; + server_name localhost; + charset utf-8; + location / { + try_files $uri /index.php?$args; + } + location ~ ^/(protected|framework|themes/\w+/views) { + deny all; + } + location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { + try_files $uri =404; + } + location ~ \.php$ { + fastcgi_split_path_info ^(.+\.php)(.*)$; + try_files $uri index.php; + include fastcgi_params; + fastcgi_index index.php; + fastcgi_pass limesurvey:9000; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param SCRIPT_NAME $fastcgi_script_name; + } + } +} diff --git a/fpm/Dockerfile b/fpm/Dockerfile index d879edc..7bfc55a 100644 --- a/fpm/Dockerfile +++ b/fpm/Dockerfile @@ -12,6 +12,7 @@ RUN apt-get update && \ libkrb5-dev \ libpng-dev \ libpq-dev \ + netcat \ && apt-get autoclean; apt-get autoremove && \ rm -rf /var/lib/apt/lists/* @@ -38,3 +39,9 @@ ADD "https://github.com/LimeSurvey/LimeSurvey/archive/${version}.tar.gz" /tmp RUN tar xzvf "/tmp/${version}.tar.gz" --strip-components=1 -C /var/www/html/ && \ rm "/tmp/${version}.tar.gz" && \ chown -R www-data:www-data /var/www/html + +EXPOSE 9000 + +COPY entrypoint.sh entrypoint.sh +ENTRYPOINT ["/var/www/html/entrypoint.sh"] +CMD ["php-fpm"] diff --git a/fpm/entrypoint.sh b/fpm/entrypoint.sh new file mode 120000 index 0000000..219ebb2 --- /dev/null +++ b/fpm/entrypoint.sh @@ -0,0 +1 @@ +../entrypoint.sh \ No newline at end of file diff --git a/tests/image_tests.yaml b/tests/image_tests.yaml index 8a07bda..2d316e1 100644 --- a/tests/image_tests.yaml +++ b/tests/image_tests.yaml @@ -8,6 +8,9 @@ fileContentTests: - name: 'Limesurvey admin file content' path: '/var/www/html/admin/index.php' expectedContents: ['LimeSurvey'] + - name: 'Entrypoint file content' + path: '/var/www/html/entrypoint.sh' + expectedContents: ['console.php', 'ADMIN_USER'] fileExistenceTests: - name: 'Limesurvey files' @@ -47,6 +50,10 @@ fileExistenceTests: shouldExist: true commandTests: + - name: "Dependencies - netcat" + command: "dpkg" + args: ["-l", "netcat"] + exitCode: 0 - name: "Dependencies - libldap2-dev" command: "dpkg" args: ["-l", "libldap2-dev"]