Skip to main content
Glama

MCP Memory Service

docker.md16.1 kB
# Docker Deployment Guide This comprehensive guide covers deploying MCP Memory Service using Docker, including various configurations for different use cases and environments. ## Overview MCP Memory Service provides Docker support with multiple deployment configurations: - **Standard Mode**: For MCP clients (Claude Desktop, VS Code, etc.) - **Standalone Mode**: For testing and development (prevents boot loops) - **HTTP/SSE Mode**: For web services and multi-client access - **Production Mode**: For scalable server deployments ## Prerequisites - **Docker** 20.10+ installed on your system - **Docker Compose** 2.0+ (recommended for simplified deployment) - Basic knowledge of Docker concepts - Sufficient disk space for Docker images and container volumes ## Quick Start ### Using Docker Compose (Recommended) ```bash # Clone the repository git clone https://github.com/doobidoo/mcp-memory-service.git cd mcp-memory-service # Start with standard configuration docker-compose up -d # View logs docker-compose logs -f ``` This will: - Build a Docker image for the Memory Service - Create persistent volumes for the database and backups - Start the service configured for MCP clients ## Docker Compose Configurations ### 1. Standard Configuration (`docker-compose.yml`) **Best for**: MCP clients like Claude Desktop, VS Code with MCP extension ```yaml version: '3.8' services: mcp-memory-service: build: . stdin_open: true tty: true volumes: - ./data/chroma_db:/app/chroma_db - ./data/backups:/app/backups environment: - MCP_MEMORY_STORAGE_BACKEND=chromadb restart: unless-stopped ``` ```bash # Deploy standard configuration docker-compose up -d ``` ### 2. Standalone Configuration (`docker-compose.standalone.yml`) **Best for**: Testing, development, and preventing boot loops when no MCP client is connected ```yaml version: '3.8' services: mcp-memory-service: build: . stdin_open: true tty: true ports: - "8000:8000" volumes: - ./data/chroma_db:/app/chroma_db - ./data/backups:/app/backups environment: - MCP_STANDALONE_MODE=1 - MCP_HTTP_HOST=0.0.0.0 - MCP_HTTP_PORT=8000 restart: unless-stopped ``` ```bash # Deploy standalone configuration docker-compose -f docker-compose.standalone.yml up -d # Test connectivity curl http://localhost:8000/health ``` ### 3. UV Configuration (`docker-compose.uv.yml`) **Best for**: Enhanced dependency management with UV package manager ```yaml version: '3.8' services: mcp-memory-service: build: . stdin_open: true tty: true ports: - "8000:8000" volumes: - ./data/chroma_db:/app/chroma_db - ./data/backups:/app/backups environment: - UV_ACTIVE=1 - MCP_MEMORY_STORAGE_BACKEND=sqlite_vec restart: unless-stopped ``` ### 4. Python Path Configuration (`docker-compose.pythonpath.yml`) **Best for**: Custom Python path configurations and development mode ```bash # Deploy with Python path configuration docker-compose -f docker-compose.pythonpath.yml up -d ``` ## Manual Docker Commands ### Basic Docker Deployment ```bash # Build the Docker image docker build -t mcp-memory-service . # Create directories for persistent storage mkdir -p ./data/chroma_db ./data/backups # Run in standard mode (for MCP clients) docker run -d --name memory-service \ -v $(pwd)/data/chroma_db:/app/chroma_db \ -v $(pwd)/data/backups:/app/backups \ -e MCP_MEMORY_STORAGE_BACKEND=chromadb \ --stdin --tty \ mcp-memory-service # Run in standalone/HTTP mode docker run -d -p 8000:8000 --name memory-service \ -v $(pwd)/data/chroma_db:/app/chroma_db \ -v $(pwd)/data/backups:/app/backups \ -e MCP_STANDALONE_MODE=1 \ -e MCP_HTTP_HOST=0.0.0.0 \ -e MCP_HTTP_PORT=8000 \ --stdin --tty \ mcp-memory-service ``` ### Using Specific Docker Images ```bash # Use pre-built Glama deployment image docker run -d -p 8000:8000 \ -v $(pwd)/data:/app/data \ -e MCP_API_KEY=your-api-key \ --name memory-service \ mcp-memory-service:glama # Use SQLite-vec optimized image docker run -d -p 8000:8000 \ -v $(pwd)/data:/app/data \ -e MCP_MEMORY_STORAGE_BACKEND=sqlite_vec \ --name memory-service \ mcp-memory-service:sqlite-vec ``` ## Environment Configuration ### Core Environment Variables | Variable | Default | Description | |----------|---------|-------------| | `MCP_MEMORY_STORAGE_BACKEND` | `chromadb` | Storage backend (chromadb, sqlite_vec) | | `MCP_HTTP_HOST` | `0.0.0.0` | HTTP server bind address | | `MCP_HTTP_PORT` | `8000` | HTTP server port | | `MCP_STANDALONE_MODE` | `false` | Enable standalone HTTP mode | | `MCP_API_KEY` | `none` | API key for authentication | ### Docker-Specific Variables | Variable | Default | Description | |----------|---------|-------------| | `DOCKER_CONTAINER` | `auto-detect` | Indicates running in Docker | | `UV_ACTIVE` | `false` | Use UV package manager | | `PYTHONPATH` | `/app/src` | Python module search path | ### Storage Configuration ```bash # ChromaDB backend docker run -d \ -e MCP_MEMORY_STORAGE_BACKEND=chromadb \ -e MCP_MEMORY_CHROMA_PATH=/app/chroma_db \ -v $(pwd)/data/chroma_db:/app/chroma_db \ mcp-memory-service # SQLite-vec backend (recommended for containers) docker run -d \ -e MCP_MEMORY_STORAGE_BACKEND=sqlite_vec \ -e MCP_MEMORY_SQLITE_PATH=/app/sqlite_data/memory.db \ -v $(pwd)/data/sqlite_data:/app/sqlite_data \ mcp-memory-service ``` ## Production Deployment ### Docker Swarm Deployment ```yaml # docker-stack.yml version: '3.8' services: mcp-memory-service: image: mcp-memory-service:latest ports: - "8000:8000" environment: - MCP_MEMORY_STORAGE_BACKEND=sqlite_vec - MCP_HTTP_HOST=0.0.0.0 - MCP_API_KEY=REDACTED volumes: - memory_data:/app/data secrets: - api_key deploy: replicas: 3 restart_policy: condition: on-failure delay: 5s max_attempts: 3 resources: limits: cpus: '1.0' memory: 2G reservations: cpus: '0.5' memory: 1G volumes: memory_data: secrets: api_key: external: true ``` ```bash # Deploy to Docker Swarm docker stack deploy -c docker-stack.yml mcp-memory ``` ### Kubernetes Deployment ```yaml # k8s-deployment.yml apiVersion: apps/v1 kind: Deployment metadata: name: mcp-memory-service spec: replicas: 3 selector: matchLabels: app: mcp-memory-service template: metadata: labels: app: mcp-memory-service spec: containers: - name: mcp-memory-service image: mcp-memory-service:latest ports: - containerPort: 8000 env: - name: MCP_MEMORY_STORAGE_BACKEND value: "sqlite_vec" - name: MCP_HTTP_HOST value: "0.0.0.0" - name: MCP_API_KEY valueFrom: secretKeyRef: name: mcp-api-key key: api-key volumeMounts: - name: data-volume mountPath: /app/data resources: limits: cpu: 1000m memory: 2Gi requests: cpu: 500m memory: 1Gi volumes: - name: data-volume persistentVolumeClaim: claimName: mcp-memory-pvc --- apiVersion: v1 kind: Service metadata: name: mcp-memory-service spec: selector: app: mcp-memory-service ports: - port: 80 targetPort: 8000 type: LoadBalancer ``` ## Volume Management ### Data Persistence ```bash # Create named volumes docker volume create mcp_memory_data docker volume create mcp_memory_backups # Use named volumes docker run -d \ -v mcp_memory_data:/app/data \ -v mcp_memory_backups:/app/backups \ mcp-memory-service # Backup volumes docker run --rm \ -v mcp_memory_data:/data \ -v $(pwd)/backup:/backup \ alpine tar czf /backup/mcp_memory_$(date +%Y%m%d).tar.gz /data ``` ### Database Migration ```bash # Export data from running container docker exec memory-service python scripts/backup_memories.py # Import data to new container docker cp ./backup.json new-memory-service:/app/ docker exec new-memory-service python scripts/restore_memories.py /app/backup.json ``` ## Monitoring and Logging ### Container Health Checks ```yaml # Add to docker-compose.yml services: mcp-memory-service: build: . healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s ``` ### Log Management ```bash # View container logs docker-compose logs -f mcp-memory-service # Configure log rotation docker-compose -f docker-compose.yml -f docker-compose.logging.yml up -d ``` ```yaml # docker-compose.logging.yml version: '3.8' services: mcp-memory-service: logging: driver: "json-file" options: max-size: "10m" max-file: "3" ``` ### Monitoring with Prometheus ```yaml # docker-compose.monitoring.yml version: '3.8' services: mcp-memory-service: environment: - MCP_MEMORY_ENABLE_METRICS=true - MCP_MEMORY_METRICS_PORT=9090 ports: - "9090:9090" prometheus: image: prom/prometheus ports: - "9091:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ``` ## Troubleshooting ### Common Docker Issues #### 1. Container Boot Loop **Symptom**: Container exits immediately with code 0 **Solution**: Use standalone mode or ensure proper TTY configuration: ```yaml services: mcp-memory-service: stdin_open: true tty: true environment: - MCP_STANDALONE_MODE=1 ``` #### 2. Permission Issues **Symptom**: Permission denied errors in container **Solution**: Fix volume permissions: ```bash # Set proper ownership sudo chown -R 1000:1000 ./data # Or run with specific user docker run --user $(id -u):$(id -g) mcp-memory-service ``` #### 3. Storage Backend Issues **Symptom**: Database initialization failures **Solution**: Use SQLite-vec for containers: ```bash docker run -d \ -e MCP_MEMORY_STORAGE_BACKEND=sqlite_vec \ -v $(pwd)/data:/app/data \ mcp-memory-service ``` #### 4. Network Connectivity **Symptom**: Cannot connect to containerized service **Solution**: Check port mapping and firewall: ```bash # Test container networking docker exec memory-service netstat -tlnp # Check port mapping docker port memory-service # Test external connectivity curl http://localhost:8000/health ``` #### 5. Model Download Issues **Symptom**: `OSError: We couldn't connect to 'https://huggingface.co'` when starting container **Issue**: Container cannot download sentence-transformer models due to network restrictions **Solutions**: 1. **Pre-download models and mount cache (Recommended)**: ```bash # Step 1: Download models on host machine first python -c "from sentence_transformers import SentenceTransformer; \ model = SentenceTransformer('all-MiniLM-L6-v2'); \ print('Model downloaded successfully')" # Step 2: Run container with model cache mounted docker run -d --name memory-service \ -v ~/.cache/huggingface:/root/.cache/huggingface \ -v $(pwd)/data/chroma_db:/app/chroma_db \ -e MCP_MEMORY_STORAGE_BACKEND=chromadb \ mcp-memory-service ``` 2. **Configure proxy for Docker Desktop (Windows/Corporate networks)**: ```bash # With proxy environment variables docker run -d --name memory-service \ -e HTTPS_PROXY=http://your-proxy:port \ -e HTTP_PROXY=http://your-proxy:port \ -e NO_PROXY=localhost,127.0.0.1 \ -v $(pwd)/data:/app/data \ mcp-memory-service ``` 3. **Use offline mode with pre-cached models**: ```bash # Ensure models are in mounted volume, then run offline docker run -d --name memory-service \ -v ~/.cache/huggingface:/root/.cache/huggingface \ -e HF_HUB_OFFLINE=1 \ -e TRANSFORMERS_OFFLINE=1 \ -e HF_DATASETS_OFFLINE=1 \ -v $(pwd)/data:/app/data \ mcp-memory-service ``` 4. **Docker Compose with model cache**: ```yaml # docker-compose.yml version: '3.8' services: mcp-memory-service: build: . volumes: # Mount model cache from host - ${HOME}/.cache/huggingface:/root/.cache/huggingface - ./data/chroma_db:/app/chroma_db - ./data/backups:/app/backups environment: - MCP_MEMORY_STORAGE_BACKEND=chromadb # Optional: force offline mode if models are pre-cached # - HF_HUB_OFFLINE=1 # - TRANSFORMERS_OFFLINE=1 ``` **Prevention**: Always mount the Hugging Face cache directory as a volume to persist models between container runs and avoid re-downloading. ### Diagnostic Commands #### Container Status ```bash # Check container status docker ps -a # View container logs docker logs memory-service # Execute commands in container docker exec -it memory-service bash # Check resource usage docker stats memory-service ``` #### Service Health ```bash # Test HTTP endpoints curl http://localhost:8000/health curl http://localhost:8000/stats # Check database connectivity docker exec memory-service python -c " from src.mcp_memory_service.storage.sqlite_vec import SqliteVecStorage storage = SqliteVecStorage() print('Database accessible') " ``` #### Model Cache Verification ```bash # Check if models are cached on host ls -la ~/.cache/huggingface/hub/ # Verify model availability in container docker exec memory-service ls -la /root/.cache/huggingface/hub/ # Test model loading in container docker exec memory-service python -c " from sentence_transformers import SentenceTransformer try: model = SentenceTransformer('all-MiniLM-L6-v2') print('✅ Model loaded successfully') except Exception as e: print(f'❌ Model loading failed: {e}') " ``` ## Security Considerations ### API Key Authentication ```bash # Generate secure API key API_KEY=$(openssl rand -hex 32) # Use with Docker docker run -d \ -e MCP_API_KEY=$API_KEY \ -p 8000:8000 \ mcp-memory-service ``` ### HTTPS Configuration ```yaml # docker-compose.https.yml services: mcp-memory-service: environment: - MCP_HTTPS_ENABLED=true - MCP_HTTP_PORT=8443 - MCP_SSL_CERT_FILE=/app/certs/cert.pem - MCP_SSL_KEY_FILE=/app/certs/key.pem volumes: - ./certs:/app/certs:ro ports: - "8443:8443" ``` ### Container Security ```bash # Run with security options docker run -d \ --security-opt no-new-privileges:true \ --cap-drop ALL \ --cap-add NET_BIND_SERVICE \ --read-only \ --tmpfs /tmp \ mcp-memory-service ``` ## Performance Optimization ### Resource Limits ```yaml services: mcp-memory-service: deploy: resources: limits: cpus: '2.0' memory: 4G reservations: cpus: '1.0' memory: 2G ``` ### Multi-Stage Builds ```dockerfile # Optimized Dockerfile FROM python:3.11-slim as builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt FROM python:3.11-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH CMD ["python", "src/mcp_memory_service/server.py"] ``` ## Development Workflow ### Development with Docker ```bash # Development with live reload docker-compose -f docker-compose.dev.yml up # Run tests in container docker exec memory-service pytest tests/ # Debug with interactive shell docker exec -it memory-service bash ``` ### Building Custom Images ```bash # Build with specific tag docker build -t mcp-memory-service:v1.2.3 . # Build for multiple platforms docker buildx build --platform linux/amd64,linux/arm64 -t mcp-memory-service:latest . # Push to registry docker push mcp-memory-service:latest ``` ## Related Documentation - [Installation Guide](../installation/master-guide.md) - General installation instructions - [Multi-Client Setup](../integration/multi-client.md) - Multi-client configuration - [Ubuntu Setup](../platforms/ubuntu.md) - Ubuntu Docker deployment - [Windows Setup](../platforms/windows.md) - Windows Docker deployment - [Troubleshooting](../troubleshooting/general.md) - Docker-specific troubleshooting

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/doobidoo/mcp-memory-service'

If you have feedback or need assistance with the MCP directory API, please join our Discord server