From 599bdb3d8dcce85f603b951a43f98c36063cf747 Mon Sep 17 00:00:00 2001
From: Ryszard <212223@users.noreply.github.com>
Date: Mon, 21 Mar 2022 14:26:29 +0100
Subject: [PATCH 01/23] Conversion to docker-compose
---
README.md | 1523 ++++++++++++-
.../.elasticsearch-http-requests}/Check.http | 0
.../Document/Create_or_Update.http | 0
.../Index/Bulk.http | 0
.../Index/Count.http | 0
.../Index/Create.http | 0
.../Index/Delete.http | 0
.../Index/Mappings.http | 0
.../Search/All_structure.http | 0
.../Search/Functions.http | 0
.../Search/Functions_colors.http | 0
.../Search/Phrase.http | 0
.../.elasticsearch-http-requests/init.sh | 12 +
.../.elasticsearch-http-requests/request.sh | 84 +
src/Controller/.gitignore => app/default/.env | 0
.gitignore => app/default/.gitignore | 0
app/default/LICENSE | 21 +
{bin => app/default/bin}/console | 0
composer.json => app/default/composer.json | 3 +-
composer.lock => app/default/composer.lock | 241 +--
{config => app/default/config}/bundles.php | 0
.../default/config}/packages/cache.yaml | 0
.../default/config}/packages/framework.yaml | 0
.../default/config}/packages/routing.yaml | 0
.../packages/sensio_framework_extra.yaml | 0
.../default/config}/packages/twig.yaml | 0
{config => app/default/config}/preload.php | 0
{config => app/default/config}/routes.yaml | 0
.../default/config}/routes/annotations.yaml | 0
.../default/config}/routes/framework.yaml | 0
{config => app/default/config}/services.yaml | 0
insomnia.json => app/default/insomnia.json | 0
.../default/public}/bootstrap.bundle.min.js | 0
.../default/public}/bootstrap.min.css | 0
{public => app/default/public}/favicon.ico | Bin
{public => app/default/public}/favicon.png | Bin
.../images/cars/aston-martin-db7-gt.jpg | Bin
.../images/cars/aston-martin-db7-vantage.jpg | Bin
.../images/cars/aston-martin-db7-zagato.jpg | Bin
.../images/cars/bmw-i8-roadster-2019.jpg | Bin
.../public}/images/cars/bmw-i8-roadster.jpg | Bin
.../public}/images/cars/dodge-challenger.jpg | Bin
.../public}/images/cars/dodge-viper-gts.jpg | Bin
.../cars/dodge-viper-srt10-roadster.jpg | Bin
.../images/cars/ferrari-250-gt-california.jpg | Bin
.../public}/images/cars/ferrari-296-gtb.jpg | Bin
.../images/cars/ferrari-550-maranello.jpg | Bin
.../public}/images/cars/ferrari-f8-spider.jpg | Bin
.../public}/images/cars/ferrari-roma.jpg | Bin
.../public}/images/cars/ferrari-sf90.jpg | Bin
.../images/cars/ferrari-testarossa.jpg | Bin
.../default/public}/images/cars/ford-gt.jpg | Bin
.../images/cars/ford-mustang-boss-302.jpg | Bin
.../public}/images/cars/ford-mustang-rtr.jpg | Bin
.../images/cars/lamborghini-aventador.jpg | Bin
.../images/cars/lamborghini-countach.jpg | Bin
.../images/cars/lamborghini-diablo.jpg | Bin
.../images/cars/lamborghini-huracan.jpg | Bin
.../cars/lamborghini-murcielago-lp670.jpg | Bin
.../public}/images/cars/lamborghini-sc20.jpg | Bin
.../public}/images/cars/mazda-mx5-miata.jpg | Bin
.../public}/images/cars/mazda-mx5-z-sport.jpg | Bin
.../cars/mazda-rx-vision-gt3-concept.jpg | Bin
.../public}/images/cars/mclaren-570s.jpg | Bin
.../public}/images/cars/mclaren-720s.jpg | Bin
.../public}/images/cars/mclaren-f1.jpg | Bin
.../cars/mercedes-benz-amg-gt-coupe.jpg | Bin
.../public}/images/cars/mercedes-benz-gt.jpg | Bin
.../cars/mercedes-benz-sls-amg-coupe.jpg | Bin
...mercedes-mclaren-slr-722-stirling-moss.jpg | Bin
.../images/cars/mitsubishi-lancer-evo-x.jpg | Bin
.../public}/images/cars/porshe-911-gts.jpg | Bin
.../public}/images/cars/porshe-911-swb.jpg | Bin
.../images/cars/porshe-911-turbo-s.jpg | Bin
.../public}/images/cars/porshe-macan.jpg | Bin
{public => app/default/public}/index.php | 0
{public => app/default/public}/jquery.min.js | 0
{public => app/default/public}/main.css | 0
.../default/public}/select2.min.css | 0
{public => app/default/public}/select2.min.js | 0
app/default/src/Controller/.gitignore | 0
.../src}/Controller/DefaultController.php | 9 +
.../ParamConverter/AbstractParamConverter.php | 0
.../ParamConverter/CriteriaParamConverter.php | 0
.../ParamConverter/PageParamConverter.php | 2 +-
.../Elasticsearch/Hydrator/CarHydrator.php | 0
.../Hydrator/CarHydratorInterface.php | 0
.../Elasticsearch/Hydrator/CarsHydrator.php | 0
.../Hydrator/CarsHydratorInterface.php | 0
.../Repository/CarRepository.php | 12 +-
.../src}/Elasticsearch/Service/ApiClient.php | 5 +-
.../Service/ApiClientInterface.php | 0
.../ValueObject/Criteria/ColorsFilter.php | 0
.../ValueObject/Criteria/Criteria.php | 5 +
.../ValueObject/Criteria/Criterion.php | 0
.../ValueObject/Criteria/PhraseFilter.php | 0
.../ValueObject/Criteria/ServicesFilter.php | 0
.../Factor/ColorRelevanceFactor.php | 0
.../ValueObject/Factor/DodgePromoFactor.php | 0
.../ValueObject/Factor/FactorInterface.php | 0
.../ValueObject/Factor/Factors.php | 0
.../ValueObject/Factor/RawScoreFactor.php | 0
.../ValueObject/Factor/Weight.php | 0
.../ValueObject/Factor/WeightFactor.php | 0
.../src}/Elasticsearch/ValueObject/Query.php | 0
.../Elasticsearch/ValueObject/Response.php | 0
.../src}/Elasticsearch/ValueObject/Result.php | 0
.../Elasticsearch/ValueObject/Results.php | 0
.../ValueObject/Sorter/DefaultSorter.php | 0
.../Sorter/FactorSorterInterface.php | 0
.../ValueObject/Sorter/RecommendedSorter.php | 0
.../ValueObject/Sorter/SorterInterface.php | 0
.../default/src}/Enum/AbstractEnum.php | 0
{src => app/default/src}/Enum/Color.php | 0
{src => app/default/src}/Enum/Index.php | 0
.../PaginationEventSubscriber.php | 0
{src => app/default/src}/Kernel.php | 0
.../AdditionalServiceRepositoryInterface.php | 0
.../Repository/CarRepositoryInterface.php | 0
.../InMemoryAdditionalServiceRepository.php | 0
.../src}/Twig/Extension/AppExtension.php | 0
.../src}/ValueObject/AdditionalService.php | 0
.../src}/ValueObject/AdditionalServices.php | 0
{src => app/default/src}/ValueObject/Car.php | 0
{src => app/default/src}/ValueObject/Cars.php | 0
.../default/src}/ValueObject/Colors.php | 0
.../src}/ValueObject/CriteriaInterface.php | 0
.../src}/ValueObject/CriterionInterface.php | 0
{src => app/default/src}/ValueObject/Id.php | 0
.../default/src}/ValueObject/Model.php | 0
{src => app/default/src}/ValueObject/Name.php | 0
{src => app/default/src}/ValueObject/Page.php | 0
.../default/src}/ValueObject/PagesTotal.php | 4 +-
.../ValueObject/PagesTotalAwareInterface.php | 0
.../default/src}/ValueObject/Pagination.php | 0
.../default/src}/ValueObject/Phrase.php | 0
.../default/src}/ValueObject/Picture.php | 0
.../default/src}/ValueObject/Producer.php | 0
.../src}/ValueObject/ProductionYear.php | 0
.../src}/ValueObject/ResultsPerPage.php | 0
.../ValueObject/SearchResponseInterface.php | 0
.../ValueObject/SearchResultsInterface.php | 0
symfony.lock => app/default/symfony.lock | 0
.../default/templates}/base.html.twig | 0
.../templates}/search/_includes/car.html.twig | 0
.../search/_includes/filters.html.twig | 0
.../search/_includes/pagination.html.twig | 0
.../search/_includes/services.html.twig | 0
.../templates}/search/emptyList.html.twig | 0
.../default/templates}/search/list.html.twig | 0
docker/service/.env | 20 +
docker/service/.gitignore | 1 +
docker/service/README.md | 335 +++
docker/service/_limit-memory.yaml | 7 +
docker/service/_network.yaml | 52 +
docker/service/_profiles.yaml | 52 +
docker/service/_restart-policy.yaml | 16 +
docker/service/_service-dependency.yaml | 21 +
docker/service/dirlist.txt | 107 +
docker/service/docker-compose.yaml | 9 +
docker/service/elasticsearch-v7.yaml | 111 +
.../elasticsearch-v7/image/.dockerignore | 2 +
.../service/elasticsearch-v7/image/.env.dev | 10 +
.../service/elasticsearch-v7/image/Dockerfile | 14 +
.../config/elasticsearch-plugins.example.yml | 27 +
.../config/elasticsearch.keystore | Bin 0 -> 199 bytes
.../elasticsearch/config/elasticsearch.yml | 2 +
.../share/elasticsearch/config/jvm.options | 96 +
.../config/log4j2.file.properties | 282 +++
.../elasticsearch/config/log4j2.properties | 159 ++
.../elasticsearch/config/role_mapping.yml | 14 +
.../usr/share/elasticsearch/config/roles.yml | 3 +
.../usr/share/elasticsearch/config/users | 0
.../share/elasticsearch/config/users_roles | 0
docker/service/nginx-v1.yaml | 117 +
docker/service/nginx-v1/image/.dockerignore | 2 +
docker/service/nginx-v1/image/.env.dev | 0
docker/service/nginx-v1/image/.gitignore | 2 +
docker/service/nginx-v1/image/Dockerfile | 16 +
.../image/files/etc/nginx/conf.d/default.conf | 35 +
.../image/files/etc/nginx/fastcgi_params | 25 +
.../nginx-v1/image/files/etc/nginx/koi-utf | 109 +
.../nginx-v1/image/files/etc/nginx/koi-win | 103 +
.../nginx-v1/image/files/etc/nginx/mime.types | 97 +
.../nginx-v1/image/files/etc/nginx/modules | 1 +
.../nginx-v1/image/files/etc/nginx/nginx.conf | 36 +
.../image/files/etc/nginx/scgi_params | 17 +
.../image/files/etc/nginx/uwsgi_params | 17 +
.../nginx-v1/image/files/etc/nginx/win-utf | 126 ++
docker/service/nginx-v1/image/files/site.conf | 7 +
docker/service/php-composer-v2.yaml | 47 +
docker/service/php-composer-v2/.env.dev | 0
.../service/php-composer-v2/image/Dockerfile | 21 +
docker/service/php-fpm-v8.yaml | 29 +
docker/service/php-fpm-v8/image/.dockerignore | 2 +
docker/service/php-fpm-v8/image/.env.dev | 2 +
docker/service/php-fpm-v8/image/Dockerfile | 2 +
.../etc/php/conf.d/docker-php-ext-bcmath.ini | 1 +
.../php/conf.d/docker-php-ext-calendar.ini | 1 +
.../etc/php/conf.d/docker-php-ext-dba.ini | 1 +
.../etc/php/conf.d/docker-php-ext-exif.ini | 1 +
.../etc/php/conf.d/docker-php-ext-gd.ini | 1 +
.../etc/php/conf.d/docker-php-ext-gettext.ini | 1 +
.../etc/php/conf.d/docker-php-ext-imagick.ini | 1 +
.../etc/php/conf.d/docker-php-ext-mongodb.ini | 1 +
.../etc/php/conf.d/docker-php-ext-mysqli.ini | 1 +
.../etc/php/conf.d/docker-php-ext-opcache.ini | 1 +
.../etc/php/conf.d/docker-php-ext-pcntl.ini | 1 +
.../php/conf.d/docker-php-ext-pdo_mysql.ini | 1 +
.../php/conf.d/docker-php-ext-pdo_pgsql.ini | 1 +
.../etc/php/conf.d/docker-php-ext-pgsql.ini | 1 +
.../etc/php/conf.d/docker-php-ext-pspell.ini | 1 +
.../etc/php/conf.d/docker-php-ext-shmop.ini | 1 +
.../etc/php/conf.d/docker-php-ext-soap.ini | 1 +
.../etc/php/conf.d/docker-php-ext-sockets.ini | 1 +
.../etc/php/conf.d/docker-php-ext-sodium.ini | 1 +
.../etc/php/conf.d/docker-php-ext-svm.ini | 1 +
.../etc/php/conf.d/docker-php-ext-sysvmsg.ini | 1 +
.../etc/php/conf.d/docker-php-ext-sysvsem.ini | 1 +
.../etc/php/conf.d/docker-php-ext-sysvshm.ini | 1 +
.../etc/php/conf.d/docker-php-ext-tidy.ini | 1 +
.../etc/php/conf.d/docker-php-ext-trader.ini | 1 +
.../etc/php/conf.d/docker-php-ext-wddx.ini | 1 +
.../etc/php/conf.d/docker-php-ext-xmlrpc.ini | 1 +
.../etc/php/conf.d/docker-php-ext-xsl.ini | 1 +
.../etc/php/conf.d/docker-php-ext-zip.ini | 1 +
.../files/usr/local/etc/php/conf.d/php.ini | 3 +
.../usr/local/etc/php/php.ini-development | 1916 ++++++++++++++++
.../usr/local/etc/php/php.ini-production | 1923 +++++++++++++++++
docker/service/setup.sh | 90 +
230 files changed, 7892 insertions(+), 143 deletions(-)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Check.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Document/Create_or_Update.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Index/Bulk.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Index/Count.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Index/Create.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Index/Delete.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Index/Mappings.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Search/All_structure.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Search/Functions.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Search/Functions_colors.http (100%)
rename {.elasticsearch-http-requests => app/default/.elasticsearch-http-requests}/Search/Phrase.http (100%)
create mode 100755 app/default/.elasticsearch-http-requests/init.sh
create mode 100755 app/default/.elasticsearch-http-requests/request.sh
rename src/Controller/.gitignore => app/default/.env (100%)
rename .gitignore => app/default/.gitignore (100%)
create mode 100644 app/default/LICENSE
rename {bin => app/default/bin}/console (100%)
mode change 100755 => 100644
rename composer.json => app/default/composer.json (96%)
rename composer.lock => app/default/composer.lock (96%)
rename {config => app/default/config}/bundles.php (100%)
rename {config => app/default/config}/packages/cache.yaml (100%)
rename {config => app/default/config}/packages/framework.yaml (100%)
rename {config => app/default/config}/packages/routing.yaml (100%)
rename {config => app/default/config}/packages/sensio_framework_extra.yaml (100%)
rename {config => app/default/config}/packages/twig.yaml (100%)
rename {config => app/default/config}/preload.php (100%)
rename {config => app/default/config}/routes.yaml (100%)
rename {config => app/default/config}/routes/annotations.yaml (100%)
rename {config => app/default/config}/routes/framework.yaml (100%)
rename {config => app/default/config}/services.yaml (100%)
rename insomnia.json => app/default/insomnia.json (100%)
rename {public => app/default/public}/bootstrap.bundle.min.js (100%)
rename {public => app/default/public}/bootstrap.min.css (100%)
rename {public => app/default/public}/favicon.ico (100%)
rename {public => app/default/public}/favicon.png (100%)
rename {public => app/default/public}/images/cars/aston-martin-db7-gt.jpg (100%)
rename {public => app/default/public}/images/cars/aston-martin-db7-vantage.jpg (100%)
rename {public => app/default/public}/images/cars/aston-martin-db7-zagato.jpg (100%)
rename {public => app/default/public}/images/cars/bmw-i8-roadster-2019.jpg (100%)
rename {public => app/default/public}/images/cars/bmw-i8-roadster.jpg (100%)
rename {public => app/default/public}/images/cars/dodge-challenger.jpg (100%)
rename {public => app/default/public}/images/cars/dodge-viper-gts.jpg (100%)
rename {public => app/default/public}/images/cars/dodge-viper-srt10-roadster.jpg (100%)
rename {public => app/default/public}/images/cars/ferrari-250-gt-california.jpg (100%)
rename {public => app/default/public}/images/cars/ferrari-296-gtb.jpg (100%)
rename {public => app/default/public}/images/cars/ferrari-550-maranello.jpg (100%)
rename {public => app/default/public}/images/cars/ferrari-f8-spider.jpg (100%)
rename {public => app/default/public}/images/cars/ferrari-roma.jpg (100%)
rename {public => app/default/public}/images/cars/ferrari-sf90.jpg (100%)
rename {public => app/default/public}/images/cars/ferrari-testarossa.jpg (100%)
rename {public => app/default/public}/images/cars/ford-gt.jpg (100%)
rename {public => app/default/public}/images/cars/ford-mustang-boss-302.jpg (100%)
rename {public => app/default/public}/images/cars/ford-mustang-rtr.jpg (100%)
rename {public => app/default/public}/images/cars/lamborghini-aventador.jpg (100%)
rename {public => app/default/public}/images/cars/lamborghini-countach.jpg (100%)
rename {public => app/default/public}/images/cars/lamborghini-diablo.jpg (100%)
rename {public => app/default/public}/images/cars/lamborghini-huracan.jpg (100%)
rename {public => app/default/public}/images/cars/lamborghini-murcielago-lp670.jpg (100%)
rename {public => app/default/public}/images/cars/lamborghini-sc20.jpg (100%)
rename {public => app/default/public}/images/cars/mazda-mx5-miata.jpg (100%)
rename {public => app/default/public}/images/cars/mazda-mx5-z-sport.jpg (100%)
rename {public => app/default/public}/images/cars/mazda-rx-vision-gt3-concept.jpg (100%)
rename {public => app/default/public}/images/cars/mclaren-570s.jpg (100%)
rename {public => app/default/public}/images/cars/mclaren-720s.jpg (100%)
rename {public => app/default/public}/images/cars/mclaren-f1.jpg (100%)
rename {public => app/default/public}/images/cars/mercedes-benz-amg-gt-coupe.jpg (100%)
rename {public => app/default/public}/images/cars/mercedes-benz-gt.jpg (100%)
rename {public => app/default/public}/images/cars/mercedes-benz-sls-amg-coupe.jpg (100%)
rename {public => app/default/public}/images/cars/mercedes-mclaren-slr-722-stirling-moss.jpg (100%)
rename {public => app/default/public}/images/cars/mitsubishi-lancer-evo-x.jpg (100%)
rename {public => app/default/public}/images/cars/porshe-911-gts.jpg (100%)
rename {public => app/default/public}/images/cars/porshe-911-swb.jpg (100%)
rename {public => app/default/public}/images/cars/porshe-911-turbo-s.jpg (100%)
rename {public => app/default/public}/images/cars/porshe-macan.jpg (100%)
rename {public => app/default/public}/index.php (100%)
rename {public => app/default/public}/jquery.min.js (100%)
rename {public => app/default/public}/main.css (100%)
rename {public => app/default/public}/select2.min.css (100%)
rename {public => app/default/public}/select2.min.js (100%)
create mode 100644 app/default/src/Controller/.gitignore
rename {src => app/default/src}/Controller/DefaultController.php (92%)
rename {src => app/default/src}/Controller/ParamConverter/AbstractParamConverter.php (100%)
rename {src => app/default/src}/Controller/ParamConverter/CriteriaParamConverter.php (100%)
rename {src => app/default/src}/Controller/ParamConverter/PageParamConverter.php (95%)
rename {src => app/default/src}/Elasticsearch/Hydrator/CarHydrator.php (100%)
rename {src => app/default/src}/Elasticsearch/Hydrator/CarHydratorInterface.php (100%)
rename {src => app/default/src}/Elasticsearch/Hydrator/CarsHydrator.php (100%)
rename {src => app/default/src}/Elasticsearch/Hydrator/CarsHydratorInterface.php (100%)
rename {src => app/default/src}/Elasticsearch/Repository/CarRepository.php (73%)
rename {src => app/default/src}/Elasticsearch/Service/ApiClient.php (86%)
rename {src => app/default/src}/Elasticsearch/Service/ApiClientInterface.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Criteria/ColorsFilter.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Criteria/Criteria.php (91%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Criteria/Criterion.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Criteria/PhraseFilter.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Criteria/ServicesFilter.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Factor/ColorRelevanceFactor.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Factor/DodgePromoFactor.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Factor/FactorInterface.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Factor/Factors.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Factor/RawScoreFactor.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Factor/Weight.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Factor/WeightFactor.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Query.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Response.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Result.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Results.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Sorter/DefaultSorter.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Sorter/FactorSorterInterface.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Sorter/RecommendedSorter.php (100%)
rename {src => app/default/src}/Elasticsearch/ValueObject/Sorter/SorterInterface.php (100%)
rename {src => app/default/src}/Enum/AbstractEnum.php (100%)
rename {src => app/default/src}/Enum/Color.php (100%)
rename {src => app/default/src}/Enum/Index.php (100%)
rename {src => app/default/src}/EventSubscriber/PaginationEventSubscriber.php (100%)
rename {src => app/default/src}/Kernel.php (100%)
rename {src => app/default/src}/Repository/AdditionalServiceRepositoryInterface.php (100%)
rename {src => app/default/src}/Repository/CarRepositoryInterface.php (100%)
rename {src => app/default/src}/Repository/InMemoryAdditionalServiceRepository.php (100%)
rename {src => app/default/src}/Twig/Extension/AppExtension.php (100%)
rename {src => app/default/src}/ValueObject/AdditionalService.php (100%)
rename {src => app/default/src}/ValueObject/AdditionalServices.php (100%)
rename {src => app/default/src}/ValueObject/Car.php (100%)
rename {src => app/default/src}/ValueObject/Cars.php (100%)
rename {src => app/default/src}/ValueObject/Colors.php (100%)
rename {src => app/default/src}/ValueObject/CriteriaInterface.php (100%)
rename {src => app/default/src}/ValueObject/CriterionInterface.php (100%)
rename {src => app/default/src}/ValueObject/Id.php (100%)
rename {src => app/default/src}/ValueObject/Model.php (100%)
rename {src => app/default/src}/ValueObject/Name.php (100%)
rename {src => app/default/src}/ValueObject/Page.php (100%)
rename {src => app/default/src}/ValueObject/PagesTotal.php (89%)
rename {src => app/default/src}/ValueObject/PagesTotalAwareInterface.php (100%)
rename {src => app/default/src}/ValueObject/Pagination.php (100%)
rename {src => app/default/src}/ValueObject/Phrase.php (100%)
rename {src => app/default/src}/ValueObject/Picture.php (100%)
rename {src => app/default/src}/ValueObject/Producer.php (100%)
rename {src => app/default/src}/ValueObject/ProductionYear.php (100%)
rename {src => app/default/src}/ValueObject/ResultsPerPage.php (100%)
rename {src => app/default/src}/ValueObject/SearchResponseInterface.php (100%)
rename {src => app/default/src}/ValueObject/SearchResultsInterface.php (100%)
rename symfony.lock => app/default/symfony.lock (100%)
rename {templates => app/default/templates}/base.html.twig (100%)
rename {templates => app/default/templates}/search/_includes/car.html.twig (100%)
rename {templates => app/default/templates}/search/_includes/filters.html.twig (100%)
rename {templates => app/default/templates}/search/_includes/pagination.html.twig (100%)
rename {templates => app/default/templates}/search/_includes/services.html.twig (100%)
rename {templates => app/default/templates}/search/emptyList.html.twig (100%)
rename {templates => app/default/templates}/search/list.html.twig (100%)
create mode 100644 docker/service/.env
create mode 100644 docker/service/.gitignore
create mode 100644 docker/service/README.md
create mode 100644 docker/service/_limit-memory.yaml
create mode 100644 docker/service/_network.yaml
create mode 100644 docker/service/_profiles.yaml
create mode 100644 docker/service/_restart-policy.yaml
create mode 100644 docker/service/_service-dependency.yaml
create mode 100644 docker/service/dirlist.txt
create mode 100644 docker/service/docker-compose.yaml
create mode 100644 docker/service/elasticsearch-v7.yaml
create mode 100644 docker/service/elasticsearch-v7/image/.dockerignore
create mode 100644 docker/service/elasticsearch-v7/image/.env.dev
create mode 100644 docker/service/elasticsearch-v7/image/Dockerfile
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/elasticsearch-plugins.example.yml
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/elasticsearch.keystore
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/elasticsearch.yml
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/jvm.options
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/log4j2.file.properties
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/log4j2.properties
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/role_mapping.yml
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/roles.yml
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/users
create mode 100644 docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/users_roles
create mode 100644 docker/service/nginx-v1.yaml
create mode 100644 docker/service/nginx-v1/image/.dockerignore
create mode 100644 docker/service/nginx-v1/image/.env.dev
create mode 100644 docker/service/nginx-v1/image/.gitignore
create mode 100644 docker/service/nginx-v1/image/Dockerfile
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/conf.d/default.conf
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/fastcgi_params
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/koi-utf
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/koi-win
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/mime.types
create mode 120000 docker/service/nginx-v1/image/files/etc/nginx/modules
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/nginx.conf
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/scgi_params
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/uwsgi_params
create mode 100644 docker/service/nginx-v1/image/files/etc/nginx/win-utf
create mode 100644 docker/service/nginx-v1/image/files/site.conf
create mode 100644 docker/service/php-composer-v2.yaml
create mode 100644 docker/service/php-composer-v2/.env.dev
create mode 100644 docker/service/php-composer-v2/image/Dockerfile
create mode 100644 docker/service/php-fpm-v8.yaml
create mode 100644 docker/service/php-fpm-v8/image/.dockerignore
create mode 100644 docker/service/php-fpm-v8/image/.env.dev
create mode 100644 docker/service/php-fpm-v8/image/Dockerfile
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-bcmath.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-calendar.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-dba.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-exif.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-gd.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-gettext.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-imagick.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-mongodb.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pcntl.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pdo_pgsql.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pgsql.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pspell.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-shmop.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-soap.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sockets.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-svm.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvmsg.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvsem.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvshm.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-tidy.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-trader.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-wddx.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-xmlrpc.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-xsl.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-zip.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/php.ini
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/php.ini-development
create mode 100644 docker/service/php-fpm-v8/image/files/usr/local/etc/php/php.ini-production
create mode 100755 docker/service/setup.sh
diff --git a/README.md b/README.md
index a81888c..6e3cf73 100644
--- a/README.md
+++ b/README.md
@@ -9,30 +9,1509 @@ This is the simple educational project prepared to support my recent presentatio
| :---: | :---: | :---: | :---: |
| ![image](https://user-images.githubusercontent.com/36886649/135843518-9d4b2ec1-32dc-4226-a63c-b173d9b0706e.png) | ![image](https://user-images.githubusercontent.com/36886649/135534953-338af09d-d2c6-43ee-9407-137253cc4e13.png) | |
+### Table of contents
+- [Requirements](#Requirements)
+- [Docker and Docker Compose upgrade](#Docker and Docker Compose upgrade)
+- [Project setup](#Project setup)
+ - [Quick setup (without Docker cleanup)](#Quick setup (without Docker cleanup))
+ - [Step by step setup](#Step by step setup)
+ - [Clone repository and create directories](#Clone repository and create directories)
+ - [Introduction to docker and docker-compose](#Introduction to docker and docker-compose)
+ - [Docker cleanup (optional)](#Docker cleanup (optional))
+ - [Containers cleanup](#Containers cleanup)
+ - [Networks cleanup](#Networks cleanup)
+ - [Volumes cleanup](#Volumes cleanup)
+ - [Development time cleanup](#Development time cleanup)
+ - [Docker compose project setup](#Docker compose project setup)
+ - [Start services](#Start services)
+ - [Install composer dependencies](#Install composer dependencies)
+ - [Elasticsearch index creation and population](#Elasticsearch index creation and population)
+ - [Make scripts executable](#Make scripts executable)
+ - [Quick setup with init.sh](#Quick setup with init.sh)
+ - [Step by step setup with request.sh](#Step by step setup with request.sh)
+ - [Create index](#Create index)
+ - [Populate index with data](#Populate index with data)
+ - [Get count of items](#Get count of items)
+ - [Search](#Search)
+ - [Delete index](#Delete index)
+ - [Step by step other methods](#Step by step other methods)
+- [How to play with it?](#How to play with it?)
+ - [Docker](#Docker)
+ - [Run all services](#Run all services)
+ - [Release the shell lock](#Release the shell lock)
+ - [Run all services without shell locking](#Run all services without shell locking)
+ - [Run a specific profile](#Run a specific profile)
+ - [Stop services](#Stop services)
+ - [Remove service containers](#Remove service containers)
+ - [Stop & remove service containers with their network](#Stop & remove service containers with their network)
+ - [Run, Stop, Remove](#Run, Stop, Remove)
+ - [Build images](#Build images)
+ - [Composer](#Composer)
+ - [Monitoring](#Monitoring)
+ - [Reinstallation](#Reinstallation)
+ - [Elasticsearch](#Elasticsearch)
+ - [Reinitialize](#Reinitialize)
+ - [Elasticsearch code](#Elasticsearch code)
+- [Uninstallation](#Uninstallation)
+- [Credits](#Credits)
+- [Copyrights](#Copyrights)
+ [^TOC^](#Table of contents)
## Requirements
-- PHP 8.0.9
-- Symfony CLI (https://symfony.com/download)
-- Elasticsearch 7.16.0 running on `localhost:9200`
-If you need to change the Elasticsearch host the application uses, [it's defined in the `ApiClient` class as a constant](https://github.com/lrynek/phpers-2021/blob/b4a8431ffd73c7417b00d6428ef491c91b45960f/src/Elasticsearch/Service/ApiClient.php#L14) (normally worth passing it from `.env` params file 😉 )
+- docker (tested on v20.10.13)
+- docker-compose (tested on v2.3.3)
+- linux (tested on Ubuntu 18.04)
-In order to run the project, it is advisable to install an instance of latest stable version of Elasticsearch (it's 7.16.0 version at the moment of the presentation https://www.elastic.co/guide/en/elasticsearch/reference/7.16/index.html)
+ [^TOC^](#Table of contents)
-## Setup
-1. Create `cars` index in Elasticsearch ([`Index/Create` HTTP request](https://github.com/lrynek/phpers-2021/blob/main/.elasticsearch-http-requests/Index/Create.http)*)
-2. Populate the index with sample cars data ([`Index/Bulk` HTTP request](https://github.com/lrynek/phpers-2021/blob/main/.elasticsearch-http-requests/Index/Bulk.http)*)
-3. Go to project's root directory in the terminal
-4. Start Symfony server `symfony server:start --no-tls`
-5. Go to http://127.0.0.1:8000/
+## Docker and Docker Compose upgrade
->(*) - all HTTP requests can be executed either:
->- from within [PhpStorm's built-in REST HTTP client](https://www.jetbrains.com/help/phpstorm/http-client-in-product-code-editor.html) (samples in [.elasticsearch-http-requests directory](https://github.com/lrynek/phpers-2021/blob/main/.elasticsearch-http-requests))
->- in [Insomnia REST HTTP client](https://insomnia.rest/) (import [insomnia.json file](https://github.com/lrynek/phpers-2021/blob/main/insomnia.json) with all the samples)
+If you use the `docker` and/or `docker-compose` provided by your system vendor - you installed it on Ubuntu for eg. by `apt-get install docker` or `apt-get install docker-compose` then probably at least your installation of the `docker-compose` has to low version to run this application.
+
+You may need to also to update the version of the `docker` but for the Ubuntu it can be done by its GUI [Software Updater](https://en.wikipedia.org/wiki/Ubuntu_Software_Updater).
+
+
+
+You may check your current version of the `docker-compose` by running:
+
+```sh
+docker-compose --version
+```
+
+If it is `1.x` then you need to upgrade it.
+
+
+
+**Ubuntu `docker-compose` most recent version installation**:
+
+Get info about available version to download:
+
+```sh
+VERSION="$(curl --silent 'https://api.github.com/repos/docker/compose/releases/latest' | grep -Po '"tag_name": "\K.*\d')" && echo "Available version: $VERSION"
+```
+
+example terminal output:
+
+```sh
+Available version: v2.3.3
+```
+
+if you don't see any version here discontinue and do not follow other steps but try on your own to upgrade the `docker-compose`.
+
+
+
+Check if you have `docker-compose` installed and where, run:
+
+```sh
+DESTINATION="$(find / -iname 'docker-compose' -type f -executable 2> /dev/null || true)" &&
+{ [ -z ${DESTINATION:-} ] && echo "DESTINATION must be set manually"; } || echo "DESTINATION is set to: $DESTINATION"
+```
+
+example terminal output:
+
+```
+/usr/bin/docker-compose
+```
+
+or "DESTINATION must be set manually" if you haven't installed `docker-compose`, then variable `DESTINATION` must be later set by you manually (continue with the steps as below).
+
+
+
+Uninstall current version only if DESTINATION is set:
+
+```sh
+if [ -z "${DESTINATION:-}" ]; then
+ echo "No need for uninstalling, docker-compose not found"
+else
+ echo "Uninstalling docker-compose"
+ sudo apt-get remove docker-compose
+fi
+```
+
+
+
+in case you have seen:
+
+> DESTINATION must be set manually
+
+now is the time to set the destination to the path you wish, for example run:
+
+```sh
+DESTINATION=/usr/bin/docker-compose
+```
+
+
+
+Download the `docker-compose` file and make it executable:
+
+```sh
+echo "Downloading file to: ${DESTINATION:?}"
+sudo curl -L "https://github.com/docker/compose/releases/download/${VERSION:?}/docker-compose-$(uname -s)-$(uname -m)" -o "${DESTINATION:?}"
+
+echo "Changing permissions to rx"
+sudo chmod a=rx "${DESTINATION:?}"
+```
+
+
+
+Now you should be able to run `docker-compose` and check its new version, run:
+
+```
+docker-compose --version
+```
+
+example terminal output:
+
+```
+Docker Compose version v2.3.3
+```
+
+
+
+If by this time you don't have installed new version of the `docker-compose` then you may install again the previous version of the `docker-compose` by running:
+
+```sh
+sudo apt-get install docker-compose
+```
+
+from the official repository or search for some alternative methods of installing more recent version than the one you currently have.
+
+
+
+## Project setup
+
+This process is available in two flavors:
+
+1. Quick setup (if you can't wait to play)
+2. Step by step approach (has additional explanations)
+
+Either way the end result that can be checked by the command:
+
+```sh
+docker ps -a --format '{{.Image}} {{.Status}} {{.Ports}}'
+```
+
+ should be:
+
+| IMAGE | STATUS | PORTS |
+| ------------------------------ | ---------------------- | --------------------------------------------------- |
+| carrental_nginx:1.17.8 | Up 9 minutes (healthy) | 0.0.0.0:9090->80/tcp, :::9090->80/tcp |
+| carrental_composer:2.2.7 | Up 9 minutes | |
+| carrental_php:8.1.3-fpm-buster | Up 9 minutes | 9000/tcp |
+| carrental_elasticsearch:7.17.1 | Up 9 minutes (healthy) | 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9300/tcp |
+
+ [^TOC^](#Table of contents)
+
+## Quick setup (without Docker cleanup)
+
+1. Clone this repository:
+
+ ```sh
+ git clone 'https://github.com/lrynek/painless-car-rental.git'
+ ```
+
+3. Change directory:
+
+ ```sh
+ cd painless-car-rental/docker/service
+ ```
+
+3. Make `setup.sh` script executable && run `script.sh`:
+
+ ```sh
+ sudo chmod ug+x ./setup.sh && ./setup.sh
+ ```
+
+ `./setup.sh` may ask you for the sudo password because it is required for changing permissions to the directories it creates.
+
+ Feel free to check `./setup.sh` content if you are wary, run:
+
+ ```sh
+ cat ./setup.sh
+ ```
+
+
+
+ **Do not** run `./setup.sh` as a sudo user. Wrong, do **not** do this:
+
+ ```sh
+ sudo ./setup.sh
+ ```
+
+ because it needs to run as your regular user in order to use your user id and group id and make correct ownership of directories.
+
+
+
+ If you see an error like this:
+
+ > Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "...": dial unix /var/run/docker.sock: connect: permission denied
+
+ This means that your user don't have permissions to run docker.
+
+ Add your user to the `docker` group, run:
+
+ ```sh
+ sudo usermod -a -G docker $USER
+ ```
+
+ Reload docker:
+
+ ```sh
+ sudo systemctl restart docker
+ ```
+
+ Relog your user:
+
+ ```sh
+ su - $USER
+ ```
+
+ Check if your user is added to the `docker` group, run:
+
+ ```sh
+ groups
+ ```
+
+ example terminal output:
+
+ ```
+ test sudo docker
+ ```
+
+ Once you see `docker` group then run setup script again (without sudo):
+
+ ```sh
+ ./setup.sh
+ ```
+
+
+
+ If you see an error:
+
+ > * error listing credentials - err: exit status 1, out: `Error from list function in secretservice_linux.c likely due to error in secretservice library`
+
+ Install these packages:
+
+ ```sh
+ sudo apt-get install -y pass gnupg2
+ ```
+
+
+
+4. Open your browser and go to:
+ http://localhost:9090
+
+4. Read the section [How to play with it?](#How to play with it?)
+
+5. Read about the project structure in [./docker/service/README.md](./docker/service/README.md)
+
+ [^TOC^](#Table of contents)
+
+## Step by step setup
+
+
+
+#### Clone repository and create directories
+
+Clone this repository && change dir to it:
+
+```sh
+git clone 'https://github.com/lrynek/painless-car-rental' && cd painless-car-rental/docker/service
+```
+
+
+
+Export your current shell user id and its group id, run:
+
+```sh
+export uid=$(id -u)
+export gid=$(id -g)
+```
+
+to have all `docker-compose` commands run as your current user and own files.
+
+If not then they will be run as user:group = 1000:1000 or 1000:0 for Elasticsearch.
+
+
+
+Own all directories and files:
+
+```sh
+sudo chown -R $uid:$gid ../../
+```
+
+
+
+Add execution for the current user and its group to init scripts
+
+```sh
+sudo chmod -v ug+x,o-wx \
+../../app/default/.elasticsearch-http-requests/request.sh \
+../../app/default/.elasticsearch-http-requests/init.sh
+```
+
+
+
+If the docker attempts to mount at HOST a directory that does not exists it will be created by the docker demon.
+
+The problem is that directory will be created by docker that runs as a root therefore it will be owned by the user id = 0.
+
+That directory will be not accessible for all of the processes that run within containers with different user id.
+
+This application runs all containers with the same user id and group id as the user who started them.
+
+Because of that it is possible to freely use PHP composer for example without any sudo as well deleting all files without any sudo.
+
+Running containers as a regular user also enhances security and makes possible to use file access permissions different for user, group and others (which makes no difference if the user is root).
+
+In order to have access permissions from within containers that run processes as a regular user all of the directories that are used as host's mounting points must be created upfront and have desired permissions before running the docker commands.
+
+
+
+Create directory for Nginx:
+
+```sh
+mkdir -p \
+./nginx-v1/image/files/var/log/nginx \
+./nginx-v1/image/files/usr/share/nginx/html/default && \
+\
+sudo chown -R $uid:$gid \
+./nginx-v1/image/files/var/log/nginx \
+./nginx-v1/image/files/usr/share/nginx/html/default && \
+\
+sudo chmod -v -R ug=rwX,o=rX \
+./nginx-v1/image/files/var/log/nginx \
+./nginx-v1/image/files/usr/share/nginx/html/default
+```
+
+
+
+Create directory for Elasticsearch
+
+```sh
+mkdir -p \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/config \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/data \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/logs \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/plugins && \
+\
+sudo chown -R $uid:0 \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/config \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/data \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/logs \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/plugins && \
+\
+sudo chmod -v -R ug=rwX,o=rX \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/config \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/data \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/logs \
+./elasticsearch-v7/image/files/usr/share/elasticsearch/plugins
+```
+
+
+ [^TOC^](#Table of contents)
+
+## Introduction to docker and docker-compose
+
+Feel free to use `--help` option before running any `docker` or `docker-compose` command to know what you are doing.
+
+run:
+
+```sh
+docker --help
+```
+
+or:
+
+```sh
+docker-compose --help
+```
+
+to get information about `docker` or `docker-compose` commands.
+
+
+
+You may get also use `--help` for the info related to a specific sub-command:
+
+```sh
+docker ps --help
+```
+
+or:
+
+```sh
+docker-compose ps --help
+```
+
+
+
+The command `docker` should work without any problem anywhere.
+
+However using `docker-compose` commands usually requires your shell to be inside the directory where the `docker-compose.yaml` file is ([./docker/service](./docker/service) for this project).
+
+
+
+Note that if you use sub commands then command-line options switches are available (and potentially different) for both commands for eg. `docker-compose` and its subcommand `up`
+
+```sh
+docker-compose --help
+```
+
+will display different option switches than
+
+```sh
+docker-compose up --help
+```
+
+keep that in mind and place option switches right after the command they relate to. for example:
+
+wrong:
+
+```sh
+docker-compose up --build --profile dev
+```
+
+terminal output:
+
+> unknown flag: --profile
+
+subcommand `up` of the `docker-compose` doesn't have the `--profile` switch therefore `--build` option must be placed right after the `docker-compose` command.
+
+correct:
+
+```sh
+docker-compose --profile dev up --build
+```
+
+ [^TOC^](#Table of contents)
+
+## Docker cleanup (optional)
+
+Before running this application you may want to do the Docker cleanup and remove all of the containers and networks.
+
+Make sure you that you do not have any:
+
+- container
+- docker network
+- dandling images
+- dandling build cache
+
+that is important (ie a container(s) handling an incoming traffic or saving a backup data) before proceeding with the steps as described in this section.
+
+**Running** the **Docker cleanup** section commands **is optional** but should give you a clean starting point and lack of confusion by having only the containers and networks that are related to this project.
+
+ [^TOC^](#Table of contents)
+
+#### Containers cleanup
+
+To see if you have any containers created run:
+
+```sh
+docker ps -a
+```
+
+During the development time you may stop all containers, run:
+
+```sh
+docker-compose stop
+```
+
+Then you may remove all of them, run:
+
+```sh
+docker-compose down
+```
+
+But then still some containers may be presented by `docker ps -a` command. If you want to remove all of the containers, even those that are not related to this application project then run:
+
+```sh
+docker rm $(docker ps -aq)
+```
+
+In case of any complains from docker you may add flag `--force` but read and understand what the docker is complaining on and decide if you really want to force docker to remove all of the containers:
+
+```sh
+docker rm --force $(docker ps -aq)
+```
+
+to see effect run again:
+
+```sh
+docker ps -a
+```
+
+terminal output:
+
+```
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+```
+
+should show no containers (despite their state: created, stopped, running, exited etc.)
+
+ [^TOC^](#Table of contents)
+
+#### Networks cleanup
+
+You may also remove all of the docker networks that you don't need any longer including networks used by the docker containers you've just removed.
+
+to list all of the networks run:
+
+```sh
+docker network ls
+```
+
+to remove all of the user networks:
+
+```sh
+docker network rm $(docker network ls -q --filter 'type=custom')
+```
+
+run:
+
+```sh
+docker network ls
+```
+
+terminal output:
+
+```
+NETWORK ID NAME DRIVER SCOPE
+5d5de2f7ccd4 bridge bridge local
+b75e841984e3 host host local
+efff0416acdb none null local
+```
+
+should show that there are no other networks than the default ones.
+
+ [^TOC^](#Table of contents)
+
+#### Volumes cleanup
+
+This application does not make any use of volumes (besides the ones that are defined by the images' Dockerfiles). Therefore it is not needed nor recommended to do a cleanup of them for the purpose of running this application.
+
+ [^TOC^](#Table of contents)
+
+#### Development time cleanup
+
+At first time of application run it is not necessary to follow this instruction - you may skip it.
+
+Once you start working with this application and modify it, stop, remove, build and run again you may find that you have some containers or networks that are not used but still present when you issue the `docker ps -a` or `docker network ls` command.
+
+In such case, you may find useful
+
+Following steps from [Run, Stop, Remove](#Run, Stop, Remove) to run and do all cleanup after shutting the application down.
+
+or using this command:
+
+```sh
+docker system prune
+```
+
+that outputs in the terminal:
+
+```
+WARNING! This will remove:
+ - all stopped containers
+ - all networks not used by at least one container
+ - all dangling images
+ - all dangling build cache
+
+Are you sure you want to continue? [y/N]
+```
+
+The terminal output is pretty self explanatory however if you would like to check the documentation:
+
+- [docker system prune](https://docs.docker.com/engine/reference/commandline/system_prune/)
+- [docker container prune](https://docs.docker.com/engine/reference/commandline/container_prune/)
+- [docker network prune](https://docs.docker.com/engine/reference/commandline/network_prune/)
+
+ [^TOC^](#Table of contents)
+
+## Docker compose project setup
+
+#### Start services
+
+Do not run any of the commands with `sudo` unless it is clearly used.
+
+If you run these commands with `sudo` then the user id will be 0 as well as the group id. That will affect all of the containers that are built and used with the same user id and group id as the user that issued the commands to built and run them.
+
+You will have no benefit of running the commands with `sudo` but only will degrade security and make setting access permissions for user, group and others pointless.
+
+If you have any problems running docker commands without `sudo` then you need to add your user to the docker group, read about that in the [Quick setup (without Docker cleanup)](#Quick setup (without Docker cleanup)) section.
+
+run:
+
+```sh
+docker-compose --profile dev up --detach --build --force-recreate
+```
+
+to get the `dev` profile running and wait approx 40 sec to finish.
+
+Once done and shell is accepting new commands, terminal output:
+
+```
+[+] Running 4/4
+ ⠿ Container carrental-php-composer-v2-1 Started 2.2s
+ ⠿ Container carrental-elasticsearch-v7-1 Healthy 27.1s
+ ⠿ Container carrental-php-fpm-v8-1 Started 3.0s
+ ⠿ Container carrental-nginx-v1-1 Started 28.0s
+```
+
+
+
+run:
+
+```sh
+docker ps -a --format '{{.Image}}\t{{.Status}}\t{{.Names}}'
+```
+
+to see all containers created, terminal output:
+
+```
+carrental_nginx:1.17.8 Up 7 seconds (healthy) carrental-nginx-v1-1
+carrental_php:2.2.7-composer Up 31 seconds carrental-php-composer-v2-1
+carrental_php:8.1.3-fpm-buster Up 30 seconds carrental-php-fpm-v8-1
+carrental_elasticsearch:7.17.1 Up 29 seconds (healthy) carrental-elasticsearch-v7-1
+```
+
+with both `carrental-nginx-v1-1` and `carrental-elasticsearch-v7-1` status **(healthy)**
+
+for the full info you may run:
+
+```sh
+docker ps -a
+```
+
+
+
+or open a new terminal window and run:
+
+```sh
+docker stats
+```
+
+that should show containers and their resources usage.
+
+If you have opened the second terminal window, go back to the first terminal window and continue with instructions:
+
+ [^TOC^](#Table of contents)
+
+#### Install composer dependencies
+
+```sh
+docker-compose exec php-composer-v2 composer install
+```
+
+terminal output:
+
+```
+Generating optimized autoload files
+38 packages you are using are looking for funding.
+Use the `composer fund` command to find out more!
+
+Run composer recipes at any time to see the status of your Symfony recipes.
+
+Executing script cache:clear [OK]
+Executing script assets:install public [OK]
+```
+
+At this moment the PHP application is set but there is still missing:
+
+ [^TOC^](#Table of contents)
+
+## Elasticsearch index creation and population
+
+#### Make scripts executable
+
+**Make `request.sh` script executable**
+
+```sh
+docker-compose exec php-composer-v2 /bin/sh -c "chmod -cv ug+x /app/default/.elasticsearch-http-requests/request.sh"
+```
+
+terminal output:
+
+```
+... 0754 (rwxr-xr--)
+```
+
+so your user and his group are able to execute that script.
+
+ [^TOC^](#Table of contents)
+
+**Make `init.sh` script executable**
+
+```sh
+docker-compose exec php-composer-v2 /bin/sh -c "chmod -cv ug+x /app/default/.elasticsearch-http-requests/init.sh"
+```
+
+terminal output:
+
+```
+... 0754 (rwxr-xr--)
+```
+
+so your user and his group are able to execute that script.
+
+ [^TOC^](#Table of contents)
+
+**There are at least three ways to create Elasticsearch's index and populate it**
+
+- Quick setup with `init.sh` - just gets you the DB set.
+- Step by step with `request.sh` - provides more fun.
+- Step by step other methods (require manual edit of file(s))
+
+ [^TOC^](#Table of contents)
+
+#### Quick setup with init.sh
+
+```sh
+docker-compose exec php-composer-v2 /bin/sh -c "/app/default/.elasticsearch-http-requests/init.sh"
+```
+
+Terminal output:
+
+```
+...
+
+Performing cURL request:
+curl -sSL -X GET 'http://elasticsearch-v7:9200/cars/_count'
+{"count":39,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
+Success.
+Done!
+```
+
+That's it. Open your bowser and visit http://localhost:9090/
+
+ [^TOC^](#Table of contents)
+
+#### Step by step setup with request.sh
+
+##### Create index
+
+```sh
+docker-compose exec php-composer-v2 /bin/sh -c "/app/default/.elasticsearch-http-requests/request.sh /app/default/.elasticsearch-http-requests/Index/Create.http"
+```
+
+terminal output:
+
+```
+Performing cURL request:
+...
+{"acknowledged":true,"shards_acknowledged":true,"index":"cars"}
+Success.
+```
+
+ [^TOC^](#Table of contents)
+
+##### Populate index with data
+
+```
+docker-compose exec php-composer-v2 /bin/sh -c "/app/default/.elasticsearch-http-requests/request.sh /app/default/.elasticsearch-http-requests/Index/Bulk.http"
+```
+
+terminal output:
+
+```
+Performing cURL request:
+curl -sSL -X POST -H 'Content-Type: application/x-ndjson' --data-raw \
+'{"update":{"_index":"cars","_type":"_doc","_id":"1"}}
+{"doc":{"producer":"Ferrari","model":"SF90","picture":"ferrari-sf90.jpg","production_year":2021,"colors":["red"],"service_ids":[2,4,6,8]},"doc_as_upsert":true}
+
+...
+
+{"update":{"_index":"cars","_type":"_doc","_id":"39","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":38,"_primary_term":1,"status":201}}]}
+Success.
+```
+
+ [^TOC^](#Table of contents)
+
+##### Get count of items
+
+```sh
+docker-compose exec php-composer-v2 /bin/sh -c "/app/default/.elasticsearch-http-requests/request.sh /app/default/.elasticsearch-http-requests/Index/Count.http"
+```
+
+terminal output:
+
+```
+Performing cURL request:
+curl -sSL -X GET 'http://elasticsearch-v7:9200/cars/_count'
+{"count":39,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
+Success.
+```
+
+ [^TOC^](#Table of contents)
+
+##### Search
+
+```sh
+docker-compose exec php-composer-v2 /bin/sh -c "/app/default/.elasticsearch-http-requests/request.sh /app/default/.elasticsearch-http-requests/Search/Phrase.http"
+```
+
+terminal output:
+
+```
+Performing cURL request:
+curl -sSL -X POST -H 'Content-Type: application/json' --data-raw \
+'{
+ "_source": true,
+ "explain": false,
+
+...
+
+{"producer":"McLaren","model":"720S","picture":"mclaren-720s.jpg","production_year":2018,"colors":["blue","orange","black"],"service_ids":[7,2,1,3]}}]}}
+Success.
+```
+
+That's it. Open your bowser and visit http://localhost:9090/ and
+
+Read the section [How to play with it?](#How to play with it?).
+
+ [^TOC^](#Table of contents)
+
+##### Delete index
+
+```sh
+docker-compose exec php-composer-v2 /bin/sh -c "/app/default/.elasticsearch-http-requests/request.sh /app/default/.elasticsearch-http-requests/Index/Delete.http"
+```
+
+terminal output:
+
+```
+Performing cURL request:
+curl -sSL -X DELETE 'http://elasticsearch-v7:9200/cars'
+{"acknowledged":true}
+Success.
+```
+
+Terminal may print `FAIL!` in case there was no index to delete (you deleted it before, or did not create).
+
+ [^TOC^](#Table of contents)
+
+#### Step by step other methods
+
+All HTTP requests can be executed either:
+- from within [PhpStorm's built-in REST HTTP client](https://www.jetbrains.com/help/phpstorm/http-client-in-product-code-editor.html) (samples in [.elasticsearch-http-requests directory](https://github.com/lrynek/phpers-2021/blob/main/.elasticsearch-http-requests))
+- in [Insomnia REST HTTP client](https://insomnia.rest/) (import [insomnia.json file](https://github.com/lrynek/phpers-2021/blob/main/insomnia.json) with all the samples)
+
+You may receive an error from Elastisearch that complains about nested document. If so then add this query
+
+```
+?include_type_name=true
+```
+
+to your `PUT` request like to this one: `app/default/.elasticsearch-http-requests/Index/Create.http`
+
+first line:
+
+```http
+PUT http://localhost:9200/cars
+```
+
+should become:
+
+```http
+PUT http://localhost:9200/cars?include_type_name=true
+```
+
+Keep in mind that using `localhost` as a request's host name is only valid if you make that request from your machine (not from the composer docker container).
+
+Therefore if you want to do them manually but from a docker container you have two choices:
+
+- Make requests from within the Elasticsearch container because there the `localhost` points to the Elasticsearch's service internal [loopback](https://en.wikipedia.org/wiki/Loopback).
+- Change the `localhost` in the request to `elasticsearch-v7` or to the Elasticsearch container name available under `docker ps` or Elasticsearch service network alias that is available by using the command: `docker inspect elasticsearch-container-name`
+
+
+
+Open your bowser and visit http://localhost:9090/
+
+ [^TOC^](#Table of contents)
## How to play with it?
+
+Read about the project structure in [./docker/service/README.md](./docker/service/README.md)
+
+or continue with the content as below:
+
+ [^TOC^](#Table of contents)
+
+## Docker
+
+ [^TOC^](#Table of contents)
+
+
+
+Before doing any commands from this section make sure that your terminal's current directory is [./docker/service](./docker/service)
+
+
+
+#### Run all services
+
+To run this application you need to specify explicitly the profile you want to run.
+
+Profile `dev` runs all of the available services. To run the `dev` profile type:
+
+```sh
+docker-compose --profile dev up
+```
+
+Note `--profile` option comes after the `docker-compose` command, not after the `up` subcommand.
+
+Your terminal shell will be locked and you will not be able to type into it but shell will print logs from any service container instead:
+
+```
+carrental-php-fpm-v8-1 | [17-Mar-2022 15:08:41] NOTICE: fpm is running, pid 1
+carrental-php-fpm-v8-1 | [17-Mar-2022 15:08:41] NOTICE: ready to handle connections
+carrental-elasticsearch-v7-1 | {"type": "server", "timestamp": "2022-03-17T15:08:42,246Z"
+```
+
+ [^TOC^](#Table of contents)
+
+##### Release the shell lock
+
+Use the keyboard combination of Ctrl+c.
+
+The Ctrl+c stops all of the containers created by `docker-compose` `up`
+
+```
+[+] Running 4/4
+⠿ Container carrental-nginx-v1-1 Stopped
+⠿ Container carrental-elasticsearch-v7-1 Stopped
+⠿ Container carrental-php-composer-v2-1 Stopped
+⠿ Container carrental-php-fpm-v8-1 Stopped
+```
+
+and gives the shell control back to you.
+
+ [^TOC^](#Table of contents)
+
+#### Run all services without shell locking
+
+If you don't want `docker-compose` `up` to hold your shell you may use `--detach` or `-d` flag.
+
+```sh
+docker-compose --profile dev up --detach
+```
+
+after starting all of the services:
+
+```
+[+] Running 6/6
+ ⠿ Network carrental_backend Created 0.1s
+ ⠿ Network carrental_frontend Created 0.1s
+ ⠿ Container carrental-php-fpm-v8-1 Started 1.9s
+ ⠿ Container carrental-php-composer-v2-1 Started 2.9s
+ ⠿ Container carrental-elasticsearch-v7-1 Healthy 24.4s
+ ⠿ Container carrental-nginx-v1-1 Started 25.6s
+```
+
+the shell will be released and waiting for your input.
+
+However the downside is that you will not have the terminal output view with information coming from the services like it was printed without using the `--detach` flag.
+
+To solve that issue you run this command preferably in a new terminal window:
+
+```sh
+docker-compose logs
+```
+
+that will provide you the same output as running the `docker-compose` `up` that locks the shell.
+
+When running `docker-compose` `up` with `--detach` key combination Ctrl+c will not stop and remove containers with their networks.
+
+To address that issue check commands from sections as below:
+
+- [Stop services](#Stop services) (equivalent of Ctrl+c)
+- [Remove service containers](#Remove service containers)
+- [Stop & remove service containers with their network](#Stop & remove service containers with their network)
+
+ [^TOC^](#Table of contents)
+
+#### Run a specific profile
+
+Services and profiles that they are assigned to are listed in [./docker/service/_profiles.yaml](./docker/service/_profiles.yaml)
+
+
+
+This section assumes you have created containers by steps from [Run all services](#Run all services) and stopped them as described in: [Release the shell lock](#Release the shell lock).
+
+If you want to run a specific profile you know that you need to specify `--profile` option followed by the profile name.
+
+Let's run `cli` profile that has only the `php-composer-v2` service assigned to it, run:
+
+```sh
+docker-compose up --profile cli
+```
+
+terminal output:
+
+```
+[+] Running 1/0
+ ⠿ Container carrental-php-composer-v2-1 Created 0.0s
+Attaching to carrental-elasticsearch-v7-1, carrental-nginx-v1-1, carrental-php-composer-v2-1, carrental-php-fpm-v8-1
+
+...
+```
+
+Did you notice something strange?
+
+If not then open a new terminal window Ctrl+Alt+t and run:
+
+```sh
+docker ps -a
+```
+
+Check how many containers are running, it should be there just one: `carrental-php-com
+poser-v2-1` because that's the only service the profile `cli` has.
+
+It looks that by running `docker-compose --profile cli` command we end up having all of the containers running from the `dev` profile. Why is that?
+
+Notice terminal output of the `docker-compose --profile cli`, especially the line at the beginning:
+
+> [+] Running 1/0
+> ⠿ Container carrental-php-composer-v2-1 Created 0.0s
+
+That looks as expected, we wanted to create just one service that the `cli` profile consist of but besides that also something else has happened:
+
+> Attaching to carrental-elasticsearch-v7-1, carrental-nginx-v1-1, carrental-php-composer-v2-1, carrental-php-fpm-v8-1
+
+Use the keyboard combination of Ctrl+c to stop all of the containers.
+
+Terminal output:
+
+```
+[+] Running 4/4
+⠿ Container carrental-nginx-v1-1 Stopped
+⠿ Container carrental-elasticsearch-v7-1 Stopped
+⠿ Container carrental-php-composer-v2-1 Stopped
+⠿ Container carrental-php-fpm-v8-1 Stopped
+```
+
+In order to have running only `carrental-php-composer-v2-1` [Remove service containers](#Remove service containers)
+
+and run profile `cli` again:
+
+```sh
+docker-compose up --profile cli
+```
+
+Terminal output:
+
+```
+[+] Running 2/2
+ ⠿ Network carrental_backend Created 0.1s
+ ⠿ Container carrental-php-composer-v2-1 Created 0.1s
+Attaching to carrental-php-composer-v2-1
+```
+
+As you can see there is only one container created and attaching is done to it. No other containers were attached because they did not exist (they were removed).
+
+
+
+If you want always to run a specific profile then edit the [.env](./docker/service/.env) file and put there:
+
+```
+COMPOSE_PROFILES=dev
+```
+
+so you should be able to issue only the:
+
+```sh
+docker-compose up
+```
+
+command to run the `dev` profile.
+
+All profiles that you may choose from are defined in the [_profiles.yaml](./docker/service/_profiles.yaml) file in the same directory where the docker-compose.yaml file is [./docker/service](./docker/service)
+
+Documentation: [Using profiles with Compose](https://docs.docker.com/compose/profiles/)
+
+ [^TOC^](#Table of contents)
+
+#### Stop services
+
+It makes sense to use it only if you plan to restart these containers later.
+
+If your intention is to remove services then use command provided in [Remove service containers](#Remove service containers) that may stop containers as well before removing them or use [Stop & remove service containers with their network](#Stop & remove service containers with their network) that is able to do the same plus networks removal.
+
+If you want to only stop docker containers that were started by
+
+```sh
+docker-compose up
+```
+
+without `--deatach` flag then you need to press in that terminal Ctrl+c.
+
+If the process of stopping containers takes too long then you may press Ctrl+c again to kill containers. Keep in mind that may result in the data loss.
+
+if you started containers with the`--deatach` flag then you need to issue a command
+
+```sh
+docker-compose stop
+```
+
+Example terminal output:
+
+```
+[+] Running 4/4
+⠿ Container carrental-nginx-v1-1 Stopped
+⠿ Container carrental-elasticsearch-v7-1 Stopped
+⠿ Container carrental-php-composer-v2-1 Stopped
+⠿ Container carrental-php-fpm-v8-1 Stopped
+```
+
+ [^TOC^](#Table of contents)
+
+#### Remove service containers
+
+You may remove service containers that are already stopped or even running containers if `--force` flag added:
+
+```sh
+docker-compose rm --force --stop
+```
+
+options:
+
+- `-f`, `--force` Don't ask to confirm removal
+- `-s`, `--stop` Stop the containers, if required, before removing
+
+example terminal output:
+
+```
+[+] Running 4/4
+ ⠿ Container carrental-php-composer-v2-1 Stopped 10.4s
+ ⠿ Container carrental-nginx-v1-1 Stopped 0.6s
+ ⠿ Container carrental-php-fpm-v8-1 Stopped 0.3s
+ ⠿ Container carrental-elasticsearch-v7-1 Stopped 0.8s
+
+Going to remove carrental-nginx-v1-1, carrental-elasticsearch-v7-1, carrental-php-fpm-v8-1, carrental-php-composer-v2-1
+
+[+] Running 4/0
+ ⠿ Container carrental-php-composer-v2-1 Removed 0.0s
+ ⠿ Container carrental-nginx-v1-1 Removed 0.0s
+ ⠿ Container carrental-elasticsearch-v7-1 Removed 0.0s
+ ⠿ Container carrental-php-fpm-v8-1 Removed 0.0s
+```
+
+If you want to remove also networks then look at: [Stop & remove service containers with their network](#Stop & remove service containers with their network)
+
+ [^TOC^](#Table of contents)
+
+#### Stop & remove service containers with their network
+
+[Remove service containers](#Remove service containers) only removes containers but what if you need to get rid of all of the containers with their networks for eg. you reconfigured network and want to do `docker-compose` `up` with the new network configuration?
+
+You may use for that `docker-compose` `down` that is the opposite command to the `docker-compose` `up`, run:
+
+```sh
+docker-compose down --remove-orphans
+```
+
+Options:
+
+- `--remove-orphans` Remove containers for services not defined in the Compose file.
+
+example terminal output:
+
+```
+[+] Running 6/6
+ ⠿ Container carrental-php-composer-v2-1 Removed 10.5s
+ ⠿ Container carrental-elasticsearch-v7-1 Removed 1.0s
+ ⠿ Container carrental-php-fpm-v8-1 Removed 0.5s
+ ⠿ Container carrental-nginx-v1-1 Removed 1.0s
+ ⠿ Network carrental_backend Removed 0.3s
+ ⠿ Network carrental_frontend Removed 0.2s
+```
+
+Note that networks:
+
+```
+ ⠿ Network carrental_backend Removed 0.3s
+ ⠿ Network carrental_frontend Removed 0.2s
+```
+
+were also removed in contrary to the [Remove service containers](#Remove service containers) that removes only services.
+
+ [^TOC^](#Table of contents)
+
+#### Run, Stop, Remove
+
+Make sure you that you do not have any:
+
+- container
+- docker network
+
+that is important (ie a container(s) handling an incoming traffic or saving a backup data) before proceeding with the steps as described in this section.
+
+
+
+When developing an application it is very often need to do a repetitive cycle of docker commands:
+
+1. Run all or just selected services
+2. Shut everything down
+3. Clean any leftovers
+4. Build the images again
+5. Repeat point 1 with updated configuration
+
+
+
+Below is a one-liner that covers **points 1~4** for the `dev` profile (all services).
+
+Run and cleanup this project:
+
+```sh
+docker-compose --profile dev up --build --force-recreate; \
+docker-compose down --remove-orphans;
+```
+
+See description of commands below.
+
+Run and cleanup every project:
+
+```sh
+docker-compose --profile dev up --build --force-recreate; \
+docker-compose down --remove-orphans; \
+containers="$(docker ps -aq)"; [ -z "$containters" ] || docker rm -f $containers; \
+networks="$(docker network ls -q --filter 'type=custom')"; [ -z "$networks" ] || docker network rm $networks;
+```
+
+Explanation:
+
+- `docker-compose --profile dev up --build --force-recreate` runs the `dev` profile (`--profile`) and builds (`--build`) all images always (`--force-recreate`). Blocks the terminal input (lack of `--deatch`) till a user presses Ctrl+c.
+
+- `docker-compose down --remove-orphans` shuts all containers down and removes them with their networks.
+
+- `containers="$(docker ps -aq)"; [ -z "$containters" ] || docker rm -f $containers;` removes all of the containers even these ones that are not related to the project.
+
+- `networks="$(docker network ls -q --filter 'type=custom')"; [ -z "$networks" ] || docker network rm $networks` removes all of the user created networks even these that are not related to this project.
+
+
+
+**Point 5**: To repeat that command use Ctrl+Up Arrow. Once it is displayed press Enter.
+
+ [^TOC^](#Table of contents)
+
+#### Build images
+
+If you make any changes to the Dockerfiles you should use `--build` flag so the `docker-compose` `up` rebuilds your images before running them again.
+
+example:
+
+```sh
+docker-compose --profile dev up --build
+```
+
+Sometimes even you have made changes to the Dockerfile or a service `.yaml` file of an image docker will use its old version, therefore `--force-recreate` is useful during the development phase:
+
+```sh
+docker-compose --profile dev up --build --force-recreate
+```
+
+
+
+If you run your `docker-compose` `up` command with newly build images but still see that the old image is used check with the command:
+
+```sh
+docker ps -a
+```
+
+name of the containers under the column `IMAGE`.
+
+If the column has a hash value like: `26d6a19a43ba` instead of a container name for eg: `carrental_composer:2.2.7` then something went wrong and the docker has not started with the newly created image but with an old one.
+
+In such case you may need to:
+
+- Check if a new Dockerfile has any errors and if it was successfully build and tagged
+- Follow steps from [Run, Stop, Remove](#Run, Stop, Remove)
+- Follow steps from [Development time cleanup](#Development time cleanup)
+
+ [^TOC^](#Table of contents)
+
+#### Composer
+
+If you want to run any PHP composer command then you have two options:
+
+exec command:
+
+```sh
+docker-compose exec php-composer-v2 composer install
+```
+
+or attach to the container:
+
+```sh
+docker attach carrental-php-composer-v2-1
+```
+
+then you will be logged into the `carrental-php-composer-v2-1` shell (`/bin/bash`) and inside the project directory so you will be able to type:
+
+```sh
+composer install
+```
+
+Note that example of attaching above used `docker` command instead of `docker-compose` therefore a full name of the container was used (`carrental-php-composer-v2-1`) instead of the service name (`php-composer-v2`)
+
+To exit from the attached container just run:
+
+```sh
+exit
+```
+
+that will exit the container but since its restart policy is:
+
+```yaml
+ php-composer-v2:
+ restart: unless-stopped
+```
+
+then it will be restarted, allowing you to attach to it again.
+
+ [^TOC^](#Table of contents)
+
+#### Monitoring
+
+For monitoring is good to open a new terminal window and run:
+
+```sh
+watch -t -n 2 "docker ps -a"
+```
+
+then open another window and type:
+
+```sh
+docker stats -a
+```
+
+`docker stats` has issue that after some time there are lot of "dead" entries that are meaningless. In order to get rid of them you need to terminate that command with Ctrl+c and run it again.
+
+To see logs (in case you run `docker-compose` `up` with the `-d` or `--detach` flag):
+
+```sh
+docker-compose logs
+```
+
+To list images releated to this project run:
+
+```sh
+docker image ls 'carrental_*'
+```
+
+ [^TOC^](#Table of contents)
+
+#### Reinstallation
+
+At any point of time you may run the `./setup.sh` script again as described in [Quick setup (without Docker cleanup)](#Quick setup (without Docker cleanup)).
+
+You may do that for example to change the project's files and directories ownership to a different user. If you want to do that just switch to the user that should own that project and perform the `./setup.sh` again.
+
+ [^TOC^](#Table of contents)
+
+## Uninstallation
+
+Stop and remove all of the containers:
+
+```sh
+docker-compose down --remove-orphans
+```
+
+
+
+list all of the containers' images:
+
+```sh
+docker image ls 'carrental_*'
+```
+
+If listed images are the one you expect you may remove them by running:
+
+```sh
+docker image rm -f $(docker image ls -q 'carrental_*')
+```
+
+
+
+if you see:
+
+> Error response from daemon: conflict: unable to delete 8a9b37ed9ecc (cannot be forced) - image has dependent child images
+
+
+
+remove dandling images:
+
+```sh
+docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
+```
+
+and repeat command:
+
+```sh
+docker image rm -f $(docker image ls -q 'carrental_*')
+```
+
+again.
+
+If you still can't remove an image, try by using its name:tag for eg.:
+
+```sh
+docker image rm -f carrental_php:8.1.3-fpm-buster
+```
+
+
+
+Remove the project directory with its files (you should not need `sudo` for this)
+
+ [^TOC^](#Table of contents)
+
+## Elasticsearch
+
+**References:**
+
+[Elasticsearch 7.17 Guide](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index.html)
+
+[Elasticsearch 7.17 Guide - Docker](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docker.html)
+
+
+
+#### Reinitialize
+
+At any time when you messed up the example cars index you may re-create it and populate with a single command (your shell needs to be in the [./docker/service](./docker/service) dir):
+
+```sh
+docker-compose exec php-composer-v2 /bin/sh -c "/app/default/.elasticsearch-http-requests/init.sh"
+```
+
+It deletes index, creates it, and populates with the example data.
+
+terminal output:
+
+```
+...
+
+Performing cURL request:
+curl -sSL -X GET 'http://elasticsearch-v7:9200/cars/_count'
+{"count":39,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
+Success.
+Done!
+```
+
+or you may do it step by step:
+
+- [Delete index](#Delete index)
+- [Create index](#Create index)
+- [Populate index with data](#Populate index with data)
+
+An alternative way is to run the `./setup.sh` script again as described in [Quick setup (without Docker cleanup)](#Quick setup (without Docker cleanup))
+
+You may use also: [Step by step other methods](#Step by step other methods)
+
+ [^TOC^](#Table of contents)
+
+#### Elasticsearch code
+
All Elasticsearch implementation related code is placed in `src/Elasticsearch` directory.
The core ranking logic is built [from specific `Factors` classes](https://github.com/lrynek/phpers-2021/tree/main/src/Elasticsearch/ValueObject/Factor):
@@ -71,5 +1550,21 @@ final class RecommendedSorter implements FactorSorterInterface
💡 In order to get rid of customly ranked results on the listing you can switch to `DefaultSorter` that sorts all results ascending by their `id`.
+ [^TOC^](#Table of contents)
+
+## Credits
+
+[Ryszard](https://stackoverflow.com/users/1174405?tab=profile)
+
+- Application conversion to docker-compose
+- Setup and initialization scripts
+- Docker and docker-compose related manuals
+
+ [^TOC^](#Table of contents)
+
## Copyrights
+
Apart from [the project's LICENSE](https://github.com/lrynek/phpers-2021/blob/main/LICENSE), [all car photo samples](https://github.com/lrynek/phpers-2021/tree/main/public/images/cars) used in the project are taken from Google search results and all copyrights applies to their respective authors and shouldn't be used further than private/educational use without their explicit consent.
+
+ [^TOC^](#Table of contents)
+
diff --git a/.elasticsearch-http-requests/Check.http b/app/default/.elasticsearch-http-requests/Check.http
similarity index 100%
rename from .elasticsearch-http-requests/Check.http
rename to app/default/.elasticsearch-http-requests/Check.http
diff --git a/.elasticsearch-http-requests/Document/Create_or_Update.http b/app/default/.elasticsearch-http-requests/Document/Create_or_Update.http
similarity index 100%
rename from .elasticsearch-http-requests/Document/Create_or_Update.http
rename to app/default/.elasticsearch-http-requests/Document/Create_or_Update.http
diff --git a/.elasticsearch-http-requests/Index/Bulk.http b/app/default/.elasticsearch-http-requests/Index/Bulk.http
similarity index 100%
rename from .elasticsearch-http-requests/Index/Bulk.http
rename to app/default/.elasticsearch-http-requests/Index/Bulk.http
diff --git a/.elasticsearch-http-requests/Index/Count.http b/app/default/.elasticsearch-http-requests/Index/Count.http
similarity index 100%
rename from .elasticsearch-http-requests/Index/Count.http
rename to app/default/.elasticsearch-http-requests/Index/Count.http
diff --git a/.elasticsearch-http-requests/Index/Create.http b/app/default/.elasticsearch-http-requests/Index/Create.http
similarity index 100%
rename from .elasticsearch-http-requests/Index/Create.http
rename to app/default/.elasticsearch-http-requests/Index/Create.http
diff --git a/.elasticsearch-http-requests/Index/Delete.http b/app/default/.elasticsearch-http-requests/Index/Delete.http
similarity index 100%
rename from .elasticsearch-http-requests/Index/Delete.http
rename to app/default/.elasticsearch-http-requests/Index/Delete.http
diff --git a/.elasticsearch-http-requests/Index/Mappings.http b/app/default/.elasticsearch-http-requests/Index/Mappings.http
similarity index 100%
rename from .elasticsearch-http-requests/Index/Mappings.http
rename to app/default/.elasticsearch-http-requests/Index/Mappings.http
diff --git a/.elasticsearch-http-requests/Search/All_structure.http b/app/default/.elasticsearch-http-requests/Search/All_structure.http
similarity index 100%
rename from .elasticsearch-http-requests/Search/All_structure.http
rename to app/default/.elasticsearch-http-requests/Search/All_structure.http
diff --git a/.elasticsearch-http-requests/Search/Functions.http b/app/default/.elasticsearch-http-requests/Search/Functions.http
similarity index 100%
rename from .elasticsearch-http-requests/Search/Functions.http
rename to app/default/.elasticsearch-http-requests/Search/Functions.http
diff --git a/.elasticsearch-http-requests/Search/Functions_colors.http b/app/default/.elasticsearch-http-requests/Search/Functions_colors.http
similarity index 100%
rename from .elasticsearch-http-requests/Search/Functions_colors.http
rename to app/default/.elasticsearch-http-requests/Search/Functions_colors.http
diff --git a/.elasticsearch-http-requests/Search/Phrase.http b/app/default/.elasticsearch-http-requests/Search/Phrase.http
similarity index 100%
rename from .elasticsearch-http-requests/Search/Phrase.http
rename to app/default/.elasticsearch-http-requests/Search/Phrase.http
diff --git a/app/default/.elasticsearch-http-requests/init.sh b/app/default/.elasticsearch-http-requests/init.sh
new file mode 100755
index 0000000..0e7dead
--- /dev/null
+++ b/app/default/.elasticsearch-http-requests/init.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+set -eu
+
+SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )";
+
+"$SCRIPTPATH/request.sh" "$SCRIPTPATH/Index/Delete.http" || true
+"$SCRIPTPATH/request.sh" "$SCRIPTPATH/Index/Create.http" && \
+"$SCRIPTPATH/request.sh" "$SCRIPTPATH/Index/Bulk.http" && sleep 1 && \
+"$SCRIPTPATH/request.sh" "$SCRIPTPATH/Index/Count.http"
+
+printf "Done!\n"
\ No newline at end of file
diff --git a/app/default/.elasticsearch-http-requests/request.sh b/app/default/.elasticsearch-http-requests/request.sh
new file mode 100755
index 0000000..ad6be8f
--- /dev/null
+++ b/app/default/.elasticsearch-http-requests/request.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+
+# Example usage:
+# ./request.sh ./Index/Create.http
+# ./request.sh /app/default/.elasticsearch-http-requests/Index/Delete.http
+
+set -eu
+
+http_request_path="${1:-}"
+
+[ -n "$http_request_path" ] || \
+ { printf "Usage: $1 \n" && exit 1; }
+
+[ -n "${DOCKER_ELASTICSEARCH_HOST:-}" ] || \
+ { printf "Set ENV varialbe DOCKER_ELASTICSEARCH_HOST first\n" && exit 1 ;}
+
+RED='\033[31;5;7m'
+GREEN='\033[1;0;42m'
+NC='\033[0m' # No Color
+
+SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )";
+
+# if request path is not absolute make it relative to the script
+[ ! "$http_request_path" = "${http_request_path#/}" ] || \
+ http_request_path="$SCRIPTPATH/$http_request_path"
+
+[ -f $http_request_path ] || \
+ { printf "Path does not point to a file, path: $1\n" && exit 1; }
+
+[ -r "$http_request_path" ] || \
+ { printf "File is not readable, check permissions, path: $1\n" && exit 1; }
+
+# read content of a file
+content="$(cat "$http_request_path" || { 1>&2 printf "Could not read the file: $http_request_path\n" && exit 1; })"
+
+# dissasemble request to its part
+request="$(printf "$content" | head -n1)"
+method="$(printf "$request" | grep -oE '^\w+')"
+url=$(printf "$request" | sed 's/^\w* //')
+header="$(printf "$content\n" | awk '/http/,/^$/' | tail -n+2 | sed '$d')"
+body="$(printf "$content" | tail -n+"$(printf "$content\n" | awk '/http/,/^$/' | wc -l)" | tail -n+2)"
+
+# convert localhost to elasticsearch service host
+find='http://localhost:9200'
+replace="$DOCKER_ELASTICSEARCH_HOST"
+url="$(printf "$url\n" | awk -v r="$replace" -v f="$find" '{ gsub(f,r); print $0 }')"
+
+# create header options for curl
+curl_header=''
+newline="$(printf "\nx")" && newline="${newline%x}"
+IFS="$newline"
+for head in $header; do
+ curl_header="${curl_header} -H '$head'"
+done
+
+option_data=''
+[ -z "$body" ] || option_data=" --data-raw \\${newline}'$body${newline}'"
+
+# escape body's single quote '
+body="$(printf "$body" | sed "s/'/\\\'/g")"
+
+from_newline=''
+[ -z "$option_data" ] || from_newline="\\${newline}"
+
+#Bugfix for: elasticsearch 7 deprec. use of _doc: '{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."}],"type":"illegal_argument_exception","reason":"The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."},"status":400}'
+[ ! "$method" = 'PUT' ] || url="${url}?include_type_name=true"
+
+command_request="curl -sSL -X ${method:-GET}${curl_header}${option_data} ${from_newline}'$url'"
+printf "Performing cURL request:\n${command_request}\n"
+
+# example success responses
+# expected_pattern='\{"count":0,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}'
+# expected_pattern='^\{"acknowledged":true' # Delete,
+
+# check for error response
+expected_pattern='^\s*\{\s*"error"' # Delete,
+response="$(printf "$command_request\n" | sh || ec=$? )"
+
+# validate response
+printf "$response" | grep -vE "$expected_pattern" > /dev/null || \
+ { printf "${RED}FAIL${NC}\nThere was an error with cURL exit code: ${ec:-0}, and response: $response\n" && exit ${ec:-1}; }
+
+printf "$response\n"
+printf "${GREEN}Success.${NC}\n"
\ No newline at end of file
diff --git a/src/Controller/.gitignore b/app/default/.env
similarity index 100%
rename from src/Controller/.gitignore
rename to app/default/.env
diff --git a/.gitignore b/app/default/.gitignore
similarity index 100%
rename from .gitignore
rename to app/default/.gitignore
diff --git a/app/default/LICENSE b/app/default/LICENSE
new file mode 100644
index 0000000..1c9cbe2
--- /dev/null
+++ b/app/default/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Łukasz Rynek
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/bin/console b/app/default/bin/console
old mode 100755
new mode 100644
similarity index 100%
rename from bin/console
rename to app/default/bin/console
diff --git a/composer.json b/app/default/composer.json
similarity index 96%
rename from composer.json
rename to app/default/composer.json
index 4ffdb38..4397419 100644
--- a/composer.json
+++ b/app/default/composer.json
@@ -16,8 +16,7 @@
"symfony/runtime": "5.4.*",
"symfony/twig-bundle": "5.4.*",
"symfony/yaml": "5.4.*",
- "twig/extra-bundle": "^3.0",
- "twig/twig": "^3.0"
+ "twig/extra-bundle": "^3.0"
},
"require-dev": {
},
diff --git a/composer.lock b/app/default/composer.lock
similarity index 96%
rename from composer.lock
rename to app/default/composer.lock
index 80fb3f2..0613fbf 100644
--- a/composer.lock
+++ b/app/default/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "48aa5afe50d1f6a83a78669c39530ede",
+ "content-hash": "e86fee6de8c9cc2005f15cfe0befa5b3",
"packages": [
{
"name": "doctrine/annotations",
@@ -80,16 +80,16 @@
},
{
"name": "doctrine/lexer",
- "version": "1.2.2",
+ "version": "1.2.3",
"source": {
"type": "git",
"url": "https://github.com/doctrine/lexer.git",
- "reference": "9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c"
+ "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/lexer/zipball/9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c",
- "reference": "9c50f840f257bbb941e6f4a0e94ccf5db5c3f76c",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
+ "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
"shasum": ""
},
"require": {
@@ -97,7 +97,7 @@
},
"require-dev": {
"doctrine/coding-standard": "^9.0",
- "phpstan/phpstan": "1.3",
+ "phpstan/phpstan": "^1.3",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"vimeo/psalm": "^4.11"
},
@@ -136,7 +136,7 @@
],
"support": {
"issues": "https://github.com/doctrine/lexer/issues",
- "source": "https://github.com/doctrine/lexer/tree/1.2.2"
+ "source": "https://github.com/doctrine/lexer/tree/1.2.3"
},
"funding": [
{
@@ -152,7 +152,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-12T08:27:12+00:00"
+ "time": "2022-02-28T11:07:21+00:00"
},
{
"name": "guzzlehttp/guzzle",
@@ -198,12 +198,12 @@
}
},
"autoload": {
- "psr-4": {
- "GuzzleHttp\\": "src/"
- },
"files": [
"src/functions_include.php"
- ]
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -305,12 +305,12 @@
}
},
"autoload": {
- "psr-4": {
- "GuzzleHttp\\Promise\\": "src/"
- },
"files": [
"src/functions_include.php"
- ]
+ ],
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -958,16 +958,16 @@
},
{
"name": "symfony/cache",
- "version": "v5.4.3",
+ "version": "v5.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
- "reference": "4178f0a19ec3f1f76e7f1a07b8187cbe3d94b825"
+ "reference": "c0718d0e01ac14251a45cc9c8b93716ec41ae64b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/cache/zipball/4178f0a19ec3f1f76e7f1a07b8187cbe3d94b825",
- "reference": "4178f0a19ec3f1f76e7f1a07b8187cbe3d94b825",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/c0718d0e01ac14251a45cc9c8b93716ec41ae64b",
+ "reference": "c0718d0e01ac14251a45cc9c8b93716ec41ae64b",
"shasum": ""
},
"require": {
@@ -1035,7 +1035,7 @@
"psr6"
],
"support": {
- "source": "https://github.com/symfony/cache/tree/v5.4.3"
+ "source": "https://github.com/symfony/cache/tree/v5.4.6"
},
"funding": [
{
@@ -1051,7 +1051,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-26T16:28:35+00:00"
+ "time": "2022-03-02T12:56:28+00:00"
},
{
"name": "symfony/cache-contracts",
@@ -1213,16 +1213,16 @@
},
{
"name": "symfony/console",
- "version": "v5.4.3",
+ "version": "v5.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "a2a86ec353d825c75856c6fd14fac416a7bdb6b8"
+ "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/a2a86ec353d825c75856c6fd14fac416a7bdb6b8",
- "reference": "a2a86ec353d825c75856c6fd14fac416a7bdb6b8",
+ "url": "https://api.github.com/repos/symfony/console/zipball/d8111acc99876953f52fe16d4c50eb60940d49ad",
+ "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad",
"shasum": ""
},
"require": {
@@ -1292,7 +1292,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v5.4.3"
+ "source": "https://github.com/symfony/console/tree/v5.4.5"
},
"funding": [
{
@@ -1308,20 +1308,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-26T16:28:35+00:00"
+ "time": "2022-02-24T12:45:35+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v5.4.3",
+ "version": "v5.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "974580fd67f14d65b045c11b09eb149cd4b13df5"
+ "reference": "0828fa3e6e436243dbb3dc85abe6b698b3876b89"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/974580fd67f14d65b045c11b09eb149cd4b13df5",
- "reference": "974580fd67f14d65b045c11b09eb149cd4b13df5",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0828fa3e6e436243dbb3dc85abe6b698b3876b89",
+ "reference": "0828fa3e6e436243dbb3dc85abe6b698b3876b89",
"shasum": ""
},
"require": {
@@ -1337,7 +1337,7 @@
"symfony/config": "<5.3",
"symfony/finder": "<4.4",
"symfony/proxy-manager-bridge": "<4.4",
- "symfony/yaml": "<4.4"
+ "symfony/yaml": "<4.4.26"
},
"provide": {
"psr/container-implementation": "1.0",
@@ -1346,7 +1346,7 @@
"require-dev": {
"symfony/config": "^5.3|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
- "symfony/yaml": "^4.4|^5.0|^6.0"
+ "symfony/yaml": "^4.4.26|^5.0|^6.0"
},
"suggest": {
"symfony/config": "",
@@ -1381,7 +1381,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dependency-injection/tree/v5.4.3"
+ "source": "https://github.com/symfony/dependency-injection/tree/v5.4.6"
},
"funding": [
{
@@ -1397,7 +1397,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-26T16:28:35+00:00"
+ "time": "2022-03-02T12:42:23+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -1468,16 +1468,16 @@
},
{
"name": "symfony/dotenv",
- "version": "v5.4.3",
+ "version": "v5.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/dotenv.git",
- "reference": "84d1af2d39dd81b48eb1cd3af3f107eea7a275bb"
+ "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dotenv/zipball/84d1af2d39dd81b48eb1cd3af3f107eea7a275bb",
- "reference": "84d1af2d39dd81b48eb1cd3af3f107eea7a275bb",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/83a2310904a4f5d4f42526227b5a578ac82232a9",
+ "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9",
"shasum": ""
},
"require": {
@@ -1519,7 +1519,7 @@
"environment"
],
"support": {
- "source": "https://github.com/symfony/dotenv/tree/v5.4.3"
+ "source": "https://github.com/symfony/dotenv/tree/v5.4.5"
},
"funding": [
{
@@ -1535,7 +1535,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-26T16:19:10+00:00"
+ "time": "2022-02-15T17:04:12+00:00"
},
{
"name": "symfony/error-handler",
@@ -1774,16 +1774,16 @@
},
{
"name": "symfony/filesystem",
- "version": "v5.4.3",
+ "version": "v5.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "0f0c4bf1840420f4aef3f32044a9dbb24682731b"
+ "reference": "d53a45039974952af7f7ebc461ccdd4295e29440"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/0f0c4bf1840420f4aef3f32044a9dbb24682731b",
- "reference": "0f0c4bf1840420f4aef3f32044a9dbb24682731b",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/d53a45039974952af7f7ebc461ccdd4295e29440",
+ "reference": "d53a45039974952af7f7ebc461ccdd4295e29440",
"shasum": ""
},
"require": {
@@ -1818,7 +1818,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v5.4.3"
+ "source": "https://github.com/symfony/filesystem/tree/v5.4.6"
},
"funding": [
{
@@ -1834,7 +1834,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:53:40+00:00"
+ "time": "2022-03-02T12:42:23+00:00"
},
{
"name": "symfony/finder",
@@ -1901,16 +1901,16 @@
},
{
"name": "symfony/flex",
- "version": "v2.1.4",
+ "version": "v2.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/flex.git",
- "reference": "110e8928b6e719e9b9f146c8fd92c41a4b74a3ac"
+ "reference": "dd7dafe3bfebf8441e167b76d8a18974585467f3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/flex/zipball/110e8928b6e719e9b9f146c8fd92c41a4b74a3ac",
- "reference": "110e8928b6e719e9b9f146c8fd92c41a4b74a3ac",
+ "url": "https://api.github.com/repos/symfony/flex/zipball/dd7dafe3bfebf8441e167b76d8a18974585467f3",
+ "reference": "dd7dafe3bfebf8441e167b76d8a18974585467f3",
"shasum": ""
},
"require": {
@@ -1946,7 +1946,7 @@
"description": "Composer plugin for Symfony",
"support": {
"issues": "https://github.com/symfony/flex/issues",
- "source": "https://github.com/symfony/flex/tree/v2.1.4"
+ "source": "https://github.com/symfony/flex/tree/v2.1.6"
},
"funding": [
{
@@ -1962,20 +1962,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-27T10:25:12+00:00"
+ "time": "2022-02-16T17:31:43+00:00"
},
{
"name": "symfony/framework-bundle",
- "version": "v5.4.4",
+ "version": "v5.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/framework-bundle.git",
- "reference": "d848b8ca3d87d0fcc9d0ccbc88cf8e128db0d4c7"
+ "reference": "76ea755f30924924ea37a28e098df61679efcb63"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/d848b8ca3d87d0fcc9d0ccbc88cf8e128db0d4c7",
- "reference": "d848b8ca3d87d0fcc9d0ccbc88cf8e128db0d4c7",
+ "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/76ea755f30924924ea37a28e098df61679efcb63",
+ "reference": "76ea755f30924924ea37a28e098df61679efcb63",
"shasum": ""
},
"require": {
@@ -1983,7 +1983,7 @@
"php": ">=7.2.5",
"symfony/cache": "^5.2|^6.0",
"symfony/config": "^5.3|^6.0",
- "symfony/dependency-injection": "^5.3|^6.0",
+ "symfony/dependency-injection": "^5.4.5|^6.0.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/error-handler": "^4.4.1|^5.0.1|^6.0",
"symfony/event-dispatcher": "^5.1|^6.0",
@@ -2030,7 +2030,6 @@
"doctrine/annotations": "^1.13.1",
"doctrine/cache": "^1.11|^2.0",
"doctrine/persistence": "^1.3|^2.0",
- "paragonie/sodium_compat": "^1.8",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/asset": "^5.3|^6.0",
"symfony/browser-kit": "^5.4|^6.0",
@@ -2099,7 +2098,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/framework-bundle/tree/v5.4.4"
+ "source": "https://github.com/symfony/framework-bundle/tree/v5.4.6"
},
"funding": [
{
@@ -2115,20 +2114,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-29T17:49:40+00:00"
+ "time": "2022-03-04T14:13:35+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v5.4.3",
+ "version": "v5.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "ef409ff341a565a3663157d4324536746d49a0c7"
+ "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ef409ff341a565a3663157d4324536746d49a0c7",
- "reference": "ef409ff341a565a3663157d4324536746d49a0c7",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/34e89bc147633c0f9dd6caaaf56da3b806a21465",
+ "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465",
"shasum": ""
},
"require": {
@@ -2172,7 +2171,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v5.4.3"
+ "source": "https://github.com/symfony/http-foundation/tree/v5.4.6"
},
"funding": [
{
@@ -2188,20 +2187,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:53:40+00:00"
+ "time": "2022-03-05T21:03:43+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v5.4.4",
+ "version": "v5.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "49f40347228c773688a0488feea0175aa7f4d268"
+ "reference": "d41f29ae9af1b5f40c7ebcddf09082953229411d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/49f40347228c773688a0488feea0175aa7f4d268",
- "reference": "49f40347228c773688a0488feea0175aa7f4d268",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d41f29ae9af1b5f40c7ebcddf09082953229411d",
+ "reference": "d41f29ae9af1b5f40c7ebcddf09082953229411d",
"shasum": ""
},
"require": {
@@ -2284,7 +2283,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v5.4.4"
+ "source": "https://github.com/symfony/http-kernel/tree/v5.4.6"
},
"funding": [
{
@@ -2300,11 +2299,11 @@
"type": "tidelift"
}
],
- "time": "2022-01-29T18:08:07+00:00"
+ "time": "2022-03-05T21:14:51+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.24.0",
+ "version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
@@ -2365,7 +2364,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.24.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0"
},
"funding": [
{
@@ -2385,7 +2384,7 @@
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.24.0",
+ "version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
@@ -2449,7 +2448,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
},
"funding": [
{
@@ -2469,7 +2468,7 @@
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.24.0",
+ "version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
@@ -2501,12 +2500,12 @@
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
"files": [
"bootstrap.php"
- ]
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2532,7 +2531,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0"
},
"funding": [
{
@@ -2552,7 +2551,7 @@
},
{
"name": "symfony/polyfill-php73",
- "version": "v1.24.0",
+ "version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
@@ -2611,7 +2610,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.24.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0"
},
"funding": [
{
@@ -2631,16 +2630,16 @@
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.24.0",
+ "version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9"
+ "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9",
- "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
+ "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
"shasum": ""
},
"require": {
@@ -2694,7 +2693,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
},
"funding": [
{
@@ -2710,11 +2709,11 @@
"type": "tidelift"
}
],
- "time": "2021-09-13T13:58:33+00:00"
+ "time": "2022-03-04T08:16:47+00:00"
},
{
"name": "symfony/polyfill-php81",
- "version": "v1.24.0",
+ "version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
@@ -2773,7 +2772,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php81/tree/v1.24.0"
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0"
},
"funding": [
{
@@ -2883,16 +2882,16 @@
},
{
"name": "symfony/runtime",
- "version": "v5.4.3",
+ "version": "v5.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/runtime.git",
- "reference": "354ce8493868594339cafe17ef67aba874c12158"
+ "reference": "06fdd940ebf240ed7d9c9832cd97bf3133847316"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/runtime/zipball/354ce8493868594339cafe17ef67aba874c12158",
- "reference": "354ce8493868594339cafe17ef67aba874c12158",
+ "url": "https://api.github.com/repos/symfony/runtime/zipball/06fdd940ebf240ed7d9c9832cd97bf3133847316",
+ "reference": "06fdd940ebf240ed7d9c9832cd97bf3133847316",
"shasum": ""
},
"require": {
@@ -2940,7 +2939,7 @@
"description": "Enables decoupling PHP applications from global state",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/runtime/tree/v5.4.3"
+ "source": "https://github.com/symfony/runtime/tree/v5.4.5"
},
"funding": [
{
@@ -2956,7 +2955,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-26T17:32:52+00:00"
+ "time": "2022-02-15T13:38:03+00:00"
},
{
"name": "symfony/service-contracts",
@@ -3073,12 +3072,12 @@
},
"type": "library",
"autoload": {
- "psr-4": {
- "Symfony\\Component\\String\\": ""
- },
"files": [
"Resources/functions.php"
],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
"exclude-from-classmap": [
"/Tests/"
]
@@ -3206,16 +3205,16 @@
},
{
"name": "symfony/twig-bridge",
- "version": "v5.4.3",
+ "version": "v5.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bridge.git",
- "reference": "925719b20832e3dabd399fd9ebf85ed0eabf9999"
+ "reference": "648c8694a9470ae4aaf64cbce1b640f5941fd7c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/925719b20832e3dabd399fd9ebf85ed0eabf9999",
- "reference": "925719b20832e3dabd399fd9ebf85ed0eabf9999",
+ "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/648c8694a9470ae4aaf64cbce1b640f5941fd7c9",
+ "reference": "648c8694a9470ae4aaf64cbce1b640f5941fd7c9",
"shasum": ""
},
"require": {
@@ -3307,7 +3306,7 @@
"description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/twig-bridge/tree/v5.4.3"
+ "source": "https://github.com/symfony/twig-bridge/tree/v5.4.5"
},
"funding": [
{
@@ -3323,7 +3322,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:53:40+00:00"
+ "time": "2022-02-09T08:59:58+00:00"
},
{
"name": "symfony/twig-bundle",
@@ -3416,16 +3415,16 @@
},
{
"name": "symfony/var-dumper",
- "version": "v5.4.3",
+ "version": "v5.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "970a01f208bf895c5f327ba40b72288da43adec4"
+ "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/970a01f208bf895c5f327ba40b72288da43adec4",
- "reference": "970a01f208bf895c5f327ba40b72288da43adec4",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/294e9da6e2e0dd404e983daa5aa74253d92c05d0",
+ "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0",
"shasum": ""
},
"require": {
@@ -3485,7 +3484,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v5.4.3"
+ "source": "https://github.com/symfony/var-dumper/tree/v5.4.6"
},
"funding": [
{
@@ -3501,20 +3500,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-17T16:30:37+00:00"
+ "time": "2022-03-02T12:42:23+00:00"
},
{
"name": "symfony/var-exporter",
- "version": "v5.4.3",
+ "version": "v5.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
- "reference": "b199936b7365be36663532e547812d3abb10234a"
+ "reference": "49e2355fe6f59ea30c18ebb68edf13b7e20582e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b199936b7365be36663532e547812d3abb10234a",
- "reference": "b199936b7365be36663532e547812d3abb10234a",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/49e2355fe6f59ea30c18ebb68edf13b7e20582e5",
+ "reference": "49e2355fe6f59ea30c18ebb68edf13b7e20582e5",
"shasum": ""
},
"require": {
@@ -3558,7 +3557,7 @@
"serialize"
],
"support": {
- "source": "https://github.com/symfony/var-exporter/tree/v5.4.3"
+ "source": "https://github.com/symfony/var-exporter/tree/v5.4.6"
},
"funding": [
{
@@ -3574,7 +3573,7 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:53:40+00:00"
+ "time": "2022-03-02T12:42:23+00:00"
},
{
"name": "symfony/yaml",
diff --git a/config/bundles.php b/app/default/config/bundles.php
similarity index 100%
rename from config/bundles.php
rename to app/default/config/bundles.php
diff --git a/config/packages/cache.yaml b/app/default/config/packages/cache.yaml
similarity index 100%
rename from config/packages/cache.yaml
rename to app/default/config/packages/cache.yaml
diff --git a/config/packages/framework.yaml b/app/default/config/packages/framework.yaml
similarity index 100%
rename from config/packages/framework.yaml
rename to app/default/config/packages/framework.yaml
diff --git a/config/packages/routing.yaml b/app/default/config/packages/routing.yaml
similarity index 100%
rename from config/packages/routing.yaml
rename to app/default/config/packages/routing.yaml
diff --git a/config/packages/sensio_framework_extra.yaml b/app/default/config/packages/sensio_framework_extra.yaml
similarity index 100%
rename from config/packages/sensio_framework_extra.yaml
rename to app/default/config/packages/sensio_framework_extra.yaml
diff --git a/config/packages/twig.yaml b/app/default/config/packages/twig.yaml
similarity index 100%
rename from config/packages/twig.yaml
rename to app/default/config/packages/twig.yaml
diff --git a/config/preload.php b/app/default/config/preload.php
similarity index 100%
rename from config/preload.php
rename to app/default/config/preload.php
diff --git a/config/routes.yaml b/app/default/config/routes.yaml
similarity index 100%
rename from config/routes.yaml
rename to app/default/config/routes.yaml
diff --git a/config/routes/annotations.yaml b/app/default/config/routes/annotations.yaml
similarity index 100%
rename from config/routes/annotations.yaml
rename to app/default/config/routes/annotations.yaml
diff --git a/config/routes/framework.yaml b/app/default/config/routes/framework.yaml
similarity index 100%
rename from config/routes/framework.yaml
rename to app/default/config/routes/framework.yaml
diff --git a/config/services.yaml b/app/default/config/services.yaml
similarity index 100%
rename from config/services.yaml
rename to app/default/config/services.yaml
diff --git a/insomnia.json b/app/default/insomnia.json
similarity index 100%
rename from insomnia.json
rename to app/default/insomnia.json
diff --git a/public/bootstrap.bundle.min.js b/app/default/public/bootstrap.bundle.min.js
similarity index 100%
rename from public/bootstrap.bundle.min.js
rename to app/default/public/bootstrap.bundle.min.js
diff --git a/public/bootstrap.min.css b/app/default/public/bootstrap.min.css
similarity index 100%
rename from public/bootstrap.min.css
rename to app/default/public/bootstrap.min.css
diff --git a/public/favicon.ico b/app/default/public/favicon.ico
similarity index 100%
rename from public/favicon.ico
rename to app/default/public/favicon.ico
diff --git a/public/favicon.png b/app/default/public/favicon.png
similarity index 100%
rename from public/favicon.png
rename to app/default/public/favicon.png
diff --git a/public/images/cars/aston-martin-db7-gt.jpg b/app/default/public/images/cars/aston-martin-db7-gt.jpg
similarity index 100%
rename from public/images/cars/aston-martin-db7-gt.jpg
rename to app/default/public/images/cars/aston-martin-db7-gt.jpg
diff --git a/public/images/cars/aston-martin-db7-vantage.jpg b/app/default/public/images/cars/aston-martin-db7-vantage.jpg
similarity index 100%
rename from public/images/cars/aston-martin-db7-vantage.jpg
rename to app/default/public/images/cars/aston-martin-db7-vantage.jpg
diff --git a/public/images/cars/aston-martin-db7-zagato.jpg b/app/default/public/images/cars/aston-martin-db7-zagato.jpg
similarity index 100%
rename from public/images/cars/aston-martin-db7-zagato.jpg
rename to app/default/public/images/cars/aston-martin-db7-zagato.jpg
diff --git a/public/images/cars/bmw-i8-roadster-2019.jpg b/app/default/public/images/cars/bmw-i8-roadster-2019.jpg
similarity index 100%
rename from public/images/cars/bmw-i8-roadster-2019.jpg
rename to app/default/public/images/cars/bmw-i8-roadster-2019.jpg
diff --git a/public/images/cars/bmw-i8-roadster.jpg b/app/default/public/images/cars/bmw-i8-roadster.jpg
similarity index 100%
rename from public/images/cars/bmw-i8-roadster.jpg
rename to app/default/public/images/cars/bmw-i8-roadster.jpg
diff --git a/public/images/cars/dodge-challenger.jpg b/app/default/public/images/cars/dodge-challenger.jpg
similarity index 100%
rename from public/images/cars/dodge-challenger.jpg
rename to app/default/public/images/cars/dodge-challenger.jpg
diff --git a/public/images/cars/dodge-viper-gts.jpg b/app/default/public/images/cars/dodge-viper-gts.jpg
similarity index 100%
rename from public/images/cars/dodge-viper-gts.jpg
rename to app/default/public/images/cars/dodge-viper-gts.jpg
diff --git a/public/images/cars/dodge-viper-srt10-roadster.jpg b/app/default/public/images/cars/dodge-viper-srt10-roadster.jpg
similarity index 100%
rename from public/images/cars/dodge-viper-srt10-roadster.jpg
rename to app/default/public/images/cars/dodge-viper-srt10-roadster.jpg
diff --git a/public/images/cars/ferrari-250-gt-california.jpg b/app/default/public/images/cars/ferrari-250-gt-california.jpg
similarity index 100%
rename from public/images/cars/ferrari-250-gt-california.jpg
rename to app/default/public/images/cars/ferrari-250-gt-california.jpg
diff --git a/public/images/cars/ferrari-296-gtb.jpg b/app/default/public/images/cars/ferrari-296-gtb.jpg
similarity index 100%
rename from public/images/cars/ferrari-296-gtb.jpg
rename to app/default/public/images/cars/ferrari-296-gtb.jpg
diff --git a/public/images/cars/ferrari-550-maranello.jpg b/app/default/public/images/cars/ferrari-550-maranello.jpg
similarity index 100%
rename from public/images/cars/ferrari-550-maranello.jpg
rename to app/default/public/images/cars/ferrari-550-maranello.jpg
diff --git a/public/images/cars/ferrari-f8-spider.jpg b/app/default/public/images/cars/ferrari-f8-spider.jpg
similarity index 100%
rename from public/images/cars/ferrari-f8-spider.jpg
rename to app/default/public/images/cars/ferrari-f8-spider.jpg
diff --git a/public/images/cars/ferrari-roma.jpg b/app/default/public/images/cars/ferrari-roma.jpg
similarity index 100%
rename from public/images/cars/ferrari-roma.jpg
rename to app/default/public/images/cars/ferrari-roma.jpg
diff --git a/public/images/cars/ferrari-sf90.jpg b/app/default/public/images/cars/ferrari-sf90.jpg
similarity index 100%
rename from public/images/cars/ferrari-sf90.jpg
rename to app/default/public/images/cars/ferrari-sf90.jpg
diff --git a/public/images/cars/ferrari-testarossa.jpg b/app/default/public/images/cars/ferrari-testarossa.jpg
similarity index 100%
rename from public/images/cars/ferrari-testarossa.jpg
rename to app/default/public/images/cars/ferrari-testarossa.jpg
diff --git a/public/images/cars/ford-gt.jpg b/app/default/public/images/cars/ford-gt.jpg
similarity index 100%
rename from public/images/cars/ford-gt.jpg
rename to app/default/public/images/cars/ford-gt.jpg
diff --git a/public/images/cars/ford-mustang-boss-302.jpg b/app/default/public/images/cars/ford-mustang-boss-302.jpg
similarity index 100%
rename from public/images/cars/ford-mustang-boss-302.jpg
rename to app/default/public/images/cars/ford-mustang-boss-302.jpg
diff --git a/public/images/cars/ford-mustang-rtr.jpg b/app/default/public/images/cars/ford-mustang-rtr.jpg
similarity index 100%
rename from public/images/cars/ford-mustang-rtr.jpg
rename to app/default/public/images/cars/ford-mustang-rtr.jpg
diff --git a/public/images/cars/lamborghini-aventador.jpg b/app/default/public/images/cars/lamborghini-aventador.jpg
similarity index 100%
rename from public/images/cars/lamborghini-aventador.jpg
rename to app/default/public/images/cars/lamborghini-aventador.jpg
diff --git a/public/images/cars/lamborghini-countach.jpg b/app/default/public/images/cars/lamborghini-countach.jpg
similarity index 100%
rename from public/images/cars/lamborghini-countach.jpg
rename to app/default/public/images/cars/lamborghini-countach.jpg
diff --git a/public/images/cars/lamborghini-diablo.jpg b/app/default/public/images/cars/lamborghini-diablo.jpg
similarity index 100%
rename from public/images/cars/lamborghini-diablo.jpg
rename to app/default/public/images/cars/lamborghini-diablo.jpg
diff --git a/public/images/cars/lamborghini-huracan.jpg b/app/default/public/images/cars/lamborghini-huracan.jpg
similarity index 100%
rename from public/images/cars/lamborghini-huracan.jpg
rename to app/default/public/images/cars/lamborghini-huracan.jpg
diff --git a/public/images/cars/lamborghini-murcielago-lp670.jpg b/app/default/public/images/cars/lamborghini-murcielago-lp670.jpg
similarity index 100%
rename from public/images/cars/lamborghini-murcielago-lp670.jpg
rename to app/default/public/images/cars/lamborghini-murcielago-lp670.jpg
diff --git a/public/images/cars/lamborghini-sc20.jpg b/app/default/public/images/cars/lamborghini-sc20.jpg
similarity index 100%
rename from public/images/cars/lamborghini-sc20.jpg
rename to app/default/public/images/cars/lamborghini-sc20.jpg
diff --git a/public/images/cars/mazda-mx5-miata.jpg b/app/default/public/images/cars/mazda-mx5-miata.jpg
similarity index 100%
rename from public/images/cars/mazda-mx5-miata.jpg
rename to app/default/public/images/cars/mazda-mx5-miata.jpg
diff --git a/public/images/cars/mazda-mx5-z-sport.jpg b/app/default/public/images/cars/mazda-mx5-z-sport.jpg
similarity index 100%
rename from public/images/cars/mazda-mx5-z-sport.jpg
rename to app/default/public/images/cars/mazda-mx5-z-sport.jpg
diff --git a/public/images/cars/mazda-rx-vision-gt3-concept.jpg b/app/default/public/images/cars/mazda-rx-vision-gt3-concept.jpg
similarity index 100%
rename from public/images/cars/mazda-rx-vision-gt3-concept.jpg
rename to app/default/public/images/cars/mazda-rx-vision-gt3-concept.jpg
diff --git a/public/images/cars/mclaren-570s.jpg b/app/default/public/images/cars/mclaren-570s.jpg
similarity index 100%
rename from public/images/cars/mclaren-570s.jpg
rename to app/default/public/images/cars/mclaren-570s.jpg
diff --git a/public/images/cars/mclaren-720s.jpg b/app/default/public/images/cars/mclaren-720s.jpg
similarity index 100%
rename from public/images/cars/mclaren-720s.jpg
rename to app/default/public/images/cars/mclaren-720s.jpg
diff --git a/public/images/cars/mclaren-f1.jpg b/app/default/public/images/cars/mclaren-f1.jpg
similarity index 100%
rename from public/images/cars/mclaren-f1.jpg
rename to app/default/public/images/cars/mclaren-f1.jpg
diff --git a/public/images/cars/mercedes-benz-amg-gt-coupe.jpg b/app/default/public/images/cars/mercedes-benz-amg-gt-coupe.jpg
similarity index 100%
rename from public/images/cars/mercedes-benz-amg-gt-coupe.jpg
rename to app/default/public/images/cars/mercedes-benz-amg-gt-coupe.jpg
diff --git a/public/images/cars/mercedes-benz-gt.jpg b/app/default/public/images/cars/mercedes-benz-gt.jpg
similarity index 100%
rename from public/images/cars/mercedes-benz-gt.jpg
rename to app/default/public/images/cars/mercedes-benz-gt.jpg
diff --git a/public/images/cars/mercedes-benz-sls-amg-coupe.jpg b/app/default/public/images/cars/mercedes-benz-sls-amg-coupe.jpg
similarity index 100%
rename from public/images/cars/mercedes-benz-sls-amg-coupe.jpg
rename to app/default/public/images/cars/mercedes-benz-sls-amg-coupe.jpg
diff --git a/public/images/cars/mercedes-mclaren-slr-722-stirling-moss.jpg b/app/default/public/images/cars/mercedes-mclaren-slr-722-stirling-moss.jpg
similarity index 100%
rename from public/images/cars/mercedes-mclaren-slr-722-stirling-moss.jpg
rename to app/default/public/images/cars/mercedes-mclaren-slr-722-stirling-moss.jpg
diff --git a/public/images/cars/mitsubishi-lancer-evo-x.jpg b/app/default/public/images/cars/mitsubishi-lancer-evo-x.jpg
similarity index 100%
rename from public/images/cars/mitsubishi-lancer-evo-x.jpg
rename to app/default/public/images/cars/mitsubishi-lancer-evo-x.jpg
diff --git a/public/images/cars/porshe-911-gts.jpg b/app/default/public/images/cars/porshe-911-gts.jpg
similarity index 100%
rename from public/images/cars/porshe-911-gts.jpg
rename to app/default/public/images/cars/porshe-911-gts.jpg
diff --git a/public/images/cars/porshe-911-swb.jpg b/app/default/public/images/cars/porshe-911-swb.jpg
similarity index 100%
rename from public/images/cars/porshe-911-swb.jpg
rename to app/default/public/images/cars/porshe-911-swb.jpg
diff --git a/public/images/cars/porshe-911-turbo-s.jpg b/app/default/public/images/cars/porshe-911-turbo-s.jpg
similarity index 100%
rename from public/images/cars/porshe-911-turbo-s.jpg
rename to app/default/public/images/cars/porshe-911-turbo-s.jpg
diff --git a/public/images/cars/porshe-macan.jpg b/app/default/public/images/cars/porshe-macan.jpg
similarity index 100%
rename from public/images/cars/porshe-macan.jpg
rename to app/default/public/images/cars/porshe-macan.jpg
diff --git a/public/index.php b/app/default/public/index.php
similarity index 100%
rename from public/index.php
rename to app/default/public/index.php
diff --git a/public/jquery.min.js b/app/default/public/jquery.min.js
similarity index 100%
rename from public/jquery.min.js
rename to app/default/public/jquery.min.js
diff --git a/public/main.css b/app/default/public/main.css
similarity index 100%
rename from public/main.css
rename to app/default/public/main.css
diff --git a/public/select2.min.css b/app/default/public/select2.min.css
similarity index 100%
rename from public/select2.min.css
rename to app/default/public/select2.min.css
diff --git a/public/select2.min.js b/app/default/public/select2.min.js
similarity index 100%
rename from public/select2.min.js
rename to app/default/public/select2.min.js
diff --git a/app/default/src/Controller/.gitignore b/app/default/src/Controller/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/src/Controller/DefaultController.php b/app/default/src/Controller/DefaultController.php
similarity index 92%
rename from src/Controller/DefaultController.php
rename to app/default/src/Controller/DefaultController.php
index b5e2f24..21c3e85 100644
--- a/src/Controller/DefaultController.php
+++ b/app/default/src/Controller/DefaultController.php
@@ -15,11 +15,17 @@
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
+use Psr\Log\LoggerInterface;
final class DefaultController extends AbstractController
{
private const PAGE_DEFAULT = 1;
+ public function __construct(LoggerInterface $logger = null)
+ {
+
+ }
+
#[Route('/{page}', name: 'app_search', requirements: ['page' => '\d+'], defaults: ['page' => self::PAGE_DEFAULT])]
#[ParamConverter('pagination', class: PageParamConverter::class)]
#[ParamConverter('criteria', class: CriteriaParamConverter::class)]
@@ -28,8 +34,11 @@ public function list(
AdditionalServiceRepositoryInterface $serviceRepository,
Pagination $pagination,
Criteria $criteria
+
): Response
{
+ // $this->logger = $logger;
+
$cars = $carRepository->find($pagination, $criteria);
$filtersData = [
diff --git a/src/Controller/ParamConverter/AbstractParamConverter.php b/app/default/src/Controller/ParamConverter/AbstractParamConverter.php
similarity index 100%
rename from src/Controller/ParamConverter/AbstractParamConverter.php
rename to app/default/src/Controller/ParamConverter/AbstractParamConverter.php
diff --git a/src/Controller/ParamConverter/CriteriaParamConverter.php b/app/default/src/Controller/ParamConverter/CriteriaParamConverter.php
similarity index 100%
rename from src/Controller/ParamConverter/CriteriaParamConverter.php
rename to app/default/src/Controller/ParamConverter/CriteriaParamConverter.php
diff --git a/src/Controller/ParamConverter/PageParamConverter.php b/app/default/src/Controller/ParamConverter/PageParamConverter.php
similarity index 95%
rename from src/Controller/ParamConverter/PageParamConverter.php
rename to app/default/src/Controller/ParamConverter/PageParamConverter.php
index 2388dc9..66b8d5f 100644
--- a/src/Controller/ParamConverter/PageParamConverter.php
+++ b/app/default/src/Controller/ParamConverter/PageParamConverter.php
@@ -13,7 +13,7 @@ final class PageParamConverter extends AbstractParamConverter
{
private const PARAM_PAGE = 'page';
private const PAGE_DEFAULT = 1;
- private const RESULTS_PER_PAGE = 3;
+ private const RESULTS_PER_PAGE = 10;
public function apply(Request $request, ParamConverter $configuration): bool
{
diff --git a/src/Elasticsearch/Hydrator/CarHydrator.php b/app/default/src/Elasticsearch/Hydrator/CarHydrator.php
similarity index 100%
rename from src/Elasticsearch/Hydrator/CarHydrator.php
rename to app/default/src/Elasticsearch/Hydrator/CarHydrator.php
diff --git a/src/Elasticsearch/Hydrator/CarHydratorInterface.php b/app/default/src/Elasticsearch/Hydrator/CarHydratorInterface.php
similarity index 100%
rename from src/Elasticsearch/Hydrator/CarHydratorInterface.php
rename to app/default/src/Elasticsearch/Hydrator/CarHydratorInterface.php
diff --git a/src/Elasticsearch/Hydrator/CarsHydrator.php b/app/default/src/Elasticsearch/Hydrator/CarsHydrator.php
similarity index 100%
rename from src/Elasticsearch/Hydrator/CarsHydrator.php
rename to app/default/src/Elasticsearch/Hydrator/CarsHydrator.php
diff --git a/src/Elasticsearch/Hydrator/CarsHydratorInterface.php b/app/default/src/Elasticsearch/Hydrator/CarsHydratorInterface.php
similarity index 100%
rename from src/Elasticsearch/Hydrator/CarsHydratorInterface.php
rename to app/default/src/Elasticsearch/Hydrator/CarsHydratorInterface.php
diff --git a/src/Elasticsearch/Repository/CarRepository.php b/app/default/src/Elasticsearch/Repository/CarRepository.php
similarity index 73%
rename from src/Elasticsearch/Repository/CarRepository.php
rename to app/default/src/Elasticsearch/Repository/CarRepository.php
index 8a7a3f2..ce8ce3c 100644
--- a/src/Elasticsearch/Repository/CarRepository.php
+++ b/app/default/src/Elasticsearch/Repository/CarRepository.php
@@ -13,6 +13,7 @@
use App\ValueObject\Cars;
use App\ValueObject\CriteriaInterface;
use App\ValueObject\Pagination;
+use Psr\Log\LoggerInterface;
final class CarRepository implements CarRepositoryInterface
{
@@ -20,10 +21,12 @@ final class CarRepository implements CarRepositoryInterface
public function __construct(
private ApiClientInterface $client,
- private CarsHydratorInterface $hydrator
+ private CarsHydratorInterface $hydrator,
+ LoggerInterface $logger = null
)
{
$this->index = Index::CARS();
+ $this->logger = $logger;
}
public function find(Pagination $pagination, ?CriteriaInterface $criteria = null): Cars
@@ -33,6 +36,11 @@ public function find(Pagination $pagination, ?CriteriaInterface $criteria = null
$response = $this->client->search($this->index, $query);
- return $this->hydrator->hydrate($response);
+ $this->logger->info('Found: [' . count($response->results()) . ']' . ' for query: ' . json_encode($query->toArray()));
+
+ $hydra = $this->hydrator->hydrate($response);
+
+ // var_dump($hydra); die;
+ return $hydra;
}
}
diff --git a/src/Elasticsearch/Service/ApiClient.php b/app/default/src/Elasticsearch/Service/ApiClient.php
similarity index 86%
rename from src/Elasticsearch/Service/ApiClient.php
rename to app/default/src/Elasticsearch/Service/ApiClient.php
index 80c29f6..51c3344 100644
--- a/src/Elasticsearch/Service/ApiClient.php
+++ b/app/default/src/Elasticsearch/Service/ApiClient.php
@@ -11,12 +11,13 @@
final class ApiClient implements ApiClientInterface
{
- private const ELASTICSEARCH_HOST = 'http://localhost:9200';
+ private $ELASTICSEARCH_HOST;
private const ENDPOINT_SEARCH = '_search';
public function __construct(private ClientInterface $client)
{
+ $this->ELASTICSEARCH_HOST = getenv('DOCKER_ELASTICSEARCH_HOST');
}
public function search(Index $index, Query $query): Response
@@ -29,7 +30,7 @@ public function search(Index $index, Query $query): Response
private function createEndpointUrl(string $index, string $endpoint): string
{
- return implode(DIRECTORY_SEPARATOR, [self::ELASTICSEARCH_HOST, $index, $endpoint]);
+ return implode(DIRECTORY_SEPARATOR, [$this->ELASTICSEARCH_HOST, $index, $endpoint]);
}
private function convertResponseToArray(ResponseInterface $response): array
diff --git a/src/Elasticsearch/Service/ApiClientInterface.php b/app/default/src/Elasticsearch/Service/ApiClientInterface.php
similarity index 100%
rename from src/Elasticsearch/Service/ApiClientInterface.php
rename to app/default/src/Elasticsearch/Service/ApiClientInterface.php
diff --git a/src/Elasticsearch/ValueObject/Criteria/ColorsFilter.php b/app/default/src/Elasticsearch/ValueObject/Criteria/ColorsFilter.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Criteria/ColorsFilter.php
rename to app/default/src/Elasticsearch/ValueObject/Criteria/ColorsFilter.php
diff --git a/src/Elasticsearch/ValueObject/Criteria/Criteria.php b/app/default/src/Elasticsearch/ValueObject/Criteria/Criteria.php
similarity index 91%
rename from src/Elasticsearch/ValueObject/Criteria/Criteria.php
rename to app/default/src/Elasticsearch/ValueObject/Criteria/Criteria.php
index 97df89b..b2c7651 100644
--- a/src/Elasticsearch/ValueObject/Criteria/Criteria.php
+++ b/app/default/src/Elasticsearch/ValueObject/Criteria/Criteria.php
@@ -11,6 +11,11 @@ final class Criteria implements CriteriaInterface
private array $additional = [];
private array $excluded = [];
+ public function __toString()
+ {
+ return implode(',', $this->required);
+ }
+
public function addRequired(Criterion $criterion): self
{
$this->required[$criterion::class] = $criterion;
diff --git a/src/Elasticsearch/ValueObject/Criteria/Criterion.php b/app/default/src/Elasticsearch/ValueObject/Criteria/Criterion.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Criteria/Criterion.php
rename to app/default/src/Elasticsearch/ValueObject/Criteria/Criterion.php
diff --git a/src/Elasticsearch/ValueObject/Criteria/PhraseFilter.php b/app/default/src/Elasticsearch/ValueObject/Criteria/PhraseFilter.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Criteria/PhraseFilter.php
rename to app/default/src/Elasticsearch/ValueObject/Criteria/PhraseFilter.php
diff --git a/src/Elasticsearch/ValueObject/Criteria/ServicesFilter.php b/app/default/src/Elasticsearch/ValueObject/Criteria/ServicesFilter.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Criteria/ServicesFilter.php
rename to app/default/src/Elasticsearch/ValueObject/Criteria/ServicesFilter.php
diff --git a/src/Elasticsearch/ValueObject/Factor/ColorRelevanceFactor.php b/app/default/src/Elasticsearch/ValueObject/Factor/ColorRelevanceFactor.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Factor/ColorRelevanceFactor.php
rename to app/default/src/Elasticsearch/ValueObject/Factor/ColorRelevanceFactor.php
diff --git a/src/Elasticsearch/ValueObject/Factor/DodgePromoFactor.php b/app/default/src/Elasticsearch/ValueObject/Factor/DodgePromoFactor.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Factor/DodgePromoFactor.php
rename to app/default/src/Elasticsearch/ValueObject/Factor/DodgePromoFactor.php
diff --git a/src/Elasticsearch/ValueObject/Factor/FactorInterface.php b/app/default/src/Elasticsearch/ValueObject/Factor/FactorInterface.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Factor/FactorInterface.php
rename to app/default/src/Elasticsearch/ValueObject/Factor/FactorInterface.php
diff --git a/src/Elasticsearch/ValueObject/Factor/Factors.php b/app/default/src/Elasticsearch/ValueObject/Factor/Factors.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Factor/Factors.php
rename to app/default/src/Elasticsearch/ValueObject/Factor/Factors.php
diff --git a/src/Elasticsearch/ValueObject/Factor/RawScoreFactor.php b/app/default/src/Elasticsearch/ValueObject/Factor/RawScoreFactor.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Factor/RawScoreFactor.php
rename to app/default/src/Elasticsearch/ValueObject/Factor/RawScoreFactor.php
diff --git a/src/Elasticsearch/ValueObject/Factor/Weight.php b/app/default/src/Elasticsearch/ValueObject/Factor/Weight.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Factor/Weight.php
rename to app/default/src/Elasticsearch/ValueObject/Factor/Weight.php
diff --git a/src/Elasticsearch/ValueObject/Factor/WeightFactor.php b/app/default/src/Elasticsearch/ValueObject/Factor/WeightFactor.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Factor/WeightFactor.php
rename to app/default/src/Elasticsearch/ValueObject/Factor/WeightFactor.php
diff --git a/src/Elasticsearch/ValueObject/Query.php b/app/default/src/Elasticsearch/ValueObject/Query.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Query.php
rename to app/default/src/Elasticsearch/ValueObject/Query.php
diff --git a/src/Elasticsearch/ValueObject/Response.php b/app/default/src/Elasticsearch/ValueObject/Response.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Response.php
rename to app/default/src/Elasticsearch/ValueObject/Response.php
diff --git a/src/Elasticsearch/ValueObject/Result.php b/app/default/src/Elasticsearch/ValueObject/Result.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Result.php
rename to app/default/src/Elasticsearch/ValueObject/Result.php
diff --git a/src/Elasticsearch/ValueObject/Results.php b/app/default/src/Elasticsearch/ValueObject/Results.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Results.php
rename to app/default/src/Elasticsearch/ValueObject/Results.php
diff --git a/src/Elasticsearch/ValueObject/Sorter/DefaultSorter.php b/app/default/src/Elasticsearch/ValueObject/Sorter/DefaultSorter.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Sorter/DefaultSorter.php
rename to app/default/src/Elasticsearch/ValueObject/Sorter/DefaultSorter.php
diff --git a/src/Elasticsearch/ValueObject/Sorter/FactorSorterInterface.php b/app/default/src/Elasticsearch/ValueObject/Sorter/FactorSorterInterface.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Sorter/FactorSorterInterface.php
rename to app/default/src/Elasticsearch/ValueObject/Sorter/FactorSorterInterface.php
diff --git a/src/Elasticsearch/ValueObject/Sorter/RecommendedSorter.php b/app/default/src/Elasticsearch/ValueObject/Sorter/RecommendedSorter.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Sorter/RecommendedSorter.php
rename to app/default/src/Elasticsearch/ValueObject/Sorter/RecommendedSorter.php
diff --git a/src/Elasticsearch/ValueObject/Sorter/SorterInterface.php b/app/default/src/Elasticsearch/ValueObject/Sorter/SorterInterface.php
similarity index 100%
rename from src/Elasticsearch/ValueObject/Sorter/SorterInterface.php
rename to app/default/src/Elasticsearch/ValueObject/Sorter/SorterInterface.php
diff --git a/src/Enum/AbstractEnum.php b/app/default/src/Enum/AbstractEnum.php
similarity index 100%
rename from src/Enum/AbstractEnum.php
rename to app/default/src/Enum/AbstractEnum.php
diff --git a/src/Enum/Color.php b/app/default/src/Enum/Color.php
similarity index 100%
rename from src/Enum/Color.php
rename to app/default/src/Enum/Color.php
diff --git a/src/Enum/Index.php b/app/default/src/Enum/Index.php
similarity index 100%
rename from src/Enum/Index.php
rename to app/default/src/Enum/Index.php
diff --git a/src/EventSubscriber/PaginationEventSubscriber.php b/app/default/src/EventSubscriber/PaginationEventSubscriber.php
similarity index 100%
rename from src/EventSubscriber/PaginationEventSubscriber.php
rename to app/default/src/EventSubscriber/PaginationEventSubscriber.php
diff --git a/src/Kernel.php b/app/default/src/Kernel.php
similarity index 100%
rename from src/Kernel.php
rename to app/default/src/Kernel.php
diff --git a/src/Repository/AdditionalServiceRepositoryInterface.php b/app/default/src/Repository/AdditionalServiceRepositoryInterface.php
similarity index 100%
rename from src/Repository/AdditionalServiceRepositoryInterface.php
rename to app/default/src/Repository/AdditionalServiceRepositoryInterface.php
diff --git a/src/Repository/CarRepositoryInterface.php b/app/default/src/Repository/CarRepositoryInterface.php
similarity index 100%
rename from src/Repository/CarRepositoryInterface.php
rename to app/default/src/Repository/CarRepositoryInterface.php
diff --git a/src/Repository/InMemoryAdditionalServiceRepository.php b/app/default/src/Repository/InMemoryAdditionalServiceRepository.php
similarity index 100%
rename from src/Repository/InMemoryAdditionalServiceRepository.php
rename to app/default/src/Repository/InMemoryAdditionalServiceRepository.php
diff --git a/src/Twig/Extension/AppExtension.php b/app/default/src/Twig/Extension/AppExtension.php
similarity index 100%
rename from src/Twig/Extension/AppExtension.php
rename to app/default/src/Twig/Extension/AppExtension.php
diff --git a/src/ValueObject/AdditionalService.php b/app/default/src/ValueObject/AdditionalService.php
similarity index 100%
rename from src/ValueObject/AdditionalService.php
rename to app/default/src/ValueObject/AdditionalService.php
diff --git a/src/ValueObject/AdditionalServices.php b/app/default/src/ValueObject/AdditionalServices.php
similarity index 100%
rename from src/ValueObject/AdditionalServices.php
rename to app/default/src/ValueObject/AdditionalServices.php
diff --git a/src/ValueObject/Car.php b/app/default/src/ValueObject/Car.php
similarity index 100%
rename from src/ValueObject/Car.php
rename to app/default/src/ValueObject/Car.php
diff --git a/src/ValueObject/Cars.php b/app/default/src/ValueObject/Cars.php
similarity index 100%
rename from src/ValueObject/Cars.php
rename to app/default/src/ValueObject/Cars.php
diff --git a/src/ValueObject/Colors.php b/app/default/src/ValueObject/Colors.php
similarity index 100%
rename from src/ValueObject/Colors.php
rename to app/default/src/ValueObject/Colors.php
diff --git a/src/ValueObject/CriteriaInterface.php b/app/default/src/ValueObject/CriteriaInterface.php
similarity index 100%
rename from src/ValueObject/CriteriaInterface.php
rename to app/default/src/ValueObject/CriteriaInterface.php
diff --git a/src/ValueObject/CriterionInterface.php b/app/default/src/ValueObject/CriterionInterface.php
similarity index 100%
rename from src/ValueObject/CriterionInterface.php
rename to app/default/src/ValueObject/CriterionInterface.php
diff --git a/src/ValueObject/Id.php b/app/default/src/ValueObject/Id.php
similarity index 100%
rename from src/ValueObject/Id.php
rename to app/default/src/ValueObject/Id.php
diff --git a/src/ValueObject/Model.php b/app/default/src/ValueObject/Model.php
similarity index 100%
rename from src/ValueObject/Model.php
rename to app/default/src/ValueObject/Model.php
diff --git a/src/ValueObject/Name.php b/app/default/src/ValueObject/Name.php
similarity index 100%
rename from src/ValueObject/Name.php
rename to app/default/src/ValueObject/Name.php
diff --git a/src/ValueObject/Page.php b/app/default/src/ValueObject/Page.php
similarity index 100%
rename from src/ValueObject/Page.php
rename to app/default/src/ValueObject/Page.php
diff --git a/src/ValueObject/PagesTotal.php b/app/default/src/ValueObject/PagesTotal.php
similarity index 89%
rename from src/ValueObject/PagesTotal.php
rename to app/default/src/ValueObject/PagesTotal.php
index dcaf58a..e1a2bd3 100644
--- a/src/ValueObject/PagesTotal.php
+++ b/app/default/src/ValueObject/PagesTotal.php
@@ -5,12 +5,14 @@
final class PagesTotal
{
- private const MIN_PAGE = 1;
+ private const MIN_PAGE = 4;
private int $value;
public function __construct(PagesTotalAwareInterface $results, ResultsPerPage $resultsPerPage)
{
+ $this->value = (int)floor($results->total() / $resultsPerPage->value());
+
if ($resultsPerPage->value() > $results->total()) {
$this->value = self::MIN_PAGE;
} else {
diff --git a/src/ValueObject/PagesTotalAwareInterface.php b/app/default/src/ValueObject/PagesTotalAwareInterface.php
similarity index 100%
rename from src/ValueObject/PagesTotalAwareInterface.php
rename to app/default/src/ValueObject/PagesTotalAwareInterface.php
diff --git a/src/ValueObject/Pagination.php b/app/default/src/ValueObject/Pagination.php
similarity index 100%
rename from src/ValueObject/Pagination.php
rename to app/default/src/ValueObject/Pagination.php
diff --git a/src/ValueObject/Phrase.php b/app/default/src/ValueObject/Phrase.php
similarity index 100%
rename from src/ValueObject/Phrase.php
rename to app/default/src/ValueObject/Phrase.php
diff --git a/src/ValueObject/Picture.php b/app/default/src/ValueObject/Picture.php
similarity index 100%
rename from src/ValueObject/Picture.php
rename to app/default/src/ValueObject/Picture.php
diff --git a/src/ValueObject/Producer.php b/app/default/src/ValueObject/Producer.php
similarity index 100%
rename from src/ValueObject/Producer.php
rename to app/default/src/ValueObject/Producer.php
diff --git a/src/ValueObject/ProductionYear.php b/app/default/src/ValueObject/ProductionYear.php
similarity index 100%
rename from src/ValueObject/ProductionYear.php
rename to app/default/src/ValueObject/ProductionYear.php
diff --git a/src/ValueObject/ResultsPerPage.php b/app/default/src/ValueObject/ResultsPerPage.php
similarity index 100%
rename from src/ValueObject/ResultsPerPage.php
rename to app/default/src/ValueObject/ResultsPerPage.php
diff --git a/src/ValueObject/SearchResponseInterface.php b/app/default/src/ValueObject/SearchResponseInterface.php
similarity index 100%
rename from src/ValueObject/SearchResponseInterface.php
rename to app/default/src/ValueObject/SearchResponseInterface.php
diff --git a/src/ValueObject/SearchResultsInterface.php b/app/default/src/ValueObject/SearchResultsInterface.php
similarity index 100%
rename from src/ValueObject/SearchResultsInterface.php
rename to app/default/src/ValueObject/SearchResultsInterface.php
diff --git a/symfony.lock b/app/default/symfony.lock
similarity index 100%
rename from symfony.lock
rename to app/default/symfony.lock
diff --git a/templates/base.html.twig b/app/default/templates/base.html.twig
similarity index 100%
rename from templates/base.html.twig
rename to app/default/templates/base.html.twig
diff --git a/templates/search/_includes/car.html.twig b/app/default/templates/search/_includes/car.html.twig
similarity index 100%
rename from templates/search/_includes/car.html.twig
rename to app/default/templates/search/_includes/car.html.twig
diff --git a/templates/search/_includes/filters.html.twig b/app/default/templates/search/_includes/filters.html.twig
similarity index 100%
rename from templates/search/_includes/filters.html.twig
rename to app/default/templates/search/_includes/filters.html.twig
diff --git a/templates/search/_includes/pagination.html.twig b/app/default/templates/search/_includes/pagination.html.twig
similarity index 100%
rename from templates/search/_includes/pagination.html.twig
rename to app/default/templates/search/_includes/pagination.html.twig
diff --git a/templates/search/_includes/services.html.twig b/app/default/templates/search/_includes/services.html.twig
similarity index 100%
rename from templates/search/_includes/services.html.twig
rename to app/default/templates/search/_includes/services.html.twig
diff --git a/templates/search/emptyList.html.twig b/app/default/templates/search/emptyList.html.twig
similarity index 100%
rename from templates/search/emptyList.html.twig
rename to app/default/templates/search/emptyList.html.twig
diff --git a/templates/search/list.html.twig b/app/default/templates/search/list.html.twig
similarity index 100%
rename from templates/search/list.html.twig
rename to app/default/templates/search/list.html.twig
diff --git a/docker/service/.env b/docker/service/.env
new file mode 100644
index 0000000..7ae8fb6
--- /dev/null
+++ b/docker/service/.env
@@ -0,0 +1,20 @@
+# name of the project, if blank then docker sets it to a name of a dir that docker-compose.yaml is inside
+COMPOSE_PROJECT_NAME=carrental
+
+# profile to run with docker-compose up (may be multiple separated by comma) makes docker-compose --profile flag not having any effect
+# COMPOSE_PROFILES=
+
+# list of files to combine the total docker-compose.yaml (a kind of include files)
+COMPOSE_FILE=_network.yaml:_restart-policy.yaml:_limit-memory.yaml:_service-dependency.yaml:_profiles.yaml:docker-compose.yaml:php-composer-v2.yaml:elasticsearch-v7.yaml:php-fpm-v8.yaml:nginx-v1.yaml
+
+# application path relative to the docker-compose.yaml file.
+app_path=./../../app
+
+# Path where different service images, their files, Dockerfiles are stored (relative to the docker-compose.yaml)
+service_path=.
+
+# path inside service_path where is Dockerfile and .env files stored
+image_path=image
+
+# path inside service_path where all image files are stored ${service_path}/${image_files_path}/usr/share => /usr/share (path inside a container)
+image_files_path=image/files
diff --git a/docker/service/.gitignore b/docker/service/.gitignore
new file mode 100644
index 0000000..16d6a7c
--- /dev/null
+++ b/docker/service/.gitignore
@@ -0,0 +1 @@
+docker-compose.override.yaml
\ No newline at end of file
diff --git a/docker/service/README.md b/docker/service/README.md
new file mode 100644
index 0000000..deffa9d
--- /dev/null
+++ b/docker/service/README.md
@@ -0,0 +1,335 @@
+## Table of contents
+
+- [Project structure](#Project structure)
+- [Projects context](#Projects context)
+ - [Specific to this application context](#Specific to this application context)
+ - [Generic service module context](#Generic service module context)
+ - [Copy a service module to any other project](#Copy a service module to any other project)
+ - [List of services modules](#List of services modules)
+ - [Service module volumes](#Service module volumes)
+ - [Service module variables](#Service module variables)
+ - [Service module volume has an application and module context](#Service module volume has an application and module context)
+ - [Merging two contexts](#Merging two contexts )
+- [Health checks](#Health checks)
+ - [Nginx](#Nginx)
+ - [Elasticsearch](#Elasticsearch)
+- [Security](#Security)
+ - [Permissions](#Permissions)
+ - [Capabilities](#Capabilities)
+ - [Network](#Network)
+ - [Firewall](#Firewall)
+ - [Vulnerability scan](#Vulnerability scan)
+- [Known Issues](#Known Issues)
+- Typical errors and their reasons
+ - [Nginx page is loading forever](#Nginx page is loading forever)
+ - [Elasticsearch exits with code 125](#Elasticsearch exits with code 125)
+
+
+
+## Project structure
+
+There is a [dirlist.txt](./dirlist.txt) that shows all of the files.
+
+[^TOC^](#Table of contents)
+
+## Projects context
+
+There are two contexts in this project:
+
+- Specific to this application context
+- Generic service module context
+
+[^TOC^](#Table of contents)
+
+### Specific to this application context
+
+All files that start with underscore
+
+```
+_limit-memory.yaml
+_network.yaml
+_profiles.yaml
+_restart-policy.yaml
+_service-dependency.yaml
+```
+
+have code related specifically to this application.
+
+for example [_service-dependency.yaml](_service-dependency.yaml) without comments:
+
+```
+services:
+ nginx-v1:
+ depends_on:
+ php-fpm-v8:
+ condition: service_started
+ elasticsearch-v7:
+ condition: service_healthy
+```
+
+defines that Nginx server container should not run unless service `php-fpm-v8` started and service `elasticsearch-v7` started and reported its status as healthy.
+
+It makes no sense to run Nginx for this application unless it is able to pass requests to the PHP-FPM and make requests to the Elasticsearch service.
+
+All of the services: `nginx-v1`, `php-fpm-v8` and `elasticsearch-v7` may work independently from each other in a different application. For example
+
+- `nginx-v1` may serve only static files or work as a load balancer.
+- `php-fpm-v8` may respond to other service's requests.
+- `elasticsearch-v7` may be used only for Kibana.
+
+Therefore their dependency is specific for this project and put in a separate file [_service-dependency.yaml](_service-dependency.yaml) instead of putting the `depends_on` key into each of these service's yaml file.
+
+[^TOC^](#Table of contents)
+
+### Generic service module context
+
+The key to understand that context is to focus on two words: `generic` and `module`.
+
+The intention for this context is to be able to copy any service module and with minimal (perfectly none) modification have a base service for other application that may completely differ from this one.
+
+Every module consist of two things:
+
+- service directory
+- service yaml file named the same as directory.
+
+#### Copy a service module to any other project
+
+If you want to copy elasticsearch-v7 module to your application then remember to copy the `elasticsearch-v7` directory and corresponding to it `elasticsearch-v7.yaml` file.
+
+Currently docker does not support paths relative other than relative to the main docker-compose.yaml file therefore it would make a confusion if `elasticsearch-v7.yaml` file were put inside `elasticsearch-v7` directory and still need to use a path that is a relative to the `docker/service` dir.
+
+[^TOC^](#Table of contents)
+
+#### List of services modules
+
+```
+├── [DIR ] elasticsearch-v7
+├── [5.1K] elasticsearch-v7.yaml
+├── [DIR ] nginx-v1
+├── [4.4K] nginx-v1.yaml
+├── [DIR ] php-composer-v2
+├── [1.2K] php-composer-v2.yaml
+├── [DIR ] php-fpm-v8
+├── [ 767] php-fpm-v8.yaml
+```
+
+There is a naming convention that every service module dir has a suffix of the **major only** version.
+
+The reason is that for example `elasticsearch-v7` has the suffix `v7` so if currently Elasticsearch is used with the exact version `7.17.1` then having only the major version as a suffix allows you to bump the version number as long it does not brake compatibility and without any need to update dir name.
+
+An additional benefit of that suffix is that you may have at the same project `elasticsearch-v7` and `elasticsearch-v8` without any conflicts and upgrade or downgrade them as you wish.
+
+[^TOC^](#Table of contents)
+
+#### Service module volumes
+
+Example dir tree of `nginx-v1`:
+
+```
+.
+└── [DIR ] image
+ ├── [ 19] .dockerignore
+ ├── [ 0] .env.dev
+ ├── [ 19] .gitignore
+ ├── [ 602] Dockerfile
+ └── [DIR ] files
+ ├── [DIR ] etc
+ │ └── [DIR ] nginx
+ │ ├── [DIR ] conf.d
+ │ │ └── [ 894] default.conf
+ │ ├── [1007] fastcgi_params
+ │ ├── [2.8K] koi-utf
+ │ ├── [2.2K] koi-win
+ │ ├── [5.1K] mime.types
+ │ ├── [ 22] modules -> /usr/lib/nginx/modules
+ │ ├── [1.0K] nginx.conf
+ │ ├── [ 636] scgi_params
+ │ ├── [ 664] uwsgi_params
+ │ └── [3.5K] win-utf
+ └── [ 166] site.conf
+```
+
+All image files are stored in the subdir `image`, so you may add other related files like manuals into the dir of the `nginx-v1` service but without confusion if building an image from that service should have them or not. Simply - if files are in the `image` subdir then they are a subject of the build context.
+
+`image/files` subdir has all of the files that should be either copied to the image by the Dockerfile `COPY` command or they should be mounted by a mount point. Important convention here is that all the files are in the directories that exactly mimic the file structure of the container that will be run from the image you build for example:
+
+| HOST dir | Container dir |
+| -------------------------- | ------------- |
+| ./nginx-v1/files/etc/nginx | /etc/nginx |
+
+Sticking to this convention you will never have any doubts where files are mounted.
+
+#### Service module variables
+
+An example [php-fpm-v8.yaml](./php-fpm-v8.yaml) without comments:
+
+```
+version: "3.7"
+services:
+ php-fpm-v8:
+ image: ${COMPOSE_PROJECT_NAME}_php:8.1.3-fpm-buster
+ build:
+ context: ${service_path:-.}/php-fpm-v8/${image_path}
+ args:
+ image: php:8.1.3-fpm-buster
+ shm_size: '2gb'
+ target: dev
+
+ env_file:
+ - "${service_path:-.}/php-fpm-v8/${image_path}/.env.dev"
+
+ user: ${uid:-1000}:${gid:-1000}
+
+ volumes:
+ - ${app_path:-./app}:/usr/share/nginx/html
+```
+
+makes as any other service module use of variables:
+
+- `${COMPOSE_PROJECT_NAME}` that is defined in the [.env](./.env) file and is `carrental` so all service's modules images for this project will have prefix of `carrental_`
+- `${service_path:-.}` - defaults to the current directory `docker/service` but may be changed in the [.env](./.env) file. This is the path where docker-compose will look for the dir's of service modules for building them as well as for their dedictated env files.
+- `user: ${uid:-1000}:${gid:-1000}` defines the user id and group id of the user that runs the image. For the images that have their own custom Dockerfile like [php-composer-v2/image/Dockerfile](./php-composer-v2/image/Dockerfile) the user id and group id is used for the image build.
+
+[^TOC^](#Table of contents)
+
+#### Service module volume has an application and module context
+
+```
+ volumes:
+ - ${app_path:-./app}:/usr/share/nginx/html
+```
+
+Since they define both source (HOST) and destination (Container) mount points you need to decide if you want to have them inside a service module [php-fpm-v8.yaml](./php-fpm-v8.yaml) or create new application context file for eg. `_volumes.yaml` and put volumes definition there.
+
+Because some of the services need volumes or bind points for their basic operation (persistent storage for databases) and their paths differ for every service then a decision was made to put volumes inside the service module so if you copy it to another project then you will always have the bare minimum paths on the service side defined and will need to adjust the host side to your needs. That seems to be more reasonable then searching over all of your projects where a particular service was used in order to acquire a knowledge about required paths for its persistence.
+
+[^TOC^](#Table of contents)
+
+### Merging two contexts
+
+The [.env](./.env) file has the entry:
+
+```
+COMPOSE_FILE=_network.yaml:_restart-policy.yaml:_limit-memory.yaml:_service-dependency.yaml:_profiles.yaml:docker-compose.yaml:php-composer-v2.yaml:elasticsearch-v7.yaml:php-fpm-v8.yaml:nginx-v1.yaml
+```
+
+That has a list of yaml files that are merged when you run for example:
+
+```sh
+docker-compose up
+```
+
+removing a file from that variable will result in not having it in the merged version that is used by the `docker-compose` to run this app.
+
+However using [_profiles.yaml](./_profiles.yaml) is much more elegant way to have particular services up. Read about: **Run a specific profile** section of the [../../README.md](../../README.md)
+
+[^TOC^](#Table of contents)
+
+## Health checks
+
+They are implemented in the services' Dockerfiles
+
+
+### Nginx
+[Dockerfile](./nginx-v1/image/Dockerfile)
+
+Nginx in the free version don't have any sophisticated health check endpoint therefore a simple one was defined in its [default.conf](./nginx-v1/image/files/etc/nginx/conf.d/default.conf)
+
+[^TOC^](#Table of contents)
+
+### Elasticsearch
+
+[Dockerfile](./elasticsearch-v7/image/Dockerfile)
+
+This sevice has a health check endpoint defined by its vendor. Note that for a single node configuration the health check status as per documentation will never be `green` but at most operable state it will be `yellow`.
+
+If Elasticsearch is in multi node mode then the health check's status may be `green` or `yellow` depending on the number of nodes that are ok.
+
+Current health check implementation returns status healthy in case either `green` or `yellow`.
+
+[^TOC^](#Table of contents)
+
+
+## Security
+
+### Permissions
+
+Do not run these containers as `root`, there was a significant effort done in order to make them work as a regular user. You may change the user to any and run the `setup.sh` script so it will change the file permissions of all of the files and initialize Elasticsearch db for you.
+
+However if for any reason you want to run this application as a `root` then all you need is to call `setup.sh` script with `sudo` in front of it.
+
+[^TOC^](#Table of contents)
+
+### Capabilities
+
+Look at the [nginx-v1.yaml](#./nginx-v1.yaml) `cap_drop` and `cap_add` sections.
+
+Do not underestimate the importance of having at least basic security features implemented.
+
+If you are going do develop your application then play with these values as described in the comments because no one better knows than you if your application is working as expected when restrictions are applied.
+
+For some of the services adding limitations of the capabilities is a piece of cake. Try it!
+
+[^TOC^](#Table of contents)
+
+### Network
+
+For your convenience the `elasticsearch-v7` service is available under the host's `localhost`. When releasing this application to the public domain, remember about disabling that by making the `backend` network internal in [_network.yaml](./_network.yaml)
+
+[^TOC^](#Table of contents)
+
+#### Firewall
+
+It would not hurt to use a firewall for the services. You may use UFW or IPTables to limit the exposure of the services since if an image exposes any port it is currently not supported by docker to override that with your own Dockerfile and disable a port exposure.
+
+[^TOC^](#Table of contents)
+
+
+### Vulnerability scan
+
+It is complety up to you to do it. No scan was made.
+
+[^TOC^](#Table of contents)
+
+## Known Issues
+
+`-` or `.` is not allowed for the variable name
+
+`-` or `.` is not allowed for the variable value, workaround to put value between a single quote `'` or double quote `"` results in passing that variable with the quotes (not just with the content between them).
+
+[^TOC^](#Table of contents)
+
+## Typical errors and their reasons
+
+### Nginx page is loading forever
+
+or log error:
+
+> nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
+
+solution:
+
+make sure that nginx has at least minimum permissions in its service yaml:
+
+```yaml
+cap_drop:
+ - ALL
+
+cap_add:
+ - CAP_CHOWN
+ - CAP_DAC_OVERRIDE
+ - CAP_DAC_READ_SEARCH
+ - CAP_FOWNER
+ - CAP_SETGID
+ - CAP_SETUID
+```
+
+[^TOC^](#Table of contents)
+
+### Elasticsearch exits with code 125
+
+**Solution**
+
+Elasticsearch don't have enough permissions to access its files.
+
+[^TOC^](#Table of contents)
\ No newline at end of file
diff --git a/docker/service/_limit-memory.yaml b/docker/service/_limit-memory.yaml
new file mode 100644
index 0000000..80a137f
--- /dev/null
+++ b/docker/service/_limit-memory.yaml
@@ -0,0 +1,7 @@
+version: "3.7"
+
+# memory limits
+services:
+ elasticsearch-v7:
+ environment:
+ - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # The ES_JAVA_OPTS variable overrides all other JVM options. We do not recommend using ES_JAVA_OPTS in production.
diff --git a/docker/service/_network.yaml b/docker/service/_network.yaml
new file mode 100644
index 0000000..461b795
--- /dev/null
+++ b/docker/service/_network.yaml
@@ -0,0 +1,52 @@
+version: "3.7"
+
+# https://docs.docker.com/compose/compose-file/compose-file-v3/#network-configuration-reference
+# https://docs.docker.com/compose/compose-file/compose-file-v3/#internal
+
+# Note that only nginx-v1 is connected to the frontend and
+# backend network.
+# All other services are connected to the backend network only.
+# Backend network is set as internal, therefore Nginx service
+# is the only entry point for the incoming requests.
+
+services:
+ nginx-v1:
+ ports:
+ - "9090:80"
+ networks:
+ - frontend
+ - backend
+
+ php-fpm-v8:
+ environment:
+
+ # Env is here because it is specific to this project but not to the php-fpm service in general.
+ # also you have here defined networking therefore creation of env that will hold url shows you
+ # interconnection that happens in the networks.
+ #
+ - "DOCKER_ELASTICSEARCH_HOST=http://elasticsearch-v7:9200"
+
+ networks:
+ - backend
+ elasticsearch-v7:
+ # potentially redundant - no need to specify
+ networks:
+ - backend
+ ports:
+ - 9200:9200
+
+ php-composer-v2:
+ environment:
+
+ # Composer needs Elasticsearch host for sending requests by init.sh and request.sh
+ #
+ - "DOCKER_ELASTICSEARCH_HOST=http://elasticsearch-v7:9200"
+
+ networks:
+ - backend
+
+networks:
+ frontend:
+ internal: false
+ backend:
+ internal: false # change to true if you don't want that network to be accesible from the HOST
\ No newline at end of file
diff --git a/docker/service/_profiles.yaml b/docker/service/_profiles.yaml
new file mode 100644
index 0000000..e69a6d4
--- /dev/null
+++ b/docker/service/_profiles.yaml
@@ -0,0 +1,52 @@
+version: "3.7"
+
+# https://docs.docker.com/compose/compose-file/compose-file-v3/#profiles
+
+# If you start a single profile for eg. cli
+#
+# docker-compose --profile cli up --build
+#
+# but you see that besides cli (composer) many
+# other conainers are also runnig then you need to
+# stop all of the containers [Ctrl]+[c] or:
+#
+# docker-compose stop
+#
+# and run:
+#
+# docker-compose down --remove-orphans
+#
+# to remove them before runing that cli profile
+# If you run:
+#
+# docker ps -a
+#
+# and don't see any containers then running
+#
+# docker-compose --profile cli up --build
+#
+# should make only the cli profile (composer) running.
+
+services:
+ nginx-v1:
+ profiles:
+ - dev
+ - prod
+ - web
+
+ php-fpm-v8:
+ profiles:
+ - dev
+ - prod
+ - web
+
+ elasticsearch-v7:
+ profiles:
+ - dev
+ - prod
+ - db
+
+ php-composer-v2:
+ profiles:
+ - dev
+ - cli
diff --git a/docker/service/_restart-policy.yaml b/docker/service/_restart-policy.yaml
new file mode 100644
index 0000000..1af11a6
--- /dev/null
+++ b/docker/service/_restart-policy.yaml
@@ -0,0 +1,16 @@
+version: "3.7"
+
+# https://docs.docker.com/compose/compose-file/compose-file-v3/#restart
+
+services:
+ nginx-v1:
+ restart: unless-stopped
+
+ php-fpm-v8:
+ restart: unless-stopped
+
+ elasticsearch-v7:
+ restart: unless-stopped
+
+ php-composer-v2:
+ restart: unless-stopped
\ No newline at end of file
diff --git a/docker/service/_service-dependency.yaml b/docker/service/_service-dependency.yaml
new file mode 100644
index 0000000..13b1434
--- /dev/null
+++ b/docker/service/_service-dependency.yaml
@@ -0,0 +1,21 @@
+version: "3.7"
+
+services:
+ nginx-v1:
+ depends_on:
+
+ # Service nginx-v1 will be created
+ # but will be not started unless
+ # php-fpm-v8 is started and
+ # elasticsearch-v7 reports healthy status
+
+ # Available conditions:
+ # service_started
+ # service_healthy # requies implementation of healthcheck - see Dockerfile of Nginx or Elasticsearch
+ # service_completed_successfully
+
+ php-fpm-v8:
+ condition: service_started
+
+ elasticsearch-v7:
+ condition: service_healthy
diff --git a/docker/service/dirlist.txt b/docker/service/dirlist.txt
new file mode 100644
index 0000000..2a3e9ef
--- /dev/null
+++ b/docker/service/dirlist.txt
@@ -0,0 +1,107 @@
+.
+├── [1.0K] .env
+├── [ 28] .gitignore
+├── [6.4K] README.md
+├── [ 235] _limit-memory.yaml
+├── [1.4K] _network.yaml
+├── [ 902] _profiles.yaml
+├── [ 280] _restart-policy.yaml
+├── [ 540] _service-dependency.yaml
+├── [ 0] dirlist.txt
+├── [ 342] docker-compose.yaml
+├── [DIR ] elasticsearch-v7
+│ └── [DIR ] image
+│ ├── [ 70] .dockerignore
+│ ├── [ 462] .env.dev
+│ ├── [ 363] Dockerfile
+│ └── [DIR ] files
+│ └── [DIR ] usr
+│ └── [DIR ] share
+│ └── [DIR ] elasticsearch
+│ └── [DIR ] config
+│ ├── [1.0K] elasticsearch-plugins.example.yml
+│ ├── [ 199] elasticsearch.keystore
+│ ├── [ 53] elasticsearch.yml
+│ ├── [3.2K] jvm.options
+│ ├── [DIR ] jvm.options.d
+│ ├── [ 19K] log4j2.file.properties
+│ ├── [ 10K] log4j2.properties
+│ ├── [ 473] role_mapping.yml
+│ ├── [ 197] roles.yml
+│ ├── [ 0] users
+│ └── [ 0] users_roles
+├── [5.1K] elasticsearch-v7.yaml
+├── [DIR ] nginx-v1
+│ └── [DIR ] image
+│ ├── [ 19] .dockerignore
+│ ├── [ 0] .env.dev
+│ ├── [ 19] .gitignore
+│ ├── [ 602] Dockerfile
+│ └── [DIR ] files
+│ ├── [DIR ] etc
+│ │ └── [DIR ] nginx
+│ │ ├── [DIR ] conf.d
+│ │ │ └── [ 894] default.conf
+│ │ ├── [1007] fastcgi_params
+│ │ ├── [2.8K] koi-utf
+│ │ ├── [2.2K] koi-win
+│ │ ├── [5.1K] mime.types
+│ │ ├── [ 22] modules -> /usr/lib/nginx/modules
+│ │ ├── [1.0K] nginx.conf
+│ │ ├── [ 636] scgi_params
+│ │ ├── [ 664] uwsgi_params
+│ │ └── [3.5K] win-utf
+│ └── [ 166] site.conf
+├── [4.4K] nginx-v1.yaml
+├── [DIR ] php-composer-v2
+│ ├── [ 0] .env.dev
+│ └── [DIR ] image
+│ └── [ 684] Dockerfile
+├── [1.2K] php-composer-v2.yaml
+├── [DIR ] php-fpm-v8
+│ └── [DIR ] image
+│ ├── [ 28] .dockerignore
+│ ├── [ 31] .env.dev
+│ ├── [ 28] Dockerfile
+│ └── [DIR ] files
+│ └── [DIR ] usr
+│ └── [DIR ] local
+│ └── [DIR ] etc
+│ └── [DIR ] php
+│ ├── [DIR ] conf.d
+│ │ ├── [ 20] docker-php-ext-bcmath.ini
+│ │ ├── [ 22] docker-php-ext-calendar.ini
+│ │ ├── [ 17] docker-php-ext-dba.ini
+│ │ ├── [ 18] docker-php-ext-exif.ini
+│ │ ├── [ 16] docker-php-ext-gd.ini
+│ │ ├── [ 21] docker-php-ext-gettext.ini
+│ │ ├── [ 21] docker-php-ext-imagick.ini
+│ │ ├── [ 21] docker-php-ext-mongodb.ini
+│ │ ├── [ 20] docker-php-ext-mysqli.ini
+│ │ ├── [ 82] docker-php-ext-opcache.ini
+│ │ ├── [ 19] docker-php-ext-pcntl.ini
+│ │ ├── [ 23] docker-php-ext-pdo_mysql.ini
+│ │ ├── [ 23] docker-php-ext-pdo_pgsql.ini
+│ │ ├── [ 19] docker-php-ext-pgsql.ini
+│ │ ├── [ 20] docker-php-ext-pspell.ini
+│ │ ├── [ 19] docker-php-ext-shmop.ini
+│ │ ├── [ 18] docker-php-ext-soap.ini
+│ │ ├── [ 21] docker-php-ext-sockets.ini
+│ │ ├── [ 20] docker-php-ext-sodium.ini
+│ │ ├── [ 17] docker-php-ext-svm.ini
+│ │ ├── [ 21] docker-php-ext-sysvmsg.ini
+│ │ ├── [ 21] docker-php-ext-sysvsem.ini
+│ │ ├── [ 21] docker-php-ext-sysvshm.ini
+│ │ ├── [ 18] docker-php-ext-tidy.ini
+│ │ ├── [ 20] docker-php-ext-trader.ini
+│ │ ├── [ 18] docker-php-ext-wddx.ini
+│ │ ├── [ 20] docker-php-ext-xmlrpc.ini
+│ │ ├── [ 17] docker-php-ext-xsl.ini
+│ │ ├── [ 17] docker-php-ext-zip.ini
+│ │ └── [ 103] php.ini
+│ ├── [ 69K] php.ini-development
+│ └── [ 69K] php.ini-production
+├── [ 767] php-fpm-v8.yaml
+└── [2.5K] setup.sh
+
+24 directories, 81 files
diff --git a/docker/service/docker-compose.yaml b/docker/service/docker-compose.yaml
new file mode 100644
index 0000000..bfea030
--- /dev/null
+++ b/docker/service/docker-compose.yaml
@@ -0,0 +1,9 @@
+version: "3.7"
+
+#TODO use variables instead of ./app dir for volumes perhaps save it in
+#TODO use ulimits https://youtu.be/PWUuyDrqvt0?t=199
+#TODO move volumes to separate files
+
+# this is good place for anchors that you later may use a substitution for aliases
+
+#TODO https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
\ No newline at end of file
diff --git a/docker/service/elasticsearch-v7.yaml b/docker/service/elasticsearch-v7.yaml
new file mode 100644
index 0000000..b18eb6f
--- /dev/null
+++ b/docker/service/elasticsearch-v7.yaml
@@ -0,0 +1,111 @@
+version: "3.7"
+
+services:
+ elasticsearch-v7:
+
+ # https://docs.docker.com/compose/reference/envvars/
+
+ # The image key makes use of the ${COMPOSE_PROJECT_NAME} var
+ # defined in the .env file so this provides consistent naming
+ # of the images stored at your machine and allows to list
+ # only these images that are related to this project by
+ # docker image ls | grep 'carrental_'
+ #
+ image: ${COMPOSE_PROJECT_NAME}_elasticsearch:7.17.1
+
+ # https://docs.docker.com/compose/compose-file/compose-file-v3/#build
+
+ build:
+
+ # Context is the place where docker-compose may find Dockerfile
+ # note that there is also .dockerignore that lists paths that
+ # should not be loaded by the build command into memory when
+ # building the image from the Dockerfile.
+ # If there are big files there (logs, database data)
+ # you may fail building the image because of running out of the RAM
+ # Sending files to RAM as the build context is only required
+ # if you want to use these files inside image for eg. by COPY command
+ #
+ context: ${service_path:-.}/elasticsearch-v7/${image_path}
+ args:
+
+ # https://docs.docker.com/engine/reference/builder/#arg
+
+ # The Elasticsearch Dockerfile has ARG image
+ # that consumes the value from here for the build.
+ #
+ image: docker.elastic.co/elasticsearch/elasticsearch:7.17.1@sha256:35f81ab02dda48d6f81ad9be52b25cdbd3a832e8660b48218af805d6de3ddba8
+
+ shm_size: '2gb'
+
+ # https://docs.docker.com/develop/develop-images/multistage-build/
+
+ target: dev
+
+ #BUGFIX - docker-compose does not support variables with dot (.) or underscore (_) in name or as a values in the .env files - these values must be defined here
+ environment:
+ - discovery.type=single-node
+ - node.name=elasticsearch
+ - include_type_name=true
+
+ # Points to blank .env.dev file due to the #BUGFIX as above.
+ #
+ env_file:
+ - "${service_path:-.}/elasticsearch-v7/${image_path}/.env.dev"
+
+ # https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck
+
+ # You may override here the healthcheck periods defined in the Dockerfie
+ # typically it takes around 30 seconds for Elasticsearch to start so
+ # the start period should be at least that or more in case of using any
+ # plugins or having a lot of data.
+ #
+ # healthcheck:
+ # start_period: 1m
+ # interval: 2s
+ # timeout: 3s
+ # retries: 3
+
+ # As per documentation Elastisearch is running by default as user 1000 and group 0
+ # You should be fine using your own user id with a fallback to 1000 in case you did not populate uid variable
+ # but at least the Elasticsearch's user should have group 0 or be added to the 0 group
+ # Not setting the user:group id here correctly usually results in Elasticserach exiting with the code 125
+ #
+ user: ${uid:-1000}:0
+
+ #TODO - make your capabilities restrictions for that service
+ # take nginx-v1 service as an example and check if you may
+ # limit the capabilities even further.
+ # who knows, maybe you may grant zero capabilities and this
+ # service will still work without any problem?
+ # Take that seriously and look above at the user: ${uid:-1000}:0
+ # that means Elasticsearch has the grup id = 0 (admin)
+ # Should that user be able to use all capabilities? Probably not.
+ #
+ # cap_drop:
+ # - ALL
+
+ # cap_add:
+
+
+ # https://docs.docker.com/compose/compose-file/compose-file-v3/#variable-substitution
+
+ # Note the subtitution to dot (.) in case var service_path is not set
+ # then path will be relative to docker-compose.yaml: ./elasticsearch-v7/...
+ # instead of absolute: /elasticsearch-v7/...
+ # Below are short form volumes (bind mounts specifically) that in case of
+ # missing directory at the HOST machine create that dir with the root access rights.
+ # Therefore it is important to remove the possibility for docker engine to mess
+ # with your HOST system files by creating any directories that are starting from the root (/) path.
+ # With substitution to dot (.) paths will always be relative to the docker-compose.yaml
+ # unless you set service_path to an absolute path (starting from /)
+ # You may turn off this auto directory creation by using long form bind mounts
+ # that access only already existing directories at HOST and don't create new ones.
+ # Note that data and logs are read and write (:rw) access for the container but config and plugin
+ # are read only (:ro) because there is no need for the container to save into them but just read them.
+ #
+ volumes:
+ - ${service_path:-.}/elasticsearch-v7/${image_files_path}/usr/share/elasticsearch/data:/usr/share/elasticsearch/data:rw
+ - ${service_path:-.}/elasticsearch-v7/${image_files_path}/usr/share/elasticsearch/logs/:/usr/share/elasticsearch/logs/:rw
+ - ${service_path:-.}/elasticsearch-v7/${image_files_path}/usr/share/elasticsearch/config/:/usr/share/elasticsearch/config/:ro
+ - ${service_path:-.}/elasticsearch-v7/${image_files_path}/usr/share/elasticsearch/plugins/:/usr/share/elasticsearch/plugins/:ro
diff --git a/docker/service/elasticsearch-v7/image/.dockerignore b/docker/service/elasticsearch-v7/image/.dockerignore
new file mode 100644
index 0000000..4d816e4
--- /dev/null
+++ b/docker/service/elasticsearch-v7/image/.dockerignore
@@ -0,0 +1,2 @@
+files/usr/share/elasticsearch/data
+files/usr/share/elasticsearch/logs
diff --git a/docker/service/elasticsearch-v7/image/.env.dev b/docker/service/elasticsearch-v7/image/.env.dev
new file mode 100644
index 0000000..477b12f
--- /dev/null
+++ b/docker/service/elasticsearch-v7/image/.env.dev
@@ -0,0 +1,10 @@
+# BUG unexpected character "." in variable name near "discovery.type=\"single-node\"\n# node.name=\"elasticsearch\"\n# include_type_name=\"true\""
+# it worked fine with the old version of docker and docker-compose.
+# quoting the variable name did not help
+# now moved to the .yaml
+# potential solution https://github.com/laradock/laradock/issues/3076#issuecomment-1017484349
+
+
+# discovery.type="single-node"
+# node.name="elasticsearch"
+# include_type_name="true"
\ No newline at end of file
diff --git a/docker/service/elasticsearch-v7/image/Dockerfile b/docker/service/elasticsearch-v7/image/Dockerfile
new file mode 100644
index 0000000..6e7a8c1
--- /dev/null
+++ b/docker/service/elasticsearch-v7/image/Dockerfile
@@ -0,0 +1,14 @@
+ARG image
+#TODO - shold from image dev be above or below dockerfile code?
+
+FROM $image AS dev
+
+RUN apt-get update && apt-get install -y curl && apt-get clean
+
+HEALTHCHECK \
+--start-period=60s \
+--interval=2s \
+--retries=3 \
+--timeout=2000ms \
+CMD /bin/sh -c \
+"curl --fail -s http://localhost:9200/_cat/health | cut -d' ' -f4 | grep -qE 'yellow|green' || exit 1"
diff --git a/docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/elasticsearch-plugins.example.yml b/docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/elasticsearch-plugins.example.yml
new file mode 100644
index 0000000..b6874e9
--- /dev/null
+++ b/docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/elasticsearch-plugins.example.yml
@@ -0,0 +1,27 @@
+# Rename this file to `elasticsearch-plugins.yml` to use it.
+#
+# All plugins must be listed here. If you add a plugin to this list and run
+# `elasticsearch-plugin sync`, that plugin will be installed. If you remove
+# a plugin from this list, that plugin will be removed when Elasticsearch
+# next starts.
+
+plugins:
+ # Each plugin must have an ID. Plugins with only an ID are official plugins and will be downloaded from Elastic.
+ - id: example-id
+
+ # Plugins can be specified by URL (it doesn't have to be HTTP, you could use e.g. `file:`)
+ - id: example-with-url
+ location: https://some.domain/path/example4.zip
+
+ # Or by maven coordinates:
+ - id: example-with-maven-url
+ location: org.elasticsearch.plugins:example-plugin:1.2.3
+
+ # A proxy can also be configured per-plugin, if necessary
+ - id: example-with-proxy
+ location: https://some.domain/path/example.zip
+ proxy: https://some.domain:1234
+
+# Configures a proxy for all network access. Remove this if you don't need
+# to use a proxy.
+proxy: https://some.domain:1234
diff --git a/docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/elasticsearch.keystore b/docker/service/elasticsearch-v7/image/files/usr/share/elasticsearch/config/elasticsearch.keystore
new file mode 100644
index 0000000000000000000000000000000000000000..a093a2f5c2cd8544d260526ac4cff61a6ad24064
GIT binary patch
literal 199
zcmcD&o+B=nnv+;ul9^nbnpl*ap_iRnSzMA|l*+)szyib!lY!WwK&$9ijm4bbH+wsr
zd|&QxkttP<%l>7w=O)+o83LYt=@)pS_f#D^@5cQ>a(>?mKl{`7-n(~e>UJ(UB%pH0
z@a!$189Xhm2Qp*7E_lkhJZ~$IZylGElOSeg;i6f8j{D2XYjaZXzvhm7W%ai?;^vMW
wT6@ZSdjDLRz##rTPO|*vpN-Y)I64gGh*U>eyEDBwpfULc& utf8 map: it does not contain
+# box-drawing and some other characters. Besides this map contains
+# several koi8-u and Byelorussian letters which are not in koi8-r.
+# If you need a full and standard map, use contrib/unicode2nginx/koi-utf
+# map instead.
+
+charset_map koi8-r utf-8 {
+
+ 80 E282AC ; # euro
+
+ 95 E280A2 ; # bullet
+
+ 9A C2A0 ; #
+
+ 9E C2B7 ; # ·
+
+ A3 D191 ; # small yo
+ A4 D194 ; # small Ukrainian ye
+
+ A6 D196 ; # small Ukrainian i
+ A7 D197 ; # small Ukrainian yi
+
+ AD D291 ; # small Ukrainian soft g
+ AE D19E ; # small Byelorussian short u
+
+ B0 C2B0 ; # °
+
+ B3 D081 ; # capital YO
+ B4 D084 ; # capital Ukrainian YE
+
+ B6 D086 ; # capital Ukrainian I
+ B7 D087 ; # capital Ukrainian YI
+
+ B9 E28496 ; # numero sign
+
+ BD D290 ; # capital Ukrainian soft G
+ BE D18E ; # capital Byelorussian short U
+
+ BF C2A9 ; # (C)
+
+ C0 D18E ; # small yu
+ C1 D0B0 ; # small a
+ C2 D0B1 ; # small b
+ C3 D186 ; # small ts
+ C4 D0B4 ; # small d
+ C5 D0B5 ; # small ye
+ C6 D184 ; # small f
+ C7 D0B3 ; # small g
+ C8 D185 ; # small kh
+ C9 D0B8 ; # small i
+ CA D0B9 ; # small j
+ CB D0BA ; # small k
+ CC D0BB ; # small l
+ CD D0BC ; # small m
+ CE D0BD ; # small n
+ CF D0BE ; # small o
+
+ D0 D0BF ; # small p
+ D1 D18F ; # small ya
+ D2 D180 ; # small r
+ D3 D181 ; # small s
+ D4 D182 ; # small t
+ D5 D183 ; # small u
+ D6 D0B6 ; # small zh
+ D7 D0B2 ; # small v
+ D8 D18C ; # small soft sign
+ D9 D18B ; # small y
+ DA D0B7 ; # small z
+ DB D188 ; # small sh
+ DC D18D ; # small e
+ DD D189 ; # small shch
+ DE D187 ; # small ch
+ DF D18A ; # small hard sign
+
+ E0 D0AE ; # capital YU
+ E1 D090 ; # capital A
+ E2 D091 ; # capital B
+ E3 D0A6 ; # capital TS
+ E4 D094 ; # capital D
+ E5 D095 ; # capital YE
+ E6 D0A4 ; # capital F
+ E7 D093 ; # capital G
+ E8 D0A5 ; # capital KH
+ E9 D098 ; # capital I
+ EA D099 ; # capital J
+ EB D09A ; # capital K
+ EC D09B ; # capital L
+ ED D09C ; # capital M
+ EE D09D ; # capital N
+ EF D09E ; # capital O
+
+ F0 D09F ; # capital P
+ F1 D0AF ; # capital YA
+ F2 D0A0 ; # capital R
+ F3 D0A1 ; # capital S
+ F4 D0A2 ; # capital T
+ F5 D0A3 ; # capital U
+ F6 D096 ; # capital ZH
+ F7 D092 ; # capital V
+ F8 D0AC ; # capital soft sign
+ F9 D0AB ; # capital Y
+ FA D097 ; # capital Z
+ FB D0A8 ; # capital SH
+ FC D0AD ; # capital E
+ FD D0A9 ; # capital SHCH
+ FE D0A7 ; # capital CH
+ FF D0AA ; # capital hard sign
+}
diff --git a/docker/service/nginx-v1/image/files/etc/nginx/koi-win b/docker/service/nginx-v1/image/files/etc/nginx/koi-win
new file mode 100644
index 0000000..72afabe
--- /dev/null
+++ b/docker/service/nginx-v1/image/files/etc/nginx/koi-win
@@ -0,0 +1,103 @@
+
+charset_map koi8-r windows-1251 {
+
+ 80 88 ; # euro
+
+ 95 95 ; # bullet
+
+ 9A A0 ; #
+
+ 9E B7 ; # ·
+
+ A3 B8 ; # small yo
+ A4 BA ; # small Ukrainian ye
+
+ A6 B3 ; # small Ukrainian i
+ A7 BF ; # small Ukrainian yi
+
+ AD B4 ; # small Ukrainian soft g
+ AE A2 ; # small Byelorussian short u
+
+ B0 B0 ; # °
+
+ B3 A8 ; # capital YO
+ B4 AA ; # capital Ukrainian YE
+
+ B6 B2 ; # capital Ukrainian I
+ B7 AF ; # capital Ukrainian YI
+
+ B9 B9 ; # numero sign
+
+ BD A5 ; # capital Ukrainian soft G
+ BE A1 ; # capital Byelorussian short U
+
+ BF A9 ; # (C)
+
+ C0 FE ; # small yu
+ C1 E0 ; # small a
+ C2 E1 ; # small b
+ C3 F6 ; # small ts
+ C4 E4 ; # small d
+ C5 E5 ; # small ye
+ C6 F4 ; # small f
+ C7 E3 ; # small g
+ C8 F5 ; # small kh
+ C9 E8 ; # small i
+ CA E9 ; # small j
+ CB EA ; # small k
+ CC EB ; # small l
+ CD EC ; # small m
+ CE ED ; # small n
+ CF EE ; # small o
+
+ D0 EF ; # small p
+ D1 FF ; # small ya
+ D2 F0 ; # small r
+ D3 F1 ; # small s
+ D4 F2 ; # small t
+ D5 F3 ; # small u
+ D6 E6 ; # small zh
+ D7 E2 ; # small v
+ D8 FC ; # small soft sign
+ D9 FB ; # small y
+ DA E7 ; # small z
+ DB F8 ; # small sh
+ DC FD ; # small e
+ DD F9 ; # small shch
+ DE F7 ; # small ch
+ DF FA ; # small hard sign
+
+ E0 DE ; # capital YU
+ E1 C0 ; # capital A
+ E2 C1 ; # capital B
+ E3 D6 ; # capital TS
+ E4 C4 ; # capital D
+ E5 C5 ; # capital YE
+ E6 D4 ; # capital F
+ E7 C3 ; # capital G
+ E8 D5 ; # capital KH
+ E9 C8 ; # capital I
+ EA C9 ; # capital J
+ EB CA ; # capital K
+ EC CB ; # capital L
+ ED CC ; # capital M
+ EE CD ; # capital N
+ EF CE ; # capital O
+
+ F0 CF ; # capital P
+ F1 DF ; # capital YA
+ F2 D0 ; # capital R
+ F3 D1 ; # capital S
+ F4 D2 ; # capital T
+ F5 D3 ; # capital U
+ F6 C6 ; # capital ZH
+ F7 C2 ; # capital V
+ F8 DC ; # capital soft sign
+ F9 DB ; # capital Y
+ FA C7 ; # capital Z
+ FB D8 ; # capital SH
+ FC DD ; # capital E
+ FD D9 ; # capital SHCH
+ FE D7 ; # capital CH
+ FF DA ; # capital hard sign
+}
diff --git a/docker/service/nginx-v1/image/files/etc/nginx/mime.types b/docker/service/nginx-v1/image/files/etc/nginx/mime.types
new file mode 100644
index 0000000..2961256
--- /dev/null
+++ b/docker/service/nginx-v1/image/files/etc/nginx/mime.types
@@ -0,0 +1,97 @@
+
+types {
+ text/html html htm shtml;
+ text/css css;
+ text/xml xml;
+ image/gif gif;
+ image/jpeg jpeg jpg;
+ application/javascript js;
+ application/atom+xml atom;
+ application/rss+xml rss;
+
+ text/mathml mml;
+ text/plain txt;
+ text/vnd.sun.j2me.app-descriptor jad;
+ text/vnd.wap.wml wml;
+ text/x-component htc;
+
+ image/png png;
+ image/svg+xml svg svgz;
+ image/tiff tif tiff;
+ image/vnd.wap.wbmp wbmp;
+ image/webp webp;
+ image/x-icon ico;
+ image/x-jng jng;
+ image/x-ms-bmp bmp;
+
+ font/woff woff;
+ font/woff2 woff2;
+
+ application/java-archive jar war ear;
+ application/json json;
+ application/mac-binhex40 hqx;
+ application/msword doc;
+ application/pdf pdf;
+ application/postscript ps eps ai;
+ application/rtf rtf;
+ application/vnd.apple.mpegurl m3u8;
+ application/vnd.google-earth.kml+xml kml;
+ application/vnd.google-earth.kmz kmz;
+ application/vnd.ms-excel xls;
+ application/vnd.ms-fontobject eot;
+ application/vnd.ms-powerpoint ppt;
+ application/vnd.oasis.opendocument.graphics odg;
+ application/vnd.oasis.opendocument.presentation odp;
+ application/vnd.oasis.opendocument.spreadsheet ods;
+ application/vnd.oasis.opendocument.text odt;
+ application/vnd.openxmlformats-officedocument.presentationml.presentation
+ pptx;
+ application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
+ xlsx;
+ application/vnd.openxmlformats-officedocument.wordprocessingml.document
+ docx;
+ application/vnd.wap.wmlc wmlc;
+ application/x-7z-compressed 7z;
+ application/x-cocoa cco;
+ application/x-java-archive-diff jardiff;
+ application/x-java-jnlp-file jnlp;
+ application/x-makeself run;
+ application/x-perl pl pm;
+ application/x-pilot prc pdb;
+ application/x-rar-compressed rar;
+ application/x-redhat-package-manager rpm;
+ application/x-sea sea;
+ application/x-shockwave-flash swf;
+ application/x-stuffit sit;
+ application/x-tcl tcl tk;
+ application/x-x509-ca-cert der pem crt;
+ application/x-xpinstall xpi;
+ application/xhtml+xml xhtml;
+ application/xspf+xml xspf;
+ application/zip zip;
+
+ application/octet-stream bin exe dll;
+ application/octet-stream deb;
+ application/octet-stream dmg;
+ application/octet-stream iso img;
+ application/octet-stream msi msp msm;
+
+ audio/midi mid midi kar;
+ audio/mpeg mp3;
+ audio/ogg ogg;
+ audio/x-m4a m4a;
+ audio/x-realaudio ra;
+
+ video/3gpp 3gpp 3gp;
+ video/mp2t ts;
+ video/mp4 mp4;
+ video/mpeg mpeg mpg;
+ video/quicktime mov;
+ video/webm webm;
+ video/x-flv flv;
+ video/x-m4v m4v;
+ video/x-mng mng;
+ video/x-ms-asf asx asf;
+ video/x-ms-wmv wmv;
+ video/x-msvideo avi;
+}
diff --git a/docker/service/nginx-v1/image/files/etc/nginx/modules b/docker/service/nginx-v1/image/files/etc/nginx/modules
new file mode 120000
index 0000000..4b9b33f
--- /dev/null
+++ b/docker/service/nginx-v1/image/files/etc/nginx/modules
@@ -0,0 +1 @@
+/usr/lib/nginx/modules
\ No newline at end of file
diff --git a/docker/service/nginx-v1/image/files/etc/nginx/nginx.conf b/docker/service/nginx-v1/image/files/etc/nginx/nginx.conf
new file mode 100644
index 0000000..9859533
--- /dev/null
+++ b/docker/service/nginx-v1/image/files/etc/nginx/nginx.conf
@@ -0,0 +1,36 @@
+
+# comment this line to remove: nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
+# but it may be a security hole in case you run container as a root user, and then forget to uncomment it
+# recommended is to leave it as it is, seeing warning is also a confirmation that you run container as a non root user
+user nginx;
+
+worker_processes 1;
+
+error_log /var/log/nginx/error.log warn;
+pid /var/run/nginx.pid;
+
+
+events {
+ worker_connections 1024;
+}
+
+
+http {
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+
+ access_log /var/log/nginx/access.log main;
+
+ sendfile on;
+ #tcp_nopush on;
+
+ keepalive_timeout 65;
+
+ #gzip on;
+
+ include /etc/nginx/conf.d/*.conf;
+}
diff --git a/docker/service/nginx-v1/image/files/etc/nginx/scgi_params b/docker/service/nginx-v1/image/files/etc/nginx/scgi_params
new file mode 100644
index 0000000..6d4ce4f
--- /dev/null
+++ b/docker/service/nginx-v1/image/files/etc/nginx/scgi_params
@@ -0,0 +1,17 @@
+
+scgi_param REQUEST_METHOD $request_method;
+scgi_param REQUEST_URI $request_uri;
+scgi_param QUERY_STRING $query_string;
+scgi_param CONTENT_TYPE $content_type;
+
+scgi_param DOCUMENT_URI $document_uri;
+scgi_param DOCUMENT_ROOT $document_root;
+scgi_param SCGI 1;
+scgi_param SERVER_PROTOCOL $server_protocol;
+scgi_param REQUEST_SCHEME $scheme;
+scgi_param HTTPS $https if_not_empty;
+
+scgi_param REMOTE_ADDR $remote_addr;
+scgi_param REMOTE_PORT $remote_port;
+scgi_param SERVER_PORT $server_port;
+scgi_param SERVER_NAME $server_name;
diff --git a/docker/service/nginx-v1/image/files/etc/nginx/uwsgi_params b/docker/service/nginx-v1/image/files/etc/nginx/uwsgi_params
new file mode 100644
index 0000000..09c732c
--- /dev/null
+++ b/docker/service/nginx-v1/image/files/etc/nginx/uwsgi_params
@@ -0,0 +1,17 @@
+
+uwsgi_param QUERY_STRING $query_string;
+uwsgi_param REQUEST_METHOD $request_method;
+uwsgi_param CONTENT_TYPE $content_type;
+uwsgi_param CONTENT_LENGTH $content_length;
+
+uwsgi_param REQUEST_URI $request_uri;
+uwsgi_param PATH_INFO $document_uri;
+uwsgi_param DOCUMENT_ROOT $document_root;
+uwsgi_param SERVER_PROTOCOL $server_protocol;
+uwsgi_param REQUEST_SCHEME $scheme;
+uwsgi_param HTTPS $https if_not_empty;
+
+uwsgi_param REMOTE_ADDR $remote_addr;
+uwsgi_param REMOTE_PORT $remote_port;
+uwsgi_param SERVER_PORT $server_port;
+uwsgi_param SERVER_NAME $server_name;
diff --git a/docker/service/nginx-v1/image/files/etc/nginx/win-utf b/docker/service/nginx-v1/image/files/etc/nginx/win-utf
new file mode 100644
index 0000000..ed8bc00
--- /dev/null
+++ b/docker/service/nginx-v1/image/files/etc/nginx/win-utf
@@ -0,0 +1,126 @@
+
+# This map is not a full windows-1251 <> utf8 map: it does not
+# contain Serbian and Macedonian letters. If you need a full map,
+# use contrib/unicode2nginx/win-utf map instead.
+
+charset_map windows-1251 utf-8 {
+
+ 82 E2809A ; # single low-9 quotation mark
+
+ 84 E2809E ; # double low-9 quotation mark
+ 85 E280A6 ; # ellipsis
+ 86 E280A0 ; # dagger
+ 87 E280A1 ; # double dagger
+ 88 E282AC ; # euro
+ 89 E280B0 ; # per mille
+
+ 91 E28098 ; # left single quotation mark
+ 92 E28099 ; # right single quotation mark
+ 93 E2809C ; # left double quotation mark
+ 94 E2809D ; # right double quotation mark
+ 95 E280A2 ; # bullet
+ 96 E28093 ; # en dash
+ 97 E28094 ; # em dash
+
+ 99 E284A2 ; # trade mark sign
+
+ A0 C2A0 ; #
+ A1 D18E ; # capital Byelorussian short U
+ A2 D19E ; # small Byelorussian short u
+
+ A4 C2A4 ; # currency sign
+ A5 D290 ; # capital Ukrainian soft G
+ A6 C2A6 ; # borken bar
+ A7 C2A7 ; # section sign
+ A8 D081 ; # capital YO
+ A9 C2A9 ; # (C)
+ AA D084 ; # capital Ukrainian YE
+ AB C2AB ; # left-pointing double angle quotation mark
+ AC C2AC ; # not sign
+ AD C2AD ; # soft hypen
+ AE C2AE ; # (R)
+ AF D087 ; # capital Ukrainian YI
+
+ B0 C2B0 ; # °
+ B1 C2B1 ; # plus-minus sign
+ B2 D086 ; # capital Ukrainian I
+ B3 D196 ; # small Ukrainian i
+ B4 D291 ; # small Ukrainian soft g
+ B5 C2B5 ; # micro sign
+ B6 C2B6 ; # pilcrow sign
+ B7 C2B7 ; # ·
+ B8 D191 ; # small yo
+ B9 E28496 ; # numero sign
+ BA D194 ; # small Ukrainian ye
+ BB C2BB ; # right-pointing double angle quotation mark
+
+ BF D197 ; # small Ukrainian yi
+
+ C0 D090 ; # capital A
+ C1 D091 ; # capital B
+ C2 D092 ; # capital V
+ C3 D093 ; # capital G
+ C4 D094 ; # capital D
+ C5 D095 ; # capital YE
+ C6 D096 ; # capital ZH
+ C7 D097 ; # capital Z
+ C8 D098 ; # capital I
+ C9 D099 ; # capital J
+ CA D09A ; # capital K
+ CB D09B ; # capital L
+ CC D09C ; # capital M
+ CD D09D ; # capital N
+ CE D09E ; # capital O
+ CF D09F ; # capital P
+
+ D0 D0A0 ; # capital R
+ D1 D0A1 ; # capital S
+ D2 D0A2 ; # capital T
+ D3 D0A3 ; # capital U
+ D4 D0A4 ; # capital F
+ D5 D0A5 ; # capital KH
+ D6 D0A6 ; # capital TS
+ D7 D0A7 ; # capital CH
+ D8 D0A8 ; # capital SH
+ D9 D0A9 ; # capital SHCH
+ DA D0AA ; # capital hard sign
+ DB D0AB ; # capital Y
+ DC D0AC ; # capital soft sign
+ DD D0AD ; # capital E
+ DE D0AE ; # capital YU
+ DF D0AF ; # capital YA
+
+ E0 D0B0 ; # small a
+ E1 D0B1 ; # small b
+ E2 D0B2 ; # small v
+ E3 D0B3 ; # small g
+ E4 D0B4 ; # small d
+ E5 D0B5 ; # small ye
+ E6 D0B6 ; # small zh
+ E7 D0B7 ; # small z
+ E8 D0B8 ; # small i
+ E9 D0B9 ; # small j
+ EA D0BA ; # small k
+ EB D0BB ; # small l
+ EC D0BC ; # small m
+ ED D0BD ; # small n
+ EE D0BE ; # small o
+ EF D0BF ; # small p
+
+ F0 D180 ; # small r
+ F1 D181 ; # small s
+ F2 D182 ; # small t
+ F3 D183 ; # small u
+ F4 D184 ; # small f
+ F5 D185 ; # small kh
+ F6 D186 ; # small ts
+ F7 D187 ; # small ch
+ F8 D188 ; # small sh
+ F9 D189 ; # small shch
+ FA D18A ; # small hard sign
+ FB D18B ; # small y
+ FC D18C ; # small soft sign
+ FD D18D ; # small e
+ FE D18E ; # small yu
+ FF D18F ; # small ya
+}
diff --git a/docker/service/nginx-v1/image/files/site.conf b/docker/service/nginx-v1/image/files/site.conf
new file mode 100644
index 0000000..7741bfa
--- /dev/null
+++ b/docker/service/nginx-v1/image/files/site.conf
@@ -0,0 +1,7 @@
+server {
+ index index.html;
+ server_name php-docker.local;
+ error_log /var/log/nginx/error.log;
+ access_log /var/log/nginx/access.log;
+ root /code;
+}
diff --git a/docker/service/php-composer-v2.yaml b/docker/service/php-composer-v2.yaml
new file mode 100644
index 0000000..326151a
--- /dev/null
+++ b/docker/service/php-composer-v2.yaml
@@ -0,0 +1,47 @@
+version: "3.7"
+
+services:
+ php-composer-v2:
+ image: ${COMPOSE_PROJECT_NAME}_composer:2.2.7
+ build:
+ context: ${service_path:-.}/php-composer-v2/${image_path}
+ args:
+ image: composer:2.2.7
+ uid: ${uid:-1000}
+ gid: ${gid:-1000}
+ shm_size: '2gb'
+ target: dev
+
+ env_file:
+ - "${service_path:-.}/php-composer-v2/.env.dev"
+
+ user: ${uid:-1000}:${gid:-1000}
+
+ # makes possible to attach to the container shell and perform actions
+ # for example install dependencies
+ #
+ # docker attach carrental-php-composer-v2-1
+ #
+ # once you do what you wanted to do just
+ # type exit + [enter] to leave the container shell
+ #
+ stdin_open: true
+ tty: true
+
+ #TODO - make your capabilities restrictions for that service
+ # take nginx-v1 service as an example and check if you may
+ # limit the capabilities even further.
+ # Keep in mind that composer may execute installation scripts
+ # that potentially may be harmful.
+ # Does composer container really need all capabilities including
+ # these with the low level kernell commands? No it does not!
+
+ # cap_drop:
+ # - ALL
+
+ # cap_add:
+
+ working_dir: /app/default
+
+ volumes:
+ - ${app_path:-./app}:/app
\ No newline at end of file
diff --git a/docker/service/php-composer-v2/.env.dev b/docker/service/php-composer-v2/.env.dev
new file mode 100644
index 0000000..e69de29
diff --git a/docker/service/php-composer-v2/image/Dockerfile b/docker/service/php-composer-v2/image/Dockerfile
new file mode 100644
index 0000000..9a3723e
--- /dev/null
+++ b/docker/service/php-composer-v2/image/Dockerfile
@@ -0,0 +1,21 @@
+ARG image
+FROM $image AS dev
+
+ARG user_name=composer
+ARG uid=1000
+ARG gid=1000
+
+RUN addgroup -g $gid $username $gid || true && \
+ adduser -D -h "/home/${user_name}" -u $uid -G $gid $user_name || true && \
+ printf "PS1='\u@\h:[\W]\$ '" > "/home/${user_name}/.bashrc" && \
+ mkdir -p "/app" "/home/$user_name/.config" "/home/${user_name}/.cache" && \
+ chown -R $uid:$gid "/app" && \
+ chown -R $uid:$gid "/home/${user_name}/.config" && \
+ chown -R $uid:$gid "/home/${user_name}/.cache"
+
+USER $uid
+
+# https://docs.docker.com/engine/reference/builder/#cmd
+# https://www.gnu.org/software/coreutils/manual/html_node/env-invocation.html#env-invocation
+
+CMD /usr/bin/env bash
diff --git a/docker/service/php-fpm-v8.yaml b/docker/service/php-fpm-v8.yaml
new file mode 100644
index 0000000..730d633
--- /dev/null
+++ b/docker/service/php-fpm-v8.yaml
@@ -0,0 +1,29 @@
+version: "3.7"
+services:
+ php-fpm-v8:
+ image: ${COMPOSE_PROJECT_NAME}_php:8.1.3-fpm-buster
+ build:
+ context: ${service_path:-.}/php-fpm-v8/${image_path}
+ args:
+ image: php:8.1.3-fpm-buster
+ shm_size: '2gb'
+ target: dev
+
+ env_file:
+ - "${service_path:-.}/php-fpm-v8/${image_path}/.env.dev"
+
+ user: ${uid:-1000}:${gid:-1000}
+
+ #TODO - make your capabilities restrictions for that service
+ # take nginx-v1 service as an example and check if you may
+ # limit the capabilities even further.
+ # who knows, maybe you may grant zero capabilities and this
+ # service still will work without any problem?
+
+ # cap_drop:
+ # - ALL
+
+ # cap_add:
+
+ volumes:
+ - ${app_path:-./app}:/usr/share/nginx/html
diff --git a/docker/service/php-fpm-v8/image/.dockerignore b/docker/service/php-fpm-v8/image/.dockerignore
new file mode 100644
index 0000000..6456ff8
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/.dockerignore
@@ -0,0 +1,2 @@
+files/cache
+files/usr/share
diff --git a/docker/service/php-fpm-v8/image/.env.dev b/docker/service/php-fpm-v8/image/.env.dev
new file mode 100644
index 0000000..c816164
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/.env.dev
@@ -0,0 +1,2 @@
+user_id=1000
+user_group_id=1000
\ No newline at end of file
diff --git a/docker/service/php-fpm-v8/image/Dockerfile b/docker/service/php-fpm-v8/image/Dockerfile
new file mode 100644
index 0000000..92a95e0
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/Dockerfile
@@ -0,0 +1,2 @@
+ARG image
+FROM $image AS dev
\ No newline at end of file
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-bcmath.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-bcmath.ini
new file mode 100644
index 0000000..7e0ae9a
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-bcmath.ini
@@ -0,0 +1 @@
+extension=bcmath.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-calendar.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-calendar.ini
new file mode 100644
index 0000000..9106f44
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-calendar.ini
@@ -0,0 +1 @@
+extension=calendar.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-dba.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-dba.ini
new file mode 100644
index 0000000..3058911
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-dba.ini
@@ -0,0 +1 @@
+extension=dba.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-exif.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-exif.ini
new file mode 100644
index 0000000..0688bbe
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-exif.ini
@@ -0,0 +1 @@
+extension=exif.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-gd.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-gd.ini
new file mode 100644
index 0000000..1941c0d
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-gd.ini
@@ -0,0 +1 @@
+extension=gd.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-gettext.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-gettext.ini
new file mode 100644
index 0000000..1b2e930
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-gettext.ini
@@ -0,0 +1 @@
+extension=gettext.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-imagick.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-imagick.ini
new file mode 100644
index 0000000..d7513f1
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-imagick.ini
@@ -0,0 +1 @@
+extension=imagick.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-mongodb.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-mongodb.ini
new file mode 100644
index 0000000..45969d0
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-mongodb.ini
@@ -0,0 +1 @@
+extension=mongodb.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini
new file mode 100644
index 0000000..9d0502f
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini
@@ -0,0 +1 @@
+extension=mysqli.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
new file mode 100644
index 0000000..c82b397
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
@@ -0,0 +1 @@
+zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/opcache.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pcntl.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pcntl.ini
new file mode 100644
index 0000000..f0a7145
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pcntl.ini
@@ -0,0 +1 @@
+extension=pcntl.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
new file mode 100644
index 0000000..34a7ff5
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
@@ -0,0 +1 @@
+extension=pdo_mysql.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pdo_pgsql.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pdo_pgsql.ini
new file mode 100644
index 0000000..d1f7bf0
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pdo_pgsql.ini
@@ -0,0 +1 @@
+extension=pdo_pgsql.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pgsql.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pgsql.ini
new file mode 100644
index 0000000..21be5e4
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pgsql.ini
@@ -0,0 +1 @@
+extension=pgsql.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pspell.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pspell.ini
new file mode 100644
index 0000000..b4d0a8c
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-pspell.ini
@@ -0,0 +1 @@
+extension=pspell.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-shmop.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-shmop.ini
new file mode 100644
index 0000000..b554ad3
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-shmop.ini
@@ -0,0 +1 @@
+extension=shmop.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-soap.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-soap.ini
new file mode 100644
index 0000000..1deef9c
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-soap.ini
@@ -0,0 +1 @@
+extension=soap.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sockets.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sockets.ini
new file mode 100644
index 0000000..327228b
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sockets.ini
@@ -0,0 +1 @@
+extension=sockets.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
new file mode 100644
index 0000000..5ee7788
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
@@ -0,0 +1 @@
+extension=sodium.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-svm.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-svm.ini
new file mode 100644
index 0000000..bc436f9
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-svm.ini
@@ -0,0 +1 @@
+extension=svm.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvmsg.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvmsg.ini
new file mode 100644
index 0000000..639950e
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvmsg.ini
@@ -0,0 +1 @@
+extension=sysvmsg.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvsem.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvsem.ini
new file mode 100644
index 0000000..dd2c343
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvsem.ini
@@ -0,0 +1 @@
+extension=sysvsem.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvshm.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvshm.ini
new file mode 100644
index 0000000..4c26779
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-sysvshm.ini
@@ -0,0 +1 @@
+extension=sysvshm.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-tidy.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-tidy.ini
new file mode 100644
index 0000000..834babc
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-tidy.ini
@@ -0,0 +1 @@
+extension=tidy.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-trader.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-trader.ini
new file mode 100644
index 0000000..42918f4
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-trader.ini
@@ -0,0 +1 @@
+extension=trader.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-wddx.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-wddx.ini
new file mode 100644
index 0000000..95571ae
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-wddx.ini
@@ -0,0 +1 @@
+extension=wddx.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-xmlrpc.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-xmlrpc.ini
new file mode 100644
index 0000000..b03d93c
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-xmlrpc.ini
@@ -0,0 +1 @@
+extension=xmlrpc.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-xsl.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-xsl.ini
new file mode 100644
index 0000000..3223510
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-xsl.ini
@@ -0,0 +1 @@
+extension=xsl.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-zip.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-zip.ini
new file mode 100644
index 0000000..bb70997
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/docker-php-ext-zip.ini
@@ -0,0 +1 @@
+extension=zip.so
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/php.ini b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/php.ini
new file mode 100644
index 0000000..5d65e65
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/conf.d/php.ini
@@ -0,0 +1,3 @@
+; Maximum amount of memory a script may consume (128MB)
+; http://php.net/memory-limit
+memory_limit = 2G
\ No newline at end of file
diff --git a/docker/service/php-fpm-v8/image/files/usr/local/etc/php/php.ini-development b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/php.ini-development
new file mode 100644
index 0000000..9da3a1d
--- /dev/null
+++ b/docker/service/php-fpm-v8/image/files/usr/local/etc/php/php.ini-development
@@ -0,0 +1,1916 @@
+[PHP]
+
+;;;;;;;;;;;;;;;;;;;
+; About php.ini ;
+;;;;;;;;;;;;;;;;;;;
+; PHP's initialization file, generally called php.ini, is responsible for
+; configuring many of the aspects of PHP's behavior.
+
+; PHP attempts to find and load this configuration from a number of locations.
+; The following is a summary of its search order:
+; 1. SAPI module specific location.
+; 2. The PHPRC environment variable. (As of PHP 5.2.0)
+; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0)
+; 4. Current working directory (except CLI)
+; 5. The web server's directory (for SAPI modules), or directory of PHP
+; (otherwise in Windows)
+; 6. The directory from the --with-config-file-path compile time option, or the
+; Windows directory (usually C:\windows)
+; See the PHP docs for more specific information.
+; http://php.net/configuration.file
+
+; The syntax of the file is extremely simple. Whitespace and lines
+; beginning with a semicolon are silently ignored (as you probably guessed).
+; Section headers (e.g. [Foo]) are also silently ignored, even though
+; they might mean something in the future.
+
+; Directives following the section heading [PATH=/www/mysite] only
+; apply to PHP files in the /www/mysite directory. Directives
+; following the section heading [HOST=www.example.com] only apply to
+; PHP files served from www.example.com. Directives set in these
+; special sections cannot be overridden by user-defined INI files or
+; at runtime. Currently, [PATH=] and [HOST=] sections only work under
+; CGI/FastCGI.
+; http://php.net/ini.sections
+
+; Directives are specified using the following syntax:
+; directive = value
+; Directive names are *case sensitive* - foo=bar is different from FOO=bar.
+; Directives are variables used to configure PHP or PHP extensions.
+; There is no name validation. If PHP can't find an expected
+; directive because it is not set or is mistyped, a default value will be used.
+
+; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one
+; of the INI constants (On, Off, True, False, Yes, No and None) or an expression
+; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a
+; previously set variable or directive (e.g. ${foo})
+
+; Expressions in the INI file are limited to bitwise operators and parentheses:
+; | bitwise OR
+; ^ bitwise XOR
+; & bitwise AND
+; ~ bitwise NOT
+; ! boolean NOT
+
+; Boolean flags can be turned on using the values 1, On, True or Yes.
+; They can be turned off using the values 0, Off, False or No.
+
+; An empty string can be denoted by simply not writing anything after the equal
+; sign, or by using the None keyword:
+
+; foo = ; sets foo to an empty string
+; foo = None ; sets foo to an empty string
+; foo = "None" ; sets foo to the string 'None'
+
+; If you use constants in your value, and these constants belong to a
+; dynamically loaded extension (either a PHP extension or a Zend extension),
+; you may only use these constants *after* the line that loads the extension.
+
+;;;;;;;;;;;;;;;;;;;
+; About this file ;
+;;;;;;;;;;;;;;;;;;;
+; PHP comes packaged with two INI files. One that is recommended to be used
+; in production environments and one that is recommended to be used in
+; development environments.
+
+; php.ini-production contains settings which hold security, performance and
+; best practices at its core. But please be aware, these settings may break
+; compatibility with older or less security conscience applications. We
+; recommending using the production ini in production and testing environments.
+
+; php.ini-development is very similar to its production variant, except it is
+; much more verbose when it comes to errors. We recommend using the
+; development version only in development environments, as errors shown to
+; application users can inadvertently leak otherwise secure information.
+
+; This is the php.ini-development INI file.
+
+;;;;;;;;;;;;;;;;;;;
+; Quick Reference ;
+;;;;;;;;;;;;;;;;;;;
+; The following are all the settings which are different in either the production
+; or development versions of the INIs with respect to PHP's default behavior.
+; Please see the actual settings later in the document for more details as to why
+; we recommend these changes in PHP's behavior.
+
+; display_errors
+; Default Value: On
+; Development Value: On
+; Production Value: Off
+
+; display_startup_errors
+; Default Value: Off
+; Development Value: On
+; Production Value: Off
+
+; error_reporting
+; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
+; Development Value: E_ALL
+; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
+
+; html_errors
+; Default Value: On
+; Development Value: On
+; Production value: On
+
+; log_errors
+; Default Value: Off
+; Development Value: On
+; Production Value: On
+
+; max_input_time
+; Default Value: -1 (Unlimited)
+; Development Value: 60 (60 seconds)
+; Production Value: 60 (60 seconds)
+
+; output_buffering
+; Default Value: Off
+; Development Value: 4096
+; Production Value: 4096
+
+; register_argc_argv
+; Default Value: On
+; Development Value: Off
+; Production Value: Off
+
+; request_order
+; Default Value: None
+; Development Value: "GP"
+; Production Value: "GP"
+
+; session.gc_divisor
+; Default Value: 100
+; Development Value: 1000
+; Production Value: 1000
+
+; session.sid_bits_per_character
+; Default Value: 4
+; Development Value: 5
+; Production Value: 5
+
+; short_open_tag
+; Default Value: On
+; Development Value: Off
+; Production Value: Off
+
+; variables_order
+; Default Value: "EGPCS"
+; Development Value: "GPCS"
+; Production Value: "GPCS"
+
+;;;;;;;;;;;;;;;;;;;;
+; php.ini Options ;
+;;;;;;;;;;;;;;;;;;;;
+; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"
+;user_ini.filename = ".user.ini"
+
+; To disable this feature set this option to an empty value
+;user_ini.filename =
+
+; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes)
+;user_ini.cache_ttl = 300
+
+;;;;;;;;;;;;;;;;;;;;
+; Language Options ;
+;;;;;;;;;;;;;;;;;;;;
+
+; Enable the PHP scripting language engine under Apache.
+; http://php.net/engine
+engine = On
+
+; This directive determines whether or not PHP will recognize code between
+; and ?> tags as PHP source which should be processed as such. It is
+; generally recommended that should be used and that this feature
+; should be disabled, as enabling it may result in issues when generating XML
+; documents, however this remains supported for backward compatibility reasons.
+; Note that this directive does not control the = shorthand tag, which can be
+; used regardless of this directive.
+; Default Value: On
+; Development Value: Off
+; Production Value: Off
+; http://php.net/short-open-tag
+short_open_tag = Off
+
+; The number of significant digits displayed in floating point numbers.
+; http://php.net/precision
+precision = 14
+
+; Output buffering is a mechanism for controlling how much output data
+; (excluding headers and cookies) PHP should keep internally before pushing that
+; data to the client. If your application's output exceeds this setting, PHP
+; will send that data in chunks of roughly the size you specify.
+; Turning on this setting and managing its maximum buffer size can yield some
+; interesting side-effects depending on your application and web server.
+; You may be able to send headers and cookies after you've already sent output
+; through print or echo. You also may see performance benefits if your server is
+; emitting less packets due to buffered output versus PHP streaming the output
+; as it gets it. On production servers, 4096 bytes is a good setting for performance
+; reasons.
+; Note: Output buffering can also be controlled via Output Buffering Control
+; functions.
+; Possible Values:
+; On = Enabled and buffer is unlimited. (Use with caution)
+; Off = Disabled
+; Integer = Enables the buffer and sets its maximum size in bytes.
+; Note: This directive is hardcoded to Off for the CLI SAPI
+; Default Value: Off
+; Development Value: 4096
+; Production Value: 4096
+; http://php.net/output-buffering
+output_buffering = 4096
+
+; You can redirect all of the output of your scripts to a function. For
+; example, if you set output_handler to "mb_output_handler", character
+; encoding will be transparently converted to the specified encoding.
+; Setting any output handler automatically turns on output buffering.
+; Note: People who wrote portable scripts should not depend on this ini
+; directive. Instead, explicitly set the output handler using ob_start().
+; Using this ini directive may cause problems unless you know what script
+; is doing.
+; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler"
+; and you cannot use both "ob_gzhandler" and "zlib.output_compression".
+; Note: output_handler must be empty if this is set 'On' !!!!
+; Instead you must use zlib.output_handler.
+; http://php.net/output-handler
+;output_handler =
+
+; URL rewriter function rewrites URL on the fly by using
+; output buffer. You can set target tags by this configuration.
+; "form" tag is special tag. It will add hidden input tag to pass values.
+; Refer to session.trans_sid_tags for usage.
+; Default Value: "form="
+; Development Value: "form="
+; Production Value: "form="
+;url_rewriter.tags
+
+; URL rewriter will not rewrite absolute URL nor form by default. To enable
+; absolute URL rewrite, allowed hosts must be defined at RUNTIME.
+; Refer to session.trans_sid_hosts for more details.
+; Default Value: ""
+; Development Value: ""
+; Production Value: ""
+;url_rewriter.hosts
+
+; Transparent output compression using the zlib library
+; Valid values for this option are 'off', 'on', or a specific buffer size
+; to be used for compression (default is 4KB)
+; Note: Resulting chunk size may vary due to nature of compression. PHP
+; outputs chunks that are few hundreds bytes each as a result of
+; compression. If you prefer a larger chunk size for better
+; performance, enable output_buffering in addition.
+; Note: You need to use zlib.output_handler instead of the standard
+; output_handler, or otherwise the output will be corrupted.
+; http://php.net/zlib.output-compression
+zlib.output_compression = Off
+
+; http://php.net/zlib.output-compression-level
+;zlib.output_compression_level = -1
+
+; You cannot specify additional output handlers if zlib.output_compression
+; is activated here. This setting does the same as output_handler but in
+; a different order.
+; http://php.net/zlib.output-handler
+;zlib.output_handler =
+
+; Implicit flush tells PHP to tell the output layer to flush itself
+; automatically after every output block. This is equivalent to calling the
+; PHP function flush() after each and every call to print() or echo() and each
+; and every HTML block. Turning this option on has serious performance
+; implications and is generally recommended for debugging purposes only.
+; http://php.net/implicit-flush
+; Note: This directive is hardcoded to On for the CLI SAPI
+implicit_flush = Off
+
+; The unserialize callback function will be called (with the undefined class'
+; name as parameter), if the unserializer finds an undefined class
+; which should be instantiated. A warning appears if the specified function is
+; not defined, or if the function doesn't include/implement the missing class.
+; So only set this entry, if you really want to implement such a
+; callback-function.
+unserialize_callback_func =
+
+; When floats & doubles are serialized, store serialize_precision significant
+; digits after the floating point. The default value ensures that when floats
+; are decoded with unserialize, the data will remain the same.
+; The value is also used for json_encode when encoding double values.
+; If -1 is used, then dtoa mode 0 is used which automatically select the best
+; precision.
+serialize_precision = -1
+
+; open_basedir, if set, limits all file operations to the defined directory
+; and below. This directive makes most sense if used in a per-directory
+; or per-virtualhost web server configuration file.
+; http://php.net/open-basedir
+;open_basedir =
+
+; This directive allows you to disable certain functions for security reasons.
+; It receives a comma-delimited list of function names.
+; http://php.net/disable-functions
+disable_functions =
+
+; This directive allows you to disable certain classes for security reasons.
+; It receives a comma-delimited list of class names.
+; http://php.net/disable-classes
+disable_classes =
+
+; Colors for Syntax Highlighting mode. Anything that's acceptable in
+; would work.
+; http://php.net/syntax-highlighting
+;highlight.string = #DD0000
+;highlight.comment = #FF9900
+;highlight.keyword = #007700
+;highlight.default = #0000BB
+;highlight.html = #000000
+
+; If enabled, the request will be allowed to complete even if the user aborts
+; the request. Consider enabling it if executing long requests, which may end up
+; being interrupted by the user or a browser timing out. PHP's default behavior
+; is to disable this feature.
+; http://php.net/ignore-user-abort
+;ignore_user_abort = On
+
+; Determines the size of the realpath cache to be used by PHP. This value should
+; be increased on systems where PHP opens many files to reflect the quantity of
+; the file operations performed.
+; http://php.net/realpath-cache-size
+;realpath_cache_size = 4096k
+
+; Duration of time, in seconds for which to cache realpath information for a given
+; file or directory. For systems with rarely changing files, consider increasing this
+; value.
+; http://php.net/realpath-cache-ttl
+;realpath_cache_ttl = 120
+
+; Enables or disables the circular reference collector.
+; http://php.net/zend.enable-gc
+zend.enable_gc = On
+
+; If enabled, scripts may be written in encodings that are incompatible with
+; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such
+; encodings. To use this feature, mbstring extension must be enabled.
+; Default: Off
+;zend.multibyte = Off
+
+; Allows to set the default encoding for the scripts. This value will be used
+; unless "declare(encoding=...)" directive appears at the top of the script.
+; Only affects if zend.multibyte is set.
+; Default: ""
+;zend.script_encoding =
+
+;;;;;;;;;;;;;;;;;
+; Miscellaneous ;
+;;;;;;;;;;;;;;;;;
+
+; Decides whether PHP may expose the fact that it is installed on the server
+; (e.g. by adding its signature to the Web server header). It is no security
+; threat in any way, but it makes it possible to determine whether you use PHP
+; on your server or not.
+; http://php.net/expose-php
+expose_php = On
+
+;;;;;;;;;;;;;;;;;;;
+; Resource Limits ;
+;;;;;;;;;;;;;;;;;;;
+
+; Maximum execution time of each script, in seconds
+; http://php.net/max-execution-time
+; Note: This directive is hardcoded to 0 for the CLI SAPI
+max_execution_time = 30
+
+; Maximum amount of time each script may spend parsing request data. It's a good
+; idea to limit this time on productions servers in order to eliminate unexpectedly
+; long running scripts.
+; Note: This directive is hardcoded to -1 for the CLI SAPI
+; Default Value: -1 (Unlimited)
+; Development Value: 60 (60 seconds)
+; Production Value: 60 (60 seconds)
+; http://php.net/max-input-time
+max_input_time = 60
+
+; Maximum input variable nesting level
+; http://php.net/max-input-nesting-level
+;max_input_nesting_level = 64
+
+; How many GET/POST/COOKIE input variables may be accepted
+;max_input_vars = 1000
+
+; Maximum amount of memory a script may consume (128MB)
+; http://php.net/memory-limit
+memory_limit = 128M
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Error handling and logging ;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; This directive informs PHP of which errors, warnings and notices you would like
+; it to take action for. The recommended way of setting values for this
+; directive is through the use of the error level constants and bitwise
+; operators. The error level constants are below here for convenience as well as
+; some common settings and their meanings.
+; By default, PHP is set to take action on all errors, notices and warnings EXCEPT
+; those related to E_NOTICE and E_STRICT, which together cover best practices and
+; recommended coding standards in PHP. For performance reasons, this is the
+; recommend error reporting setting. Your production server shouldn't be wasting
+; resources complaining about best practices and coding standards. That's what
+; development servers and development settings are for.
+; Note: The php.ini-development file has this setting as E_ALL. This
+; means it pretty much reports everything which is exactly what you want during
+; development and early testing.
+;
+; Error Level Constants:
+; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0)
+; E_ERROR - fatal run-time errors
+; E_RECOVERABLE_ERROR - almost fatal run-time errors
+; E_WARNING - run-time warnings (non-fatal errors)
+; E_PARSE - compile-time parse errors
+; E_NOTICE - run-time notices (these are warnings which often result
+; from a bug in your code, but it's possible that it was
+; intentional (e.g., using an uninitialized variable and
+; relying on the fact it is automatically initialized to an
+; empty string)
+; E_STRICT - run-time notices, enable to have PHP suggest changes
+; to your code which will ensure the best interoperability
+; and forward compatibility of your code
+; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
+; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
+; initial startup
+; E_COMPILE_ERROR - fatal compile-time errors
+; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
+; E_USER_ERROR - user-generated error message
+; E_USER_WARNING - user-generated warning message
+; E_USER_NOTICE - user-generated notice message
+; E_DEPRECATED - warn about code that will not work in future versions
+; of PHP
+; E_USER_DEPRECATED - user-generated deprecation warnings
+;
+; Common Values:
+; E_ALL (Show all errors, warnings and notices including coding standards.)
+; E_ALL & ~E_NOTICE (Show all errors, except for notices)
+; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
+; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
+; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
+; Development Value: E_ALL
+; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
+; http://php.net/error-reporting
+error_reporting = E_ALL
+
+; This directive controls whether or not and where PHP will output errors,
+; notices and warnings too. Error output is very useful during development, but
+; it could be very dangerous in production environments. Depending on the code
+; which is triggering the error, sensitive information could potentially leak
+; out of your application such as database usernames and passwords or worse.
+; For production environments, we recommend logging errors rather than
+; sending them to STDOUT.
+; Possible Values:
+; Off = Do not display any errors
+; stderr = Display errors to STDERR (affects only CGI/CLI binaries!)
+; On or stdout = Display errors to STDOUT
+; Default Value: On
+; Development Value: On
+; Production Value: Off
+; http://php.net/display-errors
+display_errors = On
+
+; The display of errors which occur during PHP's startup sequence are handled
+; separately from display_errors. PHP's default behavior is to suppress those
+; errors from clients. Turning the display of startup errors on can be useful in
+; debugging configuration problems. We strongly recommend you
+; set this to 'off' for production servers.
+; Default Value: Off
+; Development Value: On
+; Production Value: Off
+; http://php.net/display-startup-errors
+display_startup_errors = On
+
+; Besides displaying errors, PHP can also log errors to locations such as a
+; server-specific log, STDERR, or a location specified by the error_log
+; directive found below. While errors should not be displayed on productions
+; servers they should still be monitored and logging is a great way to do that.
+; Default Value: Off
+; Development Value: On
+; Production Value: On
+; http://php.net/log-errors
+log_errors = On
+
+; Set maximum length of log_errors. In error_log information about the source is
+; added. The default is 1024 and 0 allows to not apply any maximum length at all.
+; http://php.net/log-errors-max-len
+log_errors_max_len = 1024
+
+; Do not log repeated messages. Repeated errors must occur in same file on same
+; line unless ignore_repeated_source is set true.
+; http://php.net/ignore-repeated-errors
+ignore_repeated_errors = Off
+
+; Ignore source of message when ignoring repeated messages. When this setting
+; is On you will not log errors with repeated messages from different files or
+; source lines.
+; http://php.net/ignore-repeated-source
+ignore_repeated_source = Off
+
+; If this parameter is set to Off, then memory leaks will not be shown (on
+; stdout or in the log). This has only effect in a debug compile, and if
+; error reporting includes E_WARNING in the allowed list
+; http://php.net/report-memleaks
+report_memleaks = On
+
+; This setting is on by default.
+;report_zend_debug = 0
+
+; Store the last error/warning message in $php_errormsg (boolean).
+; This directive is DEPRECATED.
+; Default Value: Off
+; Development Value: Off
+; Production Value: Off
+; http://php.net/track-errors
+;track_errors = Off
+
+; Turn off normal error reporting and emit XML-RPC error XML
+; http://php.net/xmlrpc-errors
+;xmlrpc_errors = 0
+
+; An XML-RPC faultCode
+;xmlrpc_error_number = 0
+
+; When PHP displays or logs an error, it has the capability of formatting the
+; error message as HTML for easier reading. This directive controls whether
+; the error message is formatted as HTML or not.
+; Note: This directive is hardcoded to Off for the CLI SAPI
+; Default Value: On
+; Development Value: On
+; Production value: On
+; http://php.net/html-errors
+html_errors = On
+
+; If html_errors is set to On *and* docref_root is not empty, then PHP
+; produces clickable error messages that direct to a page describing the error
+; or function causing the error in detail.
+; You can download a copy of the PHP manual from http://php.net/docs
+; and change docref_root to the base URL of your local copy including the
+; leading '/'. You must also specify the file extension being used including
+; the dot. PHP's default behavior is to leave these settings empty, in which
+; case no links to documentation are generated.
+; Note: Never use this feature for production boxes.
+; http://php.net/docref-root
+; Examples
+;docref_root = "/phpmanual/"
+
+; http://php.net/docref-ext
+;docref_ext = .html
+
+; String to output before an error message. PHP's default behavior is to leave
+; this setting blank.
+; http://php.net/error-prepend-string
+; Example:
+;error_prepend_string = ""
+
+; String to output after an error message. PHP's default behavior is to leave
+; this setting blank.
+; http://php.net/error-append-string
+; Example:
+;error_append_string = ""
+
+; Log errors to specified file. PHP's default behavior is to leave this value
+; empty.
+; http://php.net/error-log
+; Example:
+;error_log = php_errors.log
+; Log errors to syslog (Event Log on Windows).
+;error_log = syslog
+
+; The syslog ident is a string which is prepended to every message logged
+; to syslog. Only used when error_log is set to syslog.
+;syslog.ident = php
+
+; The syslog facility is used to specify what type of program is logging
+; the message. Only used when error_log is set to syslog.
+;syslog.facility = user
+
+; Set this to disable filtering control characters (the default).
+; Some loggers only accept NVT-ASCII, others accept anything that's not
+; control characters. If your logger accepts everything, then no filtering
+; is needed at all.
+; Allowed values are:
+; ascii (only base ASCII characters)
+; no_ctrl (all characters except control characters)
+; all (all characters)
+;syslog.filter = ascii
+
+;windows.show_crt_warning
+; Default value: 0
+; Development value: 0
+; Production value: 0
+
+;;;;;;;;;;;;;;;;;
+; Data Handling ;
+;;;;;;;;;;;;;;;;;
+
+; The separator used in PHP generated URLs to separate arguments.
+; PHP's default setting is "&".
+; http://php.net/arg-separator.output
+; Example:
+;arg_separator.output = "&"
+
+; List of separator(s) used by PHP to parse input URLs into variables.
+; PHP's default setting is "&".
+; NOTE: Every character in this directive is considered as separator!
+; http://php.net/arg-separator.input
+; Example:
+;arg_separator.input = ";&"
+
+; This directive determines which super global arrays are registered when PHP
+; starts up. G,P,C,E & S are abbreviations for the following respective super
+; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty
+; paid for the registration of these arrays and because ENV is not as commonly
+; used as the others, ENV is not recommended on productions servers. You
+; can still get access to the environment variables through getenv() should you
+; need to.
+; Default Value: "EGPCS"
+; Development Value: "GPCS"
+; Production Value: "GPCS";
+; http://php.net/variables-order
+variables_order = "GPCS"
+
+; This directive determines which super global data (G,P & C) should be
+; registered into the super global array REQUEST. If so, it also determines
+; the order in which that data is registered. The values for this directive
+; are specified in the same manner as the variables_order directive,
+; EXCEPT one. Leaving this value empty will cause PHP to use the value set
+; in the variables_order directive. It does not mean it will leave the super
+; globals array REQUEST empty.
+; Default Value: None
+; Development Value: "GP"
+; Production Value: "GP"
+; http://php.net/request-order
+request_order = "GP"
+
+; This directive determines whether PHP registers $argv & $argc each time it
+; runs. $argv contains an array of all the arguments passed to PHP when a script
+; is invoked. $argc contains an integer representing the number of arguments
+; that were passed when the script was invoked. These arrays are extremely
+; useful when running scripts from the command line. When this directive is
+; enabled, registering these variables consumes CPU cycles and memory each time
+; a script is executed. For performance reasons, this feature should be disabled
+; on production servers.
+; Note: This directive is hardcoded to On for the CLI SAPI
+; Default Value: On
+; Development Value: Off
+; Production Value: Off
+; http://php.net/register-argc-argv
+register_argc_argv = Off
+
+; When enabled, the ENV, REQUEST and SERVER variables are created when they're
+; first used (Just In Time) instead of when the script starts. If these
+; variables are not used within a script, having this directive on will result
+; in a performance gain. The PHP directive register_argc_argv must be disabled
+; for this directive to have any affect.
+; http://php.net/auto-globals-jit
+auto_globals_jit = On
+
+; Whether PHP will read the POST data.
+; This option is enabled by default.
+; Most likely, you won't want to disable this option globally. It causes $_POST
+; and $_FILES to always be empty; the only way you will be able to read the
+; POST data will be through the php://input stream wrapper. This can be useful
+; to proxy requests or to process the POST data in a memory efficient fashion.
+; http://php.net/enable-post-data-reading
+;enable_post_data_reading = Off
+
+; Maximum size of POST data that PHP will accept.
+; Its value may be 0 to disable the limit. It is ignored if POST data reading
+; is disabled through enable_post_data_reading.
+; http://php.net/post-max-size
+post_max_size = 8M
+
+; Automatically add files before PHP document.
+; http://php.net/auto-prepend-file
+auto_prepend_file =
+
+; Automatically add files after PHP document.
+; http://php.net/auto-append-file
+auto_append_file =
+
+; By default, PHP will output a media type using the Content-Type header. To
+; disable this, simply set it to be empty.
+;
+; PHP's built-in default media type is set to text/html.
+; http://php.net/default-mimetype
+default_mimetype = "text/html"
+
+; PHP's default character set is set to UTF-8.
+; http://php.net/default-charset
+default_charset = "UTF-8"
+
+; PHP internal character encoding is set to empty.
+; If empty, default_charset is used.
+; http://php.net/internal-encoding
+;internal_encoding =
+
+; PHP input character encoding is set to empty.
+; If empty, default_charset is used.
+; http://php.net/input-encoding
+;input_encoding =
+
+; PHP output character encoding is set to empty.
+; If empty, default_charset is used.
+; See also output_buffer.
+; http://php.net/output-encoding
+;output_encoding =
+
+;;;;;;;;;;;;;;;;;;;;;;;;;
+; Paths and Directories ;
+;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; UNIX: "/path1:/path2"
+;include_path = ".:/php/includes"
+;
+; Windows: "\path1;\path2"
+;include_path = ".;c:\php\includes"
+;
+; PHP's default setting for include_path is ".;/path/to/php/pear"
+; http://php.net/include-path
+
+; The root of the PHP pages, used only if nonempty.
+; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
+; if you are running php as a CGI under any web server (other than IIS)
+; see documentation for security issues. The alternate is to use the
+; cgi.force_redirect configuration below
+; http://php.net/doc-root
+doc_root =
+
+; The directory under which PHP opens the script using /~username used only
+; if nonempty.
+; http://php.net/user-dir
+user_dir =
+
+; Directory in which the loadable extensions (modules) reside.
+; http://php.net/extension-dir
+;extension_dir = "./"
+; On windows:
+;extension_dir = "ext"
+
+; Directory where the temporary files should be placed.
+; Defaults to the system default (see sys_get_temp_dir)
+;sys_temp_dir = "/tmp"
+
+; Whether or not to enable the dl() function. The dl() function does NOT work
+; properly in multithreaded servers, such as IIS or Zeus, and is automatically
+; disabled on them.
+; http://php.net/enable-dl
+enable_dl = Off
+
+; cgi.force_redirect is necessary to provide security running PHP as a CGI under
+; most web servers. Left undefined, PHP turns this on by default. You can
+; turn it off here AT YOUR OWN RISK
+; **You CAN safely turn this off for IIS, in fact, you MUST.**
+; http://php.net/cgi.force-redirect
+;cgi.force_redirect = 1
+
+; if cgi.nph is enabled it will force cgi to always sent Status: 200 with
+; every request. PHP's default behavior is to disable this feature.
+;cgi.nph = 1
+
+; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape
+; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
+; will look for to know it is OK to continue execution. Setting this variable MAY
+; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
+; http://php.net/cgi.redirect-status-env
+;cgi.redirect_status_env =
+
+; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
+; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
+; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
+; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
+; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
+; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
+; http://php.net/cgi.fix-pathinfo
+;cgi.fix_pathinfo=1
+
+; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside
+; of the web tree and people will not be able to circumvent .htaccess security.
+;cgi.discard_path=1
+
+; FastCGI under IIS supports the ability to impersonate
+; security tokens of the calling client. This allows IIS to define the
+; security context that the request runs under. mod_fastcgi under Apache
+; does not currently support this feature (03/17/2002)
+; Set to 1 if running under IIS. Default is zero.
+; http://php.net/fastcgi.impersonate
+;fastcgi.impersonate = 1
+
+; Disable logging through FastCGI connection. PHP's default behavior is to enable
+; this feature.
+;fastcgi.logging = 0
+
+; cgi.rfc2616_headers configuration option tells PHP what type of headers to
+; use when sending HTTP response code. If set to 0, PHP sends Status: header that
+; is supported by Apache. When this option is set to 1, PHP will send
+; RFC2616 compliant header.
+; Default is zero.
+; http://php.net/cgi.rfc2616-headers
+;cgi.rfc2616_headers = 0
+
+; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #!
+; (shebang) at the top of the running script. This line might be needed if the
+; script support running both as stand-alone script and via PHP CGI<. PHP in CGI
+; mode skips this line and ignores its content if this directive is turned on.
+; http://php.net/cgi.check-shebang-line
+;cgi.check_shebang_line=1
+
+;;;;;;;;;;;;;;;;
+; File Uploads ;
+;;;;;;;;;;;;;;;;
+
+; Whether to allow HTTP file uploads.
+; http://php.net/file-uploads
+file_uploads = On
+
+; Temporary directory for HTTP uploaded files (will use system default if not
+; specified).
+; http://php.net/upload-tmp-dir
+;upload_tmp_dir =
+
+; Maximum allowed size for uploaded files.
+; http://php.net/upload-max-filesize
+upload_max_filesize = 2M
+
+; Maximum number of files that can be uploaded via a single request
+max_file_uploads = 20
+
+;;;;;;;;;;;;;;;;;;
+; Fopen wrappers ;
+;;;;;;;;;;;;;;;;;;
+
+; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
+; http://php.net/allow-url-fopen
+allow_url_fopen = On
+
+; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
+; http://php.net/allow-url-include
+allow_url_include = Off
+
+; Define the anonymous ftp password (your email address). PHP's default setting
+; for this is empty.
+; http://php.net/from
+;from="john@doe.com"
+
+; Define the User-Agent string. PHP's default setting for this is empty.
+; http://php.net/user-agent
+;user_agent="PHP"
+
+; Default timeout for socket based streams (seconds)
+; http://php.net/default-socket-timeout
+default_socket_timeout = 60
+
+; If your scripts have to deal with files from Macintosh systems,
+; or you are running on a Mac and need to deal with files from
+; unix or win32 systems, setting this flag will cause PHP to
+; automatically detect the EOL character in those files so that
+; fgets() and file() will work regardless of the source of the file.
+; http://php.net/auto-detect-line-endings
+;auto_detect_line_endings = Off
+
+;;;;;;;;;;;;;;;;;;;;;;
+; Dynamic Extensions ;
+;;;;;;;;;;;;;;;;;;;;;;
+
+; If you wish to have an extension loaded automatically, use the following
+; syntax:
+;
+; extension=modulename
+;
+; For example:
+;
+; extension=mysqli
+;
+; When the extension library to load is not located in the default extension
+; directory, You may specify an absolute path to the library file:
+;
+; extension=/path/to/extension/mysqli.so
+;
+; Note : The syntax used in previous PHP versions ('extension=.so' and
+; 'extension='php_.dll') is supported for legacy reasons and may be
+; deprecated in a future PHP major version. So, when it is possible, please
+; move to the new ('extension=) syntax.
+;
+; Notes for Windows environments :
+;
+; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+)
+; extension folders as well as the separate PECL DLL download (PHP 5+).
+; Be sure to appropriately set the extension_dir directive.
+;
+;extension=bz2
+;extension=curl
+;extension=fileinfo
+;extension=gd2
+;extension=gettext
+;extension=gmp
+;extension=intl
+;extension=imap
+;extension=interbase
+;extension=ldap
+;extension=mbstring
+;extension=exif ; Must be after mbstring as it depends on it
+;extension=mysqli
+;extension=oci8_12c ; Use with Oracle Database 12c Instant Client
+;extension=odbc
+;extension=openssl
+;extension=pdo_firebird
+;extension=pdo_mysql
+;extension=pdo_oci
+;extension=pdo_odbc
+;extension=pdo_pgsql
+;extension=pdo_sqlite
+;extension=pgsql
+;extension=shmop
+
+; The MIBS data available in the PHP distribution must be installed.
+; See http://www.php.net/manual/en/snmp.installation.php
+;extension=snmp
+
+;extension=soap
+;extension=sockets
+;extension=sodium
+;extension=sqlite3
+;extension=tidy
+;extension=xmlrpc
+;extension=xsl
+
+;;;;;;;;;;;;;;;;;;;
+; Module Settings ;
+;;;;;;;;;;;;;;;;;;;
+
+[CLI Server]
+; Whether the CLI web server uses ANSI color coding in its terminal output.
+cli_server.color = On
+
+[Date]
+; Defines the default timezone used by the date functions
+; http://php.net/date.timezone
+;date.timezone =
+
+; http://php.net/date.default-latitude
+;date.default_latitude = 31.7667
+
+; http://php.net/date.default-longitude
+;date.default_longitude = 35.2333
+
+; http://php.net/date.sunrise-zenith
+;date.sunrise_zenith = 90.583333
+
+; http://php.net/date.sunset-zenith
+;date.sunset_zenith = 90.583333
+
+[filter]
+; http://php.net/filter.default
+;filter.default = unsafe_raw
+
+; http://php.net/filter.default-flags
+;filter.default_flags =
+
+[iconv]
+; Use of this INI entry is deprecated, use global input_encoding instead.
+; If empty, default_charset or input_encoding or iconv.input_encoding is used.
+; The precedence is: default_charset < input_encoding < iconv.input_encoding
+;iconv.input_encoding =
+
+; Use of this INI entry is deprecated, use global internal_encoding instead.
+; If empty, default_charset or internal_encoding or iconv.internal_encoding is used.
+; The precedence is: default_charset < internal_encoding < iconv.internal_encoding
+;iconv.internal_encoding =
+
+; Use of this INI entry is deprecated, use global output_encoding instead.
+; If empty, default_charset or output_encoding or iconv.output_encoding is used.
+; The precedence is: default_charset < output_encoding < iconv.output_encoding
+; To use an output encoding conversion, iconv's output handler must be set
+; otherwise output encoding conversion cannot be performed.
+;iconv.output_encoding =
+
+[intl]
+;intl.default_locale =
+; This directive allows you to produce PHP errors when some error
+; happens within intl functions. The value is the level of the error produced.
+; Default is 0, which does not produce any errors.
+;intl.error_level = E_WARNING
+;intl.use_exceptions = 0
+
+[sqlite3]
+;sqlite3.extension_dir =
+
+[Pcre]
+; PCRE library backtracking limit.
+; http://php.net/pcre.backtrack-limit
+;pcre.backtrack_limit=100000
+
+; PCRE library recursion limit.
+; Please note that if you set this value to a high number you may consume all
+; the available process stack and eventually crash PHP (due to reaching the
+; stack size limit imposed by the Operating System).
+; http://php.net/pcre.recursion-limit
+;pcre.recursion_limit=100000
+
+; Enables or disables JIT compilation of patterns. This requires the PCRE
+; library to be compiled with JIT support.
+;pcre.jit=1
+
+[Pdo]
+; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off"
+; http://php.net/pdo-odbc.connection-pooling
+;pdo_odbc.connection_pooling=strict
+
+;pdo_odbc.db2_instance_name
+
+[Pdo_mysql]
+; Default socket name for local MySQL connects. If empty, uses the built-in
+; MySQL defaults.
+pdo_mysql.default_socket=
+
+[Phar]
+; http://php.net/phar.readonly
+;phar.readonly = On
+
+; http://php.net/phar.require-hash
+;phar.require_hash = On
+
+;phar.cache_list =
+
+[mail function]
+; For Win32 only.
+; http://php.net/smtp
+SMTP = localhost
+; http://php.net/smtp-port
+smtp_port = 25
+
+; For Win32 only.
+; http://php.net/sendmail-from
+;sendmail_from = me@example.com
+
+; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
+; http://php.net/sendmail-path
+;sendmail_path =
+
+; Force the addition of the specified parameters to be passed as extra parameters
+; to the sendmail binary. These parameters will always replace the value of
+; the 5th parameter to mail().
+;mail.force_extra_parameters =
+
+; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
+mail.add_x_header = Off
+
+; The path to a log file that will log all mail() calls. Log entries include
+; the full path of the script, line number, To address and headers.
+;mail.log =
+; Log mail to syslog (Event Log on Windows).
+;mail.log = syslog
+
+[ODBC]
+; http://php.net/odbc.default-db
+;odbc.default_db = Not yet implemented
+
+; http://php.net/odbc.default-user
+;odbc.default_user = Not yet implemented
+
+; http://php.net/odbc.default-pw
+;odbc.default_pw = Not yet implemented
+
+; Controls the ODBC cursor model.
+; Default: SQL_CURSOR_STATIC (default).
+;odbc.default_cursortype
+
+; Allow or prevent persistent links.
+; http://php.net/odbc.allow-persistent
+odbc.allow_persistent = On
+
+; Check that a connection is still valid before reuse.
+; http://php.net/odbc.check-persistent
+odbc.check_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+; http://php.net/odbc.max-persistent
+odbc.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+; http://php.net/odbc.max-links
+odbc.max_links = -1
+
+; Handling of LONG fields. Returns number of bytes to variables. 0 means
+; passthru.
+; http://php.net/odbc.defaultlrl
+odbc.defaultlrl = 4096
+
+; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
+; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
+; of odbc.defaultlrl and odbc.defaultbinmode
+; http://php.net/odbc.defaultbinmode
+odbc.defaultbinmode = 1
+
+[Interbase]
+; Allow or prevent persistent links.
+ibase.allow_persistent = 1
+
+; Maximum number of persistent links. -1 means no limit.
+ibase.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+ibase.max_links = -1
+
+; Default database name for ibase_connect().
+;ibase.default_db =
+
+; Default username for ibase_connect().
+;ibase.default_user =
+
+; Default password for ibase_connect().
+;ibase.default_password =
+
+; Default charset for ibase_connect().
+;ibase.default_charset =
+
+; Default timestamp format.
+ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
+
+; Default date format.
+ibase.dateformat = "%Y-%m-%d"
+
+; Default time format.
+ibase.timeformat = "%H:%M:%S"
+
+[MySQLi]
+
+; Maximum number of persistent links. -1 means no limit.
+; http://php.net/mysqli.max-persistent
+mysqli.max_persistent = -1
+
+; Allow accessing, from PHP's perspective, local files with LOAD DATA statements
+; http://php.net/mysqli.allow_local_infile
+;mysqli.allow_local_infile = On
+
+; Allow or prevent persistent links.
+; http://php.net/mysqli.allow-persistent
+mysqli.allow_persistent = On
+
+; Maximum number of links. -1 means no limit.
+; http://php.net/mysqli.max-links
+mysqli.max_links = -1
+
+; Default port number for mysqli_connect(). If unset, mysqli_connect() will use
+; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
+; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
+; at MYSQL_PORT.
+; http://php.net/mysqli.default-port
+mysqli.default_port = 3306
+
+; Default socket name for local MySQL connects. If empty, uses the built-in
+; MySQL defaults.
+; http://php.net/mysqli.default-socket
+mysqli.default_socket =
+
+; Default host for mysql_connect() (doesn't apply in safe mode).
+; http://php.net/mysqli.default-host
+mysqli.default_host =
+
+; Default user for mysql_connect() (doesn't apply in safe mode).
+; http://php.net/mysqli.default-user
+mysqli.default_user =
+
+; Default password for mysqli_connect() (doesn't apply in safe mode).
+; Note that this is generally a *bad* idea to store passwords in this file.
+; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw")
+; and reveal this password! And of course, any users with read access to this
+; file will be able to reveal the password as well.
+; http://php.net/mysqli.default-pw
+mysqli.default_pw =
+
+; Allow or prevent reconnect
+mysqli.reconnect = Off
+
+[mysqlnd]
+; Enable / Disable collection of general statistics by mysqlnd which can be
+; used to tune and monitor MySQL operations.
+mysqlnd.collect_statistics = On
+
+; Enable / Disable collection of memory usage statistics by mysqlnd which can be
+; used to tune and monitor MySQL operations.
+mysqlnd.collect_memory_statistics = On
+
+; Records communication from all extensions using mysqlnd to the specified log
+; file.
+; http://php.net/mysqlnd.debug
+;mysqlnd.debug =
+
+; Defines which queries will be logged.
+;mysqlnd.log_mask = 0
+
+; Default size of the mysqlnd memory pool, which is used by result sets.
+;mysqlnd.mempool_default_size = 16000
+
+; Size of a pre-allocated buffer used when sending commands to MySQL in bytes.
+;mysqlnd.net_cmd_buffer_size = 2048
+
+; Size of a pre-allocated buffer used for reading data sent by the server in
+; bytes.
+;mysqlnd.net_read_buffer_size = 32768
+
+; Timeout for network requests in seconds.
+;mysqlnd.net_read_timeout = 31536000
+
+; SHA-256 Authentication Plugin related. File with the MySQL server public RSA
+; key.
+;mysqlnd.sha256_server_public_key =
+
+[OCI8]
+
+; Connection: Enables privileged connections using external
+; credentials (OCI_SYSOPER, OCI_SYSDBA)
+; http://php.net/oci8.privileged-connect
+;oci8.privileged_connect = Off
+
+; Connection: The maximum number of persistent OCI8 connections per
+; process. Using -1 means no limit.
+; http://php.net/oci8.max-persistent
+;oci8.max_persistent = -1
+
+; Connection: The maximum number of seconds a process is allowed to
+; maintain an idle persistent connection. Using -1 means idle
+; persistent connections will be maintained forever.
+; http://php.net/oci8.persistent-timeout
+;oci8.persistent_timeout = -1
+
+; Connection: The number of seconds that must pass before issuing a
+; ping during oci_pconnect() to check the connection validity. When
+; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
+; pings completely.
+; http://php.net/oci8.ping-interval
+;oci8.ping_interval = 60
+
+; Connection: Set this to a user chosen connection class to be used
+; for all pooled server requests with Oracle 11g Database Resident
+; Connection Pooling (DRCP). To use DRCP, this value should be set to
+; the same string for all web servers running the same application,
+; the database pool must be configured, and the connection string must
+; specify to use a pooled server.
+;oci8.connection_class =
+
+; High Availability: Using On lets PHP receive Fast Application
+; Notification (FAN) events generated when a database node fails. The
+; database must also be configured to post FAN events.
+;oci8.events = Off
+
+; Tuning: This option enables statement caching, and specifies how
+; many statements to cache. Using 0 disables statement caching.
+; http://php.net/oci8.statement-cache-size
+;oci8.statement_cache_size = 20
+
+; Tuning: Enables statement prefetching and sets the default number of
+; rows that will be fetched automatically after statement execution.
+; http://php.net/oci8.default-prefetch
+;oci8.default_prefetch = 100
+
+; Compatibility. Using On means oci_close() will not close
+; oci_connect() and oci_new_connect() connections.
+; http://php.net/oci8.old-oci-close-semantics
+;oci8.old_oci_close_semantics = Off
+
+[PostgreSQL]
+; Allow or prevent persistent links.
+; http://php.net/pgsql.allow-persistent
+pgsql.allow_persistent = On
+
+; Detect broken persistent links always with pg_pconnect().
+; Auto reset feature requires a little overheads.
+; http://php.net/pgsql.auto-reset-persistent
+pgsql.auto_reset_persistent = Off
+
+; Maximum number of persistent links. -1 means no limit.
+; http://php.net/pgsql.max-persistent
+pgsql.max_persistent = -1
+
+; Maximum number of links (persistent+non persistent). -1 means no limit.
+; http://php.net/pgsql.max-links
+pgsql.max_links = -1
+
+; Ignore PostgreSQL backends Notice message or not.
+; Notice message logging require a little overheads.
+; http://php.net/pgsql.ignore-notice
+pgsql.ignore_notice = 0
+
+; Log PostgreSQL backends Notice message or not.
+; Unless pgsql.ignore_notice=0, module cannot log notice message.
+; http://php.net/pgsql.log-notice
+pgsql.log_notice = 0
+
+[bcmath]
+; Number of decimal digits for all bcmath functions.
+; http://php.net/bcmath.scale
+bcmath.scale = 0
+
+[browscap]
+; http://php.net/browscap
+;browscap = extra/browscap.ini
+
+[Session]
+; Handler used to store/retrieve data.
+; http://php.net/session.save-handler
+session.save_handler = files
+
+; Argument passed to save_handler. In the case of files, this is the path
+; where data files are stored. Note: Windows users have to change this
+; variable in order to use PHP's session functions.
+;
+; The path can be defined as:
+;
+; session.save_path = "N;/path"
+;
+; where N is an integer. Instead of storing all the session files in
+; /path, what this will do is use subdirectories N-levels deep, and
+; store the session data in those directories. This is useful if
+; your OS has problems with many files in one directory, and is
+; a more efficient layout for servers that handle many sessions.
+;
+; NOTE 1: PHP will not create this directory structure automatically.
+; You can use the script in the ext/session dir for that purpose.
+; NOTE 2: See the section on garbage collection below if you choose to
+; use subdirectories for session storage
+;
+; The file storage module creates files using mode 600 by default.
+; You can change that by using
+;
+; session.save_path = "N;MODE;/path"
+;
+; where MODE is the octal representation of the mode. Note that this
+; does not overwrite the process's umask.
+; http://php.net/session.save-path
+;session.save_path = "/tmp"
+
+; Whether to use strict session mode.
+; Strict session mode does not accept an uninitialized session ID, and
+; regenerates the session ID if the browser sends an uninitialized session ID.
+; Strict mode protects applications from session fixation via a session adoption
+; vulnerability. It is disabled by default for maximum compatibility, but
+; enabling it is encouraged.
+; https://wiki.php.net/rfc/strict_sessions
+session.use_strict_mode = 0
+
+; Whether to use cookies.
+; http://php.net/session.use-cookies
+session.use_cookies = 1
+
+; http://php.net/session.cookie-secure
+;session.cookie_secure =
+
+; This option forces PHP to fetch and use a cookie for storing and maintaining
+; the session id. We encourage this operation as it's very helpful in combating
+; session hijacking when not specifying and managing your own session id. It is
+; not the be-all and end-all of session hijacking defense, but it's a good start.
+; http://php.net/session.use-only-cookies
+session.use_only_cookies = 1
+
+; Name of the session (used as cookie name).
+; http://php.net/session.name
+session.name = PHPSESSID
+
+; Initialize session on request startup.
+; http://php.net/session.auto-start
+session.auto_start = 0
+
+; Lifetime in seconds of cookie or, if 0, until browser is restarted.
+; http://php.net/session.cookie-lifetime
+session.cookie_lifetime = 0
+
+; The path for which the cookie is valid.
+; http://php.net/session.cookie-path
+session.cookie_path = /
+
+; The domain for which the cookie is valid.
+; http://php.net/session.cookie-domain
+session.cookie_domain =
+
+; Whether or not to add the httpOnly flag to the cookie, which makes it
+; inaccessible to browser scripting languages such as JavaScript.
+; http://php.net/session.cookie-httponly
+session.cookie_httponly =
+
+; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
+; Current valid values are "Lax" or "Strict"
+; https://tools.ietf.org/html/draft-west-first-party-cookies-07
+session.cookie_samesite =
+
+; Handler used to serialize data. php is the standard serializer of PHP.
+; http://php.net/session.serialize-handler
+session.serialize_handler = php
+
+; Defines the probability that the 'garbage collection' process is started
+; on every session initialization. The probability is calculated by using
+; gc_probability/gc_divisor. Where session.gc_probability is the numerator
+; and gc_divisor is the denominator in the equation. Setting this value to 1
+; when the session.gc_divisor value is 100 will give you approximately a 1% chance
+; the gc will run on any given request.
+; Default Value: 1
+; Development Value: 1
+; Production Value: 1
+; http://php.net/session.gc-probability
+session.gc_probability = 1
+
+; Defines the probability that the 'garbage collection' process is started on every
+; session initialization. The probability is calculated by using the following equation:
+; gc_probability/gc_divisor. Where session.gc_probability is the numerator and
+; session.gc_divisor is the denominator in the equation. Setting this value to 100
+; when the session.gc_probability value is 1 will give you approximately a 1% chance
+; the gc will run on any given request. Increasing this value to 1000 will give you
+; a 0.1% chance the gc will run on any given request. For high volume production servers,
+; this is a more efficient approach.
+; Default Value: 100
+; Development Value: 1000
+; Production Value: 1000
+; http://php.net/session.gc-divisor
+session.gc_divisor = 1000
+
+; After this number of seconds, stored data will be seen as 'garbage' and
+; cleaned up by the garbage collection process.
+; http://php.net/session.gc-maxlifetime
+session.gc_maxlifetime = 1440
+
+; NOTE: If you are using the subdirectory option for storing session files
+; (see session.save_path above), then garbage collection does *not*
+; happen automatically. You will need to do your own garbage
+; collection through a shell script, cron entry, or some other method.
+; For example, the following script would is the equivalent of
+; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
+; find /path/to/sessions -cmin +24 -type f | xargs rm
+
+; Check HTTP Referer to invalidate externally stored URLs containing ids.
+; HTTP_REFERER has to contain this substring for the session to be
+; considered as valid.
+; http://php.net/session.referer-check
+session.referer_check =
+
+; Set to {nocache,private,public,} to determine HTTP caching aspects
+; or leave this empty to avoid sending anti-caching headers.
+; http://php.net/session.cache-limiter
+session.cache_limiter = nocache
+
+; Document expires after n minutes.
+; http://php.net/session.cache-expire
+session.cache_expire = 180
+
+; trans sid support is disabled by default.
+; Use of trans sid may risk your users' security.
+; Use this option with caution.
+; - User may send URL contains active session ID
+; to other person via. email/irc/etc.
+; - URL that contains active session ID may be stored
+; in publicly accessible computer.
+; - User may access your site with the same session ID
+; always using URL stored in browser's history or bookmarks.
+; http://php.net/session.use-trans-sid
+session.use_trans_sid = 0
+
+; Set session ID character length. This value could be between 22 to 256.
+; Shorter length than default is supported only for compatibility reason.
+; Users should use 32 or more chars.
+; http://php.net/session.sid-length
+; Default Value: 32
+; Development Value: 26
+; Production Value: 26
+session.sid_length = 26
+
+; The URL rewriter will look for URLs in a defined set of HTML tags.
+;