diff --git a/.docker/data/.gitignore b/.docker/data/.gitignore index 80a9dc9..4ce1020 100644 --- a/.docker/data/.gitignore +++ b/.docker/data/.gitignore @@ -1,5 +1,5 @@ # Ignore everything in this directory * -# Except this file +# Except !.gitignore -!Readme.md +!README.md diff --git a/.docker/nginx.conf b/.docker/nginx.conf index 8fe03db..ec278a5 100644 --- a/.docker/nginx.conf +++ b/.docker/nginx.conf @@ -17,9 +17,7 @@ http { include /etc/nginx/mime.types; default_type application/octet-stream; - set_real_ip_from 172.16.0.0/16; - real_ip_recursive on; - real_ip_header X-Forwarded-For; + # Note: set_real_ip_from is set in the server block log_format main '$http_x_real_ip - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' diff --git a/.docker/templates/default.conf.template b/.docker/templates/default.conf.template index 36f49cb..69b9694 100644 --- a/.docker/templates/default.conf.template +++ b/.docker/templates/default.conf.template @@ -6,17 +6,24 @@ server { client_max_body_size ${NGINX_MAX_BODY_SIZE}; - # This also needs to be set in the single server tag and not only in http. set_real_ip_from 172.16.0.0/16; + set_real_ip_from 192.168.39.0/24; real_ip_recursive on; real_ip_header X-Forwarded-For; - location / { - # We are co-hosting with the legacy EventDB, so this app is hosted under '/api/v2/' (.env::APP_PATH_PREFIX) - # This is configured for Symfony in both 'api_platform.prefix' and 'framework.assets.base_path'. However - # Symfony still installs assets in the root path so we need to rewrite the uri to remove '/api/v2/'. - rewrite ^${APP_PATH_PREFIX}/(.*) /$1 break; + location = /cron-metrics { + # Proxy to supercronic metrics + proxy_pass http://${NGINX_CRON_METRICS}/metrics; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + # Project-specific server config (.docker/templates/server.d/*.conf.template). + include /etc/nginx/conf.d/server.d/*.conf; + + location / { # try to serve file directly, fallback to index.php try_files $uri /index.php$is_args$args; } diff --git a/.docker/templates/server.d/app-path-prefix.conf.template b/.docker/templates/server.d/app-path-prefix.conf.template new file mode 100644 index 0000000..97f4641 --- /dev/null +++ b/.docker/templates/server.d/app-path-prefix.conf.template @@ -0,0 +1,4 @@ +# This app shares the domain with event-database-imports, so this app is served under '/api/v2/' (.env::APP_PATH_PREFIX). +# This is configured for Symfony in both 'api_platform.prefix' and 'framework.assets.base_path'. However +# Symfony still installs assets in the root path so we need to rewrite the uri to remove '/api/v2/'. +rewrite ^${APP_PATH_PREFIX}/(.*) /$1 break; diff --git a/.github/workflows/api-spec.yml b/.github/workflows/api-spec.yml index 7dd51eb..b53a1d8 100644 --- a/.github/workflows/api-spec.yml +++ b/.github/workflows/api-spec.yml @@ -31,8 +31,8 @@ jobs: uses: actions/cache@v5 with: path: vendor - key: vendor-php8.4-${{ hashFiles('composer.lock') }} - restore-keys: vendor-php8.4- + key: vendor-php8.5-${{ hashFiles('composer.lock') }} + restore-keys: vendor-php8.5- - name: Install dependencies run: | diff --git a/.github/workflows/changelog.yaml b/.github/workflows/changelog.yaml index 71da908..54b9acb 100644 --- a/.github/workflows/changelog.yaml +++ b/.github/workflows/changelog.yaml @@ -14,8 +14,6 @@ on: jobs: changelog: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - name: Checkout uses: actions/checkout@v7 @@ -26,4 +24,6 @@ jobs: run: git fetch - name: Check that changelog has been updated. - run: git diff --exit-code origin/${{ github.base_ref }} -- CHANGELOG.md && exit 1 || exit 0 + env: + BASE_REF: ${{ github.base_ref }} + run: git diff --exit-code "origin/$BASE_REF" -- CHANGELOG.md && exit 1 || exit 0 diff --git a/.github/workflows/composer.yaml b/.github/workflows/composer.yaml index def97d2..b50dadb 100644 --- a/.github/workflows/composer.yaml +++ b/.github/workflows/composer.yaml @@ -26,20 +26,23 @@ name: Composer env: - COMPOSE_USER: root + COMPOSE_USER: runner on: pull_request: + paths: &paths + - "composer.json" + - "composer.lock" + - "docker-compose.yml" push: branches: - main - develop + paths: *paths jobs: composer-validate: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v7 @@ -52,8 +55,6 @@ jobs: composer-normalized: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v7 @@ -67,8 +68,6 @@ jobs: composer-audit: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/markdown.yaml b/.github/workflows/markdown.yaml index b0f74c5..ac0fc21 100644 --- a/.github/workflows/markdown.yaml +++ b/.github/workflows/markdown.yaml @@ -22,16 +22,17 @@ name: Markdown on: pull_request: + paths: &paths + - "**/*.md" push: branches: - main - develop + paths: *paths jobs: markdown-lint: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - name: Checkout uses: actions/checkout@v7 diff --git a/.github/workflows/php.yaml b/.github/workflows/php.yaml index 5188018..6326d8e 100644 --- a/.github/workflows/php.yaml +++ b/.github/workflows/php.yaml @@ -34,14 +34,20 @@ name: Symfony PHP env: - COMPOSE_USER: root + COMPOSE_USER: runner on: pull_request: + paths: &paths + - "**/*.php" + - "composer.json" + - "composer.lock" + - "docker-compose.yml" push: branches: - main - develop + paths: *paths jobs: coding-standards: diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index b83d147..b43bd59 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -17,8 +17,8 @@ jobs: uses: actions/cache@v5 with: path: vendor - key: vendor-php8.4-${{ hashFiles('composer.lock') }} - restore-keys: vendor-php8.4- + key: vendor-php8.5-${{ hashFiles('composer.lock') }} + restore-keys: vendor-php8.5- - name: Start docker compose setup and install site run: | @@ -57,8 +57,8 @@ jobs: uses: actions/cache@v5 with: path: vendor - key: vendor-php8.4-${{ hashFiles('composer.lock') }} - restore-keys: vendor-php8.4- + key: vendor-php8.5-${{ hashFiles('composer.lock') }} + restore-keys: vendor-php8.5- - name: Install dependencies run: | @@ -81,8 +81,8 @@ jobs: uses: actions/cache@v5 with: path: vendor - key: vendor-php8.4-${{ hashFiles('composer.lock') }} - restore-keys: vendor-php8.4- + key: vendor-php8.5-${{ hashFiles('composer.lock') }} + restore-keys: vendor-php8.5- - name: Install dependencies run: | diff --git a/.github/workflows/twig.yaml b/.github/workflows/twig.yaml index 047d881..ffb7055 100644 --- a/.github/workflows/twig.yaml +++ b/.github/workflows/twig.yaml @@ -24,20 +24,24 @@ name: Twig env: - COMPOSE_USER: root + COMPOSE_USER: runner on: pull_request: + paths: &paths + - "**/*.twig" + - "composer.json" + - "composer.lock" + - "docker-compose.yml" push: branches: - main - develop + paths: *paths jobs: twig-lint: runs-on: ubuntu-latest - strategy: - fail-fast: false steps: - name: Checkout uses: actions/checkout@v7 diff --git a/.github/workflows/yaml.yaml b/.github/workflows/yaml.yaml index 80d0a23..c54cf8e 100644 --- a/.github/workflows/yaml.yaml +++ b/.github/workflows/yaml.yaml @@ -22,10 +22,14 @@ name: YAML on: pull_request: + paths: &paths + - "**/*.yml" + - "**/*.yaml" push: branches: - main - develop + paths: *paths jobs: yaml-lint: @@ -38,4 +42,4 @@ jobs: docker network create frontend - run: | - docker compose run --rm prettier '**/*.{yml,yaml}' --check + docker compose run --rm prettier --no-editorconfig '**/*.{yml,yaml}' --check diff --git a/.markdownlintignore b/.markdownlintignore index d143ace..14323f9 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -5,6 +5,8 @@ vendor/ node_modules/ LICENSE.md +# Python +.venv/ # Drupal web/*.md web/core/ diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index e9d23a8..18f6586 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -1,4 +1,5 @@ setFinder($finder); $config->setRules([ - '@Symfony' => true, - 'phpdoc_align' => false, + '@Symfony' => true, + 'phpdoc_align' => false, ]); return $config; diff --git a/.prettierrc.yaml b/.prettierrc.yaml index 12e0898..b1d7be1 100644 --- a/.prettierrc.yaml +++ b/.prettierrc.yaml @@ -3,6 +3,13 @@ # https://prettier.io/docs/configuration overrides: + # https://taskfile.dev/docs/styleguide + - files: + - "Taskfile.{yml,yaml}" + options: + tabWidth: 2 + singleQuote: true + # Symfony config - files: - "config/**/*.{yml,yaml}" diff --git a/CHANGELOG.md b/CHANGELOG.md index a5462b0..6e3212f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ See [keep a changelog] for information about writing changes to this log. ## [Unreleased] +- [PR-70](https://github.com/itk-dev/event-database-api/pull/70) + Update the docker compose template (itk-version 3.2.4) and the PHP 8.5 image + ## [1.3.0] - 2026-11-04 - [PR-62](https://github.com/itk-dev/event-database-api/pull/62) diff --git a/CLAUDE.md b/CLAUDE.md index d94f409..26679fd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,7 +11,7 @@ API platform front-end for the Danish event database used by the municipality of `migrations/` and `src/Entity/` directories are empty). Stack: PHP 8.3+, Symfony 7.4, API Platform 4.3, Elasticsearch 8.x. Runs entirely in Docker via -`itkdev/php8.4-fpm` + nginx. +`itkdev/php8.5-fpm` + nginx. ## Common commands diff --git a/Taskfile.yml b/Taskfile.yml index b63cd08..b437714 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,9 +1,9 @@ # https://taskfile.dev -version: "3" +version: '3' # https://taskfile.dev/usage/#env-files -dotenv: [".env.local", ".env"] +dotenv: ['.env.local', '.env'] vars: # https://taskfile.dev/reference/templating/ @@ -57,20 +57,20 @@ tasks: COMPOSE_ARGS: exec phpfpm bin/console app:fixtures:load {{.ITEM}} --url=file:///app/tests/resources/{{.ITEM}}.json composer: - desc: "Run `composer` command. Example: task composer -- normalize" + desc: 'Run `composer` command. Example: task composer -- normalize' cmds: - task: compose vars: COMPOSE_ARGS: exec phpfpm composer {{.COMPOSER_ARGS}} compose: - desc: "Run `docker compose` command. Example: task compose -- ps" + desc: 'Run `docker compose` command. Example: task compose -- ps' cmds: # Run docker compose with both arguments passed via var plus any cli args. - - "{{.DOCKER_COMPOSE}} {{.COMPOSE_ARGS}} {{.CLI_ARGS}}" + - '{{.DOCKER_COMPOSE}} {{.COMPOSE_ARGS}} {{.CLI_ARGS}}' console: - desc: "Run Symfony console command. Example: task console -- cache:clear" + desc: 'Run Symfony console command. Example: task console -- cache:clear' cmds: # Run docker compose with both arguments passed via var plus any cli args. - task: compose @@ -78,7 +78,7 @@ tasks: COMPOSE_ARGS: exec phpfpm bin/console {{.CONSOLE_ARGS}} coding-standards:apply: - desc: "Apply coding standards" + desc: 'Apply coding standards' cmds: - task: coding-standards:markdown:apply - task: coding-standards:php:apply @@ -87,7 +87,7 @@ tasks: silent: true coding-standards:check: - desc: "Apply coding standards" + desc: 'Apply coding standards' cmds: - task: coding-standards:markdown:check - task: coding-standards:php:check @@ -96,14 +96,14 @@ tasks: silent: true coding-standards:markdown:apply: - desc: "Apply coding standards for Markdown" + desc: 'Apply coding standards for Markdown' cmds: - task: compose vars: COMPOSE_ARGS: run --rm markdownlint markdownlint '**/*.md' --fix coding-standards:markdown:check: - desc: "Apply and check coding standards for Markdown" + desc: 'Apply and check coding standards for Markdown' cmds: - task: coding-standards:markdown:apply - task: compose @@ -111,7 +111,7 @@ tasks: COMPOSE_ARGS: run --rm markdownlint markdownlint '**/*.md' coding-standards:php:apply: - desc: "Apply coding standards for PHP" + desc: 'Apply coding standards for PHP' cmds: - task: compose vars: @@ -119,7 +119,7 @@ tasks: silent: true coding-standards:php:check: - desc: "Apply and check coding standards for PHP" + desc: 'Apply and check coding standards for PHP' cmds: - task: coding-standards:php:apply - task: compose @@ -128,7 +128,7 @@ tasks: silent: true coding-standards:twig:apply: - desc: "Apply coding standards for Twig" + desc: 'Apply coding standards for Twig' cmds: - task: compose vars: @@ -136,7 +136,7 @@ tasks: silent: true coding-standards:twig:check: - desc: "Apply and check coding standards for Twig" + desc: 'Apply and check coding standards for Twig' cmds: - task: coding-standards:twig:apply - task: compose @@ -145,7 +145,7 @@ tasks: silent: true coding-standards:yaml:apply: - desc: "Apply coding standards for YAML" + desc: 'Apply coding standards for YAML' cmds: - task: compose vars: @@ -153,7 +153,7 @@ tasks: silent: true coding-standards:yaml:check: - desc: "Apply and check coding standards for YAML" + desc: 'Apply and check coding standards for YAML' cmds: - task: coding-standards:yaml:apply - task: compose @@ -162,14 +162,14 @@ tasks: silent: true code-analysis: - desc: "Run code analysis" + desc: 'Run code analysis' cmds: - task: code-analysis:phpstan - task: code-analysis:rector silent: true code-analysis:phpstan: - desc: "Run PHPStan" + desc: 'Run PHPStan' cmds: - task: compose vars: @@ -177,7 +177,7 @@ tasks: silent: true code-analysis:rector: - desc: "Check for Rector suggestions (dry-run; no changes applied)" + desc: 'Check for Rector suggestions (dry-run; no changes applied)' cmds: - task: compose vars: @@ -185,7 +185,7 @@ tasks: silent: true code-analysis:rector:apply: - desc: "Apply Rector changes" + desc: 'Apply Rector changes' cmds: - task: compose vars: diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index ca2f4d1..71a88b4 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -6,7 +6,7 @@ services: nginx: labels: - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=ITKBasicAuth@file" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.middlewares=ITKBasicAuth@file" mail: image: axllent/mailpit @@ -17,11 +17,11 @@ services: labels: - "traefik.enable=true" - "traefik.docker.network=frontend" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}-http.rule=Host(`mail.${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}-http.entrypoints=web" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}-http.middlewares=redirect-to-https" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}-http.rule=Host(`mail.${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}-http.entrypoints=web" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}-http.middlewares=redirect-to-https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}.rule=Host(`mail.${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}.entrypoints=websecure" - - "traefik.http.services.mail_${COMPOSE_PROJECT_NAME}.loadbalancer.server.port=8025" - - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME}.middlewares=ITKMailhogAuth@file" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}.rule=Host(`mail.${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}.entrypoints=websecure" + - "traefik.http.services.mail_${COMPOSE_PROJECT_NAME:?}.loadbalancer.server.port=8025" + - "traefik.http.routers.mail_${COMPOSE_PROJECT_NAME:?}.middlewares=ITKMailhogAuth@file" diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 898fd23..9928b01 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -1,6 +1,5 @@ services: phpfpm: - image: itkdev/php8.4-fpm:latest networks: - frontend depends_on: diff --git a/docker-compose.redirect.yml b/docker-compose.redirect.yml index e9ba157..2e7ac33 100644 --- a/docker-compose.redirect.yml +++ b/docker-compose.redirect.yml @@ -3,13 +3,13 @@ services: nginx: labels: # Add www before domain and set redirect to non-www - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}-http.rule=Host(`www.${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}-http.entrypoints=web" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}-http.middlewares=redirect-to-https,non_www" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}.rule=Host(`www.${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}.entrypoints=websecure" - - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME}.middlewares=non_www" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}-http.rule=Host(`www.${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}-http.entrypoints=web" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}-http.middlewares=redirect-to-https,non_www" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}.rule=Host(`www.${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}.entrypoints=websecure" + - "traefik.http.routers.www_${COMPOSE_PROJECT_NAME:?}.middlewares=non_www" - traefik.http.middlewares.non_www.redirectregex.regex=^(http|https)?://(?:www\.)?(.+) - - traefik.http.middlewares.non_www.redirectregex.replacement=https://$${2} + - traefik.http.middlewares.non_www.redirectregex.replacement=https://$${2:?} - traefik.http.middlewares.non_www.redirectregex.permanent=true diff --git a/docker-compose.server.override.yml b/docker-compose.server.override.yml index e796748..3211589 100644 --- a/docker-compose.server.override.yml +++ b/docker-compose.server.override.yml @@ -1,6 +1,5 @@ services: phpfpm: - image: itkdev/php8.4-fpm:alpine environment: - PHP_MEMORY_LIMIT=256M @@ -15,3 +14,5 @@ services: - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.priority=200" - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_SERVER_DOMAIN}`) && PathPrefix(`${APP_PATH_PREFIX}`)" - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.priority=200" + # This app has no cron jobs. Let the importer on the same domain serve '/cron-metrics'. + - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-metrics.priority=1" diff --git a/docker-compose.server.yml b/docker-compose.server.yml index dd16da4..19a4e89 100644 --- a/docker-compose.server.yml +++ b/docker-compose.server.yml @@ -8,7 +8,7 @@ networks: services: phpfpm: - image: itkdev/php8.4-fpm:alpine + image: itkdev/php8.5-fpm:alpine restart: unless-stopped networks: - app @@ -33,16 +33,20 @@ services: - ./.docker/nginx.conf:/etc/nginx/nginx.conf:ro - .:/app environment: - NGINX_FPM_SERVICE: ${COMPOSE_PROJECT_NAME}-phpfpm-1:9000 + NGINX_FPM_SERVICE: ${COMPOSE_PROJECT_NAME:?}-phpfpm-1:9000 + NGINX_CRON_METRICS: ${COMPOSE_PROJECT_NAME:?}-phpfpm-1:9746 NGINX_WEB_ROOT: /app/public NGINX_PORT: 8080 NGINX_MAX_BODY_SIZE: 5M labels: - "traefik.enable=true" - "traefik.docker.network=frontend" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.rule=Host(`${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.entrypoints=web" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.middlewares=redirect-to-https" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-http.rule=Host(`${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-http.entrypoints=web" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-http.middlewares=redirect-to-https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_SERVER_DOMAIN}`)" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=websecure" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.rule=Host(`${COMPOSE_SERVER_DOMAIN:?}`)" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.entrypoints=websecure" + # Cron-metrics protection. + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-metrics.rule=Host(`${COMPOSE_SERVER_DOMAIN:?}`) && PathPrefix(`/cron-metrics`) " + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-metrics.middlewares=ITKMetricsAuth@file" diff --git a/docker-compose.yml b/docker-compose.yml index cc88b52..4455116 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,7 +27,7 @@ services: #- ENCRYPT=1 # Uncomment to enable database encryption. phpfpm: - image: itkdev/php8.4-fpm:latest + image: itkdev/php8.5-fpm:latest user: ${COMPOSE_USER:-deploy} networks: - app @@ -39,7 +39,7 @@ services: - PHP_MEMORY_LIMIT=256M # Depending on the setup, you may have to remove --read-envelope-from from msmtp (cf. https://marlam.de/msmtp/msmtp.html) or use SMTP to send mail - PHP_SENDMAIL_PATH=/usr/bin/msmtp --host=mail --port=1025 --read-recipients --read-envelope-from - - DOCKER_HOST_DOMAIN=${COMPOSE_DOMAIN} + - DOCKER_HOST_DOMAIN=${COMPOSE_DOMAIN:?} - PHP_IDE_CONFIG=serverName=localhost depends_on: mariadb: @@ -60,17 +60,21 @@ services: - ./.docker/templates:/etc/nginx/templates:ro - .:/app environment: - NGINX_FPM_SERVICE: ${COMPOSE_PROJECT_NAME}-phpfpm-1:9000 + NGINX_FPM_SERVICE: ${COMPOSE_PROJECT_NAME:?}-phpfpm-1:9000 + NGINX_CRON_METRICS: ${COMPOSE_PROJECT_NAME:?}-phpfpm-1:9746 NGINX_WEB_ROOT: /app/public NGINX_PORT: 8080 NGINX_MAX_BODY_SIZE: 5M labels: - "traefik.enable=true" - "traefik.docker.network=frontend" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_DOMAIN}`)" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.rule=Host(`${COMPOSE_DOMAIN:?}`)" # HTTPS config - uncomment to enable redirect from :80 to :443 - # - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=redirect-to-https" + # - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}.middlewares=redirect-to-https" # - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" + # Cron-metrics protection. + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-metrics.rule=Host(`${COMPOSE_DOMAIN:?}`) && PathPrefix(`/cron-metrics`) " + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}-metrics.middlewares=ITKMetricsAuth@file" mail: image: axllent/mailpit @@ -83,8 +87,8 @@ services: labels: - "traefik.enable=true" - "traefik.docker.network=frontend" - - "traefik.http.routers.${COMPOSE_PROJECT_NAME}mail.rule=Host(`mail-${COMPOSE_DOMAIN}`)" - - "traefik.http.services.${COMPOSE_PROJECT_NAME}mail.loadbalancer.server.port=8025" + - "traefik.http.routers.${COMPOSE_PROJECT_NAME:?}mail.rule=Host(`mail-${COMPOSE_DOMAIN:?}`)" + - "traefik.http.services.${COMPOSE_PROJECT_NAME:?}mail.loadbalancer.server.port=8025" # Code checks tools markdownlint: @@ -95,7 +99,7 @@ services: - ./:/md prettier: - # Prettier does not (yet, fcf. + # Prettier does not (yet, cf. # https://github.com/prettier/prettier/issues/15206) have an official # docker image. # https://hub.docker.com/r/jauderho/prettier is good candidate (cf. https://hub.docker.com/search?q=prettier&sort=updated_at&order=desc)