* Bump graphiti-core to v0.23.1 in mcp_server and consolidate dev dependencies - Updated graphiti-core from 0.23.0 to 0.23.1 in pyproject.toml and dockerfiles - Moved all dev dependencies to [dependency-groups].dev (uv's preferred approach) - Removed redundant [project.optional-dependencies].dev section - Eliminated duplicate graphiti-core and mcp entries from dev dependencies 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix dev dependencies being installed in Docker containers Added --no-group dev flag to uv sync in Dockerfiles. The --no-dev flag only excludes [project.optional-dependencies].dev, but doesn't exclude [dependency-groups].dev which we now use. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Add --no-sync flag to uv run in Dockerfiles The uv run command was re-syncing dependencies at runtime and installing dev groups despite uv sync --no-group dev. Using --no-sync tells uv to use the already-synced dependencies without re-checking. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Make sed pattern version-agnostic in Dockerfiles Changed hardcoded version pattern from >=0\.23\.1 to >=[0-9.]\+ so the Dockerfiles don't need to be updated every time graphiti-core version is bumped in pyproject.toml. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Remove redundant --no-dev flag from uv sync Since we removed [project.optional-dependencies].dev, the --no-dev flag no longer has any effect. Only --no-group dev is needed to exclude dev dependency-groups. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Use more precise semver regex in sed patterns Changed from [0-9.]\+ to [0-9]\+\.[0-9]\+\.[0-9]\+ to match proper semantic versions (e.g., 0.23.1) and avoid matching invalid patterns like .... or 1.2.3.4.5. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix version inconsistencies and add regex end anchor - Updated MCP_SERVER_VERSION from 1.0.0rc0/1.0.0 to 1.0.1 to match pyproject.toml - Added $ end-of-line anchor to sed patterns to prevent matching partial strings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| build-standalone.sh | ||
| build-with-version.sh | ||
| docker-compose-falkordb.yml | ||
| docker-compose-neo4j.yml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| Dockerfile.standalone | ||
| github-actions-example.yml | ||
| README-falkordb-combined.md | ||
| README.md | ||
Docker Deployment for Graphiti MCP Server
This directory contains Docker Compose configurations for running the Graphiti MCP server with graph database backends: FalkorDB (combined image) and Neo4j.
Quick Start
# Default configuration (FalkorDB combined image)
docker-compose up
# Neo4j (separate containers)
docker-compose -f docker-compose-neo4j.yml up
Environment Variables
Create a .env file in this directory with your API keys:
# Required
OPENAI_API_KEY=your-api-key-here
# Optional
GRAPHITI_GROUP_ID=main
SEMAPHORE_LIMIT=10
# Database-specific variables (see database sections below)
Database Configurations
FalkorDB (Combined Image)
File: docker-compose.yml (default)
The default configuration uses a combined Docker image that bundles both FalkorDB and the MCP server together for simplified deployment.
Configuration
# Environment variables
FALKORDB_URI=redis://localhost:6379 # Connection URI (services run in same container)
FALKORDB_PASSWORD= # Password (default: empty)
FALKORDB_DATABASE=default_db # Database name (default: default_db)
Accessing Services
- FalkorDB (Redis): redis://localhost:6379
- FalkorDB Web UI: http://localhost:3000
- MCP Server: http://localhost:8000
Data Management
Backup:
docker run --rm -v mcp_server_falkordb_data:/var/lib/falkordb/data -v $(pwd):/backup alpine \
tar czf /backup/falkordb-backup.tar.gz -C /var/lib/falkordb/data .
Restore:
docker run --rm -v mcp_server_falkordb_data:/var/lib/falkordb/data -v $(pwd):/backup alpine \
tar xzf /backup/falkordb-backup.tar.gz -C /var/lib/falkordb/data
Clear Data:
docker-compose down
docker volume rm mcp_server_falkordb_data
docker-compose up
Gotchas
- Both FalkorDB and MCP server run in the same container
- FalkorDB uses Redis persistence mechanisms (AOF/RDB)
- Default configuration has no password - add one for production
- Health check only monitors FalkorDB; MCP server startup visible in logs
See README-falkordb-combined.md for detailed information about the combined image.
Neo4j
File: docker-compose-neo4j.yml
Neo4j runs as a separate container service with its own web interface.
Configuration
# Environment variables
NEO4J_URI=bolt://neo4j:7687 # Connection URI (default: bolt://neo4j:7687)
NEO4J_USER=neo4j # Username (default: neo4j)
NEO4J_PASSWORD=demodemo # Password (default: demodemo)
NEO4J_DATABASE=neo4j # Database name (default: neo4j)
USE_PARALLEL_RUNTIME=false # Enterprise feature (default: false)
Accessing Neo4j
- Web Interface: http://localhost:7474
- Bolt Protocol: bolt://localhost:7687
- MCP Server: http://localhost:8000
Default credentials: neo4j / demodemo
Data Management
Backup:
# Backup both data and logs volumes
docker run --rm -v docker_neo4j_data:/data -v $(pwd):/backup alpine \
tar czf /backup/neo4j-data-backup.tar.gz -C /data .
docker run --rm -v docker_neo4j_logs:/logs -v $(pwd):/backup alpine \
tar czf /backup/neo4j-logs-backup.tar.gz -C /logs .
Restore:
# Restore both volumes
docker run --rm -v docker_neo4j_data:/data -v $(pwd):/backup alpine \
tar xzf /backup/neo4j-data-backup.tar.gz -C /data
docker run --rm -v docker_neo4j_logs:/logs -v $(pwd):/backup alpine \
tar xzf /backup/neo4j-logs-backup.tar.gz -C /logs
Clear Data:
docker-compose -f docker-compose-neo4j.yml down
docker volume rm docker_neo4j_data docker_neo4j_logs
docker-compose -f docker-compose-neo4j.yml up
Gotchas
- Neo4j takes 30+ seconds to start up - wait for the health check
- The web interface requires authentication even for local access
- Memory heap is configured for 512MB initial, 1GB max
- Page cache is set to 512MB
- Enterprise features like parallel runtime require a license
Switching Between Databases
To switch from FalkorDB to Neo4j (or vice versa):
-
Stop current setup:
docker-compose down # Stop FalkorDB combined image # or docker-compose -f docker-compose-neo4j.yml down # Stop Neo4j -
Start new database:
docker-compose up # Start FalkorDB combined image # or docker-compose -f docker-compose-neo4j.yml up # Start Neo4j
Note: Data is not automatically migrated between different database types. You'll need to export from one and import to another using the MCP API.
Troubleshooting
Port Conflicts
If port 8000 is already in use:
# Find what's using the port
lsof -i :8000
# Change the port in docker-compose.yml
# Under ports section: "8001:8000"
Container Won't Start
-
Check logs:
docker-compose logs graphiti-mcp -
Verify
.envfile exists and contains valid API keys:cat .env | grep API_KEY -
Ensure Docker has enough resources allocated
Database Connection Issues
FalkorDB:
- Test Redis connectivity:
docker compose exec graphiti-falkordb redis-cli ping - Check FalkorDB logs:
docker compose logs graphiti-falkordb - Verify both services started: Look for "FalkorDB is ready!" and "Starting MCP server..." in logs
Neo4j:
- Wait for health check to pass (can take 30+ seconds)
- Check Neo4j logs:
docker-compose -f docker-compose-neo4j.yml logs neo4j - Verify credentials match environment variables
FalkorDB:
- Test Redis connectivity:
redis-cli -h localhost ping
Data Not Persisting
-
Verify volumes are created:
docker volume ls | grep docker_ -
Check volume mounts in container:
docker inspect graphiti-mcp | grep -A 5 Mounts -
Ensure proper shutdown:
docker-compose down # Not docker-compose down -v (which removes volumes)
Performance Issues
FalkorDB:
- Adjust
SEMAPHORE_LIMITenvironment variable - Monitor with:
docker stats graphiti-falkordb - Check Redis memory:
docker compose exec graphiti-falkordb redis-cli info memory
Neo4j:
- Increase heap memory in docker-compose-neo4j.yml
- Adjust page cache size based on data size
- Check query performance in Neo4j browser
Docker Resources
Volumes
Each database configuration uses named volumes for data persistence:
- FalkorDB (combined):
falkordb_data - Neo4j:
neo4j_data,neo4j_logs
Networks
All configurations use the default bridge network. Services communicate using container names as hostnames.
Resource Limits
No resource limits are set by default. To add limits, modify the docker-compose file:
services:
graphiti-mcp:
deploy:
resources:
limits:
cpus: '2.0'
memory: 1G
Configuration Files
Each database has a dedicated configuration file in ../config/:
config-docker-falkordb-combined.yaml- FalkorDB combined image configurationconfig-docker-neo4j.yaml- Neo4j configuration
These files are mounted read-only into the container at /app/mcp/config/config.yaml (for combined image) or /app/config/config.yaml (for Neo4j).