version: '3.8'
services:
# Main OpenStreetMap MCP Server
osm-mcp:
build: .
container_name: osm-mcp-server
ports:
- "${PORT:-8888}:8888"
- "${WEBAPP_PORT:-3001}:3000"
environment:
- NODE_ENV=${NODE_ENV:-production}
- PORT=${PORT:-8888}
- LOG_LEVEL=${LOG_LEVEL:-info}
- ENABLE_AUTH=${ENABLE_AUTH:-false}
- DATABASE_URL=${DATABASE_URL:-}
- REDIS_URL=${REDIS_URL:-}
- JWT_SECRET=${JWT_SECRET:-}
- RATE_LIMIT_ENABLED=${RATE_LIMIT_ENABLED:-false}
- CORS_ORIGIN=${CORS_ORIGIN:-*}
volumes:
- ./logs:/app/logs:rw
- ./config:/app/config:ro
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8888/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
- osm-mcp-network
# Optional: PostgreSQL for hosted service mode
postgres:
image: postgres:15-alpine
container_name: osm-mcp-postgres
environment:
- POSTGRES_DB=${POSTGRES_DB:-osmmcp}
- POSTGRES_USER=${POSTGRES_USER:-osmuser}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-osmpass}
volumes:
- postgres_data:/var/lib/postgresql/data
- ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql
ports:
- "${POSTGRES_PORT:-5432}:5432"
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-osmuser} -d ${POSTGRES_DB:-osmmcp}"]
interval: 30s
timeout: 10s
retries: 5
networks:
- osm-mcp-network
profiles:
- hosted-service
# Optional: Redis for rate limiting and caching
redis:
image: redis:7-alpine
container_name: osm-mcp-redis
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-redispass}
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 30s
timeout: 10s
retries: 3
networks:
- osm-mcp-network
profiles:
- hosted-service
# Optional: Admin Dashboard (React app)
# NOTE: Uncomment this section when admin-dashboard is implemented
# admin-dashboard:
# build:
# context: ./admin-dashboard
# dockerfile: Dockerfile
# container_name: osm-mcp-admin
# ports:
# - "${ADMIN_PORT:-3002}:3000"
# environment:
# - REACT_APP_API_URL=http://localhost:${PORT:-8888}/api
# - REACT_APP_ENV=${NODE_ENV:-production}
# depends_on:
# - osm-mcp
# restart: unless-stopped
# networks:
# - osm-mcp-network
# profiles:
# - hosted-service
# Optional: Nginx reverse proxy
nginx:
image: nginx:alpine
container_name: osm-mcp-nginx
ports:
- "${NGINX_PORT:-80}:80"
- "${NGINX_SSL_PORT:-443}:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/ssl:/etc/nginx/ssl:ro
- ./logs/nginx:/var/log/nginx:rw
depends_on:
- osm-mcp
restart: unless-stopped
networks:
- osm-mcp-network
profiles:
- production
volumes:
postgres_data:
driver: local
redis_data:
driver: local
networks:
osm-mcp-network:
driver: bridge