version: "3.8"

x-zookeeper-common:
  &zookeeper-common
  image: confluentinc/cp-zookeeper
  environment:
    &zookeeper-common-env
    ZOOKEEPER_SERVERS: "zookeeper1:2888:3888;zookeeper2:2888:3888;zookeeper3:2888:3888"
    ZOOKEEPER_CLIENT_PORT: 2181
    ZOOKEEPER_TICK_TIME: 2000
  restart: unless-stopped

x-broker-common:
  &broker-common
  image: confluentinc/cp-kafka
  environment:
    &broker-common-env
    KAFKA_ZOOKEEPER_CONNECT: "zookeeper1:2181,zookeeper2:2181,zookeeper3:2181"
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT"
    KAFKA_JMX_PORT: 9101
    KAFKA_JMX_HOSTNAME: localhost
  depends_on:
    - zookeeper1
    - zookeeper2
    - zookeeper3
  restart: unless-stopped

services:
  zookeeper1:
    <<: *zookeeper-common
    hostname: zookeeper1
    container_name: zookeeper1
    environment:
      <<: *zookeeper-common-env
      ZOOKEEPER_SERVER_ID: 1

  zookeeper2:
    <<: *zookeeper-common
    hostname: zookeeper2
    container_name: zookeeper2
    environment:
      <<: *zookeeper-common-env
      ZOOKEEPER_SERVER_ID: 2

  zookeeper3:
    <<: *zookeeper-common
    hostname: zookeeper3
    container_name: zookeeper3
    environment:
      <<: *zookeeper-common-env
      ZOOKEEPER_SERVER_ID: 3

  broker1:
    <<: *broker-common
    hostname: broker1
    container_name: broker1
    environment:
      <<: *broker-common-env
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://broker1:29092"

  broker2:
    <<: *broker-common
    hostname: broker2
    container_name: broker2
    environment:
      <<: *broker-common-env
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://broker2:29092"

  broker3:
    <<: *broker-common
    hostname: broker3
    container_name: broker3
    environment:
      <<: *broker-common-env
      KAFKA_BROKER_ID: 3
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://broker3:29092"

  schema-registry:
    image: confluentinc/cp-schema-registry
    hostname: schema-registry
    container_name: schema-registry
    depends_on:
      - broker1
      - broker2
      - broker3
    ports:
      - "8081:8081"
    environment:
      SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: "broker1:29092,broker2:29092,broker3:29092"
      SCHEMA_REGISTRY_HOST_NAME: schema-registry
      SCHEMA_REGISTRY_LISTENERS: "http://0.0.0.0:8081"
      SCHEMA_REGISTRY_COMPATIBILITY_LEVEL: backward
    restart: unless-stopped

  ksqldb-server:
    build:
      context: .
      args:
        # Replace with your GitHub username and token.
        - GITHUB_USERNAME=${GITHUB_USERNAME}
        - GITHUB_TOKEN=${GITHUB_TOKEN}
    hostname: ksqldb-server
    container_name: ksqldb-server
    depends_on:
      - broker1
      - broker2
      - broker3
      - schema-registry
    ports:
      - "8088:8088"
    healthcheck:
        test: ["CMD-SHELL", "/usr/local/bin/healthcheck.sh"]
        interval: 5s
        timeout: 5s
        retries: 60
    environment:
      Environment: local
      KSQL_BOOTSTRAP_SERVERS: "broker1:29092,broker2:29092,broker3:29092"
      KSQL_SECURITY_PROTOCOL: PLAINTEXT
      KSQL_KSQL_SCHEMA_REGISTRY_URL: "http://schema-registry:8081"
      KSQL_USE_QUERY_FILE: "false"
    volumes:
      - ./connector_config.properties:/etc/kafka-connect/connector_config.properties
    restart: unless-stopped

  akhq:
    image: tchiotludo/akhq
    hostname: akhq
    container_name: akhq
    depends_on:
      - broker1
      - broker2
      - broker3
    ports:
      - "8080:8080"
    environment:
      JVM_OPTS: -Xms64M -Xmx128M
      AKHQ_CONFIGURATION: |
        akhq:
          connections:
            local:
              properties:
                bootstrap.servers: "broker1:29092,broker2:29092,broker3:29092"
              schema-registry:
                url: "http://schema-registry:8081"
                type: confluent
