Full-stack cloud store sandbox with a public React/Vite/TypeScript storefront and three Java microservices behind a Vert.x gateway.
| Area | Details |
|---|---|
| Purpose | Portfolio demo for comparing Spring Boot, Quarkus, Vert.x, and React service styles in one store flow. |
| Current frontend | web-react, React 19.2.1, Vite 7.2.4, TypeScript 5.9.3, PatternFly 6.3.7, Express 5.1.0. |
| Backend services | Catalog API, Inventory API, Gateway API/static edge, PostgreSQL. |
| Compose entrypoint | docker compose up -d from the repository root. |
| Public compose ports | PostgreSQL 5432, Gateway 8080, Web UI 3000. |
- Copy the environment template:
cp .env.example .env- Fill in the placeholders in
.env. Keep secrets local and don't commit real values. - Start the local stack:
docker compose up -d- Open the app:
http://localhost:3000
The gateway is also published at http://localhost:8080.
| Service | Path | Stack | Main routes | Ports | Data/config | Documented commands |
|---|---|---|---|---|---|---|
| Web UI | web-react |
Node 22 container, React 19.2.1, Vite 7.2.4, TypeScript 5.9.3, Express 5.1.0, PatternFly 6.3.7 | Static storefront served by Express | Compose 3000; PORT defaults to 8080 if unset |
Calls the gateway API | npm ci; npm run dev; npm run build; npm run verify; npm run e2e; npm run e2e:compose; PORT=3000 npm start; node --check server.js |
| Catalog | catalog-spring-boot |
Spring Boot 3.5.14, Java 21 | /api/catalog |
Default 8080; local profile 9000; internal compose port 8080 |
PostgreSQL through environment variables | ./gradlew test; ./gradlew bootJar -x test --no-daemon; ./gradlew bootRun --args='--spring.profiles.active=local' |
| Inventory | inventory-quarkus |
Quarkus 3.33.1, Java 21 | /api/inventory/{itemId} |
Internal compose port 8080 |
PostgreSQL through environment variables | ./gradlew test; ./gradlew build -Dquarkus.package.type=native -x test |
| Gateway | gateway-vertx |
Vert.x 5.0.12, Java 21 | /api/products; /health; static /* |
Compose 8080; HTTP_PORT default 8080 |
Calls catalog /api/catalog and inventory /api/inventory/{itemId} |
./gradlew test; ./gradlew nativeCompile |
| Database | Compose service | PostgreSQL | Service data store | Compose 5432 |
Configured from .env |
Started by docker compose up -d |
Browser
-> Web UI on localhost:3000
-> Gateway on localhost:8080
-> Catalog service /api/catalog on internal port 8080
-> Inventory service /api/inventory/{itemId} on internal port 8080
-> PostgreSQL on compose port 5432
Gateway combines catalog and inventory calls for /api/products. The web service is the current public frontend and is based on React, Vite, and TypeScript.
docker compose up -dcd web-react
npm ci
npm run dev
npm run build
npm run verify
npm run e2e
npm run e2e:compose
PORT=3000 npm start
node --check server.jscd catalog-spring-boot
./gradlew test
./gradlew bootJar -x test --no-daemon
./gradlew bootRun --args='--spring.profiles.active=local'cd inventory-quarkus
./gradlew test
./gradlew build -Dquarkus.package.type=native -x testcd gateway-vertx
./gradlew test
./gradlew nativeCompile| URL | Purpose |
|---|---|
http://localhost:3000 |
Web storefront in the compose stack. |
http://localhost:8080 |
Gateway public edge. |
http://localhost:8080/health |
Gateway health endpoint. |
http://localhost:8080/api/products |
Aggregated product API through the gateway. |
http://localhost:9000/api/catalog |
Catalog API when the Spring Boot local profile is started directly. |
- This is a sandbox and portfolio project, not a production-ready commerce platform.
- The stack doesn't include production authentication, authorization, payments, or user account management.
.env.exampleis a template only. Keep real.envvalues private.- Public compose ports are for local development: PostgreSQL
5432, gateway8080, web3000. - Catalog and inventory run behind the gateway in compose and share internal service port
8080. - Service boundaries are intentionally separate so the repository can compare framework styles.
Portfolio/demo project. The code is public as an architecture and implementation reference, not as a production-ready service.

