Setup & prerequisites

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, and kcat (Fedora: sudo dnf install kcat); demos/walkthrough.sh checks 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.

WorkloadCPUsMemoryDisk
Compose stack, dev mode, mvn verify, native build 816 GB100 GB
Everything above plus minikube at the bootstrap defaults (24 GB) 8+28 GB200 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:

ServiceURL
Grafanahttp://localhost:3000
OTLP gRPC / HTTPlocalhost:4317 / http://localhost:4318
Mimirhttp://localhost:9009
Lokihttp://localhost:3100
Tempohttp://localhost:3200
Kialihttp://localhost:20001/kiali
Apicuriohttp://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.