# 14 containerized agents plus Redis. Agent 1 (the Radio Controller / bridge) # runs natively on the macOS host, because Docker Desktop on macOS cannot pass # the USB HackRF into a container. The bridge reaches Redis at localhost:6379 # (published below) and writes IQ into ./shared, which every agent mounts. x-agent: &agent build: context: . dockerfile: images/base/Dockerfile image: sdr-catalog-base:latest restart: unless-stopped depends_on: redis: condition: service_healthy environment: REDIS_HOST: redis REDIS_PORT: "6379" volumes: - ./shared:/shared services: redis: image: redis:7-alpine ports: - "6379:6379" # exposed so the native bridge on the host can connect healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 2s timeout: 3s retries: 20 # --- perception pipeline --------------------------------------------------- sweeper: <<: *agent command: ["python", "-m", "agents.sweeper.main"] channelizer: <<: *agent command: ["python", "-m", "agents.channelizer.main"] energy-detector: <<: *agent command: ["python", "-m", "agents.energy_detector.main"] modulation-classifier: <<: *agent command: ["python", "-m", "agents.modulation_classifier.main"] protocol-identifier: <<: *agent command: ["python", "-m", "agents.protocol_identifier.main"] # --- decoders: one image, six profiles ------------------------------------ decoder-broadcast: <<: *agent environment: REDIS_HOST: redis PROFILE: broadcast command: ["python", "-m", "agents.decoder.main"] decoder-aircraft: <<: *agent environment: REDIS_HOST: redis PROFILE: aircraft command: ["python", "-m", "agents.decoder.main"] decoder-ism: <<: *agent environment: REDIS_HOST: redis PROFILE: ism command: ["python", "-m", "agents.decoder.main"] decoder-ais: <<: *agent environment: REDIS_HOST: redis PROFILE: ais command: ["python", "-m", "agents.decoder.main"] decoder-pager: <<: *agent environment: REDIS_HOST: redis PROFILE: pager command: ["python", "-m", "agents.decoder.main"] decoder-satellite: <<: *agent environment: REDIS_HOST: redis PROFILE: satellite command: ["python", "-m", "agents.decoder.main"] # --- coordination and data ------------------------------------------------- orchestrator: <<: *agent command: ["python", "-m", "agents.orchestrator.main"] catalog: <<: *agent command: ["python", "-m", "agents.catalog.main"] environment: REDIS_HOST: redis CATALOG_DB: /data/catalog.db volumes: - ./shared:/shared - catalog-data:/data ports: - "8080:8080" # low-level JSON API query: <<: *agent command: ["python", "-m", "agents.query.main"] environment: REDIS_HOST: redis CATALOG_URL: http://catalog:8080 depends_on: redis: condition: service_healthy catalog: condition: service_started ports: - "8090:8090" # human-readable reports volumes: catalog-data: