docker-compose.ymlβ’4.38 kB
version: '3.8'
services:
# Frontend - Next.js Application
frontend:
build:
context: .
dockerfile: Dockerfile.frontend
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- NEXT_PUBLIC_API_URL=http://localhost:8000
depends_on:
- mcp-server
networks:
- mcp-network
restart: unless-stopped
# MCP Server - Main Backend
mcp-server:
build:
context: ./mcp_server
dockerfile: Dockerfile
ports:
- "8000:8000"
- "9090:9090" # Metrics port
environment:
- DATABASE_URL=postgresql+asyncpg://postgres:password@postgres:5432/mcp_db
- REDIS_URL=redis://redis:6379
- EVOLUTION_API_KEY=${EVOLUTION_API_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- HUGGINGFACE_API_KEY=${HUGGINGFACE_API_KEY}
- SECRET_KEY=${SECRET_KEY:-your-secret-key-change-in-production}
- DEBUG=false
depends_on:
- postgres
- redis
networks:
- mcp-network
restart: unless-stopped
volumes:
- ./logs:/app/logs
# Agent System - Multi-Agent Processing
agent-system:
build:
context: ./agent_system
dockerfile: Dockerfile
environment:
- MCP_SERVER_URL=http://mcp-server:8000
- REDIS_URL=redis://redis:6379
- EVOLUTION_API_KEY=${EVOLUTION_API_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY}
depends_on:
- mcp-server
- redis
networks:
- mcp-network
restart: unless-stopped
deploy:
replicas: 2
# PostgreSQL Database
postgres:
image: postgres:15-alpine
environment:
- POSTGRES_DB=mcp_db
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql
networks:
- mcp-network
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 30s
timeout: 10s
retries: 3
# Redis Cache
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- mcp-network
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
# Nginx Reverse Proxy
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- frontend
- mcp-server
networks:
- mcp-network
restart: unless-stopped
# Prometheus Monitoring
prometheus:
image: prom/prometheus:latest
ports:
- "9091:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=200h'
- '--web.enable-lifecycle'
networks:
- mcp-network
restart: unless-stopped
# Grafana Dashboard
grafana:
image: grafana/grafana:latest
ports:
- "3001:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/dashboards:/etc/grafana/provisioning/dashboards
- ./grafana/datasources:/etc/grafana/provisioning/datasources
depends_on:
- prometheus
networks:
- mcp-network
restart: unless-stopped
# Jaeger Tracing
jaeger:
image: jaegertracing/all-in-one:latest
ports:
- "16686:16686"
- "14268:14268"
environment:
- COLLECTOR_OTLP_ENABLED=true
networks:
- mcp-network
restart: unless-stopped
# RabbitMQ Message Broker
rabbitmq:
image: rabbitmq:3-management-alpine
ports:
- "5672:5672"
- "15672:15672"
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=password
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- mcp-network
restart: unless-stopped
volumes:
postgres_data:
redis_data:
prometheus_data:
grafana_data:
rabbitmq_data:
networks:
mcp-network:
driver: bridge