services: redis: image: redis:7-alpine container_name: rabelia-redis restart: unless-stopped volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # WHY (Bug #1, fix follow-up to Vague 3): the app refuses to start with # WEB_CONCURRENCY>1 unless QDRANT_URL points to a real Qdrant instance # (embedded local Qdrant does not support multiple workers). This service # provides that instance so `docker-compose up` works out of the box. # Not exposed to the host (no `ports:`) - only reachable from the `app` # container over the internal compose network, since Qdrant has no auth # by default. qdrant: image: qdrant/qdrant:latest container_name: rabelia-qdrant restart: unless-stopped volumes: - qdrant_data:/qdrant/storage healthcheck: # The official image intentionally does not ship curl (see # qdrant/qdrant#4250), so a curl-based healthcheck silently never # passes and depends_on:condition:service_healthy hangs forever. # This bash /dev/tcp check matches Qdrant's own official # tools/compose/docker-compose.yaml. test: ["CMD-SHELL", "bash -c ':> /dev/tcp/127.0.0.1/6333' || exit 1"] interval: 5s timeout: 5s retries: 5 app: build: context: . args: VITE_ALLOW_SELF_REGISTER: ${VITE_ALLOW_SELF_REGISTER:-false} VITE_MICROSOFT_AUTH_ENABLED: ${VITE_MICROSOFT_AUTH_ENABLED:-false} container_name: rabelia-api ports: - "8000:8000" env_file: - path: .env required: false environment: REDIS_URL: redis://redis:6379 QDRANT_URL: http://qdrant:6333 ENV: ${ENV:-production} APP_ENV: ${APP_ENV:-production} WEB_CONCURRENCY: ${WEB_CONCURRENCY:-2} BACKGROUND_MAX_WORKERS: ${BACKGROUND_MAX_WORKERS:-8} EMBEDDING_MODEL: ${EMBEDDING_MODEL:-sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2} QDRANT_VECTOR_SIZE: ${QDRANT_VECTOR_SIZE:-384} FASTEMBED_CACHE_PATH: ${FASTEMBED_CACHE_PATH:-/app/fastembed_cache} HF_TOKEN: ${HF_TOKEN:-} volumes: - rabelia_data:/app/data - fastembed_cache:/app/fastembed_cache depends_on: redis: condition: service_healthy qdrant: condition: service_healthy restart: unless-stopped volumes: redis_data: rabelia_data: fastembed_cache: qdrant_data: