---
version: '3.5'

services:
  controller:
    image: ticdc:latest
    container_name: ticdc_controller
    build:
      context: ../../../
      dockerfile: ./deployments/ticdc/docker/Dockerfile
    volumes:
      - /data
      - ./logs:/logs
      - ./configs:/configs
    command:
      - /bin/bash
      - -c
      - /usr/bin/tail -f /dev/null
    depends_on:
      - "upstream-pd"
      - "kafka"
      - "capturer0"
      - "capturer1"
      - "capturer2"
    restart: on-failure

  capturer0:
    image: ticdc:latest
    build:
      context: ../../../
      dockerfile: ./deployments/ticdc/docker/Dockerfile
    volumes:
      - /data
      - ./logs:/logs
    ports:
      - "8300:8300"
    entrypoint: "/cdc server"
    command:
      - --addr=0.0.0.0:8300
      - --pd=http://upstream-pd:2379
      - --log-file=/logs/capturer0.log
      - --advertise-addr=capturer0:8300
      - --data-dir=/data
      - --log-level=debug
    depends_on:
      - "upstream-tidb"
      - "downstream-tidb"
      - "kafka"
    restart: on-failure

  capturer1:
    image: ticdc:latest
    build:
      context: ../../../
      dockerfile: ./deployments/ticdc/docker/Dockerfile
    volumes:
      - /data
      - ./logs:/logs
    ports:
      - "8301:8300"
    entrypoint: "/cdc server"
    command:
      - --addr=0.0.0.0:8300
      - --pd=http://upstream-pd:2379
      - --log-file=/logs/capturer1.log
      - --advertise-addr=capturer1:8300
      - --data-dir=/data
      - --log-level=debug
    depends_on:
      - "upstream-tidb"
      - "downstream-tidb"
      - "kafka"
    restart: on-failure

  capturer2:
    image: ticdc:latest
    build:
      context: ../../../
      dockerfile: ./deployments/ticdc/docker/Dockerfile
    volumes:
      - /data
      - ./logs:/logs
    ports:
      - "8302:8300"
    entrypoint: "/cdc server"
    command:
      - --addr=0.0.0.0:8300
      - --pd=http://upstream-pd:2379
      - --log-file=/logs/capturer2.log
      - --advertise-addr=capturer2:8300
      - --data-dir=/data
      - --log-level=debug
    depends_on:
      - "upstream-tidb"
      - "downstream-tidb"
      - "kafka"
    restart: on-failure

  upstream-pd:
    image: pingcap/pd:nightly
    ports:
      - "2379:2379"
    volumes:
      - ./configs/pd.toml:/pd.toml:ro
      - /data
      - ./logs:/logs
    command:
      - --name=upstream-pd
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-client-urls=http://upstream-pd:2379
      - --advertise-peer-urls=http://upstream-pd:2380
      - --initial-cluster=upstream-pd=http://upstream-pd:2380
      - --data-dir=/data/upstream-pd
      - --config=/pd.toml
      - --log-file=/logs/upstream-pd.log
      - -L=info
    restart: on-failure

  upstream-tikv0:
    image: pingcap/tikv:nightly
    volumes:
      - ./configs/tikv.toml:/tikv.toml:ro
      - /data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=upstream-tikv0:20160
      - --data-dir=/data/upstream-tikv0
      - --pd=upstream-pd:2379
      - --config=/tikv.toml
      - --log-file=/logs/upstream-tikv0.log
      - --log-level=debug
    depends_on:
      - "upstream-pd"
    restart: on-failure

  upstream-tikv1:
    image: pingcap/tikv:nightly
    volumes:
      - ./configs/tikv.toml:/tikv.toml:ro
      - /data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=upstream-tikv1:20160
      - --data-dir=/data/upstream-tikv1
      - --pd=upstream-pd:2379
      - --config=/tikv.toml
      - --log-file=/logs/upstream-tikv1.log
      - --log-level=debug
    depends_on:
      - "upstream-pd"
    restart: on-failure

  upstream-tikv2:
    image: pingcap/tikv:nightly
    volumes:
      - ./configs/tikv.toml:/tikv.toml:ro
      - /data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=upstream-tikv2:20160
      - --data-dir=/data/upstream-tikv2
      - --pd=upstream-pd:2379
      - --config=/tikv.toml
      - --log-file=/logs/upstream-tikv2.log
      - --log-level=debug
    depends_on:
      - "upstream-pd"
    restart: on-failure

  upstream-tidb:
    image: pingcap/tidb:nightly
    ports:
      - "4000:4000"
      - "10080:10080"
    volumes:
      - ./configs/tidb.toml:/tidb.toml:ro
      - ./logs:/logs
    command:
      - --store=tikv
      - --path=upstream-pd:2379
      - --config=/tidb.toml
      - --log-file=/logs/upstream-tidb.log
      - --advertise-address=upstream-tidb
      - -L=info
    depends_on:
      - "upstream-tikv0"
      - "upstream-tikv1"
      - "upstream-tikv2"
    restart: on-failure

  downstream-pd:
    image: pingcap/pd:nightly
    ports:
      - "3379:2379"
    volumes:
      - ./configs/pd.toml:/pd.toml:ro
      - /data
      - ./logs:/logs
    command:
      - --name=downstream-pd
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-client-urls=http://downstream-pd:2379
      - --advertise-peer-urls=http://downstream-pd:2380
      - --initial-cluster=downstream-pd=http://downstream-pd:2380
      - --data-dir=/data/downstream-pd
      - --config=/pd.toml
      - --log-file=/logs/downstream-pd.log
      - -L=info
    restart: on-failure

  downstream-tikv0:
    image: pingcap/tikv:nightly
    volumes:
      - ./configs/tikv.toml:/tikv.toml:ro
      - /data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=downstream-tikv0:20160
      - --data-dir=/data/downstream-tikv0
      - --pd=downstream-pd:2379
      - --config=/tikv.toml
      - --log-file=/logs/downstream-tikv0.log
      - --log-level=info
    depends_on:
      - "downstream-pd"
    restart: on-failure

  downstream-tikv1:
    image: pingcap/tikv:nightly
    volumes:
      - ./configs/tikv.toml:/tikv.toml:ro
      - /data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=downstream-tikv1:20160
      - --data-dir=/data/downstream-tikv1
      - --pd=downstream-pd:2379
      - --config=/tikv.toml
      - --log-file=/logs/downstream-tikv1.log
      - --log-level=info
    depends_on:
      - "downstream-pd"
    restart: on-failure

  downstream-tikv2:
    image: pingcap/tikv:nightly
    volumes:
      - ./configs/tikv.toml:/tikv.toml:ro
      - /data
      - ./logs:/logs
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=downstream-tikv2:20160
      - --data-dir=/data/downstream-tikv2
      - --pd=downstream-pd:2379
      - --config=/tikv.toml
      - --log-file=/logs/downstream-tikv2.log
      - --log-level=info
    depends_on:
      - "downstream-pd"
    restart: on-failure

  downstream-tidb:
    image: pingcap/tidb:nightly
    ports:
      - "5000:4000"
      - "20080:10080"
    volumes:
      - ./configs/tidb.toml:/tidb.toml:ro
      - ./logs:/logs
    command:
      - --store=tikv
      - --path=downstream-pd:2379
      - --config=/tidb.toml
      - --log-file=/logs/downstream-tidb.log
      - --advertise-address=downstream-tidb
      - -L=info
    depends_on:
      - "downstream-tikv0"
      - "downstream-tikv1"
      - "downstream-tikv2"
    restart: on-failure

  # The rest of the file is adapted from https://github.com/confluentinc/demo-scene/blob/master/connect-jdbc/docker-compose.yml

  zookeeper:
    image: confluentinc/cp-zookeeper:5.5.1
    container_name: zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-enterprise-kafka:5.5.1
    container_name: kafka
    depends_on:
      - "zookeeper"
    ports:
      # Exposes 9092 for external connections to the broker
      # Use kafka:29092 for connections internal on the docker network
      # See https://rmoff.net/2018/08/02/kafka-listeners-explained/ for details
      - 9092:9092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://kafka:9092
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_METRIC_REPORTERS: io.confluent.metrics.reporter.ConfluentMetricsReporter
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 100
      CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: kafka:29092
      CONFLUENT_METRICS_REPORTER_ZOOKEEPER_CONNECT: zookeeper:2181
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'true'
      CONFLUENT_SUPPORT_CUSTOMER_ID: 'anonymous'

  canal-adapter:
    image: canal-adapter:latest
    build:
      context: ../../../scripts/canal/docker
      dockerfile: ./Dockerfile
    ports:
      - 8081:8081
    volumes:
      - ./logs:/root/logs
    environment:
      KAFKA_SERVER: kafka:9092
      ZOOKEEPER_SERVER: zookeeper:2181
      DB_NAME: testdb
      DOWNSTREAM_DB_HOST: downstream-tidb
      DOWNSTREAM_DB_PORT: 4000
      USE_FLAT_MESSAGE: ${USE_FLAT_MESSAGE}
    depends_on:
      - "zookeeper"
      - "kafka"
      - "upstream-tidb"
      - "downstream-tidb"
    restart: on-failure
