services: postgres: container_name: postgres-pezkuwi image: postgres:16-alpine ports: - 5432:5432 volumes: - pgdata:/var/lib/postgresql/data - ./docker/init:/docker-entrypoint-initdb.d healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 10 environment: POSTGRES_PASSWORD: pezkuwi_subquery_2024 restart: always subquery-node-relay: container_name: node-pezkuwi-relay build: context: . dockerfile: docker/Dockerfile.node depends_on: postgres: { condition: service_healthy } restart: always environment: TZ: UTC DB_USER: postgres DB_PASS: pezkuwi_subquery_2024 DB_DATABASE: postgres DB_HOST: postgres DB_PORT: 5432 volumes: - ./:/app/project command: - -f=/app/project/pezkuwi.yaml - --db-schema=subquery-pezkuwi-staking - --disable-historical=true - --batch-size=30 subquery-node-assethub: container_name: node-pezkuwi-assethub build: context: . dockerfile: docker/Dockerfile.node depends_on: postgres: { condition: service_healthy } restart: always environment: TZ: UTC DB_USER: postgres DB_PASS: pezkuwi_subquery_2024 DB_DATABASE: postgres DB_HOST: postgres DB_PORT: 5432 volumes: - ./:/app/project command: - -f=/app/project/pezkuwi-assethub.yaml - --db-schema=subquery-pezkuwi-assethub - --disable-historical=true - --batch-size=30 graphql-engine: container_name: query-pezkuwi image: onfinality/subql-query:v1.5.0 ports: - 3000:3000 depends_on: - subquery-node-relay restart: always environment: DB_USER: postgres DB_PASS: pezkuwi_subquery_2024 DB_DATABASE: postgres DB_HOST: postgres DB_PORT: 5432 command: - --name=subquery-pezkuwi-staking - --playground - --indexer=http://subquery-node-relay:3000 graphql-engine-assethub: container_name: query-pezkuwi-ah image: onfinality/subql-query:v1.5.0 ports: - 3001:3000 depends_on: - subquery-node-assethub restart: always environment: DB_USER: postgres DB_PASS: pezkuwi_subquery_2024 DB_DATABASE: postgres DB_HOST: postgres DB_PORT: 5432 command: - --name=subquery-pezkuwi-assethub - --playground - --indexer=http://subquery-node-assethub:3000 subquery-node-governance: container_name: node-pezkuwi-governance build: context: . dockerfile: docker/Dockerfile.node depends_on: postgres: { condition: service_healthy } restart: always environment: TZ: UTC DB_USER: postgres DB_PASS: pezkuwi_subquery_2024 DB_DATABASE: postgres DB_HOST: postgres DB_PORT: 5432 volumes: - ./:/app/project command: - -f=/app/project/pezkuwi-governance.yaml - --db-schema=subquery-pezkuwi-governance - --disable-historical=true - --batch-size=30 graphql-engine-governance: container_name: query-pezkuwi-gov image: onfinality/subql-query:v1.5.0 ports: - 3002:3000 depends_on: - subquery-node-governance restart: always environment: DB_USER: postgres DB_PASS: pezkuwi_subquery_2024 DB_DATABASE: postgres DB_HOST: postgres DB_PORT: 5432 command: - --name=subquery-pezkuwi-governance - --playground - --indexer=http://subquery-node-governance:3000 noter-bot: container_name: noter-pezkuwi build: context: ./noter dockerfile: Dockerfile depends_on: postgres: { condition: service_healthy } restart: unless-stopped secrets: - noter_mnemonic environment: TZ: UTC # The block-producing nodes bind their RPC to localhost by design — reaching # them from here needed the ports open to the internet, and closing them (as # they should be) silently cut this bot off from every chain. These are the # public endpoints, which is what an external client is supposed to use, and # they are TLS-terminated rather than plaintext ws:// across the internet. RELAY_RPC: wss://rpc.pezkuwichain.io ASSET_HUB_RPC: wss://asset-hub-rpc.pezkuwichain.io PEOPLE_RPC: wss://people-rpc.pezkuwichain.io SCAN_INTERVAL_MS: "300000" # The bot writes a heartbeat when a scan completes, not when it merely stays # up: an endless reconnect loop kept the container "Up" for three weeks while # no staking data reached the People chain. healthcheck: test: ["CMD", "node", "-e", "const fs=require('fs');const i=parseInt(process.env.SCAN_INTERVAL_MS||'300000',10);let t=0;try{t=Number(fs.readFileSync(process.env.HEARTBEAT_FILE||'/tmp/noter-heartbeat','utf8'))}catch{};process.exit(Number.isFinite(t)&&Date.now()-t