Running the reference, start to finish.
From a bare workstation to a running Quarkus data mesh — JDK, Maven, the Quarkus CLI, and a Docker Compose stack for Kafka, Postgres, and observability.
Version matrix
| Component | Version | Notes |
|---|---|---|
| Quarkus | 3.40.1 | Current LTS and newest stable (4.0.0 is Beta only) |
| JDK | 25 (25-tem) |
Supported on Quarkus 3.40.x |
| Camel | platform-aligned | Imported via quarkus-camel-bom:3.40.1 (Camel Quarkus 3.40.0, Camel 4.22.1) — no standalone Camel version pin |
| langchain4j | platform-aligned | Imported via the platform quarkus-langchain4j-bom:3.40.1 (quarkus-langchain4j 1.13.3, dev.langchain4j 1.19.3). Ollama tool calling is an open upstream deferral (DEF-001) |
| Maven | 3.9.x | |
| Base images | UBI 10 (ubi10/openjdk-25:1.24-15) |
Multi-stage builder + runtime images |
| Container toolchain | Docker / Docker Compose | Docker Engine — see the lgtm-docker-stack skill |
Required tooling
- SDKMAN — manages JDK 25, Maven 3.9.x, JBang, and the Quarkus CLI
- Quarkus CLI —
quarkus create,quarkus dev - Docker Engine and Docker Compose — the v2 CLI plugin
- Camel CLI & the Camel MCP server — Camel-on-Quarkus route prototyping and validation
- Demo command-line tools —
curl,jq,grpcurl, andkcat(Fedora:sudo dnf install kcat);demos/walkthrough.shchecks for them before it starts - The Quarkus Agent MCP server — dev-loop tooling for Claude Code (project create, skills, docs search, logs)
Installing the toolchain via SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 25-tem
sdk install maven 3.9.9
sdk install quarkus
Container engine sizing
Docker Engine on Fedora or RHEL (bare metal or VM) is required.
Everything here runs on that one engine: the Compose stack, Dev Services
and Testcontainers during mvn verify, the Mandrel builder
image for native builds, and minikube, which runs as a container under
its Docker driver. The engine uses all host CPUs and memory and stores
images under /var/lib/docker, so there is nothing to size
beyond the host itself.
Install Docker Engine and the Compose plugin for Fedora or RHEL, then enable it and point the CLI at it:
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER" # log out and back in
docker context use default
docker info
Membership in the docker group is root-equivalent on the host.
| Workload | CPUs | Memory | Disk |
|---|---|---|---|
Compose stack, dev mode, mvn verify, native build |
8 | 16 GB | 100 GB |
| Everything above plus minikube at the bootstrap defaults (24 GB) | 8+ | 28 GB | 200 GB |
Disk runs out first; the native-build demo and the Ollama image pull for the AI service tests need room. Budget host memory the same way: at least 32 GB for the minikube path, leaving room for the OS, IDE, and browser.
A VM-based engine such as Docker Desktop also works; size its VM larger
than the node and set MINIKUBE_CPUS / MINIKUBE_MEMORY to fit.
Fitting minikube to the engine
scripts/bootstrap.sh starts minikube with 24 GB, 16 CPUs, and
and about 100 GB free under the Docker data root (/var/lib/docker; the docker driver ignores --disk-size). minikube cannot request more CPUs or memory than the
engine has, so override the defaults to fit. On an 8-CPU host:
MINIKUBE_CPUS=8 ./scripts/bootstrap.sh
# also available: MINIKUBE_MEMORY (default 24g); MINIKUBE_DISK is ignored by the docker driver
Host access
The minikube profile publishes the platform NodePorts on
127.0.0.1 when it is created, so the cluster is reached at the
same localhost URLs as the Compose stack:
| Service | URL |
|---|---|
| Grafana | http://localhost:3000 |
| OTLP gRPC / HTTP | localhost:4317 / http://localhost:4318 |
| Mimir | http://localhost:9009 |
| Loki | http://localhost:3100 |
| Tempo | http://localhost:3200 |
| Kiali | http://localhost:20001/kiali |
| Apicurio | http://localhost:8084/apis/registry/v3 |
./scripts/show-endpoints.sh prints the status table. The ports
are fixed when the profile is created; ./scripts/setup-profile.sh --replace
recreates it, which deletes the cluster, so re-run ./scripts/bootstrap.sh afterwards.
Compose and the cluster cannot run together: the Compose lgtm
container uses ports 3000, 3100, 3200, 4317 and 4318. Stop the cluster with
minikube stop -p datamesh before running Compose demos.
Optional: OpenShift Local (CRC)
The appendix Running on OpenShift Local
runs the seven core services, Kafka, Postgres and Apicurio on a single-node
OpenShift 4.22 VM. It needs crc with a Red Hat pull secret,
oc, helm, jq and Maven with JDK 25; images are built
inside the cluster, so no container engine is involved. It was verified with
6 vCPUs, 20 GB of memory and an 80 GB disk. Run it instead of minikube, not
alongside it, and finish with ./openshift/teardown.sh, which removes
everything it installed and stops CRC.
Bootstrap
The local infrastructure — Kafka, Postgres, Apicurio, and the observability stack — runs via Docker Compose from the repo root. Copy the env template, bring the stack up, then start any service in dev mode:
cp .env.example .env
docker compose up -d
cd examples/<service>
mvn quarkus:dev
Host ports come from .env. Fedora Server and RHEL enable the
Cockpit web console on 9090, so .env.example publishes
Prometheus on MIMIR_PORT=19090. An older .env
copied before this change still says 9090; update it or copy the
template again.
For the Kubernetes substrate (Istio, KEDA, Strimzi,
CloudNativePG on a local Kubernetes cluster — needed for the KEDA demos), run
scripts/bootstrap.sh. See
k8s/
for the manifests.
Verifying a service
mvn verify -f examples/pom.xml # unit + integration tests, every service
mvn package -Pnative # native build (GraalVM/Mandrel)
quarkus build --native # equivalent, via the Quarkus CLI
./scripts/run-all-tests.sh # single entrypoint for the full test suite
What's next
See demos & examples to run the 19 demo scripts against this toolchain, or the GitHub repo ↗ for the current build status.