services: # ── Orchestration workflow engine ───────────────────────────────────────── orchestrator: build: context: ./services/orchestrator dockerfile: Dockerfile image: lf-orchestrator:${ORCHESTRATOR_VERSION:-dev} container_name: lf-orchestrator ports: - "${ORCHESTRATOR_PORT:-1717}:1717" environment: MODE: ${ORCHESTRATOR_MODE:-plug} SPECTROMETER_URL: http://spectrometer:8000 RECONSTRUCTOR_URL: http://reconstructor:8000 SEQ_INTERP_URL: http://seq-interp:7475 depends_on: seq-interp: condition: service_healthy restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:1717/health"] interval: 10s timeout: 5s retries: 5 start_period: 15s # ── MRI sequence interpreter ─────────────────────────────────────────────── # Build context is the monorepo root so Dockerfile can access both # services/seq-interp/ and libs/lf-scanner/ seq-interp: build: context: . dockerfile: services/seq-interp/Dockerfile image: lf-seq-interp:${SEQ_INTERP_VERSION:-dev} container_name: lf-seq-interp ports: - "${SEQ_INTERP_PORT:-7475}:7475" volumes: - seq_interp_input:/app/seq_interp/data/input - seq_interp_output:/app/seq_interp/data/output - seq_interp_logs:/app/seq_interp/log restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:7475/health"] interval: 10s timeout: 5s retries: 5 start_period: 15s # ── Spectrometer hardware controller (DRF) ──────────────────────────────── spectrometer: build: context: ./services/spectrometer dockerfile: Dockerfile image: lf-spectrometer:${SPECTROMETER_VERSION:-dev} container_name: lf-spectrometer ports: - "${SPECTROMETER_PORT:-8000}:8000" volumes: - spectrometer_db:/app/db restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/"] interval: 15s timeout: 5s retries: 5 start_period: 30s # ── MRI image reconstructor ──────────────────────────────────────────────── reconstructor: build: context: ./services/reconstructor dockerfile: Dockerfile image: lf-reconstructor:${RECONSTRUCTOR_VERSION:-dev} container_name: lf-reconstructor ports: - "${RECONSTRUCTOR_PORT:-8081}:8000" volumes: - reconstructor_sessions:/app/sessions restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 10s timeout: 5s retries: 5 start_period: 20s # ── Spectroscopy signal processor ───────────────────────────────────────── spectroscopy: build: context: ./services/spectroscopy dockerfile: Dockerfile image: lf-spectroscopy:${SPECTROSCOPY_VERSION:-dev} container_name: lf-spectroscopy ports: - "${SPECTROSCOPY_PORT:-8002}:8002" environment: SERVICE_PORT: "8002" restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8002/health"] interval: 10s timeout: 5s retries: 5 start_period: 15s volumes: seq_interp_input: seq_interp_output: seq_interp_logs: reconstructor_sessions: spectrometer_db: