@hashgraph/hedera-local
Version:
Developer tooling for running Local Hedera Network (Consensus + Mirror Nodes).
383 lines (367 loc) • 13.2 kB
YAML
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}"
healthcheck:
test:
[
"CMD",
"grep",
"-E",
"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"
- "${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"
minio:
image: 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"
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:/recordStreams"
command:
- /usr/bin/env
- ${PYTHON_VERSION}
- /usr/local/bin/mirror.py
- --linux
- --watch-directory
- /recordStreams
- --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:/accountBalances"
command:
- /usr/bin/env
- ${PYTHON_VERSION}
- /usr/local/bin/mirror.py
- --linux
- --watch-directory
- /accountBalances
- --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
grpc:
image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-grpc:${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
environment:
HEDERA_MIRROR_GRPC_DB_HOST: db
SPRING_CONFIG_ADDITIONAL_LOCATION: file:/usr/etc/hedera-mirror-grpc/
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_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
environment:
HEDERA_MIRROR_IMPORTER_DB_HOST: db
SPRING_CONFIG_ADDITIONAL_LOCATION: file:/usr/etc/hedera-mirror-importer/
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
monitor:
image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-monitor:${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
network-node:
condition: service_healthy
networks:
- mirror-node
- network-node-bridge
environment:
SPRING_CONFIG_ADDITIONAL_LOCATION: "file:/usr/etc/hedera-mirror-monitor/"
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"
relay:
image: "${RELAY_IMAGE_PREFIX}hedera-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:
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}"
ports:
- "7546:7546"
restart: unless-stopped
tty: false
relay-ws:
image: "${RELAY_IMAGE_PREFIX}hedera-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:
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"]
networks:
network-node-bridge:
name: hedera-network-node-bridge
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