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 runs natively on the Windows host — not in Docker. # On Windows with Docker Desktop use host.docker.internal; override via .env. SPECTROMETER_URL: ${SPECTROMETER_URL:-http://host.docker.internal:8000} RECONSTRUCTOR_URL: http://reconstructor:8000 SEQ_INTERP_URL: http://seq-interp:7475 SPECTROMETER_USER: ${SPECTROMETER_USER:-admin} SPECTROMETER_PASSWORD: ${SPECTROMETER_PASSWORD:-admin} WAIT_DATA_TIMEOUT: ${WAIT_DATA_TIMEOUT:-120} STUB_DATA_PATH: /app/stub_data/response.json SEQ_OUTPUT_HOST_PATH: ${SEQ_OUTPUT_HOST_PATH:-} volumes: - "${STUB_DATA_FILE:-./services/orchestrator/stub_data/response.json}:/app/stub_data/response.json:ro" 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 # Bind-mount output so the Windows-native spectrometer can read generated files. # Set SEQ_OUTPUT_HOST_PATH in .env to the Windows path, e.g. C:/lf_mri_output - ${SEQ_OUTPUT_HOST_PATH:-./seq_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 # -- 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 is a bind-mount (see seq-interp service above) seq_interp_logs: reconstructor_sessions: