heatmap / docker-compose.yml
Ndg07's picture
Feat: 24-hour cleanup for local SQLite
c293f7c
# Docker Compose configuration for Real-Time Misinformation Heatmap
# Supports both development and production environments
# Docker Compose configuration for Real-Time Misinformation Heatmap
# Supports both development and production environments
services:
# ============================================================================
# Main Application Service
# ============================================================================
app:
build:
context: .
dockerfile: Dockerfile
target: ${BUILD_TARGET:-development}
container_name: misinformation-heatmap-app
ports:
- "${API_PORT:-8000}:${API_PORT:-8000}"
environment:
# Application Configuration
- MODE=${MODE:-local}
- ENVIRONMENT=${ENVIRONMENT:-development}
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- API_HOST=0.0.0.0
- API_PORT=${API_PORT:-8000}
# Database Configuration
- DATABASE_URL=${DATABASE_URL:-sqlite:///./data/heatmap.db}
- DATABASE_TYPE=${DATABASE_TYPE:-sqlite}
# Google Cloud Configuration (optional)
- GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT:-}
- GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS:-}
- BIGQUERY_DATASET=${BIGQUERY_DATASET:-misinformation_heatmap}
- BIGQUERY_LOCATION=${BIGQUERY_LOCATION:-US}
# Pub/Sub Configuration (optional)
- PUBSUB_EMULATOR_HOST=${PUBSUB_EMULATOR_HOST:-}
- PUBSUB_EVENTS_RAW_TOPIC=${PUBSUB_EVENTS_RAW_TOPIC:-events-raw}
- PUBSUB_EVENTS_PROCESSED_TOPIC=${PUBSUB_EVENTS_PROCESSED_TOPIC:-events-processed}
# External Services (optional)
- HUGGINGFACE_TOKEN=${HUGGINGFACE_TOKEN:-}
- WATSON_DISCOVERY_API_KEY=${WATSON_DISCOVERY_API_KEY:-}
# Security Configuration
- API_KEY_ENABLED=${API_KEY_ENABLED:-false}
- API_KEYS=${API_KEYS:-}
- CORS_ORIGINS=${CORS_ORIGINS:-["http://localhost:3000"]}
# Performance Configuration
- CACHE_TYPE=${CACHE_TYPE:-memory}
- CACHE_TTL=${CACHE_TTL:-300}
- RATE_LIMIT_ENABLED=${RATE_LIMIT_ENABLED:-true}
# Monitoring Configuration
- ENABLE_METRICS=${ENABLE_METRICS:-true}
- ENABLE_TRACING=${ENABLE_TRACING:-false}
# Data Sources Configuration
- DATA_SOURCES_CONFIG_PATH=${DATA_SOURCES_CONFIG_PATH:-/app/config/data_sources.yaml}
volumes:
# Application code (for development)
- ${PWD}/backend:/app/backend:${VOLUME_MODE:-ro}
- ${PWD}/frontend:/app/frontend:${VOLUME_MODE:-ro}
- ${PWD}/config:/app/config:${VOLUME_MODE:-ro}
- ${PWD}/data:/app/data
- ${PWD}/logs:/app/logs
# Google Cloud credentials (if using service account file)
# - ${GOOGLE_APPLICATION_CREDENTIALS_FILE:-./credentials.json}:${GOOGLE_APPLICATION_CREDENTIALS:-/app/credentials.json}:ro
depends_on:
- frontend
networks:
- misinformation-network
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:${API_PORT:-8000}/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# ============================================================================
# Frontend Service (Static File Server)
# ============================================================================
frontend:
image: nginx:alpine
container_name: misinformation-heatmap-frontend
ports:
- "${FRONTEND_PORT:-3000}:80"
volumes:
- ${PWD}/frontend:/usr/share/nginx/html:ro
- ${PWD}/docker/nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- misinformation-network
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"]
interval: 30s
timeout: 5s
retries: 3
# ============================================================================
# Pub/Sub Emulator (for local development)
# ============================================================================
pubsub-emulator:
image: gcr.io/google.com/cloudsdktool/cloud-sdk:alpine
container_name: misinformation-heatmap-pubsub
ports:
- "${PUBSUB_PORT:-8085}:8085"
command: >
sh -c "
gcloud beta emulators pubsub start
--host-port=0.0.0.0:8085
--project=${GOOGLE_CLOUD_PROJECT:-misinformation-heatmap-local}
"
environment:
- PUBSUB_EMULATOR_HOST=0.0.0.0:8085
networks:
- misinformation-network
restart: unless-stopped
profiles:
- local
- development
# ============================================================================
# Redis Cache (for production caching)
# ============================================================================
redis:
image: redis:7-alpine
container_name: misinformation-heatmap-redis
ports:
- "${REDIS_PORT:-6379}:6379"
command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redis-data:/data
networks:
- misinformation-network
restart: unless-stopped
profiles:
- production
- staging
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 5s
retries: 3
# ============================================================================
# Monitoring Services
# ============================================================================
prometheus:
image: prom/prometheus:latest
container_name: misinformation-heatmap-prometheus
ports:
- "${PROMETHEUS_PORT:-9090}:9090"
volumes:
- ${PWD}/docker/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- 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:
- misinformation-network
restart: unless-stopped
profiles:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: misinformation-heatmap-grafana
ports:
- "${GRAFANA_PORT:-3001}:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin}
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana-data:/var/lib/grafana
- ${PWD}/docker/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro
- ${PWD}/docker/grafana/datasources:/etc/grafana/provisioning/datasources:ro
networks:
- misinformation-network
restart: unless-stopped
profiles:
- monitoring
depends_on:
- prometheus
# ============================================================================
# Testing Services
# ============================================================================
test-runner:
build:
context: .
dockerfile: Dockerfile
target: development
container_name: misinformation-heatmap-tests
environment:
- MODE=local
- ENVIRONMENT=test
- LOG_LEVEL=DEBUG
- DATABASE_URL=sqlite:///./data/test_heatmap.db
- PUBSUB_EMULATOR_HOST=pubsub-emulator:8085
volumes:
- ${PWD}:/app
- test-results:/app/test-results
networks:
- misinformation-network
profiles:
- testing
depends_on:
- pubsub-emulator
command: >
sh -c "
echo 'Waiting for services to start...' &&
sleep 10 &&
echo 'Running tests...' &&
python -m pytest tests/ -v --cov=backend --cov-report=html --cov-report=term &&
echo 'Running integration tests...' &&
python tests/test_data_sources_integration.py &&
echo 'Running E2E tests...' &&
cd tests/e2e && python test_end_to_end.py --mode local
"
# ============================================================================
# Networks
# ============================================================================
networks:
misinformation-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
# ============================================================================
# Volumes
# ============================================================================
volumes:
redis-data:
driver: local
prometheus-data:
driver: local
grafana-data:
driver: local
test-results:
driver: local