services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data redis: image: redis:7-alpine restart: unless-stopped command: ["redis-server", "--save", "", "--appendonly", "no"] healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 ports: - "6379:6379" volumes: - redis-data:/data gateway: build: context: . dockerfile: backend/gateway/Dockerfile restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: HOST: 0.0.0.0 PORT: 3000 WEBSOCKET_CHANNEL_CAPACITY: ${WEBSOCKET_CHANNEL_CAPACITY} MAX_PAGE_SIZE: ${MAX_PAGE_SIZE} DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} DATABASE_MAX_CONNECTIONS: ${DATABASE_MAX_CONNECTIONS} REDIS_URL: redis://redis:6379 REDIS_MAX_CONNECTIONS: ${REDIS_MAX_CONNECTIONS} MAX_INTENTS_PER_USER_PER_MINUTE: ${MAX_INTENTS_PER_USER_PER_MINUTE} MAX_REQUESTS_PER_IP_PER_MINUTE: ${MAX_REQUESTS_PER_IP_PER_MINUTE} RATE_LIMIT_WINDOW_SECONDS: ${RATE_LIMIT_WINDOW_SECONDS} BATCH_WINDOW_SECONDS: ${BATCH_WINDOW_SECONDS} GENESIS_TIMESTAMP: ${GENESIS_TIMESTAMP} EXECUTION_DELAY_SECONDS: ${EXECUTION_DELAY_SECONDS} INTENT_DEADLINE_SECONDS: ${INTENT_DEADLINE_SECONDS} STARKNET_RPC_URL: ${STARKNET_RPC_URL} STARKNET_CHAIN_ID: ${STARKNET_CHAIN_ID} GATEWAY_ACCOUNT_ADDRESS: ${GATEWAY_ACCOUNT_ADDRESS} GATEWAY_ACCOUNT_PRIVATE_KEY: ${GATEWAY_ACCOUNT_PRIVATE_KEY} INTENT_REGISTRY_ADDRESS: ${INTENT_REGISTRY_ADDRESS} BATCH_AUCTION_ADDRESS: ${BATCH_AUCTION_ADDRESS} BATCH_SETTLEMENT_ADDRESS: ${BATCH_SETTLEMENT_ADDRESS} CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS} API_KEY_HEADER: ${GATEWAY_API_KEY_HEADER} API_KEY: ${GATEWAY_API_KEY} GATEWAY_PRIVATE_KEY: ${GATEWAY_PRIVATE_KEY} LOG_LEVEL: ${LOG_LEVEL} LOG_FORMAT: ${LOG_FORMAT} ports: - "3000:3000" coordinator: build: context: . dockerfile: backend/coordinator/Dockerfile restart: unless-stopped depends_on: gateway: condition: service_started environment: GATEWAY_URL: http://gateway:3000 GATEWAY_API_KEY_HEADER: ${GATEWAY_API_KEY_HEADER} GATEWAY_API_KEY: ${GATEWAY_API_KEY} BATCH_WINDOW_SECONDS: ${BATCH_WINDOW_SECONDS} GENESIS_TIMESTAMP: ${GENESIS_TIMESTAMP} AUCTION_WAIT_SECONDS: ${AUCTION_WAIT_SECONDS} SCHEDULER_TICK_MILLIS: ${SCHEDULER_TICK_MILLIS} STARKNET_RPC_URL: ${STARKNET_RPC_URL} STARKNET_CHAIN_ID: ${STARKNET_CHAIN_ID} COORDINATOR_PRIVATE_KEY: ${COORDINATOR_PRIVATE_KEY} COORDINATOR_ACCOUNT_ADDRESS: ${COORDINATOR_ACCOUNT_ADDRESS} INTENT_REGISTRY_ADDRESS: ${INTENT_REGISTRY_ADDRESS} BATCH_AUCTION_ADDRESS: ${BATCH_AUCTION_ADDRESS} BATCH_SETTLEMENT_ADDRESS: ${BATCH_SETTLEMENT_ADDRESS} observer: build: context: . dockerfile: backend/observer/Dockerfile restart: unless-stopped depends_on: gateway: condition: service_started environment: STARKNET_RPC_URL: ${STARKNET_RPC_URL} OBSERVER_POLL_INTERVAL_SECONDS: ${OBSERVER_POLL_INTERVAL_SECONDS} OBSERVER_FROM_BLOCK: ${OBSERVER_FROM_BLOCK} OBSERVER_CONTRACT_ADDRESSES: ${OBSERVER_CONTRACT_ADDRESSES} GATEWAY_URL: http://gateway:3000 GATEWAY_API_KEY_HEADER: ${GATEWAY_API_KEY_HEADER} GATEWAY_API_KEY: ${GATEWAY_API_KEY} OBSERVER_SETTLEMENT_EVENT_KEY: ${OBSERVER_SETTLEMENT_EVENT_KEY} OBSERVER_SETTLEMENT_BATCH_ID_INDEX: ${OBSERVER_SETTLEMENT_BATCH_ID_INDEX} OBSERVER_FAILURE_EVENT_KEY: ${OBSERVER_FAILURE_EVENT_KEY} OBSERVER_FAILURE_BATCH_ID_INDEX: ${OBSERVER_FAILURE_BATCH_ID_INDEX} OBSERVER_FAILURE_REASON_INDEX: ${OBSERVER_FAILURE_REASON_INDEX} OBSERVER_INTENT_COMMIT_EVENT_KEY: ${OBSERVER_INTENT_COMMIT_EVENT_KEY} OBSERVER_INTENT_COMMIT_INTENT_ID_INDEX: ${OBSERVER_INTENT_COMMIT_INTENT_ID_INDEX} OBSERVER_INTENT_COMMIT_USER_INDEX: ${OBSERVER_INTENT_COMMIT_USER_INDEX} OBSERVER_INTENT_CANCEL_EVENT_KEY: ${OBSERVER_INTENT_CANCEL_EVENT_KEY} OBSERVER_INTENT_CANCEL_INTENT_ID_INDEX: ${OBSERVER_INTENT_CANCEL_INTENT_ID_INDEX} OBSERVER_INTENT_CANCEL_USER_INDEX: ${OBSERVER_INTENT_CANCEL_USER_INDEX} OBSERVER_CHECKPOINT_PATH: /var/lib/blindmarkets/observer.checkpoint volumes: - observer-data:/var/lib/blindmarkets solver: build: context: . dockerfile: solver-reference/Dockerfile restart: unless-stopped depends_on: gateway: condition: service_started environment: SOLVER_ADDRESS: ${SOLVER_ADDRESS} SOLVER_PRIVATE_KEY: ${SOLVER_PRIVATE_KEY} SOLVER_ACCOUNT_ADDRESS: ${SOLVER_ACCOUNT_ADDRESS} SOLVER_ACCOUNT_PRIVATE_KEY: ${SOLVER_ACCOUNT_PRIVATE_KEY} STARKNET_CHAIN_ID: ${STARKNET_CHAIN_ID} STARKNET_RPC_URL: ${STARKNET_RPC_URL} BATCH_AUCTION_ADDRESS: ${BATCH_AUCTION_ADDRESS} BATCH_SETTLEMENT_ADDRESS: ${BATCH_SETTLEMENT_ADDRESS} SOLVER_BOND_ADDRESS: ${SOLVER_BOND_ADDRESS} GATEWAY_URL: http://gateway:3000 GATEWAY_API_KEY_HEADER: ${GATEWAY_API_KEY_HEADER} GATEWAY_API_KEY: ${GATEWAY_API_KEY} SOLVER_FEE_BPS: ${SOLVER_FEE_BPS} SOLVER_BOND_PROOF: ${SOLVER_BOND_PROOF} DEX_QUOTE_ENDPOINTS: ${DEX_QUOTE_ENDPOINTS} SOLVER_INITIAL_INVENTORY: ${SOLVER_INITIAL_INVENTORY} PROOF_SERVICE_URL: ${PROOF_SERVICE_URL} PROOF_SERVICE_API_KEY: ${PROOF_SERVICE_API_KEY} frontend: build: context: . dockerfile: frontend/Dockerfile args: NEXT_PUBLIC_STARKNET_RPC_URL: ${NEXT_PUBLIC_STARKNET_RPC_URL} NEXT_PUBLIC_STARKNET_CHAIN_ID: ${NEXT_PUBLIC_STARKNET_CHAIN_ID} NEXT_PUBLIC_INTENT_REGISTRY_ADDRESS: ${NEXT_PUBLIC_INTENT_REGISTRY_ADDRESS} NEXT_PUBLIC_BATCH_WINDOW_SECONDS: ${NEXT_PUBLIC_BATCH_WINDOW_SECONDS} NEXT_PUBLIC_GENESIS_TIMESTAMP: ${NEXT_PUBLIC_GENESIS_TIMESTAMP} NEXT_PUBLIC_DEFAULT_ASSET_IN: ${NEXT_PUBLIC_DEFAULT_ASSET_IN} NEXT_PUBLIC_DEFAULT_ASSET_OUT: ${NEXT_PUBLIC_DEFAULT_ASSET_OUT} NEXT_PUBLIC_DEFAULT_AMOUNT: ${NEXT_PUBLIC_DEFAULT_AMOUNT} NEXT_PUBLIC_DEFAULT_MIN_OUTPUT: ${NEXT_PUBLIC_DEFAULT_MIN_OUTPUT} NEXT_PUBLIC_DEFAULT_MAX_FEE_BPS: ${NEXT_PUBLIC_DEFAULT_MAX_FEE_BPS} NEXT_PUBLIC_DEFAULT_DEADLINE_MINUTES: ${NEXT_PUBLIC_DEFAULT_DEADLINE_MINUTES} NEXT_PUBLIC_DEFAULT_PRIVACY_MODE: ${NEXT_PUBLIC_DEFAULT_PRIVACY_MODE} NEXT_PUBLIC_BRIDGE_RISK: ${NEXT_PUBLIC_BRIDGE_RISK} NEXT_PUBLIC_CUSTODY_MODEL: ${NEXT_PUBLIC_CUSTODY_MODEL} NEXT_PUBLIC_SETTLEMENT_TIME: ${NEXT_PUBLIC_SETTLEMENT_TIME} NEXT_PUBLIC_SETTLEMENT_NOTE: ${NEXT_PUBLIC_SETTLEMENT_NOTE} NEXT_PUBLIC_AUDIT_REPORTS_URL: ${NEXT_PUBLIC_AUDIT_REPORTS_URL} restart: unless-stopped depends_on: gateway: condition: service_started environment: PORT: 3001 HOSTNAME: 0.0.0.0 GATEWAY_URL: http://gateway:3000 GATEWAY_API_KEY_HEADER: ${GATEWAY_API_KEY_HEADER} GATEWAY_API_KEY: ${GATEWAY_API_KEY} ports: - "3001:3001" volumes: postgres-data: redis-data: observer-data: