synor/docker-compose.dex.yml
Gulshan Yadav e2ce0022e5 feat(dex): add Docker deployment for DEX ecosystem services
- Add Dockerfile.contracts for building WASM contracts
- Add docker-compose.dex.yml for full DEX deployment
- Add docker-compose.dex-services.yml for lightweight services
- Add Node.js services for DEX ecosystem:
  - Oracle service (port 17500) - Price feeds with TWAP
  - Perps engine (port 17510) - Perpetual futures 2x-100x
  - Aggregator (port 17520) - Cross-chain liquidity routing
  - DEX API Gateway (port 17530) - Unified trading interface

Services verified operational on Docker Desktop.
2026-01-19 19:59:30 +05:30

263 lines
8 KiB
YAML

# Synor DEX Ecosystem - Docker Compose
# Perpetual futures, Oracle, Liquidity Aggregator, and Trading Infrastructure
#
# Usage:
# docker compose -f docker-compose.dex.yml up --build
#
# Services:
# - contract-builder: Builds all WASM contracts
# - oracle-service: Multi-source price aggregation
# - perps-engine: Perpetual futures trading engine
# - aggregator: Cross-chain liquidity routing
# - dex-api: REST/WebSocket API for trading interfaces
# - dex-redis: State cache and real-time pub/sub
#
# Ports:
# 17500 - Oracle API
# 17510 - Perps REST API
# 17511 - Perps WebSocket
# 17520 - Aggregator API
# 17530 - DEX API Gateway REST
# 17531 - DEX API Gateway WebSocket
# 17540 - Redis (internal)
services:
# ==========================================================================
# Contract Builder - Builds all WASM contracts
# ==========================================================================
contract-builder:
build:
context: .
dockerfile: Dockerfile.contracts
container_name: synor-contract-builder
volumes:
- contracts-output:/output
command: >
sh -c '
echo "=== Building Synor Smart Contracts ==="
cp -r /contracts-output/* /output/ 2>/dev/null || true
echo "=== Contract Build Complete ==="
ls -la /output/wasm/ 2>/dev/null || echo "WASM directory empty"
'
# ==========================================================================
# Oracle Service - Price Feed Aggregation
# ==========================================================================
oracle-service:
image: node:20-alpine
container_name: synor-oracle-service
hostname: oracle-service
restart: unless-stopped
working_dir: /app
volumes:
- ./docker/dex/oracle:/app:ro
- contracts-output:/contracts:ro
environment:
- NODE_ENV=production
- PORT=17500
- PRICE_SOURCES=binance,coinbase,kraken
- UPDATE_INTERVAL_MS=1000
- STALE_THRESHOLD_MS=60000
- SYNOR_RPC_URL=http://synor-seed1:17110
- REDIS_URL=redis://dex-redis:6379
ports:
- "17500:17500" # Oracle API
networks:
- synor-dex-net
depends_on:
contract-builder:
condition: service_completed_successfully
dex-redis:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:17500/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
command: ["node", "index.js"]
# ==========================================================================
# Perpetuals Engine - Leveraged Trading (2x-100x)
# ==========================================================================
perps-engine:
image: node:20-alpine
container_name: synor-perps-engine
hostname: perps-engine
restart: unless-stopped
working_dir: /app
volumes:
- ./docker/dex/perps:/app:ro
- contracts-output:/contracts:ro
environment:
- NODE_ENV=production
- PORT=17510
- MIN_LEVERAGE=2
- MAX_LEVERAGE=100
- MAINTENANCE_MARGIN_BPS=50
- LIQUIDATION_FEE_BPS=500
- FUNDING_INTERVAL_HOURS=8
- ORACLE_URL=http://oracle-service:17500
- SYNOR_RPC_URL=http://synor-seed1:17110
- REDIS_URL=redis://dex-redis:6379
ports:
- "17510:17510" # Perps API
- "17511:17511" # Perps WebSocket
networks:
- synor-dex-net
depends_on:
oracle-service:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:17510/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
command: ["node", "index.js"]
# ==========================================================================
# Liquidity Aggregator - Cross-chain DEX Routing
# ==========================================================================
aggregator:
image: node:20-alpine
container_name: synor-aggregator
hostname: aggregator
restart: unless-stopped
working_dir: /app
volumes:
- ./docker/dex/aggregator:/app:ro
- contracts-output:/contracts:ro
environment:
- NODE_ENV=production
- PORT=17520
- AGGREGATION_FEE_BPS=5
- MAX_SLIPPAGE_BPS=100
- SOURCES=synor,osmosis,dydx
- IBC_ENABLED=true
- ORACLE_URL=http://oracle-service:17500
- SYNOR_RPC_URL=http://synor-seed1:17110
- REDIS_URL=redis://dex-redis:6379
ports:
- "17520:17520" # Aggregator API
networks:
- synor-dex-net
depends_on:
oracle-service:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:17520/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
command: ["node", "index.js"]
# ==========================================================================
# DEX API Gateway - Unified Trading Interface
# ==========================================================================
dex-api:
image: node:20-alpine
container_name: synor-dex-api
hostname: dex-api
restart: unless-stopped
working_dir: /app
volumes:
- ./docker/dex/api:/app:ro
- contracts-output:/contracts:ro
environment:
- NODE_ENV=production
- PORT=17530
- WS_PORT=17531
- ORACLE_URL=http://oracle-service:17500
- PERPS_URL=http://perps-engine:17510
- AGGREGATOR_URL=http://aggregator:17520
- SYNOR_RPC_URL=http://synor-seed1:17110
- REDIS_URL=redis://dex-redis:6379
- CORS_ORIGINS=*
- RATE_LIMIT_RPM=600
ports:
- "17530:17530" # REST API
- "17531:17531" # WebSocket
networks:
- synor-dex-net
depends_on:
perps-engine:
condition: service_healthy
aggregator:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:17530/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
command: ["node", "index.js"]
# ==========================================================================
# Redis - State Cache & Pub/Sub
# ==========================================================================
dex-redis:
image: redis:7-alpine
container_name: synor-dex-redis
hostname: dex-redis
restart: unless-stopped
command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru
ports:
- "17540:6379" # Redis port (remapped)
networks:
- synor-dex-net
volumes:
- dex-redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 15s
timeout: 5s
retries: 3
# ==========================================================================
# Price Feed Simulator (for testnet)
# ==========================================================================
price-simulator:
image: node:20-alpine
container_name: synor-price-simulator
hostname: price-simulator
restart: unless-stopped
working_dir: /app
volumes:
- ./docker/dex/simulator:/app:ro
environment:
- NODE_ENV=development
- REDIS_URL=redis://dex-redis:6379
- UPDATE_INTERVAL_MS=500
- VOLATILITY=0.001
- INITIAL_BTC_PRICE=45000
- INITIAL_ETH_PRICE=2500
- INITIAL_SYNOR_PRICE=1.50
networks:
- synor-dex-net
depends_on:
dex-redis:
condition: service_healthy
profiles:
- simulator
command: ["node", "index.js"]
# =============================================================================
# Networks
# =============================================================================
networks:
synor-dex-net:
driver: bridge
ipam:
config:
- subnet: 172.24.0.0/16
# =============================================================================
# Volumes
# =============================================================================
volumes:
contracts-output:
driver: local
dex-redis-data:
driver: local