# Kima - Premium Self-Hosted Music Server # All-in-One container with AI-powered vibe matching # # Features included: # - Smart playlists with mood detection # - Enhanced vibe matching (Essentia AI) # - High-quality audio streaming # # Usage: # 1. Edit the MUSIC_PATH below # 2. Run: docker compose -f docker-compose.prod.yml up -d # 3. Open http://localhost:3030 services: kima: image: ${DOCKERHUB_USERNAME:-chevron7locked}/kima:${VERSION:-latest} container_name: kima ports: - "${PORT:-3030}:3030" volumes: # REQUIRED: Path to your music library - ${MUSIC_PATH:-/path/to/your/music}:/music # Persistent data (database, cache, etc.) - kima_data:/data environment: - TZ=${TZ:-UTC} - SESSION_SECRET=${SESSION_SECRET:-} # Lidarr webhook callback URL - how Lidarr reaches Kima when downloads complete # Default uses host.docker.internal which works on most setups with extra_hosts below # Override if using custom Docker networks: e.g., http://192.168.0.20:3030 - KIMA_CALLBACK_URL=${KIMA_CALLBACK_URL:-http://host.docker.internal:3030} - DISABLE_CLAP=${DISABLE_CLAP:-} # Makes host.docker.internal work on Linux (already works on Docker Desktop) extra_hosts: - "host.docker.internal:host-gateway" # Cap memory to prevent host kernel OOM cascade from anon_vma_chain slab exhaustion. # Without this, the host kernel OOM killer fires when Next.js VMA chains accumulate. # 6g is enough for frontend + backend + embeddings + Redis + Postgres. mem_limit: 6g memswap_limit: 8g # Fix Redis memory overcommit warning sysctls: - vm.overcommit_memory=1 restart: unless-stopped healthcheck: test: ["CMD", "node", "/app/healthcheck.js"] interval: 30s timeout: 10s start_period: 60s retries: 3 volumes: kima_data: