From 58b61f1e98f47f303d012f90371d4fe503134261 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Sun, 22 Mar 2026 12:30:20 -0600 Subject: [PATCH 1/4] refactor: rename Docker Compose files to avoid V2 precedence conflict (#68) Docker Compose V2 prioritizes compose.yaml over docker-compose.yml, which conflicted with using compose.yaml for Spring Boot's Docker Compose integration (dev-only) and docker-compose.yml for the full stack. - Rename compose.yaml -> compose.dev.yaml (dev dependencies for bootRun) - Rename docker-compose.yml -> compose.yaml (full deployable stack) - Add spring.docker.compose.file=compose.dev.yaml to application-local.yml-example - Update README.md with compose file descriptions and docker compose v2 syntax --- README.md | 15 ++- compose.dev.yaml | 20 ++++ compose.yaml | 95 ++++++++++++++++--- docker-compose.yml | 91 ------------------ .../resources/application-local.yml-example | 3 + 5 files changed, 116 insertions(+), 108 deletions(-) create mode 100644 compose.dev.yaml delete mode 100644 docker-compose.yml diff --git a/README.md b/README.md index fb43dd0..7ef0a52 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ The fastest way to get started is using Docker Compose: # Clone and start everything git clone https://github.com/devondragon/SpringUserFrameworkDemoApp.git cd SpringUserFrameworkDemoApp -docker-compose up --build +docker compose up --build ``` **Access the Application**: `http://localhost:8080` @@ -166,7 +166,7 @@ docker-compose up --build ``` - Using Docker Compose with Keycloak stack: ```bash - docker-compose -f docker-compose-keycloak.yml up --build + docker compose -f docker-compose-keycloak.yml up --build ``` 5. **Access the Application** @@ -510,13 +510,18 @@ mvn spring-boot:run The project includes a complete Docker setup with the application, MariaDB database, and a mail server. +**Docker Compose files:** +- **`compose.yaml`** — Full deployable stack (app + database + mail server). Use this to run the entire application in Docker. +- **`compose.dev.yaml`** — Dev dependencies only (database). Used automatically by Spring Boot's Docker Compose integration during `bootRun` for local development. +- **`docker-compose-keycloak.yml`** — Full stack with Keycloak for OIDC authentication testing. + ```bash -docker-compose up --build +docker compose up --build ``` To launch the Keycloak stack: ```bash -docker-compose -f docker-compose-keycloak.yml up --build +docker compose -f docker-compose-keycloak.yml up --build ``` **Note**: Test emails sent from the local Postfix server may not be accepted by all email providers. Use a real SMTP server for production use. @@ -695,7 +700,7 @@ Solution: 1. Check SMTP configuration in application.yml 2. Verify mail server credentials 3. Check spam/junk folders -4. Use Docker mail server for testing: docker-compose logs mailserver +4. Use Docker mail server for testing: docker compose logs mailserver ``` #### Application Won't Start diff --git a/compose.dev.yaml b/compose.dev.yaml new file mode 100644 index 0000000..75ac4d7 --- /dev/null +++ b/compose.dev.yaml @@ -0,0 +1,20 @@ +# Local Development Database Configuration +# WARNING: These credentials are for LOCAL DEVELOPMENT ONLY. +# Production deployments MUST use secure credentials managed through +# environment variables or secrets management systems. + +services: + mariadb: + image: mariadb:12.2 + environment: + MARIADB_DATABASE: springuser + MARIADB_USER: springuser + MARIADB_PASSWORD: springuser + MARIADB_ROOT_PASSWORD: rootpassword + ports: + - "3306:3306" + volumes: + - mariadb-data:/var/lib/mysql + +volumes: + mariadb-data: diff --git a/compose.yaml b/compose.yaml index 75ac4d7..928bb7d 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,20 +1,91 @@ -# Local Development Database Configuration -# WARNING: These credentials are for LOCAL DEVELOPMENT ONLY. -# Production deployments MUST use secure credentials managed through -# environment variables or secrets management systems. services: - mariadb: - image: mariadb:12.2 + myapp-db: + image: mariadb:11.6.2 + container_name: springuser-db + volumes: + - userdb:/var/lib/mysql environment: - MARIADB_DATABASE: springuser - MARIADB_USER: springuser - MARIADB_PASSWORD: springuser - MARIADB_ROOT_PASSWORD: rootpassword + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: springuser + MYSQL_USER: springuser + MYSQL_PASSWORD: springuser + MYSQL_TCP_PORT: 3306 ports: - "3306:3306" + healthcheck: + test: [ "CMD", "healthcheck.sh", "--connect", "--innodb_initialized" ] + start_period: 1m + start_interval: 10s + interval: 1m + timeout: 5s + retries: 3 + + mailserver: + image: docker.io/mailserver/docker-mailserver:latest + container_name: springuser-mail + hostname: mailserver + domainname: local + env_file: mailserver.env + ports: + - "25:25" + - "587:587" volumes: - - mariadb-data:/var/lib/mysql + - maildata:/var/mail + - mailstate:/var/mail-state + - maillogs:/var/log/mail + - ./config/:/tmp/docker-mailserver/${SELINUX_LABEL} + environment: + PERMIT_DOCKER: connected-networks + ONE_DIR: 1 + DMS_DEBUG: 0 + SPOOF_PROTECTION: 0 + REPORT_RECIPIENT: 1 + ENABLE_SPAMASSASSIN: 0 + ENABLE_CLAMAV: 0 + ENABLE_FAIL2BAN: 1 + ENABLE_POSTGREY: 0 + SMTP_ONLY: 1 + cap_add: + - NET_ADMIN + - SYS_PTRACE + healthcheck: + test: ["CMD", "nc", "-z", "localhost", "25"] + interval: 30s + timeout: 10s + retries: 5 + + myapp-main: + image: spring-user-framework-demo + container_name: springuser-app + build: + context: . + dockerfile: Dockerfile + depends_on: + myapp-db: + condition: service_healthy + mailserver: + condition: service_healthy + ports: + - "8080:8080" + environment: + SPRING_DATASOURCE_URL: jdbc:mariadb://myapp-db:3306/springuser?createDatabaseIfNotExist=true + SPRING_DATASOURCE_USERNAME: springuser + SPRING_DATASOURCE_PASSWORD: springuser + SPRING_PROFILES_ACTIVE: dev + SPRING_MAIL_HOST: mailserver + SPRING_MAIL_PORT: 25 + SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH: "false" + SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE: "false" + SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_REQUIRED: "false" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] + interval: 30s + timeout: 10s + retries: 5 volumes: - mariadb-data: + maildata: + mailstate: + maillogs: + userdb: diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 928bb7d..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,91 +0,0 @@ - -services: - myapp-db: - image: mariadb:11.6.2 - container_name: springuser-db - volumes: - - userdb:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: springuser - MYSQL_USER: springuser - MYSQL_PASSWORD: springuser - MYSQL_TCP_PORT: 3306 - ports: - - "3306:3306" - healthcheck: - test: [ "CMD", "healthcheck.sh", "--connect", "--innodb_initialized" ] - start_period: 1m - start_interval: 10s - interval: 1m - timeout: 5s - retries: 3 - - mailserver: - image: docker.io/mailserver/docker-mailserver:latest - container_name: springuser-mail - hostname: mailserver - domainname: local - env_file: mailserver.env - ports: - - "25:25" - - "587:587" - volumes: - - maildata:/var/mail - - mailstate:/var/mail-state - - maillogs:/var/log/mail - - ./config/:/tmp/docker-mailserver/${SELINUX_LABEL} - environment: - PERMIT_DOCKER: connected-networks - ONE_DIR: 1 - DMS_DEBUG: 0 - SPOOF_PROTECTION: 0 - REPORT_RECIPIENT: 1 - ENABLE_SPAMASSASSIN: 0 - ENABLE_CLAMAV: 0 - ENABLE_FAIL2BAN: 1 - ENABLE_POSTGREY: 0 - SMTP_ONLY: 1 - cap_add: - - NET_ADMIN - - SYS_PTRACE - healthcheck: - test: ["CMD", "nc", "-z", "localhost", "25"] - interval: 30s - timeout: 10s - retries: 5 - - myapp-main: - image: spring-user-framework-demo - container_name: springuser-app - build: - context: . - dockerfile: Dockerfile - depends_on: - myapp-db: - condition: service_healthy - mailserver: - condition: service_healthy - ports: - - "8080:8080" - environment: - SPRING_DATASOURCE_URL: jdbc:mariadb://myapp-db:3306/springuser?createDatabaseIfNotExist=true - SPRING_DATASOURCE_USERNAME: springuser - SPRING_DATASOURCE_PASSWORD: springuser - SPRING_PROFILES_ACTIVE: dev - SPRING_MAIL_HOST: mailserver - SPRING_MAIL_PORT: 25 - SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH: "false" - SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE: "false" - SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_REQUIRED: "false" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] - interval: 30s - timeout: 10s - retries: 5 - -volumes: - maildata: - mailstate: - maillogs: - userdb: diff --git a/src/main/resources/application-local.yml-example b/src/main/resources/application-local.yml-example index 79e5e56..644dbbf 100644 --- a/src/main/resources/application-local.yml-example +++ b/src/main/resources/application-local.yml-example @@ -12,6 +12,9 @@ logging: security: DEBUG # Set logging level for security spring: + docker: + compose: + file: compose.dev.yaml application: name: Spring User Framework Demo App # Change this as per your convenience datasource: From 4f448dc87a3901a0a5770894db494ff358d1fba6 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Sun, 22 Mar 2026 12:32:48 -0600 Subject: [PATCH 2/4] docs: update CHANGELOG.md with Docker Compose refactor (#68) --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 628fe9c..e36891f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## 2026-03-22 ### Changed +- Refactored Docker Compose file naming to avoid V2 precedence conflict (#68) + - `compose.yaml` → `compose.dev.yaml` (dev dependencies for `bootRun`) + - `docker-compose.yml` → `compose.yaml` (full deployable stack) + - Added `spring.docker.compose.file` to `application-local.yml-example` + - Updated README with compose file descriptions and Docker Compose V2 syntax - Refactored `TestDataController` to use `Instant` instead of `Date` for registration dates, aligning with library changes (#65) ### Dependencies From 9ef25597cf624271d5e92b7d202872d19fe3f7c6 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Sun, 22 Mar 2026 12:56:37 -0600 Subject: [PATCH 3/4] fix: address Copilot review feedback on compose refactor (#68) - Fix invalid YAML in application-local.yml-example: flatten CommonsRequestLoggingFilter key so web: remains a valid scalar and filter config is a sibling key - Align MariaDB version to 11.6.2 in compose.dev.yaml to match compose.yaml - Fix compose.yaml app healthcheck to use wget (installed in Dockerfile) instead of curl --- compose.dev.yaml | 2 +- compose.yaml | 2 +- src/main/resources/application-local.yml-example | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/compose.dev.yaml b/compose.dev.yaml index 75ac4d7..dc7ff39 100644 --- a/compose.dev.yaml +++ b/compose.dev.yaml @@ -5,7 +5,7 @@ services: mariadb: - image: mariadb:12.2 + image: mariadb:11.6.2 environment: MARIADB_DATABASE: springuser MARIADB_USER: springuser diff --git a/compose.yaml b/compose.yaml index 928bb7d..b78e434 100644 --- a/compose.yaml +++ b/compose.yaml @@ -79,7 +79,7 @@ services: SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE: "false" SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_REQUIRED: "false" healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] + test: ["CMD", "wget", "-qO-", "http://localhost:8080/actuator/health"] interval: 30s timeout: 10s retries: 5 diff --git a/src/main/resources/application-local.yml-example b/src/main/resources/application-local.yml-example index 644dbbf..409650f 100644 --- a/src/main/resources/application-local.yml-example +++ b/src/main/resources/application-local.yml-example @@ -7,8 +7,7 @@ logging: org: springframework: web: DEBUG # Set logging level for web - filter: - CommonsRequestLoggingFilter: DEBUG # Set logging level for CommonsRequestLoggingFilter + web.filter.CommonsRequestLoggingFilter: DEBUG # Set logging level for CommonsRequestLoggingFilter security: DEBUG # Set logging level for security spring: From a538671733639efb669753c780222271fbe4e368 Mon Sep 17 00:00:00 2001 From: Devon Hillard Date: Sun, 22 Mar 2026 12:57:06 -0600 Subject: [PATCH 4/4] chore: standardize MariaDB version to 12.2 across all compose files (#68) --- compose.dev.yaml | 2 +- compose.yaml | 2 +- docker-compose-keycloak.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/compose.dev.yaml b/compose.dev.yaml index dc7ff39..75ac4d7 100644 --- a/compose.dev.yaml +++ b/compose.dev.yaml @@ -5,7 +5,7 @@ services: mariadb: - image: mariadb:11.6.2 + image: mariadb:12.2 environment: MARIADB_DATABASE: springuser MARIADB_USER: springuser diff --git a/compose.yaml b/compose.yaml index b78e434..8f9ae7b 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,7 +1,7 @@ services: myapp-db: - image: mariadb:11.6.2 + image: mariadb:12.2 container_name: springuser-db volumes: - userdb:/var/lib/mysql diff --git a/docker-compose-keycloak.yml b/docker-compose-keycloak.yml index b16b874..b2ee2bb 100644 --- a/docker-compose-keycloak.yml +++ b/docker-compose-keycloak.yml @@ -2,7 +2,7 @@ version: "3.8" services: myapp-db: - image: mariadb:11.6.2 + image: mariadb:12.2 container_name: springuser-db # volumes: - userdb:/var/lib/mysql