# Docker Compose for Universal Crypto MCP
# Provides the MCP server and supporting services
services:
# Main MCP Server
mcp-server:
build:
context: .
dockerfile: Dockerfile
container_name: universal-crypto-mcp
restart: unless-stopped
ports:
- "3000:3000"
- "3001:3001" # SSE endpoint
environment:
- NODE_ENV=production
- PORT=3000
- SSE_PORT=3001
# Chain RPC URLs (override with your own)
- ETHEREUM_RPC_URL=${ETHEREUM_RPC_URL:-https://eth.llamarpc.com}
- BSC_RPC_URL=${BSC_RPC_URL:-https://bsc-dataseed.binance.org}
- POLYGON_RPC_URL=${POLYGON_RPC_URL:-https://polygon-rpc.com}
- ARBITRUM_RPC_URL=${ARBITRUM_RPC_URL:-https://arb1.arbitrum.io/rpc}
- AVALANCHE_RPC_URL=${AVALANCHE_RPC_URL:-https://api.avax.network/ext/bc/C/rpc}
- SOLANA_RPC_URL=${SOLANA_RPC_URL:-https://api.mainnet-beta.solana.com}
- NEAR_RPC_URL=${NEAR_RPC_URL:-https://rpc.mainnet.near.org}
# API Keys (optional - for enhanced data)
- COINGECKO_API_KEY=${COINGECKO_API_KEY:-}
- ETHERSCAN_API_KEY=${ETHERSCAN_API_KEY:-}
- INFURA_PROJECT_ID=${INFURA_PROJECT_ID:-}
- ALCHEMY_API_KEY=${ALCHEMY_API_KEY:-}
# Logging
- LOG_LEVEL=${LOG_LEVEL:-info}
volumes:
- ./data:/app/data
- ./logs:/app/logs
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
networks:
- crypto-mcp
# Redis for caching (optional but recommended)
redis:
image: redis:7-alpine
container_name: crypto-mcp-redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- redis-data:/data
command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- crypto-mcp
# Rate limiter / API gateway (optional)
nginx:
image: nginx:alpine
container_name: crypto-mcp-nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx.conf:/etc/nginx/nginx.conf:ro
- ./docker/ssl:/etc/nginx/ssl:ro
depends_on:
- mcp-server
networks:
- crypto-mcp
# Prometheus for metrics (optional)
prometheus:
image: prom/prometheus:latest
container_name: crypto-mcp-prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./docker/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=15d'
networks:
- crypto-mcp
profiles:
- monitoring
# Grafana for dashboards (optional)
grafana:
image: grafana/grafana:latest
container_name: crypto-mcp-grafana
restart: unless-stopped
ports:
- "3030:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin}
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana-data:/var/lib/grafana
- ./docker/grafana/provisioning:/etc/grafana/provisioning:ro
depends_on:
- prometheus
networks:
- crypto-mcp
profiles:
- monitoring
volumes:
redis-data:
prometheus-data:
grafana-data:
networks:
crypto-mcp:
driver: bridge