FROM --platform=linux/amd64 ubuntu:20.04

ARG ARG_PHP_VERSION
ENV PHP_VERSION=${ARG_PHP_VERSION:-7.3}

ARG ARG_NODEJS_VERSION
ENV NODEJS_VERSION=${ARG_NODEJS_VERSION:-16}

ARG ARG_DRUSH_VERSION
ENV DRUSH_VERSION=${ARG_DRUSH_VERSION:-8.4.8}

ENV DISTRO_CODE_NAME="focal"
ENV DISTRO_RELEASE="20.04"

ENV DOCKER_BUILD_DIR="/tmp/build"
ENV APP_ROOT_DIR="/app"
ENV APACHE_DOCUMENT_ROOT=${APP_ROOT_DIR}

ENV BUILD_TIME_DEPS="apt-utils software-properties-common gnupg"
ENV RUN_TIME_DEPS="locales ca-certificates curl git zip unzip gettext-base"

WORKDIR ${DOCKER_BUILD_DIR}
COPY . ${DOCKER_BUILD_DIR}

RUN set -eux \
    # Suppress debian frontend warning
    && echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \
\
    # Install generic packages
    && apt-get update && apt-get install --no-install-recommends --assume-yes \
        ${BUILD_TIME_DEPS} ${RUN_TIME_DEPS} \
\
    # Generate locales
    && locale-gen en_US.UTF-8 && update-locale \
\
    # Add software repositories
    && add-apt-repository --yes --no-update ppa:ondrej/php \
    && add-apt-repository --yes --no-update ppa:ondrej/apache2 \
    && add-apt-repository --yes --no-update ppa:savoury1/ffmpeg4 \
    && add-apt-repository --yes --no-update ppa:chris-needham/ppa \
    && echo \
        "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODEJS_VERSION}.x ${DISTRO_CODE_NAME} main" \
          | tee /etc/apt/sources.list.d/nodejs.list \
    && echo \
        "deb [signed-by=/usr/share/keyrings/azul.gpg] https://repos.azul.com/zulu/deb stable main" \
          | tee /etc/apt/sources.list.d/zulu.list \
\
    # Install repository signing keys
    && curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key \
        | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg \
    && curl -s https://repos.azul.com/azul-repo.key \
        | gpg --dearmor -o /usr/share/keyrings/azul.gpg \
\
    # Install runtime packages
    && apt-get update && apt-get install --no-install-recommends --assume-yes \
        # MySQL client
        mysql-client \
\
        # PHP
        php${PHP_VERSION}-cli \
        php${PHP_VERSION}-curl \
        php${PHP_VERSION}-mbstring \
        php${PHP_VERSION}-intl \
        php${PHP_VERSION}-mysql \
        php${PHP_VERSION}-pgsql \
        php${PHP_VERSION}-sqlite3 \
        php${PHP_VERSION}-memcached \
        php${PHP_VERSION}-odbc \
        php${PHP_VERSION}-opcache \
        php${PHP_VERSION}-igbinary \
        php${PHP_VERSION}-redis \
        php${PHP_VERSION}-gd \
        php${PHP_VERSION}-imagick \
        php${PHP_VERSION}-dom \
        php${PHP_VERSION}-bcmath \
        php${PHP_VERSION}-gmp \
        php${PHP_VERSION}-imap \
        php${PHP_VERSION}-xml \
        php${PHP_VERSION}-zip \
        php${PHP_VERSION}-soap \
        php${PHP_VERSION}-readline \
        php${PHP_VERSION}-msgpack \
        php${PHP_VERSION}-json \
        php${PHP_VERSION}-ldap \
        php${PHP_VERSION}-geoip \
        php${PHP_VERSION}-mcrypt \
        protobuf-compiler \
\
        # NodeJS
        nodejs \
        zulu21-jdk \
\
        # Apache
        apache2 libapache2-mod-php${PHP_VERSION} libapache2-mod-rpaf \
\
        # Project runtime dependencies
        geoip-database \
\
    # Update NPM
    && npm install -g npm@8 \
    && npm install @openapitools/openapi-generator-cli -g \
\
    # Enable all available extensions for all SAPIs
    && phpenmod -v ${PHP_VERSION} -s ALL $(ls -A /etc/php/${PHP_VERSION}/mods-available/ | cut -d "." -f 1 | tr "\n" " ") \
\
    # Enable apache2 mods
    && a2enmod \
        actions alias deflate env expires headers http2 mime mime_magic remoteip \
        request rewrite ssl proxy proxy_http proxy_html proxy_connect substitute rpaf \
\
    # Copy default document to document root
    && rm -rf ${APACHE_DOCUMENT_ROOT} && mkdir -p ${APACHE_DOCUMENT_ROOT} && printf "<?php phpinfo();\n" > ${APACHE_DOCUMENT_ROOT}/index.php \
\
    # Generate self-signed certificate
    && openssl rand -writerand ~/.rnd && openssl req -x509 -nodes -days 3650 -new -newkey rsa:2048 \
        -subj "/C=CY/ST=DevOps/L=DevOps/O=DevOps/CN=dev.run/subjectAltName=DNS:*.dev.run" -addext "subjectAltName=DNS:*.dev.run" \
        -keyout /etc/ssl/private/apache-selfsigned.key \
        -out /etc/ssl/certs/apache-selfsigned.crt \
\
    # Generate medium Diffie-Hellman group
    && openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 \
\
    # Composer
    && curl -sL https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer && chmod +x /usr/local/bin/composer \
    && composer self-update \
\
    # Drush
    && curl -sL https://github.com/drush-ops/drush/releases/download/${DRUSH_VERSION}/drush.phar -o drush.phar \
    && mv drush.phar /usr/local/bin/drush && chmod +x /usr/local/bin/drush \
\
    # Setup virtual host template
    && /bin/cp -fra ${DOCKER_BUILD_DIR}/docker/images/web/config/apache/000-default.conf /etc/apache2/sites-available/000-default.conf.tpl \
\
    # Copy over custom Apache configuration files
    && /bin/cp -fra ${DOCKER_BUILD_DIR}/docker/images/web/config/apache/mods-available/rpaf.conf /etc/apache2/mods-available/rpaf.conf \
\
    # Copy over custom PHP configuration files
    && /bin/cp -fra ${DOCKER_BUILD_DIR}/docker/images/web/config/php/php.ini /etc/php/${PHP_VERSION}/cli/php.ini \
    && /bin/cp -fra ${DOCKER_BUILD_DIR}/docker/images/web/config/php/php.ini /etc/php/${PHP_VERSION}/apache2/php.ini \
\
    # Setup entrypoint
    && /bin/cp -fr ${DOCKER_BUILD_DIR}/docker/images/web/scripts/entrypoint-docker.sh /usr/local/bin/entrypoint-docker \
    && chmod a+x /usr/local/bin/entrypoint-docker \
\
    # Install tini init process manager
    && curl -sL https://github.com/krallin/tini/releases/latest/download/tini-amd64 -o /usr/local/bin/tini \
    && chmod +x /usr/local/bin/tini \
\
    # Cleanup
    && apt-get remove --assume-yes ${BUILD_TIME_DEPS} \
    && apt-get autoremove --assume-yes && apt-get --assume-yes autoclean && apt-get --assume-yes clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Change working directory to app
WORKDIR ${APP_ROOT_DIR}

# Configure locales
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

# Allow composer to be run as root
ENV COMPOSER_ALLOW_SUPERUSER 1

# https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop
STOPSIGNAL WINCH

# Expose ports
EXPOSE 80
EXPOSE 443

# Setup entrypoint
ENTRYPOINT ["/usr/local/bin/tini", "--", "entrypoint-docker"]
CMD ["run-http"]
