version: "3.7" x-bootstrap-environment: &bootstrap_env BOOTSTRAP_IP: 10.2.0.100 BOOTSTRAP_MULTIADDRESS: "/ip4/10.2.0.100/tcp/60000/p2p/16Uiu2HAmGNtM2rQ8abySFNhqPDFY4cmfAEpfo9Z9fD3NekoFR2ip" BOOTSTRAP_ENR: "enr:-LG4QK3uc1orOi79J5eAprzwyfj4QcYaR_oamz1YY0U3PmaRY807UrJTkQJiSDT8PNmIPwxIw9POrel-sf1OOTlcK9UCgmlkgnY0gmlwhAoCAGSKbXVsdGlhZGRyc4oACAQKAgBkBupggnJzhQBCAQAAiXNlY3AyNTZrMaEDN06qX-XhZ-Cc7ZuIAdGNCVUicscmbFvEEfkFOQ2W_j2DdGNwgupgg3VkcIIjKIV3YWt1MgA" x-servicenode-environment: &servicenode_env SERVICENODE_IP: 10.2.0.101 SERVICENODE_MULTIADDRESS: "/ip4/10.2.0.101/tcp/60001/p2p/16Uiu2HAkyte8uj451tGkbww4Mjcg6DRnmAHxNeWyF4zp23RbpG3n" SERVICENODE_WS_MULTIADDRESS: "/ip4/10.2.0.101/tcp/8000/ws/p2p/16Uiu2HAkyte8uj451tGkbww4Mjcg6DRnmAHxNeWyF4zp23RbpG3n" SERVICENODE_ENR: "enr:-LO4QDhRxZ-YJBeiriq07BkSiA-qSJCcy3Kz7bAWXeop48dIPpsQK2QNuDX7umonw3Wu0zFXXoMxGrIFmpQiJ1mBd_sBgmlkgnY0gmlwhAoCAGWKbXVsdGlhZGRyc4wACgQKAgBlBh9A3QOCcnOFAEIBAACJc2VjcDI1NmsxoQJCV1iKpD3kj-6EDB8QIiRtUZE3-g0OK1QbmXL2OoziNYN0Y3CC6mCDdWRwgiMohXdha3UyDw" x-edgenode-environment: &edgenode_env EDGENODE_IP: 10.2.0.102 EDGENODE_MULTIADDRESS: "/ip4/10.2.0.102/tcp/60002/p2p/16Uiu2HAm5tojCrfxXrum5VxAVtCQk6h1jkA2Ecy447rQkKwwgf51" EDGENODE_ENR: "enr:-KC4QAsSQM0tP9Zs8UxbHl3pe7HKE_0xLNA2P5LLVCbzCArsATKeH6EK43hhQJznAKjaMcpzqbMcd3UEjYJSkahMyg4BgmlkgnY0gmlwhAoCAGaKbXVsdGlhZGRyc4CCcnOFAEIBAACJc2VjcDI1NmsxoQKbiE_1i7pL24P02qgEFs0jHaso1XPo8HmcXAfqJPjGeIN0Y3CC6mKFd2FrdTIA" x-rln-environment: &rln_env RLN_ENABLED: ${RLN_ENABLED:-true} RPC_URL: ${RPC_URL:-http://foundry:8545} RLN_CONTRACT_ADDRESS: 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 RLN_CREDENTIAL_PATH: /keystore.json RLN_CREDENTIAL_PASSWORD: passw123 RLN_RELAY_MSG_LIMIT: ${RLN_RELAY_MSG_LIMIT:-10} RLN_RELAY_EPOCH_SEC: ${RLN_RELAY_EPOCH_SEC:-60} x-pg-pass: &pg_pass test123 x-pg-user: &pg_user postgres x-pg-environment: &pg_env POSTGRES_USER: *pg_user POSTGRES_PASSWORD: *pg_pass x-pg-exporter-env: &pg_exp_env environment: POSTGRES_PASSWORD: *pg_pass DATA_SOURCE_URI: postgres?sslmode=disable DATA_SOURCE_USER: *pg_user DATA_SOURCE_PASS: *pg_pass PG_EXPORTER_EXTEND_QUERY_PATH: /etc/pgexporter/queries.yml networks: simulation: name: simulation driver: bridge ipam: driver: default config: - subnet: "10.2.0.0/24" services: # Accounts are hardcoded to 520 with the idea that nwaku nodes use up to 500 for membership registration and the last 20 are used for ad-hoc testing. # The account number and private key pairs of the last 20 accounts can be found in the Register memberships section of the Waku-simulator book. foundry: image: ghcr.io/foundry-rs/foundry:nightly-9b73e06e1fe376738b92ae081107620291d50188 labels: com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-true}' ports: - 0.0.0.0:8545:8545 command: - anvil --port=8545 --host=0.0.0.0 --accounts=520 --allow-origin=* --block-time=12 --chain-id=1234 --silent --config-out=/shared/anvil-config.txt volumes: - privatekeys-volume:/shared networks: - simulation contract-repo-deployer: image: node:hydrogen-bullseye labels: com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-true}' environment: - RLN_CONTRACT_REPO_COMMIT=${RLN_CONTRACT_REPO_COMMIT:-64df4593c6a14e43b8b0e9b396d2f4772bb08b34} - PRIVATE_KEY=${PRIVATE_KEY:-0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80} - RPC_URL=${RPC_URL:-http://foundry:8545} - ETH_FROM=${ETH_FROM:-0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266} - MAX_MESSAGE_LIMIT=${MAX_MESSAGE_LIMIT:-20} entrypoint: sh command: - '/opt/deploy_rln_contract.sh' volumes: - ./deploy_rln_contract.sh:/opt/deploy_rln_contract.sh depends_on: - foundry networks: - simulation bootstrap: image: ${NWAKU_IMAGE:-wakuorg/nwaku:latest} # container_name: bootstrap restart: on-failure labels: com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-true}' # TODO: expose some ports to inject traffic ports: - 127.0.0.1:60000:60000 - 127.0.0.1:8008:8008 - 127.0.0.1:9000:9000 - 127.0.0.1:8646:8645 entrypoint: sh command: - '/opt/run_bootstrap.sh' volumes: - ./run_bootstrap.sh:/opt/run_bootstrap.sh:Z networks: simulation: ipv4_address: 10.2.0.100 servicenode: image: ${NWAKU_IMAGE:-wakuorg/nwaku:latest} # container_name: servicenode cpuset: ${SERVICENODE_CPU_CORES:-"4"} mem_limit: ${SERVICENODE_MEM_LIMIT:-512m} restart: on-failure labels: com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-true}' ports: - 127.0.0.1:60001:60001/tcp - 127.0.0.1:60001:60001/udp - 127.0.0.1:8000:8000/tcp #WSS - 127.0.0.1:8645:8645 # Service node REST-API environment: NODEKEY: ${NODEKEY} STORAGE_SIZE: ${STORAGE_SIZE} <<: - *pg_env - *rln_env - *bootstrap_env volumes: - ./run_servicenode.sh:/opt/run_servicenode.sh:Z - privatekeys-volume:/shared entrypoint: sh command: - /opt/run_servicenode.sh depends_on: contract-repo-deployer: condition: service_completed_successfully postgres: condition: service_started networks: simulation: ipv4_address: 10.2.0.101 nwaku: image: ${NWAKU_IMAGE:-wakuorg/nwaku:latest} restart: on-failure labels: com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-true}' deploy: replicas: ${NUM_NWAKU_NODES:-5} entrypoint: sh environment: <<: - *rln_env - *bootstrap_env command: - '/opt/run_nwaku.sh' volumes: - ./run_nwaku.sh:/opt/run_nwaku.sh:Z - privatekeys-volume:/shared depends_on: contract-repo-deployer: condition: service_completed_successfully networks: - simulation edgenode: image: ${NWAKU_IMAGE:-wakuorg/nwaku:latest} # container_name: edgenode restart: on-failure ports: - 127.0.0.1:60002:60002/tcp - 127.0.0.1:60002:60002/udp - 127.0.0.1:8644:8645 # Service node REST-API entrypoint: sh environment: <<: - *servicenode_env command: - '/opt/run_edgenode.sh' volumes: - ./run_edgenode.sh:/opt/run_edgenode.sh:Z depends_on: servicenode: condition: service_started networks: simulation: ipv4_address: 10.2.0.102 prometheus: image: prom/prometheus:latest volumes: - ./monitoring/prometheus-config.yml:/etc/prometheus/prometheus.yml:z command: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.retention.time=7d ports: - 127.0.0.1:9090:9090 restart: on-failure networks: - simulation grafana: image: grafana/grafana:latest env_file: - ./monitoring/configuration/grafana-plugins.env environment: - GF_SECURITY_ADMIN_USER=${GF_SECURITY_ADMIN_USER} - GF_SECURITY_ADMIN_PASSWORD=${GF_SECURITY_ADMIN_PASSWORD} volumes: - ./monitoring/configuration/grafana.ini:/etc/grafana/grafana.ini:z - ./monitoring/configuration/dashboards.yaml:/etc/grafana/provisioning/dashboards/dashboards.yaml:z - ./monitoring/configuration/datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml:z - ./monitoring/configuration/dashboards:/var/lib/grafana/dashboards/:z - ./monitoring/configuration/customizations/custom-logo.svg:/usr/share/grafana/public/img/grafana_icon.svg:z - ./monitoring/configuration/customizations/custom-logo.svg:/usr/share/grafana/public/img/grafana_typelogo.svg:z - ./monitoring/configuration/customizations/custom-logo.png:/usr/share/grafana/public/img/fav32.png:z ports: - 0.0.0.0:3001:3001 restart: on-failure depends_on: - prometheus networks: - simulation cadvisor: image: gcr.io/cadvisor/cadvisor:latest container_name: cadvisor #ports: # - 8080:8080 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro depends_on: - redis networks: - simulation redis: image: redis:latest container_name: redis #ports: # - 6379:6379 networks: - simulation api: image: web3labs/epirus-free-api:latest ports: - 127.0.0.1:8090:8090 environment: - NODE_ENDPOINT=${RPC_URL:-http://foundry:8545} - MONGO_CLIENT_URI=mongodb://mongodb:27017 - REINDEX_ENDPOINT=http://ingestion/reindex/ - MONGO_DB_NAME=epirus - MONGO_CREATE_INDICES=true - REDIS_HOST=redis - REDIS_PORT=6379 depends_on: - redis - mongodb - foundry networks: - simulation mongodb: image: mongo:5.0.8 environment: - COMPOSE_HTTP_TIMEOUT=900 - DOCKER_CLIENT_TIMEOUT=900 entrypoint: mongod --bind_ip "0.0.0.0" networks: - simulation web: image: web3labs/epirus-free-web:latest environment: - API_URL=${EPIRUS_WEB_API_URL:-/api} - WS_API_URL=${EPIRUS_WEB_WS_API_URL:-ws://localhost:8090} - DISPLAY_NETWORK_TAB=disabled depends_on: - api networks: - simulation ingestion: image: web3labs/epirus-free-ingestion:latest environment: - NODE_ENDPOINT=${RPC_URL:-http://foundry:8545} - MONGO_CLIENT_URI=mongodb://mongodb:27017 - MONGO_DB_NAME=epirus - LIST_OF_METRICS_TO_CALCULATE_PER_MINUTE=hourly,daily,monthly,yearly depends_on: - mongodb - redis - foundry networks: - simulation nginx: image: nginx:latest volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./5xx.html:/www/error_pages/5xx.html ports: - 0.0.0.0:3000:80 depends_on: - api - web networks: - simulation postgres: # This service is used when the Waku node has the 'store' protocol enabled # and the store-message-db-url is set to use Postgres image: postgres:15.4-alpine3.18 cpuset: ${POSTGRES_CPU_CORES:-"4"} mem_limit: ${POSTGRES_MEM_LIMIT:-2g} restart: on-failure:5 shm_size: "${POSTGRES_SHM:-1g}" # Set default shared memory size to 1 GB environment: <<: *pg_env volumes: - ./postgres_cfg/postgresql.conf:/etc/postgresql/postgresql.conf:Z - ./postgres_cfg/db.sql:/docker-entrypoint-initdb.d/db.sql:Z - ${PG_DATA_DIR:-./postgresql}:/var/lib/postgresql/data:Z command: postgres -c config_file=/etc/postgresql/postgresql.conf ports: - 127.0.0.1:5432:5432 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"] interval: 30s timeout: 60s retries: 5 start_period: 80s networks: - simulation postgres-exporter: # Service aimed to scrape information from Postgres and post it to Prometeus image: quay.io/prometheuscommunity/postgres-exporter:v0.12.0 restart: on-failure:5 <<: *pg_exp_env volumes: - ./monitoring/configuration/postgres-exporter.yml:/etc/pgexporter/postgres-exporter.yml:Z - ./monitoring/configuration/pg-exporter-queries.yml:/etc/pgexporter/queries.yml:Z command: # Both the config file and 'DATA_SOURCE_NAME' should contain valid connection info - --config.file=/etc/pgexporter/postgres-exporter.yml depends_on: - postgres networks: - simulation volumes: privatekeys-volume: