version: '3.8' services: # PostgreSQL + TimescaleDB for persistent data postgres: image: timescale/timescaledb:latest-pg16 container_name: open-mobility-postgres restart: unless-stopped environment: POSTGRES_DB: open_mobility POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./db/init:/docker-entrypoint-initdb.d healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d open_mobility"] interval: 5s timeout: 5s retries: 5 networks: - open-mobility # Tile38 for real-time geospatial data tile38: image: tile38/tile38:latest container_name: open-mobility-tile38 restart: unless-stopped ports: - "9851:9851" volumes: - tile38_data:/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9851/server"] interval: 5s timeout: 5s retries: 5 networks: - open-mobility # Kafka for event streaming kafka: image: confluentinc/cp-kafka:latest container_name: open-mobility-kafka restart: unless-stopped depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: true volumes: - kafka_data:/var/lib/kafka/data healthcheck: test: ["CMD", "kafka-broker-api-versions", "--bootstrap-server", "localhost:9092"] interval: 5s timeout: 5s retries: 5 networks: - open-mobility # Zookeeper for Kafka zookeeper: image: confluentinc/cp-zookeeper:latest container_name: open-mobility-zookeeper restart: unless-stopped ports: - "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 volumes: - zookeeper_data:/var/lib/zookeeper/data - zookeeper_logs:/var/lib/zookeeper/log healthcheck: test: ["CMD", "nc", "-z", "localhost", "2181"] interval: 5s timeout: 5s retries: 5 networks: - open-mobility # Redis for caching and sessions redis: image: redis:7-alpine container_name: open-mobility-redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 networks: - open-mobility # OSRM routing engine osrm: image: osrm/osrm-backend:latest container_name: open-mobility-osrm restart: unless-stopped ports: - "5000:5000" volumes: - ./osrm-data:/data command: osrm-routed --algorithm mld /data/map.osrm healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5000/route/v1/car/0,0;0,0"] interval: 10s timeout: 5s retries: 3 networks: - open-mobility # Jaeger for distributed tracing jaeger: image: jaegertracing/all-in-one:latest container_name: open-mobility-jaeger restart: unless-stopped ports: - "16686:16686" # Jaeger UI - "14268:14268" # HTTP collector environment: COLLECTOR_OTLP_ENABLED: true networks: - open-mobility # Prometheus for metrics prometheus: image: prom/prometheus:latest container_name: open-mobility-prometheus restart: unless-stopped ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--storage.tsdb.retention.time=200h' - '--web.enable-lifecycle' networks: - open-mobility # Grafana for dashboards grafana: image: grafana/grafana:latest container_name: open-mobility-grafana restart: unless-stopped ports: - "3000:3000" environment: GF_SECURITY_ADMIN_PASSWORD: admin volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources depends_on: - prometheus networks: - open-mobility # Telemetry Ingestor Service telemetry-ingestor: build: context: . dockerfile: cmd/telemetry-ingestor/Dockerfile container_name: telemetry-ingestor restart: unless-stopped ports: - "50051:50051" # gRPC port environment: - DATABASE_HOST=postgres - DATABASE_PORT=5432 - DATABASE_USER=postgres - DATABASE_PASSWORD=postgres - DATABASE_NAME=open_mobility - TILE38_HOST=tile38 - TILE38_PORT=9851 - KAFKA_BROKERS=kafka:9092 - REDIS_HOST=redis - REDIS_PORT=6379 - JAEGER_ENDPOINT=http://jaeger:14268/api/traces depends_on: postgres: condition: service_healthy tile38: condition: service_healthy kafka: condition: service_healthy redis: condition: service_healthy networks: - open-mobility # Driver Offer Allocator Service driver-offer-allocator: build: context: . dockerfile: cmd/driver-offer-allocator/Dockerfile container_name: driver-offer-allocator restart: unless-stopped ports: - "8081:8081" environment: - DATABASE_HOST=postgres - DATABASE_PORT=5432 - DATABASE_USER=postgres - DATABASE_PASSWORD=postgres - DATABASE_NAME=open_mobility - TILE38_HOST=tile38 - TILE38_PORT=9851 - KAFKA_BROKERS=kafka:9092 - REDIS_HOST=redis - REDIS_PORT=6379 - JAEGER_ENDPOINT=http://jaeger:14268/api/traces depends_on: postgres: condition: service_healthy tile38: condition: service_healthy kafka: condition: service_healthy redis: condition: service_healthy networks: - open-mobility # Ride Lifecycle Service ride-lifecycle: build: context: . dockerfile: cmd/ride-lifecycle/Dockerfile container_name: ride-lifecycle restart: unless-stopped ports: - "8082:8082" environment: - DATABASE_HOST=postgres - DATABASE_PORT=5432 - DATABASE_USER=postgres - DATABASE_PASSWORD=postgres - DATABASE_NAME=open_mobility - KAFKA_BROKERS=kafka:9092 - REDIS_HOST=redis - REDIS_PORT=6379 - JAEGER_ENDPOINT=http://jaeger:14268/api/traces depends_on: postgres: condition: service_healthy kafka: condition: service_healthy redis: condition: service_healthy networks: - open-mobility # Fare Engine Service fare-engine: build: context: . dockerfile: cmd/fare-engine/Dockerfile container_name: fare-engine restart: unless-stopped ports: - "8083:8083" environment: - DATABASE_HOST=postgres - DATABASE_PORT=5432 - DATABASE_USER=postgres - DATABASE_PASSWORD=postgres - DATABASE_NAME=open_mobility - OSRM_HOST=osrm - OSRM_PORT=5000 - REDIS_HOST=redis - REDIS_PORT=6379 - JAEGER_ENDPOINT=http://jaeger:14268/api/traces depends_on: postgres: condition: service_healthy osrm: condition: service_healthy redis: condition: service_healthy networks: - open-mobility volumes: postgres_data: tile38_data: kafka_data: zookeeper_data: zookeeper_logs: redis_data: prometheus_data: grafana_data: networks: open-mobility: driver: bridge