# Desktop / installer stack — no live code mounts, no host D: drives. # Used by the Electron app (dev + packaged). Data dirs come from .env. services: qdrant: image: qdrant/qdrant:v1.19.0 container_name: cinearchive-qdrant ports: - "6333:6333" - "6334:6334" volumes: - ${CINEKIVE_DATA_DIR:-./data}/qdrant:/qdrant/storage ulimits: nproc: 65535 nofile: soft: 65535 hard: 65535 restart: unless-stopped healthcheck: test: ["CMD-SHELL", "bash -c 'exec 3<>/dev/tcp/127.0.0.1/6333'"] interval: 10s timeout: 5s retries: 10 start_period: 30s api: image: ghcr.io/gianluca-improta/cinekive-api:${CINEKIVE_IMAGE_TAG:-0.5.3} build: context: ./apps/api dockerfile: Dockerfile container_name: cinearchive-api ports: - "8000:8000" volumes: - ${LIBRARY_HOST_PATH:-./data/library}:/data/library - ./scripts:/app/scripts:ro - ${CINEKIVE_DATA_DIR:-./data}/videos:/data/videos - ${CINEKIVE_DATA_DIR:-./data}/artifacts:/data/artifacts - ${CINEKIVE_DATA_DIR:-./data}/db:/data/db - ${CINEKIVE_DATA_DIR:-./data}/models:/data/models - ${CINEKIVE_LICENSE_PATH:-./data/license.json}:/data/license.json env_file: - .env environment: - DATABASE_URL=${DATABASE_URL:-sqlite+aiosqlite:////data/db/cinearchive.db} - QDRANT_URL=${QDRANT_URL:-http://qdrant:6333} - QDRANT_COLLECTION=${QDRANT_COLLECTION:-cinearchive_shots_v1} - VIDEOS_DIR=/data/videos - ARTIFACTS_DIR=/data/artifacts - LIBRARY_DIR=/data/library - MODELS_DIR=/data/models - CINEKIVE_LICENSE_PATH=/data/license.json - CINEKIVE_LICENSE_ENFORCE=${CINEKIVE_LICENSE_ENFORCE:-false} - HF_HOME=/data/models/huggingface - EMBEDDING_MODEL=${EMBEDDING_MODEL:-google/siglip-so400m-patch14-384} - EMBEDDING_BATCH_SIZE=${EMBEDDING_BATCH_SIZE:-8} - DEVICE=${DEVICE:-cpu} - OPENBLAS_NUM_THREADS=4 - CORS_ORIGINS=${CORS_ORIGINS:-http://localhost:3000} - LOG_LEVEL=${LOG_LEVEL:-INFO} - OLLAMA_URL=${OLLAMA_URL:-http://host.docker.internal:11434} - OLLAMA_MODEL=${OLLAMA_MODEL:-qwen3-vl:8b} - VLM_ENABLED=${VLM_ENABLED:-true} - CINEKIVE_LAN_WEB_URL=${CINEKIVE_LAN_WEB_URL:-} - ENRICH_TIER=${ENRICH_TIER:-auto} - ENRICH_VRAM_GB=${ENRICH_VRAM_GB:-16} - ENRICH_CONTINUOUS=${ENRICH_CONTINUOUS:-true} - ENRICH_INTERVAL_SEC=${ENRICH_INTERVAL_SEC:-90} - ENRICH_BATCH_SIZE=${ENRICH_BATCH_SIZE:-4} - WATCHER_ENABLED=${WATCHER_ENABLED:-false} - SEEK_ENABLED=${SEEK_ENABLED:-true} - MIRROR_SCRIPTS_DIR=/app/scripts # Seed only — library_runtime.json freezes prefs on first boot (see library_config). - DEDUPE_ON_INGEST=${DEDUPE_ON_INGEST:-false} - DEDUPE_GLOBAL=${DEDUPE_GLOBAL:-false} - DEDUPE_INTERVAL_SEC=${DEDUPE_INTERVAL_SEC:-300} extra_hosts: - "host.docker.internal:host-gateway" depends_on: qdrant: condition: service_healthy restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 5 start_period: 90s web: image: ghcr.io/gianluca-improta/cinekive-web:${CINEKIVE_IMAGE_TAG:-0.5.3} build: context: ./apps/web dockerfile: Dockerfile args: NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:8000} container_name: cinearchive-web ports: - "3000:3000" environment: - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL:-http://localhost:8000} depends_on: api: condition: service_healthy restart: unless-stopped