services:
  haveged:
    image: "${HAVEGED_IMAGE_PREFIX}network-node-haveged:${HAVEGED_IMAGE_TAG}"
    container_name: haveged
    restart: always
    mem_swappiness: 0
    privileged: true
    network_mode: none
    command: ["-d 16"]

  network-node:
    image: "${NETWORK_NODE_IMAGE_PREFIX}${NETWORK_NODE_IMAGE_NAME}:${NETWORK_NODE_IMAGE_TAG}"
    container_name: network-node
    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}"
      JAVA_TOOL_OPTIONS: "${PLATFORM_JAVA_OPTS}"
      CONSENSUS_NODE_ID: "0"
    healthcheck:
      test:
        [
          "CMD",
          "grep",
          "-Ei",
          "Now current platform status = ACTIVE|Hedera - HederaNode#0 is ACTIVE",
          "/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
    networks:
      network-node-bridge:
        ipv4_address: 172.27.0.3
    ports:
      - "50211:50211"
      - "50212:50212"
      - "9999:9999"
    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"
      - "${APPLICATION_CONFIG_PATH}:/opt/hgcapp/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}/genesis-network.json:/opt/hgcapp/services-hedera/HapiApp2.0/data/config/genesis-network.json"
      - "${APPLICATION_ROOT_PATH}/config.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"

  record-streams-uploader:
    image: "${UPLOADER_IMAGE_PREFIX}uploader-mirror:${UPLOADER_IMAGE_TAG}"
    container_name: record-streams-uploader
    user: root
    restart: unless-stopped
    depends_on:
      minio:
        condition: service_started
    networks:
      - cloud-storage
    environment:
      DEBUG: "true"
      REAPER_ENABLE: "true"
      REAPER_MIN_KEEP: "1"
      REAPER_INTERVAL: "5"
      S3_ENABLE: "true"
      GCS_ENABLE: "false"
      SIG_REQUIRE: "true"
      SIG_PRIORITIZE: "true"
      SIG_EXTENSION: "rcd_sig"
      STREAM_EXTENSION: "${STREAM_EXTENSION}"
      BUCKET_NAME: "hedera-streams"
      BUCKET_PATH: "recordstreams/record0.0.3"
      S3_ACCESS_KEY: "minioadmin"
      S3_SECRET_KEY: "minioadmin"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams/record0.0.3:/records"
    command:
      - /usr/bin/env
      - ${PYTHON_VERSION}
      - /usr/local/bin/mirror.py
      - --linux
      - --watch-directory
      - /records
      - --s3-endpoint
      - http://minio:9000
      - --debug

  account-balances-uploader:
    image: "${UPLOADER_IMAGE_PREFIX}uploader-mirror:${UPLOADER_IMAGE_TAG}"
    container_name: account-balances-uploader
    user: root
    restart: unless-stopped
    depends_on:
      minio:
        condition: service_started
    networks:
      - cloud-storage
    environment:
      DEBUG: "true"
      REAPER_ENABLE: "true"
      REAPER_MIN_KEEP: "1"
      REAPER_INTERVAL: "5"
      S3_ENABLE: "true"
      GCS_ENABLE: "false"
      SIG_REQUIRE: "true"
      SIG_PRIORITIZE: "true"
      SIG_EXTENSION: "pb_sig"
      STREAM_EXTENSION: "pb"
      BUCKET_NAME: "hedera-streams"
      BUCKET_PATH: "accountBalances/balance0.0.3"
      S3_ACCESS_KEY: "minioadmin"
      S3_SECRET_KEY: "minioadmin"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/accountBalances/balance0.0.3:/balances"
    command:
      - /usr/bin/env
      - ${PYTHON_VERSION}
      - /usr/local/bin/mirror.py
      - --linux
      - --watch-directory
      - /balances
      - --s3-endpoint
      - http://minio:9000
      - --debug

  record-sidecar-uploader:
    image: "${UPLOADER_IMAGE_PREFIX}uploader-mirror:${UPLOADER_IMAGE_TAG}"
    container_name: record-sidecar-uploader
    user: root
    restart: unless-stopped
    depends_on:
      minio:
        condition: service_started
    networks:
      - cloud-storage
    environment:
      DEBUG: "true"
      REAPER_ENABLE: "true"
      REAPER_MIN_KEEP: "1"
      REAPER_INTERVAL: "5"
      S3_ENABLE: "true"
      GCS_ENABLE: "false"
      SIG_REQUIRE: "false"
      SIG_PRIORITIZE: "false"
      STREAM_EXTENSION: "rcd.gz"
      BUCKET_NAME: "hedera-streams"
      BUCKET_PATH: "recordstreams/record0.0.3/sidecar"
      S3_ACCESS_KEY: "minioadmin"
      S3_SECRET_KEY: "minioadmin"
    volumes:
      - "${NETWORK_NODE_LOGS_ROOT_PATH}/recordStreams/record0.0.3/sidecar:/sidecar-files"
    command:
      - /usr/bin/env
      - ${PYTHON_VERSION}
      - /usr/local/bin/mirror.py
      - --linux
      - --watch-directory
      - /sidecar-files
      - --s3-endpoint
      - http://minio:9000
      - --debug

  minio:
    image: ghcr.io/mhga24/minio/minio
    container_name: minio
    entrypoint: sh
    command: -c 'mkdir -p /data/hedera-streams && minio server /data --console-address ":9001"'
    environment:
      MINIO_ROOT_USER: "${MINIO_ROOT_USER}"
      MINIO_ROOT_PASSWORD: "${MINIO_ROOT_PASSWORD}"
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    networks:
      - cloud-storage
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - "minio-data:/data"

  db:
    image: "${MIRROR_POSTGRES_IMAGE}"
    container_name: mirror-node-db
    environment:
      POSTGRES_HOST_AUTH_METHOD: scram-sha-256
      POSTGRES_INITDB_ARGS: --auth-host=scram-sha-256
      GRPC_PASSWORD: mirror_grpc_pass
      IMPORTER_PASSWORD: mirror_importer_pass
      OWNER_PASSWORD: mirror_node_pass
      POSTGRES_PASSWORD: postgres_password
      REST_PASSWORD: mirror_api_pass
      ROSETTA_PASSWORD: mirror_rosetta_pass
    networks:
      - mirror-node
    ports:
      - "5433:5432"
    restart: unless-stopped
    stop_grace_period: 2m
    stop_signal: SIGTERM
    tty: true
    volumes:
      - ./compose-network/mirror-node/init.sh:/docker-entrypoint-initdb.d/init.sh
      - type: volume
        source: mirror-node-postgres
        target: /var/lib/postgresql/data

  grpc:
    image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-grpc:${MIRROR_GRPC_IMAGE_TAG:-${MIRROR_IMAGE_TAG}}"
    container_name: mirror-node-grpc
    restart: unless-stopped
    mem_swappiness: 0
    mem_limit: "${MIRROR_GRPC_MEM_LIMIT}"
    memswap_limit: "${MIRROR_GRPC_MEM_LIMIT}"
    depends_on:
      network-node:
        condition: service_started
      db:
        condition: service_started
    environment:
      HEDERA_MIRROR_GRPC_DB_HOST: db
      SPRING_CONFIG_ADDITIONAL_LOCATION: file:/usr/etc/hedera-mirror-grpc/
      JAVA_TOOL_OPTIONS: "${GRPC_PLATFORM_JAVA_OPTS}"
    networks:
      - mirror-node
    ports:
      - "5600:5600"
    volumes:
      - "${MIRROR_NODE_CONFIG_PATH}/compose-network/mirror-node/application.yml:/usr/etc/hedera-mirror-grpc/application.yml"

  importer:
    image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-importer:${MIRROR_IMPORTER_IMAGE_TAG:-${MIRROR_IMAGE_TAG}}"
    container_name: mirror-node-importer
    restart: unless-stopped
    mem_swappiness: 0
    mem_limit: "${MIRROR_IMPORTER_MEM_LIMIT}"
    memswap_limit: "${MIRROR_IMPORTER_MEM_LIMIT}"
    depends_on:
      minio:
        condition: service_started
      db:
        condition: service_started
    environment:
      HEDERA_MIRROR_IMPORTER_DB_HOST: db
      SPRING_CONFIG_ADDITIONAL_LOCATION: file:/usr/etc/hedera-mirror-importer/
      JAVA_TOOL_OPTIONS: "${GRPC_PLATFORM_JAVA_OPTS}"
    networks:
      - cloud-storage
      - mirror-node
    volumes:
      - "${MIRROR_NODE_CONFIG_PATH}/compose-network/mirror-node/application.yml:/usr/etc/hedera-mirror-importer/application.yml"
      - ./compose-network/mirror-node/addressBook.bin:/usr/etc/hedera-mirror-importer/local-dev-1-node.addressbook.f102.json.bin

  rest:
    image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-rest:${MIRROR_REST_IMAGE_TAG:-${MIRROR_IMAGE_TAG}}"
    container_name: mirror-node-rest-internal
    mem_swappiness: 0
    mem_limit: "${MIRROR_REST_MEM_LIMIT}"
    memswap_limit: "${MIRROR_REST_MEM_LIMIT}"
    depends_on:
      importer:
        condition: service_started
      db:
        condition: service_started
    environment:
      HEDERA_MIRROR_REST_DB_HOST: db
    networks:
      - mirror-node
    restart: unless-stopped
    tty: false

  rest-java:
    image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-rest-java:${MIRROR_REST_IMAGE_TAG:-${MIRROR_IMAGE_TAG}}"
    container_name: mirror-node-rest-java-internal
    mem_swappiness: 0
    mem_limit: "${MIRROR_REST_MEM_LIMIT}"
    memswap_limit: "${MIRROR_REST_MEM_LIMIT}"
    depends_on:
      importer:
        condition: service_started
      db:
        condition: service_started
    environment:
      HEDERA_MIRROR_RESTJAVA_DB_HOST: db
      SPRING_CONFIG_ADDITIONAL_LOCATION: file:/usr/etc/hedera-mirror-rest-java/
      JAVA_TOOL_OPTIONS: "${GRPC_PLATFORM_JAVA_OPTS}"
    networks:
      - mirror-node
    restart: unless-stopped
    tty: true
    volumes:
      - ./application.yml:/usr/etc/hedera-mirror-rest-java/application.yml

  api-proxy:
    container_name: mirror-node-api-proxy
    image: nginx:1-alpine
    restart: unless-stopped
    mem_swappiness: 0
    mem_limit: "${MIRROR_REST_MEM_LIMIT}"
    memswap_limit: "${MIRROR_REST_MEM_LIMIT}"
    depends_on:
      rest:
        condition: service_started
      rest-java:
        condition: service_started
    networks:
      mirror-node:
        aliases:
          - mirror-node-rest
          - mirror-node-rest-java
    ports:
      - "5551:5551"
      - "8084:8084"
    volumes:
      - "${MIRROR_NODE_CONFIG_PATH}/compose-network/nginx/api-proxy.conf:/etc/nginx/conf.d/default.conf:ro"

  explorer:
    container_name: hedera-explorer
    image: "${MIRROR_NODE_EXPLORER_IMAGE_PREFIX}hedera-mirror-node-explorer:${MIRROR_NODE_EXPLORER_IMAGE_TAG}"
    restart: "unless-stopped"
    ports:
      - "8090:8080"
    environment:
      DOCKER_LOCAL_MIRROR_NODE_MENU_NAME: ${DOCKER_LOCAL_MIRROR_NODE_MENU_NAME}
      DOCKER_LOCAL_MIRROR_NODE_URL: ${DOCKER_LOCAL_MIRROR_NODE_URL}
    networks:
      - mirror-node

  web3:
    image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-web3:${MIRROR_WEB3_IMAGE_TAG:-${MIRROR_IMAGE_TAG}}"
    container_name: mirror-node-web3
    mem_swappiness: 0
    mem_limit: "${MIRROR_WEB3_MEM_LIMIT}"
    memswap_limit: "${MIRROR_WEB3_MEM_LIMIT}"
    depends_on:
      importer:
        condition: service_started
      db:
        condition: service_started
    networks:
      - mirror-node
    environment:
      HEDERA_MIRROR_WEB3_DB_HOST: db
      HEDERA_MIRROR_WEB3_EVM_NETWORK: OTHER
      HEDERA_MIRROR_WEB3_EVM_MODULARIZEDSERVICES: ${MIRROR_WEB3_EVM_MODULARIZEDSERVICES}
      HEDERA_MIRROR_WEB3_EVM_MODULARIZEDTRAFFICPERCENT: ${MIRROR_WEB3_EVM_MODULARIZEDTRAFFICPERCENT}
      SPRING_CONFIG_ADDITIONAL_LOCATION: file:/usr/etc/hedera-mirror-web3/
      JAVA_TOOL_OPTIONS: "${GRPC_PLATFORM_JAVA_OPTS}"
    ports:
      - "8545:8545"
    restart: unless-stopped
    tty: true
    volumes:
      - "${MIRROR_NODE_CONFIG_PATH}/compose-network/mirror-node/application.yml:/usr/etc/hedera-mirror-web3/application.yml"

  monitor:
    image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-monitor:${MIRROR_MONITOR_IMAGE_TAG:-${MIRROR_IMAGE_TAG}}"
    container_name: mirror-node-monitor
    mem_swappiness: 0
    mem_limit: "${MIRROR_MONITOR_MEM_LIMIT}"
    memswap_limit: "${MIRROR_MONITOR_MEM_LIMIT}"
    depends_on:
      grpc:
        condition: service_started
      rest:
        condition: service_started
      network-node:
        condition: service_healthy
    networks:
      - mirror-node
      - network-node-bridge
    environment:
      SPRING_CONFIG_ADDITIONAL_LOCATION: "file:/usr/etc/hedera-mirror-monitor/"
      JAVA_TOOL_OPTIONS: "${GRPC_PLATFORM_JAVA_OPTS}"
    ports:
      - "8082:8082"
    restart: unless-stopped
    tty: true
    volumes:
      - "${MIRROR_NODE_CONFIG_PATH}/compose-network/mirror-node/application.yml:/usr/etc/hedera-mirror-monitor/application.yml"

  block-node:
    image: "${BLOCK_NODE_IMAGE_PREFIX}hiero-block-node:${BLOCK_NODE_IMAGE_TAG}"
    container_name: block-node
    networks:
      - network-node-bridge
      - mirror-node
    environment:
      VERSION: ${BLOCK_NODE_IMAGE_TAG}
      REGISTRY_PREFIX: ${BLOCK_NODE_REGISTRY_PREFIX}
      BLOCKNODE_STORAGE_ROOT_PATH: ${BLOCK_NODE_STORAGE_ROOT_PATH}
      JAVA_OPTS: ${BLOCK_NODE_JAVA_OPTS}
    ports:
      - "40840:40840"
      - "5005:5005"
      - "16007:16007"
      - "8849:8849"

  cadvisor:
    image: "gcr.io/cadvisor/cadvisor:v0.47.0"
    container_name: cadvisor
    ports:
      - "8081:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    
  relay:
    image: "${RELAY_IMAGE_PREFIX}hiero-json-rpc-relay:${RELAY_IMAGE_TAG}"
    container_name: json-rpc-relay
    mem_swappiness: 0
    mem_limit: "${RELAY_MEM_LIMIT}"
    memswap_limit: "${RELAY_MEM_LIMIT}"
    depends_on:
      rest:
        condition: service_started
      network-node:
        condition: service_healthy
    networks:
      - mirror-node
      - network-node-bridge
    environment:
      HEDERA_NETWORK: "${RELAY_HEDERA_NETWORK}"
      OPERATOR_ID_MAIN: "${RELAY_OPERATOR_ID_MAIN}"
      OPERATOR_KEY_MAIN: "${RELAY_OPERATOR_KEY_MAIN}"
      CHAIN_ID: "${RELAY_CHAIN_ID}"
      MIRROR_NODE_URL: "${RELAY_MIRROR_NODE_URL}"
      MIRROR_NODE_URL_WEB3: "${RELAY_MIRROR_NODE_URL_WEB3}"
      MIRROR_NODE_RETRIES: "${RELAY_MIRROR_NODE_RETRIES}"
      MIRROR_NODE_RETRY_DELAY: "${RELAY_MIRROR_NODE_RETRY_DELAY}"
      LOCAL_NODE: "${RELAY_LOCAL_NODE}"
      SERVER_PORT: "${RELAY_SERVER_PORT}"
      E2E_RELAY_HOST: "${RELAY_E2E_HOST}"
      FEE_HISTORY_MAX_RESULTS: "${RELAY_FEE_HISTORY_MAX_RESULTS}"
      DEFAULT_RATE_LIMIT: "${RELAY_DEFAULT_RATE_LIMIT}"
      TIER_1_RATE_LIMIT: "${RELAY_TIER_1_RATE_LIMIT}"
      TIER_2_RATE_LIMIT: "${RELAY_TIER_2_RATE_LIMIT}"
      TIER_3_RATE_LIMIT: "${RELAY_TIER_3_RATE_LIMIT}"
      ETH_CALL_DEFAULT_TO_CONSENSUS_NODE: "${RELAY_ETH_CALL_DEFAULT_TO_CONSENSUS_NODE}"
      LIMIT_DURATION: "${RELAY_LIMIT_DURATION}"
      HBAR_RATE_LIMIT_TINYBAR: "${RELAY_HBAR_RATE_LIMIT_TINYBAR}"
      HBAR_RATE_LIMIT_DURATION: "${RELAY_HBAR_RATE_LIMIT_DURATION}"
      ETH_GET_LOGS_BLOCK_RANGE_LIMIT: "${RELAY_ETH_GET_LOGS_BLOCK_RANGE_LIMIT}"
      DEV_MODE: "${RELAY_DEV_MODE}"
      INPUT_SIZE_LIMIT: "${RELAY_INPUT_SIZE_LIMIT}"
      RATE_LIMIT_DISABLED: "${RELAY_RATE_LIMIT_DISABLED}"
      ETH_POPULATE_SYNTHETIC_CONTRACT_RESULTS: "${RELAY_ETH_POPULATE_SYNTHETIC_CONTRACT_RESULTS}"
      REDIS_ENABLED: "${RELAY_REDIS_ENABLED}"
      REDIS_URL: "${RELAY_REDIS_URL}"
      MIRROR_NODE_GET_CONTRACT_RESULTS_RETRIES: "${RELAY_MIRROR_NODE_GET_CONTRACT_RESULTS_RETRIES}"
      DEBUG_API_ENABLED: "${RELAY_DEBUG_API_ENABLED}"
      HBAR_RATE_LIMIT_BASIC: "${RELAY_HBAR_RATE_LIMIT_BASIC}"
      HBAR_RATE_LIMIT_EXTENDED: "${RELAY_HBAR_RATE_LIMIT_EXTENDED}"
      HBAR_RATE_LIMIT_PRIVILEGED: "${RELAY_HBAR_RATE_LIMIT_PRIVILEGED}"
    ports:
      - "7546:7546"
    restart: unless-stopped
    tty: false

  relay-ws:
    image: "${RELAY_IMAGE_PREFIX}hiero-json-rpc-relay:${RELAY_IMAGE_TAG}"
    container_name: json-rpc-relay-ws
    mem_swappiness: 0
    mem_limit: "${RELAY_MEM_LIMIT}"
    memswap_limit: "${RELAY_MEM_LIMIT}"
    depends_on:
      rest:
        condition: service_started
      network-node:
        condition: service_healthy
    networks:
      - mirror-node
      - network-node-bridge
    environment:
      HEDERA_NETWORK: "${RELAY_HEDERA_NETWORK}"
      OPERATOR_ID_MAIN: "${RELAY_OPERATOR_ID_MAIN}"
      OPERATOR_KEY_MAIN: "${RELAY_OPERATOR_KEY_MAIN}"
      CHAIN_ID: "${RELAY_CHAIN_ID}"
      MIRROR_NODE_URL: "${RELAY_MIRROR_NODE_URL}"
      MIRROR_NODE_RETRIES: "${RELAY_MIRROR_NODE_RETRIES}"
      MIRROR_NODE_RETRY_DELAY: "${RELAY_MIRROR_NODE_RETRY_DELAY}"
      LOCAL_NODE: "${RELAY_LOCAL_NODE}"
      SERVER_PORT: "${RELAY_SERVER_PORT}"
      E2E_RELAY_HOST: "${RELAY_E2E_HOST}"
      FEE_HISTORY_MAX_RESULTS: "${RELAY_FEE_HISTORY_MAX_RESULTS}"
      DEFAULT_RATE_LIMIT: "${RELAY_DEFAULT_RATE_LIMIT}"
      TIER_1_RATE_LIMIT: "${RELAY_TIER_1_RATE_LIMIT}"
      TIER_2_RATE_LIMIT: "${RELAY_TIER_2_RATE_LIMIT}"
      TIER_3_RATE_LIMIT: "${RELAY_TIER_3_RATE_LIMIT}"
      ETH_CALL_DEFAULT_TO_CONSENSUS_NODE: "${RELAY_ETH_CALL_DEFAULT_TO_CONSENSUS_NODE}"
      LIMIT_DURATION: "${RELAY_LIMIT_DURATION}"
      HBAR_RATE_LIMIT_TINYBAR: "${RELAY_HBAR_RATE_LIMIT_TINYBAR}"
      HBAR_RATE_LIMIT_DURATION: "${RELAY_HBAR_RATE_LIMIT_DURATION}"
      ETH_GET_LOGS_BLOCK_RANGE_LIMIT: "${RELAY_ETH_GET_LOGS_BLOCK_RANGE_LIMIT}"
      DEV_MODE: "${RELAY_DEV_MODE}"
      INPUT_SIZE_LIMIT: "${RELAY_INPUT_SIZE_LIMIT}"
      RATE_LIMIT_DISABLED: "${RELAY_RATE_LIMIT_DISABLED}"
      SUBSCRIPTIONS_ENABLED: true
      HEALTHCHECK_PORT: 8547
      ETH_POPULATE_SYNTHETIC_CONTRACT_RESULTS: "${RELAY_ETH_POPULATE_SYNTHETIC_CONTRACT_RESULTS}"
      REDIS_ENABLED: "${RELAY_REDIS_ENABLED}"
      REDIS_URL: "${RELAY_REDIS_URL}"
      WS_CONNECTION_LIMIT_PER_IP: "${RELAY_WS_CONNECTION_LIMIT_PER_IP}"
      WS_CONNECTION_LIMIT: "${RELAY_WS_CONNECTION_LIMIT}"
      WS_MAX_INACTIVITY_TTL: "${RELAY_WS_MAX_INACTIVITY_TTL}"
      WS_MULTIPLE_ADDRESSES_ENABLED: "${RELAY_WS_MULTIPLE_ADDRESSES_ENABLED}"
      WS_SUBSCRIPTION_LIMIT: "${RELAY_WS_SUBSCRIPTION_LIMIT}"
    ports:
      - "8546:8546"
      - "8547:8547"
    restart: unless-stopped
    tty: false
    command: ["start:ws"]

  envoy:
    image: "${ENVOY_IMAGE_PREFIX}envoy:${ENVOY_IMAGE_TAG}"
    container_name: envoy-proxy
    ports:
      - "50213:50213"
    volumes:
      - ./envoy.yaml:/etc/envoy/envoy.yaml
    networks:
      - network-node-bridge

  prometheus:
    image: "${PROMETHEUS_IMAGE_NAME}:${PROMETHEUS_IMAGE_TAG}"
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./compose-network/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'
    ports:
      - "9090:9090"
    networks:
      network-node-bridge:
        ipv4_address: 172.27.0.4
      mirror-node:
        

  grafana:
    image: "${GRAFANA_IMAGE_NAME}:${GRAFANA_IMAGE_TAG}"
    container_name: grafana
    ports:
      - "3000:3000"
    restart: unless-stopped
    environment:
      GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true"
      GF_AUTH_ANONYMOUS_ENABLED: "true"
      GF_AUTH_ANONYMOUS_ORG_ROLE: "Admin"
      GF_AUTH_DISABLE_SIGNOUT_MENU: "true"
      GF_AUTH_DISABLE_LOGIN_FORM: "true"
    volumes:
      - ./compose-network/grafana/datasources:/etc/grafana/provisioning/datasources
      - ./compose-network/grafana/dashboards:/etc/grafana/provisioning/dashboards
      - grafana-data:/var/lib/grafana
    networks:
      network-node-bridge:
        ipv4_address: 172.27.0.5
      mirror-node:

  cache:
    image: ghcr.io/mhga24/redis:6-alpine
    container_name: relay-cache
    mem_limit: "${RELAY_MEM_LIMIT}"
    memswap_limit: "${RELAY_MEM_LIMIT}"
    ports:
      - 6379:6379
    restart: unless-stopped
    stop_signal: SIGTERM
    tty: true
    networks:
      network-node-bridge:
        ipv4_address: 172.27.0.50

networks:
  network-node-bridge:
    name: hedera-network-node
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.27.0.0/16
          ip_range: 172.27.0.0/24
          gateway: 172.27.0.254
  mirror-node:
    name: hedera-mirror-node
    driver: bridge
  cloud-storage:
    name: hedera-cloud-storage
    driver: bridge

volumes:
  mirror-node-postgres:
    name: mirror-node-postgres
  minio-data:
    name: minio-data
  prometheus-data:
    name: prometheus-data
  grafana-data:
    name: grafana-data
