x-first-block-node-volumes: &first-block-node-volumes
  - "${NETWORK_NODE_LOGS_ROOT_PATH}/accountBalances:/opt/hgcapp/accountBalances"
  - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams:/opt/hgcapp/recordStreams"
  - "${APPLICATION_CONFIG_PATH}:/opt/hgcapp/services-hedera/HapiApp2.0/data/config"
  - "${NETWORK_NODE_LOGS_ROOT_PATH}/logs:/opt/hgcapp/services-hedera/HapiApp2.0/output"
  - "${APPLICATION_ROOT_PATH}/data/keys:/opt/hgcapp/services-hedera/HapiApp2.0/data/keys"
  - "${NETWORK_NODE_LOGS_ROOT_PATH}/stats:/opt/hgcapp/services-hedera/HapiApp2.0/data/stats"
  - "${APPLICATION_ROOT_PATH}/config.multinode.txt:/opt/hgcapp/services-hedera/HapiApp2.0/config.txt"
  - "${APPLICATION_ROOT_PATH}/settings.txt:/opt/hgcapp/services-hedera/HapiApp2.0/settings.txt"
  - "${APPLICATION_ROOT_PATH}/log4j2.xml:/opt/hgcapp/services-hedera/HapiApp2.0/log4j2.xml"
  - "${APPLICATION_ROOT_PATH}/hedera.crt:/opt/hgcapp/services-hedera/HapiApp2.0/hedera.crt"
  - "${APPLICATION_ROOT_PATH}/hedera.key:/opt/hgcapp/services-hedera/HapiApp2.0/hedera.key"
  - "${APPLICATION_CONFIG_PATH}/CNtoBNConfig/2to1/CN1/block-nodes.json:/opt/hgcapp/data/config/block-nodes.json"

x-second-block-node-volumes: &second-block-node-volumes
  - "${NETWORK_NODE_LOGS_ROOT_PATH}/accountBalances:/opt/hgcapp/accountBalances"
  - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams:/opt/hgcapp/recordStreams"
  - "${APPLICATION_CONFIG_PATH}:/opt/hgcapp/services-hedera/HapiApp2.0/data/config"
  - "${NETWORK_NODE_LOGS_ROOT_PATH}/logs:/opt/hgcapp/services-hedera/HapiApp2.0/output"
  - "${APPLICATION_ROOT_PATH}/data/keys:/opt/hgcapp/services-hedera/HapiApp2.0/data/keys"
  - "${NETWORK_NODE_LOGS_ROOT_PATH}/stats:/opt/hgcapp/services-hedera/HapiApp2.0/data/stats"
  - "${APPLICATION_ROOT_PATH}/config.multinode.txt:/opt/hgcapp/services-hedera/HapiApp2.0/config.txt"
  - "${APPLICATION_ROOT_PATH}/settings.txt:/opt/hgcapp/services-hedera/HapiApp2.0/settings.txt"
  - "${APPLICATION_ROOT_PATH}/log4j2.xml:/opt/hgcapp/services-hedera/HapiApp2.0/log4j2.xml"
  - "${APPLICATION_ROOT_PATH}/hedera.crt:/opt/hgcapp/services-hedera/HapiApp2.0/hedera.crt"
  - "${APPLICATION_ROOT_PATH}/hedera.key:/opt/hgcapp/services-hedera/HapiApp2.0/hedera.key"
  - "${APPLICATION_CONFIG_PATH}/CNtoBNConfig/2to1/CN2/block-nodes.json:/opt/hgcapp/data/config/block-nodes.json"

services:
  network-node:
    healthcheck:
      test:
        [
          "CMD",
          "grep",
          "-E",
          "Now current platform status = ACTIVE|OBSERVING|CHECKING",
          "/opt/hgcapp/services-hedera/HapiApp2.0/output/hgcaa.log"
        ]
      interval: 30s
      timeout: 10s
      retries: 10
      start_period: 10s
    volumes:
      - "${APPLICATION_ROOT_PATH}/config.multinode.txt:/opt/hgcapp/services-hedera/HapiApp2.0/config.txt"

  network-node-1:
    &network-node-definition
    image: "${NETWORK_NODE_IMAGE_PREFIX}${NETWORK_NODE_IMAGE_NAME}:${NETWORK_NODE_IMAGE_TAG}"
    container_name: network-node-1
    user: root
    mem_swappiness: 0
    mem_limit: "${NETWORK_NODE_MEM_LIMIT}"
    memswap_limit: "${NETWORK_NODE_MEM_LIMIT}"
    environment:
      JAVA_HEAP_MIN: "${PLATFORM_JAVA_HEAP_MIN}"
      JAVA_HEAP_MAX: "${PLATFORM_JAVA_HEAP_MAX}"
      JAVA_OPTS: "${PLATFORM_JAVA_OPTS}"
      CONSENSUS_NODE_ID: "1"
    healthcheck:
      test:
        [
          "CMD",
          "grep",
          "-E",
          "Now current platform status = ACTIVE|OBSERVING|CHECKING",
          "/opt/hgcapp/services-hedera/HapiApp2.0/output/hgcaa.log"
        ]
      interval: 30s
      timeout: 10s
      retries: 10
      start_period: 10s
    depends_on:
      haveged:
        condition: service_started
      record-streams-uploader:
        condition: service_started
      network-node:
        condition: service_healthy
    networks:
      network-node-bridge:
        ipv4_address: 172.27.0.11
    ports:
      - "51211:50211"
      - "51212:50212"
    volumes: *first-block-node-volumes

  network-node-2:
    <<: *network-node-definition
    container_name: network-node-2
    environment:
      JAVA_HEAP_MIN: "${PLATFORM_JAVA_HEAP_MIN}"
      JAVA_HEAP_MAX: "${PLATFORM_JAVA_HEAP_MAX}"
      JAVA_OPTS: "${PLATFORM_JAVA_OPTS}"
      CONSENSUS_NODE_ID: "2"  
    depends_on:
      haveged:
        condition: service_started
      record-streams-uploader:
        condition: service_started
      network-node-1:
        condition: service_healthy
    networks:
      network-node-bridge:
        ipv4_address: 172.27.0.12
    ports:
      - "52211:50211"
      - "52212:50212"
    volumes: *second-block-node-volumes

  network-node-3:
    <<: *network-node-definition
    container_name: network-node-3
    environment:
      JAVA_HEAP_MIN: "${PLATFORM_JAVA_HEAP_MIN}"
      JAVA_HEAP_MAX: "${PLATFORM_JAVA_HEAP_MAX}"
      JAVA_OPTS: "${PLATFORM_JAVA_OPTS}"
      CONSENSUS_NODE_ID: "3"    
    depends_on:
      haveged:
        condition: service_started
      record-streams-uploader:
        condition: service_started
      network-node-2:
        condition: service_healthy
    networks:
      network-node-bridge:
        ipv4_address: 172.27.0.13
    ports:
      - "53211:50211"
      - "53212:50212"
    volumes: *second-block-node-volumes

  record-streams-uploader-1:
    extends:
      file: docker-compose.yml
      service: record-streams-uploader
    container_name: record-streams-uploader-1
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "recordstreams/record0.0.4"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams/record0.0.4:/records"

  record-streams-uploader-2:
    extends:
      file: docker-compose.yml
      service: record-streams-uploader
    container_name: record-streams-uploader-2
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "recordstreams/record0.0.5"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams/record0.0.5:/records"

  record-streams-uploader-3:
    extends:
      file: docker-compose.yml
      service: record-streams-uploader
    container_name: record-streams-uploader-3
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "recordstreams/record0.0.6"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams/record0.0.6:/records"

  account-balances-uploader-1:
    extends:
      file: docker-compose.yml
      service: account-balances-uploader
    container_name: account-balances-uploader-1
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "accountBalances/balance0.0.4"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/accountBalances/balance0.0.4:/balances"

  account-balances-uploader-2:
    extends:
      file: docker-compose.yml
      service: account-balances-uploader
    container_name: account-balances-uploader-2
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "accountBalances/balance0.0.5"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/accountBalances/balance0.0.5:/balances"

  account-balances-uploader-3:
    extends:
      file: docker-compose.yml
      service: account-balances-uploader
    container_name: account-balances-uploader-3
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "accountBalances/balance0.0.6"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/accountBalances/balance0.0.6:/balances"

  record-sidecar-uploader-1:
    extends:
      file: docker-compose.yml
      service: record-sidecar-uploader
    container_name: record-sidecar-uploader-1
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "recordstreams/record0.0.4/sidecar"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams/record0.0.4/sidecar:/sidecar-files"

  record-sidecar-uploader-2:
    extends:
      file: docker-compose.yml
      service: record-sidecar-uploader
    container_name: record-sidecar-uploader-2
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "recordstreams/record0.0.5/sidecar"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams/record0.0.5/sidecar:/sidecar-files"

  record-sidecar-uploader-3:
    extends:
      file: docker-compose.yml
      service: record-sidecar-uploader
    container_name: record-sidecar-uploader-3
    depends_on:
      minio:
        condition: service_started
    environment:
      BUCKET_PATH: "recordstreams/record0.0.6/sidecar"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams/record0.0.6/sidecar:/sidecar-files"

  importer:
    volumes:
      - ./compose-network/mirror-node/addressBook.multinode.bin:/usr/etc/hedera-mirror-importer/local-dev-1-node.addressbook.f102.json.bin

  monitor:
    depends_on:
      grpc:
        condition: service_started
      rest:
        condition: service_started
      network-node:
        condition: service_healthy
      network-node-1:
        condition: service_healthy
      network-node-2:
        condition: service_healthy
      network-node-3:
        condition: service_healthy