# Kernal - Open Source Memory-as-a-Service # Complete self-hosted setup with all dependencies # # Quick start: # 1. Copy .env.example to .env and configure (especially OPENAI_API_KEY) # 2. Run: docker-compose up -d # 3. Check logs for your API key: docker-compose logs memory-service # # Services: # - memory-service: FastAPI application (http://localhost:8000) # - qdrant: Vector database for embeddings # - postgres: Metadata and tenant storage # - redis: Job queue for async processing # - embedding-worker: Background embedding generation (2 replicas) services: # Qdrant - Vector Database # Stores memory embeddings for semantic search qdrant: image: qdrant/qdrant:v1.7.0 ports: - "6333:6333" # HTTP API - "6334:6334" # gRPC volumes: - qdrant_storage:/qdrant/storage environment: - QDRANT__SERVICE__HTTP_PORT=6333 - QDRANT__SERVICE__GRPC_PORT=6334 restart: unless-stopped # Redis - Job Queue # Manages async embedding generation jobs redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis_data:/data command: redis-server --appendonly yes healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 3 restart: unless-stopped # PostgreSQL - Metadata Storage # Stores tenants, API keys, and memory metadata postgres: image: postgres:15-alpine ports: - "5432:5432" environment: - POSTGRES_USER=memory_service - POSTGRES_PASSWORD=password # Change in production! - POSTGRES_DB=memory_service volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U memory_service"] interval: 30s timeout: 10s retries: 3 restart: unless-stopped # Kernal API Service # Main FastAPI application memory-service: build: . ports: - "8000:8000" environment: - QDRANT_HOST=qdrant - REDIS_HOST=redis - POSTGRES_HOST=postgres depends_on: - qdrant - redis - postgres volumes: - .:/app command: uvicorn memory_service.main:app --host 0.0.0.0 --port 8000 --reload healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s restart: unless-stopped # Embedding Workers # Background processing for embedding generation # Runs 2 replicas for parallel processing embedding-worker: build: . environment: - QDRANT_HOST=qdrant - REDIS_HOST=redis - POSTGRES_HOST=postgres depends_on: - redis - postgres - qdrant volumes: - .:/app command: python memory_service/worker.py restart: unless-stopped deploy: replicas: 2 # Increase for higher throughput healthcheck: test: ["CMD", "python", "-c", "import sys; sys.exit(0)"] interval: 60s timeout: 10s retries: 3 start_period: 30s volumes: qdrant_storage: redis_data: postgres_data: