diff --git a/.env b/.env index a6a7bac..86bc291 100644 --- a/.env +++ b/.env @@ -1,27 +1,35 @@ # Reverse proxy -NGINX_IMAGE=nginx:stable-alpine +NGINX_IMAGE=nginx:stable-alpine3.23 -# Backend + Frontend +# Backend APP_IMAGE=fullstack-symfony-react-dev:0.9.1 APP_NAME=fullstack-symfony-react APP_VERSION=0.9.1 APP_ENV=dev -NODE_IMAGE=node:23-alpine ADMIN_EMAIL=admin@example.com ADMIN_PASSWORD=secret +# Frontend +NODE_IMAGE=node:25.2-alpine + # DB -MYSQL_IMAGE=mysql:8 -ADMINER_IMAGE=adminer +MYSQL_IMAGE=mysql:8.4 +ADMINER_IMAGE=adminer:5.4.2 # Cache REDIS_IMAGE=redis:7.2-alpine -REDIS_INSIGHTS_IMAGE=redis/redisinsight:latest +REDIS_INSIGHTS_IMAGE=redis/redisinsight:3.2 # Telemetry LGTM (all-in-one: OTel Collector + Grafana + Loki + Tempo + Prometheus) -OTEL_LGTM_IMAGE=grafana/otel-lgtm:0.8.1 +OTEL_LGTM_IMAGE=grafana/otel-lgtm:0.21.0 # RabbitMQ -RABBITMQ_IMAGE=rabbitmq:latest +RABBITMQ_IMAGE=rabbitmq:4.2.5 RABBITMQ_USER=guest -RABBITMQ_PASSWORD=guest \ No newline at end of file +RABBITMQ_PASSWORD=guest + +# Documentation +MK_DOCS_IMAGE=squidfunk/mkdocs-material:9.7 + +# Dashboard +DASHBOARD_IMAGE=b4bz/homer:v25.11.1 \ No newline at end of file diff --git a/.github/workflows/app-ci.yaml b/.github/workflows/app-ci.yaml index a994ab9..4638895 100644 --- a/.github/workflows/app-ci.yaml +++ b/.github/workflows/app-ci.yaml @@ -59,7 +59,7 @@ jobs: strategy: matrix: - node-version: ['v23.11'] + node-version: ['v25.8'] steps: - uses: actions/checkout@v4 diff --git a/Makefile b/Makefile index 2c47862..8303581 100644 --- a/Makefile +++ b/Makefile @@ -7,25 +7,27 @@ VERSION = 0.9.1 reset-worker reset-app init composer-install create-database create-schema \ load-fixtures init-test create-test-database create-test-schema composer shell \ qa sa cs test backend-test frontend-test arch clear cache-clear cache-pool-clear \ - build-viz svg build-dot build-svg circle maintenance maintain show-composer-updates \ + maintenance maintain show-composer-updates \ update-composer-dependencies update-npm-dependencies coverage frontend-shell open help ## Start development environment (build images, start containers, init, open browser) start: dev grafana up init open -## Build development Docker image +build: dev prod + +## Build development Docker image (with Docker cache) dev: docker build . -f ./build/php/Dockerfile --target dev -t ${APP_NAME}-dev:${VERSION} -## Build production images +## Build production images (without Docker cache) prod: backend-image frontend-image -## Build backend image +## Build backend image (without Docker cache) backend-image: @echo "Build backend image" docker build . -f ./build/php/Dockerfile --target prod --no-cache -t ${APP_NAME}:${VERSION} -## Build frontend image +## Build frontend image (without Docker cache) frontend-image: @echo "Build frontend image" docker build . -f ./build/node/Dockerfile --target prod --no-cache -t ${APP_NAME}-web:${VERSION} diff --git a/build/grafana/Dockerfile b/build/grafana/Dockerfile index b2a29d4..c965146 100644 --- a/build/grafana/Dockerfile +++ b/build/grafana/Dockerfile @@ -1,4 +1,4 @@ -FROM grafana/grafana:latest +FROM grafana/grafana:12.4 COPY grafana/ /etc/grafana/provisioning diff --git a/build/graphviz/Dockerfile b/build/graphviz/Dockerfile deleted file mode 100644 index e22f3c7..0000000 --- a/build/graphviz/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM php:8.4-fpm - -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - graphviz - -WORKDIR /var/www/project diff --git a/build/node/Dockerfile b/build/node/Dockerfile index 726e66d..9e7de24 100644 --- a/build/node/Dockerfile +++ b/build/node/Dockerfile @@ -1,5 +1,5 @@ # Build-Stage -FROM node:23-alpine AS build +FROM node:25.2-alpine AS build WORKDIR /app @@ -24,7 +24,7 @@ COPY frontend/vitest.config.ts . RUN npm run build # Produktions-Stage -FROM node:23-alpine AS prod +FROM node:25.2-alpine AS prod WORKDIR /app diff --git a/dashboard/assets/config.yml b/dashboard/assets/config.yml index 291efa7..58ba1b4 100644 --- a/dashboard/assets/config.yml +++ b/dashboard/assets/config.yml @@ -56,7 +56,7 @@ services: - name: "Source code" subtitle: "Github" icon: "fa-brands fa-github" - url: "https://github.com/makomweb/fullstack-demo" + url: "https://github.com/makomweb/fullstack-symfony-react" target: "_blank" - name: "Architecture Documentation" subtitle: "MKDocs" diff --git a/docker-compose.yaml b/docker-compose.yaml index f631076..f50fdc3 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -185,7 +185,7 @@ services: # documentation mkdocs: - image: squidfunk/mkdocs-material + image: ${MK_DOCS_IMAGE} ports: - "8005:8000" volumes: @@ -197,7 +197,7 @@ services: # developer dashboard dashboard: - image: b4bz/homer:latest + image: ${DASHBOARD_IMAGE} volumes: - ./dashboard/assets:/www/assets - ./backend/report:/www/public/report diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e023e69..693b369 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -131,6 +131,7 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -563,6 +564,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -586,6 +588,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -648,6 +651,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -691,6 +695,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -1608,6 +1613,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.5.0.tgz", "integrity": "sha512-yjvtXoFcrPLGtgKRxFaH6OQPtcLPhkloC0BML6rBG5UeldR0nPULR/2E2BfXdo5JNV7j7lOzrrLX2Qf/iSidow==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.5.0", @@ -1802,6 +1808,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -3116,8 +3123,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -3229,6 +3235,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3239,6 +3246,7 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -3293,6 +3301,7 @@ "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/types": "8.56.1", @@ -3666,6 +3675,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4047,6 +4057,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4636,6 +4647,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -4902,8 +4914,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -5199,6 +5210,7 @@ "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6763,6 +6775,7 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -6942,7 +6955,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -7405,6 +7417,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7442,6 +7455,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -7490,7 +7504,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -7506,7 +7519,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -7519,8 +7531,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/prop-types": { "version": "15.8.1", @@ -7578,6 +7589,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7587,6 +7599,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -8656,6 +8669,7 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8791,6 +8805,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -8889,6 +8904,7 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4",