version: '3' services: api_server: image: danswer/danswer-backend:latest build: context: ../../backend dockerfile: Dockerfile command: > /bin/sh -c "alembic upgrade head && echo \"Starting Danswer Api Server\" && uvicorn danswer.main:app --host 0.0.0.0 --port 8080" depends_on: - relational_db - index restart: always ports: - "8080:8080" environment: - GEN_AI_MODEL_PROVIDER=${GEN_AI_MODEL_PROVIDER:-openai} - GEN_AI_MODEL_VERSION=${GEN_AI_MODEL_VERSION:-gpt-3.5-turbo} - GEN_AI_API_KEY=${GEN_AI_API_KEY:-} - GEN_AI_API_ENDPOINT=${GEN_AI_API_ENDPOINT:-} - GEN_AI_API_VERSION=${GEN_AI_API_VERSION:-} - NUM_DOCUMENT_TOKENS_FED_TO_GENERATIVE_MODEL=${NUM_DOCUMENT_TOKENS_FED_TO_GENERATIVE_MODEL:-} - POSTGRES_HOST=relational_db - VESPA_HOST=index - AUTH_TYPE=${AUTH_TYPE:-disabled} - QA_TIMEOUT=${QA_TIMEOUT:-} - VALID_EMAIL_DOMAINS=${VALID_EMAIL_DOMAINS:-} - GOOGLE_OAUTH_CLIENT_ID=${GOOGLE_OAUTH_CLIENT_ID:-} - GOOGLE_OAUTH_CLIENT_SECRET=${GOOGLE_OAUTH_CLIENT_SECRET:-} - DISABLE_GENERATIVE_AI=${DISABLE_GENERATIVE_AI:-} - NOTION_CONNECTOR_ENABLE_RECURSIVE_PAGE_LOOKUP=${NOTION_CONNECTOR_ENABLE_RECURSIVE_PAGE_LOOKUP:-} - DISABLE_LLM_FILTER_EXTRACTION=${DISABLE_LLM_FILTER_EXTRACTION:-} # Recency Bias for search results, decay at 1 / (1 + DOC_TIME_DECAY * x years) - DOC_TIME_DECAY=${DOC_TIME_DECAY:-} # Hybrid Search Alpha (0 for entirely keyword, 1 for entirely vector) - HYBRID_ALPHA=${HYBRID_ALPHA:-} # Don't change the NLP model configs unless you know what you're doing - DOCUMENT_ENCODER_MODEL=${DOCUMENT_ENCODER_MODEL:-} - NORMALIZE_EMBEDDINGS=${NORMALIZE_EMBEDDINGS:-} - SIM_SCORE_RANGE_LOW=${SIM_SCORE_RANGE_LOW:-} - SIM_SCORE_RANGE_HIGH=${SIM_SCORE_RANGE_HIGH:-} - ASYM_QUERY_PREFIX=${ASYM_QUERY_PREFIX:-} - ASYM_PASSAGE_PREFIX=${ASYM_PASSAGE_PREFIX:-} - SKIP_RERANKING=${SKIP_RERANKING:-} - QA_PROMPT_OVERRIDE=${QA_PROMPT_OVERRIDE:-} - EDIT_KEYWORD_QUERY=${EDIT_KEYWORD_QUERY:-} - MODEL_SERVER_HOST=${MODEL_SERVER_HOST:-} - MODEL_SERVER_PORT=${MODEL_SERVER_PORT:-} # Leave this on pretty please? Nothing sensitive is collected! # https://docs.danswer.dev/more/telemetry - DISABLE_TELEMETRY=${DISABLE_TELEMETRY:-} # Set to debug to get more fine-grained logs - LOG_LEVEL=${LOG_LEVEL:-info} volumes: - local_dynamic_storage:/home/storage - file_connector_tmp_storage:/home/file_connector_storage - model_cache_torch:/root/.cache/torch/ - model_cache_nltk:/root/nltk_data/ - model_cache_huggingface:/root/.cache/huggingface/ background: image: danswer/danswer-backend:latest build: context: ../../backend dockerfile: Dockerfile command: /usr/bin/supervisord depends_on: - relational_db - index restart: always environment: - GEN_AI_MODEL_PROVIDER=${GEN_AI_MODEL_PROVIDER:-openai} - GEN_AI_MODEL_VERSION=${GEN_AI_MODEL_VERSION:-gpt-3.5-turbo} - GEN_AI_API_KEY=${GEN_AI_API_KEY:-} - GEN_AI_API_ENDPOINT=${GEN_AI_API_ENDPOINT:-} - GEN_AI_API_VERSION=${GEN_AI_API_VERSION:-} - POSTGRES_HOST=relational_db - VESPA_HOST=index - NUM_INDEXING_WORKERS=${NUM_INDEXING_WORKERS:-} # Connector Configs - CONTINUE_ON_CONNECTOR_FAILURE=${CONTINUE_ON_CONNECTOR_FAILURE:-} - CONFLUENCE_CONNECTOR_LABELS_TO_SKIP=${CONFLUENCE_CONNECTOR_LABELS_TO_SKIP:-} - GONG_CONNECTOR_START_TIME=${GONG_CONNECTOR_START_TIME:-} - EXPERIMENTAL_SIMPLE_JOB_CLIENT_ENABLED=${EXPERIMENTAL_SIMPLE_JOB_CLIENT_ENABLED:-} - EXPERIMENTAL_CHECKPOINTING_ENABLED=${EXPERIMENTAL_CHECKPOINTING_ENABLED:-} # Danswer SlackBot Configs - DANSWER_BOT_SLACK_APP_TOKEN=${DANSWER_BOT_SLACK_APP_TOKEN:-} - DANSWER_BOT_SLACK_BOT_TOKEN=${DANSWER_BOT_SLACK_BOT_TOKEN:-} - DANSWER_BOT_DISABLE_DOCS_ONLY_ANSWER=${DANSWER_BOT_DISABLE_DOCS_ONLY_ANSWER:-} - DANSWER_BOT_DISPLAY_ERROR_MSGS=${DANSWER_BOT_DISPLAY_ERROR_MSGS:-} - DANSWER_BOT_RESPOND_EVERY_CHANNEL=${DANSWER_BOT_RESPOND_EVERY_CHANNEL:-} - NOTIFY_SLACKBOT_NO_ANSWER=${NOTIFY_SLACKBOT_NO_ANSWER:-} # Recency Bias for search results, decay at 1 / (1 + DOC_TIME_DECAY * x years) - DOC_TIME_DECAY=${DOC_TIME_DECAY:-} # Hybrid Search Alpha (0 for entirely keyword, 1 for entirely vector) - HYBRID_ALPHA=${HYBRID_ALPHA:-} # Don't change the NLP model configs unless you know what you're doing - DOCUMENT_ENCODER_MODEL=${DOCUMENT_ENCODER_MODEL:-} - NORMALIZE_EMBEDDINGS=${NORMALIZE_EMBEDDINGS:-} - SIM_SCORE_RANGE_LOW=${SIM_SCORE_RANGE_LOW:-} - SIM_SCORE_RANGE_HIGH=${SIM_SCORE_RANGE_HIGH:-} - ASYM_QUERY_PREFIX=${ASYM_QUERY_PREFIX:-} - ASYM_PASSAGE_PREFIX=${ASYM_PASSAGE_PREFIX:-} - SKIP_RERANKING=${SKIP_RERANKING:-} - QA_PROMPT_OVERRIDE=${QA_PROMPT_OVERRIDE:-} - EDIT_KEYWORD_QUERY=${EDIT_KEYWORD_QUERY:-} - MIN_THREADS_ML_MODELS=${MIN_THREADS_ML_MODELS:-} - MODEL_SERVER_HOST=${MODEL_SERVER_HOST:-} - MODEL_SERVER_PORT=${MODEL_SERVER_PORT:-} # Set to debug to get more fine-grained logs - LOG_LEVEL=${LOG_LEVEL:-info} volumes: - local_dynamic_storage:/home/storage - file_connector_tmp_storage:/home/file_connector_storage - model_cache_torch:/root/.cache/torch/ - model_cache_nltk:/root/nltk_data/ - model_cache_huggingface:/root/.cache/huggingface/ web_server: image: danswer/danswer-web-server:latest build: context: ../../web dockerfile: Dockerfile args: - NEXT_PUBLIC_DISABLE_STREAMING=${NEXT_PUBLIC_DISABLE_STREAMING:-false} depends_on: - api_server restart: always environment: - INTERNAL_URL=http://api_server:8080 - WEB_DOMAIN=${WEB_DOMAIN:-} - OAUTH_NAME=${OAUTH_NAME:-} relational_db: image: postgres:15.2-alpine restart: always environment: - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-password} ports: - "5432:5432" volumes: - db_volume:/var/lib/postgresql/data # This container name cannot have an underscore in it due to Vespa expectations of the URL index: image: vespaengine/vespa:8.249.12 restart: always ports: - "19071:19071" - "8081:8081" volumes: - vespa_volume:/opt/vespa/var nginx: image: nginx:1.23.4-alpine restart: always # nginx will immediately crash with `nginx: [emerg] host not found in upstream` # if api_server / web_server are not up depends_on: - api_server - web_server environment: - DOMAIN=localhost ports: - "80:80" - "3000:80" # allow for localhost:3000 usage, since that is the norm volumes: - ../data/nginx:/etc/nginx/conf.d # sleep a little bit to allow the web_server / api_server to start up. # Without this we've seen issues where nginx shows no error logs but # does not recieve any traffic command: > /bin/sh -c "sleep 10 && envsubst '$$\{DOMAIN\}' < /etc/nginx/conf.d/app.conf.template.dev > /etc/nginx/conf.d/app.conf && while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"" # Run with --profile model-server to bring up the danswer-model-server container model_server: image: danswer/danswer-model-server:latest build: context: ../../backend dockerfile: Dockerfile.model_server profiles: - "model-server" command: uvicorn model_server.main:app --host 0.0.0.0 --port 9000 restart: always environment: - DOCUMENT_ENCODER_MODEL=${DOCUMENT_ENCODER_MODEL:-} - NORMALIZE_EMBEDDINGS=${NORMALIZE_EMBEDDINGS:-} - MIN_THREADS_ML_MODELS=${MIN_THREADS_ML_MODELS:-} # Set to debug to get more fine-grained logs - LOG_LEVEL=${LOG_LEVEL:-info} volumes: - model_cache_torch:/root/.cache/torch/ - model_cache_huggingface:/root/.cache/huggingface/ volumes: local_dynamic_storage: file_connector_tmp_storage: # used to store files uploaded by the user temporarily while we are indexing them db_volume: vespa_volume: model_cache_torch: model_cache_nltk: model_cache_huggingface: