name: continuim # Local parity topology. `docker compose up --build` builds both images from # source; production (Coolify) runs the same images pinned by tag from GHCR — # see deploy/coolify/compose.yaml. services: procurement: image: ghcr.io/ayush-sk-pathak/continuim-services:${CONTINUIM_TAG:-local} build: . command: npm run start:procurement environment: PROCUREMENT_HOST: 0.0.0.0 ATTESTATION_SIGNING_SECRET: ${ATTESTATION_SIGNING_SECRET:-local-attestation-only-change-me} expose: - "4001" healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:4001/health').then(r=>{if(!r.ok)process.exit(1)})"] interval: 3s timeout: 2s retries: 10 networks: main: {} control-plane: image: ghcr.io/ayush-sk-pathak/continuim-services:${CONTINUIM_TAG:-local} build: . command: npm run start:control environment: CONTROL_PLANE_HOST: 0.0.0.0 PROCUREMENT_URL: http://procurement:4001 SQLITE_PATH: /app/data/continuim.db ATTESTATION_SIGNING_SECRET: ${ATTESTATION_SIGNING_SECRET:-local-attestation-only-change-me} VERIFICATION_MODE: ${VERIFICATION_MODE:-fixture} FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-} LINKUP_API_KEY: ${LINKUP_API_KEY:-} STOCKOUT_WEBHOOK_SECRET: ${STOCKOUT_WEBHOOK_SECRET:-} expose: - "4000" volumes: - continuim-data:/app/data depends_on: procurement: condition: service_healthy healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:4000/health').then(r=>{if(!r.ok)process.exit(1)})"] interval: 3s timeout: 2s retries: 10 networks: main: {} web: image: ghcr.io/ayush-sk-pathak/continuim-web:${CONTINUIM_TAG:-local} build: Continuum environment: CONTROL_PLANE_INTERNAL_URL: http://control-plane:4000 ports: - "3000:3000" depends_on: control-plane: condition: service_healthy networks: main: {} networks: main: {} volumes: continuim-data: