version: '3.8' services: postgres: image: postgres:14-alpine container_name: telemetry-postgres environment: POSTGRES_USER: telemetry_user POSTGRES_PASSWORD: root POSTGRES_DB: telemetry_db ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U telemetry_user -d telemetry_db"] interval: 10s timeout: 5s retries: 5 restart: always zookeeper: image: confluentinc/cp-zookeeper:7.3.0 container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 kafka: image: confluentinc/cp-kafka:7.3.0 container_name: kafka ports: - "9092:9092" depends_on: - zookeeper environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://kafka:29092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 redis: image: redis:7-alpine container_name: redis ports: - "6379:6379" producer: container_name: producer # Tell Docker Compose to build the image from the telemetry-producer directory build: context: ./telemetry-producer dockerfile: Dockerfile depends_on: - kafka # Don't start the producer until Kafka is ready restart: on-failure consumer: container_name: consumer # Build the image from the telemetry-consumer directory ports: - "8082:8082" build: context: ./telemetry-consumer dockerfile: Dockerfile depends_on: - postgres - kafka - redis # Consumer needs both Kafka and Redis to be ready restart: on-failure volumes: pgdata: