2.9 KiB
Docker Compose implementation requirements
docker-compose.blueprint.yml is an executable architecture blueprint, not a release manifest. WP-020 must replace every :? image variable with an exact tag and digest, build local images, and generate a validated production override.
Compose project
- fixed project name:
itworx-mcp-hub; - dedicated appdata root, default proposal:
/srv/example/appdata/itworx-mcp-hub; - no modification of unrelated containers, networks, volumes, or proxy hosts;
- no service uses
network_mode: host; - only the explicit management, dataplane, and optional Inspector bindings may publish host ports;
- PostgreSQL, Redis, ContextForge, workers, connectors, and broker remain internal;
- all local services run non-root, drop Linux capabilities, use
no-new-privileges, and use a read-only root filesystem where practical; - each service has bounded memory/CPU/logging and a real healthcheck;
- startup ordering uses health conditions but applications must still tolerate dependency restarts;
- Redis is non-authoritative and may be emptied without data loss;
- the Docker socket is mounted only into
docker-read-broker, read-only; - target-system credentials are Compose secrets or equivalent mounted files, never normal environment values;
- release deployments use immutable image digests and record them in release evidence.
Required profiles
- default/core: production Hub services;
project-connectors: optional connectors requiring external project credentials;inspector: MCP Inspector bound to an explicitly configured LAN address only;observability: optional OTel Collector/Grafana stack if not reusing existing services;fake: deterministic fake targets for clean-room acceptance.
Required generated outputs in WP-020
docker-compose.ymlor an equivalent production base;- Unraid-specific override;
- development/fake override;
- exact
.env.examplewithout secrets; - all Dockerfiles and healthchecks;
docker compose configevidence;- image pin/digest inventory;
- network and published-port assertion tests.
Production build-fallback (WP-200 / DIAG-02)
docker-compose.prod.yml must cancel every owned service's inherited build:
block using the Compose Specification's !reset YAML tag — build: !reset null — never plain build: null. Plain null is not treated as "delete
this key" by the real Compose merge engine; the base file's build: mapping
survives and docker compose up -d will attempt a local build (and fail in a
confusing way, or in the worst case succeed and deploy an unscanned image)
if a registry pull ever fails. tests/test_compose.py's
test_real_compose_config_has_no_build_for_owned_services enforces this
against the real docker compose config CLI output; any new owned service
added to docker-compose.prod.yml must be added to that test's service list
and use the same !reset pattern.