version: '3.8' services: # Zookeeper for Kafka zookeeper: image: confluentinc/cp-zookeeper:7.4.0 hostname: zookeeper container_name: zookeeper ports: - "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 # Kafka broker kafka: image: confluentinc/cp-kafka:7.4.0 hostname: kafka container_name: kafka depends_on: - zookeeper ports: - "9092:9092" - "9101:9101" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 KAFKA_JMX_PORT: 9101 KAFKA_JMX_HOSTNAME: localhost KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true' # PostgreSQL database postgres: image: postgres:15 container_name: postgres hostname: postgres ports: - "5432:5432" environment: POSTGRES_DB: postgres POSTGRES_USER: postgres POSTGRES_PASSWORD: localpass123 volumes: - postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 # Spring Boot Consumer spring-boot-consumer: build: context: ./KafkaConsumer dockerfile: Dockerfile container_name: spring-boot-consumer depends_on: postgres: condition: service_healthy kafka: condition: service_started environment: - KAFKA_BOOTSTRAP_SERVERS=kafka:29092 - DB_HOST=postgres - DB_PORT=5432 - DB_NAME=microfinance_db - DB_USERNAME=postgres - DB_PASSWORD=localpass123 restart: unless-stopped # .NET Consumer dotnet-consumer: build: context: ./KafkaConsumer.Net/KafkaConsumer dockerfile: Dockerfile container_name: dotnet-consumer depends_on: postgres: condition: service_healthy kafka: condition: service_started environment: - KAFKA_BOOTSTRAP_SERVERS=kafka:29092 - DB_CONNECTION_STRING=Host=postgres;Port=5432;Username=postgres;Password=localpass123;Database=microfinance_db restart: unless-stopped # Message Producer message-producer: build: context: ./scripts/producer dockerfile: Dockerfile container_name: message-producer depends_on: kafka: condition: service_started environment: - KAFKA_BOOTSTRAP_SERVERS=kafka:29092 - TOPIC_NAME=disburse-commands - MESSAGES_PER_SECOND=1000 restart: unless-stopped volumes: postgres_data: