services:
# Dedicated Qdrant for Mem0
# Note: mapped to 6334 to avoid conflict if you run another local Qdrant on 6333
qdrant:
image: qdrant/qdrant:v1.13.0
container_name: mem0-qdrant
restart: unless-stopped
ports:
- '6334:6333'
- '6335:6334'
volumes:
- mem0_qdrant_data:/qdrant/storage
healthcheck:
test: ["CMD-SHELL", "bash -c '</dev/tcp/localhost/6333'"]
interval: 10s
timeout: 5s
retries: 5
networks:
- mem0_net
# Neo4j for Graph Store (Entity Relationships)
neo4j:
image: neo4j:5.19.0
container_name: mem0-neo4j
restart: unless-stopped
ports:
- "7474:7474" # HTTP
- "7687:7687" # Bolt
volumes:
- mem0_neo4j_data_v2:/data
environment:
- NEO4J_AUTH=neo4j/${NEO4J_PASSWORD:-password}
- NEO4J_dbms_connector_bolt_advertised__address=neo4j:7687
networks:
- mem0_net
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1"]
interval: 10s
timeout: 5s
retries: 5
mcp-server:
build: .
container_name: mem0-server
restart: unless-stopped
depends_on:
qdrant:
condition: service_healthy
neo4j:
condition: service_healthy
env_file:
- /opt/mem0-data/.env
environment:
- QDRANT_HOST=qdrant
- QDRANT_PORT=6333
- NEO4J_URI=bolt://neo4j:7687
- NEO4J_USERNAME=neo4j
- NEO4J_PASSWORD=${NEO4J_PASSWORD}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- MCP_TRANSPORT=sse
ports:
- "8000:8000"
command: python -m src.main
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
- mem0_net
volumes:
mem0_qdrant_data:
mem0_neo4j_data_v2:
networks:
mem0_net:
driver: bridge