version: "3.9" services: rag-db: image: ankane/pgvector:latest container_name: rag-db environment: POSTGRES_DB: rag_db POSTGRES_USER: user POSTGRES_PASSWORD: password ports: - "5433:5432" volumes: - rag-db-data:/var/lib/postgresql/data redis: image: redis:7-alpine container_name: rag-redis ports: - "6379:6379" volumes: - redis-data:/data elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.15.3 container_name: rag-elasticsearch environment: discovery.type: single-node xpack.security.enabled: "false" ES_JAVA_OPTS: -Xms512m -Xmx512m ports: - "9200:9200" volumes: - elasticsearch-data:/usr/share/elasticsearch/data ingestor-app: build: context: . dockerfile: Dockerfile container_name: rag-ingestor-app env_file: - .env environment: PORT: ${PORT:-3311} DATABASE_URL: ${DATABASE_URL:-postgresql://user:password@rag-db:5432/rag_db} REDIS_URL: ${REDIS_URL:-redis://redis:6379} OLLAMA_BASE_URL: ${OLLAMA_BASE_URL} EMBEDDING_MODEL: ${EMBEDDING_MODEL:-nomic-embed-text} LLM_MODEL: ${LLM_MODEL:-gptoss-20b} DOCUMENT_CLASSIFIER_MODEL: ${DOCUMENT_CLASSIFIER_MODEL:-qwen2.5:7b} EMBEDDING_DIMENSION: ${EMBEDDING_DIMENSION:-768} EMBEDDING_DOCUMENT_PREFIX: ${EMBEDDING_DOCUMENT_PREFIX:-} EMBEDDING_QUERY_PREFIX: ${EMBEDDING_QUERY_PREFIX:-} EMBEDDING_MAX_INPUT_CHARS: ${EMBEDDING_MAX_INPUT_CHARS:-1400} RERANKER_BASE_URL: ${RERANKER_BASE_URL:-} RERANKER_MODEL: ${RERANKER_MODEL:-} RERANKER_ENABLED: ${RERANKER_ENABLED:-false} RERANKER_TOP_N: ${RERANKER_TOP_N:-12} RERANKER_DOCUMENT_MAX_CHARS: ${RERANKER_DOCUMENT_MAX_CHARS:-900} RERANKER_TIMEOUT_MS: ${RERANKER_TIMEOUT_MS:-10000} RERANKER_CONCURRENCY: ${RERANKER_CONCURRENCY:-2} QUERY_TOP_K: ${QUERY_TOP_K:-5} QUERY_FUZZY_TEXT_WINDOW: ${QUERY_FUZZY_TEXT_WINDOW:-4000} CHUNK_SIZE: ${CHUNK_SIZE:-300} CHUNK_OVERLAP: ${CHUNK_OVERLAP:-50} IMPORT_DIR: ${IMPORT_DIR:-/app/import-dir} SYNC_KNOWLEDGE_BASE_SUBDIRS: ${SYNC_KNOWLEDGE_BASE_SUBDIRS:-true} SYNC_AUTO_CREATE_KNOWLEDGE_BASES: ${SYNC_AUTO_CREATE_KNOWLEDGE_BASES:-true} UPLOAD_DIR: ${UPLOAD_DIR:-/app/data/uploads} GIT_REPO_CACHE_DIR: ${GIT_REPO_CACHE_DIR:-/app/data/git-repos} GIT_REPO_MAX_FILE_BYTES: ${GIT_REPO_MAX_FILE_BYTES:-1000000} ELASTICSEARCH_URL: ${ELASTICSEARCH_URL:-http://elasticsearch:9200} ELASTICSEARCH_INDEX_PREFIX: ${ELASTICSEARCH_INDEX_PREFIX:-rag} CRAWL_DEFAULT_MAX_DEPTH: ${CRAWL_DEFAULT_MAX_DEPTH:-2} SYNC_CRON: ${SYNC_CRON:-55 01 * * *} LOG_LEVEL: ${LOG_LEVEL:-info} ports: - "3311:3311" depends_on: - rag-db - redis - elasticsearch volumes: - app-data:/app/data - ./import-dir:/app/import-dir ingestor-worker: build: context: . dockerfile: Dockerfile container_name: rag-ingestor-worker # command: ["node", "dist/workers/worker.js"] command: ["sh", "-c", "sleep 10 && node dist/workers/worker.js"] env_file: - .env environment: DATABASE_URL: ${DATABASE_URL:-postgresql://user:password@rag-db:5432/rag_db} REDIS_URL: ${REDIS_URL:-redis://redis:6379} OLLAMA_BASE_URL: ${OLLAMA_BASE_URL} EMBEDDING_MODEL: ${EMBEDDING_MODEL:-nomic-embed-text} LLM_MODEL: ${LLM_MODEL:-gptoss-20b} DOCUMENT_CLASSIFIER_MODEL: ${DOCUMENT_CLASSIFIER_MODEL:-qwen2.5:7b} EMBEDDING_DIMENSION: ${EMBEDDING_DIMENSION:-768} EMBEDDING_DOCUMENT_PREFIX: ${EMBEDDING_DOCUMENT_PREFIX:-} EMBEDDING_QUERY_PREFIX: ${EMBEDDING_QUERY_PREFIX:-} EMBEDDING_MAX_INPUT_CHARS: ${EMBEDDING_MAX_INPUT_CHARS:-1400} RERANKER_BASE_URL: ${RERANKER_BASE_URL:-} RERANKER_MODEL: ${RERANKER_MODEL:-} RERANKER_ENABLED: ${RERANKER_ENABLED:-false} RERANKER_TOP_N: ${RERANKER_TOP_N:-12} RERANKER_DOCUMENT_MAX_CHARS: ${RERANKER_DOCUMENT_MAX_CHARS:-900} RERANKER_TIMEOUT_MS: ${RERANKER_TIMEOUT_MS:-10000} RERANKER_CONCURRENCY: ${RERANKER_CONCURRENCY:-2} QUERY_TOP_K: ${QUERY_TOP_K:-5} QUERY_FUZZY_TEXT_WINDOW: ${QUERY_FUZZY_TEXT_WINDOW:-4000} CHUNK_SIZE: ${CHUNK_SIZE:-300} CHUNK_OVERLAP: ${CHUNK_OVERLAP:-50} IMPORT_DIR: ${IMPORT_DIR:-/app/import-dir} SYNC_KNOWLEDGE_BASE_SUBDIRS: ${SYNC_KNOWLEDGE_BASE_SUBDIRS:-true} SYNC_AUTO_CREATE_KNOWLEDGE_BASES: ${SYNC_AUTO_CREATE_KNOWLEDGE_BASES:-true} UPLOAD_DIR: ${UPLOAD_DIR:-/app/data/uploads} GIT_REPO_CACHE_DIR: ${GIT_REPO_CACHE_DIR:-/app/data/git-repos} GIT_REPO_MAX_FILE_BYTES: ${GIT_REPO_MAX_FILE_BYTES:-1000000} ELASTICSEARCH_URL: ${ELASTICSEARCH_URL:-http://elasticsearch:9200} ELASTICSEARCH_INDEX_PREFIX: ${ELASTICSEARCH_INDEX_PREFIX:-rag} CRAWL_DEFAULT_MAX_DEPTH: ${CRAWL_DEFAULT_MAX_DEPTH:-2} LOG_LEVEL: ${LOG_LEVEL:-info} depends_on: - rag-db - redis - elasticsearch volumes: - app-data:/app/data - ./import-dir:/app/import-dir ragfind: build: context: . dockerfile: Dockerfile container_name: rag-ragfind command: ["node", "dist/ragfind/server.js"] env_file: - .env environment: PORT: 3312 DATABASE_URL: ${DATABASE_URL:-postgresql://user:password@rag-db:5432/rag_db} REDIS_URL: ${REDIS_URL:-redis://redis:6379} OLLAMA_BASE_URL: ${OLLAMA_BASE_URL} EMBEDDING_MODEL: ${EMBEDDING_MODEL:-nomic-embed-text} LLM_MODEL: ${LLM_MODEL:-gptoss-20b} DOCUMENT_CLASSIFIER_MODEL: ${DOCUMENT_CLASSIFIER_MODEL:-qwen2.5:7b} EMBEDDING_DIMENSION: ${EMBEDDING_DIMENSION:-768} EMBEDDING_DOCUMENT_PREFIX: ${EMBEDDING_DOCUMENT_PREFIX:-} EMBEDDING_QUERY_PREFIX: ${EMBEDDING_QUERY_PREFIX:-} EMBEDDING_MAX_INPUT_CHARS: ${EMBEDDING_MAX_INPUT_CHARS:-1400} RERANKER_BASE_URL: ${RERANKER_BASE_URL:-} RERANKER_MODEL: ${RERANKER_MODEL:-} RERANKER_ENABLED: ${RERANKER_ENABLED:-false} RERANKER_TOP_N: ${RERANKER_TOP_N:-12} RERANKER_DOCUMENT_MAX_CHARS: ${RERANKER_DOCUMENT_MAX_CHARS:-900} RERANKER_TIMEOUT_MS: ${RERANKER_TIMEOUT_MS:-10000} RERANKER_CONCURRENCY: ${RERANKER_CONCURRENCY:-2} QUERY_TOP_K: ${QUERY_TOP_K:-5} QUERY_FUZZY_TEXT_WINDOW: ${QUERY_FUZZY_TEXT_WINDOW:-4000} CHUNK_SIZE: ${CHUNK_SIZE:-300} CHUNK_OVERLAP: ${CHUNK_OVERLAP:-50} IMPORT_DIR: ${IMPORT_DIR:-/app/import-dir} SYNC_KNOWLEDGE_BASE_SUBDIRS: ${SYNC_KNOWLEDGE_BASE_SUBDIRS:-true} SYNC_AUTO_CREATE_KNOWLEDGE_BASES: ${SYNC_AUTO_CREATE_KNOWLEDGE_BASES:-true} UPLOAD_DIR: ${UPLOAD_DIR:-/app/data/uploads} ORIGINAL_STORAGE_DIR: ${ORIGINAL_STORAGE_DIR:-/app/data/originals} GIT_REPO_CACHE_DIR: ${GIT_REPO_CACHE_DIR:-/app/data/git-repos} GIT_REPO_MAX_FILE_BYTES: ${GIT_REPO_MAX_FILE_BYTES:-1000000} ELASTICSEARCH_URL: ${ELASTICSEARCH_URL:-http://elasticsearch:9200} ELASTICSEARCH_INDEX_PREFIX: ${ELASTICSEARCH_INDEX_PREFIX:-rag} CRAWL_DEFAULT_MAX_DEPTH: ${CRAWL_DEFAULT_MAX_DEPTH:-2} SYNC_CRON: ${SYNC_CRON:-*/30 * * * *} LOG_LEVEL: ${LOG_LEVEL:-info} ports: - "3312:3312" depends_on: - rag-db - redis - elasticsearch volumes: - app-data:/app/data volumes: rag-db-data: redis-data: app-data: elasticsearch-data: