diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 13eb5732..ac64ff32 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,89 +1,30 @@ -# the different stages of this Dockerfile are meant to be built into separate images -# https://docs.docker.com/compose/compose-file/#target - -ARG PHP_VERSION=8.0 ARG NGINX_VERSION=1.17 -# Build assets in disposable node image -FROM node:11-alpine as armaforces_web_assets - -WORKDIR /tmp/app_build - -COPY package.json package-lock.json webpack.config.js ./ -RUN npm install - -WORKDIR /tmp/app_build/assets/ - -COPY assets ./ -RUN npm run build:ci - +# ----------------------------------------------------------------------------- +# PHP - Commonm +# ----------------------------------------------------------------------------- # Build PHP application image -FROM php:${PHP_VERSION}-fpm-alpine AS armaforces_web_php - -RUN apk add --no-cache \ - acl \ - fcgi \ - file \ - gettext \ - git \ - ; - -ARG APCU_VERSION=5.1.18 -RUN set -eux; \ - apk add --no-cache --virtual .build-deps \ - $PHPIZE_DEPS \ - icu-dev \ - libzip-dev \ - zlib-dev \ - ; \ - \ - docker-php-ext-configure zip; \ - docker-php-ext-install -j$(nproc) \ - intl \ - zip \ - pdo_mysql \ - ; \ - pecl install \ - apcu-${APCU_VERSION} \ - ; \ - pecl clear-cache; \ - docker-php-ext-enable \ - apcu \ - opcache \ - ; \ - \ - runDeps="$( \ - scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \ - | tr ',' '\n' \ - | sort -u \ - | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ - )"; \ - apk add --no-cache --virtual .api-phpexts-rundeps $runDeps; \ - \ - apk del .build-deps \ -; - -COPY --from=composer/composer:2-bin /composer /usr/bin/composer -RUN ln -s $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini -COPY .docker/php/conf.d/armaforces-web.ini $PHP_INI_DIR/conf.d/armaforces-web.ini +FROM thecodingmachine/php:8.1-v4-fpm-node12 AS armaforces_web_php -# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser -ENV COMPOSER_ALLOW_SUPERUSER=1 -ENV PATH="${PATH}:/root/.composer/vendor/bin" +# PHP Extensions +ENV \ + PHP_EXTENSION_INTL=1 -WORKDIR /www/app +# PHP ini configuration +# https://github.com/dunglas/symfony-docker/blob/380dc902595e0575c07f68f84e3266745e8f8100/docker/php/conf.d/symfony.prod.ini +ENV \ + PHP_INI_MEMORY_LIMIT=256M \ + PHP_INI_APC__ENABLE_CLI=1 \ + PHP_INI_DATE__TIMEZONE=Europe/Warsaw \ + PHP_INI_SESSION__AUTO_START=Off \ + PHP_INI_SHORT_OPEN_TAG=Off \ + PHP_INI_EXPOSE_PHP=Off -# build for production -ARG APP_ENV=prod +USER root -# prevent the reinstallation of vendors at every changes in the source code -COPY composer.json composer.lock symfony.lock .env ./ -RUN set -eux; \ - composer install --prefer-dist --no-dev --no-scripts --no-progress --no-suggest; \ - composer clear-cache +WORKDIR /application -# copy only specifically what we need COPY bin bin/ COPY config config/ COPY migrations migrations/ @@ -91,58 +32,87 @@ COPY public public/ COPY src src/ COPY templates templates/ COPY translations translations/ +COPY composer.json composer.lock symfony.lock .env ./ -RUN set -eux; \ - mkdir -p var/cache var/log; \ - composer dump-autoload --classmap-authoritative --no-dev; \ - composer run-script --no-dev post-install-cmd; \ - chmod +x bin/console; sync -VOLUME /www/app/var +COPY assets assets/ +COPY package.json package-lock.json webpack.config.js ./ -# copy assets manifests -COPY --from=armaforces_web_assets /tmp/app_build/public/build/ public/build/ +RUN mkdir -p var/cache var/log -COPY .docker/php/docker-entrypoint.sh /usr/local/bin/docker-entrypoint -RUN chmod +x /usr/local/bin/docker-entrypoint +RUN chown docker:docker -R /application +RUN chmod +x bin/console -# .env is copied again as COPY needs to copy at least one file -COPY .env VERSIO[N] ./ +USER docker -ENTRYPOINT ["docker-entrypoint"] -CMD ["php-fpm"] +# ----------------------------------------------------------------------------- +# PHP - Prod +# ----------------------------------------------------------------------------- +FROM armaforces_web_php AS armaforces_web_php_prod -FROM nginx:${NGINX_VERSION}-alpine AS armaforces_web_nginx +USER root -COPY .docker/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.template +ENV \ + TEMPLATE_PHP_INI=production \ + \ + PHP_INI_OPCACHE__INTERNED_STRINGS_BUFFER=16 \ + PHP_INI_OPCACHE__MAX_ACCELERATED_FILES=20000 \ + PHP_INI_OPCACHE__MEMORY_CONSUMPTION=256 \ + PHP_INI_OPCACHE__VALIDATE_TIMESTAMPS=0 \ + PHP_INI_REALPATH_CACHE_SIZE=4096K \ + PHP_INI_REALPATH_CACHE_TTL=600 \ + PHP_INI_OPCACHE__PRELOAD_USER=www-data \ + PHP_INI_OPCACHE__PRELOAD=/application/config/preload.php -WORKDIR /www/app +COPY .docker/php/startup.sh /etc/container/startup.sh +RUN chmod +x /etc/container/startup.sh -COPY --from=armaforces_web_php /www/app/public public/ +USER docker -COPY .docker/nginx/docker-entrypoint.sh /usr/local/bin/docker-entrypoint -RUN chmod +x /usr/local/bin/docker-entrypoint +RUN composer install --no-dev --no-progress --no-interaction --classmap-authoritative +RUN composer dump-env prod -ENTRYPOINT ["docker-entrypoint"] -CMD ["nginx", "-g", "daemon off;"] +RUN npm install +RUN npm run build +# ----------------------------------------------------------------------------- +# PHP - Dev +# ----------------------------------------------------------------------------- FROM armaforces_web_php AS armaforces_web_php_dev -ARG XDEBUG_VERSION=3.1.1 -RUN set -eux; \ - apk add --no-cache --virtual .build-deps $PHPIZE_DEPS; \ - pecl install xdebug-$XDEBUG_VERSION; \ - docker-php-ext-enable xdebug; \ - apk del .build-deps +USER root + +ENV \ + PHP_EXTENSION_XDEBUG=1 \ + PHP_INI_XDEBUG__MODE=debug,coverage \ + PHP_INI_XDEBUG__CLIENT_HOST=host.docker.internal \ + PHP_INI_XDEBUG__CLIENT_PORT=9003 \ + PHP_INI_XDEBUG__START_WITH_REQUEST=yes \ + PHP_INI_XDEBUG__IDEKEY=armaforces-web \ + PHP_INI_XDEBUG__LOG_LEVEL=0 -RUN apk add --no-cache \ - nodejs \ - npm +USER docker -ENV XDEBUG_INI_PATH=$PHP_INI_DIR/conf.d/docker-php-ext-xdebug.ini -COPY .docker/php/conf.d/docker-php-ext-xdebug.ini $XDEBUG_INI_PATH +RUN composer install --no-progress --no-interaction --classmap-authoritative -COPY .docker/php/scripts/xon.sh /usr/bin/xon -COPY .docker/php/scripts/xoff.sh /usr/bin/xoff -RUN chmod +x /usr/bin/xon /usr/bin/xoff +RUN npm install +RUN npm run build:ci + + +# ----------------------------------------------------------------------------- +# NGINX +# ----------------------------------------------------------------------------- +FROM nginx:${NGINX_VERSION}-alpine AS armaforces_web_nginx + +COPY .docker/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.template + +WORKDIR /application + +COPY --from=armaforces_web_php /application/public public/ + +COPY .docker/nginx/docker-entrypoint.sh /usr/local/bin/docker-entrypoint +RUN chmod +x /usr/local/bin/docker-entrypoint + +ENTRYPOINT ["docker-entrypoint"] +CMD ["nginx", "-g", "daemon off;"] diff --git a/.docker/nginx/conf.d/default.conf b/.docker/nginx/conf.d/default.conf index df5436aa..aa73cb91 100644 --- a/.docker/nginx/conf.d/default.conf +++ b/.docker/nginx/conf.d/default.conf @@ -1,5 +1,5 @@ server { - root /www/app/public; + root /application/public; client_max_body_size 8M; diff --git a/.docker/php/conf.d/armaforces-web.ini b/.docker/php/conf.d/armaforces-web.ini deleted file mode 100644 index e06bc3be..00000000 --- a/.docker/php/conf.d/armaforces-web.ini +++ /dev/null @@ -1,13 +0,0 @@ -# Borrowed from https://github.com/api-platform/api-platform/blob/master/api/docker/php/conf.d/api-platform.ini - -apc.enable_cli = 1 -date.timezone = Europe/Warsaw -session.auto_start = Off -short_open_tag = Off - -# http://symfony.com/doc/current/performance.html -opcache.interned_strings_buffer = 16 -opcache.max_accelerated_files = 20000 -opcache.memory_consumption = 256 -realpath_cache_size = 4096K -realpath_cache_ttl = 600 diff --git a/.docker/php/conf.d/docker-php-ext-xdebug.ini b/.docker/php/conf.d/docker-php-ext-xdebug.ini deleted file mode 100644 index 3765c917..00000000 --- a/.docker/php/conf.d/docker-php-ext-xdebug.ini +++ /dev/null @@ -1,9 +0,0 @@ -[XDebug] -;zend_extension = xdebug.so - -xdebug.idekey = armaforces-web -xdebug.mode = debug -xdebug.start_with_request = yes -xdebug.client_port = 9003 -xdebug.client_host = host.docker.internal -xdebug.log_level = 0 ;Prevents "Could not connect to debugging client" warnings diff --git a/.docker/php/docker-entrypoint.sh b/.docker/php/docker-entrypoint.sh deleted file mode 100644 index 8efb0283..00000000 --- a/.docker/php/docker-entrypoint.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh -set -e - -# Borrowed from https://github.com/api-platform/api-platform/blob/master/api/docker/php/docker-entrypoint.sh - -# first arg is `-f` or `--some-option` -if [ "${1#-}" != "$1" ]; then - set -- php-fpm "$@" -fi - -if [ "$1" = 'php-fpm' ] || [ "$1" = 'php' ] || [ "$1" = 'bin/console' ]; then - PHP_INI_RECOMMENDED="$PHP_INI_DIR/php.ini-production" - if [ "$APP_ENV" != 'prod' ]; then - PHP_INI_RECOMMENDED="$PHP_INI_DIR/php.ini-development" - fi - ln -sf "$PHP_INI_RECOMMENDED" "$PHP_INI_DIR/php.ini" - - mkdir -p var/cache var/log - setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX var || true - setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX var || true - - if [ "$APP_ENV" = 'prod' ]; then - php bin/console doctrine:migrations:migrate --allow-no-migration --no-interaction - fi -fi - -exec docker-php-entrypoint "$@" diff --git a/.docker/php/scripts/xoff.sh b/.docker/php/scripts/xoff.sh deleted file mode 100644 index 23ab3fe3..00000000 --- a/.docker/php/scripts/xoff.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -set -e - -sed -i "s|zend_extension = xdebug|;zend_extension = xdebug|" $XDEBUG_INI_PATH -echo "XDEBUG OFF" - -pkill -USR2 -o php-fpm diff --git a/.docker/php/scripts/xon.sh b/.docker/php/scripts/xon.sh deleted file mode 100644 index eca372cf..00000000 --- a/.docker/php/scripts/xon.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -set -e - -sed -i "s|;zend_extension = xdebug|zend_extension = xdebug|" $XDEBUG_INI_PATH -echo "XDEBUG ON" - -pkill -USR2 -o php-fpm diff --git a/.docker/php/startup.sh b/.docker/php/startup.sh new file mode 100644 index 00000000..866e1b00 --- /dev/null +++ b/.docker/php/startup.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e + +bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration diff --git a/.env b/.env index dfeabbe0..a849fc02 100644 --- a/.env +++ b/.env @@ -9,6 +9,7 @@ # Real environment variables win over .env files. # # DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# https://symfony.com/doc/current/configuration/secrets.html # # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). # https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration @@ -44,7 +45,7 @@ DATABASE_URL=mysql://root@mysql:3306/af_website?serverVersion=5.7 ###< doctrine/doctrine-bundle ### ###> symfony/mailer ### -# MAILER_DSN=smtp://localhost +# MAILER_DSN=null://null ###< symfony/mailer ### ###> nelmio/cors-bundle ### diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 2079091c..ed3b6a03 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -6,10 +6,7 @@ services: build: target: armaforces_web_php_dev volumes: - - './:/www/app:rw' - - './var/import:/www/app/var/import:ro' - - './var/cache:/www/app/var/cache:rw' - - './var/log:/www/app/var/log:rw' + - './:/application:rw' environment: PHP_IDE_CONFIG: serverName=armaforces-web extra_hosts: @@ -17,7 +14,7 @@ services: nginx: volumes: - - './public:/www/app/public:ro' + - './public:/application/public:ro' mysql: image: mysql:5.7 diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 68a5a54e..d2d69994 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -12,14 +12,14 @@ services: - docker.pkg.github.com/armaforces/website/app_php:dev volumes: # Extract files from runtime for QA tools - - './var:/www/app/var' - - './vendor:/www/app/vendor' + - './var:/application/var' + - './vendor:/application/vendor' # Copy tests into runtime - - './.env.test:/www/app/.env.test:ro' - - './tests:/www/app/tests:ro' - - './phpunit.xml.dist:/www/app/phpunit.xml.dist:ro' - - './.php-cs-fixer.dist.php:/www/app/.php-cs-fixer.dist.php:ro' - - './phpstan.neon.dist:/www/app/phpstan.neon.dist:ro' + - './.env.test:/application/.env.test:ro' + - './tests:/application/tests:ro' + - './phpunit.xml.dist:/application/phpunit.xml.dist:ro' + - './.php-cs-fixer.dist.php:/application/.php-cs-fixer.dist.php:ro' + - './phpstan.neon.dist:/application/phpstan.neon.dist:ro' depends_on: - mysql