services:
  postgres:
    image: pgvector/pgvector:pg17
    ports:
      - '${PG_HOST_PORT:-5433}:5432'
    environment:
      POSTGRES_USER: mosaic
      POSTGRES_PASSWORD: mosaic
      POSTGRES_DB: mosaic
    volumes:
      - pg_data:/var/lib/postgresql/data
      - ./infra/pg-init:/docker-entrypoint-initdb.d:ro
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U mosaic']
      interval: 5s
      timeout: 3s
      retries: 5

  valkey:
    image: valkey/valkey:8-alpine
    ports:
      - '${VALKEY_HOST_PORT:-6380}:6379'
    volumes:
      - valkey_data:/data
    healthcheck:
      test: ['CMD', 'valkey-cli', 'ping']
      interval: 5s
      timeout: 3s
      retries: 5

  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.100.0
    ports:
      - '4317:4317' # OTLP gRPC
      - '4318:4318' # OTLP HTTP
    volumes:
      - ./infra/otel-collector.yml:/etc/otelcol-contrib/config.yaml:ro
    depends_on:
      jaeger:
        condition: service_started

  jaeger:
    image: jaegertracing/jaeger:2.6.0
    ports:
      - '16686:16686' # Jaeger UI
      - '4319:4317' # Jaeger OTLP gRPC (internal, collector forwards here)
    environment:
      COLLECTOR_OTLP_ENABLED: 'true'

volumes:
  pg_data:
  valkey_data:
