services:
neo4j:
image: neo4j:5-community
container_name: local-rag-neo4j
ports:
- "7474:7474" # HTTP
- "7687:7687" # Bolt
environment:
- NEO4J_AUTH=${NEO4J_USER}/${NEO4J_PASSWORD}
- NEO4J_PLUGINS=["apoc"]
- NEO4J_dbms_memory_heap_initial__size=512m
- NEO4J_dbms_memory_heap_max__size=2G
- NEO4J_apoc_export_file_enabled=true
- NEO4J_apoc_import_file_enabled=true
- NEO4J_apoc_import_file_use__neo4j__config=true
volumes:
- ./data/neo4j/data:/data
- ./data/neo4j/logs:/logs
- ./data/neo4j/import:/var/lib/neo4j/import
- ./data/neo4j/plugins:/plugins
networks:
- rag-network
healthcheck:
test: ["CMD", "neo4j", "status"]
interval: 10s
timeout: 5s
retries: 5
mcp-server:
image: ghcr.io/suwa-sh/graphiti-mcp-server:latest
container_name: local-rag-graphiti-mcp
depends_on:
neo4j:
condition: service_healthy
env_file:
- .env
environment:
- PATH=/root/.local/bin:${PATH}
- NEO4J_URI=bolt://neo4j:7687
ports:
- "8000:8000" # Expose the MCP server via HTTP for SSE transport
command: ["uv", "run", "graphiti_mcp_server.py"]
networks:
- rag-network
ingest:
image: ghcr.io/suwa-sh/graphiti-ingest:latest
container_name: local-rag-ingest
profiles: ["ingest"] # Only run when explicitly invoked
depends_on:
neo4j:
condition: service_healthy
env_file:
- .env
environment:
- NEO4J_URI=bolt://neo4j:7687
volumes:
- ./data:/app/data
networks:
- rag-network
networks:
rag-network:
driver: bridge