version: "3.8"
# GeoSight MCP Server - Docker Compose Configuration
# Usage:
# Development: docker-compose up -d
# Production: docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
services:
# ===========================================================================
# Main MCP Server
# ===========================================================================
geosight:
build:
context: .
target: development
container_name: geosight-mcp
ports:
- "8000:8000"
volumes:
- ./src:/app/src:ro
- ./config:/app/config:ro
- geosight-data:/app/data
- geosight-models:/app/models/weights
environment:
- ENVIRONMENT=development
- LOG_LEVEL=DEBUG
- SERVER_MODE=http
- SERVER_HOST=0.0.0.0
- SERVER_PORT=8000
- REDIS_URL=redis://redis:6379/0
- DATABASE_URL=postgresql+asyncpg://postgres:geosight@postgres:5432/geosight
- S3_ENDPOINT_URL=http://minio:9000
- S3_ACCESS_KEY=minioadmin
- S3_SECRET_KEY=minioadmin
- S3_BUCKET_NAME=geosight-data
- CELERY_BROKER_URL=redis://redis:6379/1
- CELERY_RESULT_BACKEND=redis://redis:6379/2
depends_on:
- redis
- postgres
- minio
networks:
- geosight-network
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
# ===========================================================================
# Celery Worker for Background Tasks
# ===========================================================================
worker:
build:
context: .
target: development
container_name: geosight-worker
command: celery -A geosight.tasks worker --loglevel=info --concurrency=2
volumes:
- ./src:/app/src:ro
- geosight-data:/app/data
- geosight-models:/app/models/weights
environment:
- ENVIRONMENT=development
- LOG_LEVEL=INFO
- REDIS_URL=redis://redis:6379/0
- DATABASE_URL=postgresql+asyncpg://postgres:geosight@postgres:5432/geosight
- S3_ENDPOINT_URL=http://minio:9000
- S3_ACCESS_KEY=minioadmin
- S3_SECRET_KEY=minioadmin
- CELERY_BROKER_URL=redis://redis:6379/1
- CELERY_RESULT_BACKEND=redis://redis:6379/2
depends_on:
- redis
- postgres
networks:
- geosight-network
restart: unless-stopped
# ===========================================================================
# Redis - Caching and Task Queue
# ===========================================================================
redis:
image: redis:7-alpine
container_name: geosight-redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
networks:
- geosight-network
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
# ===========================================================================
# PostgreSQL + PostGIS - Database
# ===========================================================================
postgres:
image: postgis/postgis:15-3.3-alpine
container_name: geosight-postgres
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
- ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql:ro
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=geosight
- POSTGRES_DB=geosight
networks:
- geosight-network
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
# ===========================================================================
# MinIO - S3-Compatible Object Storage
# ===========================================================================
minio:
image: minio/minio:latest
container_name: geosight-minio
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio-data:/data
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
command: server /data --console-address ":9001"
networks:
- geosight-network
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 10s
retries: 3
# ===========================================================================
# MinIO Setup - Creates initial bucket
# ===========================================================================
minio-setup:
image: minio/mc:latest
container_name: geosight-minio-setup
depends_on:
minio:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set minio http://minio:9000 minioadmin minioadmin;
mc mb --ignore-existing minio/geosight-data;
mc anonymous set download minio/geosight-data;
exit 0;
"
networks:
- geosight-network
# ===========================================================================
# Streamlit Dashboard
# ===========================================================================
dashboard:
build:
context: ./dashboard
dockerfile: Dockerfile
container_name: geosight-dashboard
ports:
- "8501:8501"
volumes:
- ./dashboard:/app:ro
environment:
- GEOSIGHT_API_URL=http://geosight:8000
depends_on:
- geosight
networks:
- geosight-network
restart: unless-stopped
# ===========================================================================
# Prometheus - Metrics Collection
# ===========================================================================
prometheus:
image: prom/prometheus:latest
container_name: geosight-prometheus
ports:
- "9090:9090"
volumes:
- ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
networks:
- geosight-network
restart: unless-stopped
# ===========================================================================
# Grafana - Monitoring Dashboard
# ===========================================================================
grafana:
image: grafana/grafana:latest
container_name: geosight-grafana
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
- ./config/grafana/provisioning:/etc/grafana/provisioning:ro
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_USERS_ALLOW_SIGN_UP=false
depends_on:
- prometheus
networks:
- geosight-network
restart: unless-stopped
# ===========================================================================
# Volumes
# ===========================================================================
volumes:
redis-data:
postgres-data:
minio-data:
geosight-data:
geosight-models:
prometheus-data:
grafana-data:
# ===========================================================================
# Networks
# ===========================================================================
networks:
geosight-network:
driver: bridge