services: alice: build: context: . dockerfile: Dockerfile image: datahavenxyz/datahaven:local platform: linux/amd64 container_name: datahaven-alice hostname: alice user: "root" # Run as root to allow key injection, entrypoint switches to datahaven user networks: - datahaven-network ports: # Alice gets the standard port mappings - "9944:9944" # WebSocket/RPC - "9615:9615" # Prometheus metrics - "30333:30333" # P2P networking environment: - NODE_NAME=alice - NODE_TYPE=validator - CHAIN=stagenet-local - SEED=bottom drive obey lake curtain smoke basket hold race lonely fit walk - RPC_PORT=9944 entrypoint: ["/scripts/docker-entrypoint.sh"] command: - --alice - --chain=stagenet-local - --unsafe-force-node-key-generation - --base-path=/data - --keystore-path=/data/keystore - --validator - --discover-local - --no-prometheus - --unsafe-rpc-external - --rpc-cors=all - --force-authoring - --no-telemetry - --enable-offchain-indexing=true - --pool-type=fork-aware volumes: - ./scripts/docker-entrypoint.sh:/scripts/docker-entrypoint.sh:ro - ./scripts/docker-healthcheck.sh:/scripts/docker-healthcheck.sh:ro - alice-keystore:/data/keystore healthcheck: test: ["CMD-SHELL", "/scripts/docker-healthcheck.sh"] interval: 10s timeout: 5s retries: 5 start_period: 30s restart: unless-stopped bob: build: context: . dockerfile: Dockerfile image: datahavenxyz/datahaven:local platform: linux/amd64 container_name: datahaven-bob hostname: bob user: "root" # Run as root to allow key injection, entrypoint switches to datahaven user networks: - datahaven-network ports: # Bob gets different ports to avoid conflicts with Alice - "9945:9944" # WebSocket/RPC - "9616:9615" # Prometheus metrics - "30334:30333" # P2P networking environment: - NODE_NAME=bob - NODE_TYPE=validator - CHAIN=stagenet-local - SEED=bottom drive obey lake curtain smoke basket hold race lonely fit walk - RPC_PORT=9944 entrypoint: ["/scripts/docker-entrypoint.sh"] command: - --bob - --chain=stagenet-local - --unsafe-force-node-key-generation - --base-path=/data - --keystore-path=/data/keystore - --validator - --discover-local - --no-prometheus - --unsafe-rpc-external - --rpc-cors=all - --no-telemetry - --enable-offchain-indexing=true - --pool-type=fork-aware volumes: - ./scripts/docker-entrypoint.sh:/scripts/docker-entrypoint.sh:ro - ./scripts/docker-healthcheck.sh:/scripts/docker-healthcheck.sh:ro - bob-keystore:/data/keystore healthcheck: test: ["CMD-SHELL", "/scripts/docker-healthcheck.sh"] interval: 10s timeout: 5s retries: 5 start_period: 30s restart: unless-stopped depends_on: alice: condition: service_healthy msp: build: context: . dockerfile: Dockerfile image: datahavenxyz/datahaven:local platform: linux/amd64 container_name: datahaven-msp hostname: msp user: "root" # Run as root to allow key injection, entrypoint switches to datahaven user networks: - datahaven-network ports: # MSP gets different ports to avoid conflicts with validators - "9946:9944" # WebSocket/RPC - "9617:9615" # Prometheus metrics - "30335:30333" # P2P networking environment: - NODE_NAME=charlie - NODE_TYPE=msp - SEED=bottom drive obey lake curtain smoke basket hold race lonely fit walk entrypoint: ["/scripts/docker-entrypoint.sh"] command: - --name=msp - --chain=stagenet-local - --unsafe-force-node-key-generation - --base-path=/data - --keystore-path=/data/keystore - --discover-local - --unsafe-rpc-external - --rpc-cors=all - --no-prometheus - --no-telemetry - --enable-offchain-indexing=true - --pool-type=fork-aware - --provider - --provider-type=msp - --msp-charging-period=100 - --max-storage-capacity=1073741824 - --jump-capacity=104857600 - --msp-distribute-files volumes: - ./scripts/docker-entrypoint.sh:/scripts/docker-entrypoint.sh:ro - msp-keystore:/data/keystore restart: unless-stopped depends_on: alice: condition: service_healthy bob: condition: service_healthy bsp01: build: context: . dockerfile: Dockerfile image: datahavenxyz/datahaven:local platform: linux/amd64 container_name: datahaven-bsp01 hostname: bsp01 user: "root" # Run as root to allow key injection, entrypoint switches to datahaven user networks: - datahaven-network ports: # BSP gets different ports to avoid conflicts with validators - "9947:9944" # WebSocket/RPC - "9618:9615" # Prometheus metrics - "30336:30333" # P2P networking environment: - NODE_NAME=dave - NODE_TYPE=bsp - SEED=bottom drive obey lake curtain smoke basket hold race lonely fit walk entrypoint: ["/scripts/docker-entrypoint.sh"] command: - --name=bsp01 - --chain=stagenet-local - --unsafe-force-node-key-generation - --base-path=/data - --keystore-path=/data/keystore - --discover-local - --unsafe-rpc-external - --rpc-cors=all - --no-prometheus - --no-telemetry - --enable-offchain-indexing=true - --pool-type=fork-aware - --provider - --provider-type=bsp - --max-storage-capacity=1073741824 - --jump-capacity=104857600 volumes: - ./scripts/docker-entrypoint.sh:/scripts/docker-entrypoint.sh:ro - bsp01-keystore:/data/keystore restart: unless-stopped depends_on: alice: condition: service_healthy bob: condition: service_healthy msp: condition: service_started bsp02: build: context: . dockerfile: Dockerfile image: datahavenxyz/datahaven:local platform: linux/amd64 container_name: datahaven-bsp02 hostname: bsp02 user: "root" # Run as root to allow key injection, entrypoint switches to datahaven user networks: - datahaven-network ports: # BSP gets different ports to avoid conflicts with validators - "9948:9944" # WebSocket/RPC - "9619:9615" # Prometheus metrics - "30337:30333" # P2P networking environment: - NODE_NAME=eve - NODE_TYPE=bsp - SEED=bottom drive obey lake curtain smoke basket hold race lonely fit walk entrypoint: ["/scripts/docker-entrypoint.sh"] command: - --name=bsp02 - --chain=stagenet-local - --unsafe-force-node-key-generation - --base-path=/data - --keystore-path=/data/keystore - --discover-local - --unsafe-rpc-external - --rpc-cors=all - --no-prometheus - --no-telemetry - --enable-offchain-indexing=true - --pool-type=fork-aware - --provider - --provider-type=bsp - --max-storage-capacity=1073741824 - --jump-capacity=104857600 volumes: - ./scripts/docker-entrypoint.sh:/scripts/docker-entrypoint.sh:ro - bsp02-keystore:/data/keystore restart: unless-stopped depends_on: alice: condition: service_healthy bob: condition: service_healthy msp: condition: service_started postgres: image: postgres:18-alpine platform: linux/amd64 container_name: datahaven-postgres hostname: postgres networks: - datahaven-network ports: - "5432:5432" environment: - POSTGRES_USER=indexer - POSTGRES_PASSWORD=indexer - POSTGRES_DB=datahaven volumes: - postgres-data:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U indexer -d datahaven"] interval: 10s timeout: 5s retries: 5 indexer: build: context: . dockerfile: Dockerfile image: datahavenxyz/datahaven:local platform: linux/amd64 container_name: datahaven-indexer hostname: indexer networks: - datahaven-network ports: - "9949:9944" # WebSocket/RPC - "9620:9615" # Prometheus metrics - "30338:30333" # P2P networking environment: - CHAIN=stagenet-local command: - --name=indexer - --chain=stagenet-local - --unsafe-force-node-key-generation - --base-path=/data - --discover-local - --unsafe-rpc-external - --rpc-cors=all - --no-prometheus - --no-telemetry - --enable-offchain-indexing=true - --pool-type=fork-aware - --indexer - --indexer-mode=full - --indexer-database-url=postgresql://indexer:indexer@postgres:5432/datahaven volumes: - indexer-data:/data restart: unless-stopped depends_on: postgres: condition: service_healthy alice: condition: service_healthy bob: condition: service_healthy fisherman: build: context: . dockerfile: Dockerfile image: datahavenxyz/datahaven:local platform: linux/amd64 container_name: datahaven-fisherman hostname: fisherman user: "root" # Run as root to allow key injection, entrypoint switches to datahaven user networks: - datahaven-network ports: - "9950:9944" # WebSocket/RPC - "9621:9615" # Prometheus metrics - "30339:30333" # P2P networking environment: - NODE_NAME=gustavo - NODE_TYPE=fisherman - CHAIN=stagenet-local - SEED=bottom drive obey lake curtain smoke basket hold race lonely fit walk entrypoint: ["/scripts/docker-entrypoint.sh"] command: - --name=fisherman - --chain=stagenet-local - --unsafe-force-node-key-generation - --base-path=/data - --keystore-path=/data/keystore - --discover-local - --unsafe-rpc-external - --rpc-cors=all - --no-prometheus - --no-telemetry - --enable-offchain-indexing=true - --pool-type=fork-aware - --fisherman - --fisherman-database-url=postgresql://indexer:indexer@postgres:5432/datahaven volumes: - ./scripts/docker-entrypoint.sh:/scripts/docker-entrypoint.sh:ro - fisherman-keystore:/data/keystore restart: unless-stopped depends_on: postgres: condition: service_healthy alice: condition: service_healthy bob: condition: service_healthy networks: datahaven-network: driver: bridge name: datahaven-network volumes: alice-keystore: bob-keystore: msp-keystore: bsp01-keystore: bsp02-keystore: postgres-data: indexer-data: fisherman-keystore: