Skip to content

Deployment

Three Docker Compose setups live in infra/, plus Kubernetes manifests for production.

Quick start

infra/docker-compose.yaml starts published images with no configuration and exposes only the workbench on port 4242.

bash
docker compose -f infra/docker-compose.yaml up -d

Override MDEO_IMAGE_PREFIX to pull from another registry owner and MDEO_IMAGE_TAG to pin a release.

Development

infra/docker-compose-dev.yaml builds every image from the current checkout and additionally exposes the internal service and database ports.

bash
docker compose -f infra/docker-compose-dev.yaml up --build

It also starts three optimizer-execution nodes wired together as peers, so distributed search can be exercised locally.

Production

infra/docker-compose-prod.yaml runs published images and keeps configuration external.

bash
cp infra/.env.example infra/.env
# edit infra/.env
docker compose --env-file infra/.env -f infra/docker-compose-prod.yaml up -d

Images follow the naming scheme ${MDEO_IMAGE_PREFIX}/mdeo-<service>:${MDEO_IMAGE_TAG}.

Settings that matter

VariableWhy it matters
ADMIN_USERNAME, ADMIN_PASSWORDThe bootstrap administrator. Change both.
DATABASE_*, *_DB_USER, *_DB_PASSWORDEach domain has its own database; give each its own credentials.
JWT_PRIVATE_KEY, JWT_PUBLIC_KEY, JWT_ISSUERSigning material for the tokens services use to call the backend.
JWT_EXECUTION_EXPIRATION_SECONDSMust outlive your longest optimisation run, or the node cannot report its final state.
CORS_ALLOWED_HOSTSThe hosts allowed to reach the API.
COOKIE_SECURE, COOKIE_SAMESITELeave at the secure defaults behind TLS.
PLUGIN_BASE_URL, INTERNAL_PLUGIN_BASE_URLHow plugin URLs are resolved for the browser and for the backend respectively.
DEFAULT_PLUGIN_URLSComma-separated plugin URLs registered at startup.
EXECUTION_TIMEOUT_MSUpper bound on a single execution.

The full list is in infra/.env.example.

Kubernetes

Manifests are under infra/k8s/. They provision the backend, the plugin services, the execution services and their secrets, and are the way to scale out: optimizer-execution is designed to run as several replicas that discover each other through a peer list, each contributing worker threads to a single run.

Scaling notes

  • Optimiser nodes are the component to add when runs are too slow. The resources block of a config file caps how much of the available capacity a single run may take (threads, nodes, threadsPerNode).
  • Plugin services are stateless apart from a pool of Langium instances. MAX_LANGIUM_INSTANCES trades memory for the ability to serve concurrent requests with different plugin sets.
  • Databases are already split per domain, so a heavy optimisation run does not contend with workbench traffic.

After an upgrade

DANGER

Administrators must refresh all plugins (Settings → Plugins) after deploying a new version. Plugin manifests reference versioned static assets, and stale manifests make plugin loading fail in the workbench.

Released under the terms of the repository licence.