version: '3.8'
services:
# PostgreSQL Database
postgres:
image: postgres:16-alpine
container_name: defi-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-defi}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-defi123}
POSTGRES_DB: ${POSTGRES_DB:-defi}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./docker/init-db.sql:/docker-entrypoint-initdb.d/init.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-defi}"]
interval: 10s
timeout: 5s
retries: 5
# Redis for task queue
redis:
image: redis:7-alpine
container_name: defi-redis
restart: unless-stopped
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-redis123}
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:-redis123}", "ping"]
interval: 10s
timeout: 5s
retries: 5
# MCP Server
mcp-server:
build:
context: .
dockerfile: docker/Dockerfile
target: mcp-server
container_name: defi-mcp-server
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
environment:
NODE_ENV: production
LOG_LEVEL: ${LOG_LEVEL:-info}
# Solana
SOLANA_NETWORK: ${SOLANA_NETWORK:-mainnet-beta}
SOLANA_RPC_URL: ${SOLANA_RPC_URL}
HELIUS_API_KEY: ${HELIUS_API_KEY}
QUICKNODE_ENDPOINT: ${QUICKNODE_ENDPOINT:-}
# Database
DATABASE_URL: postgresql://${POSTGRES_USER:-defi}:${POSTGRES_PASSWORD:-defi123}@postgres:5432/${POSTGRES_DB:-defi}
# Redis
REDIS_URL: redis://:${REDIS_PASSWORD:-redis123}@redis:6379
# Security
MASTER_PASSWORD: ${MASTER_PASSWORD}
ports:
- "3000:3000"
volumes:
- ./config:/app/config:ro
# Orchestrator Worker (for background jobs)
orchestrator:
build:
context: .
dockerfile: docker/Dockerfile
target: orchestrator
container_name: defi-orchestrator
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
environment:
NODE_ENV: production
LOG_LEVEL: ${LOG_LEVEL:-info}
WORKER_MODE: "true"
# Solana
SOLANA_NETWORK: ${SOLANA_NETWORK:-mainnet-beta}
SOLANA_RPC_URL: ${SOLANA_RPC_URL}
HELIUS_API_KEY: ${HELIUS_API_KEY}
# Database
DATABASE_URL: postgresql://${POSTGRES_USER:-defi}:${POSTGRES_PASSWORD:-defi123}@postgres:5432/${POSTGRES_DB:-defi}
# Redis
REDIS_URL: redis://:${REDIS_PASSWORD:-redis123}@redis:6379
# Security
MASTER_PASSWORD: ${MASTER_PASSWORD}
deploy:
replicas: ${WORKER_REPLICAS:-2}
# Metrics (Prometheus)
prometheus:
image: prom/prometheus:latest
container_name: defi-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'
# Grafana Dashboard
grafana:
image: grafana/grafana:latest
container_name: defi-grafana
restart: unless-stopped
depends_on:
- prometheus
ports:
- "3001:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./docker/grafana/provisioning:/etc/grafana/provisioning:ro
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin123}
GF_USERS_ALLOW_SIGN_UP: "false"
volumes:
postgres_data:
redis_data:
prometheus_data:
grafana_data:
networks:
default:
name: defi-network