services: mcp-server: build: . ports: - "127.0.0.1:3000:3000" env_file: .env environment: - X402_FACILITATOR_URL=http://facilitator:4022 - X402_NETWORK=base-mainnet - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN} - TELEGRAM_CHAT_ID=${TELEGRAM_CHAT_ID} restart: unless-stopped # OPS-DB-DNS-PIN-W1: resolve `postgres` via /etc/hosts (static dbnet IP), # bypassing musl/Alpine embedded DNS which EAI_AGAIN'd under concurrent seed # load. Defense-in-depth alongside the run()/exec() transient-retry. extra_hosts: - "postgres:172.19.0.10" networks: - default - dbnet depends_on: postgres: condition: service_started facilitator: condition: service_healthy facilitator: build: context: . dockerfile: Dockerfile.facilitator environment: - FACILITATOR_PRIVATE_KEY=${FACILITATOR_PRIVATE_KEY} - FACILITATOR_PORT=4022 healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:4022/health"] interval: 5s timeout: 3s retries: 3 start_period: 5s restart: unless-stopped postgres: image: postgres:16-alpine # CH3-PRE (OPS-SEED-ORCHESTRATOR-W1 V2-RESUME V3): bump /dev/shm from the # Docker-default 64MB -> 256MB. Under high seed concurrency the parallel-query # dynamic shared memory (parallel workers / hash joins) exhausted the default # /dev/shm -> "could not resize shared memory segment ... No space left on # device" (getFundingZScore). Latent ramp blocker; fixed independent of the cutover. shm_size: '256m' # Loopback-only binding so the host-side activation-funnel cron # (algovault-funnel-snapshot.timer) can reach Postgres from # /etc/algovault/funnel-snapshot.env without exposing 5432 publicly. # Container-to-container traffic on the docker network is unaffected. ports: - "127.0.0.1:5432:5432" environment: POSTGRES_DB: signal_performance POSTGRES_USER: algovault POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - pgdata:/var/lib/postgresql/data restart: unless-stopped networks: default: {} dbnet: ipv4_address: 172.19.0.10 networks: dbnet: ipam: config: - subnet: 172.19.0.0/24 volumes: pgdata: