graphiti/mcp_server/docker/README.md
Daniel Chalef 21530c6408 feat: MCP Server v1.0.0rc0 - Complete refactoring with modular architecture
This is a major refactoring of the MCP Server to support multiple providers
through a YAML-based configuration system with factory pattern implementation.

## Key Changes

### Architecture Improvements
- Modular configuration system with YAML-based settings
- Factory pattern for LLM, Embedder, and Database providers
- Support for multiple database backends (Neo4j, FalkorDB, KuzuDB)
- Clean separation of concerns with dedicated service modules

### Provider Support
- **LLM**: OpenAI, Anthropic, Gemini, Groq
- **Embedders**: OpenAI, Voyage, Gemini, Anthropic, Sentence Transformers
- **Databases**: Neo4j, FalkorDB, KuzuDB (new default)
- Azure OpenAI support with AD authentication

### Configuration
- YAML configuration with environment variable expansion
- CLI argument overrides for runtime configuration
- Multiple pre-configured Docker Compose setups
- Proper boolean handling in environment variables

### Testing & CI
- Comprehensive test suite with unit and integration tests
- GitHub Actions workflows for linting and testing
- Multi-database testing support

### Docker Support
- Updated Docker images with multi-stage builds
- Database-specific docker-compose configurations
- Persistent volume support for all databases

### Bug Fixes
- Fixed KuzuDB connectivity checks
- Corrected Docker command paths
- Improved error handling and logging
- Fixed boolean environment variable expansion

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-26 17:23:57 -07:00

319 lines
No EOL
7.8 KiB
Markdown

# Docker Deployment for Graphiti MCP Server
This directory contains Docker Compose configurations for running the Graphiti MCP server with different graph database backends: KuzuDB, Neo4j, and FalkorDB.
## Quick Start
```bash
# Default configuration (KuzuDB)
docker-compose up
# Neo4j
docker-compose -f docker-compose-neo4j.yml up
# FalkorDB
docker-compose -f docker-compose-falkordb.yml up
```
## Environment Variables
Create a `.env` file in this directory with your API keys:
```bash
# 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
### KuzuDB
**File:** `docker-compose.yml` (default)
KuzuDB is an embedded graph database that runs within the application container.
#### Configuration
```bash
# Environment variables
KUZU_DB=/data/graphiti.kuzu # Database file path (default: /data/graphiti.kuzu)
KUZU_MAX_CONCURRENT_QUERIES=10 # Maximum concurrent queries (default: 10)
```
#### Storage Options
**Persistent Storage (default):**
Data is stored in the `kuzu_data` Docker volume at `/data/graphiti.kuzu`.
**In-Memory Mode:**
```bash
KUZU_DB=:memory:
```
Note: Data will be lost when the container stops.
#### Data Management
**Backup:**
```bash
docker run --rm -v docker_kuzu_data:/data -v $(pwd):/backup alpine \
tar czf /backup/kuzu-backup.tar.gz -C /data .
```
**Restore:**
```bash
docker run --rm -v docker_kuzu_data:/data -v $(pwd):/backup alpine \
tar xzf /backup/kuzu-backup.tar.gz -C /data
```
**Clear Data:**
```bash
docker-compose down
docker volume rm docker_kuzu_data
docker-compose up # Creates fresh volume
```
#### Gotchas
- KuzuDB data is stored in a single file/directory
- The database file can grow large with extensive data
- In-memory mode provides faster performance but no persistence
### Neo4j
**File:** `docker-compose-neo4j.yml`
Neo4j runs as a separate container service with its own web interface.
#### Configuration
```bash
# 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:**
```bash
# 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:**
```bash
# 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:**
```bash
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
### FalkorDB
**File:** `docker-compose-falkordb.yml`
FalkorDB is a Redis-based graph database that runs as a separate container.
#### Configuration
```bash
# Environment variables
FALKORDB_URI=redis://falkordb:6379 # Connection URI (default: redis://falkordb:6379)
FALKORDB_PASSWORD= # Password (default: empty)
FALKORDB_DATABASE=default_db # Database name (default: default_db)
```
#### Accessing FalkorDB
- **Redis Protocol:** redis://localhost:6379
- **MCP Server:** http://localhost:8000
#### Data Management
**Backup:**
```bash
docker run --rm -v docker_falkordb_data:/data -v $(pwd):/backup alpine \
tar czf /backup/falkordb-backup.tar.gz -C /data .
```
**Restore:**
```bash
docker run --rm -v docker_falkordb_data:/data -v $(pwd):/backup alpine \
tar xzf /backup/falkordb-backup.tar.gz -C /data
```
**Clear Data:**
```bash
docker-compose -f docker-compose-falkordb.yml down
docker volume rm docker_falkordb_data
docker-compose -f docker-compose-falkordb.yml up
```
#### Gotchas
- FalkorDB uses Redis persistence mechanisms (AOF/RDB)
- Default configuration has no password - add one for production
- Database name is created automatically if it doesn't exist
- Redis commands can be used for debugging: `redis-cli -h localhost`
## Switching Between Databases
To switch from one database to another:
1. **Stop current setup:**
```bash
docker-compose down # or docker-compose -f docker-compose-[db].yml down
```
2. **Start new database:**
```bash
docker-compose -f docker-compose-[neo4j|falkordb].yml up
# or just docker-compose up for KuzuDB
```
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:
```bash
# 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
1. Check logs:
```bash
docker-compose logs graphiti-mcp
```
2. Verify `.env` file exists and contains valid API keys:
```bash
cat .env | grep API_KEY
```
3. Ensure Docker has enough resources allocated
### Database Connection Issues
**KuzuDB:**
- Check volume permissions: `docker exec graphiti-mcp ls -la /data`
- Verify database file isn't corrupted
**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`
- Check FalkorDB logs: `docker-compose -f docker-compose-falkordb.yml logs falkordb`
### Data Not Persisting
1. Verify volumes are created:
```bash
docker volume ls | grep docker_
```
2. Check volume mounts in container:
```bash
docker inspect graphiti-mcp | grep -A 5 Mounts
```
3. Ensure proper shutdown:
```bash
docker-compose down # Not docker-compose down -v (which removes volumes)
```
### Performance Issues
**KuzuDB:**
- Increase `KUZU_MAX_CONCURRENT_QUERIES`
- Consider using SSD for database file storage
- Monitor with: `docker stats graphiti-mcp`
**Neo4j:**
- Increase heap memory in docker-compose-neo4j.yml
- Adjust page cache size based on data size
- Check query performance in Neo4j browser
**FalkorDB:**
- Adjust Redis max memory policy
- Monitor with: `redis-cli -h localhost info memory`
- Consider Redis persistence settings (AOF vs RDB)
## Docker Resources
### Volumes
Each database configuration uses named volumes for data persistence:
- KuzuDB: `kuzu_data`
- Neo4j: `neo4j_data`, `neo4j_logs`
- FalkorDB: `falkordb_data`
### 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:
```yaml
services:
graphiti-mcp:
deploy:
resources:
limits:
cpus: '2.0'
memory: 1G
```
## Configuration Files
Each database has a dedicated configuration file in `../config/`:
- `config-docker-kuzu.yaml` - KuzuDB configuration
- `config-docker-neo4j.yaml` - Neo4j configuration
- `config-docker-falkordb.yaml` - FalkorDB configuration
These files are mounted read-only into the container at `/app/config/config.yaml`.