- 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.
263 lines
8 KiB
YAML
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
|