mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-03-30 04:31:49 +02:00
223 lines
9.7 KiB
YAML
223 lines
9.7 KiB
YAML
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}
|
|
- FAST_GEN_AI_MODEL_VERSION=${FAST_GEN_AI_MODEL_VERSION:-}
|
|
- 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:-}
|
|
- DISABLE_LLM_CHUNK_FILTER=${DISABLE_LLM_CHUNK_FILTER:-}
|
|
# 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:-}
|
|
- ENABLE_RERANKING_REAL_TIME_FLOW=${ENABLE_RERANKING_REAL_TIME_FLOW:-}
|
|
- QA_PROMPT_OVERRIDE=${QA_PROMPT_OVERRIDE:-}
|
|
- EDIT_KEYWORD_QUERY=${EDIT_KEYWORD_QUERY:-}
|
|
- MULTILINGUAL_QUERY_EXPANSION=${MULTILINGUAL_QUERY_EXPANSION:-}
|
|
- MODEL_SERVER_HOST=${MODEL_SERVER_HOST:-}
|
|
- EMBEDDING_MODEL_SERVER_HOST=${EMBEDDING_MODEL_SERVER_HOST:-}
|
|
- CROSS_ENCODER_MODEL_SERVER_HOST=${CROSS_ENCODER_MODEL_SERVER_HOST:-}
|
|
- INTENT_MODEL_SERVER_HOST=${INTENT_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}
|
|
# Log all of the prompts to the LLM
|
|
- LOG_ALL_MODEL_INTERACTIONS=${LOG_ALL_MODEL_INTERACTIONS:-info}
|
|
# If set to `true` will enable additional logs about Vespa query performance
|
|
# (time spent on finding the right docs + time spent fetching summaries from disk)
|
|
- LOG_VESPA_TIMING_INFORMATION=${LOG_VESPA_TIMING_INFORMATION:-}
|
|
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}
|
|
- FAST_GEN_AI_MODEL_VERSION=${FAST_GEN_AI_MODEL_VERSION:-}
|
|
- GEN_AI_API_KEY=${GEN_AI_API_KEY:-}
|
|
- GEN_AI_API_ENDPOINT=${GEN_AI_API_ENDPOINT:-}
|
|
- GEN_AI_API_VERSION=${GEN_AI_API_VERSION:-}
|
|
- DISABLE_LLM_FILTER_EXTRACTION=${DISABLE_LLM_FILTER_EXTRACTION:-}
|
|
- DISABLE_LLM_CHUNK_FILTER=${DISABLE_LLM_CHUNK_FILTER:-}
|
|
- POSTGRES_HOST=relational_db
|
|
- VESPA_HOST=index
|
|
- NUM_INDEXING_WORKERS=${NUM_INDEXING_WORKERS:-}
|
|
- DASK_JOB_CLIENT_ENABLED=${DASK_JOB_CLIENT_ENABLED:-}
|
|
# 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:-}
|
|
- MULTILINGUAL_QUERY_EXPANSION=${MULTILINGUAL_QUERY_EXPANSION:-}
|
|
- MIN_THREADS_ML_MODELS=${MIN_THREADS_ML_MODELS:-}
|
|
- MODEL_SERVER_HOST=${MODEL_SERVER_HOST:-}
|
|
- EMBEDDING_MODEL_SERVER_HOST=${EMBEDDING_MODEL_SERVER_HOST:-}
|
|
- BACKGROUND_JOB_EMBEDDING_MODEL_SERVER_HOST=${BACKGROUND_JOB_EMBEDDING_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}
|
|
# Log all of the prompts to the LLM
|
|
- LOG_ALL_MODEL_INTERACTIONS=${LOG_ALL_MODEL_INTERACTIONS:-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:-}
|
|
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:
|